Delphi-PRAXiS
Seite 1 von 3  1 23      

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 Key wird nicht gelöscht, warum? (https://www.delphipraxis.net/195064-key-wird-nicht-geloescht-warum.html)

Fukiszo 30. Jan 2018 11:44

Key wird nicht gelöscht, warum?
 
Hallo, hier mein Aufruf

Delphi-Quellcode:
procedure TForm1.Button1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 case key of
  Windows.VK_SPACE : ZeigeWas;
  Windows.VK_RETURN: ; // <- hier soll nichts passieren, tastendruck übersprungen werden, aber "ZeigeWas" wird ausgelöst
  Windows.VK_ESCAPE: Application.Terminate;
 end;
 Key := 0; // <- ich dachte das hier macht exakt das (key puffer leeren)
 //Application.ProcessMessages;
end;
Also ich reagiere auf einen Knopf und werte Tastenanschläge aus, ist evtl. KeyDown event falsch dafür?
Sinn und Zweck soll sein, bei gedrückter Eingabe-Taste soll nichts passieren/ausgelöst werden.

Für einen kleinen Anstoss in die richtige Richtung wäre ich dankbar,

Grüße

TiGü 30. Jan 2018 11:55

AW: Key wird nicht gelöscht, warum?
 
Mal testweise in KeyUp reingehangen?

Der schöne Günther 30. Jan 2018 11:58

AW: Key wird nicht gelöscht, warum?
 
Du muss das schon mit richtig mit dem Debugger machen. Deine Beobachtung "Meine Prozedur zweigewas() wird ausgelöst" kommt wohl eher daher dass du dein
Delphi-Quellcode:
OnClick
auch damit belegt hast, oder?

Denn das OnKeyDown-Event wird bei einem Druck auf Return überhaupt nicht ausgelöst, das sieht man eigentlich im Debugger.

Fukiszo 30. Jan 2018 12:09

AW: Key wird nicht gelöscht, warum?
 
@Der schöne Günther: Genau
@TiGü: noch nicht probiert, mach ich gleich mal

OnClick und VK.Space sollen beide "ZeigeWas" aufrufen,
im OnClick steht nur "ZeigeWas" aber ich will halt das "VK.Return" da raus haben,
deswegen das KeyDown Event.
Eine Idee wie ich das anstellen kann?

Grüße

LTE5 30. Jan 2018 12:12

AW: Key wird nicht gelöscht, warum?
 
Das hört sich für mich stark so an, als ob du verzweifelt nach einer Lösung suchst und nur deswegen das KeyDown versuchst zu nutzen.

Wäre es vielleicht nicht sogar das Beste, das nochmal neu zu machen?

himitsu 30. Jan 2018 12:16

AW: Key wird nicht gelöscht, warum?
 
OnKeyDown
OnKeyPres
OnKeyUp

Nicht alle Tastenevents werden an gleicher Stelle behandelt.
Manches wird beim Drücken ausgelöst (inkl. Key-Repeat-Calls) und manches erst beim Loslassen.

Buttons z.B. :
per Tastatur [ENTER] beim Drücken,
das [Space] beim Loslassen,
deren ShortCuts/HotKeys beim Drücken
und per Maus auch erst beim Loslassen.

Die SpeedButtons in ScrollBars und beim UpDownButtons reagieren dagegen wieder auf's Drücken, mit RepeatTimer und stoppen beim Loslassen.


Wir hatten z.B. ein Fenster im Programm, das ging bei F2-KeyDown zu, aber im übergeordneten Fenster wird es beim beim F2-KeyUp geöffnet, also beim Schließen via F2 wurde es sofort wieder geöffnet. :wall:


Aber wieso soll "ein" Knopf verschiedene Funktionen haben?
ein Button mit Cancel=True reagiert auf ESC
und ein anderer Button mit Default=True auf das Enter.
Bei ESC immer. Bei ENTER nur wenn die Knöpfe keinen Fokus haben, ansonsten macht bei Enter/Space jeder Button das, wofür er da ist.

Fukiszo 30. Jan 2018 12:17

AW: Key wird nicht gelöscht, warum?
 
Ja klar, Event ist nur dafür da das VK.Return zu unterbinden/abzufangen.
Wenn ich's neu mach, käm ich doch wieder bei einem Key-Event raus?
Ich verstehe bestimmt wiedermal nicht wie ich's anders als mit einem Key-Event zu lösen wäre damit:
- OnClick > ZeigeWas
- Vk.Space > ZeigeWas
- Vk.Return > überspringen
als endresultat rauskommt.

Grüße


Delphi-Quellcode:
per Tastatur [ENTER] beim Drücken
also KeyDown event scheint das richtige zu sein, oder versteh ich's falsch?

Der schöne Günther 30. Jan 2018 12:21

AW: Key wird nicht gelöscht, warum?
 
Zitat:

Zitat von Fukiszo (Beitrag 1392543)
- OnClick > ZeigeWas
- Vk.Space > ZeigeWas
- Vk.Return > überspringen

Ich will dich ja nicht zwanghaft konvertieren, aber warum sollte man das tun? Mach es doch einfach so wie sich jede Standard-Windows-Anwendung auch verhält: Buttons lassen sich mit Maus/Touch/Stift drücken und (wenn er den Fokus hat) mit der Tastatur über Enter/Return/Space. Da reicht ein einfaches
Delphi-Quellcode:
OnClick
.

Escape hat dir himitsu weiter oben schon erklärt wie man das eigentlich "richtig" macht.

himitsu 30. Jan 2018 12:25

AW: Key wird nicht gelöscht, warum?
 
Enter/Space lösen OnClick aus.

Also einfach nur das ENTER blocken und den Rest durchlassen.



Aber IMHO ist es eher unglücklich, wenn "Standard"-Komponenten vom standardmäßigen Verhalten des OS abweichen.

himitsu 30. Jan 2018 12:28

AW: Key wird nicht gelöscht, warum?
 
Hatte meinen Text da oben noch etwas ergänzt.

Zitat:

Zitat von Fukiszo (Beitrag 1392543)
Delphi-Quellcode:
per Tastatur [ENTER] beim Drücken
also KeyDown event scheint das richtige zu sein, oder versteh ich's falsch?

Da kommt es dann darauf an, wo/wie das Standardverhalten der Komponente genau implementiert ist
und vorallem ob es vor oder nach dem KeyPress-Event behandelt wird.

Theoretisch wäre KeyDown schon richtig, um das ENTER abzufangen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 Uhr.
Seite 1 von 3  1 23      

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