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



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



  • Hallo

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

    Ein Thema ein Thread, ein Thread ein Thema. Also mach beim nächten Mal für neue Fragen einen neuen Thread auf

    aus einer Methode von Tartikel_bearbeiten heraus :

    Button2Click(0);
    // oder
    Button2Click(Button2);
    

    /Edit : ach bin ich langsam

    bis bald
    akari



  • Ich danke euch beiden.

    @akari
    Sorry für das Thema im Thema.



  • Joe_M. schrieb:

    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.

    Dann doch nochmal ich. 😃

    @Joe_M.
    Wie kann ich denn mehrere statische Edits gleichzeitig markieren? Habe es mal mit gedrückter STRG Taste probiert. Geht aber nicht.



  • Dann probier mal die Shift-Taste.



  • Hallo

    Wie kann ich denn mehrere statische Edits gleichzeitig markieren? Habe es mal mit gedrückter STRG Taste probiert. Geht aber nicht.

    Du must die SHIFT-Taste gedrückt halten.

    bis bald
    akari


Anmelden zum Antworten