Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   [nonVCL] Endlosschleife mit 2 Fenstern (https://www.delphipraxis.net/172689-%5Bnonvcl%5D-endlosschleife-mit-2-fenstern.html)

lbccaleb 17. Jan 2013 12:03

[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.

EWeiss 17. Jan 2013 12:33

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:
while GetMessage(msg, 0, 0, 0) do
      begin
        if IsDialogMessage(hTest1Wnd, msg) = FALSE then
          begin
            TranslateMessage(msg);
            DispatchMessage(msg);
          end;
      end;
Frage mich auch warum du einen zugriff auf die Hauptform überhaupt zuläßt
Schalte diese doch auf enabled = False wenn du schon modale Forms öffen willst.

Auch darf dann in Form1 und Form2 ein
Delphi-Quellcode:
    WM_DESTROY:
      begin;
        PostQuitMessage(0);
      end;
nicht behandelt werden da du dann die gesamte Anwendung dadurch beendest.

Ein
Delphi-Quellcode:
    WM_CLOSE:
      begin
        DestroyWindow(hWnd);
      end;
sollte ausreichen um das Fenster korrekt zu beenden.

gruss

lbccaleb 17. Jan 2013 13:18

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;

EWeiss 17. Jan 2013 13:21

AW: [nonVCL] Endlosschleife mit 2 Fenstern
 
GetMessage sollte nur in der Hauptform behandelt werden.

Aber gut jeder wie er will ;)

gruss

lbccaleb 17. Jan 2013 13:33

AW: [nonVCL] Endlosschleife mit 2 Fenstern
 
Sorry doppel post..

lbccaleb 17. Jan 2013 13:35

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:

EWeiss 17. Jan 2013 13:48

AW: [nonVCL] Endlosschleife mit 2 Fenstern
 
Bitte

Zitat:

Was ist denn mein Message Handler in den Fenstern?
Wenn ich nicht falsch liege der aus dem der Thread gestartet wurde.
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

DeddyH 17. Jan 2013 14:00

AW: [nonVCL] Endlosschleife mit 2 Fenstern
 
Macht doch bitte aus
Zitat:

Delphi-Quellcode:
if IsDialogMessage(hAppWnd, msg) = FALSE then

Delphi-Quellcode:
if not IsDialogMessage(hAppWnd, msg) then
  ...
Ich bekomme immer Augenkrebs bei Boolean-Vergleichen ;)

EWeiss 17. Jan 2013 14:02

AW: [nonVCL] Endlosschleife mit 2 Fenstern
 
Zitat:

Ich bekomme immer Augenkrebs bei Boolean-Vergleichen
Oder Netzhautablösung ;) Hehehehhe

Spass beiseite ist nur ein kosmetischer Fehler.
Wenn der Compiler damit nicht klar kommt dann taugt er einfach nix.

gruss

lbccaleb 17. Jan 2013 14:06

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 03:13 Uhr.
Seite 1 von 3  1 23      

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