?? 017.htm
字號:
face="宋體" lang="ZH-CN">三項。</font>File<font face="宋體" lang="ZH-CN">菜單項在子窗口生成時被子窗口同名菜單項所取代。設(shè)置</font>Windows<font
face="宋體" lang="ZH-CN">、</font>Help<font face="宋體" lang="ZH-CN">的</font>GroupIndex
= 9<font face="宋體" lang="ZH-CN">,可以使子窗口生成時這兩個菜單項仍存在。</p>
<p> 子窗口界面包括主菜單、目錄樹</font>(DirectoryOutline)<font
face="宋體" lang="ZH-CN">、文件列表框、</font> <font face="宋體" lang="ZH-CN">用于顯示驅(qū)動器的標簽集</font>(TabSet)<font
face="宋體" lang="ZH-CN">以及三個用于顯示驅(qū)動器類型的</font>TImage<font
face="宋體" lang="ZH-CN">部件。 </p>
<p> 表</font>6.9 <font face="宋體" lang="ZH-CN">子窗口界面設(shè)計</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>部件 屬性 功能</p>
<p>───────────────────────────────────────</font></p>
<p>FMForm ActiveControl=DirectoryOutline <font face="宋體" lang="ZH-CN">子窗口</p>
</font><p>Position=poDefault</p>
<p>Style=fsMDIChild</p>
<p>MainMenu1 <font face="宋體" lang="ZH-CN">主菜單</font></p>
<p>DriveTabSet Align=alTop <font face="宋體" lang="ZH-CN">顯示驅(qū)動器</p>
</font><p>style=tsOwnerDraw</p>
<p>DirectoryOutline Align=alLeft <font face="宋體" lang="ZH-CN">顯示當前驅(qū)動器的目錄樹</p>
</font><p>options=[ooDrawTreeRoot,</p>
<p>ooDrawFocusRect,ooStretchBitmaps]</p>
<p>FileList Align=alClient <font face="宋體" lang="ZH-CN">顯示當前目錄中的文件</p>
</font><p>FileType=[ftReadOnly,</p>
<p>ftHidden,ftSystem,ftArchive,ftNormal]</p>
<p>ShowGlyphs=True</p>
<p>Network(Image) Picture(Network.bmp) <font face="宋體" lang="ZH-CN">標志網(wǎng)絡(luò)驅(qū)動器</p>
</font><p>Vsible=False</p>
<p>Floppy(Image) Picture(Floppy.bmp) <font face="宋體" lang="ZH-CN">標志軟驅(qū)</p>
</font><p>Visible=False</p>
<p>Fixed(Image) Picture(Fixed.bmp) <font face="宋體" lang="ZH-CN">標志硬驅(qū)</p>
</font><p>Visible=False</p>
<font face="宋體" lang="ZH-CN"><p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</font></p>
<p> </p>
<font face="宋體" lang="ZH-CN"><p>子窗口主菜單包括</font>File<font face="宋體"
lang="ZH-CN">、</font>Function<font face="宋體" lang="ZH-CN">、</font>Directory<font
face="宋體" lang="ZH-CN">三個菜單項,</font> <font face="宋體" lang="ZH-CN">分別用于完成文件的基本管理功能、其它管理功能和目錄管理功能。</p>
<p> 由于對話框界面設(shè)計很簡單,這里不再進行贅述。</font> <font
face="宋體" lang="ZH-CN">讀者可直接參考后面將給出的對話框界面圖</font>(<font
face="宋體" lang="ZH-CN">圖</font>6.8---6.13)<font face="宋體" lang="ZH-CN">進行設(shè)計。</p>
<p> </font></p>
<p>6.4.2 <font face="宋體" lang="ZH-CN">子窗口的創(chuàng)建、布置和關(guān)閉</p>
<p> </p>
<p> 子窗口的創(chuàng)建、布置由父窗口的</font>Windows<font face="宋體"
lang="ZH-CN">菜單控制,其菜單項如下:</p>
<p> ●</font> New Windows : <font face="宋體" lang="ZH-CN">創(chuàng)建新的子窗口</font></p>
<p><font face="宋體" lang="ZH-CN">●</font> Tile : <font face="宋體" lang="ZH-CN">平鋪</p>
<p> ●</font> Cascade : <font face="宋體" lang="ZH-CN">層疊</p>
<p> ●</font> ArrangeIcon : <font face="宋體" lang="ZH-CN">排列圖標</p>
<p> </font> <font face="宋體" lang="ZH-CN">●</font> Minimized All : <font
face="宋體" lang="ZH-CN">極小化所有子窗口</p>
<p> </p>
<p> 子窗口的創(chuàng)建只需要簡單調(diào)用窗體的</font>Create<font face="宋體"
lang="ZH-CN">方法:</p>
<p> </p>
<p> </font>FileMan := TFMForm.Create(Application);</p>
<p> </p>
<p><font face="宋體" lang="ZH-CN">子窗口的標準排列方式直接調(diào)用</font>MDI<font
face="宋體" lang="ZH-CN">窗口的標準方法</font>Tile<font face="宋體"
lang="ZH-CN">、</font>Cascade<font face="宋體" lang="ZH-CN">和</font>ArrangeIcons<font
face="宋體" lang="ZH-CN">。</p>
<p> 極小化所有子窗口的實現(xiàn)利用</font>MDI<font face="宋體" lang="ZH-CN">窗口的兩個屬性:</font>MDIChildCount<font
face="宋體" lang="ZH-CN">和</font>MDIChildren<font face="宋體" lang="ZH-CN">:</p>
<p> </p>
<p> </font>for i := 0 to MDICount - 1 do</p>
<p>MDIChildren[i].Windowstate := wsMinimized;</p>
<p> </p>
<p> </p>
<font face="宋體" lang="ZH-CN"><p> 子窗口關(guān)閉時釋放內(nèi)存空間,為此在子窗口</font>TFMForm<font
face="宋體" lang="ZH-CN">的</font>OnClose<font face="宋體" lang="ZH-CN">事件中令</p>
<p> </p>
</font><p>Action := OnFree<font face="宋體" lang="ZH-CN">;</p>
<p> </p>
<p> 為了保持和</font>Windows<font face="宋體" lang="ZH-CN">的</font>File
Manager<font face="宋體" lang="ZH-CN">的一致性,我們也禁止關(guān)閉最后一個子窗口,這需要在子窗口的</font>OnCloseQuery<font
face="宋體" lang="ZH-CN">事件處理過程中實現(xiàn):</p>
<p> </font></p>
<p>If FileManager.MDIChildCount <= 1 then</p>
<p>CanClose := False;</p>
<p> </p>
<p>CanClose<font face="宋體" lang="ZH-CN">是</font>OnCloseQuery<font face="宋體"
lang="ZH-CN">事件過程返回的一個參數(shù),用于判定窗口是否可以關(guān)閉。</p>
<p> 由于這一過程歸子窗口所有,因而</font>MDIChildCount<font
face="宋體" lang="ZH-CN">前必須加上其對象名</font>FileManager<font
face="宋體" lang="ZH-CN">。</p>
<p> 但不幸的是:這樣一來我們的程序無法終止了!原來</font>MDI<font
face="宋體" lang="ZH-CN">窗口關(guān)閉前首先關(guān)閉其所有的子窗口。如果子窗口不能關(guān)閉,</font>MDI<font
face="宋體" lang="ZH-CN">窗口也不能關(guān)閉。</font></p>
<p><font face="宋體" lang="ZH-CN">為此我們需要判斷發(fā)出關(guān)閉消息的是子窗口的系統(tǒng)菜單還是菜單的</font>Exit<font
face="宋體" lang="ZH-CN">項。</p>
<p> 定義一個全局變量</p>
<p> </p>
<p> </font>var</p>
<p>ExitClick: Boolean;</p>
<p> </p>
<p><font face="宋體" lang="ZH-CN">在子窗口的</font>Exit1Click<font face="宋體"
lang="ZH-CN">事件處理過程中:</p>
<p> </font></p>
<p>ExitClick := True;</p>
<p>FileManager.Exit1Click(Sender);</p>
<p> </p>
<p> </p>
<font face="宋體" lang="ZH-CN"><p> 子窗口關(guān)閉前可以利用這一全局變量檢測是否應(yīng)關(guān)閉:</p>
<p> </p>
<p> </font>If (FileManager.MDIChildCount <= 1) and (Not ExitClick) then</p>
<p>CanClose := False;</p>
<p> </p>
<p>6.4.3 <font face="宋體" lang="ZH-CN">文件控件的聯(lián)系</p>
<p> </p>
<p> 在本例中我們使用了一組新的控件:</font>TabSet<font face="宋體"
lang="ZH-CN">、</font>DirectoryOutline<font face="宋體" lang="ZH-CN">、</font>FileListBox<font
face="宋體" lang="ZH-CN">,用于顯示和選擇驅(qū)動器、目錄和文件。與</font>(6.3)<font
face="宋體" lang="ZH-CN">中所用方法相比,使用這一組控件需要少量的代碼支持。</p>
<p> </font>TabSet<font face="宋體" lang="ZH-CN">與</font>DirectoryOutline<font
face="宋體" lang="ZH-CN">的聯(lián)系在</font>TabSet<font face="宋體" lang="ZH-CN">的</font>Click<font
face="宋體" lang="ZH-CN">事件處理過程中建立:</p>
<p> </p>
<p> </font>With DriveTabSet do</p>
<p>DirectoryOutline.Drive := Tabs[TabIndex][1];</p>
<p> </p>
<p>DirectoryOutline<font face="宋體" lang="ZH-CN">與</font>FileListBox<font
face="宋體" lang="ZH-CN">的聯(lián)系在</font>DirectoryOutline<font face="宋體"
lang="ZH-CN">的</font>Change<font face="宋體" lang="ZH-CN">事件處理過程中建立:</p>
<p> </font></p>
<p>FileList.Directory := DirectoryOutline.Directory;</p>
<p>FileList.Update;</p>
<p> </p>
<p>6.4.4 DriveTabSet<font face="宋體" lang="ZH-CN">的自畫風格顯示 </p>
<p> </font>Dephi<font face="宋體" lang="ZH-CN">為一些控件提供了自畫風格的顯示,如</font>ListBox<font
face="宋體" lang="ZH-CN">、</font>ComboBox<font face="宋體" lang="ZH-CN">、</font>TabSet<font
face="宋體" lang="ZH-CN">等。</font> <font face="宋體" lang="ZH-CN">在缺省情況下,這些控件自動顯示文本。而在自畫風格下,擁有控件的窗體在運行時間內(nèi)自己畫出控件的每一項目。</font></p>
<p><font face="宋體" lang="ZH-CN">自畫風格顯示通常的應(yīng)用是為項目除文本外再添加圖形顯示。能以自畫風格顯示的控件有一個共同特點:都擁有一個</font>TStrings<font
face="宋體" lang="ZH-CN">類型的項目鏈。由于</font>TStrings<font face="宋體"
lang="ZH-CN">類的特點</font>(<font face="宋體" lang="ZH-CN">參第三章</font>)<font
face="宋體" lang="ZH-CN">,它們都可以加入一個和對應(yīng)文本相聯(lián)系的對象。</font>
<font face="宋體" lang="ZH-CN">而這正是自畫風格顯示的關(guān)鍵。</p>
<p> 通常情況下產(chǎn)生一個自畫風格需要三個步驟:</p>
<p> </font>1.<font face="宋體" lang="ZH-CN">設(shè)置自畫風格;</p>
<p> </font>2.<font face="宋體" lang="ZH-CN">向字符串鏈表添加圖形對象;</p>
<p> </font>3.<font face="宋體" lang="ZH-CN">畫出自畫項目?!?lt;/p>
</font><p>6.4.4.1 <font face="宋體" lang="ZH-CN">設(shè)置自畫風格 </p>
<p> 控件屬性</font>Style <font face="宋體" lang="ZH-CN">用于設(shè)置自畫風格。對于</font>DriveTabSet<font
face="宋體" lang="ZH-CN">,我們把</font>Style <font face="宋體" lang="ZH-CN">屬性設(shè)置為</font>tsOwnerDraw<font
face="宋體" lang="ZH-CN">。</p>
<p> 對于</font>ListBox<font face="宋體" lang="ZH-CN">、</font>ComboBox<font
face="宋體" lang="ZH-CN">等控件的設(shè)置與</font>TabSet<font face="宋體"
lang="ZH-CN">略有差異,讀者可參閱聯(lián)機幫助文檔?!?lt;/p>
</font><p>6.4.4.2 <font face="宋體" lang="ZH-CN">向字符串鏈表添加圖形對象 </p>
<p> </font>1.<font face="宋體" lang="ZH-CN">在應(yīng)用程序中添加圖片部件</p>
<p> 在本程序中我們設(shè)置了三個圖片部件</font>NetWork<font face="宋體"
lang="ZH-CN">、</font>Floppy<font face="宋體" lang="ZH-CN">、</font>Fixed<font
face="宋體" lang="ZH-CN">,并分別與三個位圖文件</font>NetWork.bmp<font
face="宋體" lang="ZH-CN">、</font>Floppy.bmp<font face="宋體" lang="ZH-CN">、</font>Fixed.bmp<font
face="宋體" lang="ZH-CN">相關(guān)聯(lián)。</p>
<p> </font>2.<font face="宋體" lang="ZH-CN">把圖片添加到字符串鏈表中</p>
<p> 根據(jù)字符串鏈表的性質(zhì),我們可以把對象與已存在的字符串建立聯(lián)系,也可以同時添加字符串和對象。這里我們采用后一種方法。</p>
<p> 在子窗口的</font>OnCreate<font face="宋體" lang="ZH-CN">事件處理過程中,我們利用一個循環(huán)依次檢測從</font>a<font
face="宋體" lang="ZH-CN">到</font>z<font face="宋體" lang="ZH-CN">的驅(qū)動器是否存在以及驅(qū)動器的類型。這利用了</font>Windwos
API<font face="宋體" lang="ZH-CN">函數(shù)</font>GetDrivetype, <font face="宋體"
lang="ZH-CN">如果驅(qū)動器不存在則返回</font>0<font face="宋體" lang="ZH-CN">,否則返回驅(qū)動器的類型</font>(DRIVE_REMOVABLE<font
face="宋體" lang="ZH-CN">、</font>DRIVE_FIXED<font face="宋體" lang="ZH-CN">、</font>DRIVE_REMOTE)<font
face="宋體" lang="ZH-CN">。根據(jù)驅(qū)動器類型我們可以判斷與文本</font>(<font
face="宋體" lang="ZH-CN">驅(qū)動器名</font>)<font face="宋體" lang="ZH-CN">同時添加到</font>Tabs<font
face="宋體" lang="ZH-CN">中的不同圖形對象。在添加過程中,</font>DriveTabSet<font
face="宋體" lang="ZH-CN">的</font>TabIndex<font face="宋體" lang="ZH-CN">被設(shè)置為當前驅(qū)動器。</font></p>
<p><font face="宋體" lang="ZH-CN">程序清單如下: </p>
</font><p>procedure TFMForm.FormCreate(Sender: TObject);</p>
<p>var</p>
<p>Drive, AddedIndex: Integer;</p>
<p>DriveLetter: Char;</p>
<p>begin</p>
<p>for Drive := 0 to 25 do</p>
<p>begin</p>
<p>DriveLetter := Chr(Drive + ord('a'));</p>
<p>case GetDrivetype(Drive) of</p>
<p>DRIVE_REMOVABLE:</p>
<p>AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Floppy.Picture.Graphic);</p>
<p>DRIVE_FIXED:</p>
<p>AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Fixed.Picture.Graphic);</p>
<p>DRIVE_REMOTE:</p>
<p>AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Network.Picture.Graphic);</p>
<p>end;</p>
<p>if UpCase(DriveLetter) = UpCase(FileList.Drive) then</p>
<p>DriveTabSet.TAbIndex := AddedIndex;</p>
<p>end;</p>
<p>end;</p>
<p>6.4.4.3 <font face="宋體" lang="ZH-CN">畫出自畫項目 </p>
<p> 當把一個控件的風格設(shè)置為自畫時,</font>Windows<font face="宋體"
lang="ZH-CN">不再負責往屏幕上畫出控件的項目,而是為每個可見項目產(chǎn)生自畫事件。應(yīng)用程序可以通過處理自畫事件畫出控件的項目。 </p>
</font><p>1.<font face="宋體" lang="ZH-CN">確定自畫項目的大小 </p>
<p> 對于</font>TabSet<font face="宋體" lang="ZH-CN">而言,這在</font>OnMeasureTab<font
face="宋體" lang="ZH-CN">事件處理過程中完成。我們需要把</font>DriveTabSet<font
face="宋體" lang="ZH-CN">每個標簽的寬度增大到足以同時放下文本和位圖。 </p>
</font><p>procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer;</p>
<p>var TabWidth: Integer);</p>
<p>var</p>
<p>BitmapWidth: Integer;</p>
<p>begin</p>
<p>BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;</p>
<p>Inc(TabWidth, 2 + BitmapWidth);</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> 由于</font>TStrings<font face="宋體"
lang="ZH-CN">的</font>Objects<font face="宋體" lang="ZH-CN">屬性中存放的對象都是</font>TObject<font
face="宋體" lang="ZH-CN">類型,并沒有</font>Width<font face="宋體" lang="ZH-CN">屬性,因而需要再把它轉(zhuǎn)化為</font>TBitmap<font
face="宋體" lang="ZH-CN">類型的對象: </p>
<p> </font> BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;</p>
<p align="center"><font face="宋體" lang="ZH-CN"> </font></p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="018.htm"><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="016.htm"><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -