![]() |
Kreuzbutton - kein Event ausgelöst?
Hallo liebe Community!
Ich habe ein kleines Problem. In meinem Programm (ein Vier-Gewinnt) wird in einer Schleife auf Benutzereingaben gewartet. Allerdings habe ich das Problem, dass wenn der Benutzer das Fenster (ist nicht das Mainform!) über den Kreuzbutton rechts oben im Fenster schließen will, dieses nicht reagiert. In der Schleife rufe ich Application.ProcessMessages auf, aber es wird anscheinend kein Event aufgerufen, sonst hätte ich einfach eine Abbruchbedingung in der Schleife, die im Event gesetzt würde. Wie kann ich das Problem lösen? Danke schon einmal für Hilfe, richie |
Re: Kreuzbutton - kein Event ausgelöst?
Du könntest auf Application.Terminated abfragen oder mit einer Boolschen Variable arbeiten. Allerdings solltest du deine Programmstruktur noch einmal überdenken, denn in einer Schleife auf Eingaben zu warten ist nicht das Wahre.
|
Re: Kreuzbutton - kein Event ausgelöst?
Zitat:
lg |
Re: Kreuzbutton - kein Event ausgelöst?
Hallo,
Zitat:
Zitat:
Zitat:
Zitat:
Nocheinmal das Problem, weil ich glaube, dass das noch nicht so richtig verstanden wurde: mir geht es weniger darum, die Schleife zu Beenden, als vielmehr zu erfahren, warum kein Event ausgeführt wird. Die Schleife sieht folgendermaßen aus (über Sinn und Nutzen möchte ich mich jetzt nicht streiten):
Delphi-Quellcode:
while (not frmGame.return) do
begin frmGame.Delay(50); Application.HandleMessage; end; |
Re: Kreuzbutton - kein Event ausgelöst?
Zur Not geht das:
Delphi-Quellcode:
Du solltest aber nochmal dein Konzept überdenken :zwinker:
while (not frmGame.return) and (not Application.Terminated) do
begin frmGame.Delay(50); Application.HandleMessage; end; edit:// Zitat:
Nur was wird in diesem gemacht? Genau, es wird einfach nur Application.Terminated auf True gesetzt, weiter nix! Das wäre in einem "normalen" Programm auch ausreichend, weil ein "normales" Programm so aussieht:
Delphi-Quellcode:
Wenn nun Terminated = True wird die Schleife verlassen und das Programm beendet.
repeat
try HandleMessage; except HandleException(Self); end; until Terminated; In deinem Programm ist er jetzt aber nicht mehr in dieser Schleife sondern hängt in deiner Schleife fest die sich eben nicht um Terminated kümmert. |
Re: Kreuzbutton - kein Event ausgelöst?
Zitat:
Windows ist ein eventgesteuertes System. Durch deine überflüssige Schleife verhindest du das Abarbeiten von Maus- und Tastaturevents. Dabei ist Vier-Gewinnt ganz einfach zu steuern: Im Formular das Property KeyPreview auf True setzen. Im Event OnKeyPress fragst du einfach die Tasten '1' bis'7' ab. Das entspricht dann dem Fallenlassen einer Münze in der jeweiligen Spalte. In der Luxusausführung reagiert man zusätzlich auf Pfeil-Links/Rechts und Leertaste. Ein Doppelklick im Drawgrid bedeutet ebenfalls "Münze fallenlassen". |
Re: Kreuzbutton - kein Event ausgelöst?
Moin Richie,
so würd's gehen:
Delphi-Quellcode:
// Ausschnitt
procedure WMCLOSE(var msg: TMessage); message WM_CLOSE; private { Private declarations } FfExit : Boolean; public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormShow(Sender: TObject); begin FfExit := False; end; procedure TForm2.btn2Click(Sender: TObject); begin while not FfExit do begin Application.ProcessMessages; end; Close; end; procedure TForm2.WMCLOSE(var msg: TMessage); begin inherited; FfExit := True; end; |
Re: Kreuzbutton - kein Event ausgelöst?
Erst mal danke an Christian, das war es! Hat mir sehr geholfen.
@ all: Dass das jetzt nicht die optimale Variante ist, ist mir klar. Doch wie bereits gesagt, ich muss es bald abgeben und wollte mir größere Umbauten ersparen. Danke trotzdem für die Tipps, wie ich es besser machen kann. Ich werde es sicher bald noch umbauen und kann auf solche Konstrukte dann hoffentlich verzichten. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 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