是否可以一次指定相同类型的值?
在我的情况下,我有一个从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 但只需立即将新值应用于所有这些值。
答案 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;