第三章菜單程序的開發和設計
在Windows操作係統(無論是在Windows 98/2000還是在Windows NT)中,大量的采用了菜單技術。一個典型的菜單就是Windows 中IE瀏覽器中的係統菜單,如圖3-1所示為“收藏”菜單項,用戶在其中可以方便地使用各種選項進行操作。
圖3-1 IE瀏覽器中的係統菜單
在Delphi中有兩種菜單設計器——MainMenu Designer(主菜單設計器)和PopMenu Designer(彈出菜單設計器),它們都是不可見控件。
注意:
?所謂的不可見,指的是在程序運行的過程中不可見,並不是程序設計過程中的不可見。
菜單也是可視化編程的特色之一,從某種意義上講,也是衡量應用程序功能的一個方麵,合理的利用菜單等Windows界麵,可以大大的提高應用程序的人機交互功能,增加用戶與程序之間的交流機會。
在本章中,我們仍然以幾個比較常用的示例,將對菜單這種人機交互界麵進行比較詳細的講解。下麵就來分別的講述一下如何利用主菜單設計器和彈出菜單設計器設計係統菜單和彈出式菜單。
3.1 主菜單基本概述
主菜單設計器位於Delphi控件工具欄中Standard選項下的最左側,它的主要功能是設計係統菜單,或者叫做下拉式菜單。
3.1.1 創建菜單項
下麵將會通過一個示例來說明如何在Delphi中創建一個菜單項,在這個菜單項中,有一個主菜單,而這個主菜單又由五個子菜單項組成,但是它們目前還不能夠實現任何功能,具體的步驟如下:
1.添加控件
按照前麵的方法新建立一個程序項目(Application Project),首先從控件工具欄上選擇“MainMenu(主菜單設計器)”,然後把它添加到空白的窗體上,在實際的操作過程中,可以通過兩種方法向窗體上添加“主菜單設計器”:
?在控件工具欄上單擊鼠標的左鍵,然後把鼠標移動到空白的窗體上,按下的同時移動鼠標,在窗體上就會繪製出一個“主菜單設計器”;
?在控件工具欄上用鼠標的左鍵雙擊“主菜單設計器”的圖標,係統就會自動的在空白的窗體上放置一個“主菜單設計器”,但是這樣做通常需要用戶手動的調節控件的位置。
如圖3-2所示即為放置了一個“主菜單設計器”的窗體。
圖3-2 放置了“主菜單設計器“的窗體
雖然在窗體上放置了“主菜單設計器”,但是隻有激活了“主菜單設計器”才能夠對主菜單進行設計等操作,激活“主菜單設計器”的方法也有兩種:
?用鼠標的左鍵在“主菜單設計器”上雙擊,在屏幕上就會彈出一個空白的主菜單設計窗口;
?在控件的屬性列表中用鼠標的左鍵單擊Items屬性右側屬性輸入框中的按鈕也可以打開主菜單設計器。
2.添加菜單項
在剛剛添加的“主菜單設計器”上雙擊鼠標的左鍵,就會彈出一個如圖3-3所示的主菜單設計窗口。
圖3-3 打開的主菜單設計器
在主菜單設計器中對主菜單及其子菜單項的屬性設置如下所示,讀者可以打開項目文件所對應的窗體文件(以*.dfm為文件後綴)來觀察程序中對窗體及各個控件的屬性設置,由於“主菜單設計器”也屬於控件類,所以相應菜單項的屬性設置也可以在窗體文件中觀察到。
object Form1: TForm1
Left = 192
Top = 107
Width = 544
Height = 375
Caption = 'Form1'
Menu = MainMenu1
object MainMenu1: TMainMenu
Left = 464
Top = 264
object File1: TMenuItem
Caption = 'File'
object New1: TMenuItem
Caption = 'New'
end
object Open1: TMenuItem
Caption = 'Open'
end
object Close1: TMenuItem
Caption = 'Close'
end
object Save1: TMenuItem
Caption = 'Save'
end
object Exit1: TMenuItem
Caption = 'Exit'
end
end
end
end
經過以上設置的菜單如圖3-4所示。
圖3-4 設置屬性值後的主菜單
經過這樣設置的“主菜單設計器”擁有一個主菜單項“File”,在這個菜單項下有五個子菜單項——“New、Open、Close、Save和Exit”。
3.修改菜單項
值得注意的是,以上的設計菜單的方法隻是一種通用的方法,我們也可以通過在程序設計過程中修改項目文件的窗體文件來達到設計菜單的目的,如上例所示,在主菜單“File”下有五個子菜單項,我們可以首先打開程序的窗體文件,然後在子菜單項Save和Exit之間添加如下內容:
object Save2: TMenuItem
Caption = 'Save as'
end
object About1: TMenuItem
Caption = 'About'
end
保存窗體文件,重新打開項目文件,在程序的設計階段用鼠標的左鍵單擊菜單項“File”,結果如圖3-5所示。
圖3-5 修改後的菜單項
3.1.2 設置分隔條
在菜單係統的設計中,經常可以看到所謂的將菜單項分組的技術,即在同一個菜單項下將一個幾個子菜單項組合成一個集合,從而用分隔條相互的隔離開來,如圖3-6所示即為一個典型的分隔條設置示例。
圖3-6 菜單項中的分隔條
其實分隔條的設計也是相當簡單的,隻要在菜單項的Caption屬性中設置為“-”即可,如圖3-6所示的菜單項分隔條屬性設置如下:
object New1: TMenuItem
Caption = 'New'
end
object Open1: TMenuItem
Caption = 'Open'
end
object Close1: TMenuItem
Caption = 'Close'
end
object N1: TMenuItem
Caption = '-'
end
//設置分割條
object Save1: TMenuItem
Caption = 'Save'
end
object Save2: TMenuItem
Caption = 'Save as'
end
object About1: TMenuItem
Caption = 'About'
end
object N2: TMenuItem
Caption = '-'
end
//設置分割條
object Exit1: TMenuItem
Caption = 'Exit'
end
3.1.3 設置快捷鍵
一般來說,常用的菜單項都有自己的快捷鍵(加速鍵或者熱鍵),為菜單項設置一個合適的快捷鍵,可以提高用戶訪問命令和使用菜單項的效率,如圖3-7所示為Word 中“編輯”菜單,基本上每一個菜單項都有自己的快捷鍵方式。
圖3-7 有快捷鍵的菜單項
在Delphi中可以為每一個子菜單項設置快捷鍵:
在Delphi中,通過設置子菜單項的Caption屬性可以為子菜單項設置加速鍵,在設置Caption屬性時,在需要設置為加速鍵的字母前麵加一個“&”符號,這樣菜單項中的該字母就會自動的加上一個下劃線,在程序運行過程中用戶按下Alt鍵和該字母的組合鍵就可以實現選中子菜單項的功能。
如圖3-8所示即為設置了加速鍵的子菜單項——New,在程序運行的過程中,用戶隨時的按下Alt+N鍵就可以訪問子菜單項New。
圖3-8 設置加速鍵
當為子菜單項設置熱鍵時,操作方法與以上略有不同。
首先用鼠標選中想要設置熱鍵的子菜單項,然後用鼠標的左鍵單擊這個菜單項,返回到子菜單項的屬性列表中,單擊屬性列表中ShortCut屬性輸入框右側的下拉按鈕,在彈出的熱鍵列表中選擇一個合適的熱鍵即可。
如圖3-9所示為設置了加速鍵和熱鍵的菜單效果。
圖3-9 設置了加速鍵和熱鍵的菜單項
其中各個菜單項的屬性設置如下所示:
object File1: TMenuItem
Caption = 'File'
object New1: TMenuItem
Caption = '&New'
end
object Open1: TMenuItem
Caption = '&Open'
end
object Close1: TMenuItem
Caption = '&Close'
end
object N1: TMenuItem
Caption = '-'
end
object Save1: TMenuItem
Caption = '&Save'
end
object Save2: TMenuItem
Caption = 'save &As'
end
object About1: TMenuItem
Caption = '&About'
end
object N2: TMenuItem
Caption = '-'
end
object Exit1: TMenuItem
Caption = '&Exit'
end
end
3.1.4 設置複選標誌
所謂的複選標誌,指的是當用戶選擇菜單項中的某一個子菜單項時,在相應的菜單項的前麵就會顯示一個選中的標記符號“√”,而當用戶再次單擊這個菜單項時,複選標誌又會消失。
複選標誌可以在程序的設計階段通過子菜單項的屬性來加以設置,方法是在程序的設計階段首先用鼠標選中子菜單項,然後把鼠標移動到菜單項對應的屬性列表框中,把Checked屬性設置為True,,如圖3-10所示。那麼在程序的運行過程中,該菜單項的前麵就會顯示一個複選標誌。
圖3-10 設置菜單的複選標誌
當然,我們也可以在程序的運行過程中通過代碼來動態的設置菜單項的複選標誌,首先在窗體的FormCreate()事件中加入對菜單項的初始化代碼如下所示:
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Open1.Checked:=true;
//初始化菜單項的狀態
end;
以上的代碼在程序運行的初期就把子菜單項New設置為複選狀態,然後在程序的設計階段用鼠標的左鍵單擊子菜單項New,在彈出的代碼窗口中添加如下所示的相應菜單事件的代碼:
procedure TForm1.Open1Click(Sender: TObject);
begin
form1.Open1.Checked:=not form1.Open1.Checked;
//鼠標單擊後改變菜單項的狀態
end;
這段代碼能夠實現子菜單項複選狀態之間的互換,即用鼠標單擊子菜單項會改變菜單項的選中狀態。以上代碼的運行結果如圖3-11所示。
圖3-11 動態改變菜單的複選狀態
3.1.5 菜單項有效狀態設置
在其它的應用程序中,經常的看到在一些菜單中,程序可以動態的設置菜單的有效狀態,即在一定的條件下,某個菜單處於無效的狀態,在另外的條件下,菜單項又會變為有效的狀態,一個十分明顯的例子就是編輯菜單中Paste子菜單項,當剪貼板中沒有數據時,Paste就會處於無效的狀態,一旦剪貼板上有數據,那麼Paste就會立刻的變為有效的狀態,在Delphi中也可以實現這種效果。
下麵就講述一下如何通過代碼來在程序的運行過程中動態的改變菜單項的有效狀態。
首先按照如圖3-12,按照前麵所講的方法設計一個比較完整的係統下拉式菜單,包括另外兩個主菜單Edit和Help。
圖3-12 設計完成的下拉式菜單
然後,在程序的設計過程中,用鼠標的左鍵雙擊窗體的空白處,在屏幕上就會彈出一個代碼窗口,把光標移動到代碼窗口中的FormCreate()事件處理過程中,並且添加如下所示的程序初始化代碼:
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.Copy1.Enabled:=true;
form1.Paste1.Enabled:=false;
//初始化菜單項的有效狀態
end;
在程序運行的初期,在剪貼板上還沒有可以利用的數據,所以要通過語句form1.Paste1.Enabled:=false;把子菜單項Paste設置為無效的狀態。
在程序運行的過程中,當用戶用鼠標的左鍵單擊子菜單項Copy時,係統的剪貼板就會帶有數據,所以子菜單項Paste就要變為有效的狀態。
在代碼窗口中找到子菜單項的響應事件Copy1Click(),並且添加如下的菜單響應代碼:
procedure TForm1.Copy1Click(Sender: TObject);
begin
form1.Copy1.Enabled:=false;
form1.Paste1.Enabled:=true;
//鼠標單擊後改變菜單項的狀態
end;
做完以上的工作後,存儲文件(保存項目文件為App3_1,單元文件為mainmenu),按鍵盤上的功能鍵F9運行程序,結果如圖3-13所示。
圖3-13 主菜單應用程序界麵
3.2 主菜單的應用
本節,我們將向讀者介紹一個主菜單的設計實例,實際是一個“簡易記事本”,在其中可以實現以下的功能:
?能夠新建一個文本文件,並且能夠把用戶的修改結果保存到文本文件中;
?能夠打開一個已經存在的文本文件,而且在程序運行的過程中能夠加以修改;
?在程序運行的過程中,應用程序能夠同剪貼板之間進行簡單的數據交換等。
製作能夠實現以上功能的文本處理應用程序的具體步驟如下所示:
1.開始工作
首先啟動一個新的項目,選擇菜單“File”中的“New Application”項;
在Delphi的集成開發環境中就會彈出一個新建的窗體,在控件工具欄上選擇“Standart”選項後,在“MainMenu”控件的圖標上雙擊鼠標的左鍵,這時空白的窗體上就會出現一個主菜單設計器。接著向窗體上添加一個OpenDialog控件、一個SaveDialog控件和一個Memo控件。
各個控件的功能將在後麵分別的加以介紹,添加控件後的窗體如圖3-14所示。
圖3-14 添加控件後的窗體
其中添加到窗體上的各個控件的功能如下所示:
?MainMenu控件的作用是為應用程序設計一個下拉式主菜單;
?而OpenDialog控件的作用是顯示一個“打開”對話框,用戶在其中可以選擇一個有效的文本文件;
?SaveDialog控件的作用是為用戶存儲文件提供存儲的路徑和文件名;
?Memo控件的作用是為用戶在程序運行過程中進行文本編輯提供一個容器。
在下拉式主菜單中隻包括三個主菜單項“File”、“Edit”和“Style”,在各個主菜單項的下麵又包括有幾個子菜單項,菜單的結構如表3-1所示。
表3-1 菜單項的結構表
主菜單項 子菜單項
文件 新文件
打開文件
保存
退出
編輯 減切
拷貝
粘貼
刪除
全選
格式 左對齊
中對齊
右對齊
黑體
斜體
下劃線
有關菜單設計的屬性設置如下:
object File1: TMenuItem
Caption = '文件'
object New1: TMenuItem
Caption = '新文件'
end
object Open1: TMenuItem
Caption = '打開文件'
Checked = True
OnClick = Open1Click
end
object N1: TMenuItem
Caption = '-'
end
object Save1: TMenuItem
Caption = '保存'
end
object N2: TMenuItem
Caption = '-'
end
object Exit1: TMenuItem
Caption = '退出'
end
end
object Edit1: TMenuItem
Caption = '編輯'
object Cut1: TMenuItem
Caption = '減切'
end
object Copy1: TMenuItem
Caption = '拷貝'
end
object Paste1: TMenuItem
Caption = '粘貼'
end
object Delete1: TMenuItem
Caption = '刪除'
end
object Selectall1: TMenuItem
Caption = '全選'
end
end
object Style1: TMenuItem
Caption = '格式'
object Bold1: TMenuItem
Caption = '黑體'
end
object Italic1: TMenuItem
Caption = '斜體'
end
object Underline1: TMenuItem
Caption = '下劃線'
end
object N3: TMenuItem
Caption = '-'
end
object Left1: TMenuItem
Caption = '左對齊'
end
object Center1: TMenuItem
Caption = '中對齊'
end
object Right1: TMenuItem
Caption = '右對齊'
end
end
經過以上的屬性設置後的下拉式主菜單如圖3-15所示。
圖3-15 設計完成的下拉式主菜單
2.程序的初始化
程序的初始化過程,實際上就是對窗體FormCreate()事件的初始化,在程序設計階段,用鼠標的左鍵雙擊窗體上的空白處,在屏幕上就會彈出一個代碼窗口,把光標移動到FormCreate()事件的過程處理代碼中,並且添加如下所示代碼:
procedure TForm1.FormCreate(Sender: TObject);