Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Kreuzbutton - kein Event ausgelöst? (https://www.delphipraxis.net/115269-kreuzbutton-kein-event-ausgeloest.html)

richie 9. Jun 2008 15:24


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

Fussball-Robby 9. Jun 2008 16:24

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.

IceTube 9. Jun 2008 16:27

Re: Kreuzbutton - kein Event ausgelöst?
 
Zitat:

Zitat von Fussball-Robby
in einer Schleife auf Eingaben zu warten ist nicht das Wahre.

^Da hat er Recht, du könntest aber auch "Application.HandleMessages" probieren... ;)

lg

richie 9. Jun 2008 16:46

Re: Kreuzbutton - kein Event ausgelöst?
 
Hallo,

Zitat:

Zitat von Fussball-Robby
Du könntest auf Application.Terminated abfragen

Wie ich bereits schrieb, handelt es sich nicht um das Mainform. Somit nützt es mir ja auch wenig, auf Application.Terminated zu prüfen!


Zitat:

Zitat von Fussball-Robby
oder mit einer Boolschen Variable arbeiten.

Auch hier hab ich schon geschreiben, dass ich es theoretisch machen würde, allerdings wird ja kein Event ausgelöst, in dem ich das dann durchführen könnte.


Zitat:

Zitat von Fussball-Robby
Allerdings solltest du deine Programmstruktur noch einmal überdenken, denn in einer Schleife auf Eingaben zu warten ist nicht das Wahre.

Dass das nicht das Non-Plus-Ultra darstellt, weiß ich. Nur muss ich das ganze bis spätestens Freitag fertig stellen, und da es bis jetzt zufriedenstellend läuft, möchte ich daran vorerst nichts ändern.


Zitat:

Zitat von IceTube
Da hat er Recht, du könntest aber auch "Application.HandleMessages" probieren... :wink:

Das ändert das Problem leider nicht. :pale:

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;

dominikkv 9. Jun 2008 16:57

Re: Kreuzbutton - kein Event ausgelöst?
 
Zur Not geht das:
Delphi-Quellcode:
while (not frmGame.return) and (not Application.Terminated) do
begin
  frmGame.Delay(50);
  Application.HandleMessage;
end;
Du solltest aber nochmal dein Konzept überdenken :zwinker:

edit://

Zitat:

Zitat von richie
mir geht es weniger darum, die Schleife zu Beenden, als vielmehr zu erfahren, warum kein Event ausgeführt wird.

Es wird schon das Event aufgerufen.
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:
repeat
  try
    HandleMessage;
  except
    HandleException(Self);
  end;
until Terminated;
Wenn nun Terminated = True wird die Schleife verlassen und das Programm beendet.
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.

shmia 9. Jun 2008 17:09

Re: Kreuzbutton - kein Event ausgelöst?
 
Zitat:

Zitat von richie
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):

Doch, genau um den Unsinn der Schleife sollten wir uns unterhalten.
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".

Christian Seehase 9. Jun 2008 18:20

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;

richie 10. Jun 2008 14:54

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