Как создать массив из массивов записей разного типа

garun
Дата: 04.11.2019 15:07:56
Есть несколько массивов записей такого вида:

type
 rec1 = record
   A, B: string;
 end;
rec1Arr = array of rec1;

type
 rec2 = record
   C, D: string;
 end;
rec2Arr = array of rec2;

type
 rec3 = record
   E, F: string;
 end;
rec3Arr = array of rec3;


Мне нужно объединить массивы rec1Arr, rec2Arr, rec3Arr в единый массив, чтобы из него можно было обращаться к внутренним массивам по индексам, например GlobalArr[0].A:= 'hello';
Подскажите как это сделать?
garun
Дата: 04.11.2019 15:20:40
garun
например GlobalArr[0].A:= 'hello';

ошибочка, хотел сказать как-то так: GlobalArr[0][10].A:= 'hello';
makhaon
Дата: 04.11.2019 15:32:17
не понятно, что конкретно нужно, уточняй
_Vasilisk_
Дата: 04.11.2019 15:36:17
makhaon
не понятно, что конкретно нужно,
По идее ему нужен вариативный record. Но со строками будет облом
Денис Читатель
Дата: 04.11.2019 15:57:11
А если так?
type
 GlobalA= record
   A: rec1;
   B: rec2;
   C: rec3;
 end;
GlobalArr= array of GlobalA;
Sinemurius
Дата: 04.11.2019 17:35:09
Как насчет трех волшебных слов: инкапсуляция, наследование, полиморфизм ?

Сделай базовый класс, три потомка и массив экземпляров базового класса.
rgreat
Дата: 04.11.2019 18:02:52
type
  rec1 = record
    A, B: string;
  end;
  rec1Arr = array of rec1;

  rec2 = record
    C, D: string;
  end;
  rec2Arr = array of rec2;

  rec3 = record
    E, F: string;
  end;
  rec3Arr = array of rec3;

  TMyRec = record
    type
      TAll = record
        A,B,C,D,E,F : string;
      end;
  private
    function GetAll(Index: integer): TAll;
    procedure SetAll(Index: integer; const Value: TAll);
  public
    R1: rec1Arr;
    R2: rec2Arr;
    R3: rec3Arr;

    property All[Index: integer]: TAll read GetAll write SetAll; default;
  end;

{ TMyRec }

function TMyRec.GetAll(Index: integer): TAll;
begin
  Result.A:=R1[index].A;
  Result.B:=R1[index].B;
  Result.C:=R2[index].C;
  Result.D:=R2[index].D;
  Result.E:=R3[index].E;
  Result.F:=R3[index].F;
end;

procedure TMyRec.SetAll(Index: integer; const Value: TAll);
begin
  if Length(R1)<=Index then SetLength(R1,Index+1);
  if Length(R2)<=Index then SetLength(R2,Index+1);
  if Length(R3)<=Index then SetLength(R3,Index+1);
  R1[index].A:=Value.A;
  R1[index].B:=Value.B;
  R2[index].C:=Value.C;
  R2[index].D:=Value.D;
  R3[index].E:=Value.E;
  R3[index].F:=Value.F;
end;


procedure Test;
var
  Arr : TMyRec;
  Rec : TMyRec.TAll;
begin
  Rec.A:='1';
  Rec.B:='2';
  Rec.C:='3';
  Rec.D:='4';
  Rec.E:='5';
  Rec.F:='6';
  Arr[1]:=Rec;
  Writeln(Arr[1].A,',',Arr[1].B,',',Arr[1].C,',',Arr[1].D,',',Arr[1].E,',',Arr[1].F);
end;


И вот, поддержите еще:

https://quality.embarcadero.com/browse/RSP-22953
_Vasilisk_
Дата: 04.11.2019 18:31:55
rgreat
И вот, поддержите еще:

https://quality.embarcadero.com/browse/RSP-22953
А как ты себе это представляешь?

TMyRec = record
  x: Integer;
  y: Integer;
end;

TMyClass = class
private
  FRec: TMyRec;
  procedure SetRec(const ARec: TMyRec);
public
  property Rec: TMyRec read FRec write SeRec;
end;

procedure TMyClass.SetRec(const ARec: TMyRec);
begin
  if ARec.x > ARec.y then
    raise EInvalidArgument.Create;
  FRec := ARec;
end;

var
  LClass: TMyClass;

LClass.Rec.x := 100;
LClass.Rec.y := 0;
куда вешать проверку?
rgreat
Дата: 04.11.2019 18:49:04
_Vasilisk_,

На SeRec, как ты и сделал.

Вообще при присваивании рекорда в пропертях по логике должны дергатся и геттер и сеттер.
rgreat
Дата: 04.11.2019 18:50:46
О блин, привык что редактировать нелья. ;)