如何通过Delphi XE中的指针获取记录的类型信息?

时间:2011-10-19 17:48:10

标签: delphi pointers delphi-xe record rtti

如果我的TList中有许多不同记录类型的指针,我如何访问TList中不同记录的值?

有没有办法获取那些引用的recods的记录类型或类型信息?

我目前正在使用Delphi XE。

4 个答案:

答案 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.ClassTypeTObject的对象。一些其他例程可以简化这项任务。

如果您确实因任何原因需要使用记录,则必须使用不会更改的自定义标记开始每条记录。我准备描述这个系统,但看起来雷米打败了我。但这带来了足够的开销,同样,你也可以只使用对象,因为一旦你沿着这条路走得很远,你基本上就会重新实现很多{{1}}。

答案 2 :(得分:1)

我强烈建议您使用TObjectList单元中的Contnrs对象。 (它是否仍然存在于Delphi XE中?)这基于TList,但是您可以提供TObject引用而不是指针。这是一个微妙的差异,但允许您直接使用列表项目上的isas运算符。

答案 3 :(得分:1)

如何在{$ M +}中使用对象pascal样式?这将消除TObject

的开销
{$M+}

TRecordA = object
end;

TRecordB = object
end;

{$M-}