Delphi - TStringList

forráskód letöltése
A TStrings, TStringList típus egy olyan objektum, amelyben sztringeket tudunk elhelyezni, mintha azok egy tömbben lennének. Mivel nagyon sok komponensnél (TListBox, TComboBox, TMemo, TRadioGroup, stb.) megtalálható ez a típus egy-egy property típusaként ezért célszerű megismerkedni a lehetőségeivel.

Általános leírás

A TStrings típus egy olyan objektum, amelyben sztringeket tudunk elhelyezni, mintha azok egy tömbben lennének. Mivel nagyon sok komponensnél (TListBox, TComboBox, TMemo, TRadioGroup, stb.) megtalálható ez a típus egy-egy property típusaként ezért célszerű megismerkedni a lehetőségeivel.
Mivel a TStrings típus egy absztrakt osztály, ezért közvetlenül nem használhatjuk fel, nem hozhatunk létre belőle változót. A második példaprogramban látható módon van lehetőségünk, hogy változót is létrehozzunk, ezt viszont már a TStringList osztályból tesszük meg, aminek a TStrings az őse.
Aki esetleg nem túl jártas az objektum orientált programozásban az elég, ha azt jegyzi meg, hogy ha változót akar használni, azt mindig a TStringList-ből kell deklarálni, és ettől kezdve úgy használhatja azt mintha TStrings típust használna, sőt még néhány többlet szolgáltatása is van ennek az osztálynak.

Referencia

» function Add(const S: string): Integer;
Ha egy új sztringet szeretnénk hozzáadni ehhez a "tömbhöz", akkor az Add függvénnyel tehetjük ezt meg. Paraméterként a hozzáadandó sztringet kell megadnunk, visszatérési értékként pedig a sztring indexét kapjuk vissza. Ha ez volt az első elem, akkor visszatérési érték nulla lesz, ha a második, akkor pedig egy és így tovább.

» procedure Append(const S: string);
Az Append eljárással ugyanazt érhetjük el, mint az Add függvénnyel, egyetlen különbség, hogy itt nem kapunk visszatérési értéket.

» procedure Insert(Index: Integer; const S: string);
Ha nem a lista végére szeretnénk egy új elemet hozzáadni, hanem beszúrni szeretnénk egy meglévő elem helyére, akkor kell használnunk az Insert eljárást. Első paraméterként azt az Indexet kell megadnunk, amely elem elé szeretnénk beszúrni az adott elemet.

» procedure Delete(Index: Integer);
A Delete eljárással törölhetjük a TStrings egy elemét. Paraméterként kell megadnunk a törlendő elem sorszámát.

» procedure Clear;
Ha az összes elemet szeretnénk törölni a listából, akkor ezt megtehetjük a Clear eljárás segítségével.

» procedure Exchange(Index1, Index2: Integer);
Két sztringet felcserélhetünk az Exchange eljárással. Paraméterként a két felcserélendő elem sorszámát kell megadnunk.

» procedure Move(CurIndex, NewIndex: Integer);
Egy sztringet egy adott helyre mozgathatunk a Move eljárással. Ilyenkor az összes többi elem egy helyet lép a megfelelő irányba a keletkező üres helyre pedig az általunk megadott sztring kerül. Paraméterként a mozgatandó elem sorszámát kell megadnunk.

» function IndexOf(const S: string): Integer;
Egy adott sztringet az IndexOf függvény segítségével kereshetünk meg a TStrings osztályban. Ha a keresett elem nem található, akkor a függvény visszatérési értéke -1, különben a keresett elem sorszáma. A sztringet paraméterként kell átadnunk a függvény számára.

» procedure SaveToFile(const FileName: string);
A sztringeket el is menthetjük egy állományba a SaveToFile eljárással. Paraméterként az adott állomány nevet kell megadnunk teljes elérési útvonallal. Ha az elérési útvonal hiányzik, akkor az aktuális könyvtárba történik a mentés. Mentéskor egy szöveges állomány jön létre bármilyen kiterjesztést is adunk neki. Ez a szöveges állomány úgy néz ki, hogy minden egyes sora egy-egy sztringet fog tartalmazni.

» procedure SaveToStream(Stream: TStream);
A SaveToStream eljárás egy a paraméterben megadott Stream-be menti a sztringeket. Erről az osztályról részletes leírás a TStream fejezetben található a 21. oldalon.

» procedure LoadFromFile(const FileName: string);
A LoadFromFile eljárással betölthetünk egy tetszőleges szöveges állományt a TStrings osztályba. A szöveges állomány egy-egy sora lesz a "tömb" egy-egy eleme.

» procedure LoadFromStream(Stream: TStream);
Egy Stream-ből a LoadFromStream eljárással tölthetjük fel a TStrings-et.

» property Count: Integer;
A Count property-ből megtudhatjuk, hogy hány sztring van eltárolva a TStrings-ben.

» property Capacity: Integer;
A Capacity property összefüggésben áll a Count-al. Értéke minimum megegyezik a Count property-vel, vagy annál nagyobb. Ezzel a property-vel lehet szabályozni, hogy hány elemnek legyen lefoglalva a memóriában hely. Ha tudjuk, hogy például 10 000 eleme lesz a listának, akkor célszerű ezt a lista használat előtt beállítani, ha ezt nem tesszük, akkor sincs semmi gond, mivel az objektum automatikusan foglalja a szükséges memória területet a sztringek számára, de ha egyesével adjuk hozzá ezt a 10 000 elemet, akkor programunk idejének nagy részét az állandó memóriafoglalással fogja tölteni. Ezért célszerű egyszer beállítani ezt a property-t, így egy menetben le lesz foglalva a szükséges memória.

» property Sorted: Boolean;
A Sorted property igazra állításával megtörténik a lista rendezése ABC szerint. Ekkor, ha új elemmel bővül a TStringList az rögtön a megfelelő helyre fog kerülni, így a rendezettség is megmarad. Arra ügyeljünk, hogy ha Sorted property-t hamisra állítjuk, már nem kapjuk vissza az eredeti sorrendet.

» property Duplicates: TDuplicates;
Ha rendezettek a sztringek, akkor van szerepe a Duplicates property-nek. Itt írhatjuk elő, hogy mi történjen abban az esetben, ha két egyforma sztring kerül a listába.

dupIgnore - nem kerül hozzáadásra az új elem, ha már van olyan
dupAccept - a listában szerepelhetnek azonos sztringek is
dupError - EListError hibát generál a program, ha talál két egyforma elemet

» property Strings[Index: Integer]: string; default;
A Strings property keresztül érhető el egy-egy sztring, de mivel ez a default property, így nevét nem kell kiírnunk. Az alábbi két sor azonos hatású, feltételezve, hogy list nevű TStringList típusú változó deklarálva lett.

list[5]:='valami';
list.Strings[5]:='valami';

» property Names[Index: Integer]: string;
Leírást lásd a Values property-nél.

» property Values[const Name: string]: string;
Ha egy sztring úgy néz ki, hogy van benne egy = jel, akkor a TStringList képes rá, hogy az egyenlő jel mentén felbontsa ezt a sztringet kettőre.

var
list: TStringList;
begin
list:=TStringList.Create;
list.Add('Valami=abc');
Label1.Caption:=list.Values['Valami'];
Label2.Caption:=list.Names[0];
list.Free;
end;

Fenti példaprogramban a Label1 értéke "abc" lesz, míg a Label2-é "Valami".

Megfigyelhető tehát, hogy a Values tömb property-ben az egyenlőség jel baloldalán lévő szöveget adjuk, meg akkor a visszatérési értékként az egyenlőség jel jobb oldalán álló szöveget kapjuk meg. A Names tömb property-ben pedig az adott sztring indexét megadva nem a teljes sztringet kapjuk vissza, hanem csak az egyenlőség jel bal oldalán álló rész sztringet. Ezért a Label1-nek az alábbiakban lévő kód alapján is adhattunk volna értéket:

Label1.Caption:=list.Values[list.Names[0]];

» property Text: string;
A Text property-n keresztül az összes sztringet egyetlen sztringként kaphatjuk vissza úgy, hogy minden elem után egy új sor jel kerül beszúrásra a sztringbe.

» property OnChanging: TNotifyEvent;
OnChanging esemény jön létre, mielőtt megváltozik a lista tartalma (új hozzáadás, törlés, stb.).

» property OnChange: TNotifyEvent;
OnChange esemény jön létre, miután megváltozott a lista tartalma (új hozzáadás, törlés, stb.).

» function AddObject(const S: string; AObject: TObject): Integer;
Egy új elem létrehozásakor, ha az adott sztring mellé egy tetszőleges komponenst is szeretnénk eltárolni, akkor ezt az AddObject függvénnyel tehetjük meg. Első paraméterében azt a sztringet kell megadnunk, amelyet tárolni szeretnénk. A második egy TObject típusú változó, itt tetszőleges komponens, osztályt megadhatunk, lehet az egy Edit komponens, ahogyan a példaprogramban, de lehet teljesen más is.
A függvény visszatérési értéke az új elem indexe.

» procedure InsertObject(Index: Integer; const S: string; AObject: TObject);
Hasonlóan az Insert eljáráshoz az InsertObject is egy az Index paraméterben megadott elem elé fogja beszúrni az új objektumot. Az S paraméterben kell megadnunk az új sztringet, míg az AObject-ben a hozzá tartozó komponenst.

» property Objects[Index: Integer]: TObject;
Ahhoz, hogy az ily módon eltárolt komponenseket el is tudjuk érni az Objects tömb property-t kell használnunk. Ne feledjük, hogy a tömb indexelése nullától kezdődik, így az első elemben, ha egy Edit komponenst tároltunk el, akkor azt az alábbiak szerint érhetjük el:

(list.Objects[0] as TEdit).Text:='Valami';

Megfigyelhető, hogy szükséges az "as" operátor használata, mivel az Objects property TObject típusokat tárol, ezért, hogy megfelelően használhassuk az Edit komponenst, rá kell definiálni a TEdit típust az adott változóra.

» function IndexOfObject(AObject: TObject): Integer;
Az IndexOfObject függvénnyel kereshetünk egy objektumot. Visszatérési érték -1 lesz, ha nem találta az AObject paraméterben átadott komponenst az Objects tömbben.

i:=list.IndexOfObjects(Edit3);