Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rave Report nicht modal benutzen. (https://www.delphipraxis.net/31309-rave-report-nicht-modal-benutzen.html)

Peter-Ziegler 7. Okt 2004 08:24


Rave Report nicht modal benutzen.
 
Hallo Forum,

(Hallo Thomas von Team Nevrona, hoffentlich liest er mit ;-)

ich benütze den Rave Report 5.0.8 mit Delphi 7.1.1.und
versuche den Rave Report nicht modal zu benutzen,
damit die Hauptanwendung nach RvProject.Execute; weiter bedienbar bleibt.
Leider klappt das nicht!!

Hat jemand dazu einen Tip?
@Thomas: Kann man das mit der kostenpflichtigen BEX Version erreichen?

Folgendes hab' ich schon ausprobiert:
1.) Den Rave Report in einem extra Thread (TThread) starten
Das führte zu sporadischen Laufzeitfehlern,
obwohl laut einigen Posts Rave threadsicher sein soll, solange man keine DataViews benützt.

2.) TCriticalSection benützen
RvProject.Execute und andere Code Teile wurden im Thread innerhalb einer CriticalSection aufgerufen.
Gleiches Verhalten.

3.) Ersetzen des Rave System-Formulars durch ein eigenes
Hat auch nichts bewirkt.

Danke und Gruß
Peter

merlin17 8. Okt 2004 08:04

Re: Rave Report nicht modal benutzen.
 
Peter,

Zitat:

hoffentlich liest er mit
ja er liest ab und zu mit :wink:

Zitat:

versuche den Rave Report nicht modal zu benutzen,
was genau willst du erreichen?
meistens gehen die Fragen in Richtung DataView und den zwei unterschiedlichen anbindungsmöglichkeiten,
aber hier hast du ja schon recherchiert....
geht es Dir nur um die Preview-anzeige und das du mehrere Previewfenster offen haben kannst??

:-) thomas, TeamNevrona

Peter-Ziegler 8. Okt 2004 08:17

Re: Rave Report nicht modal benutzen.
 
Hallo Thomas,

der Wunsch ist, daß aus der Hauptanwendung (MDI-Anwendungsformular mit Child-Formularen) ein Druckdialog aufgerufen werden kann und
dabei die Anwendung nicht blockiert wird, d. h. sie muß parallel weiterhin bedienbar sein.

Am einfachsten wäre das zu erreichen, wenn Rave Report, wie die anderen Child-Formulare, als MDI-Child nicht-modal aufgerufen
werden könnte. Dazu habe ich keine Möglichkeit gefunden.

Eine andere Möglichkeit ist, Rave Report in einem eigenen Thread (TThread) aufzurufen, dadurch wäre die MDI-Anwendung auch nicht blockiert.
Hat im Prinzip auch funktioniert, aaabbbeeer es gab sporadische Laufzeitfehler.

Gruß
Peter

merlin17 8. Okt 2004 08:26

Re: Rave Report nicht modal benutzen.
 
Hallo,
und wenn du rave "einfach" in einer Scrollbox in einem von deinen Formularen einbettest und die div. Einstellung selber triffst bzw. in deiner Anwendung vom Anwender abfragst....:

:-) thomas

einfach mal nachfolgenden Code testen (habe ich gerade auf die schnelle geschrieben, nicht getestet...:

Code:
var
  MeinNDRStream: TMemoryStream;
begin
  MeinNDRStream := TMemoryStream.Create;
  RvProject1.Open;
  RvProject1.Engine := RvNDRWriter1;
  with RvNDRWriter1 do
  begin
    StreamMode := smUser;
    Stream := MeinNDRStream;
  end;
  RvProject1.Execute;
  MeinNDRStream.Position := 0;

  with RvRenderPreview1 do
  begin
    ScrollBox := ScrollBox1;
    NDRStream := MeinNDRStream;
    Render;
  end;

Peter-Ziegler 8. Okt 2004 09:58

Re: Rave Report nicht modal benutzen.
 
Hallo Thomas,

so, den Vorschlag musste ich jetzt erst mal verdauen ;-)

Anmerkung/Probleme:

1.) Wir haben ein grösseres Projekt.
Das MDI-Hauptfenster und auch andere Projekte mit anderen Umfeld (COM-Server) sollen
unabhängig eine Druck-Unit benützen können mit möglichst einfacher Schnittstelle.
D. h. die Druck-Unit erzeugt (dynamsisch) alle notwendigen Rave Objekte.
Ich müsste also vieles (was genau? (Setup-, Preview-Fenster, Druckersteuerung?)) nachbauen. Was ist das für ein Aufwand?

2.)
Mit obiger Randbedingung und deinem Vorschlag, blockiert dann der Druck-Aufruf wirklich nicht wieder den Haupt-Thread?
Ich sehe da im Moment keinen prinzipiellen Unterschied zu meiner bisherigen Lösung.
Wo liegt der Unterschied? Wegen eigenem TMemoryStream und/oder RvNDRWriter, RvRenderPreview?

Und wenn ich dann wieder einen zusätzlichen Thread erzeuge, gibt es dann nicht wieder die Laufzeitfehler,
weil RvProject1.Execute; weiterhin nicht threadsicher ist?

3.) Mein eigener Vorschlag ist,
dass ich die Druck-Unit/Interface in einen extra COM-Server packe,
den dann die Clients (Anwendungen) benachrichtigen.
Wie ist deine Meinung dazu?

Gruß
Peter

Peter-Ziegler 14. Okt 2004 09:27

Re: Rave Report nicht modal benutzen.
 
Hallo allerseits,

hier ist eine Lösung zum Problem: Rave nicht-modal zu benützen, ohne die Anwendung zu blockieren.

1.) Ein COM-Objekt (Server) erstellen, das die ganzen Rave Aufrufe durchführt.

2.) In der Anwendung, die Schnittstelle des COM-Objekts (Server) in einem extra Thread aufrufen.
Wichtig ist beim Thread, damit COM funktioniert, vor dem COM-Aufruf die Funktion CoInitializeEx( nil, COINIT_MULTITHREADED )
der Unit ActiveX aufzurufen. Nach dem COM-Aufruf dann CoUnInitialize aufrufen.

Rave läuft dann unabhängig von der Applikation in einem extra (Haupt)-Fenster und
ich hatte bisher keine Laufzeitfehler mehr.

Vielen Dank an Thomas für seine Beiträge
und Gruß an allle.
Peter Ziegler


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 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