|
|
Automatikus report generáló komponens
|
|
Példaprogram letöltése
15748 bájt
|
Egyik korábbi cikkünkben egy olyan komponenst készítettünk, amely egy lekérdezés vagy tábla adataiból automatikusan előállított egy QuickReport-ot. Ez a most bemutatandó komponens az előzőnél jóval többet tud: lehet benne összesen sort is megadni, akár mindegyik mezőhöz egy-egy összesített értékkel, amit szintén egy tábla vagy lekérdezés szolgáltat, illetve megadhatunk egy mezőt, amely szerint csoportosítva jeleníti meg az adatokat.
A mellékelt példaprogram megnyitása előtt a ReportGenEx.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A komponens a következő property-kkel rendelkezik:
- Title: a report címe;
- Dataset: az adatkészlet objektuma, amiből a report készül;
- ColumnDistance: az oszlopok közötti távolság;
- HeaderLine1: a fejléc első sora;
- HeaderLine2: a fejléc második sora;
- PageOrientation: az oldal tájolása;
- GroupFieldName: annak a mezőnek a neve, amely szerint az adatokat csoportosítani szeretnénk;
- ListFont: a lista betűtípusa;
- HeaderFont: a fejléc betűtípusa;
- TitleFont: a címsor betűtípusa;
- SumDataSet: az összesített adatokat tartalmazó adatkészlet objektuma;
- MarginLeft: bal margó (milliméterben);
- MarginRight: jobb margó;
- MarginTop: felső margó;
- MarginBottom: alsó margó;
A Table vagy Query komponensben hozzunk létre minden mezőhöz egy-egy objektumot. Az objektumok Tag property-jében beállíthatjuk a betű stílusát. A Tag property ugyan nem erre való, de mivel a tetszőlegesen felhasználható, ezért ez tökéletesen megfelel számunkra. Az érték első három bitjével szabályozhatjuk a stílust. Az első bit a félkövér, a második a dőlt, a harmadik pedig az aláhúzott stílust állítja be. Ha például a Tag property értéke 3, akkor a stílus félkövér-dőlt lesz. Ha az objektum Visble property-je hamis, akkor az a mező nem jelenik meg a report-on. A DisplayWidth property-vel szabályozhatjuk, hogy az adott mező milyen szélességű lesz. A megadott érték nem konkrétan a mező szélességét határozza meg, mivel az a többi mező szélességétől is függ. A komponens ugyanis úgy helyezi el a mezőket, hogy az oldal teljes szélességét kihasználja. Ha például van két mezőnk, az egyiknél a DisplayWidth értéke 1, a másiknál pedig 3, akkor az első mező szélessége az oldal szélességének egynegyede, a másiké pedig a háromnegyede lesz.
A komponenshez tartozik egy QuickReport is (ReportGenExQrep.pas), amely tartalmazza a report alapjául szolgáló komponenseket. Ennek azért van értelme, mert így nem kell minden komponenst futásidőben létrehozni.
A report generálása az Execute eljárásban történik. Ez egy meglehetősen hosszú eljárás, ezért nézzük lépésenként az egyes műveleteket.
Egy ciklusban megszámoljuk a megjelenítendő mezők számát (VisibleFields), és ezek szélességét is összesítjük, ami abból áll, hogy a DisplayWidth property-k értékét összeadjuk (MaxFieldsWidth). Az összesítésnél nem vesszük figyelembe azokat a mezőket, amiket meg sem jelenítünk, illetve azt, amelyik szerint csoportosítjuk az adatokat (GroupFieldName).
Ezután a kapott értékekből kiszámolunk egy értéket, amivel beszorozva a mezők DisplayWidth property-jeinek értékét, megkapjuk a mező QuickReport-beli szélességét.
rf:=(QRep.QRBandDetail.Width-(VisibleFields-1)*FColumnDistance) / MaxFieldsWidth;
Ezután a property-k értékének megfelelően beállítjuk a QuickReport és az azon található Band-ek tulajdonságait.
A következő ciklusban létrehozunk minden mezőnek egy QRText objektumot a ColumnHeader Band-en, és egy QRDBText komponenst a Detail Band-en. A csoportosító mezőnek csak egy QRDBText komponens kell, amit viszont a Group Band-re teszünk. A mezők pozícióit eltároljuk egy dinamikus tömbben (Pos), mivel ezekre a következő ciklusban szükségünk lesz.
A QuickReport-on van egy Summary Band is, amin az összesített értékeket jelenítjük meg. Azt, hogy az adott összesített érték melyik mezőhöz tartozik, az összesített érték objektumának Tag property-jében adhatjuk meg. Ebben a property-ben a mező indexét kell megadni. A Pos tömbből egyszerűen kiolvashatjuk az adott mező pozícióját.
Az eljárás végén a létrehozott objektumokat felszabadítjuk.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 564. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|