23. Vytváření sestav

Tato kapitola obsahuje následující sekce:


Naše první sestava

QuickReport je proužkový generátor sestavy. Naše sestavy jsou budovány ze sekcí (proužků) s textovými a grafickými komponentami na nich. Tyto proužky jsou replikovány k znázornění našich dat k vytvoření finální sestavy. Jednoduchá sestava může obsahovat tyto komponenty na formuláři: K vytvoření sestavy provedeme tyto kroky: K prohlédnutí sestavy, v místní nabídce komponenty TQuickRep zvolíme Preview. Zobrazí se okno s naší sestavou. Se sestavou nyní můžeme pracovat při návrhu, ale můžeme s ní chtít také pracovat za běhu. K aktivaci sestavy za běhu musíme provést tyto kroky: Když nyní spustíme aplikaci a stiskneme tlačítko, pak uvidíme sestavu. K přímému tisku sestavy můžeme místo Preview volat metodu Print.
Tím máme vytvořenou sestavu typu jednoduchého seznamu. V následujících bodech se seznámíme s vytvářením všech typů sestav.

Různé typy proužků

Je důležité se seznámit s různými typy proužků. Po expandování vlastnosti Bands komponenty TQuickRep můžeme přidávat a odstraňovat šest nejobecnějších typů proužků. Proužky jsou zobrazovány na komponentě TQuickRep v pořadí v jakém budou tisknuty.
Proužky mohou být také přidány vložením komponenty TQRBand z Palety komponent na komponentu TQuickRep. Musíme potom nastavit vlastnost BandType na příslušnou hodnotu. Je také vhodné dávat komponentám proužků popisná jména, jako PageHeaderBand, DetailBand apod. Toto je vše provedeno automaticky, pokud přidáme proužek pomocí vlastnosti Bands komponenty TQuickRep.
Mimo těchto proužků jsou proužky pro vytváření skupin a sestav Master-detail.

Připojování dat

QuickReport může získávat data z mnoha typů zdrojů dat. Obvykle připojíme naši sestavu ke komponentě datové množiny, jako je TTable nebo TQuery. Datová množina může být na stejném formuláři jako sestava, na jiném formuláři v našem projektu nebo v datovém modulu. Pak nastavíme vlastnost DataSet komponenty TQuickRep na tuto datovou množinu. Datová množina musí být aktivní; není-li pak sestavu nelze generovat.

Filtrování a řazení dat

QuickReport nemá žádnou službu na řazení dat. Data jsou vždy vypisována v pořadí jejich dodávání datovou množinou. Pořadí můžeme ovlivňovat aktivním indexem komponenty TTable nebo klauzulí ORDER BY v příkazu SQL komponenty TQuery.
Filtrování dat lze provádět několika způsoby. Lze využít možnosti filtrování datových množin. Další možností je použití obsluhy události BeforePrint našeho detailního proužku k zapínání a vypínání tisku. Následuje příklad této obsluhy:
void __fastcall TForm1::DetailBand1BeforePrint(TQRCustomBand *Sender,
      bool &PrintBand)
{
  PrintBand = Table1->FieldByName("Company")->AsString > "H";
}

Přidávání textu a datových položek

K výpisu textu na sestavě, přidáme na sestavu tisknutelné komponenty. Dvě základní tisknutelné komponenty jsou TQRLabel a TQRBDBText.
Komponenta TQRLabel se používá k výpisu statického textu nebo textu a čísel vytvořených naší aplikací v průběhu generování sestavy. K výpisu statického textu pouze umístíme komponentu na proužek, určíme její pozici a požadovaný text přiřadíme do její vlastnosti Caption. Text se nyní bude zobrazovat na proužku a bude vypisován v této relativní pozici vždy při výpisu samotného proužku.
Modifikací vlastnosti Font můžeme změnit použité písmo a jeho barvu. QuickReport podporuje libovolné písmo TrueType nebo PostScript.
Vlastnost Caption můžeme měnit v libovolné obsluze události v průběhu generování sestavy.To umožňuje provést výpočty nebo operace s řetězci v kódu a výsledek zobrazit v sestavě.
Databázové položky mohou být vypisovány pomocí komponenty TQRDBText. Umístíme ji na proužek a vlastností DataSet ji připojíme k tabulce nebo dotazu, kterou chceme vypisovat na formulář. Pak vybereme položku ve vlastnosti DataField.
Můžeme také použít komponentu TQRExpr k výpisu statického nebo dynamického textu a databázové položky.

Vytváření sestav

Prvním krokem při vytváření QuickReport je vytvoření formuláře k vložení naší komponenty TQuickRep. Na tento formulář se odkazujeme jako na Sestavový formulář, neboť pracuje jako kontejner pro naši sestavu a nikdy jej nebude zobrazovat koncový uživatel naší aplikace. Sestavový formulář je uváděn ve Správci projektu a tedy je vhodné jej pojmenovat tak, aby bylo jasné, že se jedná o Sestavový formulář. Např. všechna jména Sestavových formulářů mohou začínat rep.
Druhým krokem je vložení komponenty TQuickRep na náš sestavový formulář. Jelikož máme pojmenované formuláře k popisu sestavy, je vhodné dávat všem komponentám sestavy stejné jméno. Jednoduše nazveme komponentu TQuickRep jménem Report a budeme se potom na ni odkazovat jako na repCustomerListing->Report, repSalesListing->Report, atd.

Mřížka, jednotky a zvětšování

Když umístíme komponentu TQuickRep na formulář, pak vidíme mřížku, která nám pomáhá při umisťování komponent. Mřížka je zobrazena v současných jednotkách QuickReport. Právě aktivní jednotky vybereme ve vlastnosti Units komponenty TQuickRep. Když změníme tuto vlastnost, pak mřížka se změní.
Na většině monitorů máme problémy se zobrazením celé komponenty TQuickRep, neboť přebírá velikost aktuálně vybrané velikosti papíru. K zobrazení větší části komponenty můžeme změnit vlastnost Zoom. Tuto vlastnost můžeme také používat při umisťování důležitých detailů.

Velikost papíru a okraje

Nastavovat naši stránku můžeme expandováním vlastnosti Page komponenty TQuickRep. Po expandování vlastnosti vidíme všechny podvlastnosti řídící rozvržení stránky. Hodnoty jsou v pravě zadaných jednotkách. Vybraný okraj je znázorněn jako modrá čárkovaná čára okolo komponenty TQuickRep. Proužky jsou umístěny mezi okraji.
Vlastností Orientation určujeme, zda papír je umístěn na šířku nebo na výšku a vlastností Ruler vypínáme nebo zapínáme zobrazování mřížky.
PaperSize může nabývat některou z následujících hodnot: Letter, LetterSmall, Tabloid, Ledger, Legal, Statement, Executive, A3, A4, A4Small, A5, B4, B5, Folio, Quarto, qr10X14, qr11X17, Note, Env9, Env10, Env11, Env12, Env14, CSheet, DSheet a ESheet.
Jedná se o všechny implicitní velikosti papírů definované ve Windows. Výběrem velikosti papíru jsou automaticky nastaveny vlastnosti PaperLength a PaperWidth. Můžeme také nastavit PaperSize na Custom a zadat PaperLength a PaperWidth podle potřeby. Ne všechny tiskány podporují všechny velikosti papíru. Pokud jsme vybrali papír velikosti, který naší tiskárnou není podporován, pak při přípravě sestavy je automaticky přepnuta velikost na implicitní papír. Implicitní velikost papíru je učena v nastavení tiskárny.

Vybírání písma

Implicitní písmo pro naši sestavu je určeno vlastností Font komponenty TQuickRep. Z dostupných písem je vhodné používat písma TrueType a PostScripts; Systémová písma jsou také dostupná ale jsou omezena pouze na některé velikosti.
Implicitně, všechny komponenty na sestavě zdědí písmo nastavené pro sestavu. Pro libovolnou komponentu na sestavě můžeme nastavit vlastní písmo. Definici písma můžeme také přepisovat na úrovni proužku.

Titulek a popis sestavy

Sestava může mít titulek a popis. Tyto vlastnosti jsou důležité pro identifikaci a popis sestavy v naši aplikaci. Obvykle máme seznam všech našich sestav a zobrazíme popis, když uživatel sestavu vybere. Titulek můžeme také vypsat na sestavě pomocí komponenty TQRSysData.

Přidávání proužků

QuickReport je generátor sestav založený na proužcích a tedy proužky jsou značně důležitou částí sestavy. Pokud se podrobněji seznámíme s proužkovými generátory sestav, pak můžeme říci, že proužek je malá papírová šablona, která se kopíruje na stránku a zaplňuje daty. Různé šablony jsou kopírovány na různé části stránky (sestavy).
Nejsnadnější možností pro přidávání proužků je pomocí rozšířené vlastnosti Bands komponenty TQuickRep. Vidíme zde seznam obecných proužků a můžeme zadávat, zda jednotlivé proužky se vyskytují nebo nevyskytují na sestavě. Můžeme přidat nebo zrušit proužek pouhou změnou false na true nebo naopak. Když proužek je vytvořen tímto způsobem, pak získá popisné jméno, jako DetailBand1, PageHeaderBand1 apod. Typ proužku je také nastaven automaticky.
Proužky můžeme také přidávat komponentou TQRBand. V tomto případě musíme nastavit požadovaný typ proužku a dát mu popisné jméno. Vlastnost Bands v Inspektoru objektů také ukazuje takto přidané proužky.
Typy proužků, které na sestavu můžeme přidávat těmito dvěmi způsoby jsou:
 
PageHeader První proužek zobrazovaný na všech stránkách. Jeho zobrazování na první stránce závisí na vlastnosti TQuickRep->Options->FirstPageHeader. Implicitně na první stránce není uváděn.
Title Titulní proužek je prvním proužkem vypisovaným v sestavě (po případném hlavičkovém proužku na první stránce). Zde obvykle uvádíme titulek sestavy, výběrová kritéria, datum a čas vytvoření apod.
ColumnHeader Proužek hlaviček sloupců je vypisován v horní čísti každé sloupcové sestavy. V normální jednosloupcové sestavě je tento proužek vypisován pouze jednou na stránce, pod hlavičkou stránky (a titulním proužkem na první stránce). Pro více sloupcové sestavy je vypisován jednou pro každý sloupec. Je užitečný pro výpis jmen položek.
Detail Jeden detailní proužek je vypisován pro každý záznam (řádek) dat v naši datové množině. Je to nejdůležitější proužek v naší sestavě a obvykle zabírá nejvíce místa ve výsledné sestavě. Obvykle obsahuje tisknutelné ovladače (TQRDBText a další).
Summary Za všemi detailními pásky můžeme zobrazit součtový proužek. Používá se pro výpis součtů číselných položek.
PageFooter Poslední proužek vypisovaný na všech stránkách. Zda bude i na poslední stránce závisí na vlastnosti TQuickRep->Options->LastPageFooter. Implicitně na poslední stránce není vypisován.

Když proužky přidáme na sestavu, pak jsou automaticky umístěny v jejich zobrazovacím pořadí. Vidíme, že proužek hlavičky stránky je první, následuje jej titulní proužek, proužek hlaviček sloupců apod.
Typ proužku je vypsán v jeho dolním levém rohu malým písmem. To nám pomáhá identifikovat proužky při návrhu sestavy. Na výsledné sestavě tento text vypisován není.
Poznámka: I když je možno manuálně přidat proužek a nastavit jeho typ na SubDetail nebo GroupHeader, není to vhodné. Tyto typy proužků jsou rezervovány pro komponenty TQRSubDetail a TQRGroup. Nastavení těchto typů proužků může způsobit při výpisu sestavy chyby.

Nastavení velikosti proužku

Proužky získávají svou vodorovnou velikost automaticky. Pro jednosloupcové sestavy je to šířka stránky bez okrajů. Jedinou možností změnit šířku proužku je změna okrajů (nebo velikosti papíru).
Šířka některých proužků také závisí na vlastnosti Page->Columns komponenty TQuickRep. Pokud vytváříme vícesloupcovou sestavu (jako telefonní seznam), pak šířka např. detailního pásku je určena dostupným místem pro jeden sloupec.
Můžeme změnit svislou šířku proužku. Provedeme to výběrem proužku a změnou jeho výšky přetažením myší. Pokud výšku proužku chceme nastavit přesně, pak můžeme použít jeho vlastnost Size k nastavení přesné hodnoty s použitím aktuálních jednotek sestavy.
I když můžeme nastavit hodnotu pro šířku proužku v Inspektoru objektů, tato hodnota není používána za běhu a je možno ji použít pouze pro čtení.

Pořadí výpisu proužků

Proužky jsou zobrazovány na komponentě TQuickRep v aktuálním vypisovacím pořadí. Je ale dobré toto pořadí pochopit. Obecně proužky jsou vypisovány v tomto pořadí:
Hlavička stránky (bude uváděná na začátku každé stránky)
Titulek (první stránka)
Hlavička sloupců zopakovaná pro všechny sloupce
Detail opakovaný pro všechny záznamy
Součet (poslední stránka)
Patička stránky (bude na konci všech stránek)
Může to být někdy složitější, pokud jsou vloženy proužky poddetailů a skupin, ale toto základní schéma platí vždy.

Vypínání a zapínání proužků

Můžeme někdy požadovat zakázat výpis proužku v závislosti na nějaké podmínce a to jak při návrhu nebo za běhu. Při návrhu to provedeme nastavením vlastnosti Enabled komponenty TQRBand na false. Tato vlastnost může být také nastavena za běhu, před generování sestavy nebo nějaké obsluze události během generování sestavy.
V průběhu generování sestavy můžeme také dočasně zakázat výpis proužku z obsluhy události proužku BeforePrint. Tato událost má parametr PrintBand, který můžeme nastavit na false. Tím potlačíme zobrazení proužku pro současný záznam datové množiny (je možno použít jako filtr).
Podívejme se znova na již uvedený příklad:
void __fastcall TForm1::DetailBand1BeforePrint(TQRCustomBand *Sender,
      bool &PrintBand)
{
  PrintBand = Table1->FieldByName("Company")->AsString > "H";
}
Pokud vypneme zobrazování patičky stránky, pak získané prázdné místo ve spodní části stránky bude zaplněno detailními pásky.

Přidávání tisknutelných komponent na sestavu

K výpisu nějakých informací v naši sestavě, přidáme tisknutelné komponenty na proužek. Je několik tisknutelných komponent, které můžeme vložit na sestavu. Jsou uvedeny v následující tabulce:
 
TQRLabel Vypisuje statický text podobně jako TLabel na formuláři. Vlastnost Caption může být v průběhu generování sestavy měněna.
TQRDBText Vypisuje databázovou položku (i BLOB) podobně jako TDBText na formuláři.
TQRExpr Vyhodnocuje a vypisuje výraz QuickReport. 
TQRSysData Používáno k výpisů informací typu titulek sestavy, číslo stránky, datu a čas. Některé z těchto informací mohou být také vypisovány komponentou TQRExpr.
TQRMemo Podobá se TQRLabel, s tím že akceptuje víceřádkový text. Obvykle používáno pro dlouhý statický text.
TQRRichText Vypisuje RichText formátovaný text. Může být spojena s komponentou RichEdit na formuláři a vypisovat její obsah.
TQRDBRichText Datová verze TQRRichText.
TQRShape Zobrazuje obdélníky, kružnice a svislé nebo vodorovné čáry.
TQRImage Používáno k výpisu statických obrázků. Jsou použitelné bitové mapy (BMP), metasoubory (WMF) nebo ikony.
TQRDBImage Datová verze TQRImage. Získává obrázek z BLOB položky.

O textových komponentách

Všechny textové komponenty QuickReport sdílejí základní funkčnost zděděnou od svého společného předka. Jedná se o vlastnosti:

Výpis statického textu

Statický text jako hlavičky, titulky a jména sloupců jsou obvykle zobrazovány komponentou TQRLabel. Pouze ji umístíme na proužek a nastavíme její vlastnost Caption.
Pokud požadujeme dlouhý blok statického textu, pak můžeme použít komponentu TQRMemo. Toto není datová komponenta a vkládat do ní text můžeme pomocí vlastnosti Lines. Text můžeme také zavádět za běhu z proudu nebo souboru pomocí metod LoadFromStream nebo LoadFromFile vlastnosti Lines.

Vypisování databázových položek

Nejjednodušší možností výpisu položky z tabulky nebo dotazu je použití komponenty TQRDBText. Pracuje podobně jako TQRLabel, ale místo vlastnosti Caption má vlastnosti DataSet a FieldName. Tím připojíme komponentu k libovolné položce. Je možno používat všechny typy položek s výjimkou položek BLOB. Když vybereme položku, pak na návrhovém formuláři je zobrazeno její jméno. Nepřipojené položky nejsou zobrazeny.

Formátování výstupu

TQRDBText může použít všechny formátovací volby definované pro položku. Nejsou-li definovány, pak položka je zobrazena v implicitním formátu. Pro specifikaci formátování použijeme vlastnost Mask položky. Maska pracuje různě pro různé typy položek. Číselné položky jsou formátovány pomocí funkce FormatFloat. Datumové a časové položky formátujeme funkcí FormatDataTime.

Výpis Memo položek

Memo položky jsou vypisovány podobně jako ostatní položky komponentou TQRDBText. Můžeme jim dát jednotnou velikost nastavením AutoSize a AutoStretch na false a manuálním nastavením velikosti. Bude potom zobrazován pouze text, který se vejde do uvedeného obdélníku.

Výpis tvarů

Tvary jsou užitečné pro vytváření vizuálních efektů a k zlepšení vzhledu sestavy. Tvary zobrazujeme pomocí komponenty TQRShape. Komponentu umístíme na proužek a nastavíme její vlastnost Shape na Rectangle, Circle, HorzLine, VertLine, LeftAndRight nebo TopAndBottom. Pomocí vlastnosti Pen nastavíme šířku a barvu pera a vlastností Brush nastavíme styl a barvu štětce.

Statické obrázky

Umístíme komponentu TQRImage na proužek a dvojitě klikneme na její vlastnost Picture nebo na samotnou komponentu k vyvolání dialogu Open Image. Nalezneme požadovaný obrázek a stiskneme OK.

Zavádění obrázků za běhu

K zavedení obrázku za běhu, před nebo v průběhu generování sestavy použijeme metodu LoadFromFile vlastnosti Picture komponenty TQRImage.

Obrázky uložené v tabulkách

K zobrazení obrázků uložených v BLOB položkách používáme TQRDBImage. Umístíme komponentu na formulář a nastavíme její vlastnosti DataSet a DataField na BLOB položku obsahující obrázek. QuickReport pak zavádí a zobrazuje obrázek během generování sestavy.

Zobrazování formátovaného textu

Formátovaný text RichText můžeme zobrazovat komponentami TQRRichText a TQRDBRichText. TQRRichText může být připojena na komponentu TRichText umístěnou na formuláři v naši aplikaci pomocí vlastnosti ParentRichEdit. Na sestavě je potom zobrazen obsah této nadřízené komponenty.
Pro zobrazování RichText uloženého v položkách BLOB používáme komponentu TQRDBRichText.

Vytváření skupin

Komponentu TQRGroup nalezneme na stránce QuickReport Palety komponent. Když ji umístíme na sestavu, pak se zobrazí jako proužek. Tento proužek bude hlavičkou skupiny. Vždy, když skupina skončí (nebo skončí vyšší úroveň skupiny) pak tento hlavičkový proužek bude zobrazen. Dále můžeme také přidat patičkový proužek skupiny. Provedeme to komponentou TQRBand. Pak nastavíme vlastnost FooterBand komponenty TQRGroup na nově vytvořený proužek.
TQRGroup má vlastnost Master, která je automaticky nastavena na hlavní komponentu QuickReport. Je zobrazen nad detailním proužkem v sestavě. Správně připojený patičkový proužek skupiny je zobrazen pod detailním proužkem.
Nejdůležitější vlastností TQRGroup je Expression. Do této vlastnosti zadáme přípustný výraz QuickReport. Skupina skončí, když výsledek tohoto výrazu se změní. Předpokládejme tabulku zákazníků s aktivním indexem pro sloupce State + Company. Hlavičku skupiny chceme vypisovat, když se změní stát. Jako výraz pro skupinu pak pouze zadáme State. Vyhodnocovač výrazu lokalizuje položku State a zobrazí hlavičku skupiny před každým novým státem. V připojené patičce skupiny (je vypisována za všemi zákazníky státu), můžeme uvést počet zákazníků státu, celkovou hodnotu jejich objednávek apod.
Komponenta TQuery použije následující dotaz:
select * from customer order by state, company
Výraz pro skupinu je State
Povšimněte si, ža na sestavě použijeme dvě komponenty TQRExpr. První TQRExpr je umístěna na hlavičce skupiny a používá následující výraz.
if(State <> '', State, 'Unknown state')
Ne všechny zákazníci mají uveden stát a výraz pro ně vrací Unknown state, pro ostatní vrací aktuální stát.
Komponenta TQRExpr na patičce skupiny má následující výraz:
'Customers in ' + State + ' : '  + Str(Count)
Tento výraz vypisuje počet zákazníků pro každý stát. Vlastnost Master je připojena na komponentu TQuickRep a ResetAfterPrint je nastaveno na true a tak Count je pro každý stát vynulováno.

  1. Nyní se podíváme na další již hotový program. Nalezneme jej v adresáři Program files\Borland\CBuilder\Examples\DBTask\QuikkRep. Aplikace umožňuje vybírat různé sestavy. Aplikaci si prohlédněte a vyzkoušejte ji.
  2. Další program nalezneme v adresáři Program files\Borland\CBuilder\Examples\DBTask\MastApp. Jedná se o složitou aplikaci používající Quick Report. Aplikaci si prohlédněte.
23. Vytváření sestav