这将(希望)很快得到解决,这是我的问题:
我有一个结构
PMacro = ^TMacro;
TMacro = class
Hotkey: Integer;
Command: String;
CTRLMode: boolean;
RepeatInterval: integer;
constructor Create(Hotkey: Integer; Command: String; CTRLMode: boolean; RepeatInterval: integer); overload;
constructor Create; overload;
procedure Execute;
end;
我需要获取它的大小(通过 TFileStream 保存)。此类的实例存储在其他位置的列表中,这是我的保存例程:
Stream:=TFileStream.Create(FileName,fmCreate or fmOpenWrite);
for i := 0 to Macros.Count-1 do
begin
Macro:=TMacro(Macros[i]);
Size:=sizeof(Macro);
Stream.Write(size,SizeOf(integer));
Stream.Write(Macro,sizeof(Macro));
end;
SizeOf(Macro) 返回 4 个字节,这将是指针,但我需要特定实例占用的实际空间。我想到的第一件事是获取Length(Command)
,因为它是一个返回其指针大小的动态结构。但这意味着有类似 SizeOf(Integer)+Length(Command)+SizeOf(boolean)+...
的东西,但这不利于 TMacro 结构的进一步扩展。
那么,有没有办法获取包含动态类型的结构的大小?
谢谢各位的解答
最佳答案
如果要获取 TMacro 的大小,请调用 InstanceSize 方法。但这不会帮助您将其 block 写入流,并且它不会更改以包含字符串的大小,因为字符串是引用类型。
你不能像那样 block 写入你的 TMacro 结构。首先,它是一个类,而不是一条记录,这意味着它包含一个您不想保存的“神奇”字段(或者其中两个,如果您使用的是 Delphi 2009 或更高版本)。其次,即使它是一条记录,它仍然包含引用类型(字符串),因此数据不会内联存储在 TMacro 中;它存储在堆上并且必须单独访问。
如果您需要实现序列化,可以通过几种不同的方式来实现。要么创建一对方法,如下所示:
procedure Load(savefile: TStream); //can also be implemented as a constructor
procedure Save(savefile: TStream);
然后将它们实现为逐一读取/写入每个字段,或者使用某种带有 RTTI 的通用序列化器。在 Delphi 2010 中编写起来要容易得多,因为它具有更广泛的 RTTI 功能集。
关于delphi - 动态结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5914165/