Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Тип указателя   Найти похожие ветки 

 
Unknown J   (2004-04-13 23:03) [0]

Есть нкоторый TList в котором содержится список узаталей на записи (record) разных типов. Далее в программе нужно братиться к какому-либо элементу списка, причём его тип неизвестен. Как узнать его тип. Пропобовал через is, но то ли я неправильно делаю, то ли оператор только для типов, но не получилось.


 
panov ©   (2004-04-13 23:04) [1]

так напиши, как не получилось...


 
Rouse_ ©   (2004-04-13 23:07) [2]

GetTypeInfo ?


 
Anatoly Podgoretsky ©   (2004-04-13 23:13) [3]

Никак, TList это список нетипизированых укащателей Pointer


 
Unknown J   (2004-04-13 23:58) [4]

>так напиши, как не получилось...


type PRecord = ^ARecord;

P: Pointer;

...

If P is PMeRecord then ...


>Никак, TList это список нетипизированых укащателей Pointer

Суть в том, что так или иначе нужно хранить данные разных типов в одной упорядоченной куче. Есть ли выход, проще создания классов и использования TObjecTList? Может, можно как-либо через общее поле записи, которое определит тип?


 
Unknown J   (2004-04-13 23:59) [5]

Исправления:

>так напиши, как не получилось...


type PMyRecord = ^ARecord;

P: Pointer;

...

If P is PMyRecord then ...


 
Юрий Зотов ©   (2004-04-14 00:20) [6]

Включите в запись первым же полем признак ее типа, вот и все. Например:

type
 TRecordType = (rt0, rt1, ...);
 PMyRecord = ^TMyRecord;
 TMyRecord = packed record
   RecordType: TRecordType;
   case integer of
   ... // варианты наборов полей для разных записей
 end;

case PMyRecord(List[i])^.RecordType of
 rt0: ... // одни поля
 rt1: ... // другие поля
 ...
end;


 
Юрий Зотов ©   (2004-04-14 00:29) [7]

Или так, если не подходят вариантные записи.

type
 TRecordType = (rt0, rt1, ...);
 
 PMyRecord = ^TMyRecord;
 TMyRecord = packed record
   RecordType: TRecordType;
 end;

 PMyRecord0 = ^TMyRecord0;
 TMyRecord0 = packed record
   RecordType: TRecordType;
   I: integer;
   ...
 end;

 PMyRecord1 = ^TMyRecord1;
 TMyRecord1 = packed record
   RecordType: TRecordType;
   S: string[20]
   ...
 end;

case PMyRecord(List[i])^.RecordType of
 rt0: with PMyRecord0(List[i])^ do
      begin
        I := 777;
        ...
      end;
 rt1: with PMyRecord1(List[i])^ do
      begin
        S := "Вася";
        ...
      end;
...
end;


 
Unknown J   (2004-04-14 00:44) [8]

[7] То, что надо. Спасибо!


 
Anatoly Podgoretsky ©   (2004-04-14 00:48) [9]

Если нельзя по какой то причине включать поля в запись, то можно поступить так, сделать двухступенчато

TBaseRecord = packed record
  RecordType: TRecordType;
  ChildRecord: Pointer;
end;

TChildRecord1 = packed record
...
TChildRecord2 = packed record
...
TChildRecordN = packed record


 
Unknown J   (2004-04-14 01:12) [10]

А зачем вы пишете packed record вместо record?


 
Rouse_ ©   (2004-04-14 01:22) [11]

> [10] Unknown J   (14.04.04 01:12)
Для выравнивания...


 
Sha ©   (2004-04-14 09:34) [12]

Для невыравнивания :)


 
REA ©   (2004-04-14 09:47) [13]

Можно PRecType = ^TRecordType;
Если RecordType всегда первый в записях, то сначала проверить его, а по типу все остальное.
А вообще см. TObjectList.FindInstanceOf()


 
Amoeba ©   (2004-04-14 11:13) [14]

А причем здесь TObjectList? Ведь автор хранит не объекты, а простые записи.


 
REA ©   (2004-04-14 11:22) [15]

А пусть не хранит :) Тут смотря какая цель преследуется. В большинстве случаев TObjectList вполне подходит.


 
Amoeba ©   (2004-04-14 13:51) [16]

В большинстве случаев TObjectList вполне подходит
Подходит, и очень подходит, если хранятся ОБЪЕКТЫ. Но чем он лучше, если хранятся НЕ ОБЪЕКТЫ, А ЗАПИСИ? Аргументируй!



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
14-1081855248
Layner
2004-04-13 15:20
2004.05.02
Что такое бизнес логика?


1-1082176251
zenaev
2004-04-17 08:30
2004.05.02
DLL


6-1078366060
gogi
2004-03-04 05:07
2004.05.02
Как узнать имя файла аттачмента не загружая письмо ?


1-1082111343
Tornado
2004-04-16 14:29
2004.05.02
PageControl


1-1081804770
LORDMAXX
2004-04-13 01:19
2004.05.02
Как обратится из под Windows к секторам HDD