Verwendung des "Engine" Objekts
Verwendung des "Engine" Objekts
Wir haben bereits gesagt, dass das “Engine” Objekt den Motor des Berichts darstellt, der die Berichtserstellung verwaltet. Der Prozess der Anordnung von Band(s) auf einer Seite kann durch die Eigenschaften und Methoden des Motors gesteuert werden. Zuerst etwas Theorie.
Das Diagramm unten zeigt verschiedene Dimensionen der Berichtseite.

Die physischen Dimensionen der Seite sind die Eigenschaften “PaperWidth” und “PaperHeight”, die im Objektinspektor sichtbar sind, wenn die Seite ausgewählt ist. Die Größe einer A4-Seite beträgt also 210 x 297 mm.
“PageWidth” und “PageHeight” sind die Dimensionen des druckbaren Bereichs, der normalerweise kleiner ist als die physischen Dimensionen der Seite. Die Größe des druckbaren Bereichs hängt von den Berichtseiteneigenschaften “LeftMargin”, “TopMargin”, “RightMargin” und “BottomMargin” ab. Die Größe des druckbaren Bereichs in Pixeln wird durch die Funktionen “Engine.PageWidth” und “Engine.PageHeight” zurückgegeben.
Schließlich ist “FreeSpace” die Höhe des freien Raums auf einer Seite. Wenn sich ein "Page Footer" Band auf der Seite befindet, wird seine Höhe bei der Berechnung des “FreeSpace” berücksichtigt. Diese Höhe wird in Pixeln durch die Funktion “Engine.FreeSpace” zurückgegeben. Beachten Sie, dass nach der Anzeige des nächsten Bands der freie Raum auf der Seite reduziert wird, dies wird bei der Berechnung des “FreeSpace” berücksichtigt.
Wie werden Berichtseiten erstellt? Der FastReport-Kern zeigt Bänder auf einer Seite an, solange genügend freier Raum vorhanden ist. Wenn kein freier Raum mehr vorhanden ist, wird das “Page Footer" Band gedruckt (falls erforderlich) und eine neue leere Seite erstellt. Wie bereits gesagt, wird nach der Anzeige des nächsten Bands die Höhe des freien Raums reduziert. Darüber hinaus beginnt die Anzeige des nächsten Bands von der aktuellen Position, die durch Koordinaten auf der X-Achse und der Y-Achse definiert ist. Die aktuelle Position wird durch “Engine.CurX” und “Engine.CurY” zurückgegeben. Nach dem Drucken des nächsten Bands erhöht sich CurY automatisch um die Höhe des gedruckten Bands. Nach dem Erstellen einer neuen Seite entspricht “CurY” “0.” “CurX” wird beim Drucken mehrspaltiger Berichte geändert.
“Engine.CurX” und “Engine.CurY” sind nicht nur zum Lesen, sondern auch zum Schreiben verfügbar. Das bedeutet, dass Bänder verschoben werden können, indem diese Werte erhöht oder verringert werden. Zum Beispiel in einem Bericht, der so aussieht:

Es kann auf folgende Weise gedruckt werden:

Dies wird erreicht, indem ein Handler für das “OnBeforePrint” Ereignis des Bands geschrieben wird:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurX := Engine.CurX + 5;
end;
Die Änderung von “CurY” kann dazu führen, dass Bänder sich überlappen, zum Beispiel:

Erreicht durch dieses Skript:
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
Engine.CurY := Engine.CurY - 15;
end;
Die Methode “Engine.NewPage” fügt an einer beliebigen erforderlichen Stelle in einem Bericht einen Seitenumbruch ein, wonach das Drucken von oben auf der neuen Ausgabeseite fortgesetzt wird. In unserem Beispiel kann ein Umbruch nach dem Drucken des zweiten Datensatzes eingefügt werden:
procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
begin
if <Line> = 2 then
Engine.NewPage;
end;
Beachten Sie, dass wir das “OnAfterPrint” Ereignis verwendet haben (das heißt, nachdem das Band gedruckt wurde). Beachten Sie auch, dass die Systemvariable “Line” die fortlaufende Nummer des Datensatzes zurückgibt.
Die Methode “Engine.NewColumn” fügt in mehrspaltigen Berichten einen Spaltenumbruch ein. Wenn auf der Seite keine freien Spalten mehr vorhanden sind, wird eine neue Seite erstellt.
Rechnung mit Zahlungsaufträgen
Das folgende Beispiel wird auf dem Ausdruck von Aufträgen und Rechnungen mit Zahlungsaufträgen präsentiert. Sie sind nur für die slowenische und kroatische Gesetzgebung verfügbar. Solche Berichte sind '2U2 - Rechnung - UPN - Formular' für slowenische und '2U7 - Rechnung - HUB 3A - Formular' für kroatische Gesetzgebung. Sie können das Design dieser Berichte sehen, indem Sie den Berichtsgestalter aus dem Berichtregister öffnen.
Wir möchten den Zahlungsauftrag immer genau am unteren Rand der Seite drucken. Um dieses Verhalten zu erzwingen, setzen wir die aktuelle vertikale Position (Engine.CurY) des Berichtszusammenfassungsbands so, dass genügend Platz vorhanden ist, um ihn auf dieser Seite anzuzeigen. Wir tun dies mit dem folgenden Code:
procedure UPNOnBeforePrint(Sender: TfrxComponent);
begin
...
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
end;
Wenn der Bericht erstellt wird, wird der Zahlungsauftrag vorhandenen Text überlappen, wenn er zu hoch ist. Daher müssen wir unseren Code korrigieren, um den Zahlungsauftrag in diesem Fall auf der nächsten Seite zu drucken.
procedure UPNOnBeforePrint(Sender: TfrxComponent);
begin
...
if Engine.CurY > Engine.CurY + Engine.FreeSpace - UPN.Height - 1 then
Engine.NewPage;
Engine.CurY := Engine.CurY + Engine.FreeSpace - UPN.Height - 1;
end;