将项目添加到tpopup delphi菜单

在Delphi应用程序中使用菜单或弹出菜单时,在大多数情况下,都是在设计时创建菜单项的。每个菜单项都由一个TMenuItem Delphi类表示。当用户选择(单击)一个项目时,OnClick事件将被触发,以供您(作为开发人员)获取该事件并响应它。...

在Delphi应用程序中使用菜单或弹出菜单时,在大多数情况下,都是在设计时创建菜单项的。每个菜单项都由一个TMenuItem Delphi类表示。当用户选择(单击)一个项目时,OnClick事件将被触发,以供您(作为开发人员)获取该事件并响应它。

Dynamic Extended TMenuItem in PopUp Menu

在某些情况下,菜单项在设计时未知,但需要在运行时添加(动态实例化)。

在运行时添加tmenuitem

假设Delphi表单上有一个名为“PopupMenu1”的TPopupMenu组件,要在弹出菜单中添加一项,您可以编写如下代码:

var menuItem : TMenuItem; begin menuItem := TMenuItem.Create(PopupMenu1) ; menuItem.Caption := 'Item added at ' + TimeToStr(now) ; menuItem.OnClick := PopupItemClick; //assign it a custom integer value.. menuItem.Tag := GetTickCount; PopupMenu1.Items.Add(menuItem) ; end;

笔记

  • 在上面的代码中,PopupMenu1组件中添加了一项。请注意,我们为Tag属性指定了一个整数值。Tag属性(每个Delphi组件都有)设计为允许开发人员分配作为组件一部分存储的任意整数值。
  • GetTickCount API函数检索自Windows启动以来经过的毫秒数。
  • 对于OnClick事件处理程序,我们指定了“PopupItemClick”——具有*正确*签名的函数名。
procedure TMenuTestForm.PopupItemClick(Sender: TObject) ; var menuItem : TMenuItem; begin if NOT (Sender is TMenuItem) then begin ShowMessage('Hm, if this was not called by Menu Click, who called this?!') ; ShowMessage(Sender.ClassName) ; exit; end; menuItem := TMenuItem(sender) ; ShowMessage(Format('Clicked on "%s", TAG value: %d',[menuItem.Name, menuItem.Tag])) ; end;

重要的

  • 单击动态添加的项目时,将执行“PopupItemClick”。为了区分一个或多个运行时添加的项目(所有项目都在PopupItemClick中执行代码),我们可以使用Sender参数:

“PopupItemClick”方法首先检查发送者是否实际上是一个TMenuItem对象。如果该方法是作为菜单项OnClick事件处理程序的结果执行的,那么我们只需显示一条对话框消息,其中包含将菜单项添加到菜单时分配的标记值。

tmenuitem中的自定义字符串

在实际应用程序中,您可能需要更大的灵活性。假设每个项目将“代表”一个网页-需要一个字符串值来保存网页的URL。当用户选择此项时,您可以打开默认web浏览器并导航到与菜单项一起分配的URL。

下面是一个定制的TMenuItemExtended类,它配备了一个定制字符串“Value”属性:

type TMenuItemExtended = class(TMenuItem) private fValue: string; published property Value : string read fValue write fValue; end;

下面介绍如何将此“扩展”菜单项添加到PoupMenu1:

var menuItemEx : TMenuItemExtended; begin menuItemEx := TMenuItemExtended.Create(PopupMenu1) ; menuItemEx.Caption := 'Extended added at ' + TimeToStr(now) ; menuItemEx.OnClick := PopupItemClick; //assign it a custom integer value.. menuItemEx.Tag := GetTickCount; //this one can even hold a string value menuItemEx.Value := 'http://delphi.about.com'; PopupMenu1.Items.Add(menuItemEx) ; end;

现在,必须修改“PopupItemClick”以正确处理此菜单项:

procedure TMenuTestForm.PopupItemClick(Sender: TObject) ; var menuItem : TMenuItem; begin //...same as above if sender is TMenuItemExtended then begin ShowMessage(Format('Ohoho Extended item .. here''s the string value : %s',[TMenuItemExtended(Sender).Value])) ; end; end;

这就是全部。您可以根据自己的需要扩展TMenuItemExtended。创建定制的Delphi组件是寻找关于创建自己的类/组件的帮助的地方。

笔记

要实际打开默认Web浏览器,可以使用Value属性作为ShellExecuteEx API函数的参数。

  • 发表于 2021-09-06 15:10
  • 阅读 ( 164 )
  • 分类:IT

你可能感兴趣的文章

如何将媒体文件嵌入delphi可执行文件(rc/.res)(embed media files into a delphi executable (rc/.res))

...的两倍。如果您想要更小的可执行文件,请考虑将资源和项目的部分放置在动态链接库(DLL)或其更专业化的变体中。 现在让我们看看如何创建一个描述资源的文件。 创建资源脚本文件(.rc) 资源脚本文件只是一个简单...

  • 发布于 2021-09-06 15:08
  • 阅读 ( 189 )

delphi编译器版本指令

...串的末尾添加“\”,如果该字符串还不存在。在Delphi MP3项目中,我使用了这个函数,有几位读者抱怨说他们不能编译这个项目,因为他们在Delphi 5之前有一些Delphi版本。 解决此问题的一种方法是创建此例程的您自己的版本—Ad...

  • 发布于 2021-09-06 15:09
  • 阅读 ( 161 )

了解delphi编程的基础知识

...部分和工具。 “你好,世界!” 通过创建一个简单的项目、编写代码、编译和运行项目,开始您对Delphi应用程序开发的概述。然后,通过创建第二个简单的Delphi应用程序来了解属性、事件和Delphi Pascal—使您能够学习如何在...

  • 发布于 2021-09-06 15:13
  • 阅读 ( 180 )

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 171 )

在delphi的tdbgrid中显示和编辑备注字段

...单:“DBMemoEditor”(TMemo)。注2:“TMemoEditorForm”已从“项目选项”对话框窗口的“自动创建表单”列表中删除。 让我们看看DBGrid1的KeyDown事件处理程序中发生了什么: 当用户按下ENTER键时(我们将键参数与VK_返回虚拟键代...

  • 发布于 2021-09-10 20:47
  • 阅读 ( 163 )

德尔福单元剖析(德尔福初学者版)

...等词需要在您的编程知识中占有特殊的位置。 德尔福项目 当我们创建一个Delphi应用程序时,我们可以从一个空白项目、一个现有项目或Delphi的一个应用程序或表单模板开始。项目由创建目标应用程序所需的所有文件组成。 ...

  • 发布于 2021-09-10 20:53
  • 阅读 ( 180 )

如何构建没有gui的控制台应用程序(build console applications with no gui)

...导。您可以通过指向File | New来访问它,这将打开一个新项目对话框-在新页面中选择控制台应用程序。请注意,在Delphi6中,表示控制台应用程序的图标看起来不同。双击图标,向导将设置一个Delphi项目,准备编译为控制台应用程...

  • 发布于 2021-09-10 22:34
  • 阅读 ( 250 )

用delphi编写网络感知应用程序

...打开Delphi两次,分别为服务器应用程序和客户端创建一个项目。 服务器端: 在表单上,插入一个TServerSocket组件和一个TMemo组件。在表单的OnCreate事件中,添加下一个代码: procedure TForm1.FormCreate(Sender: TObject);begin ServerSocket1.P...

  • 发布于 2021-09-10 23:39
  • 阅读 ( 197 )

在系统托盘中放置delphi应用程序

...数是初始化的TrayCondata结构。 拿一个 如果您现在运行项目,您将看到托盘中时钟附近有一个图标。注意三件事。 1) 首先,当你点击(或用鼠标做其他事情)托盘中的图标时,什么也不会发生——我们还没有创建一个过程...

  • 发布于 2021-09-11 00:20
  • 阅读 ( 177 )

delphi中的基本剪贴板操作(剪切/复制/粘贴)

...用程序中使用Windows剪贴板,我们必须将ClipBrd单元添加到项目的uses子句中,除非我们限制剪切、复制和粘贴到已经具有内置剪贴板方法支持的组件。这些组件是TEdit、TMemo、TOLEContainer、TDDEServerItem、TDBEdit、TDBImage和TDBMemo。 ClipBrd...

  • 发布于 2021-09-15 03:52
  • 阅读 ( 273 )
cit6709
cit6709

0 篇文章

相关推荐