|
|
|||||||
---|---|---|---|---|---|---|---|---|
Пишем компонент для поиска файлов |
|
Раз это компонент, то он должен все наследовать от класса TComponent. Создаем новый компонент, выбрав в среде команду Component >> New Component... Указав наследуемый класс и название нашего компонента, создаем модуль. Теперь надо определиться, какие свойства, методы и события будут у компонента. Во-первых, нужно указать где и что искать. Для этого понадобятся два свойства типа strings, которые будут хранить путь для поиска и маску поиска: property Root: string read FRoot write FRoot; Для использования масок подключим модуль Masks. Хотя применение регулярных выражение оказывает большее быстродействие, но в нашем случае это не сыграет никакой роли. Теперь создадим объект маски: type TFileSearch = class(TComponent) private FRoot: string; FMask: string; FMskObj: TMask; // объект маски public destructor Destroy; override; // перегружаем деструктор constructor Create(AOwner: TComponent); override; // и конструктор published property Root: string read FRoot write FRoot; property Mask: string read FMask write FMask; end; Деструктор перегружаем для того, чтобы удалить маску при удалении компонента. А в конструкторе инициализируем все свойства. Нам потребуется свойство Active для запуска поиска, событие, наступающее в момент нахождения файла, и сам метод поиска. Через свойство Active мы можем не только запускать поиск, но и останавливать его. Теперь наш класс будет выглядеть следующим образом: type TFindFileEvent = procedure (FullFileName: string; SearchRec: TSearchRec) of object; type TFileSearch = class(TComponent) private FActive: Boolean; FRoot: string; FOnFindFile: TFindFileEvent; FMask: string; FMskObj: TMask; procedure SetActive(const Value: Boolean); protected Procedure FindFiles(Path: string); public property Active: Boolean read FActive write SetActive; destructor Destroy; override; constructor Create(AOwner: TComponent); override; published property Root: string read FRoot write FRoot; property OnFindFile: TFindFileEvent read FOnFindFile write FOnFindFile; property Mask: string read FMask write FMask; end; Метод FindFiles объявлен в секции protected на случай, если мы захотим перегрузить его. Свойство Active объявляем в секции public для того, чтобы оно не было доступно в инспекторе объектов. Теперь перейдем к реализации методов и начнем с метода Create: constructor TFileSearch.Create(AOwner: TComponent); begin inherited; // инициализируем свойства Root := ExtractFileDir(Application.ExeName); Mask := '*.*'; FActive := False; FMskObj := nil; end; Затем перейдем к методу FindFiles, в котором мы и применим функции FindFirst, FindNext и FindClose. procedure TFileSearch.FindFiles(Path: string); var sr: TSearchRec; begin if not Active then Exit; //Завершаем поиск, если не активен // ищем первый файл if FindFirst(Path+'\*.*',faAnyFile,sr) = 0 then begin repeat if not Active then Exit; if sr.Name = '.' then Continue; // если это этаже папка if sr.Name = '..' then Continue; // или родительская, то пропускаем // Если файл соответствует маске, то генерируем событие if FMskObj.Matches(AnsiUpperCase(sr.Name)) then if Assigned(FOnFindFile) then FOnFindFile(Path+'\'+sr.Name,sr); if (sr.Attr and faDirectory)<>0 then FindFiles(Path+'\'+sr.Name); until FindNext(sr) <> 0 // ищем следующий файл end; FindClose(sr); // закрываем поиск FActive := false; // и останавливаем его end; Реализуем метод для установки свойства Active: procedure TFileSearch.SetActive(const Value: Boolean); begin FActive := Value; if Active then begin // удаляем старую маску и создаем новую if FMskObj <> nil then FMskObj.Free; FMskObj := TMask.Create(AnsiUpperCase(Mask)); FindFiles(Root); // поиск end; end; И последний метод - деструктор Destroy: destructor TFileSearch.Destroy; begin // удаляем маску if FMskObj <> nil then FMskObj.Free; inherited; end; Теперь рассмотрим событие OnFindFile.
Теперь осталось компонент инсталлировать и использовать. Хочу надеяться, что выше изложенный материал кому-нибудь поможет. |
---|
© Зинкевич
Виктор, 2005 г. |