第三章菜單程序的開發和設計(3 / 3)

在通常情況下,一個大的應用程序都有一個主菜單係統,但是在程序的內部為了方便用戶的使用,通常還需要給出彈出菜單。與主菜單的激活方式不同,彈出菜單的激活方式為單擊鼠標右鍵,一個典型的彈出式菜單如圖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係統提供的菜單和對話框設置自己的應用程序。

當然也可以自己定義菜單和對話框,這一點希望在不斷的開發實踐中自己加以體會。