Форум: "Основная";
Текущий архив: 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