Difference between revisions of "TStringList-TStrings Tutorial/fi"

From Lazarus wiki
Jump to navigationJump to search
(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 vapautettava sen tekemän muistivarauksen. Jos ei vapauteta niin ohjelma ei kaadu, mutta se ei vapauta kaikkia sen käytössä olevaa muistia: muistivuoto.
+
'''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.
# You can store an object or other data next to the string
+
# 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:

  1. Sen avulla voidaan lajitella merkkijonoja
  2. Sen avulla voidaan rajoittaa luetteloa vain yksilöllisiin merkkijonoihin
  3. Voidaan saada kaikkien TStringList-olion merkkijonojen teksti yhdeksi merkkijonoiksi Text- ominaisuuden avulla.
  4. 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.

Katso myös