デビッドHeffernanのは、すでにそれを言った:何をやっていることは醜いですハック、それほど清潔ではない。それは、あなたが行うことによってReset
非常にシンプルな、次のことができている今
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;
レコードにあなたの数値フィールドをONにする:彼はまた、ヒントを与えました
これにより、次の出力が生成されます。
0.00 0.00 (0, 0) 0.00
1.00 2.00 (11, 22) 77.00
0.00 0.00 (0, 0) 0.00
ジェネリック医薬品とバージョン(私はあなたが他の人のために、とにかく何もジェネリックを持っていないデルファイ7を使用して、されますが、知っている)、その意志を持つ人のために
TNumbers = record
A0: Single;
A1: Single;
H1: TPoint;
A100: Single;
end;
TParams = class
public
Defined: Boolean;
Numbers: TNumbers;
procedure Reset;
end;
:
また、次の操作を行うことができますReset
を少し簡素化:
procedure TParams.Reset;
begin
Numbers := Default(TNumbers);
end;
Default
は、それはそれでの型(文字列、インタフェースなど)を管理しているだけの場合には、それが適切にレコードを確定し、初期化するという利点を有します。
レコードにすべてのフィールドを置き、レコードをゼロにします。このような醜いハックを使わないでください。 –
ゼロ化では、「管理された」メンバーはファイナライズされません。数値フィールドしかない場合、ゼロ化は問題ありません。 –