Sign in Join
Wiki copytemporary

TStringList-TStrings Tutorial/pl: what changed

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

Title: TStringList-TStrings Tutorial/pl

OldNewLine
1+Poradnik do TStringList i TStrings
2+
3+## TStringList
4+
5+[[doc:rtl/classes/tstringlist.html|TStringList]] (lub jego rodzic [[doc:rtl/classes/tstrings.html|TStrings]]) jest bardzo podobna do fantazyjnej [[Dynamic array|tablicy dynamicznej]] lub [[Set|zbioru]] ciągów typu string (typ zbiorowy ciągów znakowych nie jest możliwy w FPC). Ten typ danych jest bardzo przydatny podczas programowania i mam zamiar nauczyć Cię podstaw obsługi TStringList!
6+
7+### Prosty przykład
8+
9+``` pascal
10+program StrList;
11+{$mode objfpc}
12+uses
13+ Classes, SysUtils;
14+var
15+ Str: TStringList;
16+begin
17+ Str := TStringList.Create; // Jest to potrzebne podczas korzystania z tej klasy (lub większości klas)
18+ Str.Add('Jakiś ciąg znaków!');
19+ writeln('Lista ciągów ma teraz ' + IntToStr(Str.Count) + ' ciąg(ów).');
20+ Readln;
21+ Str.Free; //Zwolnij pamięć używaną przez tę instancję stringlist
22+end.
23+```
24+
25+Jest to prosty [[Command-line interface|program konsolowy]], który utworzy i doda jeden ciąg (string) do listy ciągów (stringlist). Oto kilka rzeczy, które powinieneś wiedzieć:
26+
27+**Create** - Stworzy listę ciągów, którą potem możesz modyfikować. Jeśli używasz konstruktora [[Constructor|constructor]] **Create**, musisz później zwolnić jego pamięć za pomocą **Free**. Wywołanie `free` skutkuje wywołaniem destruktora [[Destructor|destructor]] `Destroy`, który niszczy listę i uwalnia zajmowaną przez nią pamięć. Jeśli tego nie zrobisz, to program nie ulegnie awarii, ale też nie zwolni całej zajmowanej pamięci i nastąpi tzw. wyciek pamięci.
28+
29+**Count** - Ta [[Property|właściwość]] jest licznikiem liczby ciągów na liście.
30+
31+**Add** - Ta [[Method|metoda]] umożliwia dodanie jednego ciągu do listy ciągów. Jest to funkcja, która zwraca indeks ciągu. Tutaj z pomocą przychodzi licznik.
32+
33+**Delete** - Usuwa ciąg (string) z listy ciągów (stringlist). Musisz wiedzieć, że nie podajesz ciągu znaków, które chcesz usunąć, ale musisz wprowadzić indeks tego ciągu. Jak powiedziałem: to jak fantazyjna tablica dynamiczna.
34+
35+**IndexOf** - Zwróci indeks ciągu na liście. Jeśli nie zostanie on znaleziony, to zwraca -1.
36+
37+**Clear** - Czyści całą listę.
38+
39+### Rozszerzony przykład
40+
41+A może bardziej soczysty przykład, co?
42+
43+``` pascal
44+program StrList2;
45+{$mode ObjFPC}
46+uses
47+Classes, SysUtils;
48+
49+var
50+ Str: TStringList;
51+ S: String;
52+ Counter: Integer;
53+begin
54+ Str := TStringList.Create;
55+ Writeln('String List Test');
56+ repeat
57+ Writeln('Wpisz ciąg do dodania (wpisz KONIEC, aby zatrzymać dodawanie ciągów)');
58+ Readln(S);
59+ if (S = 'KONIEC') then
60+ Break; // wyjście z pętli
61+
62+ if (S <> '') then
63+ begin
64+ Counter := Str.Add(S);
65+ Writeln('Ciąg: ' + S + ' został dodany!');
66+ Writeln('Jego index to: ' + IntToStr(Counter)); // Licznik zawsze będzie indeksem ostatnio dodanej rzeczy
67+ end
68+ else
69+ begin
70+ Writeln('Nie wprowadzono żadnych danych...');
71+ end;
72+ until (S = 'KONIEC');
73+ writeln('Zawartość TStringList: '+ Str.CommaText);
74+ Str.Free; //zwolnij pamięć
75+end.
76+```
77+
78+Jednak, aby uniknąć możliwych wycieków pamięci, zawsze powinieneś używać bloku [[Try]] - [[Finally]] wszędzie, gdzie to możliwe, aby uzyskać coś takiego:
79+
80+``` pascal
81+var
82+ slist: TStringList;
83+
84+...
85+
86+slist := TStringList.Create;
87+try
88+ ...
89+ // rób różne rzeczy z twoją listą stringów (stringlist)
90+ ...
91+finally
92+ if Assigned(slist) then
93+ FreeAndNil(slist);
94+end;
95+```
96+
97+``` pascal
98+// Działa to doskonale, bez podwójnego tworzenia listy ciągów
99+function theStringList: TStringList;
100+var
101+ J: integer;
102+begin
103+ result := TStringList.Create;
104+ for J:=0 to 10 do
105+ result.add(intToStr(J));
106+end;
107+
108+procedure Caller;
109+var
110+ SL: TStringList;
111+ K: integer;
112+begin
113+ SL := theStringList;
114+ for K:=0 to pred(SL.Count) do
115+ writeln(SL[K]);
116+ if assigned(SL) then
117+ SL.Free;
118+end;
119+```
120+
121+Aby iterować po liście, lepiej jest użyć pętli **while-do** zamiast pętli **for-to**. Powodem jest to, że lista może być pusta, więc pętla for-to nie działa poprawnie.
122+
123+W tym przykładzie procedura SubscriberDel jest wywoływana dla każdego identyfikatora ID na liście, a lista identyfikatorów ID jest przekazywana do procedury jako ciąg znaków (string).
124+
125+``` pascal
126+procedure SubscribersDelete(const Subscriber_ID: string);
127+var
128+ List : TStringList;
129+ i : Integer;
130+begin
131+ List := TStringList.Create;
132+ List.Text := Subscriber_ID;
133+ i := 0;
134+ while i < List.Count do
135+ begin
136+ SubscriberDel(List.Strings[i]);
137+ inc(i);
138+ end;
139+ List.Free;
140+end;
141+```
142+
143+### Konwersja do i z ciągów rozdzielanych
144+
145+Poniższy kod spowoduje powstanie listy ciągów zawierającej 4 elementy ('1', '2', '3' i '4');
146+
147+``` pascal
148+procedure Sample;
149+var
150+ MyStringList: TStringList=nil;
151+begin
152+ MyStringList:= TStringList.create;
153+ MyStringList.Delimiter := ';';
154+ MyStringList.DelimitedText:='1;2;3;4';
155+ MyStringList.free;
156+end;
157+```
158+
159+Odpowiednio następny kod złoży listę ciągów w ciąg rozdzielony średnikami ('1;2;3;4'):
160+
161+``` pascal
162+function Sample2 : string;
163+var
164+ MyStringList: TStringList=nil;
165+begin
166+ MyStringList:= TStringList.create;
167+ MyStringList.Delimiter := ';';
168+ MyStringList.Add('1');
169+ MyStringList.Add('2');
170+ MyStringList.Add('3');
171+ MyStringList.Add('4');
172+ Result :=MyStringList.DelimitedText;
173+ MyStringList.free;
174+end;
175+```
176+
177+Zwróć uwagę, że separator to znak typu char, a **nie** ciąg typu string! Jeśli separatorem jest ciąg (na przykład „\n”), to możesz użyć poniższego kodu, aby uzyskać listę ciągów zawierającą 4 elementy („1”, „2”, „3” i „4”):
178+
179+``` pascal
180+procedure Sample;
181+var
182+ MyStringList: TStringList=nil;
183+begin
184+ MyStringList:= TStringList.create;
185+ MyStringList.text:=StringReplace('1\n2\n3\n4','\n',Lineending,[rfReplaceAll, rfIgnoreCase]);
186+ MyStringList.free;
187+end;
188+```
189+
190+I odwrotnie, następna funkcja zwróci „1\n2\n3”:
191+
192+``` pascal
193+Function Sample : string;
194+var
195+ MyStringList: TStringList=nil;
196+begin
197+ MyStringList:= TStringList.create;
198+ MyStringList.SkipLastLineBreak := True;
199+ MyStringList.add('1');
200+ MyStringList.add('2');
201+ MyStringList.add('3');
202+ result := StringReplace(MyStringList.Text,Lineending,'\n', [rfReplaceAll, rfIgnoreCase]);
203+ MyStringList.free;
204+end;
205+```
206+
207+## Obsługa plików
208+
209+Korzystając z TStringList, masz do dyspozycji 2 [[Procedure/pl|procedury]] obsługi plików: **SaveToFile** i **LoadFromFile**. SavetoFile zapisze wszystkie ciągi z listy do pliku. LoadFromFile otworzy plik i doda dane pliku do listy ciągów.
210+
211+``` pascal
212+program StrListFile;
213+{$mode objfpc}
214+uses
215+ Classes, SysUtils;
216+
217+var
218+ Str: TStringList;
219+begin
220+ Str := TStringList.Create;
221+ try
222+ Str.LoadFromFile('SomeFile.txt');
223+ Str.Add('Hello');
224+ Str.SaveToFile('SomeFile.txt');
225+ finally
226+ Str.Free;
227+ end;
228+end.
229+```
230+
231+Właśnie otworzyłeś plik, wyedytowałeś go i zapisałeś z powrotem tam, gdzie był!
232+
233+## Sortowanie
234+
235+Procedura Find wymaga posortowanej listy. Najłatwiejszym sposobem jest ustawienie właściwości Sorted na True, dzięki temu nowe elementy dodawane do listy zostaną wstawione we właściwej pozycji. Ma to kilka dodatkowych efektów ubocznych, po pierwsze, nie możesz użyć procedury Insert(), użyj tylko Add(). Po drugie, ustawia ona właściwość Duplicates, jej domyślne ustawienie to „dupIgnore”, co oznacza, że ​​próby dodania identycznych wpisów będą ignorowane. Jednak wywołanie AddObject(), które mają identyczny ciąg znaków i jakiś nowy Object, spowoduje, że nowy Object zastąpi istniejący.
236+
237+## Porównanie z dynamiczną tablicą ciągów
238+
239+TStringList to po prostu zorientowana obiektowo wersja dynamicznej tablicy ciągów. Niektóre metody mają tu nawet swoje odpowiedniki:
240+
241+| Operacja | Tablica ciągów | TStringList |
242+|----|----|----|
243+| Deklaracja zmiennych | StringList: array of string; | StringList: TStringList; |
244+| Inicjalizacja | domyślnie constructor | StringList := TStringList.Create |
245+| Ustawenie rozmiaru | SetLength(StringList, X); | StringList.Size := X; |
246+| Odczytanie rozmiaru | X := Length(StringList); | X := StringList.Count; |
247+| Dodanie elementu | SetLength(StringList, Length(StringList) + 1); StringList\[Length(StringList) - 1\] := X; | StringList.Add(X); |
248+| Usunięcie elememtu | for I := Index to Length(StringList) - 2 do StringList\[I\] := StringList\[I + 1\]; SetLength(StringList, Length(StringList) - 1); | StringList.Delete(Index); |
249+| Usunięcie wszystkich elementów | SetLength(StringList, 0); | StringList.Clear; |
250+| Finalizacja | domyślnie destructor | StringList.Free; |
251+
252+Jednak TStringList oferuje znacznie więcej funkcji niż podstawowa struktura, taka jak tablica dynamiczna.
253+
254+## Dalsza nauka
255+
256+TStringList ma wiele innych interesujących cech:
257+
258+1. Pozwala na sortowanie ciągów
259+2. Pozwala ograniczyć listę tylko do unikalnych ciągów
260+3. Możesz pobrać tekst wszystkich ciągów jako jeden ciąg przy użyciu właściwości **Text**.
261+4. Obok ciągu można przechowywać obiekt lub inne dane
262+
263+Możesz nauczyć się różnych procedur, funkcji i właściwości. Zobacz [[doc:rtl/classes/tstringlist.html|dokumentacja TStringList]] ... lub zajrzyj do pomocy w Lazarusie.
264+
265+... i możesz rozszerzyć ten samouczek, jeśli masz na to ochotę.
266+
267+## Zobacz także
268+
269+- [[Character and string types|Typy znakowe i ciągi znaków]]
270+
271+---
272+*From the Free Pascal wiki, page "TStringList-TStrings Tutorial/pl", as it stood on 2022-08-10 after a change by Kai Burghardt, 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