
A mellékelt példaprogram megnyitása előtt a ShortEdit.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A ShortEdit komponens alapvetően ugyanúgy működik, mint a hagyományos Edit. Rendelkezik két plusz metódussal, melyek használata opcionális.
A SetShort metódus meghívásával, a Text tulajdonság tartalma rövidített formába kerül. Ez csak akkor történik meg, ha a szöveg szélesebb, mint az Edit mező szélessége.
A rövidített formát a SetNormal metódus meghívásával állíthatjuk vissza, normál megjelenítésre.
Megtehetjük például azt, hogy a ShortEdit OnEnter eseményében meghívjuk a SetNormal metódust, az OnExit eseményben pedig a SetShort-ot.
Az OnEnter esemény tartalma:
(Sender as TShortEdit).SetNormal;
Az OnExit esemény tartalma:
(Sender as TShortEdit).SetShort;
Ilyenkor a fókusszal nem rendelkező mezők rövidített tartalmat mutatnak, a fókusszal rendelkezők pedig teljesen hagyományosan működnek. A mellékelt példaprogram is ezt a lehetőséget mutatja be.
Az IsShort függvény segítségével bármikor lekérdezhetjük, hogy a komponens rövidített értéket mutat-e. Ha igen, akkor a függvény visszatérési értéke igaz.
A komponenst a TEdit osztályból származtatjuk. A TEdit osztályt bővítjük ki a SetNormal és SetShort metódusokkal.
Szükségünk van egy String típusú változóra, amely minden esetben a teljes szöveget fogja tárolni. Ezt nevezzük el FStText-nek.
A SetShort metódus meghívásakor, ebbe az FStText változóba mentjük el a Text mező értékét. Amikor pedig a SetNormal kerül meghívásra, akkor a Text tulajdonság értékét visszaállítjuk FStText-re.
A rövidítés algoritmusát a SetSize metódus tartalmazza.
Az FShort logikai változóban tároljuk el, hogy a komponens rövidített értéket mutat-e, vagy sem. Ha a felhasználó egymás után kétszer is meghívná a SetShort metódust, akkor az adatvesztést eredményezne. Második alkalommal a már rövidített érték kerülne eltárolásra, nem az eredeti szöveg. Ezt az FShort változó segítségével kivédhetjük.
if FShort=False then begin
FStText:=Text;
SetSize;
FShort:=True;
end;
Hogy az FShort értékét programból is le lehessen kérdezni, létre kell hoznunk az IsShort függvényt, amely semmi mást nem csinál, mint visszaadja az FShort értékét.
A SetSize eljárás
A rövidített forma előállítását ez a metódus hajtja végre. A megjelenítendő szöveg szélességét könnyedén lekérdezhetjük a TCanvas osztály TextWidth metódusával. A TEdit osztály, amelyből származtattunk, azonban nem rendelkezik ilyen tulajdonsággal. Ezért ideiglenesen létrehozunk egy TBitmap típusú objektumot, amelynek felhasználjuk a Canvas tulajdonságát.
Hogy a Canvas.TextWidth mindig korrekt értéket szolgáltasson, a Canvas betűtípusát be kell állítanunk a ShortEdit mező Font értékének megfelelően.
Bitmap.Canvas.Font:=Font;
A ShortEdit mező felhasználható szélességét a ClientWidth adja meg. A méretezést csak akkor kell elkezdenünk, ha a Canvas.TextWidth értéke nagyobb, mint a ClientWidth értéke.
if Bitmap.Canvas.TextWidth(FStText)>ClientWidth then begin
A rövidített formában egy olyan String-et kell előállítani, amelynek eleje az eredeti szöveg eleje, közepe „…”, a vége pedig az eredeti szöveg vége. Gyakorlatilag az eredeti szöveg közepét kell kivágnunk és a „…”-al helyettesítenünk.
Az Index1 és Index2 változók különbsége mindig a kivágásra kerülő szövegrész. A változók kezdőértékként a szöveg közepén lévő két karakterre mutatnak.
Index1:=Length(FStText) div 2;
Index2:=Index1+1;
A feldolgozás folyamán az Index1 értéke folyamatosan csökken, az Index2 értéke pedig nő. A vágott szöveg első része mindig az első karaktertől az Index1-edik karakterig fog tartani. A szöveg vége az Index2 és a Length(FStText) közti karaktersorozat lesz.
A feldolgozást egy repeat – until ciklussal végezzük. A feldolgozási ciklus akkor érhet véget, ha a vágott szöveg elfér a ClientWidth szélességén, vagy ha az Index1 és Index2 változók elérték az eredeti szöveg két szélét.
Ha a feldolgozás véget ért, akkor a vágott szöveget elhelyezzük a Text tulajdonságban.