Difference between revisions of "TStringList-TStrings Tutorial/fi"
(Created page with "{{TString_List-TString_Tutorial}} ==TStringList== TStringList (tai mistä se on peritty TStrings) on en...") |
|||
Line 2: | Line 2: | ||
==TStringList== | ==TStringList== | ||
− | [[doc:rtl/classes/tstringlist.html|TStringList]] (tai mistä se on peritty [[doc:rtl/classes/tstrings.html|TStrings]]) on enemmän kuin fantastinen dynaaminen taulukko tai merkkijonojen joukko | + | [[doc:rtl/classes/tstringlist.html|TStringList]] (tai mistä se on peritty [[doc:rtl/classes/tstrings.html|TStrings]]) on enemmän kuin fantastinen [[Dynamic array/fi|dynaaminen taulukko]] tai merkkijonojen [[Set/fi|joukko]] |
(merkkijono joukot ei toimi FPC: ssä). TStringList on hyvin kätevä ohjelmoinnissa ja tässä opetetaan TStringListin peruskäyttöä! | (merkkijono joukot ei toimi FPC: ssä). TStringList on hyvin kätevä ohjelmoinnissa ja tässä opetetaan TStringListin peruskäyttöä! | ||
===Yksinkertainen esimerkki=== | ===Yksinkertainen esimerkki=== | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
program StrList; | program StrList; | ||
{$mode objfpc} | {$mode objfpc} | ||
Line 22: | Line 22: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Tämä on yksinkertainen konsoli-ohjelma, joka luo ja lisää yhden merkkijonon TStringList luokkaan. Seuraavassa on joitain asioita, joita on hyvä tietää: | + | Tämä on yksinkertainen [[Command-line_interface/fi|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 '''Create''':a , niin on myöhemmin kutsuttava '''Free''':tä joka | + | '''Create''' - Luo TStringList olion muokkaamista varten. Jos käytetään [[Constructor/fi|<syntaxhighlight lang="pascal" inline>constructor</syntaxhighlight>]] '''Create''':a , niin on myöhemmin kutsuttava '''Free''':tä. |
+ | <syntaxhighlight lang="pascal" inline>Free</syntaxhighlight> kutsu aiheuttaa [[Destructor/fi|<syntaxhighlight lang="pascal" inline>destructor</syntaxhighlight>]] <syntaxhighlight lang="pascal" inline>Destroy</syntaxhighlight> 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 kertoo merkkijonojen lukumäärän. | + | '''Count''' - Tämä [[Property/fi|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ä. | + | '''Add''' - Tällä [[Method/fi|metodilla]] lisätään merkkijono TStringList-olioon. Se on [[Function/fi|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. | '''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. | ||
Line 40: | Line 42: | ||
Entä enemmän mehukas esimerkki, eh? | Entä enemmän mehukas esimerkki, eh? | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
program StrList2; | program StrList2; | ||
{$mode ObjFPC} | {$mode ObjFPC} | ||
Line 77: | Line 79: | ||
Jotta vältetään mahdolliset muistivuodot, kannattaa aina käyttää [[Try/fi|try]]- [[Finally/fi|finally]] lohkoa jos mahdollista, niin saadaan jotain tämän näköistä: | Jotta vältetään mahdolliset muistivuodot, kannattaa aina käyttää [[Try/fi|try]]- [[Finally/fi|finally]] lohkoa jos mahdollista, niin saadaan jotain tämän näköistä: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
var | var | ||
slist: TStringList; | slist: TStringList; | ||
Line 95: | Line 97: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
// This works perfect, no double creation of stringlist... comments free to send to edgarrod71@gmail.com | // This works perfect, no double creation of stringlist... comments free to send to edgarrod71@gmail.com | ||
function theStringList: TStringList; | function theStringList: TStringList; | ||
Line 122: | Line 124: | ||
Alla oleva koodi tekee merkkijonon, joka sisältää 4 elementtiä ('1', '2', '3' ja '4'); | Alla oleva koodi tekee merkkijonon, joka sisältää 4 elementtiä ('1', '2', '3' ja '4'); | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
procedure Sample; | procedure Sample; | ||
var | var | ||
Line 135: | Line 137: | ||
Vastaavasti seuraava koodi kokoaa TStringList-oliosta erotusmerkillä varustetun merkkijonon ('1;2;3;4'): | Vastaavasti seuraava koodi kokoaa TStringList-oliosta erotusmerkillä varustetun merkkijonon ('1;2;3;4'): | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
function Sample2 : string; | function Sample2 : string; | ||
var | var | ||
Line 153: | Line 155: | ||
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'): | 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'): | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
procedure Sample; | procedure Sample; | ||
var | var | ||
Line 165: | Line 167: | ||
Päinvastoin, seuraava toiminto palauttaa „1\n2\n3‟: | Päinvastoin, seuraava toiminto palauttaa „1\n2\n3‟: | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
Function Sample : string; | Function Sample : string; | ||
var | var | ||
Line 185: | Line 187: | ||
'''SavetoFile''' tallentaa TStringList-olion kaikki merkkijonot tiedostoon. '''LoadFromFile''' avaa tiedoston ja lisää tiedoston tiedot TStringList-olioon. | '''SavetoFile''' tallentaa TStringList-olion kaikki merkkijonot tiedostoon. '''LoadFromFile''' avaa tiedoston ja lisää tiedoston tiedot TStringList-olioon. | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
program StrListFile; | program StrListFile; | ||
{$mode objfpc} | {$mode objfpc} | ||
Line 209: | Line 211: | ||
==Vertailu dynaamisiin merkkijono taulukkoon== | ==Vertailu dynaamisiin merkkijono taulukkoon== | ||
− | TStringList on yksinkertaistuna olio versio dynaamisesta merkkijoukosta. Joillakin menetelmillä on saman kaltaisuuksia: | + | TStringList on yksinkertaistuna [[object-oriented programming/fi||olio]] versio dynaamisesta merkkijoukosta. Joillakin menetelmillä on saman kaltaisuuksia: |
{| class="wikitable" | {| class="wikitable" | ||
Line 239: | Line 241: | ||
# Sen avulla voidaan rajoittaa luetteloa vain yksilöllisiin merkkijonoihin | # Sen avulla voidaan rajoittaa luetteloa vain yksilöllisiin merkkijonoihin | ||
# Voidaan saada kaikkien TStringList-olion merkkijonojen teksti yhdeksi merkkijonoiksi '''Text'''- ominaisuuden avulla. | # 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 [[doc:rtl/classes/tstringlist.html|TStringList -dokumentaatio]] ... tai Lazaruksen ohje. | Voit oppia kaikki erilaiset aliohjelmat, funktiot ja ominaisuudet. Katso [[doc:rtl/classes/tstringlist.html|TStringList -dokumentaatio]] ... tai Lazaruksen ohje. |
Latest revision as of 17:02, 16 November 2019
│
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.