Ereignisse (Events) #
Ereignisse (Events) sind der zentrale Mechanismus, über den Pascal-Script in die Berichtsgenerierung eingreift. Jedes Mal, wenn der Bericht gedruckt oder in der Vorschau angezeigt wird, durchläuft die Report-Engine eine festgelegte Abfolge. An bestimmten Punkten dieser Abfolge werden Ihre Event-Handler aufgerufen.
Das Ereignismodell #
Die Berichtsgenerierung läuft in zwei Phasen ab:
- Generate-Phase – Die Report-Engine durchläuft die Daten und bestimmt, welche Bänder und Komponenten gedruckt werden. Hier können Sie Daten vorbereiten, Sichtbarkeiten steuern und Berechnungen durchführen.
- Print-Phase – Die fertig generierten Elemente werden gedruckt (oder in der Vorschau dargestellt). Hier können Sie letzte Anpassungen an der Darstellung vornehmen.
Ereignisse der Bänder #
Alle Bänder (Header, Detail, Footer, Summary, Gruppenkopf, Gruppenfuß) haben die gleichen Ereignisse:
| Ereignis | Phase | Beschreibung |
|---|---|---|
BeforeGenerate | Generate | Wird aufgerufen bevor das Band generiert wird. Ideal für Datenprüfungen und Sichtbarkeitssteuerung. |
BeforePrint | Wird aufgerufen bevor das Band gedruckt wird. Gut für letzte Formatierungen. | |
AfterPrint | Wird aufgerufen nachdem das Band gedruckt wurde. |
Typischer Einsatz #
procedure DetailBeforeGenerate;
begin
{ Zeile nur anzeigen, wenn Betrag > 0 }
if Positionen['Menge'] = 0 then
Detail.Visible := False
else
Detail.Visible := True;
end;
Ereignisse des Reports #
Der Report selbst hat zusätzliche Ereignisse:
| Ereignis | Beschreibung |
|---|---|
BeforePrint | Wird vor dem Start des gesamten Druckvorgangs aufgerufen |
AfterPrint | Wird nach Abschluss des gesamten Druckvorgangs aufgerufen |
Globale Ereignisse #
In der Modul-Ansicht finden Sie zwei besondere globale Ereignisse:
| Ereignis | Beschreibung |
|---|---|
OnCreate | Wird beim Öffnen der Vorschau aufgerufen. Hier initialisieren Sie Objekte und Variablen. |
OnDestroy | Wird beim Schließen der Vorschau aufgerufen. Hier geben Sie erzeugte Objekte wieder frei. |
Beispiel: Objekt-Lebenszyklus #
{ Globale Variable }
var
meineListe: TStringList;
procedure GlobalOnCreate;
begin
meineListe := TStringList.Create;
meineListe.Add('Erster Eintrag');
meineListe.Add('Zweiter Eintrag');
end;
procedure GlobalOnDestroy;
begin
meineListe.Free;
end;
Objekte, die Sie inOnCreateerzeugen, müssen inOnDestroywieder freigegeben werden. Andernfalls entsteht ein Speicherleck.
Ereignisse der Komponenten #
Einzelne Komponenten (Labels, DBText, Shapes usw.) haben eigene Ereignisse:
| Ereignis | Beschreibung |
|---|---|
OnPrint | Wird aufgerufen, wenn die Komponente gedruckt wird |
OnGetText | (nur bei DBText) Ermöglicht es, den angezeigten Text zu verändern |
Beispiel: Schriftgröße beim Druck ändern #
procedure Label1OnPrint;
begin
Label1.Font.Size := 14;
end;
Einen Event-Handler anlegen #
- Wechseln Sie zum Reiter Berechnungen.
- Wählen Sie in der Baumansicht die Ereignis-Ansicht (Rechtsklick | Ereignisse).
- Klicken Sie auf die gewünschte Komponente oder das Band.
- Rechtsklick auf das gewünschte Ereignis in der Listenansicht.
- Wählen Sie Neu.
- Der Code-Editor zeigt den Prozedur-Rumpf:
procedure DetailBeforePrint;
begin
end;
- Fügen Sie Ihren Code zwischen
beginundendein. - Kompilieren Sie mit Rechtsklick | Kompilieren.
Reihenfolge der Ereignisse #
Die Ereignisse werden in einer festen Reihenfolge ausgelöst. Für jede Zeile im Detail-Band gilt:
Detail.BeforeGenerate
→ Detail.BeforePrint
→ Komponente1.OnPrint
→ Komponente2.OnPrint
→ ...
→ Detail.AfterPrint
Für den gesamten Bericht:
Report.OnCreate (einmalig beim Öffnen)
Report.BeforePrint
Header.BeforeGenerate → Header.BeforePrint → Header.AfterPrint
Detail.BeforeGenerate → Detail.BeforePrint → Detail.AfterPrint (je Datensatz)
Detail.BeforeGenerate → Detail.BeforePrint → Detail.AfterPrint
...
Summary.BeforeGenerate → Summary.BeforePrint → Summary.AfterPrint
Report.AfterPrint
Report.OnDestroy (einmalig beim Schließen)
Wann welches Ereignis nutzen? #
| Aufgabe | Empfohlenes Ereignis |
|---|---|
| Bänder oder Komponenten ein-/ausblenden | BeforeGenerate |
| Schriftfarbe oder -größe ändern | BeforePrint oder OnPrint |
| Variablen berechnen | OnCalc (Variable-Komponente) |
| Text dynamisch zusammensetzen | BeforePrint |
| Objekte erzeugen (StringList etc.) | OnCreate |
| Objekte freigeben | OnDestroy |
| Summen zurücksetzen | BeforeGenerate des Gruppenkopf-Bandes |