在Delphi中使用对象名称的变量

Sky*_*Sky 1 delphi loops for-loop

我正在尝试labels使用常规方式更改许多标题:

form1.label1.caption := '1';
form1.label2.caption := '2';
form1.label3.caption := '3';
form1.label4.caption := '4';
form1.label5.caption := '5';
form1.label6.caption := '6';
form1.label7.caption := '7';
form1.label8.caption := '8';
...
Run Code Online (Sandbox Code Playgroud)

如何使用For和分配i标签名称Label[i]?像这样的东西:

for i := 1 to 50 do
   begin
     form1.label[i].caption := Inttostr(i);
   end;
Run Code Online (Sandbox Code Playgroud)

什么是更改太多对象参数的最佳方法(在这种情况下caption)?

Ark*_*ady 14

如果你确定你有50个标签label1,label2 .. label50
解决方案可能是这样的:

var lbl: TLabel;
for i:=1 to 50 do
begin
    lbl := FindComponent('Label'+IntToStr(i)) as TLabel;
    lbl.Caption := IntToStr(i);
end;
Run Code Online (Sandbox Code Playgroud)

  • 一堆东​​西.首先,`FindComponent`需要一些时间来计算; 你需要比较很多字符串.如果使用数组,则无需执行此操作.其次,使用数组可以100%控制控件的使用寿命.您可以动态创建它们,动态更改它们,并动态删除它们. (4认同)

Dav*_*nan 9

动态创建控件.如果需要保留对它们的引用,请在数组中保留这些引用.例如,这是一般模式.

var
  FLabels: array of TLabel;
....
SetLength(FLabels, Count);
for i := 0 to Count-1 do
begin
  FLabels[i] := TLabel.Create(Self);
  FLabels[i].Parent := Self;
  FLabels[i].Caption := IntToStr(i+1);
  FLabels[i].Left := 8;
  FLabels[i].Top := 8 + i*20;
end;
Run Code Online (Sandbox Code Playgroud)

  • 所有GUI代码都必须在主线程中运行 (5认同)