6.3.2 文件名浏覽查找系統的設計思路
作為文件控件的應用實例,我們開發了一個簡單的文件名浏覽查找系統。這個系統可用於文件名的顯示,把選中的文件寫入列表框,並能按文件編輯框中輸入的通配符對文件進行查找。
表6.5 部件的設計
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件 屬性 功能
─────────────────────────────────────
FileCtrForm Position=poDefault 主窗口
DirLabel 顯示當前目錄
FileEdit TabOrder=0 顯示當前文件/輸入文件顯示匹配符
FileListBox1 FileEdit=FileEdit 顯示當前目錄文件
DirectoryListBox1 DirLabel=DirLabel 顯示當前驅動器目錄
FileList= FileListBox1
DriveComboBox1 DirList= DirectoryListBox1 選擇當前驅動器
FilterComboBox1 FileList=FileListBox1 選擇文件顯示類型
Filter='All Files(*.*)|*.*|
Source Files(*.pas)|*.pas|
Form Files(*.dfm)|*.dfm|
Project Files(*.dpr)|*.dpr'
ListBox1 顯示選中或查找的文件
Button1 Caption='查找' 按 FileEdit 中的內容進行查找
Button2 Caption='退出' 退出系統
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
6.3.3 文件名浏覽查找系統的功能和實現
6.3.3.1 按指定後綴名顯示當前目錄中的文件
實現這一功能只需要在控件間建立正確的聯系即可,不需要代碼支持。建立聯系的方法如(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當前顯示內容是查找的結果還是從FileListBox1中選定的文件。
函數NotInList用於判斷待添加的字符串是否已存在於一個TStrings對象中。函數返回一個布爾型變量。
NotInList的具體實現如下。
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事件中實現。
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 按指定匹配字符串查找當前目錄中的文件
為了進行比較,我們用另一種方法來實現文件的查找功能,即利用標准過程FindFirst、FindNext。FileList1與ListBox1 中的內容完全一致。
當用戶單擊“查找”按鈕時,與FileEdit 中字符串相匹配的文件將顯示在ListBox1中。下面是實現代碼。
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;
這一程序將在下一節中應用。
2. 獲取給定文件的時間戳,事實上等價於FileAge函數。
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 系統文件
faVolumeID $08 卷標文件
faDirectory $10 目錄文件
faArchive $20 檔案文件
faAnyFile $3F 任何文件
━━━━━━━━━━━━━━━━━━━━