Delphi。如何获取指向动态创建的对象的指针

Delphi. How to get a pointer to a dynamically created object

我想通过指针访问组件,而不是使用 FindComponent 进行搜索。以下分配适用于放置在表单上的组件,但不适用于动态创建的组件。例如:

var
  Pbtn: ^TButton;
  Button2: TButton;

begin
  Pbtn := @Button1;
  Showmessage(pbtn.caption); // works well

  Button2 := TButton.Create(Form2);
  Pbtn := @Button2;
  Showmessage(pbtn.caption); // not work

...

class 类型是引用类型,因此 class 类型的对象实例已经表示为指针。不要使用 ^/@ 来引用这些对象(这只会引用指针本身,在大多数情况下很少需要),例如:

var
  Pbtn: TButton;
  Button2: TButton;
begin
  Pbtn := Button1;
  ShowMessage(pbtn.Caption); // works well

  Button2 := TButton.Create(Form2);
  Pbtn := Button2;
  ShowMessage(pbtn.Caption); // also works well
  ...

您的代码工作正常。

但是为什么您示例中的第二条消息没有 return 任何文本?这是因为当您动态创建一个 TButton 时,没有为其标题分配任何值,因此您的第二条消息 return 是一个空字符串。

如果您更改代码以将特定标题分配给第二个按钮,您会发现它工作得很好

  Pbtn := @Button1;
  Showmessage(pbtn.caption); // works well

  Button2 := TButton.Create(Form3);
  //Assign some value to the dynamically created button's caption
  Button2.Caption := 'It works!';
  Pbtn := @Button2;
  Showmessage(pbtn.caption); // not work

但是为什么 design-time 放置的按钮上有标题。这是因为 Delphi IDE 将标题设置为与放置在表单上的组件名称相同。这样做只是为了方便 Delphi 用户。