Wiki-kopiopeilipalvelin

Tämä on pascal.chatin wikin peilipalvelin. Muokkaus, historia ja kirjautuminen ovat siellä.

TStringList-TStrings Tutorial/fi

Deutsch · English · Español · Français · Polski · Suomi · Русский

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

pascal
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?

pascal
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ä:

pascal
var
  slist: TStringList;

...

slist := TStringList.Create;
try
  ...
  // do things with your stringlist  
  ...
finally
  if Assigned(slist) then
    FreeAndNil(slist);
end;
pascal
// 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');

pascal
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'):

pascal
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'):

pascal
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‟:

pascal
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.

pascal
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


From the Free Pascal wiki, page "TStringList-TStrings Tutorial/fi", as it stood on 2019-11-16 after a change by Djzepi, 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.

Versio 1, viimeksi muokannut WikiArchive .