【发布时间】:2011-03-29 12:46:54
【问题描述】:
有一个容器控件,一个 TScrollBox,它是多个项目控件的父级。
每个项目控件,本身是复合的,包含(父母和拥有)一个删除按钮。按下按钮会启动项目控件的删除。
删除涉及释放组件,因此实际操作应该与项目无关。问题是,最好的方法是什么?
我实际上知道几个选项:
- 具有小间隔的计时器(通过单击按钮启动);
- 一个隐藏的外部按钮(鼠标向下和向上消息发布到该按钮);
- 表单的自定义消息处理程序。
虽然我可以自信地实施这些方法中的任何一种,但我自以为是,但我不确定哪种方法最好。此外,计时器选项看起来很幼稚,隐藏按钮有点骇人听闻,自定义消息有点矫枉过正。简而言之,这三个似乎都差不多,或多或少。
我可能只是有偏见,不介意被说服相反。最重要的是,我想知道在这种情况下常用的方法是什么(也许我一直都在想念什么)。
【问题讨论】:
-
我知道我可能在这里遗漏了一些东西。如果项目包含控件,它自己的析构函数不会摆脱它的子组件吗?如果这是真的,为什么不直接删除该项目并释放它?
-
与我删除答案的原因相同:Andriy 提到的删除按钮是要删除的控件的一部分,它将实现自己对删除按钮单击的处理。因此,您将通过控件自己的事件处理程序之一来执行此操作,并且通常控件真的不喜欢将地毯(世界)从其下方拉出...
-
@Marjan 要求控件释放它自己有问题吗?
-
@Najem:本身不是。实例可以释放自己。但这应该是他们做的最后一件事,所有对他们的引用都应该在他们做之前被清除。大多数情况下,一个实例不知道谁/什么持有对它的引用,这意味着它可能会被要求删除自己两次或更多次。在大卫的回答中使用异步消息意味着破坏被推迟(防止 AV),一旦控制被释放,任何进一步的消息(包括“删除你自己”)都将/应该在句柄消失时被忽略。 (关于它@David?)
-
@Najem:刚刚发现了你的问题。梅森比我解释得更好......
标签: delphi controls containers items