TStringList-TStrings Tutorial/fi
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
polski (pl) │
русский (ru) │
TStringList
TStringList (tai mistä se on peritty TStrings) on enemmän kuin fantastinen dynaaminen taulukko tai merkkijonojen joukko (merkkijono joukot ei toimi FPC: ssä). TStringList on hyvin kätevä ohjelmoinnissa ja tässä opetetaan TStringListin peruskäyttöä!
Yksinkertainen esimerkki
program StrList;
{$mode objfpc}
uses
Classes, SysUtils;
var
Str: TStringList;
begin
Str := TStringList.Create; // Tämä on tarpeen kun loudaan luokka (tai useimpia luokkia)
Str.Add('Some String!');
writeln('The stringlist now has ' + IntToStr(Str.Count) + ' string(s).');
Readln;
Str.Free; //Release the memory used by this stringlist instance
end.
Tämä on yksinkertainen konsoli-ohjelma, joka luo ja lisää yhden merkkijonon TStringList luokkaan. Seuraavassa on joitain asioita, joita on hyvä tietää:
Create - Luo TStringList olion muokkaamista varten. Jos käytetään constructor
Create:a , niin on myöhemmin kutsuttava Free:tä.
Free
kutsu aiheuttaa destructor
Destroy
kutsun
joka vapauttaa sen tekemän muistivarauksen. Jos ei vapauteta niin ohjelma ei kaadu, mutta se ei vapauta kaikkia sen käytössä olevaa muistia: muistivuoto.
Count - Tämä ominaisuus (property) kertoo merkkijonojen lukumäärän.
Add - Tällä metodilla lisätään merkkijono TStringList-olioon. Se on funktio, joka palauttaa merkkijonon indeksin. Tässä lukumäärälaskin on kätevä.
Delete - Poistaa merkkijonon TStringList-oliosta. Tiedät vain, että ei syötetä merkkijonoa, vaan kerrotaan merkkijonon indeksi. Kuten aiemmin kerrottiin: tämä on kuin hieno dynaaminen taulukko.
IndexOf - Palauttaa merkkijonon indeksin TStringList-oliossa. Jos sitä ei löydy, se palauttaa arvon -1.
Clear - Tyhjentää TStringList-olion.
Laajennettu esimerkki
Entä enemmän mehukas esimerkki, eh?
program StrList2;
{$mode ObjFPC}
uses
Classes, SysUtils;
var
Str: TStringList;
S: String;
Counter: Integer;
begin
Str := TStringList.Create;
Writeln('String List Test');
repeat
Writeln('Enter a string to add (type EXIT to stop adding strings)');
Readln(S);
if (S = 'EXIT') then
Break; // exit the loop
if (S <> '') then
begin
Counter := Str.Add(S);
Writeln('String: ' + S + ' was Added!');
Writeln('Index is: ' + IntToStr(Counter)); // The counter will always become the index of the last thing added
end
else
begin
Writeln('No data entered...');
end;
until (S = 'EXIT');
writeln('Contents of the TStringList: '+ Str.CommaText);
Str.Free; //release the memory again
end.
Jotta vältetään mahdolliset muistivuodot, kannattaa aina käyttää try- finally lohkoa jos mahdollista, niin saadaan jotain tämän näköistä:
var
slist: TStringList;
...
slist := TStringList.Create;
try
...
// do things with your stringlist
...
finally
if Assigned(slist) then
FreeAndNil(slist);
end;
// This works perfect, no double creation of stringlist... comments free to send to edgarrod71@gmail.com
function theStringList: TStringList;
var
J: integer;
begin
result := TStringList.Create;
for J:=0 to 10 do
result.add(intToStr(J));
end;
procedure Caller;
var
SL: TStringList;
K: integer;
begin
SL := theStringList;
for K:=0 to pred(SL.Count) do
writeln(SL[K]);
if assigned(SL) then
SL.Free;
end;
Muunnokset erotusmerkillä oleviin merkkijonoihin
Alla oleva koodi tekee merkkijonon, joka sisältää 4 elementtiä ('1', '2', '3' ja '4');
procedure Sample;
var
MyStringList: TStringList=nil;
begin
MyStringList:= TStringList.create;
MyStringList.Delimiter := ';';
MyStringList.DelimitedText:='1;2;3;4';
MyStringList.free;
end;
Vastaavasti seuraava koodi kokoaa TStringList-oliosta erotusmerkillä varustetun merkkijonon ('1;2;3;4'):
function Sample2 : string;
var
MyStringList: TStringList=nil;
begin
MyStringList:= TStringList.create;
MyStringList.Delimiter := ';';
MyStringList.Add('1');
MyStringList.Add('2');
MyStringList.Add('3');
MyStringList.Add('4');
Result :=MyStringList.DelimitedText;
MyStringList.free;
end;
Huomaa, että Delimter on merkki, ei merkkijono! Jos erotin on merkkijono (esimerkiksi "\n"), voit käyttää alla olevaa koodia saadaksesi merkkijonon, joka sisältää 4 elementtiä ('1', '2', '3' ja '4'):
procedure Sample;
var
MyStringList: TStringList=nil;
begin
MyStringList:= TStringList.create;
MyStringList.text:=StringReplace('1\n2\n3\n4','\n',Lineending,[rfReplaceAll, rfIgnoreCase]);
MyStringList.free;
end;
Päinvastoin, seuraava toiminto palauttaa „1\n2\n3‟:
Function Sample : string;
var
MyStringList: TStringList=nil;
begin
MyStringList:= TStringList.create;
MyStringList.SkipLastLineBreak := True;
MyStringList.add('1');
MyStringList.add('2');
MyStringList.add('3');
result := StringReplace(MyStringList.Text,Lineending,'\n', [rfReplaceAll, rfIgnoreCase]);
MyStringList.free;
end;
Tiedoston käsittely
Tiedoston käsittelyyn on TStringList-oliolla kaksi tiedostojen käsittelytoimea: SaveToFile ja LoadFromFile. SavetoFile tallentaa TStringList-olion kaikki merkkijonot tiedostoon. LoadFromFile avaa tiedoston ja lisää tiedoston tiedot TStringList-olioon.
program StrListFile;
{$mode objfpc}
uses
Classes, SysUtils;
var
Str: TStringList;
begin
Str := TStringList.Create;
try
Str.LoadFromFile('SomeFile.txt');
Str.Add('Hello');
Str.SaveToFile('SomeFile.txt');
finally
Str.Free;
end;
end.
Tässä avattiin tiedosto, muokattiin sitä ja tallennettiin se takaisin, missä se oli!
Vertailu dynaamisiin merkkijono taulukkoon
TStringList on yksinkertaistuna |olio versio dynaamisesta merkkijoukosta. Joillakin menetelmillä on saman kaltaisuuksia:
Operaatio | array of string | TStringList |
---|---|---|
Muuttujan määrittely | StringList: array of string; | StringList: TStringList; |
Alustus | implicit constructor | StringList := TStringList.Create |
Koon asettaminen | SetLength(StringList, X); | StringList.Size := X; |
Koon selvittäminen | X := Length(StringList); | X := StringList.Count; |
Alkion lisääminen | SetLength(StringList, Length(StringList) + 1); StringList[Length(StringList) - 1] := X; | StringList.Add(X); |
Alkion poistaminen | for I := Index to Length(StringList) - 2 do StringList[I] := StringList[I + 1]; SetLength(StringList, Length(StringList) - 1); | StringList.Delete(Index); |
Kaikkien alkioiden poisto | SetLength(StringList, 0); | StringList.Clear; |
Tuhoaminen | implicit destructor | StringList.Free; |
Kuitenkin TStringList tarjoaa paljon enemmän toimintoja kuin perusrakenteen, vertaa dynaamista taulukkoa.
Jatka oppimista
TStringListillä on monia muita mielenkiintoisia ominaisuuksia:
- Sen avulla voidaan lajitella merkkijonoja
- Sen avulla voidaan rajoittaa luetteloa vain yksilöllisiin merkkijonoihin
- Voidaan saada kaikkien TStringList-olion merkkijonojen teksti yhdeksi merkkijonoiksi Text- ominaisuuden avulla.
- Voit tallentaa objektin tai muun datan merkkijonon viereen
Voit oppia kaikki erilaiset aliohjelmat, funktiot ja ominaisuudet. Katso TStringList -dokumentaatio ... tai Lazaruksen ohje.
... ja saatat haluta laajentaa tätä opetusohjelmaa, jos sinusta tuntuu.