![]() |
[nonVCL] Endlosschleife mit 2 Fenstern
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
hab mal wieder ein kleines Problem und kann den Fehler nicht finden :stupid: Also ich habe eine Simple nonVCL Anwendung mit einer MainForm und 2 Buttons. Auf klick der Buttons öffnet sich ein weiteres Fenster. Bisdahinn alles schick. Wenn aber nun eins der beiden Fenster geöffnet ist, und ich die MainForm schliesse hängt sich das Programm in einer Endlosschleife fest und das obwohl ich vor dem schliessen ein WM_CLOSE an die Fenster schicke. Mein Problem ist, ich finde einfach den Fehler nicht. Wieso sich das Programm dann festhängt. Kann mir da einer weiterhelfen und weiß wo genau mein Fehler da liegt, und wie ich das korrigieren kann? Habe das kleine Testprojekt angehangen. |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Wenn die Mainform "first form ist" dann solltest du nur hier die messagen behandeln
andernfalls hängt die Anwendung in den anderen Form's bei GetMessage. Ausblenden.. bzw entfernen in Form1 und Form2
Delphi-Quellcode:
Frage mich auch warum du einen zugriff auf die Hauptform überhaupt zuläßt
while GetMessage(msg, 0, 0, 0) do
begin if IsDialogMessage(hTest1Wnd, msg) = FALSE then begin TranslateMessage(msg); DispatchMessage(msg); end; end; Schalte diese doch auf enabled = False wenn du schon modale Forms öffen willst. Auch darf dann in Form1 und Form2 ein
Delphi-Quellcode:
nicht behandelt werden da du dann die gesamte Anwendung dadurch beendest.
WM_DESTROY:
begin; PostQuitMessage(0); end; Ein
Delphi-Quellcode:
sollte ausreichen um das Fenster korrekt zu beenden.
WM_CLOSE:
begin DestroyWindow(hWnd); end; gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Also ich will die Form nicht disablen, da alle noch nutzbar sein sollen, auch wenn die Child Fenster geöffnet sind.
Aber durch dich hab ich trotzdem endlich die Lösung gefunden. Die eigentlich auch klar war :oops: Ich muss nachtürlich in der Nachrichtenschleife der Childs auf die WM_CLOSE Message reagieren. Dann funktioniert es wie es soll:
Delphi-Quellcode:
while GetMessage(msg, 0, 0, 0) do
begin if IsDialogMessage(hTest1Wnd, msg) = FALSE then begin if Msg.message = WM_CLOSE then Break; TranslateMessage(msg); DispatchMessage(msg); end; end; |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
GetMessage sollte nur in der Hauptform behandelt werden.
Aber gut jeder wie er will ;) gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Sorry doppel post..
|
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Ich weiß nicht genau wie ich GetMessage aus den Childs rausbekommen soll?!
Wie würdest du das denn machen? Was ist denn mein Message Handler in den Fenstern? Edit: Würdest du vllt. oben das gepostete Bsp. mal anpassen wie du es meinst? Das wäre sehr nett :thumb: Edit2: Ohh wieso hat er das Edit als neuen Beitrag verfasst :gruebel: |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Bitte
Zitat:
Pro Thread kann/könnte man einen Message Handler verwenden da du das 2 Fenster aus dem Thread der MainForm aufrufst benötigst du hier keinen weiteren Handler. (meiner erfahrung nach :gruebel:) gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Macht doch bitte aus
Zitat:
Delphi-Quellcode:
Ich bekomme immer Augenkrebs bei Boolean-Vergleichen ;)
if not IsDialogMessage(hAppWnd, msg) then
... |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
Spass beiseite ist nur ein kosmetischer Fehler. Wenn der Compiler damit nicht klar kommt dann taugt er einfach nix. gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Vielen Dank!
Ich war immer in dem Glauben das ich für jedes Fenster nen eigenen Message Handler brauche. Da hab ich mich wohl kräftig geirrt :shock: Ist aufjedenfall abgespeichert ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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