有没有一种释放 Delphi 控件的故障安全方法?
我有一个 TStringGrid 后代,我在其中“嵌入”一个自定义控件作为就地编辑器。当用户通过 Tab 键或箭头键在网格单元格内导航时,如果单元格可编辑,我需要创建一个动态控件。我已经挂钩了所需的事件,并利用自定义控件的 OnKeyDown 事件将导航键传递回父级 TStringGrid。
以前,TStringGrid 后代只会在嵌入式控件上调用 FreeAndNil,但在某些情况下,这会导致 UpdateUIState/GetParentForm 内部的访问冲突。查看调用堆栈,有时在释放控件后,仍然会出现 WM_KEYDOWN (TWinControl.WMKeyDown) 消息。
我已经准备好查看并实施中讨论的更改如何释放其事件处理程序内部的控制权? https://stackoverflow.com/questions/2502565/how-to-free-control-inside-its-event-handler。这似乎已经解决了问题,但我想知道这种方法是否还有其他警告。
实际上,此解决方法只是延迟了控件的销毁,直到发布 CM_RELEASE 消息时队列上的所有现有消息都已删除。
在发布 CM_RELEASE 后,是否有可能另一个 WM_KEY* 或类似消息都已准备好发布到消息队列中?
我当前的 CM_RELEASE 处理程序如下所示:
procedure TMyCustomControl.HandleRelease(var Msg: TMessage);
begin
Free;
end;
那么,这在所有情况下都是安全的还是我应该采取措施清除队列中的任何其他消息? (想到了 SendMessage(Self.Handle, WM_DESTROY, 0, 0) )