AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Rave: CustomConnection zur Laufzeit hinzufügen?
Thema durchsuchen
Ansicht
Themen-Optionen

Rave: CustomConnection zur Laufzeit hinzufügen?

Ein Thema von Errraddicator · begonnen am 12. Nov 2008 · letzter Beitrag vom 12. Nov 2008
Antwort Antwort
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#1

Rave: CustomConnection zur Laufzeit hinzufügen?

  Alt 12. Nov 2008, 10:02
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
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Rave: CustomConnection zur Laufzeit hinzufügen?

  Alt 12. Nov 2008, 10:28
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.
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Rave: CustomConnection zur Laufzeit hinzufügen?

  Alt 12. Nov 2008, 15:04
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:09 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