我该如何初始化一个被声明为局部变量的记录?

10

我正在使用由字符串、布尔值、整数、货币和其他记录组成的记录,在类的方法中。我想要递归地将所有基本类型的字段初始化为空/假/零。Delphi似乎不会默认执行此操作。有没有一种简单的方法可以完成这个任务,而不需要通过名称访问每个字段并手动设置它们?


请注意,Delphi会初始化具有生命周期管理的类型(例如字符串、动态数组和接口)。 - kludg
5
在 Delphi-2009 及以后的版本中,可以通过 Foo := Default(TFoo); 来初始化一个记录。请参考问题 How to properly free records that contain various types in Delphi at once?David 的回答 - LU RD
4个回答

13

您可以使用以下两种构造之一(其中 Foo 是一个记录)。

FillChar(Foo, SizeOf(Foo), 0); 

ZeroMemory(@Foo, SizeOf(Foo));

这段内容来自Allen Bauer的帖子。

在研究FillChar最常见的用法时,我们发现它主要被用于将内存初始化为某个给定的字节值,而不是用于填充字符数据。因此我们决定保持FillChar以字节为中心的设计。


4
使用(可能)更好的可读性相同的代码:FillChar(Foo, SizeOf(Foo), 0); - Im0rtality
@Im0rtality:我已经更新了答案,包括你的ZeroMemory解决方案。 - Lieven Keersmaekers
请注意,ZeroMemory在某些版本的Delphi(至少是d6和7)中是FillChar的包装器。 - Gerry Coll
当记录包含字符串或接口等托管类型时,您不应使用此内容。 - R. Hoek


1

自Delphi 2007起,您可以使用Default()内置函数:

var
  LRecord: TMyRecord;
begin
  LRecord := Default(TMyRecord);
  ...

1

好的,您可以采用一种简单的法律技巧

unit unit1;

interface

type
  PMyRecord = ^TMyRecord;
  TMyRecord = record
    Value: Integer;
    function Self: PMyRecord;
  end;

implementation

function TMyRecord.Self: PMyRecord;
begin
  Result := @Self;
end;

procedure Test(AValue: Integer);
const MyRecord: TMyRecord = (Value: 0);
begin
  MyRecord.Self.Value := AValue;
end;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接