Delphi - Program futtatásainak számlálását végző komponens

forráskód letöltése
Nagyon sok esetben hasznos lehet ha tudjuk, hogy a programunkat egy adott gépen hányszor futtatták már, illetve mi volt az utolsó futtatás időpontja. Ebben a példában egy olyan komponenst készítünk, amely számlálja, hogy a program hányszor lett elindítva, és ezt kihasználva különböző funkciókat valósíthatunk meg vele. A számlálás csak akkor történik meg, ha a programot nem a Delphi-ből futtattuk, így csak azok az indítások számítanak, amelyek nem tesztelés céljából történtek.
A mellékelt példaprogram megnyitása előtt a RunCounter.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponenst a TComponent osztályból származtatjuk, mivel egy nem vizuális komponensről van szó. A számláló aktuális állását, valamint a futtatás időpontját a Registry adatbázisba fogjuk elmenteni, a megadott kulcs alá. Ezeket az értékeket a Refresh eljárás olvassa ki a Registry-ből a Count és a LastRun property-kbe.
Az új komponensben felülírjuk a Loaded eljárást, amelyben ellenőrizzük a számláló állását, valamint azt, hogy a programot tesztelés céljából, azaz Debugger-rel együtt indítottuk-e el. Ha ez utóbbi feltételezés igaz, akkor nem módosítjuk a számláló értékét. Ellenkező esetben megvizsgáljuk, hogy a számláló értéke nulla-e, vagyis a program most lett-e először elindítva (nem számítva persze a Delphi-ből történt indításokat). Ha igen, akkor meghívjuk a DoFirstRun eljárást, ami egy OnFirstRun eseményt generál. Minden n. indításkor generálunk egy OnEveryNRun eseményt. Az n értékét az EveryNRun property-ben adhatjuk meg.
procedure TRunCounter.Loaded;
begin
  inherited;
  Refresh;
  if not IsDebuggerPresent then begin
    if FCount=0 then DoFirstRun;
    Inc(FCount);
    if (FCount mod FEveryNRun)=0 then DoEveryNRun;
    UpdateCounter(FCount);
  end;
end;
A számláló és a dátum értékét az UpdateCOunter eljárás menti el a Registry adatbázisba, a megadott kulcs alá. A kulcsot a RegistryKey property-ben kell megadni, a gyökér kulcs nélkül. A gyökér kulcsot a RegistryRoot property-ben kell beállítani. Ha például a „HKEY_CURRENT_USER\Software\RunCounterExample” kulcs alá akarjuk menteni az értékeket, akkor a RegistryRoot property-ben az rkCurrentUser értéket kell megadni, míg a Registrykey property-ben csak a „Software\RunCounterExample” útvonalat. Amikor a registry-be írunk, vagy onnan olvassuk ki az adatokat, akkor nem közvetlenül a RegistryKey property értékét használjuk fel, hanem a GetRegistryKey függvénnyel kérdezzük le a kulcsot. Ez a függvény ellenőrzi, hogy a RegistryKey property-ben adtunk-e meg kulcsot, és ha nem (üres sztring), akkor a program EXE nevét fogja felhasználni (kiterjesztés nélkül). Ez nem túl biztonságos megoldás, mivel lehet két egyforma nevű program, természetesen csak különböző alkönyvtárakban. Bár ez nem túl valószínű, azért előfordulhat, például akkor, ha a project-eknek nem adunk nevet, hanem az alapértelmezett néven mentjük el őket (project1, project2, stb.).
function TRunCounter.GetRegistryKey: string;
begin
  if FRegistryKey<>'' then begin
    result:=FRegistryKey;
  end else begin
    result:='Software\'+ChangeFileExt(ExtractFileName(Application.ExeName), '');
  end;
end;