[slikom] Delphi - Smestanje podesavanja programa u .ini fajl

  • From: _ Rajko _ <r.tomic@xxxxxxxxx>
  • To: <slikom@xxxxxxxxxxxxx>
  • Date: Thu, 29 Nov 2007 13:30:57 +0100


Ukoliko je potrebno da vasa aplikacija poseduje podesavanja koja treba 
pamtiti i nakon zatvaranja programa, onda imate na raspolaganju vise 
mogucnosti, a najpoznatije su koriscenje Registry baze ili kreiranje .INI 
fajla. Obicni tekstualni INI fajl predstavlja sigurno jednostavniju soluciju 
u slucaju da nemate mnogo ovih podataka. INI fajlovi predstavljaju format 
fajlova zasnovan na obicnom plain tekstu, a sluze za smestanje aplikacionih 
konfiguracionih podataka u formatu koji se lako preureduje, i citljiv je 
svim jednostavnim parserima.

Vecini ljudi koji koriste Windows, sigurno je poznat bar jedan .INI fajl, a 
najpoznatiji su svakako sistemski fajlovi WIN.INI i System.INI (nalaze se 
unutar Windows foldera). Cak i Windows smesta vazne informacije kao sto su 
konfiguracioni podaci o samom operativnom sistemu u obicnom plain tekst 
fajlu, koji se lako brise, modifikuje i pregleda. Cak iako u 32-bitnim 
verzijama Windows-a Microsoft preporucuje koriscenje Registry-ja za 
smestanje specificnih podataka o konfiguraciji aplikacije, u mnogim 
slucajevima naci cete da je koriscenje .INI fajla mnogo brze i sigurnije.

Jedna od jednostavnih upotreba INI fajlova kao mehanizma za cuvanje 
statusnih podataka, jeste za cuvanje informacija o velicini i lokaciji formi 
ukoliko zelite da se forme nakon ponovnog pokretanja programa nalaze na 
mestu gde su se nalazile prilikom zatvaranja programa. Generalno govoreci, 
sve sto inace smestate u Registry mozete smestiti u INI fajl.

Inicijalizacioni ili konfiguracioni fajl (.INI) je tekst fajl sa limitom 
velicine od 64Kb, koji je podeljen u sekcije, od kojih svaka moze da nema 
nijedan ili ima vise kljuceva. Primer:


[Naziv_Sekcije]
Naziv_kljuca=vrednost
;komentar
Naziv_kljuca=vrednost
...


Nazivi sekcija se smestaju u uglaste zagrade i moraju poceti od nulte kolone 
svake linije. Nazivi sekcija i kljuceva su neosetljivi na upotrebu 
malih/velikih slova i ne mogu sadrzavati prazne karaktere. Nazivi kljuceva 
praceni su znakom jednako ("="), i opciono su okruzeni praznim karakterima, 
koji se inace ignorisu. Ukoliko se recimo ista sekcija pojavi dva puta (ili 
vise) u istom fajlu, ili se isti kljuc pojavi vise od jedanput u istoj 
sekciji, tada poslednje pojavljivanje ima prednost. Kljuc moze da sadrzi 
string, intedzer ili bulovu vrednost.

Zanimljivo je da i sam Delphi koristi INI fajl format za mnoge potrebe. Na 
primer, .DSK fajlovi (desktop podesavanja) imaju format kao upravo opisan.






Delphi obezbeduje TIniFile klasu sa metodama koje su dizajnirane za potrebe 
cuvanja i iscitavanja informacija specificnih za odredeni program i 
podesavanja, unutar INI fajlova. Klasa TIniFile deklarisana je unutar unit-a 
inifiles.pas. Pre nego sto pocnemo rad sa TIniFile kontrolom potrebno je da 
kreiramo instancu klase:


uses inifiles;
...
var
  IniFile : TIniFile;
begin
  IniFile := TIniFile.Create('mojprogram.ini');


Ovaj programski kod kreira IniFile objekt i dodeljuje "mojprogram.ini" 
jedinoj osobini klase - FileName osobini - koja se koristi za odredivanje 
naziva INI fajla koji cete koristiti. Ako deklarisete INI fajl na ovaj 
nacin, onda ce se on smestiti u \Windows folder. Bolje resenje za cuvanje 
aplikacionih podataka je da INI fajl smestite u aplikacioni folder - zato 
kod metode Create odredite punu putanju i naziv INI fajla:


  IniFile := TIniFile.Create(ChangeFileExt(
             Application.ExeName,'.ini'));


Klasa TIniFile poseduje nekoliko metoda za "citanje". Metoda ReadString cita 
string vrednosti iz kljuceva, metode ReadInteger, ReadFloat i slicne, 
koriste se za citanje brojcanih podataka iz kljuceva. Sve metode za citanje 
imaju podrazumevane vrednosti koje ce se koristiti ukoliko ne postoje ulazni 
podaci. Na primer, metoda ReadString se deklarise kao:


function ReadString
(const Section, Ident, Default: String):
String; override;


Klasa TIniFile za svaku metodu "citanja" ima odgovarajucu metodu "upisa". 
Drugim recima, to su metode WriteString, WriteBool, WriteInteger, itd. Na 
primer, ukoliko zelite da program "zapamti" naziv poslednjeg korisnika, i 
sve potrebne koordinate forme, oformicemo sekciju nazvanu "Poslednji", sa 
kljucnim recima "Korisnik" i "Datum"; i drugu sekciju zvanu "Polozaj" sa 
kljucevima "Top", "Left", "Width" i "Height". Ovde treba reci da kljuc 
nazvan "Korisnik" sadrzi string vrednost, "Date" koja sadrzi TDateTime 
vrednost, a svi kljucevi u sekciji "Polozaj" sadrze intedzer vrednosti.

Dogadaj OnCreate glavne forme je perfektno mesto za smestaj programskog koda 
potrebnog za pristup vrednostima u inicijalizacionom fajlu aplikacije:


procedure TForm1.FormCreate(Sender: TObject);
var
  IniFile  : TIniFile;
  PosKorisnik : string;
  PosDatum : TDateTime;
begin
  IniFile := TIniFile.Create
  (ChangeFileExt(Application.ExeName,'ini'));

  //ako nema posl. korisnika - prazan string
  PosKorisnik :=
  IniFile.ReadString('Poslednji','Korisnik','');
  //ukoliko nema korisnika sa datumom,
  vraca se danasnji
  PosDatum :=
  IniFile.ReadDate('Poslednji', 'Datum', Date);

  //prikaz poruke
  ShowMessage('Ovaj program je prethodno koristio '
              + PosKorisnik + ' dana '
              + DateToStr(PosDatum));

  Form1.Top :=
  IniFile.ReadInteger
          ('Polozaj,'Top', Form1.Top);
  Form1.Left :=
  IniFile.ReadInteger
          ('Polozaj','Left', Form1.Left);
  Form1.Width :=
  IniFile.ReadInteger
          ('Polozaj','Width', Form1.Width);
  Form1.Height :=
  IniFile.ReadInteger
          ('Polozaj','Height', Form1.Height);

  IniFile.Free;
end;
 Nakon sto smo se upoznali kako se citaju kljucevi iz INI fajlova, 
objasnicemo i kako se vrsi upis podataka u INI fajlove. Najidealnije mesto 
za snimanje informacija o programu je na zatvaranju programa, tj. unutar 
dogadaja OnClose glavne forme. Pre nego sto se aplikacija prekine, 
zapisacemo trenutnu poziciju prozora i informaciju o poslednjem korisniku: 
procedure TForm1.FormClose
(Sender: TObject; var Action: TCloseAction);
var
  IniFile  : TIniFile;
begin
  IniFile := TIniFile.Create
  (ChangeFileExt(Application.ExeName,'ini'));

  IniFile.WriteString
  ('Poslednji', 'Korisnik', 'Taj_i_Taj');
  IniFile.WriteDate
  ('Poslednji', 'Datum', Date);

  With IniFile, Form1 do
  begin
    WriteInteger('Polozaj','Top', Top);
    WriteInteger('Polozaj','Left', Left);
    WriteInteger('Polozaj','Width', Width);
    WriteInteger('Polozaj','Height', Height);
  end;

  IniFile.Free;
end;
Postoji nekoliko metoda koje sluze za operaciju sa celim sekcijama unutar 
INI fajlova. Na primer metoda EraseSection sluzi za brisanje cele jedne 
sekcije unutar INI fajla. Metode ReadSection i ReadSections popunjavaju 
objekat TStringList sa nazivima svih sekcija (i nazivima kljuceva) u INI 
fajlu. Da napomenemo i to da slicna klasa postoji i u registry unit-u - 
klasa TRegIniFile - klasa koja omogucava laki pristup sistemskoj 
registracionoj bazi i bez potrebe za poznavanjem strukture samog 
Registry-ja. Klasa TRegIniFile koristi slican funkcionalni pristup Registry 
bazi, otprilike kako to radi i TIniFile za pristup INI fajlu. Klasa TIniFile 
koristi Windows API interfejs, koji namece limit od 64KB po INI fajlu. 
Ukoliko vam je potrebno da sacuvate vise od 64KB podataka, trebalo bi da 
koristite klasu TMemIniFile, koja nema ovakav limit. Jos jedan problem koji 
moze da iskrsne je ako imate sekcije koje sadrze vrednosti u kolicini vecoj 
od 8 kilobajta. Metod ReadSection koristi API funkciju 
GetPrivateProfileString sa baferom od 8 kilobajta. Jedan od nacina da resite 
problem jeste da napisete sopstvenu verziju ReadSection metode. Cinjenica da 
svako moze da pristupi i modifikuje INI fajlove govori da integritet 
podataka unutar INI fajlova ne moze biti garantovan. Ipak, mozda je za utehu 
i to sto se i baza Registry takode moze modifikovati, pa zato nema velike 
prednosti u ovom pogledu.


                                                    _ Rajko _ 



____________________

Za prijavu na ovu listu poslati poruku na adresu: 
<slikom-request@xxxxxxxxxxxxx> i u polju za tekst upisati, subscribe
Za odjavu sa ove liste poslati poruku na adresu: <slikom-request@xxxxxxxxxxxxx> 
i u polju za tekst upisati, unsubscribe
Za pristup arhivi poruka koristiti adresu: 
//www.freelists.org/archives/slikom/ 
Login: username=slikom  Password=mokils

____________________

Other related posts:

  • » [slikom] Delphi - Smestanje podesavanja programa u .ini fajl