一個(gè)簡(jiǎn)單的MDI示范程序(Delphi)
Note
在上面的方法中,ExtractFileName函數(shù)是用來從路徑中提取文件名的函數(shù),文件名包含在OpenPictureDialog的FileName屬性中,相關(guān)的函數(shù)包括ExtractFilePath、ExtractFileDir、ExtractFileDrive和ExtractFileExt。
Note
前面我們說過所有動(dòng)態(tài)創(chuàng)建的對(duì)象到最后都要用Free刪除掉,但是上面的代碼中好像違反了這個(gè)規(guī)律,實(shí)際上并沒有,因?yàn)閂CL將負(fù)責(zé)釋放分配給MDI子窗口的內(nèi)存。注意TChild構(gòu)造程序中的單個(gè)參數(shù)是Self;這是通知VCL,MDI子窗體的擁有者就是此MDI窗體窗口。當(dāng)MDI窗體消失時(shí),它將刪除所有MDI子對(duì)象。
3、按下F12鍵,切換到主窗體MainForm,現(xiàn)在從菜單中選擇【File | Save As…】,將會(huì)顯示該菜單項(xiàng)處理事件。
4、鍵入以下代碼:
procedure TMainForm.SaveAs1Click(Sender: TObject); begin if SavePictureDialog.Execute then begin with ActiveMDIChild as TChild do { 檢查MDI子窗體是否被激活,只保存激活窗體的圖像文件} Image.Picture.SaveToFile(SavePictureDialog.FileName); end; end;
這段代碼比較簡(jiǎn)潔,頭兩行是用來檢查MDI子窗口是否被激活,如果是激活的窗體,就會(huì)顯示“Save a Picture”對(duì)話框,若用戶點(diǎn)擊OK,那就將用TPicture類的SaveToFile方法把圖像存到盤上去。
Note
前面的這段代碼中用到了as操作符,ActiveMDIChild屬性返回一個(gè)指向TForm對(duì)象的指針,在這種情況下,實(shí)際上只需要一個(gè)指向TChild對(duì)象的指針(MDI子類是從TForm類派生來的),as操作符把ActiveMDIChild變量強(qiáng)制轉(zhuǎn)化為一個(gè)TChild指針,如果as不能完成這種強(qiáng)制轉(zhuǎn)化,as后面的語句將被忽略。
在繼續(xù)講解前,我們先把這個(gè)工程保存起來,將Unit1保存為PctViewU.pas,將工程文件dpr保存為PictView。
三、為【W(wǎng)indows】菜單編寫代碼
1、F12切換到MainForm窗體上,從窗體上MainMenu菜單上選擇【W(wǎng)indows | Tile】;
2、只需要為此事件處理程序中輸入一行代碼即可,最終的事件處理代碼如下:
procedure TMainForm.ile1Click(Sender: TObject); begin Tile; end;
3、切換到MainForm窗體,并為菜單【W(wǎng)indows | Cascade】創(chuàng)建代碼,如下:
procedure TMainForm.Cascade1Click(Sender: TObject); begin Cascade; end;
4、切換到MainForm窗體,再次為菜單【W(wǎng)indows | Arrange All】創(chuàng)建代碼如下:
procedure TMainForm.ArrangeAll1Click(Sender: TObject); begin ArrangeIcons; end;
好,主窗體工作完成了,下面將進(jìn)行創(chuàng)建MDI子窗體。
四、創(chuàng)建MDI子窗體
MDI子窗體非常簡(jiǎn)單,實(shí)際上不必寫任何代碼,只要操作下列各步即可:
1、用工具欄上的New Form按鈕或者通過主菜單上的【File | New Form】來創(chuàng)建一個(gè)新窗體;
2、把它的Name屬性設(shè)置為Child,Caption屬性將被忽略,因?yàn)樵谶\(yùn)行階段將要?jiǎng)討B(tài)設(shè)置此屬性;
3、把FormStyle屬性設(shè)置為fsMDIChild,為了把這個(gè)窗體當(dāng)做MDI子窗體來處理,這是必須的。
為窗體本身要做的就這些,下面就在此窗體上放置一個(gè)Image組件,Image組件將顯示用戶選擇的圖形文件。
1、點(diǎn)擊組件選項(xiàng)板上的Additional標(biāo)簽,點(diǎn)擊Image按鈕,并把它放置到Child窗體上;
2、把它的Name屬性設(shè)置為Image;
3、把它的Stretch屬性設(shè)置為True;
4、把它的Align屬性設(shè)置為alClient,Image組件將縮放到窗體的客戶區(qū)大;
5、選擇Delphi主菜單的【File | Save】,以MDIChild保存此窗體單元。
6、切換到Code Editor,點(diǎn)擊PctViewU標(biāo)簽,然后從Delphi主菜單選擇【File | Use Unit】,選擇MDIChild單元,點(diǎn)擊OK,這樣該工程就可以編譯了。
此時(shí),整個(gè)MDI子窗體看上去如下:
我們的程序還沒有完成,因?yàn)檫差一個(gè)About框,此時(shí)我們更渴望看到程序的運(yùn)行,先點(diǎn)擊Run按鈕,就可以運(yùn)行程序了,選擇【File | Open…】就可以打開任何圖形文件了。
注意MDI子窗口會(huì)自動(dòng)縮放它所包含的圖形,打開幾個(gè)文件,然后試一試Window菜單的Cascade和Tile選項(xiàng)。
五、建立About對(duì)話框