Discussion:
ESC in nicht-modalen Dialogen in D2 und D5
(zu alt für eine Antwort)
Manfred Dings
vor 20 Jahren
Permalink
Ich verwende ein Formular mit u. a. einer Cancel-Schalftläche
(property cancel=true) als nicht-moldalen Dialog.

Unter D2 ließ sich dieses Formular mit der ESC-Taste schließen. Unter
D5 funktioniert dies nicht mehr, besser gesagt: nur dann, wenn ich das
Formular modal anzeigen lasse.

Wenn der Dialog nicht-modal läuft, wird des ESC-Taste nicht erkannt.
Das Ereignis "KeyDown" wird mit VK_ESCAPE gar nicht erst ausgelöst
(bei allen anderen Tasten schon).

Wieso läuft das unter D2 anders, und: gibt es eine Möglichkeit, den
Dialog auch in D5 nichtmodal mit ESC zu beenden?

MD
--
http://virtualskysoft.de
Stefan M. Huber
vor 20 Jahren
Permalink
Post by Manfred Dings
Wieso läuft das unter D2 anders, und: gibt es eine Möglichkeit, den
Dialog auch in D5 nichtmodal mit ESC zu beenden?
Keypreview := true;

Stefan
Manfred Dings
vor 20 Jahren
Permalink
On Thu, 17 Nov 2005 11:53:48 +0100, "Stefan M. Huber"
Post by Stefan M. Huber
Keypreview := true;
Leider hilft das nicht.

MD
--
http://virtualskysoft.de
Stefan M. Huber
vor 20 Jahren
Permalink
Post by Manfred Dings
On Thu, 17 Nov 2005 11:53:48 +0100, "Stefan M. Huber"
Post by Stefan M. Huber
Keypreview := true;
Leider hilft das nicht.
Sicher hilft das. Alleine natürlich nicht. Man muss schon noch was tun,
denn Keypreview sagt ja nur, dass ein Form einen Tastendruck mitbekommt,
bevor das Control davon erfährt. Und das bedeutet, du kannst einen
OnKeyPress-Handler anhängen.

Sollte das auch noch nicht gehen, dann zeig (ein wenig) Code.

Stefan
--
"Programmieren ohne Doku ist wie Musikantenstadel ohne Mute-Taste."
(Martin Vorlaender in dclpm)
Manfred Dings
vor 20 Jahren
Permalink
On Thu, 17 Nov 2005 15:25:49 +0100, "Stefan M. Huber"
Post by Stefan M. Huber
bevor das Control davon erfährt. Und das bedeutet, du kannst einen
OnKeyPress-Handler anhängen.
Das habe ich ja - versuchsweise - getan, wie ich in meinem
ursprünglichen Posting schrieb. Mit dem Erfolg, daß alle Tastencodes
dort abgefangen wurden, nur VK_ESCAPE nicht. Das ist das merkwürdige.

Und noch merkwürdiger ist, daß exakt der gleiche Code mit Delphi 2
compiliert noch funktionierte.

Ich hatte natürlich den Verdacht, daß irgendeine Komponente des
Formulars VK_EXCAPE abfängt. Daraufhin habe ich das gesamte Formular
leergeräumt, bis auf die beiden Buttons (inclusive der zugehörigen
Routinen natürlich), welche das Formular schließen (mit mrOK und
mrCancel).

Trotzdem das gleiche Verhalten.

Ich grüble darüber, wo hier der Unterschied zw. D2 und D5 versteckt
sein könnte.

MD
--
http://virtualskysoft.de
Stefan M. Huber
vor 20 Jahren
Permalink
...
Das habe ich nicht beschrieben (und ich weiß, dass du das auch nicht
beschrieben hast, du scprachst von KeyDown): OnKeyPress != OnKeyDown/Up.
Wenns nur um das Esc geht, kannst du in TForm.KeyPress eben
if Key = #27 then Close
verwenden.

Oder versteh ich was anderes nicht an deinem Problem?

Stefan
--
"Programmieren ohne Doku ist wie Musikantenstadel ohne Mute-Taste."
(Martin Vorlaender in dclpm)
Manfred Dings
vor 20 Jahren
Permalink
On Thu, 17 Nov 2005 18:48:34 +0100, "Stefan M. Huber"
Post by Stefan M. Huber
Wenns nur um das Esc geht, kannst du in TForm.KeyPress eben
if Key = #27 then Close
verwenden.
Weder OnKeyPress noch OnKeyDown reagiert bei mir auf die ESC-Taste
(auf die anderen schon, wie der Debugger zeigt). Dies gilt für D2 und
D5.

So, nun schließt das nichtmodale Formular aber mit ESC, wenn ich es
unter D2 kompiliere. Das gleiche unter D5 kompliliert und es schließt
*nicht*.

Diese Diskrepanz ist es, die ich nicht verstehe.

Die fragliche Schaltfläche ist so deklariert:
object Abbruch: TButton
Left = 350
Top = 387
Width = 60
Height = 26
HelpContext = 155
Cancel = True
Caption = 'Abbrechen'
Font.Color = clBlack
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
ModalResult = 2
ParentFont = False
TabOrder = 7
OnClick = AbbruchClick
end

Und das dazugehörige OnClick so:

procedure TPlform.AbbruchClick(Sender: TObject);
begin
eingabefehler:=false;
{in OnCloseQuery heißt es dazu: CanClose:=not eingabefehler}
close
end;

Nochmal: Kompiliert unter D2 führt ESC dazu, daß AbbruchClick
angesprungen wird. Kompiliert unter D5 wird die Routine nur erreicht,
wenn die Schaltfläche gedrückt oder geklickt wird. Der Code ist
absolut der gleiche. Merkwürdig.

MD
--
http://virtualskysoft.de
Stefan M. Huber
vor 20 Jahren
Permalink
Post by Manfred Dings
On Thu, 17 Nov 2005 18:48:34 +0100, "Stefan M. Huber"
Post by Stefan M. Huber
Wenns nur um das Esc geht, kannst du in TForm.KeyPress eben
if Key = #27 then Close
verwenden.
Weder OnKeyPress noch OnKeyDown reagiert bei mir auf die ESC-Taste
(auf die anderen schon, wie der Debugger zeigt). Dies gilt für D2 und
D5.
So, nun schließt das nichtmodale Formular aber mit ESC, wenn ich es
unter D2 kompiliere. Das gleiche unter D5 kompliliert und es schließt
*nicht*.
Geht bei mir (D5 mit Updatepack 1 und ADO Updates, Englisch).
* Neue Anwendung
* Aufs Form einen TButton
* Button.Cancel := true
* Button.OnClick = begin Close; end;
* Kompilieren, Esc => Programm zu

Stefan
--
"Programmieren ohne Doku ist wie Musikantenstadel ohne Mute-Taste."
(Martin Vorlaender in dclpm)
Hans-Joachim Weber
vor 20 Jahren
Permalink
Hi,
Post by Manfred Dings
Ich verwende ein Formular mit u. a. einer Cancel-Schalftläche
(property cancel=true) als nicht-moldalen Dialog.
Unter D2 ließ sich dieses Formular mit der ESC-Taste schließen. Unter
D5 funktioniert dies nicht mehr, besser gesagt: nur dann, wenn ich das
Formular modal anzeigen lasse.
Unter D5 funktioniert das auch, wenn dem Button eine OnClick-Methode
zugeordnet ist, die das Fenster schließt.
(Esc schließt kein Fenster, löst nur das Click-Event aus).

Gruß, Jochen.
--
Nicht ärgern, nur wundern
Manfred Dings
vor 20 Jahren
Permalink
On Thu, 17 Nov 2005 16:03:20 +0100, "Hans-Joachim Weber"
Post by Hans-Joachim Weber
Unter D5 funktioniert das auch, wenn dem Button eine OnClick-Methode
zugeordnet ist, die das Fenster schließt.
Das ist schon klar. Mein Problem besteht ja darin, daß alles unter D2
noch funktionierte. Unter D5 wird jedoch eben diese Methode nur noch
aufgerufen, wenn man die Schaltfläche *explizit* betätigt. ESC reicht
nicht aus.

Und ESC wird auch nicht an eine OnKeyDown - Methode weitergereicht,
die ich versuchsweise eingefügt hatte (alle anderen Tasten schon).

Rätselnd,
MD
--
http://virtualskysoft.de
Hans-Joachim Weber
vor 20 Jahren
Permalink
Hi,
Post by Manfred Dings
Und ESC wird auch nicht an eine OnKeyDown - Methode weitergereicht,
die ich versuchsweise eingefügt hatte (alle anderen Tasten schon).
Bei meinem D7 habe ich kein Problem, den ESC-Code zu empfangen.
Ich wage zu behaupten, dass dies bei D5 nicht anders wäre.

Hast Du das gleiche Problem auch in einem neuen Projekt, bestehend nur
aus so einem "Escape"-Button?

Wenn ja, dann
Post by Manfred Dings
Rätselnd,
Jochen.
--
Nicht ärgern, nur wundern
Manfred Dings
vor 20 Jahren
Permalink
On Thu, 17 Nov 2005 19:58:52 +0100, "Hans-Joachim Weber"
Post by Hans-Joachim Weber
Hast Du das gleiche Problem auch in einem neuen Projekt, bestehend nur
aus so einem "Escape"-Button?
Nein, dann funktioniert alles.

Ich frage mich, ob bei einenem nichtmodalen Fenster das
"darunterliegende" Hauptfenster möglicherweise dazwischenfunkt. In
diesem Fall ist es im D5 Projekt ein MDI-Fenster, im D2 Projekt
allerdings nicht.

MD
--
http://virtualskysoft.de
Stefan M. Huber
vor 20 Jahren
Permalink
Post by Manfred Dings
On Thu, 17 Nov 2005 19:58:52 +0100, "Hans-Joachim Weber"
Post by Hans-Joachim Weber
Hast Du das gleiche Problem auch in einem neuen Projekt, bestehend nur
aus so einem "Escape"-Button?
Nein, dann funktioniert alles.
Ich frage mich, ob bei einenem nichtmodalen Fenster das
"darunterliegende" Hauptfenster möglicherweise dazwischenfunkt. In
diesem Fall ist es im D5 Projekt ein MDI-Fenster, im D2 Projekt
allerdings nicht.
Zusatz zu meiner anderen Antwort: Ich hab ein Form2 dazugetan, mit
demselben Aufbau. In Form1.Button.OnClick mach ich ein Form2.Show.

Resultat: Form2 macht sich zu, mit einem Klick auf Esc.

Kannst du mal einen minimalen Testcase bauen und das Projekt wo hochladen?

Stefan
--
"Programmieren ohne Doku ist wie Musikantenstadel ohne Mute-Taste."
(Martin Vorlaender in dclpm)
Manfred Dings
vor 20 Jahren
Permalink
On Thu, 17 Nov 2005 22:00:15 +0100, "Stefan M. Huber"
Post by Stefan M. Huber
Kannst du mal einen minimalen Testcase bauen und das Projekt wo hochladen?
Ich bin jetzt auf die glorreiche Idee gekommen, das fragliche Formular
unter einem jungfräulichen Hauptfenster laufenzulassen. Siehe da: nun
funktioniert alles.

Mit anderen Worten: das (MDI-) Hauptfenster ist schuld, und das ist
nun leider ein zu weites Feld, zumal dies das einzige Formular ist,
daß ich bei der Portierung von D2 nach D5 komplett neu erstellt habe.

Danke für alle Antworten,
MD
--
http://virtualskysoft.de
NineBerry Schwarz
vor 20 Jahren
Permalink
Hallo
Post by Manfred Dings
Ich bin jetzt auf die glorreiche Idee gekommen, das fragliche
Formular unter einem jungfräulichen Hauptfenster laufenzulassen.
Siehe da: nun funktioniert alles.
Mit anderen Worten: das (MDI-) Hauptfenster ist schuld, und das
ist nun leider ein zu weites Feld, zumal dies das einzige Formular
ist, daß ich bei der Portierung von D2 nach D5 komplett neu
erstellt habe.
Hast du dort Actions eingebaut? Falls ja, ist einer Action vielleicht
das Tastenkürzel "Esc" zugeordnet. Das ist meistens eine schlechte
Idee.

Neun
Manfred Dings
vor 20 Jahren
Permalink
On 18 Nov 2005 10:24:40 GMT, NineBerry Schwarz
Post by NineBerry Schwarz
Falls ja, ist einer Action vielleicht
das Tastenkürzel "Esc" zugeordnet. Das ist meistens eine schlechte
Idee.
Volltreffer... Danke vielmals.

//ESC während der Berechnung als Shortcut zulassen, sonst nicht
with ActStoppen do
if CalculationActive then shortcut:=TextToShortCut('Esc')
else shortcut:=TextToShortCut('');

schuf Abhilfe.

MD
--
http://virtualskysoft.de
NineBerry Schwarz
vor 20 Jahren
Permalink
Hallo
Post by Manfred Dings
//ESC während der Berechnung als Shortcut zulassen, sonst nicht
with ActStoppen do
if CalculationActive then shortcut:=TextToShortCut('Esc')
else shortcut:=TextToShortCut('');
with ist böse.
TextToShortCut ist sprachabhängig.

if CalculationActive then
begin
ActStoppen.Shortcut:= ShortCut(VK_ESCAPE, []);
end
else
begin
ActStoppen.ShortCut:= Classes.scNone;
end;

Neun
Manfred Dings
vor 20 Jahren
Permalink
On 18 Nov 2005 12:44:40 GMT, NineBerry Schwarz
Post by NineBerry Schwarz
with ist böse.
Inwiefern? Weil es, wenn mehrfach geschachtelt, unübersichtlich und
damit fehleranfällig werden kann?

In irgendeinem Uralt-Handbuch (ich glaube D1) las ich mal, daß Code
mit with zumeist in effizienteren Maschinencode compiliert würde als
myrecord.x:=..., myrecord.y:= ... usw. Seitdem habe ich mir diese
Schreibweise angewöhnt.
Post by NineBerry Schwarz
TextToShortCut ist sprachabhängig.
[...]

Danke für den Tip und den Codeschnipsel

MD
--
http://virtualskysoft.de
Stefan M. Huber
vor 20 Jahren
Permalink
Post by Manfred Dings
On 18 Nov 2005 12:44:40 GMT, NineBerry Schwarz
Post by NineBerry Schwarz
with ist böse.
Inwiefern? Weil es, wenn mehrfach geschachtelt, unübersichtlich und
damit fehleranfällig werden kann?
Genau. Mir ist schon passiert, dass ich ein Property verwendet hab, dass
es in der mit with referenzierten Variable nicht gab, dafür aber im
übergeordneten Objekt. Unbemerkt auf lange Zeit und nur seltsame
Phänomene. Darauf kann ich gern verzichten.

Mit VB-Syntax passiererte das nicht, da muss man trotz with einen Punkt
machen, um das Objekt zu meinen. zB ginge dann (Pseudocode)

with Dings do
begin
.Left := 100; // bezieht sich auf Dings
Left := 200; // bezieht sich auf was auch immer den Code beinhaltet
end

Damit gäbe es keine Ambiguitäten und dennoch wären optimalere Codes (wenn
das stimmt) und leichtere Lesbarkeit gewärleistet.

Stefan
--
while (!asleep()) sheep++;
NineBerry Schwarz
vor 20 Jahren
Permalink
Hallo
Post by Manfred Dings
Wieso läuft das unter D2 anders, und: gibt es eine Möglichkeit, den
Dialog auch in D5 nichtmodal mit ESC zu beenden?
Schreibe eine Ereignisbehandlungsroutine für den Button und rufe dort
die Close-Methode des Formulars auf.

Neun
Loading...