gpt4 book ai didi

Delphi:如何将所有类字段重置为零值?

转载 作者:行者123 更新时间:2023-12-03 15:44:47 26 4
gpt4 key购买 nike

我有一个包含许多数字字段的类,字段的数量会随着项目的开发而增长,所以如果有一种方法可以重置所有字段,无论将来会添加多少个字段,那就太好了。

 TParams = class
public
defined: boolean;
FirstValue: byte; // reset from here
A0: single;
A1: single;
H1: TPoint;
// ...............
A100: single;
LastValue: byte; // to here
procedure Reset;
end;

我想到的唯一想法是插入 2 个字段:应重置的 block 之前和之后,并使用 FillMemory:

procedure TParams.Reset;
begin
FillMemory(@FirstValue, Integer(@LastValue)-Integer(@FirstValue),0);
end;

还有更好的办法吗? (我使用的是 Delphi 7)

最佳答案

David Heffernan 已经说过了:你所做的是一个丑陋的黑客行为,而且不是很干净。他还给出了提示:将数字字段变成记录:

type
TParams = class
public
Defined: Boolean;
Numbers: record
A0: Single;
A1: Single;
H1: TPoint;
A100: Single;
end;
procedure Reset;
end;

现在非常简单,您可以通过执行以下操作重置:

procedure TParams.Reset;
begin
FillChar(Numbers, SizeOf(Numbers), 0);
end;

一个简单的测试:

procedure Test;
var
P: TParams;
begin
P := TParams.Create;
try
Writeln(Format('%f %f (%d, %d) %f', [P.Numbers.A0, P.Numbers.A1, P.Numbers.H1.X, P.Numbers.H1.Y, P.Numbers.A100]));
P.Numbers.A0 := 1.0;
P.Numbers.A1 := 2.0;
P.Numbers.H1 := Point(11, 22);
P.Numbers.A100 := 77.0;
Writeln(Format('%f %f (%d, %d) %f', [P.Numbers.A0, P.Numbers.A1, P.Numbers.H1.X, P.Numbers.H1.Y, P.Numbers.A100]));
P.Reset;
Writeln(Format('%f %f (%d, %d) %f', [P.Numbers.A0, P.Numbers.A1, P.Numbers.H1.X, P.Numbers.H1.Y, P.Numbers.A100]));
finally
P.Free;
end;
end;

这会产生以下输出:

0.00 0.00 (0, 0) 0.00
1.00 2.00 (11, 22) 77.00
0.00 0.00 (0, 0) 0.00
<小时/>

或者,您可以执行以下操作:

  TNumbers = record
A0: Single;
A1: Single;
H1: TPoint;
A100: Single;
end;

TParams = class
public
Defined: Boolean;
Numbers: TNumbers;
procedure Reset;
end;

对于那些拥有泛型版本的人(我知道您使用的是 Delphi 7,它没有泛型,但无论如何,对于其他版本),这将稍微简化 Reset :

procedure TParams.Reset;
begin
Numbers := Default(TNumbers);
end;

Default 的优点是,它可以正确地完成和初始化记录,以防万一其中包含托管类型(字符串、接口(interface)等)。

关于Delphi:如何将所有类字段重置为零值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38676619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com