代码之家  ›  专栏  ›  技术社区  ›  Jamo

参考或教程以澄清对象参考混淆

  •  0
  • Jamo  · 技术社区  · 15 年前

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

    我想我可能已经找到了我眼前问题的答案 here 但是在我自己的研究和实验中,很明显我有很多东西要学习Delphi是如何处理对象引用的,特别是关于窗体/框架,以及(一般)类属性,它们是对象引用而不是非指针值。

    下面是一个具体的实验示例:

    (在有三个按钮的窗体上)

    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;
    

    不会将按钮2替换为已创建的按钮,但会在窗体上同时显示这两个按钮。ShowMessage结果指示button2的caption still=“button2”

    我发现自己在问这样的问题:“这是表单独有的‘不可替换’吗,还是其他类也一样?”总之,我又发现了自己无知的另一个天坑。;-)我发现,在处理实例/对象引用/取消划分/类定义/类属性等时,通常情况下,事物的行为与它们期望的完全一样,但其他时候,根本不是这样,甚至不接近。

    很明显,我需要对这个领域进行研究。我不想把愚蠢的问题一个接一个地贴在这个主题上,而是想问:

    什么是 真的? 很好的参考或教程,以便更好地理解微妙的区别:Delphi是如何处理这些事情的?

    感谢您的帮助!

    1 回复  |  直到 15 年前
        1
  •  4
  •   Mason Wheeler    15 年前

    表单上的这些字段纯粹是为了您编写代码时的方便。你可以从.pas文件中删除它们,它们仍然会出现。表单的布局是在dfm中定义的,表单对象与其他任何可视控件一样,保存对放置在其上的控件的引用的内部列表。

    我不知道这个主题的教程,但我知道如何替换按钮。你基本上是对的,但是在覆盖引用之前,你还必须释放form1.button2。这将导致该按钮作为其销毁过程的一部分从表单的控制列表中删除自身。或者,如果要将按钮保存到某个位置而不是将其销毁,请致电 Form1.RemoveControl(Button2); 相反。