TStringList-TStrings Tutorial/fi

From Lazarus wiki
Jump to navigationJump to search

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