项目控件从容器控件中删除自身

时间:2011-03-29 12:46:55

标签: delphi controls containers items

有一个容器控件,一个TScrollBox,它有多个项目控件。

每个项目控件都是复合本身,包含(父母和拥有)删除按钮。按下按钮开始删除项目控件。

删除涉及释放组件,因此实际操作对于项目应该是外在的。问题是,最好的方法是什么?

我实际上知道几个选项:

  • 间隔较小的计时器(通过点击按钮启动);
  • 一个隐藏的外部按钮(鼠标向下和向上发送消息);
  • 表单的自定义消息处理程序。

虽然我可以自信地实施任何这些方法,但是当我奉承自己时,我不确定哪一种最好。此外,计时器选项似乎幼稚,隐藏按钮一个hackish,自定义消息有点矫枉过正。简而言之,这三个似乎都是半可接受的,或多或少。

我可能只是偏见,不介意相反。最重要的是,我想知道在这种情况下使用的常用方法是什么(也许是我一直想念的东西)。

2 个答案:

答案 0 :(得分:4)

正常的方法是将消息发布到要释放的控件。例如,了解如何实现TForm.Release。事实上,我认为你甚至无法重复使用CM_RELEASE消息。

关于发布消息的要点是进入队列的后面,只有在任何同步消息(即SendMessage传递的消息)完成处理后才会被处理。这样可以避免在对象被释放后调用它,这显然是一个你很清楚的错误。

答案 1 :(得分:2)

首先,我建议您编写一个继承自TScrollBox的自定义控件,并将子控件实例化和删除作为该滚动框内的一个功能提供,而不是“在那里打开”的内容。你的表格。此代码将在其自己的单元中进行,并且只有它的公共元素才会在外部可见。这只是面向对象的基础知识。

其次,如果要从滚动框中删除(删除)控件,则Timer只是混乱的来源。如果您还将每个控件都子类化到该容器中,那么您可以使用TForm.Release使用的机制(它向它们发送CM_RELEASE消息),并在发送此消息时以控制删除自身的方式实现CM_RELEASE但是我觉得这很丑陋,除了Edit控件在失去焦点时被销毁的情况。

我会直接删除这些方法,无需借助计时器,通过继承TScrolLBox类和我想要放入其中的任何其他类,然后通过父对象处理控件的删除( TScrollBox),而不是任何形式的外部操纵。