Delphi Menu Designer(菜单设计器)之一

菜单包括大多数Windows应用程序的大部分内容。一些Windows应用程序没有菜单,但绝大多数都有。Delphi使用Menu Designer使得创建菜单变得容易。Menu Designer有如下特点:

  • 可以创建主菜单和弹出菜单(快捷菜单)。
  • 为菜单项处理提供OnClick事件。
  • 从模板或源文件插入菜单。
  • 以模板形式保存客户菜单。

所有Menu Designer命令通过其快捷菜单或者使用Object Inspector来操作。如下图,显示了Menu Designer的快捷菜单:

0150

从大部分情况下,这些快捷菜单项通过其名字就能知道它的用途,因此不在这里做进一步讨论。

下面我们通过使用菜单项来了解它们,首先为前面创建ScratchPad应用程序添加一个主菜单,然后添加一个快捷菜单。

一、创建主菜单

Menu Designer能够很快建立任何菜单。主菜单的菜单结构由MainMenu组件构成,它由VCL类TMainMenu表示。菜单上每一项是TMenuItem组件,封装在TMenuItem类中。不必太关心这些类如何协同工作的细节,因为Menu Designer使得建立菜单变得非常容易。TMainMenu和TMenuItem继承关系图如下:

image image

1、 添加主菜单到窗体

首先必须添加MainMenu组件到窗体。

Note

现在大家对Delphi已有了使用经验。从这时起,要缩略某些需要执行动作的步骤。例如,从现在开始说“把MainMenu组件放到窗体上”,而不是说“在组件面板上点击Standard标签,点击MainMenu按钮,点击窗体放置MainMenu组件。”不要担心,在引入新操作前,会给出大量的细节。

(1)打开上一讲创建的ScratchPad工程。

(2)在窗体上放置MainMenu组件,显示为一个图标,如下图,改变其Name属性为MainMenu。注意MainMenu组件有很少几个属性且没有时间,所有菜单的工作由单个菜单项完成。

0151

(3)双击MainMenu图标,显示出Menu Designer。

Menu Designer看起来像没有坐标网格点的空窗体,它可以任意调整大小,调整大小只是为了方便,与在运行阶段菜单如何操作没有多大关系。在此意义上,Menu Designer等待着开始建立菜单。在建立完第一个菜单后,就会发现建立菜单是容易而且可视的。

2、手工创建菜单

尽管有更容易的方式建立File菜单,但是我们要是要手工来创建第一个菜单。Menu Designer总有空菜单项作为新菜单项的占位标识符。当 开始启动Menu Designer时,选择空项目。

0152

(1)改变Name属性为FileMenu

(2)在Object Inspector中点击Caption属性,输入“&File”,按Enter键确定,如下图:

0153

Note

&符号用于建立菜单项的下划线字符。下划线字符是加速器,允许用户用键盘+Alt快速启动菜单项。可把&字符放在菜单项文本的任意位置。例如Exit菜单项的常用文字字符串为E&xit,故x是加速键。

输入上面的File菜单后,有几件事会发生。首先File菜单显示在Menu Designer中,它也出现在Menu Designer背后的主菜单上,另一件是新的空白占位标志符增加在刚建立的File菜单下面(必须点击Menu Designer中的File菜单来看占位标志符)。Object  Inspector显示空MenuItem组件,等待输入Caption和Name属性。如下图:

0154

继续创建菜单

(1)更改Name属性为FileNew

(2)更改Caption属性为&New,按Enter键,在Menu Designer中又建立了空白项。

(3)重复(1)、(2)步,为OpenSaveSave As创建菜单项。效果如下图,不要担心做的不好,总可以回过头来修正错误的。

0155

Tip

尽可能把菜单做的标准些。保证加速键(下划线字符)与其他Windows程序相同。记住,菜单项标题后面有省略号(…)的说明是对话框。

 

New Term

菜单分隔符(separator)是菜单上分隔菜单组的横向线。

用Delphi Menu Designer增加分隔线是容易的,所做的是在Caption属性中输入连字符(-)。上图中在“Save As…”菜单下面就是一个分隔符,其Name属性为N1,Caption属性输入的为“-”。

Note

Menu Designer总在每个弹出菜单底端和菜单栏右边提供空项。不能也没必要删除这些空白菜单,它们只用于Menu Designer,在程序运行时不显示在菜单上。

现在,File菜单已经做好了,下面将要创建Edit菜单和Help菜单。

 

3、从模板插入菜单

这次要采取容易的方法。首先,点击File菜单右边的空白菜单项。然后点击鼠标右键选择快捷菜单中的“Insert From Template…”,将显示出Insert Template对话框,如下图:

0156

此对话框显示供选择的一系列模板,可使用预定义模板或建立自己的模板。此时我们只选择Edit Menu,点击OK。Edit菜单立刻插入到了Menu Designer中了,如下图,其中有其菜单项目我们没有用,稍后我们讲解删除菜单项时再处理。

0157

这里可以增加Help菜单,点击Edit菜单右边的空白占位符,在选择“Insert From Template…”,这次我们插入“Help Menu”,立刻Help菜单出现在了Menu Designer中。

Note

可插入模板来创建弹出菜单,与创建主菜单项一样容易。

从模板插入真的那么容易,使用Delphi之后,多半会用自己定制的模板快速而容易地建立菜单。虽然仍要更新Name属性为有意义的名字,但比从Menu Designer中一步一步创建要容易的多。

Note

Insert From Resource 与 Insert From Template 的作用一样,但它要求含有有效的菜单定义的资源文件(RC扩展名)。菜单资源必须使用begin/end菜单资源语法,而且不能使用花括号。例如下面的定义是无效的:

MENU_1 MENU
{
  POPUP "FILE"
  {
    MENUITEM "OPEN", 100
    MENUITEM "ABOUT", 101
  }
}

而下面是合法菜单资源:

MENU_1 MENU
BEGIN
  POPUP "FILE"
  BEGIN
    MENUITEM "OPEN", 100
    MENUITEM "ABOUT", 101
  END
END

上面的合法菜单资源仅用于由Insert From Resource插入的菜单,而非一般菜单资源。

 

4、删除菜单项

建立Windows应用程序的过程,很少第一次就能恰好正确。用户需要新特色,老板提出一些改进,甚至某些特性需要删掉,这些变动就要求经常更新应用程序的菜单。例如最初插入的Edit模板菜单非常的长,其中有些项不需要,毫无疑问就必须删除它。

0158 0159

(1)在Edit菜单上点击。

(2)点击Repeat<command>项。

(3)在键盘上按Delete键或从Menu Designer快捷菜单中选择“Delete”删掉此项,该项消失,其余项目上移。

(4)删除Paste Special项。

对Edit菜单还未处理完,继续之前提一下Menu Designer中有用用的特性。就是Shift + ClickCtrl + Click。这个技术可用于在Windows资源管理器中选择文件。Menu Designer支持这个技术。

(1)Edit菜单应该仍在显示着,若没有,点击Edit菜单来显示Edit菜单。

(2)点击菜单项Go to

(3)按下Shift键,点击菜单项Object,这两个之间的所有项都已经选定。

(4)按Delete键一次消去所有项。

(5)点击Help菜单,删除中间两项,保留Contents项和About项。

可见Shift+Click技术用于快速删除不想要的菜单项。

 

5、插入菜单项

插入菜单项非常直接,就在要插入新项的菜单项上点击,在键盘上按Insert键或从Menu Designer快捷菜单中选择Insert。空菜单项即被插入了,可以像以前一样改变Name属性和Caption属性。

下面在Edit菜单中插入一项。

(1)点击Edit显示Edit菜单。

(2)点击Find菜单项。

(3)按键盘Insert键插入一个新菜单项,所有在新项目下面的项都向后移动。

(4)改变Name属性为EditSelectAll,并改变Caption属性为“Select &All”。

(5)点击Edit菜单底端的空占位符,增加菜单分隔符。

恶魔再点击占位符以增加新项,设置Name属性为EditWordWrap,Caption属性为“&Word Wrap”。

现在Edit菜单看起来如下:

0160

 

6、移动菜单项

需要时能容易移动菜单项,可以在它们所在弹出菜单中上下移动,或者移出弹出菜单。

有两种方式移动菜单项:

  • 第一种使用Cut和Paste。
  • 第二种是把它拖动到新位置然后释放。

下面来试试,把Select All菜单项放到Undo项的下面,这是很容易的,只要移动它。

(1)点击Edit显示Edit菜单。

(2)点击Select All项,拖动它知道Undo项下的分隔线亮起来。

(3)释放鼠标,菜单项移动了。

这就是Delphi,非常容易。

 

7、批量修改属性

有时想一次改变几个菜单项的属性,例如,在ScratchPad应用程序中,有几个菜单项不准备这次完成,比如不准备支持打印,也不准备完成帮助系统。因此需要屏蔽这些菜单项。

(1)在Meun Designer中选择Help | Contents

(2)改变其Enabled属性为False,该菜单项目被屏蔽。

(3)点击File菜单。

(4)点击Print菜单项,按住Shift键,点击Print Setup菜单项,两个项目都被选定。

(5)在Object Inspector中,改变它们的Enabled属性为False,两个菜单项都被屏蔽了。

恶魔重复(4)、(5)步来屏蔽Edit菜单上的Find 和 Replace菜单项。

用这种方法可以一次改变一组菜单项,只需要选择想要改变的项,按要求改变其属性。

 

8、增加位图到菜单栏

可以容易地增加位图到菜单上。在想增加位图的菜单上点击,然后在Object Inspector中Bitmap属性的Value栏中双击,弹出Picture Editor对话框,选择要显示的位图即可。位图可以是单个图像或者图像列表。如果使用图像列表,还应该设置ImageIndex属性为要显示的图像列表中的索引号。

Note

在设计阶段,菜单项目位图不显示在Menu Designer中或者窗体上,必须运行程序来看位图菜单。

 

9、创建子菜单

创建子菜单没有什么特别或需要技巧的地方。子菜单是一种菜单项,点击时能扩展显示更多的菜单选项。子菜单是以菜单项标题附近的右向箭头标记的。可从Menu Designer快捷菜单中选Create Submenu或按住Ctrl+右箭头建立子菜单。如下:

0161

建立子菜单时,空菜单项安排在菜单项的右边。可往子菜单增加菜单项,就想生成主菜单一样。也可以插入菜单模板建立子菜单。如下:

0162

 

10、增加快捷键

可通过改变Object Inspector中的ShortCut属性来增加菜单项的快捷键。以前插入的Edit菜单已有内部快捷键。例如,Cut的快捷键是Ctrl+X,如果看Edit菜单,会看到Ctrl + X列在Cut项目旁边。

0163

在Cut菜单项上点击,在Object Inspector的ShortCut属性中看到其值为Ctrl + X。点击ShortCut属性的Value栏,会看到下拉按钮,点击按钮列出所有的快捷键列表。要为菜单项设置快捷键,只要从表中选择即可。

image

Select All菜单项目的标准快捷键是Ctrl + A,因此我们为Select All菜单项增加快捷键。

(1)从Menu Designer中选择 Edit | Select All

(2)在Object Inspector中点击ShortCut属性。

(3)从列表中选择Ctrl + A,则Select All项显示出Ctrl + A来。如下:

0164

这时所有要做的,以后Delphi来照顾它,快捷键不需要编写任何代码。

 

11、最后的工作

下载来完成菜单。

首先,Word Wrap菜单项用于打开或关闭换行的。当该项打开时,Word Wrap菜单项前面有一个对勾;当该项关闭时,则没有对勾。通过设置Word Wrap菜单项的Checked属性为True来表示换行特性的打开。如下:

image

另一件事情就是改变从模板插入的所有菜单项目的Name属性。默认插入时都是缺省值,需要把它们改为更为有意义的名字。

(1)点击Edit | Undo菜单项,更改Name属性为EditUndo。如果使用的是缺省值,则需要在Undo1基础上,在前面加上Edit前缀,然后删除掉结尾处的1。

(2)可使用命名惯例但要前后一致,对Cut、Copy、Paste、Find及Replace菜单项Name属性进行修改,依次为EditCut,EditCopy,EditPaste、EditFind及EditReplace

(3)现在更改Help菜单,将其中Contents菜单项的Name属性改为HelpContents,About菜单项Name属性改为HelpAbout

这就快要完成菜单了,在检查一遍,如果发现错误就做必要的修改。当一切没有问题了,点击关闭框关闭Menu Designer。

Note

可双击任何菜单项直接从Menu Designer中访问Code Editor,双击菜单项是,Code Editor将显示该项的OnClick事件,这时可以开始输入代码。在一下讲解中,我将要编写菜单代码。

以上代码均在Delphi 7中测试通过,截止到本讲示例代码下载:ScratchPad(菜单设计器之一).rar

(请继续下一讲)

posted on 2012-01-16 23:42  pchmonster  阅读(10849)  评论(3编辑  收藏  举报

导航