Ziel war es ja, dass die Tabellenüberschriften bei einem Seitenumbruch am Seitenanfang angezeigt werden.
Hier der Code, der den Inhalt des Überschriften-Bands in das Band am Seitenanfang kopiert
Delphi-Quellcode:
procedure CloneProperties(
const aSourceCtrl, aDestCtrl: TControl);
// *****************************************************************************************************************************************
// Setzt die Properties von aDestCtrl auf die gleichen Eigenschaften wie die von aSourceCtrl
var
ms: TMemoryStream;
OldName:
String;
begin
OldName := aSourceCtrl.
Name;
aSourceCtrl.
Name := '
';
// needed to avoid Name collision
try
ms := TMemoryStream.Create;
try
ms.WriteComponent(aSourceCtrl);
ms.Position := 0;
ms.ReadComponent(aDestCtrl);
finally
ms.Free;
end;
finally
aSourceCtrl.
Name := OldName;
end;
end;
procedure DulicateBand(aSource, aDest: TQRCustomBand);
// *****************************************************************************************************************************************
// Leert das Band aDest, setzt die gleiche Höhe und erzeugt auf aDest die gleichen Components wie auf aSource
// Getestet mit TQrLabel und TQrShape
var
i: Integer;
lSourceCtrl, lDestCtrl: TControl;
begin
// Zunächste Band leeren
while (aDest.ControlCount > 0)
do
aDest.Controls[0].Free;
// Gleiche Höhe
aDest.Height := aSource.Height;
// Components kopieren
// ACHTUNG: Es muss AddPrintable verwendet werden da Create und Zuweisung von Parent bei TQrShape zu Access-Violation führt
// Außerdem muss in QuickRep.Pas - TQRCustomBand.AddPrintable folgender Code am Ende der Procedure eingefügt werden
// if Assigned(FParentReport) then aPrintable.FQRPrinter := FParentReport.QRPrinter;
for i := 0
to aSource.ControlCount - 1
do
begin
lSourceCtrl := aSource.Controls[i];
if (lSourceCtrl
is TQRLabel)
or (lSourceCtrl
is TQRShape)
then // nur um sicherzustellen, dass nur getestete Komponenten kopiert werden
begin
lDestCtrl := aDest.AddPrintable(TQRNewComponentClass(lSourceCtrl.ClassType))
as TQRNewComponentClass(lSourceCtrl.ClassType);
CloneProperties(lSourceCtrl, lDestCtrl);
lDestCtrl.
Name := lSourceCtrl.
Name + '
_';
end;
end;
end;
Voraussetzung ist, dass an TQrBand.rbPageHeader ein TQrChildBand angehängt ist.
Am eigemtlichen Datenband hängt noch ein GroupFooter, der das TqrChildBand wieder deaktiviert sobald die Tabelle gedruckt ist
Und der Aufruf
Delphi-Quellcode:
procedure TrptTest2.qrbaTabelle1HeaderBeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
qrcbHeader.Enabled := True;
DulicateBand(Sender, qrcbHeader);
end;
procedure TrptTest2.qrbaTabell1FooterBeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
begin
qrcbHeader.Enabled := false;
end;