Дэвид Heffernan уже сказал, что это: то, что вы делаете это некрасиво взломать и не очень чисто. Он также дал подсказку: Превратите свои числовые поля в записи:
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
имеет то преимущество, что он будет должным образом завершить работу и инициализировать запись, только в случае, если это удалось типов (строки, интерфейсы и т.д.) в нем.
Поместите все поля в запись и обнулите запись. Не используйте уродливый взломать это. –
Zeroizing не завершает работу над «управляемыми» участниками. Если есть только числовые поля, то обнуление будет прекрасным. –