FastReport Tipps und Tricks: Seiten-Ansteuerung

Aus GEVITAS
Version vom 16. August 2017, 21:28 Uhr von Gevitas (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Seiten-Ansteuerung == === Manueller Seitenwechsel im Code === Wenn man im Report einen manuellen Seitenwechsel anhand eines Kennzeichens erzeugen will, mu…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

1 Seiten-Ansteuerung

1.1 Manueller Seitenwechsel im Code

Wenn man im Report einen manuellen Seitenwechsel anhand eines Kennzeichens erzeugen will, muss man im Ereignis OnBeforePrint des gewünschten Bandes diesen Code einfügen:

procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Gruppenkopf-Band (die Kapitel-Überschrift) ausgegeben wird.
  // Wenn das Kennzeichen "Seitenwechsel Vorher" gesetzt ist:
  if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 1 then
    Engine.NewPage;                                   // Neue Seite, Seitenkopf usw. drucken
end;

procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band ausgegeben wird.

  // Kapitel-Position ausblenden:
  if <Positionen."PosNr"> = 0 then
  begin
    DetailPositionen.Visible := False;
  end
  else
    DetailPositionen.Visible := True;

  // Wenn das Kennzeichen "Seitenwechsel Vorher" gesetzt ist:
  if <Positionen."PosNr"> > 0 then                                   // NICHT bei Kapitel-Position, das wird da schon gemacht!
    if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 1 then
      Engine.NewPage;                                                // Neue Seite, Seitenkopf usw. drucken
end;

Das Feld, mit dem die Seitenwechsel-Option gespeichert wird, heißt übrigens wirklich Seitenwechsel_0Nein_1Vorher_2Nachher. Das ist zwar ungewöhnlich, zeigt aber schon im Feldnamen, welche Optionen es gibt. Ungewöhnlich aber praktisch!


1.2 Manueller Seitenwechsel "Nachher" im Code

Wenn man im Report einen manuellen Seitenwechsel anhand des Kennzeichens "Neue Seite - Nachher" erzeugen will, könnte man im Ereignis OnAfterPrint des Detail-Bandes diesen Code einfügen:

procedure DetailPositionenOnAfterPrint(Sender: TfrxComponent);
begin
  if <Positionen."PosNr"> > 0 then                                    // NICHT bei Kapitel-Position, das wird da schon gemacht!
    if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 2 then
       Engine.NewPage;                                                // Neue Seite, Seitenkopf usw. drucken
end;

Theoretisch ist das eine einfache Lösung, praktisch funktioniert sie aber nicht! Aus irgendeinem Grund erzeugt FastReport den Seitenwechsel immer vorher. Deshalb muss man zu einem Trick greifen, um das Problem zu lösen:

  • Man fügt eine Variable in den Report ein (Menü Report ⇒ Variablen) und nennt sie z.B. "Seitenwechsel". Als Standardwert legt man 0 fest.
  • Im Ereignis OnAfterPrint setzt man diese Variable auf 1, wenn in einer Position das Kennzeichen "Neue Seite- Nachher" gesetzt wurde:
procedure DetailPositionenOnAfterPrint(Sender: TfrxComponent); 
begin
  // Wenn das Kennzeichen "Seitenwechsel Nachher" gesetzt ist:
  (* Es wird eine Variable benutzt, um den Seitenwechsel anzusteuern:
    - Im OnAfterPrint wird die Variable auf 1 gesetzt, wenn ein Seitenwechsel-Nachher angegeben ist.
    - Bei der NÄCHSTEN Position im OnBeforePrint wird ein Seitenwechsel gemacht, wenn die Variable auf 1 steht.
      Danach wird die Variable wieder auf 0 gestellt.
    - Das muss auch im Kapitel gemacht werden, falls die nächste Position ein Kapitel ist!!!!
  *)
  if <Positionen."PosNr"> > 0 then                                 // NICHT bei Kapitel-Position, das wird da schon gemacht!
   if <Positionen."Seitenwechsel_0Nein_1Vorher_2Nachher"> = 2 then
      Set( 'Seitenwechsel', 1);                                    // Neue Seite, Seitenkopf usw. drucken soll bei der NÄCHSTEN Position ausgeführt werden!
end;
  • Im Ereignis OnBeforePrint wird die Variable auf 1 geprüft und ein Seitenwechsel vor dem Druck der Position ausgeführt:
procedure DetailPositionenOnBeforePrint(Sender: TfrxComponent);
begin
  // Dieser Code wird ausgeführt, BEVOR das Positionen-Detail-Band
  // ausgegeben wird.
  if <Seitenwechsel> = 1 then
      Engine.NewPage;              // Neue Seite, Seitenkopf usw. drucken

  Set( 'Seitenwechsel', 0);        // Variable zurückstellen!
  ...weitere Zeilen Code...
end;

1.3 Report-Zusammenfassung am Ende der Seite

Wenn man die Report-Zusammenfassung (Report Summary) am Ende der Seite drucken will, muss man im Ereignis ReportSummary1OnBeforePrint diesen Code einfügen:


procedure ReportSummary1OnBeforePrint(Sender: TfrxComponent);
begin
  Engine.CurY := Engine.CurY + Engine.FreeSpace - ReportSummary1.Height - 1;  
end;

Einzelheiten zu FastReport-Engine werden unter FastReport Engine: Der Report-Erzeuger beschrieben.


1.4 Leerzeilen verhindern bei unterdrücktem Feld

Wenn man in einem Report mehrere Felder untereinander hat, von denen das unterste unterdrückt werden soll, hat man das Problem, dass das Feld zwar ausgeblendet wird (Visible := False), der Platz unten aber leider nicht, es bleibt also eine Leerzeile:

Beispiel:

In diesem Bereich...


FastReport TippsUndTrick Positionen TextPosition.png

...wird das TextPositionen-Feld RichTextArtikelText mit diesem Code ausgeblendet:

 procedure RichTextArtikelTextOnBeforePrint(Sender: TfrxComponent);
 begin
   // Kennzeichen 6 = Artikel-Texte sichtbar Ja/Nein:  //JC//160111//
   // (oder wenn leer)
   RichTextArtikelText.Visible:= True;  //JC//160111//
   if ( <AuftragsKopf."KENNZ6"> = 'Nein' )
   or ( <Positionen."TextPosition"> = '' ) then
   begin
     RichTextArtikelText.Visible    := False;
   end;
 end;

Das Ergebnis:

FastReport TippsUndTrick Positionen TextPosition Vorher.png

An den markierten Stellen gibt es Leerzeilen. FastReport kann zwar Felder nach unten schieben und auch das Band vergrößern, wenn ein darüberliegendes Feld größer wird, aber das Band wird leider nicht verkleinert, wenn das letzte Feld ausgeschaltet wird.

Um das zu verhindern, kann man folgenden Code einfügen:

 procedure RichTextArtikelTextOnAfterPrint(Sender: TfrxComponent);
 begin
    // Druckposition um die Höhe des Feldes nach oben verschieben:
    if  RichTextArtikelText.Visible = False then
       Engine.CurY := Engine.CurY - RichTextArtikelText.Height;
 end;

Die Zeilen verschieben die Druckposition um die Höhe des Feldes nach oben, wenn das Feld unsichtbar ist.

Das Ergebnis nun:

FastReport TippsUndTrick Positionen TextPosition Nachher.png


1.5 Aufteilung erlauben

Wenn man z.B. im Fuss umfangreichen Text hat, können unerwünschte Seitenumbrüche entstehen. Um das zu vermeiden, können Sie die Option "Aufteilung erlaben" für das Band einschalten.


2 Links