4

我发现我认为 Delphi 中扩展 RTTI 功能的一部分是一个奇怪的疏忽(可能是故意的)。

我想转储包含大约 1500 个不同字段的记录类型中的所有字段。是的,认真的。

其中一些是 real48 类型,一些是短字符串,对于这两个,在运行时这些类型的 FieldType 似乎是 nil :

function TRttiField.GetValue(Instance: Pointer): TValue; 
var
  ft: TRttiType;
begin
  ft := FieldType;
  if ft = nil then
    raise InsufficientRtti; // This fires!
  TValue.Make(PByte(Instance) + Offset, ft.Handle, Result);
end;

如果我愿意假设所有 nil-fieldtype 字段实际上都是 real48,我可以简单地使用偏移量并(如果字段宽度为 6)获取 real48 值。

然而,第二个复杂因素是所有短字符串(即string[30])类型都受到类似的影响。

有没有人让这两种古帕斯卡类型与现代扩展 RTTI 一起工作?现在我正在使用一种最好的猜测方法,如果失败了,我会按字段名称对规则进行硬编码,但是如果有一些技术我可以使用它可以让我到达那里,而无需编写大量代码来提取我正在现代化的所有这些旧的帕斯卡记录文件中的信息,我希望有一个更好的主意。

4

1 回答 1

4

不幸的是 Real48 没有任何类型信息。

当你尝试编译这个时,你可以看到:

program Project1;

begin
  TypeInfo(Real48);
end.

string[n] 语法也是如此。但是您可以通过定义自己的字符串类型来解决它,例如:

type
  string30 = string[30];

仅此一项就不会包括记录字段的 rtti,因此您需要像我在这里展示的那样破解/修复 rtti:https ://stackoverflow.com/a/12687747/587106

于 2013-05-02T14:52:20.053 回答