AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kreuzbutton - kein Event ausgelöst?

Ein Thema von richie · begonnen am 9. Jun 2008 · letzter Beitrag vom 10. Jun 2008
Antwort Antwort
Benutzerbild von richie
richie

Registriert seit: 21. Apr 2006
Ort: Dresden
127 Beiträge
 
#1

Kreuzbutton - kein Event ausgelöst?

  Alt 9. Jun 2008, 15:24
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
Robert
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Kreuzbutton - kein Event ausgelöst?

  Alt 9. Jun 2008, 16:24
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.
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
IceTube
(Gast)

n/a Beiträge
 
#3

Re: Kreuzbutton - kein Event ausgelöst?

  Alt 9. Jun 2008, 16:27
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
  Mit Zitat antworten Zitat
Benutzerbild von richie
richie

Registriert seit: 21. Apr 2006
Ort: Dresden
127 Beiträge
 
#4

Re: Kreuzbutton - kein Event ausgelöst?

  Alt 9. Jun 2008, 16:46
Hallo,

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 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 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 von IceTube:
Da hat er Recht, du könntest aber auch "Application.HandleMessages" probieren...
Das ändert das Problem leider nicht.

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;
Robert
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Kreuzbutton - kein Event ausgelöst?

  Alt 9. Jun 2008, 16:57
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

edit://

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.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: Kreuzbutton - kein Event ausgelöst?

  Alt 9. Jun 2008, 17:09
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".
Andreas
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Kreuzbutton - kein Event ausgelöst?

  Alt 9. Jun 2008, 18:20
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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von richie
richie

Registriert seit: 21. Apr 2006
Ort: Dresden
127 Beiträge
 
#8

Re: Kreuzbutton - kein Event ausgelöst?

  Alt 10. Jun 2008, 14:54
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.
Robert
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:20 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