Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 1.393 c
8-1075737379
Igoryok
2004-02-02 18:56
2004.05.02
Замкнутую область зарисовать


3-1081347600
начинаю-щий
2004-04-07 18:20
2004.05.02
Уникальное значение поля


3-1081336377
sergg
2004-04-07 15:12
2004.05.02
Как уменьшить ширину столбцов в DBGride?


14-1081579363
Алхимик
2004-04-10 10:42
2004.05.02
Профессиональная деформация


1-1082054727
Hollander
2004-04-15 22:45
2004.05.02
открытие файла из системы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский