将TMainMenu放在表单上,并将此处理程序附加到某个TMenuItem。它将隐藏主菜单,但如果自定义Vcl样式处于活动状态则不会。
procedure TForm1.HideMenuClick(Sender: TObject);
begin
Menu := nil;
{ raised exception class $C0000005 with message 'access violation at 0x0038f397: read of address 0x00000008'. }
end;
这将工作,但只有当延迟足够大时:
procedure TForm1.HideMenuClick(Sender: TObject);
begin
TThread.ForceQueue(nil, procedure
begin
Menu := nil
end,
20);
end;
有没有一种干净可靠的方法来做到这一点?
(Note:问题仅与TMainMenu及其OnClick事件有关,与移除菜单或其他控件的其他方法无关。)
编辑:
使用鼠标重现问题。如果使用键盘打开菜单并激活项,则单击'ForceQueue(nil,procedure开始Menu:= nil;end)’将足以避免访问冲突错误。如果菜单项是用键盘快捷键激活的,那么即使是简单的“Menu:= nil”也可以工作。
2条答案
按热度按时间wpcxdonn1#
没有任意超时,而且看起来没有错误,至少在 Delphi 中是这样。但我怀疑有人会把这称为一个干净的解决方案。
pvcm50d12#
这一个对我来说不使用计时器或线程:
PostMessage允许TMenuItem.OnClick事件在尝试隐藏TMainMenu之前完成。