Ну что же, давайте попробуем написать программу, которая бы выдавала список всех программ с расширением *.exe в указанной директории, а затем при нажатии на кнопку включалась бы выбранная программа.
Кидаем на форму "TListBox" - в него мы будем выводить список найденных файлов. Обработчик событий для нашей первой кнопки изменим на такой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var sr:TSearchRec;
Result:word;
begin
ChDir('C:\windows');//меняем папку на C:\Windows
Result := FindFirst ('*.exe',faAnyFile,sr);
ListBox1.Clear;
While result=0 do
Begin
Result:=FindNext (sr);
ListBox1.Items.add(sr.name);
End;
end;
Как вы можете наблюдать, мы не сделали ничего сложного, просто организовали цикличный проход по директории C:\Windows, который прекращается, как только функции возвращает не ноль. Функция ChDir в нашем случае используется для смены папки с текущей на папку C:\windows\
Этот способ лишь находит файлы в том каталоге, который задан переменной Path:String. Поэтому я думаю, что стоит написать алгоритм поиска файлов в каждой найденной директории.
У меня расширенная процедура поиска выглядит вот так:
Код:
procedure ffind(cat:string); //каталог, откуда начать поиск
var sea:TSearchRec;
res:integer; //результат поиска (0 или нет)
begin
res:=FindFirst(cat+'*.*',faAnyFile,sea); //ищем первый файл
res:=findNext(sea);//ищем следующий файл
While res=0 do
begin
if (Sea.Attr=faDirectory) and ((Sea.Name='.')or(Sea.Name='..')) then//чтобы не было файлов . и..
begin
Res:=FindNext(sea);
Continue;//продолжаем цикл
end;
Код:
if (Sea.Attr=faDirectory) then//если нашли директорию, то ищем файлы в ней
begin
Ffind(cat+Sea.Name+'\');//рекурсивно вызываем нашу процедуру
Res:=FindNext(Sea);//ищем след. файл
Continue;//продолжаем цикл
end;
form1.ListBox1.Items.Add(Sea.Name);//добавляем в Listbox:Tlistbox имя файла
Res:=FindNext(Sea);//ищем след. файл
end;
FindClose(Sea);//освобождаем пересенную поиска
end;
Здесь мы с вами использовали процедуру FindClose(var sea: TsearchRec) - она необходима для освобождения поисковой переменной. Для того, чтобы наша с вами программа не выглядела подвисшей, можно добавить Application.ProcessMessages в начало нашей процедуры.
Кидаем на форму еще одну кнопку для того, чтобы по ее нажатии запускать выбранную в ListBox'e программу. Обработчик события Onclick для нашей второй кнопки у меня получился таким:
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
WinExec(pchar(listbox1.Items[listbox1.itemindex]),sw_show);
end;
Т.к. файлы находятся в директории Windows, то при вызове метода WinExec путь к файлам можно не указывать, а если вы используете какую-либо другую директорию, то вызов метода WinExec должен быть таким:
Код:
WinExec(pchar('C:\Путь к вашей папке\'+listbox1.Items[listbox1.itemindex]),sw_show);
А если вы просто хотите искать файлы в указанном пользователем каталоге можно использовать компонент DirectoryListBox, который дает доступ к каталогам на вашем компьютере и позволяет менять текущий каталог двойным нажатием мыши. Узнаем выбранный каталог так:
Код:
DirectoryListBox1.Directory
Именно поэтому в обработчике первой кнопки, убираем вызов функции ChDir. А в обработчике второй кнопки вставить приведенную выше конструкцию.
Таким образом у нас с вами получается вот такой код:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, FileCtrl;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
DirectoryListBox1: TDirectoryListBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var sr:TSearchRec;
Result:word;
begin
Result := FindFirst ('*.exe',faAnyFile,sr);
ListBox1.Clear;
While result=0 do
Begin
Result:=FindNext (sr);
ListBox1.Items.add(sr.name);
End;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WinExec(pchar(DirectoryListBox1.Directory+'\'+listbox1.Items[listbox1.itemindex]),sw_show);
end;
end.
Вот мы и реализовали нашу идею в жизнь. Спасибо за внимание.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]