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 用户。
我想通过指针访问组件,而不是使用 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 用户。