Home » Tutorials » Third-Party-Komponenten » Quick Reports

Quick Reports

Drucken, ohne Quick-Report-Komponenten zu verwenden

Manchmal haben Sie Druckanforderungen, denen QR nicht gerecht werden kann. In diesen Fällen sind Sie möglicherweise gezwungen, das grundlegende Drucker-Interface der TPrinter-Komponente zu verwenden. Sehen Sie zu weiteren Informationen über die Drucker-Komponente unter TPrinter in der Delphi-Hilfe nach. Im Wesentlichen schreiben Sie Text auf eine Oberfläche (canvas), wobei es sich eher um Papier als um den Bildschirm handelt. Dazu müssen Sie den Output auf LPT1 oder welchen Port auch immer Sie verwenden wollen setzen, Ihrem Drucker sagen, dass er anfangen soll zu drucken, und dann Zeile für Zeile an Text auf Ihrer Oberfläche ausgeben. Wenn Sie mit einer Seite fertig sind, können Sie eine neue Seite anfordern und fortfahren oder dem Drucker mitteilen, dass Sie fertig sind und beenden wollen. Hier ein Rahmen, den Sie für den Anfang verwenden können:

procedure TForm1.Button1Click(Sender: TObject);
var I : Integer ;
begin
  with Printer do begin
    BeginDoc;
    Canvas.font.size := 12;
    for I:= 0 to 8 do
      Canvas.textout(I*572, I*572, IntToStr(I));
    EndDoc;
  end;
end;

In diesem Beispiel haben wir einen Button, der dazu verwendet wird, den Druckprozess zu starten. Sie müssen die Unit Printers der uses-Klausel des Formulars hinzufügen. Printer ist das Objekt, zu dem Sie die Ausgabe umleiten. BeginDoc wird zum Öffnen der Datei zum Drucken verwendet. Sie können den Druckstil ändern, indem Sie auf printer.canvas zugreifen. In diesem Beispiel verändern wir die Schriftgröße auf 12. Als nächstes drucken wir an bestimmten Stellen auf der Seite die Zahlen von 1 bis 8 (I) unter Verwendung von canvas.textout. Die Zahl 572 ist die Pixelzahl für eine Bewegung von etwa 1 Inch. Das ist keine feste Zahl, sondern kann von Drucker zu Drucker variieren. Theoretisch ist es die Zahl von Punkten pro Inch (dpi). Die erste Variable im Canvas.TextOut ist die X-Koordinate, die zweite die Y-Koordinate und die letzte ist der Text selbst.
Weil Sie dei Seite erzeugen und dann zum Drucker schicken, indem Sie den EndDoc-Befehl verwenden, können Sie Text überall auf der Seite auf die Weise positionieren, die Ihnen am meisten entgegenkommt. Hier ein Beispiel:

 Canvas.font.size := 8;
 Canvas.textout(170, I + 220, Table1Name.Value);
 Canvas.textout(2500, I + 220, Table1Name.Value);

In diesem Fall wird derselbe Text an zwei Stellen (170 und 2500 Pixel) derselben Zeile platziert.

Ablagefächer und andere Drucker-Features festlegen

Obwohl Drucker mit mehr und mehr Features ausgeliefert werden, ist das programmseitige Verwenden davon leider ziemlich schwierig. Der Schlüssel dazu ist zu erkenne, dass Windows seinen eigenen Drucker-Dialog und QR seinen eigenen hat. Diese beiden Quellen von Druckerinformationen sprechen nicht miteinander. Daher müssen Sie einige Einstellungen überschreiben, um Standardwerte für einen bestimmten Report zu überschreiben. Bevor Sie beim Durchsuchen der Windows-API verrückt werden, versuchen Sie die QuickRep-Einstellungen zu verwenden, die zur Verfügung stehen. Vor allem gibt es da Papiergröße und Ausrichtungseinstellungen, welche normalerweise gut funktionieren.
Wenn Sie einen anderen Drucker als den Standarddrucker verwenden müssen, müssen Sie den Standarddrucker programmseitig ändern, Ihren Report laufen lassen und ihn dann wieder zurückändern. Hier etwas Beispielcode, wie das zu tun ist:

procedure SetDefaultPrinter(PrinterName: String);
var
   I: Integer;
   Device : PChar;
   Driver : Pchar;
   Port   : Pchar;
   HdeviceMode: Thandle;
begin
  Printer.PrinterIndex := -1;
  //Save for use later Defaultprintername
  //is a global variable.
  DefaultPrinterName := Printer.Printers[Printer.PrinterIndex];
  with Printer.printers do begin
    //Count is a printers property
    for I := 0 to Count-1 do begin
      if PrinterDevice(Objects[I]).Device := PrinterName then begin
        Printername := Printer.printers[I];
        Device := PChar(TprinterDevice(objects[I]).Device);
        Driver := Pchar(TprinterDevice(objects[I]).Driver);
        Port   := Pchar(TprinterDevice(objects[I]).Port);
        StrCat(Device, ',');
        StrCat(Device, Driver );
        StrCat(Device, Port );
        WriteProfile('windows', 'device', Device );
        StrCopy( Device, 'windows' );
        SendMesssage(HWND_BROADCAST, WM_WINICHANGE, 0, Longint(@Device));
        HDeviceMode := 0;
      end;
    end;
  end;
end;

Andere Quellen

Jeder, der das meiste aus Quick Reports und/oder Drucken im Allgemeinen herausholen möchte, sollte die Vorteile dieser Quellen nutzen:

  1. Die QR-Samples, die sich im Demo-Unterverzeichnis von Delphi befinden.
  2. Das Handbuch und andere Tutorials, die sich im Download-Bereich der Websites QuSoft.com oder QuSoft.No befinden.

Autor: Tom Nesler
Das englischsprachige Original befindet sich unter http://delphi.about.com
Übersetzung mit freundlicher Genehmigung des Autors