Program beállításainak tárolása Delphiben – 2.

 

Minden valamire való program megkíméli a felhasználót attól, hogy az egyszer már jól beállított paraméterek újra és újra meg kelljen adni minden futtatás során. Igaz, vannak kisebb programok, ahol erre nincs szükség, de a legtöbb esetben erre módot kell adni. Tekintsük most át, miként lehet elkészült programunkba olyan kódot illeszteni, mely megjegyzi az aktuális beállításokat.

 

Előző számunkban az INI fájlokról, azok használatáról, kezeléséről esett szó.

Most nézzünk meg, a „modern kor Windows”-a milyen lehetőséget kínál számunkra.

A Windows ’95 és azt követő operációs rendszerekben megjelent egy központi tárolási forma, mely az INI fájlokat hivatott leváltani.

 

A Windows Registry felépítése

 

A Registry egy hierarchikusan felépített rendszer, melyet legkönnyebben egy fájlrendszerhez tudnék hasonlítani. Ahogy merevlemezünkön létre tudunk hozni mappákat, azokba pedig almappákat, úgy a Windows Registry is kínál számunkra hasonló megoldást. A mappáknak megfelelő fogalom itt a kulcs. Az adatokat kulcsokba, illetve azok alkulcsaiba tudjuk rendezni. Az INI fájloknál láthattuk, hogy akár Integer, akár Float, akár String értéket írtunk ki, végeredményben mindig egy szöveges fájl tartalmát szerkesztettük. A Registryben már valóban olyan formában tárolódnak adataink, ahogy azokra hivatkozunk.

 

A Windows Registry öt fixen beépített főkulcsból áll, ehhez attól függően, hogy Windows NT/2000/XP-t vagy „asztali” Windows-t használunk, jöhet még egy hatodik. Ezen főkulcsok:

Þ    HKEY_CLASSES_ROOT: ebben a főkulcsban találhatóak elsősorban a fájlkiterjesztés társítások, valamint a Windows ún. COM rendszerével kapcsolatos adatok

Þ    HKEY_CURRENT_USER: Az éppen bejelentkezett felhasználó adatait tároljuk itt. Ennek segítségével könnyedén meg lehet valósítani, hogy minden felhasználó a saját beállításait készíthesse el anélkül, hogy nekünk foglalkozni kéne azzal, hogy ki van éppen bejelentkezve. A főkulcs alatt a telepített szoftverek (így magának a Windowsnak) a beállításai mellett néhány hardverrel kapcsolatos információ is megtalálható.

Þ    HKEY_LOCAL_MACHINE: Bizonyos adatok (főleg a hardver konfigurációkat leíró adatok) a felhasználótól függetlenül az egész számítógépre egységesen érvényesek. Egy programnál ez lehet például egy shareware program licensz kódja, vagy az a mappa, ahová a program telepítve lett.

Þ    HKEY_USERS: A számítógépet használó valamennyi felhasználó adata itt található meg. Amikor valaki bejelentkezik a Windows-ba, a hozzá tartozó alkulcs érhető el a HKEY_CURRENT_USER főkulcsban, éppen ezért ha csak nem szükséges, ebben a főkulcsban ne módosítsunk semmit.

Þ    HKEY_CURRENT_CONFIG: Az aktuális hardver konfigurációt leíró adatok helye. Ez is egy olyan főkulcs, ahová kezdő Registry kezelőként mi nem fogunk benézni.

 

A HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE főkulcs párosokból jól látható a Registry használatának nagy előnye: minden felhasználó teljesen függetlenül, külön állíthatja be ugyan azt a programot, anélkül, hogy minden felhasználónak külön telepítenie kellene azt. INI fájlok esetén ezt a problémát csak hosszas kódolással oldhatjuk meg.

A kulcsokon belül találhatóak a név-érték párok. Minden kulcsnak van egy ún. alapértelmezett értéke. Ezt a ’’ (üres string) néven tudjuk elérni Delphiben. Kitüntetett szerepe nincs, legtöbbször arra szokták használni, hogy egy adott kulcs név-érték párjai közül megjelöljünk egyet. Például ha valamelyik alkulcsban tároljuk el a programunk által eddig megnyitott dokumentumokat, akkor az alapértelmezett értékben tárolhatjuk el, hogy ezek közül melyiket nyitottuk meg legutóbb.

 

Adattípusok

 

A Registry alapvetően három féle adattípus tárolására alkalmas: karakterlánc, 32 bites egész és tetszőlegesen hosszú bináris adat. Ez utóbbinál fontos megemlíteni, hogy a Registry nagy része az operációs rendszer furása során a memóriából foglal helyet, így lehetőség szerint ne tároljuk a bináris adat segítségével fájlokat, nagyon adathalmazokat a Registry-ben, mert jelentősen ronthatjuk az operációs rendszer teljesítményét.

A Delphi ezeken felül szinte minden adattípusához kínál lehetőséget, melyet aztán a fent említett három alaptípus valamelyikében tárol el.

 

A TRegistry osztály

 

A Windows Registry kezelésére a Delphi a TRegistry osztályt nyújta számunkra.

A TRegistry a TObject közvetlen leszármazottja.

 

Mielőtt adatot írnánk be, vagy olvasnánk ki, meg kell nyitni azt a kulcsot, ahol az adat van. Ezt az OpenKey() metódussal tehetjük meg. Két paramétere van, az első a megnyitandó kulcs neve (kvázi az elérési útvonal), valamint egy boolean érték. Ez a boolean érték ha igaz, akkor a Windows létre fogja hozni a megadott kulcsot, ha nem létezik. Ha a kulcsot meg sikerült nyitni, úgy a metódus true értékkel tér vissza, ha valamilyen hiba lépett fel, úgy false értékkel.

A kulcsnévben nem kell megadnunk a főkulcsot. Ezt egy külön tulajdonságban jelöljük ki. Ez a RootKey. Ez egy egész típusú adat, melyhez a fent említett főkulcs nevekkel egyező nevű konstansok tartoznak.

Programjainkban leginkább a HKEY_CURRENT_USER főkulcsot fogjuk használni. Létezik ezen belül egy Software kulcs, ide „illik” (mondhatnám kell) létrehozni egy alkulcsot programjainkhoz. A könnyebb átláthatóság és rendezettség kedvéért a Software alkulcsaként (cég)nevünket adjuk meg és ez alá hozzunk létre egy, a programhoz tartozó alkulcsot. Például: „\Software\GSC\Program neve\”. A kulcsnevekben használhatunk space és ékezetes karaktereket is, de lehetőség szerint maradjunk az angol elnevezéseknél.

 

Ha sikerült megnyitnunk egy kulcsot, elkezdhetünk írni bele, vagy olvasni belőle.

A három alap adattípushoz használható metódusok:

ReadString, ReadBinaryData, ReadInteger, valamint WriteString, WriteBinaryData és WriteInteger. Ezen felül mint azt már említettem, egyéb Delphi adatípusok írására/olvasására is lehetőségünk van: ReadBool, ReadCurrency, ReadDate, ReadDateTime, ReadFloat, ReadTime és ezeket WriteXXX megfelelői.

Az olvasó metódusoknak a ReadBinaryData kivételével egy bemenő paraméterük van, az értéknek a neve. Visszatérési értékük az olvasott adat. A ReadBinaryData esetében két további paraméter is van: a második paraméterrel adjuk meg a buffert, amibe olvassuk a bájtokat (tipikusan egy tömbbe), a harmadik paraméter pedig a buffer méretét jelöli (mennyi adatot lehet maximum beolvasni a bufferbe). Visszatérési értéke a ténylegesen olvasott bájtok száma.

Ezekből tehát azt szűrhetjük le, hogy az INI fájloknál használható alapértelmezett érték paraméter itt sajnos nem létezik.

Az adatok kiírását végző metódusok paraméterei is egységesek megint csak a WriteBinaryData kivételével. Első paraméterként az érték nevét kell megadnunk, másodiknak pedig a kiírandó adatot. A WriteBinaryData esetében az érték neve után a kiírandó bájtokat tartalmazó buffert kell megadni, majd a kiírandó bájtok számát a harmadik paraméterben.

 

A Registry és a biztonság

 

Mivel minden beállítás, minden adat egy helyen kerül tárolásra, ezért jogosan merülhet fel az igény, hogy az arra nem jogosultak ne módosíthassák a Registry bizonyos részeit, esetleg ne is láthassák. Mint ahogyan a mappákhoz is lehetőségünk van megadni, hogy ki milyen módon férhessen hozzá, úgy a Registry-nél is igaz ez. Egy általános felhasználó tipikusan csak olvasni tudja a HKEY_LOCAL_MACHINE legtöbb alkulcsának bejegyzéseit.

Amikor hozzáférünk a Registry-hez, meg kell adnunk, hogy milyen műveleteket akarunk vele végezni. Ehhez az alábbi előre definiált konstansokat használhatjuk:

KEY_QUERY_VALUE: lekérhetjük az egyes alkulcsok adatainak értékeit.

KEY_ENUMERATE_SUB_KEYS: lekérhetjük egy kulcs alkulcsainak neveit (erről bővebben a következő számban)

KEY_SET_VALUE: módosíthatjuk egy adat értékét.

KEY_CREATE_SUB_KEY: létrehozhatunk alkulcsokat egy-egy kulcs alá.

KEY_READ: a KEY_QUERY_VALUE és a KEY_ENUMERATE_SUB_KEYS együttes hatása

KEY_WRITE: a KEY_SET_VALUE és a KEY_CREATE_SUB_KEY együttes hatása.

KEY_ALL_ACCESS: ez az alapértelmezett hozzáférési mód, teljes hozzáférést kérhetünk ezzel a Registry-hez.

A hozzáféréseket kulcs szinten tudja szabályozni a Windows, így előfordulhat, hogy noha meg tudtuk nyitni a Registry-t írásra, egyes adatokat mégsem tudunk módosítani.

 

A fenti konstansokat a TRegistry Access tulajdonságával tudjuk beállítani, vagy a konstruktor opcionális paraméterével:

Reg := TRegistry.Create;

Reg.Access := KEY_WRITE;

 

vagy

 

Reg := TRegistry.Create(KEY_WRITE);

 

Példa

 

Most nézzünk egy nagyon leegyszerűsített példát a Registry használatára a múltkori INI fájlos példához hasonlóan:

Indítsunk egy új projektet és dobjunk a form-ra két gombot. A uses sorba vegyük fel a Registry unit-ot, majd az egyik gomb OnClick eseménykezelőjébe írjuk be a következőket:

procedure TForm1.Button1Click(Sender: TObject);

var

  Reg : TRegistry;

begin

  Reg := TRegistry.Create;

  try

    with Reg do

      begin

        RootKey := HKEY_CURRENT_USER;

 

        if OpenKey('\Software\GSC\CodexCikk\',true) then

          begin

            WriteString('Caption','Program');

            WriteInteger('Left',50);

            WriteInteger('Top',150);

          end;

      end;

  finally

    Reg.Free;

  end;

end;

 

Miután sikerült megnyitnunk a „\Software\GSC\CodexCikk\” kulcsot a HKEY_CURRENT_USER főkulcsban, kiírunk egy string és egy integer adatot.

A második gombra klikkelve ezeket olvassuk vissza és alkalmazzuk a főformra:

 

procedure TForm1.Button2Click(Sender: TObject);

var

  Reg : TRegistry;

begin

  Reg := TRegistry.Create;

  try

    with Reg do

      begin

        RootKey := HKEY_CURRENT_USER;

       

        if OpenKey('\Software\GSC\CodexCikk\',false) then

          begin

            Caption := ReadString('Caption');

            Left := ReadInteger('Left');

            Top := ReadInteger('Top');

          end;

      end;

  finally

    Reg.Free;

  end;

end;

 

Azt hiszem ez az egyszerű példa nem igényel különösebb magyarázatot.

 

A jövő hónapban tovább foglalkozunk még a Registry használatával, addig is tartsuk szem előtt, hogy egy óvatlan mozdulattal komolyabb károkat is okozhatunk az operációs rendszerben, így egyenlőre tanulásunk és próbálgatásaink során csak a fent említett „\Software\Nevem\Programom\” kulcsba írjunk a HKEY_CURRENT_USER főkulcsban.

 

Geiger Tamás - info@gsc.hu