Delphi - Saját készítésű QuickReport komponens

forráskód letöltése
Ha a QuickReport-hoz szeretnénk nyomtatható komponenseket készíteni, akkor bajban vagyunk, hiszen ennek dokumentálását nem vitték túlzásba a készítők. A beépített Help-ben jóformán semmiféle információt nem találunk erről, csupán homályos utalásokat, pedig nem egy egyértelmű dologról van szó. Ebben a cikkben egy egyszerű példát adunk közre, melyből megtudhatjuk, hogy hogyan is készíthetünk ilyen komponenseket. A mellékelt példaprogram megnyitása előtt a QRSmile.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A példa tényleg egyszerű, a komponens a jól ismert sárga vigyorgó fejet jeleníti meg, amit elhelyezhetünk nyomtatandó QuickReport-unkon, ezzel reprezentálva, hogy mennyire is élvezzük a programfejlesztést…

Mindenekelőtt tudni kell, hogy a QuickReport nyomtatható komponensei mind a TQRPrintable osztályból származnak. Ennél többet a Help-ből sajnos nem tudhatunk meg, de sebaj.

A hagyományos vizuális komponensekkel ellentétben nem elég egy Paint metódus a kívánt eredményhez. Ha csak ezt használnánk, akkor már a nyomtatási nézetben sem jelenne meg a komponens. A Paint metódus a komponens szokásos megjelenítését végzi el, míg a Print metódus a nyomtatási nézet, illetve a nyomtatón történő megjelenítést. Ebből az következne, hogy kétszer kell megírnunk a megjelenítéshez szükséges kódot, mivel a két megjelenítési mód eltér egymástól. Ezen egy kis trükkel segítünk, ezért jött létre a RedrawTo eljárás, ami ezt a problémát megoldja.

A komponens deklarációja így néz ki:
  TQRSmile = class(TQRPrintable)
  private
    procedure RedrawTo(canv: TCanvas; crect: TRect);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;
    procedure Print(X, Y: integer); override;
  end;
A komponens megjelenítését a szerkesztési nézetben tehát a Paint metódus végzi el. Ebben semmi más dolgunk nincs, mint meghívni a RedrawTo eljárást. Ennek két paramétere van: a Canvas, amire a komponenst meg kell rajzolni, és a komponens területét meghatározó TRect típusú paraméter.
procedure TQRSmile.Paint;
begin
  inherited;
  RedrawTo(Canvas, ClientRect);
end;
A Print eljárásban egy kicsit több dolgunk lesz, mivel itt a QRPrinter objektum Canvas-ára kell rajzolni, méghozzá a megadott pozícióba. A koordinátákat a QRPrinter XPos és YPos függvényekkel kell kiszámolni.
procedure TQRSmile.Print;
var
  r:TRect;
begin
  if ParentReport.FinalPass and IsEnabled then begin
    with QRPrinter do begin
      with Canvas do begin
        r.Left:=XPos(X+Size.Left);
        r.Top:=XPos(Y+Size.Top);
        r.Right:=XPos(X+Size.Left+Size.Width);
        r.Bottom:=YPos(Y+Size.top+Size.Height);
        RedrawTo(QRPrinter.Canvas, r);
      end;
    end;
  end;
  inherited;
end;
A lényegi munkát tehát a RedrawTo eljárás végzi. Természetesen ez egy saját eljárás, tehát bármi más is lehetne a neve. Fontos, hogy itt ne a komponens Width, Height, Left, Top stb. tulajdonságait használjuk, mert akkor a nyomtatási képen egy kicsit furcsa eredményt fogunk kapni. Éppen ezért a crect paramétert használjuk, amiből megtudjuk a tényleges koordinátákat. Innentől kezdve már csak fel kell használnunk ezeket a rajzoláshoz…