![]() |
Reportbuilder 9.01 und Delphi 7
Hallo Leute,
eine Frage: Ich verwende Reportbuilder9.01 mit Delphi7 ich möchte gerne in einem DetailBand zwei TppLabels platzieren und wenn das DetailBand (das via ppDBPipeline eine Quelle besitz) gedruckt wird, sollen die TppLabels Werte aus der DB bekommen.. (ich kann kein ppDBText verwenden!) Beispiel:
Delphi-Quellcode:
funktionieren sollte das ganze aber bei einem Report, der vom User erstellt wurde -
procedure TForm1.ppDetailBand1BeforePrint(Sender: TObject);
var x:integer; begin for x:=0 to form1.ComponentCount-1 do begin if form1.Components[x].ClassName = 'TppLabel' then begin if (form1.Components[x] as TppLabel).Caption='Wert1' then (form1.Components[x] as TppLabel).Caption:='gefunden1'; if (form1.Components[x] as TppLabel).Caption='Wert2' then (form1.Components[x] as TppLabel).Caption:='gefunden2'; end; end; also kein Delphi-Designtime-Event "BeforePrint" im DetailBand besitzt. Zweck: Wenn der User in einem Detailband ein Feld mit Text: "Wert1" platziert, schreib ich "händisch" die Daten rein .. Query ist gefiltert und bereit - welches Feld ich verwende ist aber nicht fix.. Wie kann ich den Event nutzen? Vielen Dank Erich |
Re: Reportbuilder 9.01 und Delphi 7
Du bekommst doch das Detailband im Parameter Sender mitgeliefert.
Ausserdem hat jedes TppControl das Property UserName. Also mal so quick & dirty ungefähr so:
Delphi-Quellcode:
procedure TForm1.ppDetailBand1BeforePrint(Sender: TObject);
var i: Integer; custom_text: TppCustomText; begin with Sender as TppCustomBand do begin for i := 0 to ObjectCount - 1 do begin if Objects[i] is TppCustomText then begin custom_text := TppCustomText(Objects[i]); if custom_text.Username = 'KillBill' then custom_text.Caption := 'Rübe ab !'; end; end; end; end; |
Re: Reportbuilder 9.01 und Delphi 7
Hallo Shmia,
vielen Dank für deine Antwort. TppCustomText kann der Kunde aber nicht beim Reporterstellen (OHNE Delphi IDE!) setzen - oder find ich das einfach nicht? ThanX Erich |
Re: Reportbuilder 9.01 und Delphi 7
Ich mach´s jetzt folgendermaßen:
in einem ppDetailband lege ich ein ppLabel beforePrint such ich das Label und identifiziere es durch seine Caption, ersetze diese und druck das Ding afterPrint such ich die neue Caption und schreib wieder die alte Caption rein ..
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ppPrnabl, ppClass, ppCtrls, ppBands, ppCache, ppEndUsr, ppComm, ppRelatv, ppProd, ppReport, Buttons, ppDB, ppDBPipe, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection, Grids, DBGrids; type TForm1 = class(TForm) ppReport1: TppReport; ppDesigner1: TppDesigner; ppHeaderBand1: TppHeaderBand; ppDetailBand1: TppDetailBand; ppFooterBand1: TppFooterBand; ppLabel1: TppLabel; SpeedButton1: TSpeedButton; ppLabel3: TppLabel; ppDBPipeline1: TppDBPipeline; ZConnection1: TZConnection; ZQuery1: TZQuery; DataSource1: TDataSource; ppGroup1: TppGroup; ppGroupHeaderBand1: TppGroupHeaderBand; ppGroupFooterBand1: TppGroupFooterBand; DBGrid1: TDBGrid; ppLabel2: TppLabel; ppDBText1: TppDBText; ppLine1: TppLine; procedure my_BeforePrint(Sender: TObject); procedure my_AfterPrint(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} // OK.. { ErklärBär: ich suche alle componenten von einem speziellem Band, die ppLabels sind und eine bestimmte Caption haben Beforeprint: Ich such einen "Fixen" Caption-wert und setz ihn neu Afterprint: ich such die neue Caption und setz sie wieder zrück.. Das Spiel beginnt von vorne } // Für allgemeine Sachen wie Schriftart und so.. procedure AssignFontToReport(aFont: TFont; aReport: TppCustomReport); var liBand: Integer; liObject: Integer; lObject: TppComponent; begin for liBand := 0 to aReport.BandCount-1 do for liObject := 0 to aReport.Bands[liBand].ObjectCount-1 do begin lObject := aReport.Bands[liBand].Objects[liObject]; if lObject.HasFont then lObject.Font := aFont; end; end; procedure TForm1.my_BeforePrint(Sender: TObject); var x:integer; schleife_baender : Integer; schleife_Objekte : Integer; eine_Componente : TppComponent; text:String; begin for schleife_baender := 0 to ppReport1.BandCount-1 do begin if ppReport1.Bands[schleife_baender].ClassName = 'TppDetailBand' then begin for schleife_Objekte := 0 to ppReport1.Bands[schleife_baender].ObjectCount-1 do begin eine_Componente := ppReport1.Bands[schleife_baender].Objects[schleife_Objekte]; if eine_Componente.ClassName = 'TppLabel' then begin text:= ZQuery1.FieldByName('OBJECT_NAME').AsString+#160; if (eine_Componente as TppLabel).Caption = 'Wert1' then (eine_Componente as TppLabel).Caption :=text; end; end; end; end; end; procedure TForm1.my_AfterPrint(Sender: TObject); var x:integer; schleife_baender : Integer; schleife_Objekte : Integer; eine_Componente : TppComponent; text:String; begin for schleife_baender := 0 to ppReport1.BandCount-1 do begin if ppReport1.Bands[schleife_baender].ClassName = 'TppDetailBand' then begin for schleife_Objekte := 0 to ppReport1.Bands[schleife_baender].ObjectCount-1 do begin eine_Componente := ppReport1.Bands[schleife_baender].Objects[schleife_Objekte]; if eine_Componente.ClassName = 'TppLabel' then begin text:= ZQuery1.FieldByName('OBJECT_NAME').AsString+#160; if (eine_Componente as TppLabel).Caption = text then (eine_Componente as TppLabel).Caption := 'Wert1' ; end; end; end; end; end; // heir setz ich die Events neu procedure TForm1.SpeedButton1Click(Sender: TObject); var schleife_baender : Integer; schleife_Objekte : Integer; begin for schleife_baender := 0 to ppReport1.BandCount-1 do begin if ppReport1.Bands[schleife_baender].ClassName = 'TppDetailBand' then begin ppReport1.Bands[schleife_baender].BeforePrint:= my_BeforePrint; ppReport1.Bands[schleife_baender].AfterPrint := my_AfterPrint; end; end; ppreport1.Print; end; end. |
Re: Reportbuilder 9.01 und Delphi 7
Zitat:
Jeder UserName ist eindeutig pro Report. (ReportBuilder lässt doppelte Usernamen nicht zu) Also kann über den Username jedes Reportcontrol eindeutig identifiziert werden. Die Technik mit BeforePrint und AfterPrint ist schlecht weil ja beim Drucken eine Exception ausgelöst werden kann. Damit wird dann AfterPrint nicht mehr aufgerufen mit der Konsequenz dass ab diesem Zeitpunkt immer der gleiche Text gedruckt wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz