如果我的TList中有许多不同记录类型的指针,我如何访问TList中不同记录的值?
有没有办法获取那些引用的recods的记录类型或类型信息?
我目前正在使用Delphi XE。
答案 0 :(得分:6)
您的不同记录类型需要一个公共标题。然后,您可以首先将列表项指针强制转换为该标头类型,以确定要转换为下一个的记录类型。例如:
type
TRecType = (recA, recB, recC);
PRecHeader = ^TRecHeader;
TRecHeader = record
RecType: TRecType;
...
end;
PRecordA = ^TRecordA;
TRecordA = record
Header: TRecHeader;
IntValue: Integer;
end;
PRecordB = ^TRecordB;
TRecordB = record
Header: TRecHeader;
StrValue: String;
end;
PRecordC = ^TRecordC;
TRecordC = record
Header: TRecHeader;
DblValue: Double;
end;
var
PRec: Pointer;
begin
PRec := List[Index];
case PRecHeader(PRec)^.RecType of
recA: use PRecordA(PRec)^.IntValue as needed ...
recB: use PRecordB(PRec)^.StrValue as needed ...
recC: use PRecordC(PRec)^.DblValue as needed ...
end;
end;
答案 1 :(得分:3)
你真的不能这样做。与Delphi对象不同,记录不带任何RTTI。如果你混合了一堆不同类型的数据,并希望能够找到它们在运行时的数据类型,那么最好的办法就是使用继承TObject.ClassType
和TObject
的对象。一些其他例程可以简化这项任务。
如果您确实因任何原因需要使用记录,则必须使用不会更改的自定义标记开始每条记录。我准备描述这个系统,但看起来雷米打败了我。但这带来了足够的开销,同样,你也可以只使用对象,因为一旦你沿着这条路走得很远,你基本上就会重新实现很多{{1}}。
答案 2 :(得分:1)
我强烈建议您使用TObjectList
单元中的Contnrs
对象。 (它是否仍然存在于Delphi XE中?)这基于TList
,但是您可以提供TObject
引用而不是指针。这是一个微妙的差异,但允许您直接使用列表项目上的is
和as
运算符。
答案 3 :(得分:1)
如何在{$ M +}中使用对象pascal样式?这将消除TObject
的开销{$M+}
TRecordA = object
end;
TRecordB = object
end;
{$M-}