![]() |
[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 ;) |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
![]() gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Guck mal hier:
![]() |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
Das lag bei mir wohl eher am nicht wissen durch "hat vorher perfekt funktioniert" :lol: Naja und dadurch hab ich mir nie nen Kopf drüber gemacht, wie es anders sein sollte.. Bis Heute! Aber man lernt nie aus und nun sollte ich es verstanden haben :) |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Also pro Fenster eine Nachrichtenschleife ist nicht verkehrt. Weil die Nachrichten der Kind-Fenster an das übergeordnete Fenster weitergereicht werden. Ein Klick auf eine Schaltfläche in Fenster 2 geht auch an das Fenster 2 und sollte da behandelt werden.
|
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
Zitat:
gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
OK, aber bei mir hat jedes Fenster seine eigen Fensterprozedur, der Übersichtlichkeit halber, und dazu gehört für mich eben auch jeweils eine Nachrichtenschleife.
|
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
Selbst wenn du im zweiten Dialog einen Extra Handler hast werden die Messagen an dem Handler der Anwendung weitergeleitet denn dieser ist für den aktuellen Thread maßgeblich. Oder warum sonst gibt es hier in diesem Fall einen Endlos Loop? Nach dem schließen der Mainform. Also doppelt gemoppelt. Aber wie gesagt jeder wie er will.. gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Das hört sich allerdings logisch an, was Emil da sagt.
Es gab mit mehreren Message Handlern ausserdem Probleme mit WM_KEYDOWN. Dann hat nämlich die Form die Pfeiltasten sowie die Entertaste nicht erkannt. Mit nur einer Schleife läuft das jetzt aber ohne Probleme. |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Also bei mir hat es ohne Probleme so geklappt, wenn ich mich recht erinne.
|
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
Wieviele sollte man dann innerhalb des 2 Handlers umbiegen? Das ist nicht der sinn eines Messagehandlers wenn man hier messagen außen vor läßt. gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Ich habe gerade mal die alten nonVCL DirectDraw bsp. von Microsoft durchgestöbert und auch die benutzen nur einen Message Handler bei 2 Dialogen in Ihren Bsp.
|
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
Abgesehen davon wenn ich in DLL's mehrere Threads erstelle dann benötige ich für jeden einen Handler. Da diese bekanntlich unabhängig von einander arbeiten. gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Liste der Anhänge anzeigen (Anzahl: 1)
@Luckie:
Schaau dir mal bitte das Bsp an was ich angehangen hab. Das verdeutlicht was ich meine! Button1 Fenster ohne eigenen Message Handler Button2 mit Message Handler Edit: Wenn das 2 Fenster geöffnet wurde (Button2) dann muss das Prog per Taskplaner gekillt werden. Wegen der Endlosschleife.. |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe ein wenig in Deinem Quelltext herumgepfuscht. ;)
Bitte schalte mal die Bereichs.-u. Überlaufsprüfung ein... |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Leicht OT:
Hätte selber noch was geändert. frmMainForm.WinMain(hInstance, System.hPrevInst, System.CmdLine, System.CmdShow); Zitat:
warum dann nicht einfach 0 , nil, 0 ? Und unnötige Warnungen von vornherein gar nicht erst produzieren. Nur ein kleiner zusätzlicher TIP..
Delphi-Quellcode:
Warum nicht 'Template_Mutex' direkt übergeben da nur einmal verwendet
const
Mutex = 'Template_Mutex'; das ersparrt unnötiges konvertieren nach PAnsiChar gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
|
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Zitat:
Ich habe es bei mir getestet mit Bereichs.-u. Überlaufsprüfung. Da stürzt nix ab. gruss |
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Also bei mir stürzt es ab, wenn:
Delphi-Quellcode:
nicht in :
SendMessage(hBmpButton4, WM_SETFONT, MAKEWPARAM(hAppFont, 0), 0);
Delphi-Quellcode:
geändert wird. Bei MakeWParam greift der RangeCheck.
SendMessage(hBmpButton4, WM_SETFONT, INTEGER(hAppFont), 0);
|
AW: [nonVCL] Endlosschleife mit 2 Fenstern
Liste der Anhänge anzeigen (Anzahl: 1)
Genau.
Delphi-Quellcode:
erwartet als Parameter Word, hAppFont ist aber ein Integer.
MAKEWPARAM()
Im Anhang noch mal die Testapp mit verbessertem Fensterhandling in dem bei dem Subwindows als Parnet des Hauptfensters erzeugt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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