4

有一个容器控件,一个 TScrollBox,它是多个项目控件的父级。

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

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

我实际上知道几个选项:

  • 具有小间隔的计时器(通过单击按钮开始);
  • 一个隐藏的外部按钮(鼠标向下和向上消息发布到该按钮);
  • 表单的自定义消息处理程序。

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

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

4

2 回答 2

4

正常的方法是向要释放的控件发布消息。例如,看看TForm.Release是如何实现的。事实上,我看不出为什么你甚至不能重用这条CM_RELEASE消息。

发布消息的要点在于,它位于队列的后面,并且只有在任何同步消息(即由 传递的消息SendMessage)完成处理后才被处理。这避免了在对象被释放后调用它的方法,这显然是您清楚地意识到的错误。

于 2011-03-29T12:58:39.303 回答
2

首先,我建议您编写一个继承自 TScrollBox 的自定义控件,并提供子控件实例化和删除作为该滚动框内的一项功能,而不是在您的表单中“公开地”完成某些操作。这段代码将放在它自己的单元中,只有它的公共元素在外面是可见的。这只是面向对象的基础知识。

其次,如果您要从滚动框中移除(删除)控件,则 Timer 只是混乱的根源。如果您还对放入该容器的每个控件进行了子类化,那么您可以使用 TForm.Release 使用的机制(它向它们发送 CM_RELEASE 消息),并以控制在发送此消息时删除自身的方式实现 CM_RELEASE ,但是我觉得这很难看,除非编辑控件在失去焦点时被破坏。

我将直接删除这些方法,而不求助于计时器,方法是将 TScrollLBox 类和我想要放入其中的任何其他类进行子类化,然后由父对象 (TScrollBox) 处理控件的删除,而不是通过任何形式的外部操纵。

于 2011-03-29T13:00:17.270 回答