Рекомендуемый вид диалогового окна приведен на рис. 1.54. Для ввода имени каталога во время работы программы используйте стандартное диалоговое окно Обзор папок (рис. 1.55).

Рис. 1.53.

Рис. 1.53.

// Поиск файла в указанном каталоге и его подкаталогах
// используется рекурсивная процедура Find.
unit FindFile_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, FileCtrl;
type
TForral = class(TForm)
Editl: TEdit; // что искать
Edit2: TEdit; // где искать
Memol: TMemo; //' результат поиска
Buttonl: TButton; /'/ кнопка Поиск
Button2: TButton; // кнопка Папка
Labell: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
/ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml;
implementation
i$R *.dfm}
var
FileName: string; // имя или маска искомого файла
cDir: string;
n: integer; // кол-во файлов, удовлетворяющих запросу
Рис. 1.54. Форма программы Поиск файла
Рис. 1.55. Стандартное окно Обзор папок
// поиск файла в текущем каталоге
procedure Find;
var
SearchRec: TSearchRec; // информация о файле или каталоге
begin '
GetDir(0, cDir); // получить имя текущего каталога
if cDir [length (cDir) I <> 'V then cDir := cDir+'V;
if FindFirst(FileName, faAnyFile,SearchRec) = 0 then
repeat
if (SearchRec.Attr and faAnyFile) = SearchRec.Attr
then begin
Forml.Memol.Lines.Add(cDir + SearchRec.Name)
n := n + 1;
end;
until FindNext(SearchRec) <> 0;
// обработка подкаталогов текущего каталога
{ Если не обрабатывать системные каталоги, то
вместо faAnyFile можно задать faDirectory.
Это объясняется тем, что значение SearchRec.Attr
для обычного каталога равно faDirectory (16),
для Program Files — faDirectory+faReadOnly (1 7) ,
а для каталога Windows — faDirectory+faSysFile (20) }
if FindFirst С*1, faAnyFile, SearchRec) = 0 then
repeat
if (SearchRec.Attr and faDirectory) = faDirectory
then
// каталоги '.. ' и '. ' тоже каталоги,
// но в них входить не надо !!!
if SearchRec.Name[i] о '.' then
begin
ChDir(SearchRec.Name); // войти в каталог
Find; // выполнить поиск в подкаталоге
ChDir('..');// выйти из каталога
end;
until FindNext(SearchRec) О 0;
end;
// щелчок на кнопке Поиск
procedure TForml.ButtonlClick(Sender: TObject);
begin
if not DirectoryExists(Edit2.Text) then
begin
ShowMessage('Каталог указан неверно.');
Edit2.SetFocus;
exit;
end;
Buttonl.Enabled := False;
Label4.Caption := '';
Label4.Repaint;
Memol.Clear; // очистить поле Memol
Label4.Caption := '';
FileName := Edit1.Text; // что искать
cDir := Edit2.Text; // где искать
n:=0; // кол-во найденных файлов
ChDir(cDir); // войти в каталог начала поиска
Find; // начать поиск
if n = 0 then
ShowMessage('Файлов, удовлетворяющих критерию ' +
'поиска нет.')
else Label4.Caption := 'Найдено файлов:' + IntToStr(n);
Buttonl.Enabled := True;
end;
/У возвращает каталог, выбранный пользователем
function GetPath(mes: string):string;
var
Root: string; // корневой каталог
pwRoot : PWideChar;
Dir: string;
begin
Root : = ''; // корневой каталог — папка Рабочий стол
GetMemfpwRoot, (Length(Root)+1) * 2);
pwRoot := StringToWideChar(Root,pwRoot,MAX_PATH*2);
if SelectDirectory(mes, pwRoot, Dir)
then
if length(Dir) =2 // выбран корневой каталог
then GetPath := Dir+'V
else GetPath := Dir
else
GetPath :=
end;
// щелчок на кнопке Папка
procedure TForral.Button2Click(Sender: TObject);
var
Path: string;
begin
Path := GetPath('Выберите папку1);
if Path О "
then Edit2.Text := Path;
end;end.