Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Nachrichtenschleife wird nicht beendet (https://www.delphipraxis.net/129128-nachrichtenschleife-wird-nicht-beendet.html)

ferby 13. Feb 2009 03:00


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

sx2008 13. Feb 2009 07:28

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;

ferby 13. Feb 2009 07:47

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

Zoot 13. Feb 2009 08:00

Re: Nachrichtenschleife wird nicht beendet
 
Zitat:

Zitat von ferby
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)

Dafür wäre es empfehlenswert, dennoch die Mechanismen von TApplication zu verwenden.
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.

sirius 13. Feb 2009 08:11

Re: Nachrichtenschleife wird nicht beendet
 
Zitat:

Zitat von sx2008
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;

Was glaubst du, bei welcher Nachricht getMessage false zurückgibt? (Antwort: WM_Quit)


Edit: @Ferby: Du warst prinzipiell auf dem richtigen Weg. Nur VCL und nonVCL zu mischen ist sehr schwierig und eher nicht zu empfehlen.

himitsu 13. Feb 2009 08:27

Re: Nachrichtenschleife wird nicht beendet
 
Zitat:

Zitat von sirius
Edit: @Ferby: Du warst prinzipiell auf dem richtigen Weg. Nur VCL und nonVCL zu mischen ist sehr schwierig und eher nicht zu empfehlen.

Vorallem da die VCL-Nachrichten-Schleife eigentlich noch viel mehr verarbeitet.
(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:
While not Application.Terminated do
  Application.ProcessMessages;
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)

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.

ferby 13. Feb 2009 08:29

Re: Nachrichtenschleife wird nicht beendet
 
Hello

@ Zoot

Danke mit
Delphi-Quellcode:
program Project1;

uses
  Forms;

var
  Form1: TForm;

begin
  Application.Initialize;
  Application.CreateForm(TForm, Form1);
  Form1.Caption := 'Bla';
  Application.Run;
end.
gehts.

Zitat:

Wozu soll deine Messageschleife gut sein?
Um ein Programmfenster offen zu halten?!
Versteh die Frage nicht ganz, message Schleife ist ja im prinzip bei Fenster Anwendungen verpflichtend.

@sirius
Zitat:

Nur VCL und nonVCL zu mischen ist sehr schwierig und eher nicht zu empfehlen.
Eigentlich wollte ich nie nonVCL was machen...
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).

himitsu 13. Feb 2009 08:36

Re: Nachrichtenschleife wird nicht beendet
 
Zitat:

Zitat von ferby
Um ein Programmfenster offen zu halten?!
Versteh die Frage nicht ganz, message Schleife ist ja im prinzip bei Fenster Anwendungen verpflichtend.

jupp, aber wenn, dann sollte auch die Nachrichtenschleife zum Fenster passen > siehe (Nacheditiertes) weiter oben.

Da du ja den Delphi-QuellCode haben solltest ... schau mal in Application.Run; bzw in Application.ProcessMessages; rein was da alles passiert.

Zoot 13. Feb 2009 08:44

Re: Nachrichtenschleife wird nicht beendet
 
Zitat:

Zitat von ferby
Zitat:

Wozu soll deine Messageschleife gut sein?
Um ein Programmfenster offen zu halten?!
Versteh die Frage nicht ganz, message Schleife ist ja im prinzip bei Fenster Anwendungen verpflichtend.


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]

himitsu 13. Feb 2009 09:04

Re: Nachrichtenschleife wird nicht beendet
 
Zitat:

Zitat von Zoot
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]

jupp, bist'e :tongue:

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:
procedure TCustomForm.Close;
begin
  ...
  if CloseAction <> caNone then
    if Application.MainForm = Self then Application.Terminate
in seinem Fall ist beim Schließen seiner Form Application.MainForm <> Self und demanch wird das Programm und nicht beendet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr.
Seite 1 von 2  1 2      

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