AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Nachrichtenschleife wird nicht beendet
Thema durchsuchen
Ansicht
Themen-Optionen

Nachrichtenschleife wird nicht beendet

Ein Thema von ferby · begonnen am 13. Feb 2009 · letzter Beitrag vom 13. Feb 2009
Antwort Antwort
Seite 1 von 2  1 2      
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 04:00
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 08:28
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;
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#3

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 08:47
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...
  Mit Zitat antworten Zitat
Zoot

Registriert seit: 30. Jan 2006
Ort: Hessen
113 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 09:00
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 09:11
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 09:27
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.
$2B or not $2B
  Mit Zitat antworten Zitat
ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#7

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 09:29
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).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 09:36
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Zoot

Registriert seit: 30. Jan 2006
Ort: Hessen
113 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 09:44
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]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

Re: Nachrichtenschleife wird nicht beendet

  Alt 13. Feb 2009, 10:04
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

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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 Uhr.
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