Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何使用下拉菜单创建按钮?_Delphi_Button_Popupmenu - Fatal编程技术网

Delphi 如何使用下拉菜单创建按钮?

Delphi 如何使用下拉菜单创建按钮?,delphi,button,popupmenu,Delphi,Button,Popupmenu,有没有办法显示IE/Firefox后退按钮样式、下拉菜单按钮?当然。在页面上放置工具栏。在工具栏上单击鼠标右键,添加一个按钮。将按钮的样式设置为tbsDropDown。在页面上放置一个弹出菜单。双击弹出菜单以定义菜单项。然后,返回您创建的按钮,并将其DropdownMenu属性设置为指向您刚刚创建的弹出菜单。如果您不想使用工具栏,raize(www.raize.com)和express Editor(www.DevExpress.com)库中有可以执行此操作的组件。我假设您指的是单击时下拉菜单的

有没有办法显示IE/Firefox后退按钮样式、下拉菜单按钮?

当然。在页面上放置工具栏。在工具栏上单击鼠标右键,添加一个按钮。将按钮的样式设置为tbsDropDown。在页面上放置一个弹出菜单。双击弹出菜单以定义菜单项。然后,返回您创建的按钮,并将其DropdownMenu属性设置为指向您刚刚创建的弹出菜单。

如果您不想使用工具栏,raize(www.raize.com)和express Editor(www.DevExpress.com)库中有可以执行此操作的组件。

我假设您指的是单击时下拉菜单的按钮

您也可以手动编写按钮代码,单击按钮可在其下方下拉一个TPopupMenu

示例:在表单上删除任何带有TClickEvent(可能是TButton)和TPopupMenu的内容。添加一些菜单项。然后添加以下OnClick事件处理程序:

procedure TForm86.Button1Click(Sender: TObject);
var
  button: TControl;
  lowerLeft: TPoint;
begin
  if Sender is TControl then
  begin
    button := TControl(Sender);
    lowerLeft := Point(button.Left, button.Top + Button.Height);
    lowerLeft := ClientToScreen(lowerLeft);
    PopupMenu1.Popup(lowerLeft.X, lowerLeft.Y);
  end;
end;
还有维奥拉!就像魔术一样。如果您打算重用它,可以将其全部封装在一个组件中。甚至可以在网上出售


注意:如果需要延迟,请用另一种方法提取该代码,然后在单击并打开OnMouseLeave的计时器时设置计时器。然后,如果计时器触发,您可以调用提取的方法。不知道你会如何在键盘上点击它。我不知道Firefox等是否支持这一点。

吉姆的回答很好,但一开始对我来说并不太合适。ClientToScreen使用Form86的方法,只有当按钮直接位于表单上时才正确。应该调用按钮的ClientToScreen方法,如下所示:

procedure TForm86.Button1Click(Sender: TObject);
var
  button: TControl;
  lowerLeft: TPoint;
begin
  if Sender is TControl then
  begin
    button := TControl(Sender);
    lowerLeft := Point(0, button.Height);
    lowerLeft := button.ClientToScreen(lowerLeft);
    PopupMenu1.Popup(lowerLeft.X, lowerLeft.Y);
  end;
end;

无论按钮位于何处,此功能都有效。

如果希望此TButton是一个TSpeedButton,在显示菜单时保持关闭状态,并在用户从菜单或表单中的任何其他位置单击某个项目时弹出,则真正的问题就存在了。但这是一个不同的问题和不同的主题…你能不能在speedbutton的onclick事件中放置一个计时器,然后让计时器的execute事件测试弹出菜单是否仍然可见?如果按钮放在屏幕底部附近,菜单将从按钮底部开始,从底部向上排列,这样就覆盖了它,这可能不是你想要的。(这里可能没问题,我只是想提一下。)为什么这个简单、直接、准确的答案没有被评为最高?