2014-12-09 60 views
0

如何禁用弹出式菜单?在上下文菜单上禁用弹出窗口?

我的问题是,我有一个很好的上下文菜单为我的列表框,但如果我移 - 右击一个项目,我执行一些代码,我不想弹出菜单后弹出。

但是,如果它是一个正常的右键单击列表框,那么我当然想要弹出菜单。

+4

处理['OnContextPopup'](http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.Controls.TControl.OnContextPopup)事件并返回True如果您想要处理''Handled'参数防止弹出菜单显示。 – TLama 2014-12-09 11:59:33

+2

@TLama:看起来像一个答案,而不是评论! (甚至可能是正确的!) – 2014-12-09 12:20:55

回答

2

Delphi中没有“OnContextPopup”,也没有“Handled”参数。在德尔福这样做的一种方式如下:

找到的弹出菜单表单上,单击它,进入Object Inspector的事件选项卡上,双击单元格来的“OnPopup”的权利,并插入下面的代码(行权后开始):

PROCEDURE TForm1.PopupMenu1Popup(Sender : TObject); 
    BEGIN 
    IF GetKeyState(VK_SHIFT) AND $8000<>0 THEN Abort 
    END; 

这将打压弹出菜单,如果有两个SHIFT键被按下时,菜单将要弹出...

另一个(上面的TLama的评论引发的)是找到你想要抑制弹出窗口的控件的OnContextPopup事件(在这种情况下,你的ListB牛),双击它(创建/跳转到事件处理程序),然后将下面的代码:

PROCEDURE TForm1.ListBox1ContextPopup(Sender : TObject ; Point : TPoint ; VAR Handled : BOOLEAN); 
    BEGIN 
    Handled:=(GetKeyState(VK_SHIFT) AND $8000<>0) 
    END; 

这两种方法之间的主要区别是,第一个抑制弹出窗口,无论哪个控制弹出式菜单试图弹出,而第二种方法允许您仅抑制特定控件的弹出窗口(因为您可以将相同的弹出菜单分配给多个控件)。

+4

@TLama本身就是指'TControl.OnContextPopup'。你可以按照他的评论中的链接... :) – kobik 2014-12-09 12:48:07

+0

好吧 - 不知道那个(它不是一个已发布的事件,所以你必须在代码中完成)。更新答案以显示替代方式。 – HeartWare 2014-12-09 12:57:38

+2

“这不是已发布的事件” - 错误。放下TListBox并检查发布的事件。特别是在'OnContextPopup' – kobik 2014-12-09 13:03:14