Delphi - Dinamikus Quick Report készítése

forráskód letöltése
Ebben a példában egy olyan Quick Report listát készítünk, amelynek tartalma dinamikusan épül fel, az adatforrást megjelenítő DBGrid alapján. A listában megjelenő adatoszlopok sorrendje és mérete a DBGrid-ben megadott sorrendtől és mérettől függ.
Amennyiben az ADOConnection1 objektumban megadott ConnectionString értéke az Ön beállításainak nem megfelelő, úgy módosítsa azt, hogy az SQL szerver Northwind adatbázisa elérhetővé váljon.
A Quick Report elkészítése
A QuickRep komponensen szerkesszük meg a nyomtatási képet.
Az adatmezők fejlécének megjelenítéséhez szükséges egy TQRBand objektum, melynek BandType property-jét rbColumnHeader-re állítjuk (brHeader).
Az adatmezők tartalmát ugyancsak egy TQRBand objektum segítségével jelenítjük meg, melynek BandType property-jét rbDetail-re állítjuk (brDetail).
A két Band-en a komponenseket dinamikusan hozzuk majd létre. A létrehozott komponenseket két dinamikus tömbben tároljuk el.
private
  FLabelList: array of TQRLabel;
  FDBTextList: array of TQRDBText;
Szükségünk van egy eljárásra, amely a QuickRep komponenst tartalmazó Form bezárásakor felszabadítja a két dinamikus tömböt.
procedure FreeLists;
A tömb elemeit egy for ciklus és egy segédváltozó segítségével felszabadíthatjuk.
for i:=Length(FLabelList)-1 downto 0 do begin
  l:=FLabelList[i];
  l.Free;
end;
A mezők fejlécét TQRLabel típusú komponensek segítségével jelenítjük meg a létrehozott brHeader objektumon. Készítünk egy függvényt, amely létrehoz egy QRLabel-t és elhelyezi a megfelelő pozícióban.
procedure AddLabel(iCaption: String; iLeft, iTop, iWidth, iAlign: Integer);
A paraméterek jelentése sorrendben: felirat, bal oldali koordináta, felső oldali koordináta, szélesség, igazítás.
Az igazítás értéke 1 esetén taRightJustify, egyébként taLeftJustify. Az igazítást szám típusú mezők megjelenítésénél használhatjuk ki, a jobbra igazítással.
A QRLabel komponenst dinamikusan hozzuk létre.
l:=TQRLabel.Create(Nil);
with l do begin
  Parent:=brHeader;
  AutoSize:=False;
Miután létrehoztuk a komponenst és beállítottuk tulajdonságait, felvesszük a dinamikus tömbbe.
SetLength(FLabelList,Length(FLabelList)+1);
FLabelList[Length(FLabelList)-1]:=l;
Hasonlóan járunk el az adatmezők tartalmát megjelenítő QRDBText komponensek esetében is.
A QuickRep komponens mértékegységét állítsuk át Pixel-be, betűtípusa pedig legyen DBGrid betűtípusával megegyező.
Report elemek létrehozása GRID alapján
frmPrintForm:=TfrmPrintForm.Create(Application);
with frmPrintForm do begin
Állítsuk be a QuickRep komponens DataSet property-jét.
Report.DataSet:=ADOQuery1;
Szükségünk van két segédváltozóra, amelyek segítségével a soron következő Left (l) és Top (t) koordinátákat tartjuk nyilván.
Egy for ciklus segítségével végigmegyünk a DBGrid oszlopain.
for i:=0 to DBGrid1.Columns.Count-1 do begin
Az elemek szélességét a DBGrid oszlopszélességei alapján adjuk meg. Amennyiben az adott oszlop már nem férne el a lap széléig, úgy új sort kezdünk.
if l+DBGrid1.Columns[i].Width+5>brHeader.Width-5 then begin
  l:=10;
  Inc(t,17);
  brHeader.Height:=brHeader.Height+17;
  brDetail.Height:=brDetail.Height+17;
end;
A létrehozandó QRLabel vagy QRDBText komponens Alignment tulajdonságát az adott mező típusa alapján határozzuk meg.
if (ADOQuery1.FieldByName(DBGrid1.Columns[i].FieldName).DataType=ftInteger) or
...
Végül létrehozzuk a komponenseket a megadott koordinátákon.
AddLabel(DBGrid1.Columns[i].Title.Caption,l,t, DBGrid1.Columns[i].Width,a);
AddDBText(DBGrid1.Columns[i].FieldName,l,t, DBGrid1.Columns[i].Width-5,a);