Sign in Join
Wiki copytemporary

Using INI Files/pl: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Using INI Files/pl

OldNewLine
1+Używanie plików INI
2+
3+# INI Files
4+
5+## Basic Information
6+
7+Pliki INI to pliki tekstowe, które przechowują pary klucz/wartość pogrupowane w sekcje.
8+
9+Pliki INI mogą być używane do łatwego zapisywania ustawień użytkownika. Możesz ułatwić sobie z nimi pracę za pomocą [modułu IniFiles](http://www.freepascal.org/docs-html/fcl/inifiles/index.html) i [klasy TINIFile](http://www.freepascal.org/docs-html/fcl/inifiles/tinifile.html). Moduł IniFiles jest częścią FCL.
10+
11+Obecnie obsługiwane są tylko pliki INI zgodne z bardziej restrykcyjnym formatem plików ini systemu Windows, w których użycie [sekcji](http://en.wikipedia.org/wiki/INI_file#Sections) jest obowiązkowe, a komentarze mogą zaczynać się tylko od średnika. Aby uzyskać więcej ogólnych informacji o plikach ini, [przeczytaj to](http://en.wikipedia.org/wiki/INI_file).
12+
13+## Pliki INI
14+
15+Pliki INI używają nawiasów do tworzenia i oznaczania **Sekcji**, które zawierają **klucze** i **wartości** klucza. Klucz i odpowiadająca mu wartość są oddzielone znakiem równości (Klucz=Wartość).
16+
17+Nazwy sekcji umieszczane są w nawiasach kwadratowych (\[Sekcja\]).
18+
19+Komentarze są dozwolone i są oznaczone średnikiem (;) na początku linii.
20+
21+Przykładowy plik ini:
22+
23+``` ini
24+; Komentarz. Początek pliku INI
25+
26+; puste wiersze są ignorowane
27+
28+[General]
29+; Tu rozpoczyna się sekcja ogólna
30+Compiler=FreePascal
31+; Key Compiler and value FreePascal
32+; Kompilator kluczy i wartość FreePascal
33+```
34+
35+## Prosty przykład
36+
37+W praktyce musisz mieć możliwość utworzenia pliku ini w czasie wykonywania programu, gdy on nie istnieje, i ustawienia domyślnych wartości wpisów. Oto przykład przeznaczony do częściowego wklejenia do nowej aplikacji Lazarus. Definiujemy i deklarujemy rekord, który zawiera niektóre z naszych ustawień, mamy pole wyboru, które reprezentuje inne ustawienie. Aby uprościć, jedynym ustawieniem, które możemy tutaj zmienić, jest pole wyboru. Jego zdarzenie wywoływane „przy zmianie” wartości, wyzwala zapis pliku ini, za każdym razem aktualizując dane. Do formularza dodaliśmy również pole Memo, aby w łatwy sposób pokazać, co się dzieje. Dodane są prototypy nowych metod do interfejsu formularza. Dodany jest moduł 'inifiles' w sekcji implementacji.
38+
39+``` pascal
40+interface
41+.......
42+
43+type SettingRec = record
44+ X : integer;
45+ MyName : string;
46+end;
47+....
48+
49+implementation
50+....
51+uses IniFiles;
52+const
53+ IniFile = 'settings.ini';
54+....
55+procedure TForm1.ReadSettings;
56+var
57+ Sett : TIniFile;
58+begin
59+ Sett := TIniFile.Create(IniFile);
60+ Settings.X:= Sett.ReadInteger('Main', 'X', 1); // (Sekcja, Klucz, Domyślna)
61+ Settings.MyName := Sett.ReadString('Main', 'MyName', 'Davo');
62+ CheckBox1.Checked := Sett.ReadBool('Main', 'CheckBox', true);
63+ Sett.Free;
64+end;
65+
66+procedure TForm1.WriteSettings;
67+var
68+ Sett : TIniFile;
69+begin
70+ Sett := TIniFile.Create(IniFile);
71+ Sett.WriteBool('Main', 'CheckBox', CheckBox1.Checked);
72+ Sett.WriteInteger('Main', 'X', Settings.X);
73+ Sett.WriteString('Main', 'MyName', Settings.MyName);
74+ Sett.Free;
75+end;
76+```
77+
78+Zauważ, że nie sprawdzamy, czy plik ini jest obecny, czy nie, to nie ma znaczenia. Jeśli nie ma określonego klucza (lub nie ma całego pliku), to podczas odczytu używana jest wartość domyślna, więc użyj domyślnej, która działa na początku. Wszystkie nasze dane są zapisywane i odczytywane z sekcji „Main” pliku ini. Warto jest pogrupować powiązane ze sobą dane w osobne sekcje. Rzeczywista nazwa sekcji nie ma znaczenia, ale musi być spójna.
79+
80+Następnie potrzebujemy kilku metod, aby „przećwiczyć” powyższy kod. Oczywiście, możesz użyć używasz Lazarus Object Inspector do tworzenia FormCreate() i CheckBeSillyChange(), ale ich zawartość skopiuj stąd:
81+
82+``` pascal
83+procedure TForm1.FormCreate(Sender: TObject);
84+begin
85+ ReadSettings;
86+ ShowSettings;
87+end;
88+
89+procedure TForm1.CheckBox1Change(Sender: TObject);
90+begin
91+ WriteSettings;
92+ ShowSettings;
93+end;
94+
95+procedure TForm1.ShowSettings;
96+begin
97+ Memo1.Clear;
98+ Memo1.Append('X=' + Settings.X.tostring);
99+ Memo1.Append('MyName=' + Settings.MyName);
100+ Memo1.Append('CheckBox ' + Booltostr(CheckBox1.Checked, true));
101+end;
102+
103+procedure TForm1.CheckBox1Change(Sender: TObject);
104+begin
105+ WriteSettings;
106+ ShowSettings;
107+end;
108+```
109+
110+Plik ini może (i musi mieć możliwość) zmienić kolejność prezentowania jego danych, więc nie można polegać na konkretnych numerach wierszy.
111+
112+## Przykład odczytu pliku ini
113+
114+Poniższa aplikacja konsolowa pokazuje, jak czytać pliki ini. Aby to przetestować, utwórz plik ini o nazwie „DB.ini” i zawartości jak podano poniżej, a następnie zapisz go w tym samym folderze co program wykonywalny.
115+
116+``` ini
117+[DB-INFO]
118+Author=Adam
119+Pass=secret
120+MaxAttempts=5
121+DBFile=C:\Money.dat
122+```
123+
124+Kod do odczytu tego pliku ini wygląda tak:
125+
126+``` pascal
127+Program IniReadExample;
128+
129+{$mode objfpc}{$H+}
130+
131+uses
132+ classes, sysutils, IniFiles;
133+
134+const
135+ C_DB_SECTION = 'DB-INFO';
136+
137+var
138+ INI: TINIFile;
139+ Author, Pass, DBFile: String;
140+ MaxAttempts: integer;
141+ PassEnter: String;
142+ TryCount: integer;
143+begin
144+ // Utwórz obiekt, określając plik ini, który zawiera ustawienia
145+ INI := TINIFile.Create('DB.ini');
146+
147+ // Umieść kod odczytujący plik INI w bloku try/finally, aby zapobiec wyciekom pamięci
148+ try
149+ // Demonstruje odczytywanie wartości z pliku INI.
150+ Author := INI.ReadString(C_DB_SECTION,'Author','');
151+ Pass := INI.ReadString(C_DB_SECTION,'Pass','');
152+ DBFile := INI.ReadString(C_DB_SECTION,'DBFile','');
153+ MaxAttempts := INI.ReadInteger(C_DB_SECTION,'MaxAttempts',1);
154+
155+ // Zrób coś z odczytanymi wartościami; np. zweryfikuj hasło
156+ if Pass <> '' then
157+ begin
158+ // Zapytaj o hasło, maksymalna ilość prób = MaxAttempts
159+ TryCount := MaxAttempts;
160+ repeat
161+ write('Proszę wprowadzić hasło; ', TryCount, ' pozostało prób: ');
162+ readln(PassEnter);
163+ dec(TryCount);
164+ if (PassEnter <> Pass) and (TryCount > 0) then
165+ writeln('Błędne hasło, spróbuj ponownie');
166+ until(PassEnter = Pass) or (TryCount = 0);
167+
168+ // Czy podano prawidłowe hasło?
169+ if PassEnter = Pass then
170+ writeln('Hasło jest prawidłowe.')
171+ else
172+ writeln('Nieprawidłowe hasło i osiągnięto maksymalną liczbę prób hasła.');
173+ end;
174+
175+ writeln('Autor : ', Author);
176+ writeln('Plik : ', DBFile);
177+ writeln('Hasło : ', Pass);
178+ writeln('Maksymalna liczba prób hasła: ', MaxAttempts);
179+ writeln;
180+ write('Naciśnij Enter, aby zamknąć...');
181+ Readln;
182+
183+ finally
184+ // Po użyciu pliku ini należy go zwolnić, aby zapobiec wyciekom pamięci.
185+ INI.Free;
186+ end;
187+end.
188+```
189+
190+## Obsługa reprezentacji ciągów wartości logicznych
191+
192+Funkcje TiniFile.ReadBool i TIniFile.WriteBool używają wartości „0” (fałsz) i „1” do reprezentowania wartości logicznych w pliku ini. Możesz to zmienić na dowolny inny tekst:
193+
194+``` pascal
195+[...]
196+ iniFile.Options := iniFile.Options + [ifoWriteStringBoolean];
197+ iniFile.BoolTrueStrings := ['true'];
198+ iniFile.BoolFalseStrings := ['false'];
199+[...]
200+```
201+
202+ReadBool nie rozróżnia wielkości liter, teksty „true”, „true” i „TRUE” są interpretowane jako prawda logiczna.
203+
204+TIniFile.BoolTrueStrings i TIniFile.BoolFalseStrings to tablice łańcuchów, można określić wiele wartości:
205+
206+``` pascal
207+[...]
208+ iniFile.Options := iniFile.Options + [ifoWriteStringBoolean];
209+ iniFile.BoolTrueStrings := ['true','yes','tak','1'];
210+ iniFile.BoolFalseStrings := ['false','no','nie','0'];
211+[...]
212+```
213+
214+Podczas odczytu z pliku ini, każda z wartości tablicy spowoduje, że ReadBool zwróci poprawną wartość logiczną, podczas zapisywania pliku ini używana jest pierwsza wartość odpowiedniej tablicy.
215+
216+> **Warning:** Aktualna implementacja TIniFile.ReadBool działa tak, że zachowuje się dziwnie, gdy ustawiona jest opcja ifoWriteStringBoolean. Gdy nie określono tablic BoolTrueStrings i BoolFalseStrings, to TIniFile.ReadBool i TIniFile.WriteBool zachowują się asymetryczne: TIniFile.ReadBool będzie oczekiwać „0” lub „1”, a TIniFile.WriteBool zapisze „true” lub „false”. Doprowadzi to do zaskakującego zachowania polegającego na tym, że funkcja TIniFile.ReadBool nie będzie w stanie odczytać z powrotem wartości „true”, jeśli zostały zapisane przez funkcję TIniFile.WriteBool. TIniFile.ReadBool w tej sytuacji zawsze zwróci wartość logiczną false, nawet jeśli w pliku ini wartość ta jest ustawiona na „true”. Jeśli używasz opcji ifoWriteStringBoolean i to zachowanie nie jest pożądanym zachowaniem, nie zapomnij określić tablic TIniFile.BoolTrueStrings i TIniFile.BoolFalseStrings.
217+
218+## Obiekty do poznania
219+
220+W klasie TINIFile istnieje wiele różnych właściwości, procedur i funkcji, których można użyć.
221+
222+**CaseSensitive** - Ta właściwość pozwala określić, czy w kluczach i sekcjach jest rozróżniana wielkość liter, czy nie. Domyślnie nie są.
223+
224+**ReadString** - Ma 3 stałe parametry. Pierwszy to sekcja, w której należy szukać. Drugi jest kluczem do wyszukania. Trzeci jest domyślnym ciągiem na wypadek, gdyby szukany klucz i/lub sekcja nie zostały znalezione.
225+
226+**WriteString** - Również zawiera trzy stałe parametry. Pierwszy to sekcja. Drugi to klucz, a ostatni to wartość, którą chcesz wpisać. Jeśli klucz i sekcja już istnieją, klucz zostanie nadpisany nową wartością.
227+
228+**ReadSections** - Pozwala pobrać sekcje z pliku INI i umieścić je w klasie TStrings (lub TStringList z operatorem AS).
229+
230+**DeleteKey** - Usuń istniejący klucz z określonej sekcji.
231+
232+**EraseSection** - Usuń sekcję i wszystkie jej dane.
233+
234+Procedur i funkcji jest więcej, ale to wystarczy, aby zacząć.
235+
236+### Dokumentacja referencyjna
237+
238+Tutaj jest: [Dokumentacja Free Pascal na temat plików INI](http://lazarus-ccr.sourceforge.net/docs/fcl/inifiles/index.html)
239+
240+# Zobacz także
241+
242+- [[HistoryFiles|Historia plików]]
243+- [[XML Tutorial|Poradnik o XML]]
244+
245+---
246+*From the Free Pascal wiki, page "Using INI Files/pl", as it stood on 2022-09-29 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history