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



  • @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



  • Also ich habe z.B. ein Formular mit 13 Edit Felder. Muß ich bei denen deine Variante a von Hand einstellen, oder ich ich das bei Create/Activate des Forms automatisch anlegen?



  • Wenn das alles statische Edits sind, kannst Du die alle gleichzeitig markieren und die gewünschten Ereignismethoden zuweisen.
    Oder aber tatsächlich für die Edits im Konstrukor des Forms die Methoden zuweisen.



  • Hallo

    ich vermute EPMS will für alle seine Edits solche OnEnter/OnLeave-Überprüfungen.

    Nimm statt dem bool-Member (bitte keine globale Variable!) einen Pointer auf TComponent, wo du statt true/false immer den Sender des letzten Aufrufs bzw NULL einträgst, so kannst du nicht nur später vergleichen ob ein Control gerade im OnEnter war, sondern auch welches.

    bis bald
    akari



  • Genau akari. Das meinte ich.

    Allerdings ist mir dein Vorschlag noch etwas zu hoch. 😃
    Mit Pointer habe ich mich noch nicht wirklich beschäftigt. Kannst du mir da einen Tipp geben, wie genau ich deinen Vorschlag realisieren kann?



  • Hallo

    Form-Header

    ...
    privte :
      TObject* lastenter; // anstatt einfachem bool hinzufügen
    public :
    

    Form-Implementation

    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner), lastenter(0) // Member initialisieren
    
    // Diese beiden Eventmethoden jedem betreffendem Edit zuweisen
    void __fastcall TForm1::EditEnter(TObject* Sender)
    {
      lastenter = Sender;
    }
    
    void __fastcall TForm1::EditExit(TObject* Sender)
    {
      lastenter = NULL;
    }
    

    jetzt kannst du an jeder belibigen Stelle deines Forms mit

    if (lastenter == Edit1)
    

    bis bald
    akari
    überprüfen, ob Edit1 gerade fokusiert ist



  • @akari
    Danke schön für die Hilfe. Werde das ausprobieren.

    Habe nochmal eine kleine Frage, die nicht unbedingt zu dem Thema gehört. Vielleicht kann mir die ja jemand schnell beantworten.

    Wenn ich z.b. bei einem Button das OnClick Ereigniss defeniert habe steht es ja in diesem Bereich:

    void __fastcall Tartikel_bearbeiten::Button2Click(TObject *Sender)
    

    Kann ich von woanders im Programm diese OnClick Funktion auch aufrufen? Wenn ja, wie mache ich das?

    Gruß



  • Das geht theoretisch schon.

    artikel_bearbeiten->Button2Click(Sender);
    

    Was da nun in Sender reinkommen soll hängt davon ab, wo du diese Funktion aufrufen willst.
    Ich würde aber davon abraten, das so zu machen. Besser ist es, du definierst eine eigene Funktion, die das ausführt was du in der ButtonClick-Funktion machen willst und rufst die dann auf.


Anmelden zum Antworten