Delphi - Rendszer tulajdonságok beállítása komponensen keresztül

forráskód letöltése

A Windows rengeteg beállítási lehetőséget tartalmaz, bár ezek egy része el van rejtve a felhasználók elől. Nagyon gyakran találkozunk azonban olyan kisalkalmazásokkal, melyekkel ezeket az opciókat módosíthatjuk, a saját igényeinknek megfelelően. Ebben a példában egy olyan komponenst készítettünk, amely több mint 40 beállítási lehetőséget tartalmaz, melyekkel a Windows egyes tulajdonságait módosíthatjuk. A mellékelt példaprogram megnyitása előtt a ExplorerOptions.pas-ban lévő komponenst telepítenie kell a Delphi alá.

Ahogy a komponens neve is mutatja, ezek a beállítások elsősorban az Explorer-re vonatkoznak, ha viszont figyelembe vesszük azt, hogy a Windows egész felületéért az Explorer a felelős, akkor ez már nem is hangzik rosszul.

A beállítások négy csoportba soroltuk, melyekhez négy property is tartozik:
  • RecentDocsOptions: az utoljára megnyitott dokumentumokkal kapcsolatos beállítások.
  • NetworkOptions: hálózati tulajdonságok.
  • StartMenuOptions: a Start Menü-vel kapcsolatos beállítások.
  • MiscOptions: minden, ami az előző három csoportba nem fért bele.
Ezen a négy property-n kívül van még egy property, ez az AutoUpdate. Ha ennek értéke igaz, akkor a módosítások azonnal tárolásra kerülnek. Minden beállítás egyébként a Registry adatbázisban lesz tárolva, a „HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer” kulcs alatt.
A legtöbb beállítás egy logikai érték, de a RecentDocsOptions property-ben van egy olyan is, ami egy számot tartalmaz. Emiatt ennek a property-nek egy külön osztályt hoztunk létre, melyet a TPersistent osztályból származtatunk.
A Registry-ben az adatokat a TRegistry osztályon keresztül érjük el, de létrehozunk néhány olyan függvényt, amellyel megkönnyítjük ezt.
A GetBoolOption függvény egy logikai értéket kérdez le úgy, hogy ha az értéket nem találja, akkor a Default paraméterben megadott értékkel tér vissza. Ugyanígy működik a GetIntegerOption függvény is, de itt értelemszerűen a visszatérési érték egy egész szám.
A SetBoolOption eljárás egy logikai értéket állít be. Ha egy érték hiányzik a Registry-ből, akkor annak értéke automatikusan hamis, ezért az AllowDelete paraméterrel megadhatjuk, hogy ha az érték hamis, akkor törölje az azonosítót a Registry-ből. Például az smRun opcióval a Start Menü Futtatás menüpontját engedélyezhetjük, vagy tilthatjuk le. A komponensben ezt igaz illetve hamis értékkel szabályozhatjuk, viszont a Registry-be pont az ellenkezőjét kell megadni, tehát azt, hogy le legyen-e tiltva a menüpont, vagy sem. Az opcióhoz a „NoRun” azonosító tartozik, amely igaz érték mellett eltünteti, hamis érték mellett viszont engedélyezi a menüpontot. Az alapértelmezett az, hogy látszik a menüpont, ezért ha az azonosító nincs a Registry-ben, akkor a menüpont látszik. Tehát a lényeg, hogy ha a Run opció igaz, akkor a NoRun hamis, és ez utóbbi kerül a Registry-be. Ez a szabály az összes többi opcióra is vonatkozik, tehát ha a komponens property-jében az opció értéke igaz, akkor a Registry-be hamis érték kerül, mert ott az ellenkezőjét kell megadni. Ha megnézzük a GetBoolOption eljárást, akkor abban látható, hogy a Registry-ből kiolvasott értéket az eljárás a fordítottjára változtatja:
result:=not FRegistry.ReadBool(optname);
A beállítások értékét a Refresh eljárás olvassa ki a Registry-ből. Ez a MiscOptions esetében a következőképpen néz ki:
    FMiscOptions:=[];
    for i:=0 to MAX_MISCOPTIONS do begin
      if GetBoolOption(MISCOPTIONSNAME[i], true) then
        FMiscOptions:=FMiscOptions+[TExpOption(i)];
    end;
A MAX_MISCOPTIONS konstans a property-ben tárolt opciók számát adja meg. A MISCOPTIONSNAME tömb konstansban pedig az opció Registry-ben megadott azonosítója szerepel.

A beállítások tárolása az Update eljárásban történik meg. Ez ugyanúgy egy ciklusban történik, mint a kiolvasás. Itt is megfigyelhető, hogy a második paraméterben az eltárolandó érték akkor igaz, ha az opció nem lett beállítva. Ha tehát a fent említett smRun opció nincs beállítva, akkor az annak megfelelő „NoRun” azonosító értéke igaz lesz.
    for i:=0 to MAX_MISCOPTIONS do begin
      SetBoolOption(MISCOPTIONSNAME[i], not (TExpOption(i) in FMiscOptions), true);
    end;
Amikor egy property értékét módosítjuk, akkor meghívódik a Change eljárás. Ez akkor fogja meghívni az Update eljárást, ha az AutoUpdate property értéke igaz. Azt fontos tudni, hogy egyes opciók érvénybe lépéséhez nem elég azt tárolni a registry-ben, hanem egy ki- és bejelentkezés is szükséges.