Delphi - Delphi projekteket fordító komponens készítése

forráskód letöltése
Készítünk egy komponenst, amely segítségével egy megadott könyvtárban, valamint annak alkönyvtáraiban elhelyezkedő Delphi projekteket fordíthatunk le. Azt, hogy a dpr állományok fordítása melyik Delphi verziónak a fordítójával történjen, azt szintén mi állíthatjuk be.
A mellékelt példaprogram megnyitása előtt a DPRCompiler.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens egy megadott könyvtárban és annak alkönyvtáraiban keres dpr kiterjesztésű, Delphi projekt állományokat. A megtalált Delphi projekteket lefordítja.
A komponens Directory tulajdonságában kell megadni annak a könyvtárnak a nevét, amelyben keresni szeretnénk. Ha a SearchSub értékét igazra állítjuk, akkor a keresés az alkönyvtárakra is kiterjed.
A Compiler tulajdonságban kell megadnunk a fordítóprogram elérési útját és nevét. Ez például a Delphi 7 esetében, alapértelmezett telepítési beállításokkal a következő:
c:\Program Files\Borland\Delphi7\Bin\dcc32.exe
A Delphi 5 és 6 fordítóprogramja ugyanezzel a névvel rendelkezik.
Ha megadtuk a könyvtárat és a fordítót, akkor a Compile metódus meghívásával elkezdődik a megtalált projektek lefordítása. Természetesen csak olyan projekteket lehet lefordítani, amelyek nem tartalmaznak hibákat.
A komponenst a TComponent osztályból származtatjuk.
A Directory és a Compiler két String típusú property lesz, a SearchSub pedig Boolean típusú. Ezekkel a létrehozásukon kívül semmi egyéb rendkívüli teendők nincs.
A Compile metódus meghívásakor el kell indítanunk egy rekurzív függvényt, amely alkalmas arra, hogy alkönyvtárakban is keressen.
procedure TDPRCompiler.Compile;
begin
  if (FDirectory<>'') and (FCompiler<>'') then
    ScanFiles(FDirectory);
end;
A ScanFiles metódus
procedure ScanFiles(Dir: String);
A dpr állományok kereséséhez a FindFirst – FindNext párost használjuk. Ha a keresés során egy könyvtárat találunk és a SearchSub metódus értéke is igazra van állítva, akkor rekurzív módon meghívjuk a ScanFiles eljárást, melynek paramétereként a megtalált könyvtár nevét adjuk.
if FSearchSub and (F.Name[1]<>'.') then
  ScanFiles(Dir+F.Name);
Ha viszont egy Delphi projektet találtunk, akkor azt lefordítjuk.
if LowerCase(ExtractFileExt(F.Name))='.dpr' then begin
  ShellExecute(0,'open',PChar('"'+Compiler+'"'),PChar('"'+Dir+F.Name+'"'),PChar(Dir),SW_HIDE);
end;
A fordítóprogram futtatásához a ShellExecute, API függvényt használjuk fel. Ehhez, a uses listában fel kell sorolnunk a ShellAPI unit nevét is.
A ShellExecute függvényben külön paraméterben kell megadnunk a futtatandó programot és paramétereit. A futtatandó program a Compiler property-ben megadott program lesz, a paraméter pedig a megtalált dpr állomány elérési útja és neve. A függvény utolsó előtti paramétere (PChar(Dir)) azt a könyvtárat jelenti, ahová a lefordított exe állomány kerül. Az SW_HIDE paraméter hatására a fordítóprogram csak a háttérben fut.