在Delphi中一次性分配数组的值而不使用循环

时间:2014-09-17 20:27:45

标签: arrays delphi properties assign

是否可以一次指定相同类型的值?

在我的情况下,我有一个从TComponent派生的自定义组件,我称之为TBox。

TBox中有属性。

我有一个TBox数组,可以将属性分配给所有人 TBox组件同时不使用循环?

使用for循环设置值

  var BoxArray: array [0..9] of TBox;
      i: integer;
begin
  for i := 0 to 9 do
  begin
    BoxArray[i] := TBox.Create(nil);
    BoxArray[i].Left := 0;
  end;
end;

我想在没有for循环或任何类型的循环的情况下执行上述操作。 我想将新值应用于而不迭代每个TBox 但只需立即将新值应用于所有这些值。

3 个答案:

答案 0 :(得分:3)

  

我想在没有for循环或任何类型的循环的情况下执行上述操作。我想在不迭代每个TBox的情况下将新值应用于Left,而只是立即将新值应用于所有这些值。

如果需要写入多个内存位置,则需要某种形式的迭代。即使您找到了一种在高级别编写代码的方法,以便不会出现循环或迭代,但在某个地方需要进行迭代。

如果你的目标是提高绩效,那么我担心我们需要看到更多细节才能提供具体的帮助。

答案 1 :(得分:0)

由于David Heffernan已经感到悲伤,一次写入多个内存位置是不可能的,这意味着一次修改多个变量或多个字段是不可能的。 从技术上讲,您可以立即更改多个属性,但前提是所有这些属性都读取相同的字段,因为更改字段值会影响所有读取它的属性。

现在为了让你的代码看起来更好一些,你可以修改你的TBox构造函数,这样它也可以接受初始变量的附加可选参数。

type
  TBox = class(TComponent)
  ...
  public
    consturctor Create(AOwner: TComponent; Left: Integer = 0; Top: Integer = 0); override;
  ...
  end;

...

implementation

...

constructor TBox.Create(AOwner: TComponent; ALeft: Integer = 0; ATop: Integer = 0);
begin
  inherited Create(AOwner);
  self.Left := ALeft;
  self.Top := ATop;
end;

现在您可以通过两种方式创建TBox:

BoxArray[i] := TBox.Create(nil);

将使用在构造函数方法实现中定义的defult位置参数创建TBox。

BoxArray[i] := TBox.Create(nil, 5, 10);

将使用传递给构造函数方法的位置参数创建TBox。

注意:从左到右读取可选参数,您不能在中间跳过一个参数。

BoxArray[i] := TBox.Create(nil, 5); //Is valid and top will be 0 (default value)

BoxArray[i] := TBox.Create(nil, , 10); //Is not valid and will raise compiler error

答案 2 :(得分:0)

如果使用TArray和构造函数而不是TBox数组,则可以执行此操作;

TBox = class
    left, right : Integer;
    constructor Create(l,r : Integer);
end;

constructor TBox.Create(l,r : Integer);
begin
    left := l;
    right := r;
end;

procedure TForm2.FormCreate(Sender : TObject);
var
    boxes : TArray<TBox>;
begin
    boxes := TArray<TBox>.Create(TBox.Create(1,2),TBox.Create(5,10));
end;