![]() |
Nachrichtenschleife wird nicht beendet
Hallo,
ich habe ein eigenes Fenster mit Nachrichtenschleife erstellt. Wenn ich auf das X vom Fenster klicke, dann wird aber die Nachrichtenschleife nicht beendet. Habe ich etwas übersehen? (Also das Fenster verschwindet aber der Prozess bleibt im Task Manager)
Delphi-Quellcode:
program Project1;
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; var Form1: TForm; Button: TButton; Msg: TMsg; begin // Fenster Einstellungen Form1 := TForm.Create(NIL); Form1.Name := 'Irgendwas'; Form1.Width := 600; Form1.Height := 400; // Button Einstellungen Button := TButton.Create(Form1); Form1.Show; while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg); end; end. Gruß, Ferby |
Re: Nachrichtenschleife wird nicht beendet
Mal abgesehen davon, dass die Nachrichtenschleife in deinem Beispiel keinen Sinn macht, hast du vergessen, auf WM_QUIT zu reagieren:
Delphi-Quellcode:
while GetMessage(Msg, 0, 0, 0) do
begin if Msg.Message = WM_QUIT then break; TranslateMessage(Msg); DispatchMessage(Msg); end; |
Re: Nachrichtenschleife wird nicht beendet
Hallo,
mit WM_QUIT habe ich es auch schon probiert. WM_QUIT wird nicht gesendet, wenn ich auf das X vom Fenster klicke. Vlt liegt das daran, das das Beispiel keinen Sinn macht ;-) Eigentlich will ich eine "normal" VCL Application machen ohne die Zeile {$R *.dfm} zu verwenden. (Hat keinen höheren Sinn, wollte es einfach nur ausprobieren) Aber leider haut das irgendwie nicht hin... |
Re: Nachrichtenschleife wird nicht beendet
Zitat:
Wozu soll deine Messageschleife gut sein?
Delphi-Quellcode:
program Project1;
uses Forms; var Form1: TForm; begin Application.Initialize; Application.CreateForm(TForm, Form1); Form1.Caption := 'Bla' Application.Run; end. |
Re: Nachrichtenschleife wird nicht beendet
Zitat:
Edit: @Ferby: Du warst prinzipiell auf dem richtigen Weg. Nur VCL und nonVCL zu mischen ist sehr schwierig und eher nicht zu empfehlen. |
Re: Nachrichtenschleife wird nicht beendet
Zitat:
(z.B. wirdst du so probleme bekommen, wenn in deiner Form mal ein Hint angezeigt werden soll, es werden "einige" Dialog-Steuerfunktionen nicht zur verfügung gehen, sowie keine WM_xxx-Nachrichten nach CM_xxx umgesetzt werden, welche aber für viele VCL-Controls sehr wichtig sind.) Wenn, dann bastel dir lieber eine Schleife aus der VCL, statt wie mit deiner Variante:
Delphi-Quellcode:
ja und ich glaub man muß hier nicht auf WM_Quit hören, sondern auf WM_CLOSE ... WM_QUIT wird aufgerugen, wenn das Hauptfenster der VCL geschlossen wird (glaub ich)
While not Application.Terminated do
Application.ProcessMessages; Also wentweder du rufst in OnClose/OnDestroy deiner Form Application.Terminate; auf, oder du sendest dort zumindestens ein WM_QUIT an deine Anwendung. Ansonsten bin ich mit den Anderen einer Meinung ... wenn schon VCL, dann mach es richtig und nicht so Halb-Halb. |
Re: Nachrichtenschleife wird nicht beendet
Hello
@ Zoot Danke mit
Delphi-Quellcode:
gehts.
program Project1;
uses Forms; var Form1: TForm; begin Application.Initialize; Application.CreateForm(TForm, Form1); Form1.Caption := 'Bla'; Application.Run; end. Zitat:
Versteh die Frage nicht ganz, message Schleife ist ja im prinzip bei Fenster Anwendungen verpflichtend. @sirius Zitat:
Es geht mir nur darum, das der ganze Quellcode in einer Datei steht, da ich eine Beispiel Doku schreiben muss, ohne Drag&Drop zu verwenden. Daher wollte ich das gesamte Formular rein im Code erstellen (Aber schon VCL verwenden). |
Re: Nachrichtenschleife wird nicht beendet
Zitat:
Da du ja den Delphi-QuellCode haben solltest ... schau mal in Application.Run; bzw in Application.ProcessMessages; rein was da alles passiert. |
Re: Nachrichtenschleife wird nicht beendet
Zitat:
Deine Messageschleife ist doch völlig unabhängig von dem Fenster. Für den Mechanismus schau dir mal in Forms.pas Application.processmessage und Application.run an. [edit] bin ich langsam...[/edit] |
Re: Nachrichtenschleife wird nicht beendet
Zitat:
und nee, unabhängig ist sie nicht ... beide Schleifchen (seine und die in Application) verarbeiten alle Nachrichten des gesamten Threads, nur daß bei seiner Schleife bestimmte Nachrichten zwar angenommen, aber nicht entsprechend verarbeitet werden. Halt z.B. und halt WM_CLOSE nicht richtig/angemessen behandelt. z.B.:
Delphi-Quellcode:
in seinem Fall ist beim Schließen seiner Form Application.MainForm <> Self und demanch wird das Programm und nicht beendet.
procedure TCustomForm.Close;
begin ... if CloseAction <> caNone then if Application.MainForm = Self then Application.Terminate |
Re: Nachrichtenschleife wird nicht beendet
Zitat:
Nebenbei fehlt in dem Beispielcode noch ein Form1.free. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 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