?? 017.htm
字號:
<p> 以上控件前四個在</font>Component Palette(<font face="宋體" lang="ZH-CN">部件選擇板</font>)<font
face="宋體" lang="ZH-CN">的</font>System<font face="宋體" lang="ZH-CN">頁中,</font>DirectoryOutline<font
face="宋體" lang="ZH-CN">在</font>Component Palette<font face="宋體" lang="ZH-CN">的</font>Samples<font
face="宋體" lang="ZH-CN">頁中。</p>
<p> 以上文件控件再加上文件編輯框、目錄標簽框</font>(<font
face="宋體" lang="ZH-CN">事實上是一般的編輯框、標簽框</font>)<font
face="宋體" lang="ZH-CN">就可以構成一個完整的文件操作系統(tǒng)。它們之間的聯(lián)系幾乎不用代碼支持,只要設置好相應的屬性就可以了。</p>
<p> </font> FileEdit<font face="宋體" lang="ZH-CN">、</font>DirLabel<font
face="宋體" lang="ZH-CN">、</font>FileListBox<font face="宋體" lang="ZH-CN">、</font>FileFilterComloList<font
face="宋體" lang="ZH-CN">、</font> DirectoryListBox<font face="宋體" lang="ZH-CN">、</font>DriveComboList<font
face="宋體" lang="ZH-CN">六個控件間的屬性聯(lián)系如下: </p>
<p> </font>DriveComboList .DirList := DirectoryListBox;</p>
<font face="宋體" lang="ZH-CN"><p> </font>DirectoryListBox.DirLabel := DirLabel;</p>
<p>DirectoryListBox.FileList := FileListBox;</p>
<p>FileFilterComboList.FileList := FileListBox;</p>
<p>FileListBox.FileEdit := FileEdit; </p>
<p><font face="宋體" lang="ZH-CN">
以上聯(lián)系可以在設計時完成。只要打開相應屬性的選擇列表框進行選擇即可。也可以在運行時利用如上的賦值語句建立聯(lián)系。</p>
<p> 文件控件的關鍵屬性基本上都在以上聯(lián)系中反映出來了。除此之外,</font>FileFilterComboList<font
face="宋體" lang="ZH-CN">有一個</font>Filter<font face="宋體" lang="ZH-CN">屬性,用來設置組合列表框的選擇項;</font>FileListBox
<font face="宋體" lang="ZH-CN">有一個</font>Mask<font face="宋體" lang="ZH-CN">屬性,用于設置顯示文件的類型,這就允許</font>FileListBox<font
face="宋體" lang="ZH-CN">在脫離</font>FileFilterComboList<font face="宋體"
lang="ZH-CN">單獨應用時仍能根據需要顯示特定的文件。在</font>6.4<font
face="宋體" lang="ZH-CN">節(jié)中我們將應用這一功能。</p>
<p> 文件控件的方法、事件基本是從</font>ListBox<font face="宋體"
lang="ZH-CN">和</font>ComboBox<font face="宋體" lang="ZH-CN">中繼承的。但</font>FileListBox
<font face="宋體" lang="ZH-CN">中有一個</font>ApplyFilePath<font face="宋體"
lang="ZH-CN">方法很有用,我們將在后邊給出其用法。 </p>
</font><p>6.3.2 <font face="宋體" lang="ZH-CN">文件名瀏覽查找系統(tǒng)的設計思路 </p>
<p> 作為文件控件的應用實例,我們開發(fā)了一個簡單的文件名瀏覽查找系統(tǒng)。這個系統(tǒng)可用于文件名的顯示,把選中的文件寫入列表框,并能按文件編輯框中輸入的通配符對文件進行查找。</font></p>
<font face="宋體" lang="ZH-CN"><p>表</font>6.5 <font face="宋體" lang="ZH-CN">部件的設計</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</font></p>
<p><font face="宋體" lang="ZH-CN">部件 屬性 功能</p>
<p>─────────────────────────────────────</font></p>
<p>FileCtrForm Position=poDefault <font face="宋體" lang="ZH-CN">主窗口</font></p>
<p>DirLabel <font face="宋體" lang="ZH-CN">顯示當前目錄</font></p>
<p>FileEdit TabOrder=0 <font face="宋體" lang="ZH-CN">顯示當前文件</font>/<font
face="宋體" lang="ZH-CN">輸入文件顯示匹配符</font></p>
<p>FileListBox1 FileEdit=FileEdit <font face="宋體" lang="ZH-CN">顯示當前目錄文件</font></p>
<p>DirectoryListBox1 DirLabel=DirLabel <font face="宋體" lang="ZH-CN">顯示當前驅動器目錄</p>
</font><p>FileList= FileListBox1</p>
<p>DriveComboBox1 DirList= DirectoryListBox1 <font face="宋體" lang="ZH-CN">選擇當前驅動器</font></p>
<p>FilterComboBox1 FileList=FileListBox1 <font face="宋體" lang="ZH-CN">選擇文件顯示類型</p>
</font><p>Filter='All Files(*.*)|*.*|</p>
<p>Source Files(*.pas)|*.pas|</p>
<p>Form Files(*.dfm)|*.dfm|</p>
<p>Project Files(*.dpr)|*.dpr'</p>
<p>ListBox1 <font face="宋體" lang="ZH-CN">顯示選中或查找的文件</font></p>
<p>Button1 Caption='<font face="宋體" lang="ZH-CN">查找</font>' <font face="宋體"
lang="ZH-CN">按</font> FileEdit <font face="宋體" lang="ZH-CN">中的內容進行查找</font></p>
<p>Button2 Caption='<font face="宋體" lang="ZH-CN">退出</font>' <font face="宋體"
lang="ZH-CN">退出系統(tǒng)</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
</font><p>6.3.3 <font face="宋體" lang="ZH-CN">文件名瀏覽查找系統(tǒng)的功能和實現(xiàn) </p>
</font><p>6.3.3.1 <font face="宋體" lang="ZH-CN">按指定后綴名顯示當前目錄中的文件 </p>
<p> 實現(xiàn)這一功能只需要在控件間建立正確的聯(lián)系即可,不需要代碼支持。建立聯(lián)系的方法如</font>(6.3.1)<font
face="宋體" lang="ZH-CN">中的介紹。 </p>
</font><p>6.3.3.2 <font face="宋體" lang="ZH-CN">把選中的文件添加到列表框中 </p>
<p> 在</font>FileListBox1<font face="宋體" lang="ZH-CN">的</font>OnClick<font
face="宋體" lang="ZH-CN">事件中: </p>
</font><p>procedure TFileCtrForm.FileListBox1Click(Sender: TObject);</p>
<p>begin</p>
<p>if Searched then</p>
<p>begin</p>
<p>Searched := False;</p>
<p>ListBox1.Items.Clear;</p>
<p>Label5.Caption := 'Selected Files';</p>
<p>end;</p>
<p>if NotInList(ExtractFileName(FileListBox1.FileName),ListBox1.Items) then</p>
<p>ListBox1.Items.Add(ExtractFileName(FileListBox1.FileName));</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> </font>Searched<font face="宋體" lang="ZH-CN">是一個全局變量,用于標明</font>ListBox1<font
face="宋體" lang="ZH-CN">當前顯示內容是查找的結果還是從</font>FileListBox1<font
face="宋體" lang="ZH-CN">中選定的文件。</font></p>
<p><font face="宋體" lang="ZH-CN">函數</font>NotInList<font face="宋體" lang="ZH-CN">用于判斷待添加的字符串是否已存在于一個</font>TStrings<font
face="宋體" lang="ZH-CN">對象中。函數返回一個布爾型變量。</p>
<p> </font>NotInList<font face="宋體" lang="ZH-CN">的具體實現(xiàn)如下。 </p>
</font><p>Function TFileCtrForm.NotInList(FileName: String;Items: TStrings): Boolean;</p>
<p>var</p>
<p>i: Integer;</p>
<p>begin</p>
<p>for I := 0 to Items.Count-1 do</p>
<p>if Items[i] = FileName then</p>
<p>begin</p>
<p>NotInList := False;</p>
<p>Exit;</p>
<p>end;</p>
<p>NotInList := True;</p>
<p>end; </p>
<p>6.3.3.3 <font face="宋體" lang="ZH-CN">按指定匹配字符串顯示當前目錄中的文件 </p>
<p> 當在</font>FileEdit<font face="宋體" lang="ZH-CN">中輸入一個匹配字符串,并回車,文件列表框將顯示匹配結果。這一功能在</font>FileEdit<font
face="宋體" lang="ZH-CN">的</font>OnKeyPress<font face="宋體" lang="ZH-CN">事件中實現(xiàn)。 </p>
</font><p>procedure TFileCtrForm.FileEditKeyPress(Sender: TObject; var Key: Char);</p>
<p>begin</p>
<p>if Key = #13 then</p>
<p>begin</p>
<p>FileListBox1.ApplyFilePath(FileEdit.Text);</p>
<p>Key := #0;</p>
<p>end;</p>
<p>end;</p>
<p><font face="宋體" lang="ZH-CN"> 文件列表框提供的</font>ApplyFilePath<font
face="宋體" lang="ZH-CN">方法是解決這一問題的關鍵所在。 </font></p>
<p>6.3.3.4 <font face="宋體" lang="ZH-CN">按指定匹配字符串查找當前目錄中的文件 </p>
<p> 為了進行比較,我們用另一種方法來實現(xiàn)文件的查找功能,即利用標準過程</font>FindFirst<font
face="宋體" lang="ZH-CN">、</font>FindNext<font face="宋體" lang="ZH-CN">。</font>FileList1<font
face="宋體" lang="ZH-CN">與</font>ListBox1 <font face="宋體" lang="ZH-CN">中的內容完全一致。</font></p>
<p><font face="宋體" lang="ZH-CN">
當用戶單擊“查找”按鈕時,與</font>FileEdit
<font face="宋體" lang="ZH-CN">中字符串相匹配的文件將顯示在</font>ListBox1<font
face="宋體" lang="ZH-CN">中。下面是實現(xiàn)代碼。 </p>
</font><p>procedure TFileCtrForm.Button1Click(Sender: TObject);</p>
<p>var</p>
<p>i: Integer;</p>
<p>SearchRec: TSearchRec;</p>
<p>begin</p>
<p>Searched := True;</p>
<p>Label5.Caption := 'Search Result';</p>
<p>ListBox1.Items.Clear;</p>
<p>FindFirst(FileEdit.text,faAnyFile,SearchRec);</p>
<p>ListBox1.Items.Add(SearchRec.Name);</p>
<p>Repeat</p>
<p>i := FindNext(SearchRec);</p>
<p>If i = 0 then</p>
<p>ListBox1.Items.Add(SearchRec.Name);</p>
<p>until i <> 0;</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> </font>SearchRec<font face="宋體" lang="ZH-CN">是一個</font>TSearchRec<font
face="宋體" lang="ZH-CN">類型的記錄。</font>TSearchRec<font face="宋體"
lang="ZH-CN">的定義如下: </p>
</font><p>TSearchRec = record</p>
<p>Fill: array[1..21] of Byte;</p>
<p>Attr: Byte;</p>
<p>Time: Longint;</p>
<p>Size: Longint;</p>
<p>Name: string[12];</p>
<p>end;</p>
<font face="宋體" lang="ZH-CN"><p> </font> <font face="宋體" lang="ZH-CN">在這一結構中提供了很多信息,靈活應用將給編程帶來很大方便。下面我們舉幾個例子。</p>
<p> </font>1. <font face="宋體" lang="ZH-CN">檢測給定文件的大小。 </p>
</font><p>function GetFileSize(const FileName: String): LongInt;</p>
<p>var</p>
<p>SearchRec: TSearchRec;</p>
<p>begin</p>
<p>if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then</p>
<p>Result := SearchRec.Size</p>
<p>else</p>
<p>Result := -1;</p>
<p>end; </p>
<p><font face="宋體" lang="ZH-CN">這一程序將在下一節(jié)中應用。</p>
<p> </font>2. <font face="宋體" lang="ZH-CN">獲取給定文件的時間戳,事實上等價于</font>FileAge<font
face="宋體" lang="ZH-CN">函數。 </p>
<p> </font>function GetFileTime(const FileName: String): Longint;</p>
<p>var</p>
<p>SearchRec: TSearchRec;</p>
<p>begin</p>
<p>if FindFirst(ExpandFileName(FileName),faAnyFile, SearchRec) = 0 then</p>
<p>Result := SearchRec.Time</p>
<p>else</p>
<p>Result := -1;</p>
<p>end; </p>
<p>3. <font face="宋體" lang="ZH-CN">檢測文件的屬性。如果文件具有某種屬性,則 </p>
</font><p>SearchRec.Attr And GivenAttr > 0 </p>
<p><font face="宋體" lang="ZH-CN">屬性常量對應的值與意義如下表: </p>
<p> 表</font>6.6 <font face="宋體" lang="ZH-CN">屬性常量對應的值與意義</p>
<p>━━━━━━━━━━━━━━━━━━━━</p>
<p>常量 值 描述</p>
<p>─────────────────────</p>
</font><p>faReadOnly $01 <font face="宋體" lang="ZH-CN">只讀文件</p>
</font><p>faHidden $02 <font face="宋體" lang="ZH-CN">隱藏文件</p>
</font><p>faSysFile $04 <font face="宋體" lang="ZH-CN">系統(tǒng)文件</p>
</font><p>faVolumeID $08 <font face="宋體" lang="ZH-CN">卷標文件</p>
</font><p>faDirectory $10 <font face="宋體" lang="ZH-CN">目錄文件</p>
</font><p>faArchive $20 <font face="宋體" lang="ZH-CN">檔案文件</p>
</font><p>faAnyFile $3F <font face="宋體" lang="ZH-CN">任何文件</font> </p>
<font face="宋體" lang="ZH-CN"><p>━━━━━━━━━━━━━━━━━━━━ </p>
</font><p>6.4 <font face="宋體" lang="ZH-CN">文件管理綜合舉例:文件管理器的實現(xiàn) </p>
<p> 在本章的最后,我們利用</font>Delphi<font face="宋體" lang="ZH-CN">提供的文件控件和文件管理函數開發(fā)一個簡單的文件管理器。雖然這一文件管理器還無法和</font>Windows<font
face="宋體" lang="ZH-CN">提供的文件管理器相比擬,但它也為一般的文件操作提供了足夠多的功能,而且如果讀者感興趣,還可以對它做進一步的擴充。在后邊的拖放操作一章中,我們就為它提供了拖放支持,使它看起來更象一個“文件管理器”。</font></p>
<p>6.4.1 <font face="宋體" lang="ZH-CN">設計基本思路 </p>
</font><p>6.4.1.1 <font face="宋體" lang="ZH-CN">窗口設計 </p>
<p> 文件管理器的主窗口是一個多文檔界面</font>(MDI)<font
face="宋體" lang="ZH-CN">。有關文件、目錄的顯示和文件管理功能的實現(xiàn)都放在子窗口中。在程序執(zhí)行過程中將根據需要彈出一些完成不同操作的對話框。這些對話框都是在需要時動態(tài)生成的。表</font>6.7<font
face="宋體" lang="ZH-CN">給出了本程序所設計窗體的清單。 </p>
<p> 表</font>6.7 FileManger<font face="宋體" lang="ZH-CN">窗體清單</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>窗體類 功能</font> <font face="宋體" lang="ZH-CN">用于創(chuàng)建該類窗體的菜單項</p>
<p>──────────────────────────────────────</font></p>
<p>TFileManager <font face="宋體" lang="ZH-CN">主窗口 </font></p>
<p>TFMForm <font face="宋體" lang="ZH-CN">子窗口 </font>Windows|New Window</p>
<p>TFileAttrForm <font face="宋體" lang="ZH-CN">顯示文件屬性 </font>File|Properties;Function|Search</p>
<p>TChangeForm <font face="宋體" lang="ZH-CN">文件移動、拷貝、改名、改變</font>
File|Move.Cope.Rename <font face="宋體" lang="ZH-CN">當前目錄等操作的輸入對話框
</font>Directory|change Directory</p>
<p>TSearchForm <font face="宋體" lang="ZH-CN">輸入待查找文件的名稱和路徑</font>
Function|Search</p>
<p>TDiskViewForm <font face="宋體" lang="ZH-CN">顯示磁盤信息 </font>Function|Disk
View</p>
<p>TViewDir <font face="宋體" lang="ZH-CN">輸入待創(chuàng)建的子目錄 </font>Directory|CreateDirectory</p>
<p>TAboutBox <font face="宋體" lang="ZH-CN">顯示版權信息 </font>Help|About</p>
<font face="宋體" lang="ZH-CN"><p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
</font><p>6.4.1.2 <font face="宋體" lang="ZH-CN">界面設計 </p>
<p> 主窗口界面主要是主菜單和用于表示當前目錄、當前文件的狀態(tài)條。 </p>
<p> 表</font>6.8 <font face="宋體" lang="ZH-CN">主窗口界面設計</font></p>
<p><font face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>部件 屬性 功能</p>
<p> ─────────────────────────────</font></p>
<p>FileManager Style=fsMDI <font face="宋體" lang="ZH-CN">主窗口</p>
</font><p>WindowMenu=Windows</p>
<p>Position=poDefault </p>
<p>MainMenu1 <font face="宋體" lang="ZH-CN">主菜單</font></p>
<p>FilePanel Align=alBottom <font face="宋體" lang="ZH-CN">顯示當前選中文件</p>
</font><p>BevelInner=bvLowered</p>
<p>BevelWidth=2</p>
<p>DirectoryPanel Align=alBottom <font face="宋體" lang="ZH-CN">顯示當前選中目錄</p>
</font><p>Alignment=taLeftJustify</p>
<p>BevelInner=bvLowered</p>
<p>BevelWidth=2</p>
<p><font face="宋體" lang="ZH-CN">━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</font></p>
<p> </p>
<font face="宋體" lang="ZH-CN"><p>主窗口主菜單包括</font>File<font face="宋體"
lang="ZH-CN">、</font>WIndows<font face="宋體" lang="ZH-CN">、</font>Help<font
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -