TButton 的下拉菜单

2023-12-22

我正在尝试模拟 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;

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

我正在寻找解决方案具体来说对于通用德尔福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.

它的优点是除了调用之外不需要对 from 进行任何代码更改ButtonMenu() in the onClick处理程序:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ButtonMenu(Button1, PopupMenu1);
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TButton 的下拉菜单 的相关文章

  • 如何在运行时更改按钮的颜色? [复制]

    这个问题在这里已经有答案了 button1 Button root text A1 width 8 grid row 0 column 0 button2 Button root text A2 width 8 grid row 0 col
  • Delphi 2005 Web 服务问题

    我在尝试通过 Delphi 访问 Web 服务时遇到问题 我使用了 2007 版 WSDLimp 工具的 java WSDL 看起来它已正确创建了所有对象 然而 当我制作一个调用该服务的测试程序时 每个对象都是空的 如果我在 HTTPRIO
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • MVC3:设置下拉列表选定值

    我正在使用 mvc3 我的视图中有一个下拉列表 Html DropDownListFor m gt m State new SelectList Model StateList Value Text 有没有办法在视图中设置选定的值 扩展 R
  • 获取 ddSlick 下拉列表中所选

    当前返回未定义 注释行中应该包含什么内容来提醒当前的值 1 2 3 或 4
  • 从 Google 电子表格中的列填充 HTML 下拉菜单

    我是 gs 的新手 所以这应该不难 我有一个 Google 电子表格 其中一列中有值 假设 A 列 我使用 gs 创建了一个自定义菜单 用户将在其中选择一个选项 单击其中一个选项 新组件 将出现一个弹出窗口 其中包含一个下拉菜单 用户应从其
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • 指针^ 与 s[1]

    在读取数据的函数中 数据含义只字符串 从磁盘 我应该更喜欢哪个 哪个更好 A DiskStream Read Pointer s Count or B DiskStream Read s 1 Count Note 我知道两者都有相同的结果
  • Delphi:如何计算大文件的 SHA 哈希值

    您好 我需要生成 5 Gig 文件的 SHA 您知道有一个非基于字符串的 Delphi 库可以做到这一点吗 你应该使用DCPcrypt v2 http www cityinthesky co uk cryptography html读取缓冲
  • 在 tlistbox 中绘制缩略图

    在 DelphiXE 中 我使用 tFileOpenDialog 选择一个文件夹 然后在 tListBox 中列出该文件夹中的所有 jpg 文件 我允许将列表项拖放到列表中进行自定义排序 以便稍后按顺序显示它们 我希望能够在文件名旁边绘制图
  • 构建机器是否需要单独的 Delphi XE4 许可证?

    用于通过以下方式构建应用程序dcc32在构建服务器上我可以使用 Delphi Trial 这种方法的许可证没有任何问题 现在 我将通过以下方式在 TeamCity 上构建 Delphi XE4 应用程序msbuild 我是否需要拥有构建机器
  • 使用 IOmniTaskControl/TOmniWorker 时等待 Invoke 完成

    我使用 TOmniWorker 创建了 IOmniTaskControl 以便我可以定期在特定线程上运行代码块 因此 我将根据需要在此 IOmniTaskControl 上调用 Invoke 当我这样做时 有时需要等待与该工作相关的执行完成
  • 如何获取属于某个进程的打开句柄的计数?

    您可以使用该程序流程浏览器 http technet microsoft com en us sysinternals bb896653查看正在运行的应用程序有多少个句柄 有没有办法用Delphi代码来获取这个数字 我有兴趣跟踪应用程序本身
  • Delphi XE 和 OmniXML:使用 SelectNode()?

    我将以下 XML 片段作为一个更大的 XML 文件的一部分 我正在使用最新的 OmniXML 快照进行处理
  • 如何更改 div 悬停时的跨度颜色

    我正在尝试更改 div 悬停时跨度的颜色 如何使红色汉堡按钮 即跨度 在 div 悬停时将颜色更改为黑色 PS 现在它在跨度的悬停上执行此操作 JSFiddle https jsfiddle net bjjbqct8 https jsfid
  • 具有自动删除项目的 WPF 列表框

    我正在尝试设置一个列表框 用户可以通过单击他们想要删除的每个值来删除项目 我为列表框设置了样式 DisplayName 是项目类的成员 以便为每个项目包含一个按钮
  • 为什么变量被声明为 TStrings 并被创建为 TStringList?

    为什么变量声明为TStrings并创建为TStringList 例如 varsl被声明为TStrings但创建为TStringList var sl TStrings begin sl TStringList Create add stri

随机推荐

  • 如何在 Django F 表达式中将日期和时间字段合并为日期时间字段

    我必须得到两个的区别datetime字段 但一个是纯日期时间字段 另一个是日期和时间的组合 我尝试过这个 qs Foo objects filter bar baz id self kwargs baz pk start datetime
  • 两个任务之间的同步

    这实际上是嵌入式系统中固件的设计问题 我有两个独立执行的 ISR 具有相同优先级 当硬件生成数据时 这些 ISR 被触发 我想要一种必须到位的机制来在任务 1 和任务 2 之间进行同步 任务 2 必须知道任务 1 中计算的某些值 然后在计算
  • 获取月份中的第几周 C# [重复]

    这个问题在这里已经有答案了 我想使用 c 桌面应用程序查找现在在周数上的日期 我一直在谷歌上寻找 但没有一个符合我的需求 如下例所示 如何获得一个月中的一周 例子 我想要 2014 年 1 月 6 日 1 月的第一周 2014 年 1 月
  • 在视图控制器 Swift 中的 UITableView 中加载多个 UICollectionView

    我正在构建一个 iOS 应用程序 其中有 4 种不同的 UICollectionViewn 设计 在 UITableView 中 UICollectionViewCell 类名称为 DealCollectionViewCell Filter
  • 如何在 Rmarkdown 中“装箱”“summary()”的输出

    我看过这个帖子 如何在 R 代码块内创建 R markdown 部分 具有正确的代码显示 https stackoverflow com questions 47414027 how to create r markdown section
  • 无法将类型“System.Linq.EnumerableQuery”的对象转换为类型“Microsoft.Azure.Documents.Linq.IDocumentQuery”

    我有一个具有以下方法的类 并使用 Moq 作为单元测试框架 我如何嘲笑以下内容 FeedOptions feedOptions new FeedOptions MaxItemCount 1000 var query await storeA
  • mysql按年分区和按月子分区

    我有一个数据库 其中的日期列的数据类型为日期 该表预计每天有 10k 行 我想在年份范围的表上创建分区 然后在该特定年份的月份上创建子分区 我试过的是 ALTER TABLE nav master PARTITION BY RANGE YE
  • 春萌要链接动画吗?

    我不完全理解Meng To s Spring的文档 https github com MengTo Spring https github com MengTo Spring 给出的可用函数是 animate animateNext ani
  • 匹配两个Python列表的长度

    我有两个不同长度的 Python 列表 人们可能会假设其中一个列表比另一个列表大几倍 两个列表包含相同的物理数据 但以不同的采样率捕获 我的目标是对较大信号进行下采样 使其具有与较小信号完全相同的数据点 我想出了下面的代码 它基本上完成了这
  • iNotify 能否告诉我受监控的文件移动到了哪里?

    我想在文件在系统中移动时对其进行监视 iNotify 可以在它移动时告诉我它的新位置吗 如果您同时查看文件移出的目录和文件移至的目录 那么您将收到IN MOVED FROM源目录上的事件和IN MOVED TO目标目录上的事件 两者具有相同
  • 在 AJAX 中重新初始化 TinyMCE 4

    我在启用 ajax 的情况下使用 TinyMCE基金会揭晓 http foundation zurb com docs components reveal html盒子 现在 TinyMCE 在第一次加载时就会启动 但如果我关闭盒子并再次打
  • Spring data : CrudRepository 的保存方法和更新

    我想知道是否 save 中的方法CrudRepository如果它已经在数据库中找到了条目 则进行更新 例如 Repository public interface ProjectDAO extends CrudRepository
  • 如何阻止 Chrome 自动完成文本区域?

    我正在处理联系表单部分的文本区域 Chrome 希望自动填充用户的地址 因此 许多联系请求是由用户在评论字段中提交其地址的 除了可能被利用的明显的潜在安全问题之外 我担心的是 从用户的角度来看 我们提供的联系表单没有用于键入消息的区域 从支
  • Ant Design table React js 在特定条件下点击表格展开一行

    我需要一点帮助 我需要编写代码 以便表行仅在切换打开时才展开 当切换关闭时 表行不应展开 我已使用该房产expandRowByClick单击时展开行 但这里的问题是 当切换关闭时 它不应该可单击 但现在空行将会展开 我怎样才能避免它 任何人
  • 如何从 if 语句内的布尔值中打破 if 语句 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有这样的东西 bool a true bool b true bool plot true if plot if a if b b fal
  • 如何获取默认短信应用程序的包名称?

    由于 4 4 中添加了默认短信应用程序 因此我无法像这样打开默认短信应用程序 Intent intent new Intent Intent ACTION MAIN intent addCategory Intent CATEGORY DE
  • 当Service被杀死后,进程还能存活吗?

    我的应用程序同时具有服务和活动 假设我的应用程序的进程正在运行 一段时间后 Android 操作系统由于内存不足而终止了我的应用程序中的服务 我的问题是 Android是否有可能只杀死服务并保持进程处于活动状态 或者当一个服务被杀死时 该进
  • 使用jq递归提取对象值和父键名称

    我需要解析的输出npm ls global json命令 这样我就可以获得所有已安装的列表npm包的格式如下 package version js resolved Where package是包含包名称的键 来自每个dependencie
  • 将 Devise 与同一模型的多个命名空间一起使用

    我想将 Devise 与两个命名空间一起使用 API 命名空间和默认命名空间 但当用户尝试登录时 两者似乎发生冲突 含义是 无论引用 Devise 的哪个命名空间首先结束 是最终的重定向地点 例如 如果我尝试创建一个新会话 在默认命名空间下
  • TButton 的下拉菜单

    我正在尝试模拟 TButton 的下拉菜单 如下所示 procedure DropMenuDown Control TControl PopupMenu TPopupMenu var APoint TPoint begin APoint C