Tworzę właśnie swój komponent, jednak pojawił mi się mały problem. Wszystkie właściwości dziedziczy od TCustomControl. Problem pojawia się przy obsłudze komunikatu WM_KEYDOWN. Otóż, gdy wciśniemy klawisz TAB lub którąkolwiek strzałkę, to komponent tego komunikatu nie otrzymuje (dostaje jedynie WM_KEYUP po zwolnieniu przycisku). Tak, czy inaczej, wciśnięcie któregokolwiek z tych klawiszy powoduje uaktywnienie następnego komponentu na formularzu, co zupełnie mija się z celem. TEdit - obiekt pochodzący z TWinControl (TCustomControl tez z niego pochodzi) ma w sobie pełną obsługę strzałek (nie powodują one przechodzenia do następnego komponentu). TRichEdit przechwytuje także TAB. W jaki sposób przekształcić komponent tak, by w pełni obsłużyć WM_KEYDOWN w przypadku strzałek i klawisza TAB? Czy ktoś może spotkał się już z tym problemem?
Ok, juz sobie poradzilem :)
Jak ktos spotka sie z tym samym problemem, to daje rozwiazanie:
w pliku naglowkowym
w sekcji protected:
void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
void __fastcall CMWantSpecialKey(TCMWantSpecialKey &Message);
i tuz przed "};"
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_WANTSPECIALKEY, TCMWantSpecialKey, CMWantSpecialKey)
END_MESSAGE_MAP(TCustomControl)
w pliku cpp
void __fastcall TMyControl::CMWantSpecialKey(TCMWantSpecialKey &Message)
{
if(Message.CharCode == VK_TAB)
TForm::Dispatch((void*)&Message);
else Message.Result = 1;
}
i teraz w funkcji
void __fastcall TMyControl::KeyDown(Word &Key, Classes::TShiftState Shift)
{
if (Key == VK_DOWN)
{
// mozemy juz obsluzyc strzaleczki :)
}
}
Jesli natomiast potrzebujemy rowniez obsluzyc TAB i Shift+TAB, to trzeba uzyc tej samej techniki, tylko w CMWantSpecialKeys musimy zwrocic Message.Result = 1 dla VK-TAB, wiec po prostu:
void __fastcall TMyControl::CMWantSpecialKey(TCMWantSpecialKey &Message)
{
Message.Result = 1;
}