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

时间:2016-07-30 17:27:48

标签: 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;

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

procedure TParams.Reset;
begin
  FillMemory(@FirstValue, Integer(@LastValue)-Integer(@FirstValue),0);
end;

有更好的方法吗? (我正在使用Delphi 7)

2 个答案:

答案 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;