Delphi 使用命令仅更改最后 object 的属性

Delphi with command only changing properties of last object

Delphi with 命令无法正常工作?

procedure TForm1.Button1Click(Sender: TObject);
begin
  With Label1, Label2 do
  begin
    caption := 'Hello'
  end;
end;

我试图在一个超级简单的程序中使用上面的这段代码,但按钮只更改了 Label2 的标题 属性,而不是 label1。当代码如下所示时:

procedure TForm1.Button1Click(Sender: TObject);
begin
  With Label1 do
  begin
    caption := 'Hello'
  end;
end;

它正确地更改了 Label1 的属性。我需要如何更改代码才能更改 objects?

的属性

直截了当:

Label1.Caption := 'Hello';
Label2.Caption := 'Hello';

只是一些建议:不要使用 with!

在您的第一个代码中,Label2with 捕获范围并隐藏 Caption 属性 标签 1。一般来说,如果你想要两个作业,你必须写两个作业。您可能会根据情况使用循环,但此示例最简单,如上所示。

如果你有最新的 Delphi 版本,你可以这样写:

var
  lbl: TLabel;
begin
  for lbl in TArray<TLabel>.Create(Label1, Label2) do
    lbl.Caption := 'Hello';
end;

恕我直言,情况更糟 - 至少对于这种情况。

来自 Delphi 文档:

当with后出现多个对象或记录时,整个语句被视为一系列嵌套的with语句。因此

 with obj1, obj2, ..., objn do statement 

相当于

 with obj1 do
   with obj2 do
     ...
     with objn do
       // statement

在这种情况下,如果可能,statement 中的每个变量引用或方法名称都被解释为 objn 的成员;否则,如果可能,它被解释为 objn1 的成员;等等。同样的规则适用于解释 objs 本身,例如,如果 objn 是 obj1 和 obj2 的成员,它被解释为 obj2.objn.

如您所见,这只是 with 不起作用的一个地方。