Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wieso lässt sich mein Fenster nicht schließen? (https://www.delphipraxis.net/16312-wieso-laesst-sich-mein-fenster-nicht-schliessen.html)

Chewie 14. Feb 2004 22:29


Wieso lässt sich mein Fenster nicht schließen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mir ein kleines, klassenbasiertes nonVCL-Grundgerüst gebastelt. Das Problem dabei ist nur, dass das Schließen über das Kreuz im rechten Eck (ihr wisst, was ich meine ;)) nicht richtig funktioniert. Meistens geht es nicht, doch manchmal schon :shock:

Vielleicht sieht jemand den Fehler. Da ich nicht weiß, wo der Fehler genau zu suchen ist, häng ich die Klasse mal an. Das Projekt sieht so aus:

Delphi-Quellcode:
program base;

uses
  appbase, Windows, Messages, Dialogs;


procedure Init;
begin
  ShowMessage('Hier bin ich!');
end;

var
  Size: TPoint;
begin
  Size.x := 600;
  Size.y := 400;
  with TAppBase.Create do
  begin
    //OnCreate := Init;
    CreateWindow('Testfenster', Size);
    Run;
    Free;
  end;
end.

lorenz 15. Feb 2004 17:04

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Hallo alle zusammen!

Kann es vielleicht sein, dass man da wie bei MDI-Anwendungen in der onClose-Prozedur des Fensters action auf caFree setzen muss? (Ist aber nur eine Vermutung, die wahrscheinlich nicht richtig ist.)

MfG

Lorenz

Chewie 15. Feb 2004 17:13

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Zitat:

Kann es vielleicht sein, dass man da wie bei MDI-Anwendungen in der onClose-Prozedur des Fensters action auf caFree setzen muss?
nein, da es kein caFree gibt, da ich keine VCL benutze.

CalganX 15. Feb 2004 17:26

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Chewie,
ich habe mal deine Nachrichtenschleife verändert und das was mir beim drübergucken irgendwie nicht so gefallen hat. :mrgreen: Musst also einfach mal gucken. Jedenfalls funktioniert es jetzt bei mir. :)

Chris

[edit]Da ich seit einigen Tagen sowas ähnliches für C++ code, wollte ich mal fragen, ob man da mit einsteigen kann... ;)[/edit]

Chewie 15. Feb 2004 17:50

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Danke für die Mühe, aber leider bringt mir das nix. Du hast ja in der Nachrichtenschleife PeekMessage durch GetMessage ersetzt, was ich aber nicht will, da ich die Klasse in einer OpenGL-Anwendung einsetzen will und ich praktisch im OnIdle-Ereignis rendern will.

CalganX 15. Feb 2004 18:26

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Hi,
dann ersetze einfach mal GetMessage durch PeekMessage. Ich habe ja nicht nur das geändert, sondern diese suspekte if-Abfrage auch rausgenommen.

Musst einfach mal ausprobieren,
Chris

Chewie 15. Feb 2004 18:59

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Diese "suspekte if-Abfrage" terminiert das Programm erst ;)

CalganX 15. Feb 2004 19:02

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Hi,
aber du hast doch die WndProc, in der WM_DESTROY abgefangen wird. Und wenn du auch noch WM_CLOSE und WM_QUIT mit dem gleichen Prinzip hinzufügst, kommt es doch auf's selbe raus, oder? :gruebel:

Chris

Chewie 15. Feb 2004 19:08

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Also:

Deine Schleife:
Delphi-Quellcode:
while (GetMessage(msg, 0, 0, 0)) do begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
Meine Schleife:
Delphi-Quellcode:
while not done do
  begin
    PeekMessage(msg, FHandle, 0, 0, PM_REMOVE);
    if msg.message = WM_QUIT then
      done := true
    else
    begin
      TranslateMessage(msg);
      DispatchMessage(msg);
      Sleep(1);
    end;
  end;
GetMessage liefert false, wenn WM_QUIT eintrifft, deshalb bricht deine Schleife in diesem Fall ab.
PeekMessage liefert true, wenn eine Nachricht da ist und ansonsten false. Deshalb muss ich selbst auf WM_QUIT prüfen und die Schleife dann abbrechen, was ich ja auch tue.

Chewie 15. Feb 2004 20:37

Re: Wieso lässt sich mein Fenster nicht schließen?
 
Oh, ich hab den Fehler entdeckt.
Statt
Delphi-Quellcode:
if PeekMessage(msg, FHandle, 0, 0, PM_REMOVE) then
muss es
Delphi-Quellcode:
if PeekMessage(msg, 0, 0, 0, PM_REMOVE) then
heißen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:32 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