作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含许多数字字段的类,字段的数量会随着项目的开发而增长,所以如果有一种方法可以重置所有字段,无论将来会添加多少个字段,那就太好了。
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/
我是一名优秀的程序员,十分优秀!