用户在应用程序菜单设计中,可以不加修改地使用模板中的菜单,或者将模板中的菜单略加修改,设计出满足自己需求的菜单系统。
另外,Delphi也允许用户将自己设计的菜单加入到菜单模板中,以备用户在今后的菜单设计中使用。
本节介绍在菜单设计中使用菜单模板的方法。
7.3.1插入菜单模板
用户在自己设计菜单时插入菜单模板的方法如下:
(1)在窗体中加入主菜单组件MainMenu;(2)双击MainMenu组件,打开主菜单设计器,如图7-1所示;(3)用鼠标右键单击要插入菜单模板的空白菜单项,弹出如图7-8所示的快捷菜单;(4)执行【InsertFromTemplate】菜单命令,打开【InsertTemplate】对话框,如图7-11所示,其中列出了前面所说的几种菜单模板;(5)从列表中选择需要的菜单模板(假如第一个主菜单项处插入【FileMenu(forTextEditExample)】菜单模板),然后单击【OK】按钮,所选的菜单模板插入到指定位置,如图7-12所示;(6)若需要,可对菜单模板加以修改。
7.3.2创建新的菜单模板
用户用自己设计的菜单创建新的菜单模板的方法如下:
(1)在窗体中加入主菜单组件MainMenu;
(2)双击MainMenu组件,打开主菜单设计器,如图7-1所示;
(3)用7.2节介绍的方法,按照自己的要求设计菜单;
(4)用鼠标右键单击设计好的菜单,弹出如图7-8所示的快捷菜单;(5)执行【SaveAsTemplate】菜单命令,打开【SaveTemplate】对话框,如图7-13所示。
(6)在对话框的【TemplateDescription】编辑框中输入新建的菜单模板的名称,然后单击【OK】按钮,新创建的菜单成为模板菜单。再打开菜单模板对话框时,可以看到新创建的菜单模板出现在模板列表中,可以像使用系统提供的菜单模板一样使用新的模板。
7.3.3删除菜单模板
对于不需要的菜单模板可以删除。删除菜单模板的方法如下:
(1)打开主菜单设计器;
(2)用鼠标右键单击主菜单设计器,弹出如图7-8所示的快捷菜单;
(3)执行【DeleteTemplates】菜单命令,打开【DeleteTemplates】对话框,如图7-14所示;
(4)在对话框的菜单模板列表中,选择要删除的菜单模板,然后单击【OK】按钮,选择的菜单模板被删除。
7.4动态设置菜单
以上介绍的菜单设计,是在程序设计阶段进行的。程序运行时,菜单就按设计的样式进行工作。然而在实际应用中,往往需要菜单在程序运行过程中呈现不同的状态,这是在程序运行中改变菜单项的某些属性值实现的,即所谓动态设置菜单。
动态设置菜单包括改变菜单项的可用性、改变菜单项的可见性、改变菜单项的标题、设定单选菜单项、为菜单项设置复选标记、动态创建菜单项等。
7.4.1改变菜单项的可用性
程序运行中,有时需要改变某些菜单项的可用性,即菜单项并不消失,而只是变为不可用,即看到的菜单项变灰。
菜单项的可用性是由菜单项的Enabled属性决定的。该属性为布尔型属性,若属性值为True,则菜单项可用;否则,不可用。因此,若要在程序运行中改变某菜单项的可用性,只需改变它的Enabled属性值即可。
假设,图7-15中【窗口】主菜单项的Name属性为“NWindow”,若要改变其可用性,用如下语句:
NWindow.Enabled:=NotNWindow.Enabled;
若该菜单项原来为可用,执行该语句则变为不可用;若原为不可用,执行该语句则变为可用。
【窗口】主菜单项经改变可用性后变灰,如图7-15所示。
7.4.2改变菜单项的可见性
改变菜单项的可见性,是将菜单项隐藏,使用户根本看不到该菜单项,避免其吸引用户的注意。
菜单项的可见性是由菜单项的Visible属性决定的。该属性为布尔型属性,若属性值为True,则菜单项可见;否则,不可见。因此,若要在程序运行中改变某菜单项的可见性,只需改变它的Visible属性值即可。
仍以图7-15中的【窗口】主菜单项为例,若要改变其可见性,用如下语句:
NWindow.Visible:=NotNWindow.Visible;若该菜单项原来为可见,执行该语句则变为不可见;若原为不可见,执行该语句则变为可见。
【窗口】主菜单项被隐藏后,如图7-16所示。
7.4.3改变菜单项的标题
改变菜单项的标题,是指根据程序运行的情况使菜单项显示不同的标题。
菜单项的标题是由菜单项的Caption属性决定的。所以,要改变菜单项的标题,只需改变菜单项的Caption属性值即可。
7.4.4设定单选菜单项
单选菜单项,是指一组菜单项是相互排斥的,用户只能在这组菜单项中选择一个菜单项。
设定单选菜单项必须具备以下两个条件。
(1)这一组菜单项必须在同一个菜单下,而且它们的GroupIndex属性值必须相同。菜单项的GroupIndex属性决定菜单项在菜单中的位置,为直接输入型属性,其默认值为0。
(2)它们的RadioItem属性值都为True。菜单项的RadioItem属性决定菜单项是否允许显示单选标记,为布尔型属性,其默认值为False。
这样,当设定这组菜单项中某个菜单项的Checked属性值为True时,该菜单项的前面加注单选标记(一个小圆点),而组中其他菜单项的Checked属性值自动变为False。因此,在程序运行时,设置组中菜单项的Checked属性值,就可以设定单选菜单项。
7.4.5设置菜单项的复选标记
用于状态设置的菜单项,当设置了该状态时,菜单项前面加注一个对勾标记,这就是菜单项的复选标记;而状态设置取消时,对勾消失。
菜单项的复选标记,是由其Checked属性决定的。该属性是布尔型属性。若其属性值为True时,则菜单项前加注对勾;否则,对勾消失。因此,在程序运行时,改变菜单项的Checked属性值,就可以设置菜单项的复选标记。
7.4.6动态创建菜单项
在Delphi中,菜单项都是TmenuItem类的对象。菜单栏的各主菜单项存储在主菜单组件(MainMenu)的Items属性中。利用菜单项的方法对菜单项进行操作,可以实现程序运行中创建菜单项,即动态创建菜单项的目的。
Remove方法与Delete方法都是删除指定的菜单项,不同的是Delete用序号指定删除的菜单项,而Remove直接指定菜单项。
下面通过一个简单的例子,了解这些方法的使用。
7.5快捷菜单设计
快捷菜单的设计方法同主菜单的设计基本相同,而且前面介绍的主菜单设计中的一些技术也基本适用于快捷菜单的设计。快捷菜单设计要用快捷菜单设计器,而快捷菜单设计器是由PopupMenu组件启动的。
PopupMenu组件位于组件模板的【Standard】选项卡上,其图标为。
7.5.1快捷菜单的创建
创建快捷菜单的步骤如下:
(1)将PopupMenu组件放置到窗体上;
(2)双击PopupMenu组件,打开快捷菜单设计器,如图7-17所示;
(3)用创建主菜单的菜单项的方法创建快捷菜单的菜单项及其子菜单;
(4)为使用该快捷菜单的对象设置PopupMenu属性,这是和主菜单设计不同的地方。
快捷菜单是右击某个对象而弹出的菜单,右击的这个对象就是使用这个快捷菜单的。要使快捷菜单正常工作,必须将快捷菜单和使用这个快捷菜单的对象联系起来,否则右击对象是不会弹出快捷菜单的。要做到这一点,必须设置该对象的PopupMenu属性,要将其属性值设置为快捷菜单的Name属性值(其默认值为PopupMenu1、PopupMenu2等)。
假设为窗体Form1设计的快捷菜单的Name属性值为PopupMenu1,则窗体Form1的PopupMenu属性值应设置为快捷菜单的Name属性值PopupMenu1。这样,程序运行时,右击窗体Form1,会弹出设计的快捷菜单PopupMenu1。
7.5.2快捷菜单的响应
同主菜单的设计一样,快捷菜单创建完成后,要为各菜单项添加OnClick事件并编写事件处理代码。
除此以外,快捷菜单还有一个特殊的问题:快捷菜单弹出位置的方式设定。当右击使用快捷菜单的对象时,快捷菜单有两种弹出位置的方式:一种是自动在鼠标指针位置弹出,称为自动方式;另一种是由用户设定弹出位置,称为手动方式。
快捷菜单弹出位置的方式由PopupMenu组件的AutoPopup属性决定。该属性为布尔型属性,若属性值为True,则为自动方式;否则,为手动方式。其默认值为True。
若选用手动方式,要先将PopupMenu组件的AutoPopup属性值设为True,然后给窗体添加OnMouseDown事件,在该事件处理代码中调用函数Popup(X,Y)定义快捷菜单在显示器屏幕上弹出的位置。
假设,为一个窗体Form1设计的快捷菜单为PopupMenu1。设定PopupMenu1的AutoPopup属性值为False;激活窗体,在对象检查器的事件选项卡中找到OnMouseDown事件,双击事件名栏,激活代码编辑器窗口;在窗口的OnMouseDown事件处理过程中输入如下代码:
其中Button=mbRight表示右击鼠标;X、Y为正整数,是显示器屏幕的坐标,若对窗体定位,可用(Form1.Left+X,Form1.Top+Y)的形式,表示快捷菜单弹出位置相对于窗体左上角的坐标为(X,Y)。
主菜单设计中使用的其他一些技术,如菜单项分组、快捷键和热键的定义、子菜单的创建、菜单项的编辑、菜单模板的使用等,同样适用于快捷菜单的设计,这里不再重复。
习题7
1.主菜单和快捷菜单有什么不同?
2.说明用MainMenu组件设计主菜单的步骤。
设计一个窗口的主菜单,包含【文件】、【编辑】、【工具】和【帮助】4个主菜单项,【文件】主菜单项的下拉菜单中有【新建】、【打开】两个菜单项,而【新建】菜单项带子菜单,包含【单元】和【窗体】两个菜单项。单击【窗体】菜单项,创建一个标题为“新建窗体”的窗体。
3.菜单命令的快捷键和热键的区别是什么?如何设置菜单命令的快捷键和热键?
4.在菜单设计中,如何将菜单项分组?
5.动态菜单包含哪些内容?各如何实现?
6.快捷菜单的设计与主菜单的设计的主要区别是什么?
7.如何使用菜单模板设计菜单?使用菜单模板重新设计习题2中的【文件】主菜单项。