Delphi - Számot szöveggel megjelenítő QRLabel

forráskód letöltése
Gyakran előfordul, hogy egy nyomtatványon egy számot szöveggel is meg kell jeleníteni (pl. csekkek, számlák). A mellékelt komponens ezt a feladatot oldja meg egy QuickReport-on. A példában az egyszerű QRNumStrLabel, és az adatbázishoz kapcsolható QRNumStrLabel komponens is megtalálható. A mellékelt példaprogram megnyitása előtt a QRNumStrLabel.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A feladatot két fő részre lehet bontani. Az egyik a szám átalakítása szöveggé, a másik pedig a megjelenítése a QuickReport-on. A két komponensnek egy közös osztályt készítünk, ez lesz a TQRCustomNumStrLabel, melyet a TQRCustomLabel osztályból származtatunk. Ez már önmagában megoldja azt a problémát, hogy az új komponenst egy QuickReport-on felhasználhassuk. A TQRCustomLabel osztály Caption property-jében megadot szöveg jelenik meg nyomtatásban. Ennek a property-nek kell tehát értéket adnunk a két származtatott komponensben. Ezt a property-t éppen ezért nem is tesszük publikussá, mivel ebbe már csak az eredmény kerül. Ez viszont mindkét esetben másképpen történik meg, ellentétben a szám érték átalakításával, ezért ez utóbbihoz létrehozunk egy függvényt a közös osztályban.
Ez a függvény a NumberToString, ami a kapott egész értéket sztringgé alakítja. Ezt csak 1 milliárd alatti értékkel tudja megtenni, de ez egyrészt a legtöbb esetben elég, másrészt kis átalakítással megoldható.
Az első komponens a TQRNumStrLabel. Ebben létrehozunk egy Value nevű property-t, ebben lehet megadni a számértéket. Ez azonnal átalakításra kerül, és az eredmény beíródik a Caption property-be, ennek következtében rögtön meg is jelenik a QuickReport-on.
A második komponens ennél egy kicsit azért bonyolultabb, hiszen itt a számértéket egy adatbázis mezőből vesszük. Ennek következtében itt már 2 új property lesz, a DataSet és a DataField. Előbbibe egy TDataset osztályból származó komponenst lehet megadni, pl. TTable, TQuery. A DataField a megadott adatkészlet egy mezőjének a neve. Ehhez property editort is készítettünk, hogy csak számot tartalmazó mezőt lehessen megadni.
Mivel ebben a komponensben minden rekordnál más-más érték lehet, ezért az érték kiolvasását és átalakítását akkor végezzük el, amikor a Label nyomtatásra kerül. Ehhez viszont felül kell írnunk a Print eljárást. Paraméterként megkapjuk azt a pozíciót, ahová a szöveg nyomtatásra kerül.
var
  Field: TField;
...
  Field:=FDataSet.FindField(FDataField);
  if Assigned(Field) then Caption:=NumberToString(Field.AsInteger);