禁止点击外部弹出式菜单

时间:2016-06-22 12:43:59

标签: delphi vcl popupmenu

单击按钮时,按钮的OnClick处理程序会显示TPopupMenu。当菜单可见时再次单击该按钮会导致弹出窗口由于弹出区域外的点击(好)而被取消,但随后由于按钮而弹出菜单第二次' s OnClick处理程序被调用(坏)。

这里没什么好看的:

procedure TfrmMain.Button1Click(Sender: TObject);
var
  posn : TPoint;
begin
  posn := Button1.ClientToScreen(Point(Button1.Width, Button1.Height));
  PopupMenu1.Popup(posn.X, posn.Y);
end;

我的问题是:当点击按钮取消按钮时,如何停止弹出窗口再次出现?

修改

或者,对于按钮有比TButton更好的选择,这可以避免这个问题吗?我知道分割按钮样式 - 但正确的用法是左侧执行默认操作,右侧使用向下三角形下拉菜单 - 但我不想要默认操作,按钮分裂,或三角形的符号。

这是我已经尝试过的:

  1. 在调用PopupMenu1.Popup()之前禁用该按钮,然后立即启用它。因为直接点击事件在OnClick处理程序退出之前没有排队,所以不起作用。 (按钮也会改变外观。)
  2. (如上所述,但使用TPopupActionBar代替TPopupMenu - 在这种情况下,它确实有效,但taRight上的TPopupActionBar对齐属性将被忽略。我放弃寻找一个简单的解决方案。)
  3. 在调用PopupMenu1.Popup()之前禁用该按钮,但是将自定义消息发布到表单以重新启用它。再次这不起作用 - 由于我不理解的原因,发布的消息在按钮点击消息之前出现了。*
  4. 检查PopupMenu1.Popup()返回与下次调用按钮OnClick处理程序之间的阈值时间是否已过去。这是有效的(在我的系统上,阈值需要至少60毫秒;我决定使用双击时间)但这看起来很可怕,脆弱和错误。
  5. *我想知道这是因为posted messages are processed ahead of input messages

0 个答案:

没有答案