Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

обработка клавиатурного события в потомке TWinControl

11K
05 мая 2008 года
Babandr
76 / / 05.05.2008
Сначала вкратце задача...
Создаю компонент (в конечном итоге потомок TWinControl). Он представляет из себя поле с графическими объектами(многоугольники).Их можно выделять мышой. Хотелось бы по нажатию клавиш- стрелок менять выделение. Для этого делаю обработчик OnKeyDown публичным и вношу в него соответствующий код.
Но в рантайме по нажатию клавиш-стрелок мой компонент теряет фокус; фокус переходит на другие компоненты на форме и гуляет по ним...
Подскажите, пожалуйста - буду весьма признателен....
8.8K
05 мая 2008 года
Se AD WMD
165 / / 10.01.2007
Код бы увидеть...
11K
05 мая 2008 года
Babandr
76 / / 05.05.2008
ох...
кода довольно много и отношения к вопросу он не имеет...дело в том, что компонент теряет фокус вместо того, чтобы обрабатывать событие и мне это странно. Скорее всего, я где-то ошибся в теории, но где - не могу понять...
Неужели все оттого, что я порождаю компонент от TPanel?
246
05 мая 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: Babandr
Сначала вкратце задача...
Создаю компонент (в конечном итоге потомок TWinControl). Он представляет из себя поле с графическими объектами(многоугольники).Их можно выделять мышой. Хотелось бы по нажатию клавиш- стрелок менять выделение. Для этого делаю обработчик OnKeyDown публичным и вношу в него соответствующий код.
Но в рантайме по нажатию клавиш-стрелок мой компонент теряет фокус; фокус переходит на другие компоненты на форме и гуляет по ним...
Подскажите, пожалуйста - буду весьма признателен....


Обычно переопределяют не событие, а метод его вызывающий т.е. в данном случае:
DYNAMIC void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
а чтобы не было отработки по умочанию (переход на др. контрол) надо в Key записать 0.

11K
06 мая 2008 года
Babandr
76 / / 05.05.2008
Цитата: GIZMO
Обычно переопределяют не событие, а метод его вызывающий т.е. в данном случае:
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) уход фокуса не происходит, но и требуемое поведение не осуществляется...
И в голову ничего конструктивного не приходит. :(

8.4K
07 мая 2008 года
Zor
104 / / 23.04.2006
По моему в стилях контрола надо указывать при создании "хочу таб, хочу ентер, хочу стрелки"... Не помню где точно.

+нашел: WM_GETDLGCODE обработать
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог