6.3.3 文件名瀏覽查找系統(tǒng)的功能和實現(xiàn)
6.3.3.1 按指定后綴名顯示當前目錄中的文件
實現(xiàn)這一功能只需要在控件間建立正確的聯(lián)系即可,不需要代碼支持。建立聯(lián)系的方法如(6.3.1)中的介紹。
6.3.3.2 把選中的文件添加到列表框中
在FileListBox1的OnClick事件中:
procedure TFileCtrForm.FileListBox1Click(Sender: TObject);
begin
if Searched then
begin
Searched := False;
ListBox1.Items.Clear;
Label5.Caption := 'Selected Files';
end;
if NotInList(ExtractFileName(FileListBox1.FileName),ListBox1.Items) then
ListBox1.Items.Add(ExtractFileName(FileListBox1.FileName));
end;
Searched是一個全局變量,用于標明ListBox1當前顯示內(nèi)容是查找的結果還是從FileListBox1中選定的文件。
函數(shù)NotInList用于判斷待添加的字符串是否已存在于一個TStrings對象中。函數(shù)返回一個布爾型變量。
NotInList的具體實現(xiàn)如下。
Function TFileCtrForm.NotInList(FileName: String;Items: TStrings): Boolean;
var
i: Integer;
begin
for I := 0 to Items.Count-1 do
if Items[i] = FileName then
begin
NotInList := False;
Exit;
end;
NotInList := True;
end;
6.3.3.3 按指定匹配字符串顯示當前目錄中的文件
當在FileEdit中輸入一個匹配字符串,并回車,文件列表框將顯示匹配結果。這一功能在FileEdit的OnKeyPress事件中實現(xiàn)。
procedure TFileCtrForm.FileEditKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
begin
FileListBox1.ApplyFilePath(FileEdit.Text);
Key := #0;
end;
end;
文件列表框提供的ApplyFilePath方法是解決這一問題的關鍵所在。
6.3.3.4 按指定匹配字符串查找當前目錄中的文件
為了進行比較,我們用另一種方法來實現(xiàn)文件的查找功能,即利用標準過程FindFirst、FindNext。FileList1與ListBox1 中的內(nèi)容完全一致。
當用戶單擊“查找”按鈕時,與FileEdit 中字符串相匹配的文件將顯示在ListBox1中。下面是實現(xiàn)代碼。
procedure TFileCtrForm.Button1Click(Sender: TObject);
var
i: Integer;
SearchRec: TSearchRec;
begin
Searched := True;
Label5.Caption := 'Search Result';
ListBox1.Items.Clear;
FindFirst(FileEdit.text,faAnyFile,SearchRec);
ListBox1.Items.Add(SearchRec.Name);
Repeat
i := FindNext(SearchRec);
If i = 0 then
ListBox1.Items.Add(SearchRec.Name);
until i <> 0;
end;
SearchRec是一個TSearchRec類型的記錄。TSearchRec的定義如下:
TSearchRec = record
Fill: array[1..21] of Byte;
Attr: Byte;
Time: Longint;
Size: Longint;
Name: string[12];
end;
在這一結構中提供了很多信息,靈活應用將給編程帶來很大方便。下面我們舉幾個例子。
1. 檢測給定文件的大小。
function GetFileSize(const FileName: String): LongInt;
var
SearchRec: TSearchRec;
begin
if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
Result := SearchRec.Size
else
Result := -1;
end;
這一程序將在下一節(jié)中應用。
2. 獲取給定文件的時間戳,事實上等價于FileAge函數(shù)。
function GetFileTime(const FileName: String): Longint;
var
SearchRec: TSearchRec;
begin
if FindFirst(ExpandFileName(FileName),faAnyFile, SearchRec) = 0 then
Result := SearchRec.Time
else
Result := -1;
end;
3. 檢測文件的屬性。如果文件具有某種屬性,則
SearchRec.Attr And GivenAttr > 0
屬性常量對應的值與意義如下表:
表6.6 屬性常量對應的值與意義
━━━━━━━━━━━━━━━━━━━━
常量 值 描述
─────────────────────
faReadOnly $01 只讀文件
faHidden $02 隱藏文件
faSysFile $04 系統(tǒng)文件
faVolumeID $08 卷標文件
faDirectory $10 目錄文件
faArchive $20 檔案文件
faAnyFile $3F 任何文件
━━━━━━━━━━━━━━━━━━━━
6.4 文件管理綜合舉例:文件管理器的實現(xiàn)
在本章的最后,我們利用Delphi提供的文件控件和文件管理函數(shù)開發(fā)一個簡單的文件管理器。雖然這一文件管理器還無法和Windows提供的文件管理器相比擬,但它也為一般的文件操作提供了足夠多的功能,而且如果讀者感興趣,還可以對它做進一步的擴充。在后邊的拖放操作一章中,我們就為它提供了拖放支持,使它看起來更象一個“文件管理器”。
6.4.1 設計基本思路
6.4.1.1 窗口設計
文件管理器的主窗口是一個多文檔界面(MDI)。有關文件、目錄的顯示和文件管理功能的實現(xiàn)都放在子窗口中。在程序執(zhí)行過程中將根據(jù)需要彈出一些完成不同操作的對話框。這些對話框都是在需要時動態(tài)生成的。表6.7給出了本程序所設計窗體的清單。
表6.7 FileManger窗體清單
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
窗體類 功能 用于創(chuàng)建該類窗體的菜單項
──────────────────────────────────────
TFileManager 主窗口
TFMForm 子窗口 Windows|New Window
TFileAttrForm 顯示文件屬性 File|Properties;Function|Search
TChangeForm 文件移動、拷貝、改名、改變 File|Move.Cope.Rename 當前目錄等操作的輸入對話框 Directory|change Directory
TSearchForm 輸入待查找文件的名稱和路徑 Function|Search
TDiskViewForm 顯示磁盤信息 Function|Disk View
TViewDir 輸入待創(chuàng)建的子目錄 Directory|CreateDirectory
TAboutBox 顯示版權信息 Help|About
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
6.4.1.2 界面設計
主窗口界面主要是主菜單和用于表示當前目錄、當前文件的狀態(tài)條。
表6.8 主窗口界面設計
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件 屬性 功能
─────────────────────────────
FileManager Style=fsMDI 主窗口
WindowMenu=Windows
Position=poDefault
MainMenu1 主菜單
FilePanel Align=alBottom 顯示當前選中文件
BevelInner=bvLowered
BevelWidth=2
DirectoryPanel Align=alBottom 顯示當前選中目錄
Alignment=taLeftJustify
BevelInner=bvLowered
BevelWidth=2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
主窗口主菜單包括File、WIndows、Help三項。File菜單項在子窗口生成時被子窗口同名菜單項所取代。設置Windows、Help的GroupIndex = 9,可以使子窗口生成時這兩個菜單項仍存在。
子窗口界面包括主菜單、目錄樹(DirectoryOutline)、文件列表框、 用于顯示驅動器的標簽集(TabSet)以及三個用于顯示驅動器類型的TImage部件。
表6.9 子窗口界面設計
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件 屬性 功能
───────────────────────────────────────
FMForm ActiveControl=DirectoryOutline 子窗口
Position=poDefault
Style=fsMDIChild
MainMenu1 主菜單
DriveTabSet Align=alTop 顯示驅動器
style=tsOwnerDraw
DirectoryOutline Align=alLeft 顯示當前驅動器的目錄樹
options=[ooDrawTreeRoot,
ooDrawFocusRect,ooStretchBitmaps]
FileList Align=alClient 顯示當前目錄中的文件
FileType=[ftReadOnly,
ftHidden,ftSystem,ftArchive,ftNormal]
ShowGlyphs=True
Network(Image) Picture(Network.bmp) 標志網(wǎng)絡驅動器
Vsible=False
Floppy(Image) Picture(Floppy.bmp) 標志軟驅
Visible=False
Fixed(Image) Picture(Fixed.bmp) 標志硬驅
Visible=False
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
子窗口主菜單包括File、Function、Directory三個菜單項, 分別用于完成文件的基本管理功能、其它管理功能和目錄管理功能。
由于對話框界面設計很簡單,這里不再進行贅述。 讀者可直接參考后面將給出的對話框界面圖(圖6.8---6.13)進行設計。
6.4.2 子窗口的創(chuàng)建、布置和關閉
子窗口的創(chuàng)建、布置由父窗口的Windows菜單控制,其菜單項如下:
● New Windows : 創(chuàng)建新的子窗口
● Tile : 平鋪
● Cascade : 層疊
● ArrangeIcon : 排列圖標
● Minimized All : 極小化所有子窗口
子窗口的創(chuàng)建只需要簡單調用窗體的Create方法:
FileMan := TFMForm.Create(Application);
子窗口的標準排列方式直接調用MDI窗口的標準方法Tile、Cascade和ArrangeIcons。
極小化所有子窗口的實現(xiàn)利用MDI窗口的兩個屬性:MDIChildCount和MDIChildren:
for i := 0 to MDICount - 1 do
MDIChildren[i].Windowstate := wsMinimized;
子窗口關閉時釋放內(nèi)存空間,為此在子窗口TFMForm的OnClose事件中令
Action := OnFree;
為了保持和Windows的File Manager的一致性,我們也禁止關閉最后一個子窗口,這需要在子窗口的OnCloseQuery事件處理過程中實現(xiàn):
If FileManager.MDIChildCount <= 1 then
CanClose := False;
CanClose是OnCloseQuery事件過程返回的一個參數(shù),用于判定窗口是否可以關閉。
由于這一過程歸子窗口所有,因而MDIChildCount前必須加上其對象名FileManager。
但不幸的是:這樣一來我們的程序無法終止了!原來MDI窗口關閉前首先關閉其所有的子窗口。如果子窗口不能關閉,MDI窗口也不能關閉。
為此我們需要判斷發(fā)出關閉消息的是子窗口的系統(tǒng)菜單還是菜單的Exit項。
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |