
A mellékelt példaprogram megnyitása előtt a StringHolder.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Ha több soros szöveg tárolásáról beszélünk, akkor általában a TStrings illetve TStringList osztályok jutnak eszünkbe. Most ez utóbbit használjuk fel. Ez eddig rendben is van, de a feladat megoldásához nem elég egy ilyen típusú property-t létrehozni, hiszen tetszőleges számú szöveget szeretnénk tárolni. Éppen ezért egy TCollection-ból származó osztályra lesz szükségünk. Ez lesz a TStringHolderItems, amelynek elemei a TStringHolderItem osztályból származnak. Ez utóbbi osztálynak két property-je lesz. Az egyik a Strings, amely TStringList típusú, és így szöveg tárolására kiválóan használható. A másik property az ItemID, amely a szöveg egyedi neve. Ez utóbbi arra lesz jó, hogy egy adott szöveget ne csak az index-ével, hanem akár névvel is lehessen azonosítani.
Magának a StringHolder komponensnek csak egy property-je lesz, az Items, amely TStringHolderItems típusú. A tetszőleges számú szöveg tárolásának lehetősége most már adott, már csak néhány függvényt és eljárást hozunk létre.
A Find függvénnyel lekérdezhetjük a paraméterként megadott nevű szöveg indexét. Az Option paraméterben megadhatjuk a keresés jellemzőit, az alábbi értékekkel:
- foCaseInsensitive: a keresésnél nem tesz különbséget a kis- és nagybetűk között;
- foPartialKey: részletre is keres, így elég a név néhány bevezető karakterét megadni.
A GetItemIDList eljárással a paraméterként megadott TStrings típusú objektumba lekérdezhetjük a szövegek neveit.
A szövegek mentéséhez létrehozunk egy SaveToFile eljárást. Természetesen minden szöveget egyetlen fájlba mentünk el, a nevükkel együtt. Ez már rögtön azt is jelenti, hogy egy egyedi fájlformátumot kell létrehoznunk. Ez elég egyszerű lesz, de úgy lesz felépítve, hogy a komponens esetleges továbbfejlesztésekor (pl. a TStringHolderItem osztály több property-vel történő kibővítésekor) ez is egyszerűen bővíthető legyen.
A fájlban tárolt adatok mindig egy kétbájtos (word) azonosítóval kezdődnek, majd egy négybájtos érték következik (dword), ami az adat hosszát adja meg. Ezután maga az adat következik. Egyelőre csak kétféle adat kerülhet a fájlba, a szöveg neve, és maga a szöveg, amelyek azonosítóit az FDID_ITEMID és FDID_TEXT konstansokban tároljuk.
Egy szöveg adatainak tárolása a következő sorrendben történik:
- az FDID_ITEMID azonosító értéke;
- az ItemID property-ben megadott sztring hossza;
- az ItemID property-ben tárolt sztring;
- az FDID_TEXT azonosító értéke;
- A Strings property-ben tárolt szöveg hossza (a Strings property Text property-jén keresztül elérhető egyben a teljes szöveg);
- a szöveg tárolása.
Azután a következő szöveg adatai következnek. Az Items property teljes tartalmát, vagyis az összes szöveget egy ciklusban tároljuk el.
A fájl beolvasását a LoadFromFile eljárás végzi. A beolvasás a következő módszerrel történik:
- ha ezt a fájlt a StringHolder komponens hozta létre, akkor biztosak lehetünk benne, hogy az első beolvasandó két bájt egy azonosítót tartalmaz. Az első lépés tehát a kétbájtos azonosító beolvasása.
- az azonosítót mindig az adat hossza követi, így ezt is beolvassuk, ez viszont már négybájtos.
- ha az azonosító értéke FDID_ITEMID, akkor létrehozunk egy új elemet az Items property-ben, és az új elem ItemID property-jébe beolvassuk a sztringet a ReadString belső eljárással. Ha az azonosító FDID_TEXT, akkor ellenőrizzük, hogy van-e már elem az Items property-ben, és ha igen, akkor az utolsó elem Strings property-jébe beolvassuk a szöveget. Ha az azonosító értéke az előbbi kettőtől eltér, akkor beolvassuk az adatot, de nem dolgozzuk fel. Így biztosítjuk, hogy a komponens egy esetlegesen újabb típusú, több adatot tartalmazó fájlt is be tudjon olvasni, amiből természetesen csak a fenti két adatot nyeri ki.