gpt4 book ai didi

object - 在 Delphi 上,我如何引用仅使用一个变量创建的对象?

转载 作者:行者123 更新时间:2023-12-03 18:29:54 25 4
gpt4 key购买 nike

我在我的应用程序的运行时创建了一个带有一些按钮的表单,我意识到一些让我很困扰的事情,我无法为自己或互联网上的任何地方找到答案。

看下面的代码。

procedure TfrmTest.CreateFourButtons(Sender: TObject);
var
i: Integer; B: TButton;
begin
for i := 1 to 4 do
begin
B := TButton.Create(frmTest);
B.Parent := frmTest;
B.SetBounds(250,(70+(30*i)),75,25);
B.Caption := 'Button' + IntToStr(i);
B.Visible := True;
end;
end;

所以我只是在运行时在特定位置的表单上创建了四个按钮。到目前为止还不错吧?

但是现在让我们想象一下,我想将第一个按钮的 Caption 属性更改为“HotPotato”?我现在如何引用第一个按钮,因为我只使用了一个变量来创建这些按钮?我被告知将这些对象存储在 TButtons 数组中,或者更好的是存储在 TObjectList 中,这些都是解决这个问题的好方法。但后来我想到了一个问题!

这些按钮在内存中的什么位置?我有什么方法可以在不使用数组或对象列表的情况下引用它们?

最佳答案

跟踪多个相似对象的常规方法是使用数组。

procedure TfrmTest.CreateFourButtons(Sender: TObject);
var
i: Integer;
B: TArray<TButton>; //or array of TButton for older versions
begin
SetLength(B, 4);
for i := 0 to 3 do begin
B[i] := TButton.Create(frmTest);
B[i].Parent := frmTest;
B[i].SetBounds(250,(70+(30*i)),75,25);
B[i].Caption := 'Button' + IntToStr(i);
B[i].Visible := True;
end;
B[0].Caption:= 'HotPotato';
end;

在表单上放置按钮时,这并不是绝对需要的,表单已经使用列表来跟踪放置在其上的子控件,但是您需要一些方法来区分不同的按钮。

您可以使用 tag属性:
  for i := 1 to 4 do begin
B := TButton.Create(frmTest);
B.Parent := frmTest;
B.Tag:= i;
...
end;
//This will get inefficient if there are many controls on a form.
for var C in frmTest.Controls do begin //10.3 syntax.
if (C is TButton) and (C.tag = 1) then C.Caption:= 'HotPotato'
end;
button是一个对象,因此它位于堆上。如果你失去了它的引用,你将永远找不到它。但是,如果它被放置在父控件上,则该父控件会跟踪它,您始终可以使用 FindChildControl 获取它。或 Controls表格列表。
FindChildControl按名称搜索。这需要您设置控件的名称,否则将不起作用。
var B:= frmTest.FindChildControl('Button1');

备注 : FindChildControl 仅定位控件的直接子级。它找不到作为控件子级之一的子级的控件。

如果按钮位于子面板中,则此定位子项可能会变得复杂。最好使用数组或列表来跟踪一系列按钮。

关于object - 在 Delphi 上,我如何引用仅使用一个变量创建的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54857190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com