
A mellékelt példaprogram megnyitása előtt a TextSearch.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens használata
A komponens Text tulajdonságában adhatjuk meg a keresendő szöveget. A komponens csak TEXT formátumú állományok esetében használható. Az Extension property-ben kell megadnunk egy kiterjesztést, a Directory tulajdonságban pedig egy könyvtárat. A komponens a megadott könyvtárban található összes olyan állományt végignézi, amelynek kiterjesztése egyezik az Extension property-ben megadott értékkel. Ha például pas állományokban szeretnénk keresni, akkor az Extension tulajdonságnak adjuk értékül a ’pas’ sztringet.
Ha a SearchSub értékét igazra állítjuk, akkor a keresés a megadott könyvtár alkönyvtáraira is kiterjed.
A keresés az Execute metódus meghívásával kezdődik.
procedure Execute(var List: TStringList);
Az Execute metódusnak paraméterként át kell adnunk egy TStringList típusú objektumot, melyben a keresés eredményét kapjuk vissza. A komponens végignézi a megtalált állományok összes sorát. Ha egy sor tartalmazza a keresett szöveget, akkor az állomány elérési útja, neve, valamint a sor száma feljegyzésre kerül a StringList-be. A StringList utolsó eleme mindig a találatok számát tartalmazza, akkor is, ha az 0.
A komponens elkészítése
Komponensünket a TComponent osztályból származtatjuk.
A komponens magja egy rekurzív eljárás, a ScanFiles. Az eljárás csak akkor működik rekurzívan, ha az FSearchSub értéke igaz. A ScanFiles-t az Execute metódus indítja el, kezdeti paraméterként a megadott könyvtárral.
if (FDirectory<>'') and (FExtension<>'') and (FText<>'') then
ScanFiles(FDirectory);
A ScanFiles eljárás
procedure TTextSearch.ScanFiles(Dir: String);
Az eljárás belsejében két globális változót használunk. Az FCount változóban tároljuk el a találatok számát, melyeket az FList, TStringList típusú objektumban jegyzünk fel.
A rekurzió miatt gondoskodnunk kell arról, hogy a paraméterben kapott könyvtár neve mindig a „\” karakterre végződjön.
if Dir[Length(Dir)]<>'\' then Dir:=Dir+'\';
Az állományok kereséséhez a FindFirst – FindNext utasításpárost használjuk. Az utasításpáros segítségével végignézzük a Dir paraméterben kapott könyvtár összes bejegyzését. Egy bejegyzés állományt vagy könyvtárat takarhat. Ha egy könyvtárat találunk, és az FSearchSub értéke is igaz, akkor újra meg kell hívnunk a ScanFiles eljárást, rekurzív módon. Paraméterként a talált könyvtárat kell adnunk.
if (F.Attr and faDirectory)<>0 then begin
if FSearchSub and (F.Name[1]<>'.') then
ScanFiles(Dir+F.Name);
Ha a keresés során nem könyvtárat, hanem egy állományt találtunk, akkor még tennünk kell egy további vizsgálatot. Csak olyan állományokkal kell foglalkoznunk, amelyek kiterjesztése megegyezik az FExtension változó tartalmával.
if LowerCase(ExtractFileExt(F.Name))='.'+FExtension then begin
Ha az állomány kiterjesztése megfelelő, akkor azt megnyitjuk TEXT állományként, csak olvasásra.
AssignFile(tf,Dir+F.Name);
Reset(tf);
A tf változót TextFile típussal kell deklarálnunk. A TEXT típusú állományok alkotóegysége a sor. Minden egyes sort be kell olvasnunk. Egy sor beolvasására a ReadLn eljárás szolgál.
Az s változó sztring típusú, mindig a legutoljára beolvasott sort tartalmazza. Az StrPos függvény segítségével megvizsgálhatjuk, hogy az s tartalmazza-e a keresett szöveget.
if StrPos(PChar(s),PChar(FText))<>'' then begin
Ha a fenti feltétel teljesül, akkor az azt jelenti, hogy a beolvasott sorban megtalálható a keresett szöveg. Ebben az esetben az FList elemeit bővítenünk kell az aktuális állomány elérési útjával és nevével, valamint az aktuális sor számával.