delphi - TButton 的下拉菜单

标签 delphi button drop-down-menu delphi-7

我正在尝试模拟 TButton 的下拉菜单,如下所示:

procedure DropMenuDown(Control: TControl; PopupMenu: TPopupMenu);
var
  APoint: TPoint;
begin
  APoint := Control.ClientToScreen(Point(0, Control.ClientHeight));
  PopupMenu.Popup(APoint.X, APoint.Y);
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    DropMenuDown(Button1, PopupMenu1);
    // ReleaseCapture;
  end;
end;

问题是,当菜单下拉时,如果我再次单击按钮,我希望菜单关闭,但它又再次下拉。

我正在寻找专门通用 Delphi TButton 的解决方案,而不是任何第三方等效解决方案。

最佳答案

在审查了 Whiler 和 Vlad 提供的解决方案并将其与 WinSCP 实现相同功能的方式进行比较后,我当前使用以下代码:

unit ButtonMenus;
interface
uses
  Vcl.Controls, Vcl.Menus;

procedure ButtonMenu(Control: TControl; PopupMenu: TPopupMenu);

implementation

uses
  System.Classes, WinApi.Windows;

var
  LastClose: DWord;
  LastPopupControl: TControl;
  LastPopupMenu: TPopupMenu;

procedure ButtonMenu(Control: TControl; PopupMenu: TPopupMenu);
var
  Pt: TPoint;
begin
  if (Control = LastPopupControl) and (PopupMenu = LastPopupMenu) and (GetTickCount - LastClose < 100) then begin
    LastPopupControl := nil;
    LastPopupMenu := nil;
  end else begin
    PopupMenu.PopupComponent := Control;
    Pt := Control.ClientToScreen(Point(0, Control.ClientHeight));
    PopupMenu.Popup(Pt.X, Pt.Y);
    { Note: PopupMenu.Popup does not return until the menu is closed }
    LastClose := GetTickCount;
    LastPopupControl := Control;
    LastPopupMenu := PopupMenu;
  end;
end;

end.

除了在 onClick 处理程序中调用 ButtonMenu() 之外,它的优点是不需要更改任何代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ButtonMenu(Button1, PopupMenu1);
end;

关于delphi - TButton 的下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597849/

相关文章:

class - Delphi : Error 2008 Incompatible types for a class property

wcf - 如何使用 Delphi XE 发送 WCF 的 ClientCredentials

delphi - 如何使 TListView 标题标题在 VCL 样式应用程序中居中?

xcode - 快速在页脚表格 View 中添加按钮

javascript - ng-init 没有在我的 Angular 应用程序中的选择中设置我的默认类别

jquery - 从 IE6 中的选择中删除选项

c++ - Borland BCB5 TInifile 使用 Readstring() 忽略引号?

HTML:什么 css 属性使按钮 "center"中的内容?

java - 检查手指是否超过 Actor - libgdx

javascript - 从数据库中获取 SELECT 的下拉值而不是在 UI 上进行硬编码 (Angularjs)