AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Problem mit Exception bei MDI aufrufen über mehrere Ecken
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Exception bei MDI aufrufen über mehrere Ecken

Ein Thema von sunfy · begonnen am 19. Aug 2005 · letzter Beitrag vom 19. Aug 2005
Antwort Antwort
sunfy

Registriert seit: 27. Apr 2004
22 Beiträge
 
#1

Problem mit Exception bei MDI aufrufen über mehrere Ecken

  Alt 19. Aug 2005, 13:05
Hallo Leutz,
Ich sitze gerade an zwei kleinen Problemen mit Vererbungen und gegenseitigen Aufrufen von MDIchild´s in Delphi 6.

Es geht darum ein QuickReport in einem Berichtformular zu erzeugen.
Beim gegenseitigen Erzeugen von MDIchild´s über drei Ecken bekomme ich immer wieder eine Exception und ich bekomme einfach nicht heraus, warum diese auftritt.
Und wenn ich den QuickReport mehrmals erzeuge bekomme ich auch eine Fehlermeldung, weil die Komponente schon existiert. (In diesem Fall sollte der QuickReport mit den aktuellen Daten aus der DB aktualisiert werden.(update) )


genauere Beschreibung des Problems (Beispielprogg ist attached):

der Quickreport ist bei mir die "QR_Report" diese wird im "FberichtVorschau" erzeugt.
Und die "FberichtVorschau" soll als MDIchild im Fmain angezeigt werden.
Soweit, sogut.
Das Funktioniert auch alles.

Doch nun möchte ich den Aufruf von einem anderen MDIchild "FberichtAufrufen" aus ausführen.
Der Aufruf funktioniert von dem FberichtAufrufen direkt auch noch (Button "BBerichtAufrufDirekt")

Doch jetzt kommt es: Wenn ich das MDIchild "FberichtAufrufen" schließe, solange das MDIchild "FberichtVorschau" noch geöffnet ist, kommt eine Exception.

Nagut, habe ich mir gedacht, weil das ganze ja von der "FberichtAufrufen" aufrufe und ich diese jetzt schließe kann eine Exception mal passieren.
Daher kam ich auf die Idee, das ganze Indirekt zu machen.
Also rief ich mit der "FberichtAufrufen" eine Procedure in der Fmain auf "Fmain.BerichtAufrufen_Indirekt" denn die Fmain schließe ich ja nicht.
Doch jetzt kommt immernoch eine Exception, wenn ich die "FberichtAufrufen" generiere, dann darüber indirekt die "FberichtVorschau" aufrufe, dann die "FberichtAufrufen" schließe, diese dann nocheinmal öffne und anschließend die "FberichtVorschau" schließen möchte.

Sollte da noch keine Fehlermeldung erscheinen, probiert einfach:
Nach dem generieren der "FberichtVorschau" die "FberichtAufrufen" ein paar mal generieren und wieder schließen, bevor man die "FberichtVorschau" schließt. Beim Schließen von "FberichtVorschau" kommt dann wieder eine Exception.


Außerdem bekomme ich noch eine Fehlermeldung wenn die "FberichtVorschau" mehrmals geöffnet werden soll, da dann die Komponente QR_Report schon existiert. Habs irgendwie noch nicht geschafft, nach der QR_Report für eine überprüfung suchen zu lassen, da diese ja in der Fmain->FberichtVorschau(MDI)->QRPReview integriert ist.

Würd mich freuen, wenn mir jem. bei diesem Problem helfen kann.

Gruß Sunfy
Angehängte Dateien
Dateityp: zip mdi_quickreport_747.zip (20,0 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Memo
Memo

Registriert seit: 19. Aug 2003
509 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Problem mit Exception bei MDI aufrufen über mehrere Ecke

  Alt 19. Aug 2005, 14:05
Ich habe mal nur den Teil für den neuen Report ein wenig umgestellt (siehe Anhang). Schau mal ob es das ist was du wolltest.
Angehängte Dateien
Dateityp: zip qr_203.zip (1.021 Bytes, 3x aufgerufen)
  Mit Zitat antworten Zitat
sunfy

Registriert seit: 27. Apr 2004
22 Beiträge
 
#3

Re: Problem mit Exception bei MDI aufrufen über mehrere Ecke

  Alt 19. Aug 2005, 16:06
Hmm, deine Überlegung war dass überprüft wird, ob der Zeiger auf die FberichtVorschau auf Nil zeigt.
Wenn ja dann wird eine neue Instanz von FberichVorschau erzeugt.

Delphi-Quellcode:
procedure TQR_Report.QuickRepPreview(Sender: TObject);
begin
 if not Assigned(FBerichtVorschau) then
   FBerichtVorschau:= TFBerichtVorschau.create(Self);
 FBerichtVorschau.QRPreview.QRPrinter := (Sender as TQRPrinter);
end;
Problem ist nur, dass der Zeiger beim schließen von FberichtVorschau nicht auf nil zurückgesetzt wird.
In der DelphiHilfe findet man zu assigned den Hinweis:
"Assigned kann keine Zeiger erkennen, die zwar nicht nil sind, aber trotzdem nicht mehr auf gültige Daten verweisen."

Daher bekommt man eine Exception, wenn man "Datei->Neuer Report" ausführt diesen dann schließt und "Datei->Neuer Report" erneut ausführt.
Eine Idee, wie man das machen kann?

Außerdem möchte ich vielmehr überprüfen ob schon ein QR_Report (in einem FberichVorschau) geöffnet ist.
Wenn bsp. schon ein FberichtVorschau mit einem anderen QR_Report_2 geöffnet ist, soll wenn noch kein QR_Report vorhanden ist, ein neues FberichtVorschau mit dem QR_Report geöffnet werden können, ohne dass QR_Report_2 geschlossen wird.

Ne idee dazu?
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#4

Re: Problem mit Exception bei MDI aufrufen über mehrere Ecke

  Alt 19. Aug 2005, 23:51
Moin, DeppNightmoin,

Zitat:
Nagut, habe ich mir gedacht, weil das ganze ja von der "FberichtAufrufen" aufrufe und ich diese jetzt schließe kann eine Exception mal passieren.
Daher kam ich auf die Idee, das ganze Indirekt zu machen.
Also rief ich mit der "FberichtAufrufen" eine Procedure in der Fmain auf "Fmain.BerichtAufrufen_Indirekt" denn die Fmain schließe ich ja nicht.
Doch jetzt kommt immernoch eine Exception, wenn ich die "FberichtAufrufen" generiere, dann darüber indirekt die "FberichtVorschau" aufrufe, dann die "FberichtAufrufen" schließe, diese dann nocheinmal öffne und anschließend die "FberichtVorschau" schließen möchte.
Das Problem liegt daran, das der Rücksprung nach Ausführen der Procedur, Deiner Subroutine, fehlt, wenn Du Dein MDI-Child schließt. Das Problem taucht wohl immer wieder mal auf, ist aber staubig alt. Prinzipiell gibt es da zwei Ansätze.

1. Du schickst dem Hautpformular (MDI-Master) eine Windowsmessage und bei Empfan dieser wird Dein Formular geschlossen sowie das Formular mit der Nummer in der Message geöffnet.

2. Du hast im MDI-Master eine Memini komponente wo Du ein Nachricht hinterlegst. Dann schließt Du Dein MDI-Child. Wenn kein MDI-Child geöffnet ist schaut Dein MDI-Master in der Memini nach ob eine Botschaft hier liegt und öffnet ein entsprechendes Formular.

Soweit für heute Abend // Grüße //Martin
Martin Schaefer
  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 14:36 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