有一个容器控件,一个TScrollBox,它有多个项目控件。
每个项目控件都是复合本身,包含(父母和拥有)删除按钮。按下按钮开始删除项目控件。
删除涉及释放组件,因此实际操作对于项目应该是外在的。问题是,最好的方法是什么?
我实际上知道几个选项:
虽然我可以自信地实施任何这些方法,但是当我奉承自己时,我不确定哪一种最好。此外,计时器选项似乎幼稚,隐藏按钮一个hackish,自定义消息有点矫枉过正。简而言之,这三个似乎都是半可接受的,或多或少。
我可能只是偏见,不介意相反。最重要的是,我想知道在这种情况下使用的常用方法是什么(也许是我一直想念的东西)。
答案 0 :(得分:4)
正常的方法是将消息发布到要释放的控件。例如,了解如何实现TForm.Release
。事实上,我认为你甚至无法重复使用CM_RELEASE
消息。
关于发布消息的要点是进入队列的后面,只有在任何同步消息(即SendMessage
传递的消息)完成处理后才会被处理。这样可以避免在对象被释放后调用它,这显然是一个你很清楚的错误。
答案 1 :(得分:2)
首先,我建议您编写一个继承自TScrollBox的自定义控件,并将子控件实例化和删除作为该滚动框内的一个功能提供,而不是“在那里打开”的内容。你的表格。此代码将在其自己的单元中进行,并且只有它的公共元素才会在外部可见。这只是面向对象的基础知识。
其次,如果要从滚动框中删除(删除)控件,则Timer只是混乱的来源。如果您还将每个控件都子类化到该容器中,那么您可以使用TForm.Release使用的机制(它向它们发送CM_RELEASE消息),并在发送此消息时以控制删除自身的方式实现CM_RELEASE但是我觉得这很丑陋,除了Edit控件在失去焦点时被销毁的情况。
我会直接删除这些方法,无需借助计时器,通过继承TScrolLBox类和我想要放入其中的任何其他类,然后通过父对象处理控件的删除( TScrollBox),而不是任何形式的外部操纵。