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 ____________________