免费体验120秒视频_榴莲榴莲榴莲榴莲官网_2021国产麻豆剧果冻传媒入口_一二三四视频社区在线
當前位置: 首頁編程開發Delphi → 一個簡單的MDI示范程序(Delphi)

一個簡單的MDI示范程序(Delphi)

更多

最為一個鞏固之前有關窗體和對象的有關知識,下面就建立一個簡單的MDI示范程序,這個程序的功能是打開和保存圖形文件(包括位圖、圖標等),為了完成這個任務,我們有一個大概的計劃,計劃內容如下:

(1)建立主窗體(一個MDI父窗體),包括菜單。

(2)為【File | Open…】 和【File | Save…】菜單選項編寫代碼。

(3)為Windows菜單上的Cascade、Tile和Arrange All選項編寫代碼。

(4)建立MDI子窗體。

(5)建立一個About對話框。

(6)然后再回憶和欣賞一下這段工作。

時間就是金錢,即刻就做吧 。

一、創建主窗口窗體

首先創建一個主窗口窗體,一個MDI應用程序的主窗口的FormStyle屬性必須設置為fsMDIForm。不但要為應用程序增加File Open和 File Save 對話框,還要增加一個菜單。

1、啟動Delphi,并從主菜單選擇【File | New | Application】;

2、把主窗體的Name屬性設置為MainForm;

image

3、把Caption屬性設置為Picture Viewer

image

4、把FormStyle屬性設置為fsMDIForm

image

 

好了,下面為此窗體增加一個菜單,利用Delphi特性,引進一個預定義菜單,具體如下:

1、點擊組件選項板的Standard標簽,并點擊MainMenu按鈕;

image

2、把MainMenu組件點擊放置到窗體上,具體放到哪個地方無所謂了,因為在運行階段,代表菜單的圖標只是占地方而不顯示,這是非可視化組件。

image

3、把MainMenu組件Name屬性改為MainMenu;

image

4、雙擊MainMenu組件,就會出現Menu Designer對話框;

0090

5、在MainMenu上點擊鼠標右鍵,選擇“Insert From Template…”,將出現Insert Template對話框;

0091

6、選擇“MDI Frame Menu”并點擊OK,此菜單將顯示在Menu Designer上,關閉Menu Designer窗口。

 

現在又回到了主窗體,注意現在窗體上多了一條菜單,此時先不要點擊任何子菜單項,我們先準備File Open對話框和File Save對話框:

1、點擊組件選項板的Dialogs標簽,選擇Open Picture Dialog組件,并把它放到窗體上,這也是一個非可視組件。

image

2、把Open對話框的Name屬性改為OpenPictureDialog

image

3、把Open對話框的Title屬性改為“Open a Picture for Viewing”;

image

4、在窗體再增加一個Save Picture Dialog組件;

image

5、把此組件的Name屬性改為“SavePictureDialog”,把Title屬性改為“Save a Picture”;

image

image

此時窗體看起來應該像下圖:

 0092

 

二、編寫【File | Open…】和【File | Save As…】菜單選項代碼

下面就準備開始編寫代碼,Delphi提供了一種很好地編寫菜單處理程序的方法,從而使遇到的麻煩最小。還不要建立MDI子窗體,但要充分了解它,并用它來為菜單處理程序編寫代碼,記住在建立MDI子窗體之前一直不要編譯應用程序(因為還沒有建立MDI子窗體,編譯會出現錯誤的)

1、在主窗體上選擇【File | Open…】菜單項,這樣就會在Code Editor中為此菜單項建立一個事件處理程序。

2、為此事件處理程序鍵入下列代碼:

procedure TMainForm.Open1Click(Sender: TObject); var   Child: TChild; begin   if OpenPictureDialog.Execute then   begin     Child := TChild.Create(Self);     with Child.Image.Picture do     begin       LoadFromFile(OpenPictureDialog.FileName);       Child.ClientWidth := Width;       Child.ClientHeight := Height;     end;     Child.Caption := ExtractFileName(OpenPictureDialog.FileName);     Child.Show;   end; end;

這段代碼首先打開一個“Open a Picture for Viewing”對話框,并得到一個文件名,如果點擊這個對話框的OK按鈕,就會產生一個TChild對象(TChild是MDI子類的名字,后面將要建立它。)圖像文件被顯示到窗體上的Image組件,并且MDI子窗口將會與圖像大小相匹配,最后子窗體的標題會顯示被選中的圖像文件名。

Note

在上面的方法中,ExtractFileName函數是用來從路徑中提取文件名的函數,文件名包含在OpenPictureDialog的FileName屬性中,相關的函數包括ExtractFilePath、ExtractFileDir、ExtractFileDrive和ExtractFileExt。

Note

前面我們說過所有動態創建的對象到最后都要用Free刪除掉,但是上面的代碼中好像違反了這個規律,實際上并沒有,因為VCL將負責釋放分配給MDI子窗口的內存。注意TChild構造程序中的單個參數是Self;這是通知VCL,MDI子窗體的擁有者就是此MDI窗體窗口。當MDI窗體消失時,它將刪除所有MDI子對象。

3、按下F12鍵,切換到主窗體MainForm,現在從菜單中選擇【File | Save As…】,將會顯示該菜單項處理事件。

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;

這段代碼比較簡潔,頭兩行是用來檢查MDI子窗口是否被激活,如果是激活的窗體,就會顯示“Save a Picture”對話框,若用戶點擊OK,那就將用TPicture類的SaveToFile方法把圖像存到盤上去。

Note

前面的這段代碼中用到了as操作符,ActiveMDIChild屬性返回一個指向TForm對象的指針,在這種情況下,實際上只需要一個指向TChild對象的指針(MDI子類是從TForm類派生來的),as操作符把ActiveMDIChild變量強制轉化為一個TChild指針,如果as不能完成這種強制轉化,as后面的語句將被忽略。

在繼續講解前,我們先把這個工程保存起來,將Unit1保存為PctViewU.pas,將工程文件dpr保存為PictView。

 

三、為【Windows】菜單編寫代碼

1、F12切換到MainForm窗體上,從窗體上MainMenu菜單上選擇【Windows | Tile】;

2、只需要為此事件處理程序中輸入一行代碼即可,最終的事件處理代碼如下:

procedure TMainForm.ile1Click(Sender: TObject); begin   Tile; end;

3、切換到MainForm窗體,并為菜單【Windows | Cascade】創建代碼,如下:

procedure TMainForm.Cascade1Click(Sender: TObject); begin   Cascade; end;

4、切換到MainForm窗體,再次為菜單【Windows | Arrange All】創建代碼如下:

procedure TMainForm.ArrangeAll1Click(Sender: TObject); begin   ArrangeIcons; end;

好,主窗體工作完成了,下面將進行創建MDI子窗體。

 

四、創建MDI子窗體

MDI子窗體非常簡單,實際上不必寫任何代碼,只要操作下列各步即可:

1、用工具欄上的New Form按鈕或者通過主菜單上的【File | New Form】來創建一個新窗體;

2、把它的Name屬性設置為Child,Caption屬性將被忽略,因為在運行階段將要動態設置此屬性;

image

3、把FormStyle屬性設置為fsMDIChild,為了把這個窗體當做MDI子窗體來處理,這是必須的。

image

為窗體本身要做的就這些,下面就在此窗體上放置一個Image組件,Image組件將顯示用戶選擇的圖形文件。

1、點擊組件選項板上的Additional標簽,點擊Image按鈕,并把它放置到Child窗體上;

image

2、把它的Name屬性設置為Image

image

3、把它的Stretch屬性設置為True

image

4、把它的Align屬性設置為alClient,Image組件將縮放到窗體的客戶區大小;

image

5、選擇Delphi主菜單的【File | Save】,以MDIChild保存此窗體單元。

6、切換到Code Editor,點擊PctViewU標簽,然后從Delphi主菜單選擇【File | Use Unit】,選擇MDIChild單元,點擊OK,這樣該工程就可以編譯了。

此時,整個MDI子窗體看上去如下:

0093

我們的程序還沒有完成,因為還差一個About框,此時我們更渴望看到程序的運行,先點擊Run按鈕,就可以運行程序了,選擇【File | Open…】就可以打開任何圖形文件了。

注意MDI子窗口會自動縮放它所包含的圖形,打開幾個文件,然后試一試Window菜單的Cascade和Tile選項。

 

五、建立About對話框

到目前為止,我們自己隨意建立一個屬于自己的About框,我的About對話框效果如下:

image

1、將建立好的About窗體的Name屬性設置為AboutBox,BorderStyle屬性設置為bsDialog

image

image

2、以PVAboutU保存此About對話框窗體單元;

3、切換到Code Editor中的PctViewU標簽,從Delphi主菜單選擇【File | Use Unit】將PVAboutU單元包含近來;

4、按F12切換到MainForm主窗體,從菜單上選擇【Help | About】,這樣就產生一個OnClick處理事件;

5、為此事件添加代碼如下:

procedure TMainForm.About1Click(Sender: TObject); begin   AboutBox.ShowModal; end;

現在運行它,點擊Run按鈕,試一試Help菜單的About選項,運行效果如下:

0094

六、進一步完善程序

此時這個程序已經可以運行了,但它不等于就沒有值得完善的地方。

對于這個程序還有兩個問題需要值得注意,它們容易混淆,首先,當啟動該程序時,會顯示一個空白MDI子窗口,這是因為Delphi應用程序會自動建立所有窗體。我們可以從自動產生的清單中刪除MDI子窗體。

1、從Delphi主菜單中選擇【Project | Options…】,將顯示Project Option對話框;

0095

2、點擊Forms標簽,其中“Auto-create forms”中顯示的就是所有會自動創建產生的窗體清單;

3、點擊其中不想要自動創建的窗體Child,選擇 >按鈕,就會從自動創建列表中刪除該子窗口,并把它放置到“Available forms”列表中。

再次運行此程序,這一次將不顯示空白MDI子窗體。

Caution

如果要從自動產生清單中刪除一個窗體,就必須保證在用它之前要建立一個專門的窗體,如果不建立一個窗體,指向窗體的指針就不能初始化,這就意味著還沒有為此指針賦一個有意義的值(記住指針是由Delphi自動產生)。試圖用這個指針,其結果將會產生一個非法錯誤,當從自動產生清單中刪除一個窗體后,就必須負責在用它之前建立它。

還有一個問題,就是在MDI窗體上點擊關閉按鈕時,發現子窗口并沒有關閉,而是最小化,因此我們要修改它,使得點擊關閉后真正被關閉。

1、在Form Designer中選擇Child子窗體,選中窗體本身,確認在Object Inspector的Component Selector中選擇的是Child。

2、雙擊Events頁的OnClose事件,添加代碼如下:

procedure TChild.FormClose(Sender: TObject; var Action: TCloseAction); begin   Action := caFree; end;

把關閉動作設置為caFree,指示VCL關閉子窗體,并釋放與窗體有關的內存,這時點擊MDI子窗體關閉按鈕就可以正常關閉了。

4、再次運行此程序,證明此程序的表現與前面所述的一樣。

熱門評論
最新評論
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數: 0/500 (您的評論需要經過審核才能顯示)
免费体验120秒视频_榴莲榴莲榴莲榴莲官网_2021国产麻豆剧果冻传媒入口_一二三四视频社区在线
主站蜘蛛池模板: 国产综合久久久久久| 亚洲专区区免费| 麻绳紧缚奴隷女囚| 国产大尺度吃奶无遮无挡| 性之囚禁| 欧美孕妇乱大交xxxx| 免费无码又爽又刺激毛片| 久久综合久久美利坚合众国| 人人妻人人澡av天堂香蕉| 又大又黄又粗又爽的免费视频| 久久精品99无色码中文字幕 | 国产无遮挡又黄又爽在线视频| 精品国产亚洲一区二区三区| 欧美乱妇高清无乱码在线观看| 激情六月在线视频观看| 大香网伊人久久综合网2020| 免费观看四虎精品国产永久| 男生的肌肌桶女生的肌肌| 青青草原亚洲视频| 在线观看的网站| 看Aⅴ免费毛片手机播放| 日本五月天婷久久网站| 欧美日本高清在线不卡区| 人妻内射一区二区在线视频| a级高清毛片| 99精品无人区乱码1区2区3区| 久久人妻无码中文字幕| 在线视频精品一区| 午夜不卡av免费| 99久在线精品99re6视频| 综合色天天| 久久综合九色综合精品| 亚洲精品在线视频| 亚洲精品伊人| 免费人成在线观看网站视频| 韩国三级bd高清中文字幕合集| 好吊妞视频这里有精品| 久久久www成人免费精品| 最近最新中文字幕6页| 国产亚洲美女精品久久久久| 尤物视频193.com|