Delphi - Project-kereső komponens készítése

forráskód letöltése
Készítünk egy komponenst, mely segítségével Delphi project-eket kereshetünk egy megadott könyvtárban, valamint annak alkönyvtáraiban. A komponens ListBox-ként funkcionál. A megfelelő metódus meghívására megjeleníti a megtalált Delphi project-eket. Ha valamelyik elemre duplán kattintunk, megnyílik a Delphi és betöltődik az adott project.
A mellékelt példaprogram megnyitása előtt a DPRSearch.pas-ban levő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens ugyanúgy működik, mint egy hagyományos ListBox. Rendelkezik azonban két további metódussal.
A SearchForDPR metódus meghívásával kereshetünk Delphi projecteket.
procedure SearchForDPR(SearchDir: String; SearchSub: Boolean);
A SearchDir paraméterben a keresés kezdeti könyvtárát kell megadnunk. Ha a SearchSub paraméterben igaz értéket adunk meg, akkor a keresés a megadott könyvtár alkönyvtáraiban is megtörténik. Hamis érték esetén a metódus csak a SearchDir-ben megadott könyvtárban keres.
A keresés eredményét a komponens azonnal megjeleníti. A komponens korábbi tartalma azonban nem törlődik.
Ha a komponens használata alatt egy elemre duplán kattintunk az egér bal oldali gombjával, akkor megnyílik a Delphi és betölti az adott project-et. Egy project-et bármikor megnyithatunk a LoadDPR metódus használatával is.
procedure LoadDPR(Project: String); 
A Project paraméterben a megnyitandó Delphi project elérési útját és nevét kell megadnunk.
A komponens elkészítése
A komponenst a TCustomListBox osztályból származtatjuk.
A project-keresés algoritmusát a SearchForDPR metódusban programozzuk le.
procedure SearchForDPR(SearchDir: String; SearchSub: Boolean);
Amennyiben a SearchSub paraméter értéke igaz, ennek a függvénynek rekurzív módon kell működnie.
A keresést a megadott könyvtárban kezdjük. A kereséshez a FindFirst – FindNext utasításpárost használjuk.
A könyvtárban található első állománybejegyzést a FindFirst függvénnyel találhatjuk meg. A további állományok megtalálásához a FindNext függvényt kell használnunk.
if FindFirst(SearchDir+'*.*',faAnyFile,F)=0 then begin
  repeat
Azért kell a keresést *.*-al végeznünk, mert az alkönyvtárakat és a DPR állományokat is egyaránt meg akarjuk találni.
Ha a megtalált bejegyzés könyvtár és a SearchSub értéke is igaz, akkor rekurzió következik.
if (F.Attr and faDirectory)<>0 then begin
  if SearchSub and (F.Name[1]<>'.') then
    SearchForDPR(SearchDir+F.Name,SearchSub);
end
Ha egy project--et találtunk, akkor azt egyszerűn felvesszük a listába.
else begin
  if LowerCase(ExtractFileExt(F.Name))='.dpr' then
    Items.Add(SearchDir+F.Name);
end;
A keresés egészen addig tart, amíg az utolsó állományt is beolvastuk.
until FindNext(F)<>0;
Amikor a felhasználó duplán kattint a lista egy elemére, illetve a LoadDPR metódus meghívásakor ugyanazt a műveletet kell végrehajtanunk.
A ShellAPI unit, ShellExecute függvényének meghívásával arra utasítjuk az operációs rendszert, hogy a megadott project-et töltse be.
Ha a Delphi valamelyik verzióját már megnyitottuk, akkor a project általa kerül megnyitásra.
Amennyiben nincs megnyitva Delphi program, az operációs rendszer megnyitja azt, majd betölti a megadott project-et. Ha több Delphi verzió van számítógépünkön, akkor az kerül megnyitásra, amelyiket a DPR kiterjesztésű állományokhoz hozzárendeltük.
ShellExecute(0,'open',PChar('"'+Project+'"'),'',PChar(ExtractFilePAth(Project)),SW_SHOW);
A ShellExecute függvény paraméterei a következők: a függvényt hívó ablak azonosítója, művelet, a megnyitandó állomány, a megnyitandó állománynak átadandó paraméterek (amennyiben alkalmazás), munkakönyvtár, a megnyitott állomány megjelenítésének módja.