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:
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;
}
}
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;
}
}
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.
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...".