Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi keypress und window schliessen (https://www.delphipraxis.net/52186-keypress-und-window-schliessen.html)

runger 25. Aug 2005 06:12


keypress und window schliessen
 
Hallo,
ich habe ein seltsames Verhalten in einem von uns geschrieben Programm. Vielleicht kann jemand helfen.

Es befinden sich, auf einem Formular 3 Radiobuttons und zwei Buttons. Mit einem Button werden die Werte der drei Radiobuttuns (checked) in boolsche Variablen geschrieben. Beim öffnen des Formulars werden die Radiobuttons (onshow) jeweils wieder so gesetzt wie sie in den Variablen standen. Der zweite Button schliesst das Fenster einfach mit close. Das funktioniert alles prächtig.
Wir wollen das Fenster aber auch mit ESC schliessen und haben das Ganze in onkeypress des Formulars abgefangen.
Funktioniert auch, nur sind die Zustände der Radiobuttons, nach dem wiederöffnen, in einem falschen Zustand, obwohl diese laut Debugger richtig gesetzt sind.
Beim verlassen des Formulars mit dem Button muss sich das Fenster also anders verhalten als beim verlassen über Onkeypress, obwohl in beiden nur ein close steht.
Ich versteh das nicht.

Rainer

BrunoT 25. Aug 2005 08:17

Re: keypress und window schliessen
 
Hi runger,

sind die Boolschen Variablen global oder lokal definiert?

mfg

BrunoT

runger 25. Aug 2005 08:28

Re: keypress und window schliessen
 
Hallo,
global definiert. Das ist es aber nicht, hab ich mit Debugger überprüft. Die Radiobuttons werden in onshow richtig gesetzt, aber trotzdem falsch angezeigt.

Wie gesagt, ich verstehs nicht.

Rainer

BrunoT 25. Aug 2005 08:54

Re: keypress und window schliessen
 
Versuch mal, mit Keypress das ButtonClick-Ereignis des Schließen-Buttons anzusprechen

runger 25. Aug 2005 09:30

Re: keypress und window schliessen
 
Hallo,

hab ich auch versucht. Gleiches Verhalten. Das Programm verhält sich nach wie vor anders wenn ich das Window mit ESC verlasse.

Rainer

runger 25. Aug 2005 09:35

Re: keypress und window schliessen
 
Hallo,

ich bekomme dieses Problem auch, wenn ich statt onkeypress den Abbruchbutton cancel auf true setze und dann mit ESC rausgehe.

Rainer

ringli 25. Aug 2005 09:37

Re: keypress und window schliessen
 
Nützt es etwas wenn du das Ganze im KeyDown statt im KeyPress versuchst?

BrunoT 25. Aug 2005 09:37

Re: keypress und window schliessen
 
Hast du die Variable Key nach keypressed auf Null gesetzt oder bei ESC gelassen?

Delphi-Quellcode:
if key = 27 then
Begin
  key:=0;
  close;
end;
ich denke mal, da ESC ja als Abbruch sonst vom Programm weiterverarbeitet wird, erfolgt keine korrekte Zuweisung.

@ringli,

Das ist schon interessant, ich weiß nur nicht im Augenblick, welches Ereignis zuerst eintritt. Das wäre auszuprobieren.

ringli 25. Aug 2005 09:40

Re: keypress und window schliessen
 
Also ich mache dass immer so:
Delphi-Quellcode:
{*** Tastenkürzel vergeben ***}
procedure TProgramm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  {*** ESC beendet das Programm ***}
  if (Key = $1B) then CancelClick (Sender);
end;

runger 25. Aug 2005 09:48

Re: keypress und window schliessen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

nützt alles nix. Hier ist ein Testprog mit Quellcode. Vielleicht findet ihr raus was da passiert.
Für alle Stylisten, das ist ein schnell zusammengeschustertes Prog.

Rainer

dfried 25. Aug 2005 09:56

Re: keypress und window schliessen
 
In deinem Beispielprogramm wird der Status der Buttons beim verlassen des Fensters aber überhaupt nicht gespeichert oder hab ich da was übersehen?

edit: Sorry, hab "falsch rum" gekuckt, beim verlassen mit "ESC" soll ja grad NICHT gespeichert werden...

Gruß
Daniel

BrunoT 25. Aug 2005 10:17

Re: keypress und window schliessen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi runger,

du verwendest Radiobutton, wo du eine RadioGroup verwenden kannst. dann funktioniert es. :P
Außerdem habe ich die Keyprewiev- Eigenschaft der Form2 auf true gestellt.

mfg

BrunoT

runger 25. Aug 2005 10:29

Re: keypress und window schliessen
 
Hallo BrunoT,

das funktioniert genausowenig wie bei mir. Wenn man mit cancel rausgeht verhält sich das anders als wenn man mit ESC rausgeht. Da gibt es keinen Unterschied zwischen dir und mir. ???

Rainer

shmia 25. Aug 2005 10:32

Re: keypress und window schliessen
 
Handelt es sich um ein modales oder nichtmodales Formular?
Bei einem modalen Formular (und das bietet sich an), gibt es folgende Features:
Ein Button, dessen Property Cancel auf True steht wird automatisch von der VCL geklickt, wenn der Benutzer Escape drückt.
(Also vergiss alles mit KeyPress.)
Es darf nur einen Button mit Cancel=True geben!!

Wenn dieser Button (oder BitBtn) im Property ModalResult einen Wert ungleich mrNone wird das Formular automatisch geschlossen.

Ein modales Formular wird im Prinzip so benützt:
Delphi-Quellcode:
var
   frm : TProgSettingsForm;
begin
   // Formular erzeugen
   frm := TProgSettingsForm.Create(nil);
   try
     // Anfangswert ins Formular schreiben
     frm.AnzahlVersuche := .....

     if frm.ShowModal = mrOK then
     begin
        // evtl. geänderte Werte auslesen und irgenwo speichern
        ... := frm.AnzahlVersuche;
     end;
   finally
     frm.Free;
   end;
end;

runger 25. Aug 2005 10:51

Re: keypress und window schliessen
 
Hallo shmia,

das ist alles längst gegessen. Es ist ein modales Fenster. Den Button auf cancel setzen ist in meinem Prog realisiert. Ich will dass das Ganze mit dem Demoprogramm funktioniert und zwar auf einfache Weise. Es gibt überhaupt keinen Grund warum sich das Ganze anders verhält je nachdem ob ich cancel drücke oder ESC.
Downloade mein Programm und probiers aus.

Rainer

dfried 25. Aug 2005 10:53

Re: keypress und window schliessen
 
Wennich das setzen der RadioButtons von "FormShow" in "FormActivate" verschiebe funktioniert es wie gewollt. Ist zwar nicht so schön, aber tut.

Gruß
Daniel

runger 25. Aug 2005 11:00

Re: keypress und window schliessen
 
Hallo Daniel,

Klasse, wenigstens eine Lösung für mein Problem.
Wenn du mir jetzt noch sagst warum das bei onshow nicht und bei onactivate geht wäre ich glücklich.

Rainer

BrunoT 25. Aug 2005 11:02

Re: keypress und window schliessen
 
Hi runger,

1. 2.Form öffnen
2. RadioButton wählen, (zum Test habe ich beide Varianten angeclickt)
3. Save, Form zu über Schließen
4. Form auf
5. anderen RadioButton wählen,
6. Esc
7. Form auf, in der Radiogroup ist der gespeicherte Zustand, in den einzelnen Button nicht.

Ich habe nicht die Einstellung mrCancel und Cancel:=true benutzt, sondern wie gefordert das Keydownereignis der Form.

mfg

BrunoT

Ps. sollte es sich erledigt haben, bitte mal erläutern, wie.

dfried 25. Aug 2005 11:05

Re: keypress und window schliessen
 
Zitat:

Zitat von runger
Klasse, wenigstens eine Lösung für mein Problem.
Wenn du mir jetzt noch sagst warum das bei onshow nicht und bei onactivate geht wäre ich glücklich.

Tja, wenn ich das wuesste :)
Da muesste man wahrscheinlich mal in den tiefen der VCL forschen.

Gruß
Daniel

shmia 25. Aug 2005 12:09

Re: keypress und window schliessen
 
Zitat:

Zitat von runger
das ist alles längst gegessen. Es ist ein modales Fenster. Den Button auf cancel setzen ist in meinem Prog realisiert. Ich will dass das Ganze mit dem Demoprogramm funktioniert und zwar auf einfache Weise. Es gibt überhaupt keinen Grund warum sich das Ganze anders verhält je nachdem ob ich cancel drücke oder ESC.

Ok, ich habe gesehen, das sich das Demo tatsächlich seltsam verhält.
Du machst aber versch. Fehler in deinem Demo.
1.) Du hast ModalResult bei deinem Buttons nicht gesetzt
2.) Du erzeugst das Formular nicht jedesmal neu, wie von mir gezeigt
3.) der Datenfluss ist falsch!!!!
in deinem Demo holt sich das modale Formular die Variable a,b,c von Unit1.
Es muss genau umgekehrt laufen:
Deine Anwendung schreibt die Daten auf modale Formular und holt die Ergebnisse ab, wenn ModalResult = mrOK war.
Das modale Formular sollte so designt werden, dass keine Abhängigkeiten zu anderen Units in der Anwendung bestehen.
Schau dir meinen Delphicode nochmals an, dann siehst du dass diese Vorgehensweise 100% wasserdicht ist.


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