基本認識:
在Delphi的程序開發環境中,封裝的VCL減化了我們許多的開發工作,由在界面的設計上使開發的進度很快,但在很多的時候,我們需要自己來設計可視化的用戶界面,而且是在程序的運行中,這時我們就得利用Delphi給我們提供的類來完成我們需要的工作了,下面筆者就和朋友們淺入的討論一下動態創建”菜單”的基本知識,希望本文給那些剛入門的朋友來個拋磚引玉的作用。
在delphi的菜單設計中,有兩個Delphi的菜單控件:
1:Tmainmenu;
2:Tpopupmenu;
前者是創建窗口的菜單,後者是創建右鍵彈出式菜單的控件,但在Delphi龐大的類庫中有一個類與這兩個控件密切相關,它就是:TMenuItem,窗口的菜單和右鍵彈出式菜單的每個條目都是TMenuItem類的一個對象。此TMenuItem類不出現在控件板上,在程序中用代碼可創建其實例。
基本知識:
在tmainmenu,tpopupmenu控件中有一個屬性是items,此屬性是數組型,裡面的參數為菜單項的索引值。
文件 編輯 查看 插入 格式 幫助
---- ---- ---- ---- ---- ----
新建 撤消 標尺 對象 字體 關於
打開 拷貝 源碼 公式 顏色
相信您看過上面的菜單簡單表示之後是非常熟悉的,在此菜單中菜單頭的索引值代表如下:
”文件”的菜單的items值為0;
”編輯”的菜單的items值為1;以此類推。
items屬性是tmenuitem類型,而在此類型中還有一個屬性,是items,如果您略懂”類”的關系,您就不難明白此類似”嵌套”的關系。”新建”菜單選項是”文件”菜單選項的子類,用代碼表示為tmainmenu.items[0].items[0],”打開”菜單選項為tmainmenu.items[0].items[1],以此類推,而代表”編輯”菜單中的”拷貝”菜單選項的代碼為tmainmenu.items[1].items[1],其它菜單代碼表示以此類推。
基本實例:
知道了菜單的items結構之後,我們就可以進一步大膽的創建自己有序的菜單了。
上面討論到窗口的菜單和右鍵彈出式菜單的每個條目都是TMenuItem類的一個對象。那麼我們就可以create它的一個實例,來添加自己想要的菜單了。
示例過程:
1:新建一個工程。
2:添加一個tmainmenu控件。
3:添加一個button控件,並在button的onclick事件中寫入如下代碼:
procedure TForm1.Button1Click(Sender: TObject);
var
files,edit:tmenuitem;{要有實例的聲明}
begin
files:=tmenuitem.Create(self);
edit:=tmenuitem.create(self);
files.Caption:=’文件’;
edit.caption:=’編輯’;
mainmenu1.AutoHotkeys:=mamanual;{此句代碼為不讓系統自動設置快捷鍵}
form1.MainMenu1.Items.Add(files);
form1.mainmenu1.items.add(edit);
end;
運行後,出現如上面例舉的菜單的部分結構,如此看來動態創建菜單項的方法是非常簡單的,這無疑於Delphi把系統的函數進行了封裝。菜單頭我們創建完了,接下來就該創建菜單裡的菜單項了,由”items屬性是tmenuitem類型,而在此類型中還有一個屬性,是items”此句話的意思我們可以創建菜單項,代碼如下:
1:新建一個工程。
2:添加一個tmainmenu控件。
3:添加一個button控件,並在button的onclick事件中寫入如下代碼:
procedure TForm1.Button1Click(Sender: TObject);
var
files,edit:tmenuitem;
new,copy:tmenuitem;
begin
files:=tmenuitem.Create(self);
edit:=tmenuitem.create(self);
files.Caption:=’文件’;
edit.caption:=’編輯’;
mainmenu1.AutoHotkeys:=mamanual;{此句代碼為不讓系統自動設置快捷鍵}
form1.MainMenu1.Items.Add(files);
form1.mainmenu1.items.add(edit);
{上部代碼為創建菜單頭}
new:=tmenuitem.create(self);
copy:=tmenuitem.create(self);
new.Caption:=’新建’;
copy.caption:=’拷貝’;
files.Add(new);
edit.add(copy);
{上部代碼為創建菜單項}
end;
運行效果和上面菜單結構表中基本一樣,但此時點擊菜單項時不出現任何的事件,顯然這樣的軟件出售量不算理想,我們可以略改代碼加個事件上去。
代碼如下:
1:新建一個工程。
2:添加一個tmainmenu控件。
3:
private
procedure abc(sender:tobject);
{ Private declarations }
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure tform1.abc(sender:tobject);
begin
showmessage(’welcome you click me!! :) xixi’);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
files,edit:tmenuitem;
new,copy:tmenuitem;
begin
files:=tmenuitem.Create(self);
edit:=tmenuitem.create(self);
files.Caption:=’文件’;
edit.caption:=’編輯’;
mainmenu1.AutoHotkeys:=mamanual;{此句代碼為不讓系統自動設置快捷鍵}
form1.MainMenu1.Items.Add(files);
form1.mainmenu1.items.add(edit);
{上部代碼為創建菜單頭}
new:=tmenuitem.create(self);
copy:=tmenuitem.create(self);
new.Caption:=’新建’;
copy.caption:=’拷貝’;
copy.OnClick:=abc;
new.OnClick:=abc;
files.Add(new);
edit.add(copy);
{上部代碼為創建菜單項}
end;
這時這個軟件就有了交互的功能。
有時菜單項中出現一個橫的條線和出現一個子的菜單,那麼這樣的效果怎麼用代碼實現的呢,下面就是此效果的代碼示例:
1:新建一個工程。
2:添加一個tmainmenu控件。
3:
procedure TForm1.Button1Click(Sender: TObject);
var
files,edit:tmenuitem;
new,copy:tmenuitem;
sub1,sub2,sub3,lines:tmenuitem;
begin
files:=tmenuitem.Create(self);
edit:=tmenuitem.create(self);
files.Caption:=’文件’;
edit.caption:=’編輯’;
mainmenu1.AutoHotkeys:=mamanual;{此句代碼為不讓系統自動設置快捷鍵}
form1.MainMenu1.Items.Add(files);
form1.mainmenu1.items.add(edit);
{上部代碼為創建菜單頭}
new:=tmenuitem.create(self);
copy:=tmenuitem.create(self);
new.Caption:=’新建’;
copy.caption:=’拷貝’;
files.Add(new);
edit.add(copy);
{上部代碼為創建菜單項}
sub1:=tmenuitem.create(self);
sub2:=tmenuitem.create(self);
sub3:=tmenuitem.create(self);
lines:=tmenuitem.create(self);
lines.caption:=’-’;
sub1.caption:=’子菜單1’;
sub2.caption:=’子菜單2’;
sub3.caption:=’子菜單3’;
new.Add(sub1);
new.add(lines);
new.add(sub3);
copy.Add(sub2);
{上面代碼出現多項子菜單和橫線的效果}
end;
到此討論的內容就要結束,菜單的創建在Delphi中是非常簡單的事,在tmenuitem類中還有許多的事件和方法及屬性,如Add,Clear,Click,Create,Delete,Destroy,Find,IndexOf,Insert,Remove等方法的使用都是非常簡單的,