我有一个包含许多数字字段的类,字段数量会随着项目开发而增长,所以无论将来添加多少字段,都可以很好地重置所有字段。
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个字段:应该重置的块之前和之后,并使用FillMemory:
procedure TParams.Reset;
begin
FillMemory(@FirstValue, Integer(@LastValue)-Integer(@FirstValue),0);
end;
有更好的方法吗? (我正在使用Delphi 7)
答案 0 :(得分:6)
type
TParams = class
public
Defined: Boolean;
Numbers: record
A0: Single;
A1: Single;
H1: TPoint;
A100: Single;
end;
procedure Reset;
end;
现在很简单,你可以Reset
执行以下操作:
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
的优点是它可以正确地完成并初始化记录,以防万一它有托管类型(字符串,接口等)。
答案 1 :(得分:2)
在某些受限制的情况下,例如TParams
的情况,调用InitInstance应该可以解决问题:
procedure TParams.Reset;
begin
InitInstance(Self);
end;