Das Ereignis der Seite OnManualBuild

Navigation:  Bericht im FR-Designer > Script >

Das Ereignis der Seite OnManualBuild

Previous pageReturn to chapter overviewNext page

Normalerweise übernimmt die Erstellung des Reports der Kern von FastReport. Dieser führt die Bänder in einer bestimmten Reihenfolge aus und zwar solange es Daten gibt und bildet dadurch den fertigen Report. Manchmal ist es notwendig einen Report zu erstellen, welcher nicht die Standardform besitzt und deswegen nicht vom Kern FastReport gebildet werden kann. In diesem Fall kann man die Möglichkeit nutzen den Report manuell zu erstellen, durch Nutzung des auf der Seite enthaltenen Ereignisses OnManualBuild. Wenn man den Bearbeiter dieses Ereignisses definiert, so übergibt FastReport die Steuerung bei der Erstellung ihm. Gleichzeitig stellt der Kern die auf der Seite enthaltenen Bänder "Gruppenkopf", "Spaltenkopf", "Fuß", "Seitenfuß", "Spaltenfuß" und "Background" dar. Der Kern bearbeitet die Bildung neuer Seiten/Spalten. Die Aufgabe des Bearbeiters des Ereignisses OnManualBuild, ist die Ausführung der Datenbänder und deren Köpfe und Füße in einer bestimmten Reihenfolge.

 

Der Sinn des Bearbeiters OnManualBuild besteht darin, dem Kern von FastReport die Befehle zu  Ausführung bestimmter Bänder zu geben. Alles andere erledigt der Kern selbstständig: die Bildung einer  neuen Seite ( wenn die aktuelle endet), die Ausführung von Scripten, usw.

 

Demonstrieren wir das Ganze am Beispiel deines einfachen Bearbeiters. Der Report enthält zwei Bänder MasterData, diese sind nicht mit Daten verknüpft:

 

clip0205

 

Der Bearbeiter wird diese Bänder je sechs mal ausführen und zwar abwechselnd. Nach sechs Bändern soll eine kleine Lücke sein.

 

PascalScript:

 

procedure Page1OnManualBuild(Sender: TfrxComponent);

var

 i: Integer;

begin

for i := 1to6do

begin

   { zeigen nacheinander zwei Bänder }

   Engine.ShowBand(MasterData1);

   Engine.ShowBand(MasterData2);

   { machen eine kleine Lücke }

   if i = 3then

     Engine.CurY := Engine.CurY + 10;

end;

end;

 

C++ Script:

 

void Page1OnManualBuild(TfrxComponent Sender)

{

int i;

 

for (i = 1; i <= 6; i++)

 {

   // zeigen nacheinander zwei Bänder

   Engine.ShowBand(MasterData1);

   Engine.ShowBand(MasterData2);

   // machen eine kleine Lücke

   if (i == 3)

     Engine.CurY = Engine.CurY + 10;

 }

}

 

 

_img252

 

Das nächste Beispiel wird zwei Gruppen mit Bändern nebeneinander anzeigen.

 

PascalScript:

 

procedure Page1OnManualBuild(Sender: TfrxComponent);

var

 i, j: Integer;

 SaveY: Extended;

begin

 SaveY := Engine.CurY;

for j := 1to2do

begin

   for i := 1to6do

   begin

     Engine.ShowBand(MasterData1);

     Engine.ShowBand(MasterData2);

     if i = 3then

Engine.CurY := Engine.CurY + 10;

   end;

   Engine.CurY := SaveY;

   Engine.CurX := Engine.CurX + 200;

end;

end;

 

 

C++Script:

 

void Page1OnManualBuild(TfrxComponent Sender)

{

int i, j;

 Extended SaveY;

 

 SaveY = Engine.CurY;

for (j = 1; j <= 2; j++)

 {

   for (i = 1; i <= 6; i++)

   {

     Engine.ShowBand(MasterData1);

     Engine.ShowBand(MasterData2);

     if (i == 3)

Engine.CurY = Engine.CurY + 10;

   }

   Engine.CurY = SaveY;

   Engine.CurX = Engine.CurX + 200;

 }

}

 

_img253

 

Wie man an diesen Beispielen sehen kann, steuerten wir nur den Output der Datenbänder. Alle anderen Bänder (z. B. "Seitenkopf" in unserem Beispiel) wurden automatisch gedruckt.

 

Jetzt werden wir einen Report "Kundenliste" erstellen (diesen haben wir schon ein paar mal erstellt), wir nutzten dazu das Ereignis OnManualBuild. Hier verknüpfen wir das Datenband mit der Datenquelle.

 

_img254

 

Der Script des Ereignisses ist folgender:

 

PascalScript:

 

procedure Page1OnManualBuild(Sender: TfrxComponent);

var

 DataSet: TfrxDataSet;

begin

 DataSet := MasterData1.DataSet;

 DataSet.First;

whilenot DataSet.Eof do

begin

   Engine.ShowBand(MasterData1);

 

   DataSet.Next;

end;

end;

 

C++Script:

 

void Page1OnManualBuild(TfrxComponent Sender)

{

 TfrxDataSet DataSet;

 

 DataSet = MasterData1.DataSet;

 DataSet.First();

while (!DataSet.Eof)

 {

   Engine.ShowBand(MasterData1);

   DataSet.Next();

 }

}

 

Wenn wir den Report nun starten, sehen wir, das das Resultat sich nicht vom Standardreport unterscheidet. Beachten Sie wie der Link zu Dataset funktioniert. In unserem Beispiel haben wir das Band mit der Datenquelle verlinkt, deswegen wird die Zeile

 

DataSet := MasterData1.DataSet;

 

uns mit der Datenquelle verbinden. Den Link zu der benötigten Datenquelle kann man auch so erhalten:

 

DataSet := Report.GetDataSet('Customers');

 

Selbstverständlich muss die uns interessierende Quelle in dem Report hinzugefügt werden in "Report|Daten...".