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

Mic*_*lev 3 delphi delphi-7

我有一个包含许多数字字段的类,字段数量会随着项目开发而增长,所以无论将来添加多少字段都可以很好地重置所有字段.

 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;
Run Code Online (Sandbox Code Playgroud)

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

procedure TParams.Reset;
begin
  FillMemory(@FirstValue, Integer(@LastValue)-Integer(@FirstValue),0);
end;
Run Code Online (Sandbox Code Playgroud)

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

Rud*_*uis 6

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

type
  TParams = class
  public
    Defined: Boolean;
    Numbers: record
      A0: Single;
      A1: Single;
      H1: TPoint;
      A100: Single;
    end;
    procedure Reset;
  end;
Run Code Online (Sandbox Code Playgroud)

现在很简单,您可以Reset通过以下操作:

procedure TParams.Reset;
begin
  FillChar(Numbers, SizeOf(Numbers), 0);
end;
Run Code Online (Sandbox Code Playgroud)

一个简单的测试:

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;
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出:

0.00 0.00 (0, 0) 0.00
1.00 2.00 (11, 22) 77.00
0.00 0.00 (0, 0) 0.00
Run Code Online (Sandbox Code Playgroud)

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

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

  TParams = class
  public
    Defined: Boolean;
    Numbers: TNumbers;
    procedure Reset;
  end;
Run Code Online (Sandbox Code Playgroud)

对于那些带有泛型的版本(我知道你使用的是Delphi 7,它没有泛型,但无论如何,对于其他人而言),这将简化Reset一点:

procedure TParams.Reset;
begin
  Numbers := Default(TNumbers);
end;
Run Code Online (Sandbox Code Playgroud)

Default 它具有以下优点:它将正确地完成并初始化记录,以防它具有托管类型(字符串,接口等).