参考或教程澄清对象引用混淆

时间:2009-10-23 22:35:07

标签: delphi oop class object

使用我正在进行的基于TFrames的组件集项目,我遇到了各种各样的实例,我希望在运行时将一个TFrame的组件(通常是非可视的)替换为在运行时动态生成的组件。

我想我可能已经找到了我眼前问题here的答案,但是在我自己的挖掘和实验之前,我发现很明显我已经有很多东西要学习德尔福处理对象引用,特别是关于表单/框架,以及(通常)作为对象引用而不是非指针值的类属性。

这里有一个实验的具体例子:

(在有三个TButton的表格上)

procedure TForm1.Button3Click(Sender: TObject);
var
  MyButton : TButton;

begin
  MyButton := TButton.Create(Self);
  MyButton.Caption := 'New Button';
  MyButton.Parent := Form1;
  Form1.Button2 := MyButton;
  Form1.Repaint;
  ShowMessage('Button2 caption = ' + Form1.Button2.Caption);
end;

不会使用创建的按钮替换Button2,但会在窗体上显示两者。 ShowMessage结果表明Button2的标题仍为=“Button2”

我发现自己会问这样的问题:“这种'非替代'是否与形式有关,或者其他类别也是如此?”简而言之,我发现了另一个我自己无知的陷阱。 ;-)我发现在处理实例/对象引用/ derefencing /类定义/类属性等时,通常事情的行为与它们期望的完全一样,但有时则完全没有,甚至没有关闭。

很明显,我需要研究这个领域。在围绕这个主题的愚蠢问题之后,我没有发布愚蠢的问题,而是认为我会问这个问题:

什么是真正的好的参考或教程,以便更好地掌握细微差别:Delphi如何处理这些事情?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

表单上的那些字段纯粹是为了方便您编写代码时使用。您可以从.pas文件中删除它们,它们仍然会显示出来。表单的布局在DFM中定义,表单对象包含放置在其上的控件的内部引用列表,就像任何其他可视控件一样。

我不知道有关该主题的教程,但我知道如何更换按钮。你已经完全正确了,但是在覆盖引用之前你还必须释放Form1.Button2。这将导致按钮从表单的控制列表中删除自己作为其销毁过程的一部分。或者,如果您想将按钮保存在某处而不是销毁它,请改为呼叫Form1.RemoveControl(Button2);