【问题标题】:Reference or tutorial to clarify object reference confusion澄清对象引用混淆的参考或教程
【发布时间】:2009-10-23 22:35:07
【问题描述】:

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

我想我可能已经找到了我的直接问题here 的答案,但是在我自己的挖掘和实验之前,我很清楚我有很多东西要了解 Delphi 如何处理对象引用,特别是关于窗体/框架,以及(通常)是对象引用而不是非指针值的类属性。

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

(在具有三个 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"

我发现自己在问这样的问题,“这种‘不可替换’是表单独有的,还是其他类也是如此?”等等。简而言之,我又发现了另一个我自己无知的天坑。 ;-) 我发现在使用实例/对象引用/解除引用/类定义/类属性等时,事情的行为通常与他们期望的完全一样,但在其他时候,根本没有,甚至没有关闭。

很明显,我需要研究这个领域。与其在围绕这个主题的愚蠢问题之后发布愚蠢的问题,我想我会问这个:

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

提前感谢您的帮助!

【问题讨论】:

  • 你想达到什么目的?像所有语言和环境一样,Delphi 有自己的做事方式。在 Delphi 中创建动态表单真的很容易,所以如果你解释它是什么你试图实现它们可能会有所帮助

标签: delphi oop class object


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2016-11-05
    相关资源
    最近更新 更多