Strona g│≤wna

 

Wyszukiwanie tekstu

Nie zra┐aj siΩ! Pod pojΩciem wyszukiwania tekstu kryje siΩ fajna rzecz!! :)) Tak, tak nie jest to tak trudne jak mog│oby siΩ to wydawaµ na pocz▒tek. Za chwilΩ przedstawiΩ proces przeszukiwania plik≤w. W naszym programie chodzi│o bΩdzie o uzyskiwanie nazw wszystkich plik≤w znajduj▒cych siΩ we wnΩtrzu tego┐ katalogu. 

Najpierw stworzymy now▒ klasΩ - umie╢µ wiΩc w sekcji "Interface" taki kod:

{
  Nowa klasa: zawiera ona w sekcji "private" zmienna wskazujaca na
  rekord przeszukujacy pliki, a funkcja sprawdza, czy ostatnim znakiem
  w zmiennej "Path" jest snak back-slash'a. Jezeli nie to dodaje go.
  W sekcji "public" znajduje sie procedura wyszukujaca pliki!
}
  TSearch = class
  private
    SR : TSearchRec;
    function IsSlashChar(Path : String) : String;
  public
    function FindIt(Dir : String; var Progress : Integer) : TStringList;
  end;

Pierwsza funkcja w sekcji "private": ustala ona, czy ╢cie┐ka, kt≤ra zosta│a przekazana w zmiennej "APath" ma na ko±cu znak slash'a ("\"), czy tez nie. Deklaracja tej funkcji wygl▒da nastΩpuj▒co:

function TSearch.IsSlashChar(Path: String): String;
begin
{
  Funkcja sprawdza, czy ostatnim znakiem zmiennej "Path" nie jest znak "\".
  Jezeli nie jest to ten znak jest dodwany.
}
  if Path[Length(Path)] <> '\' then
    Result := Path + '\' else Result := Path;
end;

Tak jak m≤wi│em - na pocz▒tku sprawdzany zostaje ostatni znak zmiennej "APath" - je┐eli nie jest to znak "\" to dodawany jest on na ko±cu tej zmiennej i zwracany jako rezultat. 

Dobra - teraz funkcja "FindIt". Delphi udostΩpnia dwa przydatne polecenia, kt≤re s│u┐▒ do wyszukiwania plik≤w - s▒ to "FindFirst", kt≤ra rozpoczyna wyszukiwania plik≤w. 

FindFirst(Dir + '*.*', faAnyFile, SR); // odnajdz pliki

A wiΩc szukanie plik≤w nastΩpuje w katalogu, kt≤rego nazwa kryje siΩ pod zmienn▒ "Dir". Do tej nazwy nastΩpuje dodana maska ( *.* oznacza wszystkie pliki ). Kolejnym parametrem tej funkcji jest typ plik≤w, kt≤ry ma byµ szukany - "faAnyFile" oznacza ka┐dy plik. Ostatnim parametrem tej funkcji jest struktura typu "TSearchRec". 

Funkcja "FindNext" natomiast daje polecenie do dalszego szukania pliku. To wszystko nale┐y jeszcze wzi▒µ w pΩtle "while" gdy┐ proces przeszukiwania ma byµ kontynuowany dop≤ki liczba znalezionych plik≤w nie bΩdzie siΩ r≤wnaµ zeru. Ca│a funkcja wygl▒da tak:

Listing 2.1


function TSearch.FindIt(Dir: String; var Progress : Integer) : TStringList;
var
  Found : Integer; // zmienna przechowuje ilosc znalezionych plikow
begin
{
  Rezultatem tej funkcji jest zmienna typu "TStringList", ktora zawierac
  bedzie liste plikow, ktore zostaly odnalezione.
}
  Result := TStringList.Create; // stworz zmienna
  try
 // wywolaj funkcje, ktora sprawdza, czy na koncu zmiennej "Dir" jest znak "\"
    Dir := IsSlashChar(Dir); 
    Found := FindFirst(Dir + '*.*', faAnyFile, SR); // odnajdz pliki
    while ( Found = 0 ) do //dopoki liczba znalezionych plikow nie bedzie rowna 0
    begin
{
  Ponizsza instrukcja odpowiada za to, zeby do listy znalezionych plikow nie
  dodawana byla nazwa '.' ani '..' ktore to oznaczaja, ze istnieje katalog
  wyzej.
}
      if (SR.Name <> '.') and (SR.Name <> '..') then
    // do listy "TStringList" dodaj nazwe znalezionego pliku  
      Result.Add(Dir +  SR.Name); 
      Found := FindNext(SR); // szukaj dalej...
    end;
  finally
    FindClose(SR); // zakoncz przeszukiwanie
  end;
{
  Ah. Bylbym zapomnial o opisaniu zmiennej "Process" w tej funkcji. Otoz
  ta zmienna zawiera 'informacje' o stanie postepu w odnajdywaniu plikow.
}
end;

Funkcja ta zwraca rezultat w postaci listy zawieraj▒cej nazwΩ wszystkich znalezionych plik≤w. Tak wiΩc wywo│ywana zostaje pΩtla, kt≤ra zako±czona jest dopiero wtedy gdy liczba znalezionych plik≤w nie r≤wna siΩ zeru. NastΩpnie funkcja sprawdza, czy nazwa znalezionego pliku nie r≤wna siΩ "." albo "..". Te dwie dziwne nazwy :) oznaczaj▒ to, ┐e istnieje katalog wy┐ej. Nas to na razie nie obchodzi i dlatego nie chcemy, aby taka nazwa by│a dodana do listy znalezionych plik≤w.

Wywo│anie procedury i stworzenie tej klasy to taki kod:

Listing 2.2


procedure TMainForm.btnFindClick(Sender: TObject);
var
  Search : TSearch; // wskazuje na nowa klase
  I : Integer;
begin
  Search := TSearch.Create; // stworz klase
  try
// do komponentu dodawana jest lista z funkcji "FindIt"
    lblFindFiles.Items.Assign(Search.FindIt(DirList.Directory, i));
  // postep w odnajdywaniu pliku przestawiany jest na komponencie "progrssbar"
    prgProgress.Position := i; 
  finally
    Search.Free; // uwolnij zmienna
  end;
end;

Kod ten nie wymaga chyba wiΩkszych komentarzy - "lblFindFiles" to kontrolka typu "TListBox". Zreszt▒ mo┐esz ╢ci▒gn▒µ sobie ca│y kod i zobaczyµ jak to wygl▒da.

Ca│y listing prezentuje siΩ w taki oto spos≤b:

Listing 2.3


(****************************************************************)
(*                                                              *)
(*      Example - programme searching files for Delphi 5        *)
(*     Copyright (c) 2001 by Service for programmers            *)
(*              Adam Boduch - Build: 23.03.2001                 *)
(*              HTTP://WWW.PROGRAMOWANIE.OF.PL                  *)
(*                E - mail:  boduch@poland.com                  *)
(*                                                              *)
(****************************************************************)      

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, FileCtrl;

type
  TMainForm = class(TForm)
    lblFindFiles: TListBox;
    btnFind: TButton;
    prgProgress: TProgressBar;
    DirList: TDirectoryListBox;
    procedure btnFindClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

{
  Nowa klasa: zawiera ona w sekcji "private" zmienna wskazujaca na
  rekord przeszukujacy pliki, a funkcja sprawdza, czy ostatnim znakiem
  w zmiennej "Path" jest snak back-slash'a. Jezeli nie to dodaje go.
  W sekcji "public" znajduje sie procedura wyszukujaca pliki!
}
  TSearch = class
  private
    SR : TSearchRec;
    function IsSlashChar(Path : String) : String;
  public
    function FindIt(Dir : String; var Progress : Integer) : TStringList;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

{ TSearch }

function TSearch.FindIt(Dir: String; var Progress : Integer) : TStringList;
var
  Found : Integer; // zmienna przechowuje ilosc znalezionych plikow
begin
{
  Rezultatem tej funkcji jest zmienna typu "TStringList", ktora zawierac
  bedzie liste plikow, ktore zostaly odnalezione.
}
  Result := TStringList.Create; // stworz zmienna
  try
 // wywolaj funkcje, ktora sprawdza, czy na koncu zmiennej "Dir" jest znak "\"
    Dir := IsSlashChar(Dir); 
    Found := FindFirst(Dir + '*.*', faAnyFile, SR); // odnajdz pliki
    while ( Found = 0 ) do //dopoki liczba znalezionych plikow nie bedzie rowna 0
    begin
{
  Ponizsza instrukcja odpowiada za to, zeby do listy znalezionych plikow nie
  dodawana byla nazwa '.' ani '..' ktore to oznaczaja, ze istnieje katalog
  wyzej.
}
      if (SR.Name <> '.') and (SR.Name <> '..') then
   // do listy "TStringList" dodaj nazwe znalezionego pliku
      Result.Add(Dir +  SR.Name); 
      Found := FindNext(SR); // szukaj dalej...
    end;
  finally
    FindClose(SR); // zakoncz przeszukiwanie
  end;
{
  Ah. Bylbym zapomnial o opisaniu zmiennej "Process" w tej funkcji. Otoz
  ta zmienna zawiera 'informacje' o stanie postepu w odnajdywaniu plikow.
}
end;

function TSearch.IsSlashChar(Path: String): String;
begin
{
  Funkcja sprawdza, czy ostatnim znakiem zmiennej "Path" nie jest znak "\".
  Jezeli nie jest to ten znak jest dodwany.
}
  if Path[Length(Path)] <> '\' then
    Result := Path + '\' else Result := Path;
end;

procedure TMainForm.btnFindClick(Sender: TObject);
var
  Search : TSearch; // wskazuje na nowa klase
  I : Integer;
begin
  Search := TSearch.Create; // stworz klase
  try
// do komponentu dodawana jest lista z funkcji "FindIt"
    lblFindFiles.Items.Assign(Search.FindIt(DirList.Directory, i));
  // postep w odnajdywaniu pliku przestawiany jest na komponencie "progrssbar"
    prgProgress.Position := i; 
  finally
    Search.Free; // uwolnij zmienna
  end;
end;


end.

Gotowy kod mo┐esz ╢ci▒gn▒µ klikaj▒c na poni┐szy link:

Search.zip ( 3 kB )

Przydatne linki:

  • Co to s▒ klasy i jak je tworzyµ? [ Zobacz ]
  • Opis struktury "TSearchRec"  [ Zobacz ]

Adam Boduch