在通常情況下,一個大的應用程序都有一個主菜單係統,但是在程序的內部為了方便用戶的使用,通常還需要給出彈出菜單。與主菜單的激活方式不同,彈出菜單的激活方式為單擊鼠標右鍵,一個典型的彈出式菜單如圖3-20所示。
圖3-20 彈出式菜單
與下拉式主菜單的設計類似,“彈出式菜單設計器”的位置也位於Delphi控件工具欄Standart選項。,
通過下麵所示的兩種方法都可以向窗體上添加“彈出式菜單設計器”,它們的效果是相同的:
?在控件工具欄上單擊鼠標的左鍵,然後把鼠標移動到空白的窗體上,按下的同時移動鼠標,在窗體上就會繪製出一個“彈出式菜單設計器”;
?在控件工具欄上用鼠標的左鍵雙擊“彈出式菜單設計器”的圖標,係統就會自動的在空白的窗體上放置一個“彈出式菜單設計器”,但是這樣做通常用戶手動的調節控件的位置。
如圖3-21所示即為放置了一個“彈出式菜單設計器“的窗體。
圖3-21 放置了“彈出式菜單PopMenu”的窗體
雖然在窗體上放置了“彈出式菜單設計器”,但是隻有激活了“彈出式菜單設計器”才能夠對彈出式菜單進行設計等操作,激活“彈出式菜單設計器”的方法也有兩種:
?用鼠標的左鍵在“彈出式菜單設計器”上雙擊,在屏幕上就會彈出一個空白的彈出式菜單設計窗口;
?在控件的屬性列表中用鼠標的左鍵單擊Items屬性右側屬性輸入框中的按鈕也可以打開彈出式菜單設計器。
由於彈出式菜單的設計過程與下拉式菜單的設計過程基本相同,所以在這裏對具體的設計過程就不多加贅述了。下麵就以一個示例程序來說明彈出式菜單的完部設計和操作過程。
3.3.1 項目和設置
首先啟動一個新的項目,選擇菜單“File”中的“New Application”項,在Delphi的集成開發環境中就會彈出一個新建的窗體,在控件工具欄上選擇“Standard”選項後,在“彈出式菜單設計器”的圖標上雙擊鼠標的左鍵,這時空白的窗體上就會出現一個彈出式菜單設計器。
用鼠標的左鍵在“彈出式菜單設計器”上雙擊,在屏幕上就會彈出一個空白的彈出式菜單設計窗口,在其中如下設置彈出式菜單:
object PopupMenu1: TPopupMenu
Left = 184
Top = 24
object Cut1: TMenuItem
Caption = 'Cut'
end
object Copy1: TMenuItem
Caption = 'Copy'
end
object Paste1: TMenuItem
Caption = 'Paste'
end
object Delete1: TMenuItem
Caption = 'Delete'
end
object SelectAll1: TMenuItem
Caption = 'Select All'
end
end
設計完成的彈出式菜單如圖3-22所示。
圖3-22 設計完成的彈出式菜單
經過以上屬性設置後的彈出式菜單,在程序運行的過程中,單擊鼠標的右鍵就會激活它,並且在其中包含有四個子菜單項——Cut、Copy、Paste、Delete和Select All。
3.3.2 彈出菜單的設計
1.結合主菜單應用
為了能夠實現文本處理功能,需要向窗體上添加一個Memo控件。
然後,為了將彈出菜單和下拉菜單結合使用,我們再向窗體上添加一個主菜單Style1(MainMenu)。其中主菜單上包括四個菜單項:全拚輸入法(N1)、微軟拚音輸入法(N2)、鄭碼輸入法(N3)和英文輸入法(N4),設計如圖3-23所示。
各個控件所能夠實現的功能如下所示:
?Memo控件:為文本處理提供一個容器;
?N1控件:設置文本框中輸入文本的方式為“全拚輸入法”;
?N2控件:設置文本框中輸入文本的方式為“微軟拚音輸入法”;
?N3控件:設置文本框中輸入文本的方式為“鄭碼輸入法”;
?N4控件:設置文本框中輸入文本的方式為“英文輸入法”;
圖3-23 主菜單係統
添加控件後的主窗體如圖3-24所示。
圖3-24 添加控件後的窗體
窗體中Memo控件和主菜單項的屬性設置如下所示:
object Form1: TForm1
Left = 192
Top = 107
Width = 441
Height = 354
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu1
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Memo1: TMemo
Left = 8
Top = 8
Width = 417
Height = 289
Lines.Strings = ('Memo1')
TabOrder = 0
end
object PopupMenu1: TPopupMenu
Left = 144
Top = 48
object Cut1: TMenuItem
Caption = 'Cut'
end
object Copy1: TMenuItem
Caption = 'Copy'
end
object Paste1: TMenuItem
Caption = 'Paste'
end
object Delete1: TMenuItem
Caption = 'Delete'
end
object Selectall1: TMenuItem
Caption = 'Select all'
end
end
object MainMenu1: TMainMenu
Left = 232
Top = 72
object Style1: TMenuItem
Caption = '輸入法'
object N1: TMenuItem
Caption = '全拚輸入法'
end
object N2: TMenuItem
Caption = '微軟拚音輸入法'
end
object N3: TMenuItem
Caption = '鄭碼輸入法'
end
object N4: TMenuItem
Caption = '英文輸入法'
end
end
end
end
2.程序的初始化
在程序的設計階段,用鼠標的左鍵雙擊窗體的空白處,在屏幕上就會彈出一個代碼窗口,在缺省的情況下,代碼窗口中顯示的是窗體的FormCreate()事件,將光標移動代碼窗口中,並且添加下列代碼:
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
//清空文本框中的內容
memo1.PopupMenu:=form1.PopupMenu1;
//將彈出式菜單與Memo控件相關聯
end;
窗體的FormCreate()事件在窗體的裝入的同時就會被激活,進入到窗體的FormCreate()事件的過程中,首先通過語句memo1.Clear; 清空文本框中的內容,然後將彈出式菜單與Memo控件相關聯。
3.響應彈出菜單事件
在彈出式菜單中有五個選項,它們所能夠實現的功能如下所示:
?Cut:將當前所選中的數據剪切到剪貼板上;
?Copy:將當前選中的數據複製到剪貼板上;
?Paste:將當前剪貼板上的數據粘貼到當前的位置上;
?Delete:刪除當前選中的數據,在剪貼板上沒有複製的數據;
?Select:選中Memo控件上的所有數據。
在程序的設計過程中,用鼠標的左鍵雙擊如圖3-25所示的彈出式菜單設計器中的各個子菜單項,就會彈出相應的代碼窗口,把光標移動到事件處理的過程中,就可以添加相應的菜單相應代碼。
圖3-25 彈出式菜單設計器
“Cut”子菜單的響應代碼如下所示:
procedure TForm1.Cut1Click(Sender: TObject);
begin
memo1.CutToClipboard;
//將當前選中的數據剪切到剪貼板上
end;
程序說明:
在程序運行的過程中,當用戶用鼠標的左鍵單擊“Cut”子菜單項,就會激活Cut1Click()事件,然後程序通過Memo控件的CutToClipboard方法把當前選中的數據剪切到剪貼板上。
“Copy”子菜單的響應代碼如下所示:
procedure TForm1.Copy1Click(Sender: TObject);
begin
memo1.CopyToClipboard;
//將當前選中數據複製到剪貼板上
end;
程序說明:
在程序運行的過程中,當用戶用鼠標的左鍵單擊“Copy”子菜單項,就會激活Copy1Click()事件,然後程序通過Memo控件的CopyToClipboard方法把當前選中的數據複製到剪貼板上。
“Paste”子菜單的響應代碼如下所示:
procedure TForm1.Paste1Click(Sender: TObject);
begin
memo1.PasteFromClipboard;
//將剪貼板上的數據放置到當前位置上
end;
程序說明:
在程序運行的過程中,當用戶用鼠標的左鍵單擊“Paste”子菜單項,就會激活Paste1Click()事件,然後程序通過Memo控件的PasteFromClipboard方法把當前剪貼板上的數據粘貼到控件的當前位置上。
“Delete”子菜單的響應代碼如下所示:
procedure TForm1.Delete1Click(Sender: TObject);
begin
memo1.ClearSelection;
//將當前選中的數據清除
end;
程序說明:
在程序運行的過程中,當用戶用鼠標的左鍵單擊“Delete”子菜單項,就會激活Delete1Click()事件,然後程序通過Memo控件的ClearSelection方法把當前控件上選中的數據清除。
“SelectAll”子菜單的響應代碼如下所示:
procedure TForm1.SelectAll1Click(Sender: TObject);
begin
memo1.SelectAll;
//全選控件中的數據
end;
程序說明:
在程序運行的過程中,當用戶用鼠標的左鍵單擊“SelectAll”子菜單項,就會激活SelectAll1Click()事件,然後程序通過Memo控件的SelectAl方法把當前控件上的所有數據都選中。
4.響應主菜單事件
在窗體主菜單的四個菜單項的作用是為Memo控件選擇輸入數據的文字輸入法,即英文輸入法、全拚輸入法、鄭碼輸入法還是微軟拚音輸入法。
注意:
?為Memo控件設置輸入法,從實質上來講,就是設置Memo控件的ImeName屬性的屬性值。
按照同樣的方法,在彈出的按鈕響應代碼窗口中,找到相應的相應代碼,並且在它的事件響應過程中添加如下代碼:
procedure TForm1.N1Click(Sender: TObject);
begin
memo1.ImeName:=N1.Caption;
//設置全拚輸入法
end;
procedure TForm1.N2Click(Sender: TObject);
begin
memo1.ImeName:=N2.Caption;
//設置微軟拚音輸入法
end;
procedure TForm1.N3Click(Sender: TObject);
begin
memo1.ImeName:=N3.Caption;
//設置鄭碼輸入法
end;
procedure TForm1.N4Click(Sender: TObject);
begin
memo1.ImeName:=' ';
//設置英文輸入法
end;
3.3.3 運行結果和參考程序
做完以上各步的工作後,選擇菜單“File”中的“Save All”選項,保存文件,然後按鍵盤上的功能鍵F9運行程序,程序運行結果如圖3-26所示。在程序運行的初始畫麵中,用鼠標的左鍵單擊“輸入法”菜單選擇一項,然後輸入一段文本。
圖3-26 輸入一段文本
在文本輸入框中可以輸入英文和漢字,在程序運行的過程中用戶還可以選擇文本的輸入方法,在文本框上單擊鼠標的右鍵,就會彈出一個彈出式菜單,在其中可以完成剪切、複製等功能,如圖3-27所示。
圖3-27 程序中的彈出式菜單
附源程序代碼如下所示,供讀者參考學習:
程序清單
unit popmenu;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Cut1: TMenuItem;
Copy1: TMenuItem;
Paste1: TMenuItem;
Delete1: TMenuItem;
Selectall1: TMenuItem;
MainMenu1: TMainMenu;
Style1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Cut1Click(Sender: TObject);
procedure Copy1Click(Sender: TObject);
procedure Paste1Click(Sender: TObject);
procedure Delete1Click(Sender: TObject);
procedure Selectall1Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
//清空文本框中的內容
memo1.PopupMenu:=form1.PopupMenu1;
//將彈出式菜單與Memo控件相關聯
end;
procedure TForm1.Cut1Click(Sender: TObject);
begin
memo1.CutToClipboard;
//將當前選中的數據剪切到剪貼板上
end;
procedure TForm1.Copy1Click(Sender: TObject);
begin
memo1.CopyToClipboard;
//將當前選中數據複製到剪貼板上
end;
procedure TForm1.Paste1Click(Sender: TObject);
begin
memo1.PasteFromClipboard;
//將剪貼板上的數據放置到當前位置上
end;
procedure TForm1.Delete1Click(Sender: TObject);
begin
memo1.ClearSelection;
//將當前選中的數據清除
end;
procedure TForm1.Selectall1Click(Sender: TObject);
begin
memo1.SelectAll;
//全選控件中的數據
end;
procedure TForm1.N1Click(Sender: TObject);
begin
memo1.ImeName:=N1.Caption;
//設置全拚輸入法
end;
procedure TForm1.N2Click(Sender: TObject);
begin
memo1.ImeName:=N2.Caption;
//設置微軟拚音輸入法
end;
procedure TForm1.N3Click(Sender: TObject);
begin
memo1.ImeName:=N3.Caption;
//設置鄭碼輸入法
end;
procedure TForm1.N4Click(Sender: TObject);
begin
memo1.ImeName:='';
//設置英文輸入法
end;
end.
3.4 小 結
在本章中,作者係統的介紹了程序運行過程中,人機交互的另一種常用的手段——菜單的程序設計方法。結合前一章中所講解的內容,讀者在程序開發實踐中,可以利用Delphi係統提供的菜單和對話框設置自己的應用程序。
當然也可以自己定義菜單和對話框,這一點希望在不斷的開發實踐中自己加以體會。