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