Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Button KeyDown + ShortCut


Fienix - Do 07.07.16 11:32
Titel: Button KeyDown + ShortCut
ich habe heute ein etwas merkwürdiges Verhalten festgestellt:

ich habe einen Button_1 mit einem KeyDown-Ereignis.
eine weiter Button_2 für eine Auswahl mit der Caption "&Auswahl"

wenn der Button_1 den Focus hat und ich dort eine "a" oder "A" eintrage wird der Button_2 ausgelöst.

weiß jemand wie ich das umgehen kann?


Delete - Do 07.07.16 13:26

- Nachträglich durch die Entwickler-Ecke gelöscht -


Fienix - Do 07.07.16 13:58

hi,

das kann nicht sein! :shock:
wenn ich ein Memo beschreibe dann werden ja auch nicht alle Buttons mit dem jeweiligen Präfix ausgelöst.
Dazu muss ich doch ALT+....(Präfix) drücken.


Delete - Do 07.07.16 14:07

- Nachträglich durch die Entwickler-Ecke gelöscht -


Fienix - Do 07.07.16 14:17

du meintest
Zitat:
so ist es vollkommen egal, welches Control den Fokus im Moment hat.
:P

das Problem besteht noch, es geht eben darum das der Button_1 den Focus hat und Daten über einen Barcode-Scanner (Tastatur) empfangen werden.
wenn ein Buchstabe gescannt wird der den entprechenden Short-Cut von Button_2 hat, geht ein anderes Fenster auf.

aber die ShortCut werden doch nur mit ALT +... ausgelöst.


Delete - Do 07.07.16 14:35

- Nachträglich durch die Entwickler-Ecke gelöscht -


Fienix - Do 07.07.16 14:56

die beiden Buttons haben dasselbe parent,
Button_1 hat den Focus, solange ich Buchstaben tippe die nicht in den ShortCuts verwendet werden ist alles gut.

wenn ich in einem anderen Control rumtippe, TEdit, TMemo, etc. funktioniert es.
hab auch schon versucht den Button zu ändern -> TButton, TBitBtn,
immer wird der Button mit dem ShortCut aktiviert :?!?:


Delete - Do 07.07.16 15:04

- Nachträglich durch die Entwickler-Ecke gelöscht -


Fienix - Do 07.07.16 15:14

nein, der ShortCut ist nur einmal vergeben.

aber das wär ja auch egal, ich will gar keinen ShortCut verwenden.


Delete - Do 07.07.16 15:16

- Nachträglich durch die Entwickler-Ecke gelöscht -


Fienix - Do 07.07.16 15:56

Zitat:
ich habe einen Button_1 mit einem KeyDown-Ereignis.
eine weiter Button_2 für eine Auswahl mit der Caption "&Auswahl"

wenn der Button_1 den Focus hat und ich dort eine "a" oder "A" eintrage wird der Button_2 ausgelöst.


der Button_2 mit dem ShortCut wird ausgelöst, aber ich tippe nur auf den Buchstaben rum während Button_1 den Focus hat, ohne ALT zu drücken.

ich hoffe es ist verständlich.


Delete - Do 07.07.16 18:43

- Nachträglich durch die Entwickler-Ecke gelöscht -


jasocul - Fr 08.07.16 08:29

Du könntest dir sowas konstruieren (ungeprüft):

Delphi-Quelltext
1:
2:
3:
4:
  if Button_1 <> ActiveControl then
  begin
    // DoSomething;
  end;

Ob das KeyDown-Event dann aber noch ausgelöst wird, weiß ich. Das könntest du dann aber gegebenenfalls manuell auslösen.


Fienix - Fr 08.07.16 14:37

@Frühlingsrolle: genau das ist mein Problem und da gibt es keine Möglichkeit das zu umgehen, evtl mit ner eigenen Komponente?

@jasocul: das löst das Problem nicht, der Shortcut wird trotzdem ausgeführt


Delete - Fr 08.07.16 15:23

- Nachträglich durch die Entwickler-Ecke gelöscht -


Fienix - Mo 11.07.16 12:22

der Focus steht auf dem Button, ich scanne jetzt die Daten und im Barcode ist ein "A",

jetzt wird die Schaltfläche mit dem Shortcut "A" ausgeführt und das will ich nicht


Nersgatt - Mo 11.07.16 13:09

Als schnelle Lösung kannst Du ja abfragen, was grade das aktive Control ist (im ButtonClick).
Also so:


Delphi-Quelltext
1:
2:
3:
4:
if Self.ActiveControl = Sender then
begin

... und hier erst den eigentlichen Code des Buttons ausführen


Fienix - Mo 11.07.16 13:39

genau sowas bringt mir nichts, die Bedingung ist ja immer TRUE


Nersgatt - Mo 11.07.16 13:41

Hast Du es ausprobiert? Bei mir funktioniert das so, da der Button mit der &A-Caption nicht den Fokus erhält.


Fienix - Mo 11.07.16 13:45

aber dann funktionieren die ShortCuts nicht mehr


Nersgatt - Mo 11.07.16 13:53

Ok, das stimmt natürlich.

Dann schau mal im Handbuch des Scanners nach. Normalerweise kann man ihn so einstellen, dass er zu Beginn und zum Ende des Barcodes eine bestimmte Sequenz schickt (irgend ein besonderes Zeichen). Das fängst Du im KeyDown des Formulars ab und setzt eine Boolsche Variable auf True, damit Du weißt, dass grade ein Barcode "getippt" wird. Am Ende des Barcodes wieder auf False setzen.
Diese Boolsche Variable kannst Du im ButtonClick abfragen.

(wegen diesen Klimmzügen mag ich übrigens keine Tastaturscanner und verwende ausschließlich Scanner, die am COM-Port angeschlossen werden bzw. am USB und sich als virtuelle COM-Port melden.)


Delete - Mo 11.07.16 19:30

- Nachträglich durch die Entwickler-Ecke gelöscht -