обработка клавиатурного события в потомке TWinControl
Создаю компонент (в конечном итоге потомок TWinControl). Он представляет из себя поле с графическими объектами(многоугольники).Их можно выделять мышой. Хотелось бы по нажатию клавиш- стрелок менять выделение. Для этого делаю обработчик OnKeyDown публичным и вношу в него соответствующий код.
Но в рантайме по нажатию клавиш-стрелок мой компонент теряет фокус; фокус переходит на другие компоненты на форме и гуляет по ним...
Подскажите, пожалуйста - буду весьма признателен....
Код бы увидеть...
кода довольно много и отношения к вопросу он не имеет...дело в том, что компонент теряет фокус вместо того, чтобы обрабатывать событие и мне это странно. Скорее всего, я где-то ошибся в теории, но где - не могу понять...
Неужели все оттого, что я порождаю компонент от TPanel?
Цитата: Babandr
Сначала вкратце задача...
Создаю компонент (в конечном итоге потомок TWinControl). Он представляет из себя поле с графическими объектами(многоугольники).Их можно выделять мышой. Хотелось бы по нажатию клавиш- стрелок менять выделение. Для этого делаю обработчик OnKeyDown публичным и вношу в него соответствующий код.
Но в рантайме по нажатию клавиш-стрелок мой компонент теряет фокус; фокус переходит на другие компоненты на форме и гуляет по ним...
Подскажите, пожалуйста - буду весьма признателен....
Создаю компонент (в конечном итоге потомок TWinControl). Он представляет из себя поле с графическими объектами(многоугольники).Их можно выделять мышой. Хотелось бы по нажатию клавиш- стрелок менять выделение. Для этого делаю обработчик OnKeyDown публичным и вношу в него соответствующий код.
Но в рантайме по нажатию клавиш-стрелок мой компонент теряет фокус; фокус переходит на другие компоненты на форме и гуляет по ним...
Подскажите, пожалуйста - буду весьма признателен....
Обычно переопределяют не событие, а метод его вызывающий т.е. в данном случае:
DYNAMIC void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
а чтобы не было отработки по умочанию (переход на др. контрол) надо в Key записать 0.
Цитата: GIZMO
Обычно переопределяют не событие, а метод его вызывающий т.е. в данном случае:
DYNAMIC void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
а чтобы не было отработки по умочанию (переход на др. контрол) надо в Key записать 0.
DYNAMIC void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
а чтобы не было отработки по умочанию (переход на др. контрол) надо в Key записать 0.
Вроде так и делаю... Вот код метода (упрощенный):
void __fastcall TRControl::KeyDown(Word &Key, Classes::TShiftState Shift)
{
if (!FLoaded) return;
if ( Shift.Contains(ssAlt))
{
if (Key==VK_LEFT) {SelectRoom(0);return;}
if (Key==VK_RIGHT) {SelectRoom(1);return;}
}
}
В этом случае (при нажатом Alt'e) уход фокуса не происходит, но и требуемое поведение не осуществляется...
И в голову ничего конструктивного не приходит. :(
+нашел: WM_GETDLGCODE обработать