Często piszemy programy, które użytkownik może wedle upodobań spersonalizować. Spersonalizowanie programu daje wiele korzyści, m.in. nie trzeba wielokrotnie ustawiać tych samych parametrów a tym samym usprawnia pracę z programem.Na potrzeby systemu Windows wymyślono pliki
ini, które w założeniu miały służyć zapisowi i odczytowi wartości do pliku tekstowego, coś na wzór prostej bazy danych. Z czasem pliki ini były zastępowane przez rejestr systemu, a obecnie przeważa zapisywanie danych konfiguracyjnych w plikach XML. Jednak pliki ini nie zostały wyparte z całkowitego użycia, a to za sprawą prostoty używania oraz swojej elastyczności.
Pliki ini nie mają zdefiniowanego formatu danych (!), a więc warto stosować się do zaleceń, które obowiązują przy ich stosowaniu.
Budowa pliku ini[sekcja1]
; komentarz1
zmienna1=wartosc1
zmienna2=wartosc2
[sekcja2]
; komentarz2
zmienna3=wartosc3
Komentarz w pliku jest opcjonalny.
Zalecenia przy pisaniu plików ini- stosuj komentarz zaczynający się średnikiem (nie hashem)
- w ramach tej samej sekcji nie dodawaj zmiennych o tej samej nazwie
- nie dodawaj sekcji o tych samych nazwach
- nazwa sekcji jest rozróżniana poprzez umieszczenie jej w nawiasach kwadratowych
- stosuj raczej gotowe klasy obsługujące pliki ini
- aby przejść do nowej linii dodaj znak ukośnika '\'
PrzykładW ramach ćwiczeń, napiszemy program, który będzie zapisywał pozycje formy
Left oraz
Top przy zamykaniu programu, a podczas uruchamiania będzie je odczytywał z pliku ini. Posłużymy się tu klasą
TIniFile. W tym celu do nagłówka programu musimy dołączyć
Na formę kładziemy dwa komponenty Label.
W zdarzeniu
OnShow aplikacji wpisujemy następujący kod: {viewonly=registered}
void __fastcall TForm1::FormShow(TObject *Sender) { int posx, posy;
TIniFile *Ini = new TIniFile(".\\plik.ini"); posx = Ini->ReadInteger("Position", "Posx", posx); posy = Ini->ReadInteger("Position", "Posy", posy);
delete Ini; Label1->Caption = IntToStr(posx); Label2->Caption = IntToStr(posy); Form1->Left = posx; Form1->Top = posy; }
|
Ten kod odpowiedzialny jest za odczytywanie poprzednich ustawień z pliku ini podczas uruchamiania programu.
Kilka słów wyjaśnienia. Plik ini zapisujemy w katalogu programu. Jeśli ominiemy kropkę w ciągu "
.\\plik.ini", to plik ini zostanie zapisany w katalogu systemowym. Musimy o tym pamiętać.
Natomiast jeśli usuniemy plik ini, to nie będzie można uruchomić programu (wyjątek w zdarzeniu OnShow), O tym także należy pamiętać. A więc właściwa kolejność postępowania przy plikach ini jest następująca: najpierw zapisać zmienne, a dopiero potem je odczytywać.
Zdarzenie
OnClose aplikacji (odpowiedzialne za zapis parametrów) uzupełniamy następującym kodem:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { int posx = Form1->Left; int posy = Form1->Top;
TIniFile *Ini = new TIniFile(".\\plik.ini"); Ini->WriteInteger("Position", "Posx", posx); Ini->WriteInteger("Position", "Posy", posy); delete Ini; }
|
Warto jeszcze wspomnieć dwa słowa o możlkiwościach klasy TIniFile. W ramach tej klasy mamy do dyspozycji następujące metody:
ReadString
WriteString
ReadInteger
WriteInteger
ReadBool
WriteBool
ReadSection
ReadSections
ReadSectionValues
EraseSection
DeleteKey
UpdateFile
ReadSections
ReadBinaryStream
ReadDate
ReadDateTime
ReadTime
ReadFloat
WriteBinaryStream
WriteDate
WriteDateTime
WriteFloatoraz właściwości
SectionExists
ValueExists
{/viewonly}