Drücken der Taste "G" abfangen - Wie?



  • Hallo Zusammen,
    ich möchte gerne, dass wenn ein User die Taste "G" drückt etwas ausgeführt wird. Hier im Forum habe ich den Link zu den Keycodes gefunden http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/virtualkeycodes.asp

    Dort steht bei "G" (47). Ich habe es jetzt folgendermaßen probiert:

    void __fastcall Tartikel_bearbeiten::FormKeyPress(TObject *Sender,
          char &Key)
    {
    if (Key == 47)
    {
        letztes_ereignis("Return gedrückt", "grün");
    }    
    }
    

    Wenn ich es so habe, passiert beim drücken von "G" überhaupt nichts.

    Ich habes es auch schon mit "Key == VK_G" probiert. Dann kommt, dass er "VK_G" nicht kennt.

    Für Hilfe, danke im voraus.



  • Das Zeichen 'G' hat laut ASCII-Tabelle den Hexwert 47 also 0x47, bzw den Dezimalwert 71. Hierbei ist aber nur das großgeschriebene 'G' gemeint.
    Das kleine 'g' hat hex 0x67 (dez 103).
    Du musst das also so machen:

    if ((Key == 0x47) || (Key == 0x67)
    {
    letztes_ereignis("Return gedrückt", "grün");
    }
    }

    oder alternativ ginge auch:

    if((Key == 'g') || (Key == 'G'))
    ...



  • ich glaube kaum dass G == 47 ist
    die 47 ist Hexadezimal also solltest du das auch so verwenden

    if (Key == 0x47) ...
    

    [Edit] zu langsam...



  • hehe, da war ich wohl schneller 😃



  • Ok, danke schön. Das klappt.

    Jetzt habe ich aber ein Problem. Auf dem Form habe ich mehrere EditFelder und "KeyPreview = true". Wenn jetzt jemand im TEdit Feld ein "g" eingibt wird das "g" geschrieben. Allerdings wird auch die Key-Abfrage ausgeführt.

    Kann ich die eingaben im Edit-Feld umgehen?



  • Du kannst z.B. mit dem Focus arbeiten.
    Also die Aktion nur dann ausführen, wenn 'g' gedrückt wurde und der Focus
    auf der Hauptform (oder eben nicht auf einem der Textfelder) liegt.



  • In OnKeyPress Event des Editfeldes

    Key=0

    setzen



  • @Christian411
    Das funktioniert leider nicht. Wenn ich im Edit Feld 'g' drücke wird trotzdem die Key-Abfrage ausgeführt

    @GIll Bates
    Wie genau kann ich denn rausfinden, ob das Forum den Focus hat?
    Ich habe es mal so probiert:

    if(artikel_bearbeiten->Focused() == true)
    

    Das funktioniert leider nicht.



  • Tja, überall woanders funktionert es halt -> Sicherlich wird die Abfrage durchgeführt, aber das G sollte nicht mehr im Editfeld stehen (und darauf bezog sich deine Frage)-> wenn doch hast du was falsch gemacht



  • Sorry, dann habe ich mich falsch ausgedrückt. Ich möchte, dass wenn man im Edit-Feld was eingibt die Key-Abfrage nicht ausgeführt wird.

    Also das im Edit-Feld der eingegebene Text erscheint.



  • a) Dann versuch im OnEnter des Editfeldes KeyPreview=false und im OnExit wieder auf true

    b) Setze im OnEnter eine globale boolsche Variable auf true, die du in deinem Keyevent erst prüfst. Im OnExit wieder auf false



  • also du willst G drücken und in einem eingabefeld soll dann der text erscheinen ? Welcher Text soll denn erscheinen ? Einer aus dem Clipboard oder ner member Variablen ?



  • Firefighter2000 schrieb:

    also du willst G drücken und in einem eingabefeld soll dann der text erscheinen ? Welcher Text soll denn erscheinen ? Einer aus dem Clipboard oder ner member Variablen ?

    hast du den Thread gelesen?



  • Hi Leute !

    Wollt hier nicht noch extra nen Thema für aufmachen ...

    Ist es möglich Befehle (Tasten) direkt an eine Komponente zu senden ?
    Denn ich hab hier eine Terminalkomponente und die akzeptiert meine Tastenkombinationen nur wenn sie im Fokus ist ... nun die spannende frage ob es auch möglich ist eine Kombination von Tasten an diese Komponente zu senden wenn sie, sagen wir mal, nicht sichtbar ist.

    Danke
    -TheGeek-



  • SendMessage mit WM_KEYDOWN



  • danke für den denkanstoß Christian411 ...

    Habe gleich mal die Suche bemüht und bin auf einen Beitrag von dir gestoßen ... jedoch kann ich aus diesem nicht ganz ableiten wie man denn nun ein Tastendruck an eine Komponente schickt. (dort ging es um Farben im Checkbox Dialog) Nett wäre wenn du ein Beispiel Parat hättest um mir den Vorgang noch etwas zu erläutern.

    Denn ich hänge hier:

    SendMessage(VaTerminal1->Handle,WM_KEYDOWN,?,?);
    

    Thx
    TheGeek



  • Hallo

    Dort muß die zu sendende Taste als char rein.
    Alternativ siehe hier

    bis bald
    akari



  • ahh siehe da ein einfaches suchen bei google half mir.

    denn es klappte mit:

    PostMessage(VaTerminal1->Handle,WM_KEYDOWN,0x4D,0);
    

    Danke für die Hilfe ! 😃

    --------------- EDIT ---------------

    ähhm wie kann man mit PostMessage die "Strg" taste gedrückt halten ? Um kombinationen wie zb Strg+C oder ähnliches zu erzeugen.
    Leider klappt

    PostMessage(VaTerminal1->Handle,WM_KEYDOWN,0x10,0);
    

    nicht 😕

    --------------- EDIT ---------------

    Okay falsch gegugt hab nach dem suchen doch was passendes gefunden.
    Mit

    PostMessage(VaTerminal1->Handle,WM_KEYDOWN,0x03,0);
    

    geht's wunderbar.

    Eine kurze Erklärung zu Steuerzeichen und CTRL Sequenzen.
    Zu Beginn des Computerzeitalters waren Terminals per serieller Schnittstelle an den Rechner angebunden. Wenn man Steuerzeichen senden wollte ( also Zeichen, die nicht auf der Tastatur waren, teilte man dem System das mit der Taste Control mit). So nun lange Rede kurzer Sinn:
    CTRL + A = 1
    CTRL + C stellt den ASCII Wert 3 da
    Deswegen kann man dann mit CTRL+J (10)auch einen "Wagenrücklauf" auslösen und mit CTRL + M (13) eine Zeilenumbruch.



  • Christian411 schrieb:

    a) Dann versuch im OnEnter des Editfeldes KeyPreview=false und im OnExit wieder auf true

    b) Setze im OnEnter eine globale boolsche Variable auf true, die du in deinem Keyevent erst prüfst. Im OnExit wieder auf false

    Danke Christian411. Variante a funktioniert sehr gut. Jetzt habe ich dazu aber noch eine Frage:

    - Ich habe auf meinem Form mehrere Edit Felder. Kann ich den Wert für OnEnter und OnExit für alle auf einmal setzen? Z.B. beim Creat oder Active?

    Danke im voraus.



  • Weiss jetzt nicht was du meinst


Anmelden zum Antworten