Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Rave: CustomConnection zur Laufzeit hinzufügen? (https://www.delphipraxis.net/123963-rave-customconnection-zur-laufzeit-hinzufuegen.html)

Errraddicator 12. Nov 2008 09:02


Rave: CustomConnection zur Laufzeit hinzufügen?
 
Hiho!

Ist es wohl möglich - und wenn ja, wie - zur Laufzeit einem Rave-Project eine Custom-Connection zuzuweisen?

Hintergrund ist folgender:
Ich habe ein Programm mit IntraWeb geschrieben, welches je Sitzung ein Protokoll ausgeben soll (via Rave).
Das funktioniert an sich auch wunderbar, das 1. Protokoll wird einwandfrei geschrieben, jedoch sind sämtliche Protokolle danach (aus der 2. Sitzung z.B.) leer.
Allerdings mit der Anzahl der Sätze aus der 1. Sitzung (also muss dort noch irgendwie ein Rest herumschwirren...)

Jetzt war meine Vermutung, dass es daran liegt, dass ich die Rave-Komponenten in der Anwendung als solches hatte.
Daraufhin habe ich diese in die User-Session verschoben, das hat aber nichts gebracht.

Als Nächstes hab ich versucht die Komponenten zur Laufzeit in meiner UserSession zu Erzeugen und dann auszuführen.
Das resultiert dann darin, dass er gar nichts mehr anzeigte, weil er die Custom-Connection nich mehr finden konnte.

Also habe ich diese wieder fest als Komponente in meiner User-Session eingebunden, den Rest(rvProject etc.) zur Laufzeit erzeugt und bin jetzt wieder bei der Ausgangssituation.... :-/

Von daher möchte ich jetzt versuchen, auch die CustomConnection zur Laufzeit zu erzeugen und diese dann dem Rave-Projekt zuzuweisen.
Ist das möglich und wenn ja, wie?


Delphi-Quellcode:
// generates the output as a pdf-document
procedure TIWUserSession.generatePDF(pdfName: String; ravName: String);
var
  rvProject: TRvProject;
  rvSystem: TRvSystem;
  rvPDF: TRvRenderPDF;
begin
  // init components
  rvProject  := TRvProject.Create(self);
  rvSystem   := TRvSystem.Create(self);
  rvCcOutputs := TRvCustomConnection.Create(self);
  rvPDF      := TRvRenderPDF.Create(self);
  // apply events to custom-connection
  rvCcOutputs.OnEOF    := rvCcOutputsEOF;
  rvCcOutputs.OnFirst  := rvCcOutputsFirst;
  rvCcOutputs.OnGetCols := rvCcOutputsGetCols;
  rvCcOutputs.OnGetRow := rvCcOutputsGetRow;
  rvCcOutputs.OnNext   := rvCcOutputsNext;
  rvCcOutputs.OnOpen   := rvCcOutputsOpen;
  // modify custom connection
  rvCcOutputs.DataIndex := 0;
  rvCcOutputs.DataRows := outputSets.Count;
  // modify rave-system-properties
  rvSystem.SystemOptions := rvSystem.SystemOptions - [soShowStatus];
  rvSystem.SystemSetups  := rvSystem.SystemSetups - [ssAllowSetup];
  rvSystem.DefaultDest   := rdFile;
  rvSystem.DoNativeOutput := false;
  rvSystem.RenderObject  := rvPDF;
  rvSystem.OutputFileName := pdfName;
  // modify rave-project
  rvProject.Engine     := rvSystem;
  rvProject.ProjectFile := ravName;
  // execute report
  rvProject.Execute();
  // reset report & custom-connection
  rvProject.Close();
  rvCcOutputs.DataRows := 0;
  rvCcOutputs.DataIndex := 0;
end;

Danke im Voraus

cu Patrick

Errraddicator 12. Nov 2008 09:28

Re: Rave: CustomConnection zur Laufzeit hinzufügen?
 
Ok, habs rausgefunden:

Delphi-Quellcode:
procedure TIWUserSession.generatePDF(pdfName: String; ravName: String);
var
  rvProject: TRvProject;
  rvSystem: TRvSystem;
  rvPDF: TRvRenderPDF;
  rvCcOutputs: TRvCustomConnection;
  dvOutputs: TRaveDataView;
  dcOutputs: TRaveDataConnection;
  rvPage: TRavePage;
  bndOutputs: TRaveDataBand;
begin
  // init components
  rvProject  := TRvProject.Create(self);
  rvSystem   := TRvSystem.Create(self);
  rvCcOutputs := TRvCustomConnection.Create(self);
  rvPDF      := TRvRenderPDF.Create(self);
  // apply event-hanlders to custom-connection
  rvCcOutputs.OnEOF    := rvCcOutputsEOF;
  rvCcOutputs.OnFirst  := rvCcOutputsFirst;
  rvCcOutputs.OnGetCols := rvCcOutputsGetCols;
  rvCcOutputs.OnGetRow := rvCcOutputsGetRow;
  rvCcOutputs.OnNext   := rvCcOutputsNext;
  rvCcOutputs.OnOpen   := rvCcOutputsOpen;
  // modify custom connection
  rvCcOutputs.DataIndex := 0;
  rvCcOutputs.DataRows := outputSets.Count;
  // modify system-properties
  rvSystem.SystemOptions := rvSystem.SystemOptions - [soShowStatus];
  rvSystem.SystemSetups  := rvSystem.SystemSetups - [ssAllowSetup];
  rvSystem.DefaultDest   := rdFile;
  rvSystem.DoNativeOutput := false;
  rvSystem.RenderObject  := rvPDF;
  rvSystem.OutputFileName := pdfName;
  // modify project
  rvProject.Engine     := rvSystem;
  rvProject.ProjectFile := ravName;
  rvProject.Open();
  // build & modify data view for the report
  dcOutputs := CreateDataCon(rvCcOutputs);
  dvOutputs := rvProject.ProjMan.NewDataObject(TRaveDataView) as TRaveDataView;
  dvOutputs.Name          := 'dvOutputs';
  dvOutputs.ConnectionName := dcOutputs.name;
  dvOutputs.DataCon       := dcOutputs;
  CreateFields(dvOutputs, nil, nil, true);
  // get data-band & apply data-view
  rvPage    := rvProject.ProjMan.FindRaveComponent('Report1.Page1', nil) as TRavePage;
  bndOutputs := rvProject.ProjMan.FindRaveComponent('bndOutputs', rvPage) as TRaveDataBand;
  bndOutputs.DataView := dvOutputs;  
  // execute report
  rvProject.Execute();
  // reset report & custom-connection
  rvProject.Close();
  rvCcOutputs.DataRows := 0;
  rvCcOutputs.DataIndex := 0;
end;
Das behebt mein Problem aber leider immer noch nich. :-/
Das 1. Dokument is nach wie vor einwandfrei, beim 2. passiert gar nix mehr.

Errraddicator 12. Nov 2008 14:04

Re: Rave: CustomConnection zur Laufzeit hinzufügen?
 
So, hab auch das Problem gelöst:
Delphi-Quellcode:
// ... ganz viel kram
  // execute report
  rvProject.Execute();
  rvProject.Close();

  // clean up
  rvPDF.Free();
  rvCcOutputs.Free();
  rvSystem.Free();
  rvProject.Free();
Wenn ich die ganzen Objekte wieder manuell mit Free frei gebe, kommt bei der 2. Datei auch wieder alles richtig bei raus.

Dazu habe ich aber 1 Frage:
Normalerweise kenne ich das so, dass Delphi lokale Variable im Var-Teil einer Funktion am Ende automatisch wieder frei gibt.
Warum hier nicht?

Delphi-Quellcode:
procedure TIWUserSession.generatePDF();
var
  rvProject: TRvProject;
  rvSystem: TRvSystem;
  rvPDF: TRvRenderPDF;
  rvCcOutputs: TRvCustomConnection;
begin
  // init components
  rvProject  := TRvProject.Create(self);
  rvSystem   := TRvSystem.Create(self);
  rvCcOutputs := TRvCustomConnection.Create(self);
  rvPDF      := TRvRenderPDF.Create(self);

  // ... ganz viel Kram

  // clean up
  rvPDF.Free();
  rvCcOutputs.Free();
  rvSystem.Free();
  rvProject.Free();
end;

cu

Patrick


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz