Главная страница
    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
Время: 0.036 c
7-1076338598
gid
2004-02-09 17:56
2004.05.02
Как определить загруженность процессора в Win XP ?


14-1081351546
Сатир
2004-04-07 19:25
2004.05.02
Артемий Лебедев отдыхает!:)


3-1081260725
Alexey
2004-04-06 18:12
2004.05.02
Identity в базе SQLServer


14-1081861265
DiamondShark
2004-04-13 17:01
2004.05.02
Так будет с каждым центром американского английского


3-1081240486
Sirus
2004-04-06 12:34
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский