Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как создать массив из массивов записей разного типа / 15 сообщений из 15, страница 1 из 1
04.11.2019, 15:07
    #39884974
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
Есть несколько массивов записей такого вида:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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';
Подскажите как это сделать?
...
Рейтинг: 0 / 0
04.11.2019, 15:20
    #39884977
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
garun
например GlobalArr[0].A:= 'hello';

ошибочка, хотел сказать как-то так: GlobalArr[0][10].A:= 'hello';
...
Рейтинг: 0 / 0
04.11.2019, 15:32
    #39884980
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
не понятно, что конкретно нужно, уточняй
...
Рейтинг: 0 / 0
04.11.2019, 15:36
    #39884981
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
makhaonне понятно, что конкретно нужно,По идее ему нужен вариативный record. Но со строками будет облом
...
Рейтинг: 0 / 0
04.11.2019, 15:57
    #39884990
Денис Читатель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
А если так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
type
 GlobalA= record
   A: rec1;
   B: rec2;
   C: rec3;
 end;
GlobalArr= array of GlobalA;
...
Рейтинг: 0 / 0
04.11.2019, 17:35
    #39885013
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
Как насчет трех волшебных слов: инкапсуляция, наследование, полиморфизм ?

Сделай базовый класс, три потомка и массив экземпляров базового класса.
...
Рейтинг: 0 / 0
04.11.2019, 18:02
    #39885020
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
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
...
Рейтинг: 0 / 0
04.11.2019, 18:31
    #39885029
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
rgreatИ вот, поддержите еще:

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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;

куда вешать проверку?
...
Рейтинг: 0 / 0
04.11.2019, 18:49
    #39885031
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
_Vasilisk_,

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

Вообще при присваивании рекорда в пропертях по логике должны дергатся и геттер и сеттер.
...
Рейтинг: 0 / 0
04.11.2019, 18:50
    #39885032
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
О блин, привык что редактировать нелья. ;)
...
Рейтинг: 0 / 0
04.11.2019, 18:52
    #39885034
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
If record property have getter and/or setter functions then they could be called automatically.

Код: pascal
1.
c.MyRec.x:=1;


would be equivalent to

Код: pascal
1.
2.
3.
var temp:=c.GetMyRec;
Temp.x:=1;
c.SetMyRec(Temp);


Вариант раз
Код: pascal
1.
property Rec: TMyRec write SetRec;

геттера нет вообще.

Вариант 2 - очень тяжелый геттер или геттер меняющий внутреннее состояние. Зачем мне лишний вызов?
...
Рейтинг: 0 / 0
04.11.2019, 18:53
    #39885035
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
rgreatВообще при присваивании рекорда в пропертях по логике должны дергатся и геттер и сеттер.И кому такое счастье нужно?
...
Рейтинг: 0 / 0
04.11.2019, 18:54
    #39885037
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
_Vasilisk_
геттера нет вообще.

Нету - не дергается.

Вариант 2 - очень тяжелый геттер или геттер меняющий внутреннее состояние. Зачем мне лишний вызов?
Удобство. Кода меньше гораздо.
Не нравится что он тяжелый - не пользуйся.

Можешь как сейчас "сэкономить" такты через поинтер.
...
Рейтинг: 0 / 0
04.11.2019, 18:55
    #39885038
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
_Vasilisk_
И кому такое счастье нужно?

Всем кто с рекордами через проперти работает.
...
Рейтинг: 0 / 0
05.11.2019, 15:01
    #39885289
garun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как создать массив из массивов записей разного типа
rgreat,

Благодарю!!!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как создать массив из массивов записей разного типа / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]