Eigene Kompo mit Pfeiltasten-Events



  • Hallo erstmal

    Ich schreibe eine Komponente die heist TScrollDiagram und ist von TPanel abgeleitet. In diesem Scrolldiagram kann ich die normalen Tasten abfangen, aber bis jetzt noch nicht die Pfeiltasten. 😕
    Es ist aber notwendig das die Komponente die Tasten abfängt und nicht das Formular, auf das es dann irgendwann mal gezogen wird.

    Hier ein bisschen Code

    //*** ScrollDiagram.h
    
    __published:
            __property OnKeyPress;
            __property OnKeyDown;
    
            void __fastcall KeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
            void __fastcall CMDialogKey(TWMKey &AMsg);
    
    protected:
            BEGIN_MESSAGE_MAP
                    VCL_MESSAGE_HANDLER(CM_DIALOGKEY, TWMKey, CMDialogKey)
            END_MESSAGE_MAP(TPanel);
    

    Ich glaub das liegt an der letzten Zeile, aber
    END_MESSAGE_MAP(inherited); // bringt nix
    END_MESSAGE_MAP(TScrollPanel); // bringt Fehler (irgendwas mit Stackoverflow)
    damit komm ich auch nicht weiter

    //*** TScrollDiagram.cpp
    
    // KONSTRUKTOR
    __fastcall TScrollDiagram::TScrollDiagram(TComponent* Owner) : TPanel(Owner)
    {
        TForm *Formular = (TForm*)Owner;
        Formular->KeyPreview = true;
        Formular->ActiveControl = this;
        OnKeyDown = KeyDown;
        ...
    }
    
    //-- Das geht
    void __fastcall TScrollDiagram::KeyDown(TObject *Sender,
          WORD &Key, TShiftState Shift)
    {
            ShowMessage("Hi");
    }
    
    //-- Bis hierher komm ich nie
    void __fastcall TScrollDiagram::CMDialogKey(TWMKey &AMsg)
    {
     TPanel::Dispatch(&AMsg);
     switch(AMsg.CharCode)
      {
       case VK_DOWN : ShowMessage("VK_DOWN");break;
       case VK_UP : ShowMessage("VK_UP");break;
       case VK_TAB : ShowMessage("VK_TAB");break;
      }
    }
    

    Kann mir irgend jemand sagen was ich in dieses END_MESSAGE_MAP schreiben soll, oder gibts noch einen anderen Weg??



  • Hi,

    das bei END_MESSAGE_MAP ist schon ok.
    Warum setzt die KeyPreview auf true? Deien Control soll doch die Keys empfangen ?...
    Außerdem kannst du doch die cursortasten in Keydown ebenso checken... Oder hab ich was wichtiges überlesen 😉

    .



  • @Postman

    KeyPreview auf true, bedeutet das mein Form auf das ich die Kompo ziehe alle Tasten-Events zuerst bekommt.
    Aber dies tut nichts zur Sache, denn es ist egal ob KeyPreview = true || false ist.

    Und ob KeyDown oder KeyPress verwendet wird ist soweit ich weiß eigentlich auch egal, da ja alle anderen Tasten gehen, bis auf die, welche Windows nur auf Anfrage bereitstellt.
    siehe: [url]http://www.bcbdev.com/faqs/faq78.htm [/url]

    Und laut diesem Link muss man Windows erklären das man doch bitte die Pfeil-Tasten hätte.

    In meinem Testarea-Projekt (also nur einem Form) funktioniert es ja auch, aber nicht wenn die Kompo die Events für die Pfeile bekommen soll.

    das hilft mir leider auch nicht weiter
    Trotzdem danke



  • // im header
    protected:
    
      void __fastcall WMGetDlgCode(TMessage &Msg);
    
    public:
    
    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_GETDLGCODE, TMessage, WMGetDlgCode);
    END_MESSAGE_MAP(TCustomEdit)
    
    // in cpp
    void __fastcall TAlignEdit::WMGetDlgCode(TMessage &Msg)
    {
      // pfeiltasten sollen mit verarbeitet werden
      Msg.Result = DLGC_WANTARROWS;
    }
    

    jetzt kannst du im KeyPress die Pfeiltasten abfragen...



  • @Sunday

    Vielen Dank für den Brocken den du mir hingeworfen hast. Das hab ich gebraucht, aber manchmal sieht man vor lauter Events das Event nicht.

    Für alle die auch solche Probleme haben stell ich hier mal kurz die Lösung ins Netz. Da das Problem ja häufiger auftritt.

    //---------------------------------------------------------------------------  
    // MyKompo.h
    //---------------------------------------------------------------------------  
    #ifndef MyKompoH
    #define MyKompoH
    
    #include <vcl.h> //-- für TPanel
    
    class TMyKompo : public TPanel
    {
    public:
            __fastcall TMyKompo(TComponent* Owner);    // Konstruktor
            __fastcall ~TMyKompo();                    // Destruktor
    
    __published:
    
            __property OnKeyPress;
            __property OnKeyDown;
    
            void __fastcall KeyDown(TObject *Sender, WORD &Key,
              TShiftState Shift);
            void __fastcall WMGetDlgCode(TMessage &Msg);
    
    protected:
            BEGIN_MESSAGE_MAP
                    MESSAGE_HANDLER(WM_GETDLGCODE, TMessage, WMGetDlgCode);
            END_MESSAGE_MAP(TPanel)
    
    };
    
    #endif
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------  
    // MyKompo.cpp
    //---------------------------------------------------------------------------  
    #pragma hdrstop
    #include "MyKompo.h"
    
    //-- KONSTRUKTOR
    __fastcall TMyKompo::TMyKompo(TComponent* Owner): TPanel(Owner)
    {
            Parent = dynamic_cast<TForm*>(Owner);
            TForm *Formular = (TForm*)Owner;
            Color = clGreen;
            Align = alClient;
    
            // Formular->KeyPreview = true;
            Formular->ActiveControl = this;
            OnKeyDown = KeyDown; //-- Event zuweisen
    
    }
    
    //-- DESTRUKTOR
    __fastcall TMyKompo::~TMyKompo()
    {
    }
    
    //-- Message Handler
    void __fastcall TMyKompo::KeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
            if (Key == VK_RIGHT)
            {
                    ShowMessage ("Rechts");
            }
            else
            {
                    ShowMessage ("Nix");
            }
    }
    
    //-- Windows bescheid sagen
    void __fastcall TMyKompo::WMGetDlgCode(TMessage &Msg)
    {
            // pfeiltasten sollen mit verarbeitet werden
            Msg.Result = DLGC_WANTARROWS;
    }
    
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------  
    // und nun noch in das Form
    //---------------------------------------------------------------------------  
    TMyKompo *MeineKompo;
    MeineKompo = new TMyKompo(this); 
    // und etwas später
    delete MeineKompo;
    MeineKompo = 0;
    // der Ordnung halber
    

    Danke an alle die geholfen haben 🙂


Anmelden zum Antworten