powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
8 сообщений из 8, страница 1 из 1
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33130491
Полароид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем добрый день!
Окажите услугу, плиз: помогите разобраться с одним затыком.
C++ Builder 6.
У меня на форме имеется data-aware контрол DBCheckBox.
К нему прицеплен обработчик события OnKeyDown().
В этом обработчике рулится нажатие стрелок управления курсором вправо-влево.
Однако при нажатии этих клавиш софтина в этот обработчик не входит. В то время как при нажатии алфавитно-цифровых - входит на раз два. И выходит, кстати :-)
Я так понял, что этот чекбокс забивает на стрелки или они используются внутри класса для собственных целей.
Один умный человек посоветовал сделать следующим образом:
На форме поставить KeyPreview = true, а в обработчике OnKeyDown() формы
сделать следующее:

TWinControl *ctrl = dynamic_cast <TWinControl*> (Sender);
if (ctrl != NULL)
/*здесь нужно выяснить, если ли у контрола обработчик OnKeyDown()
Если он есть, его надо выполнить.

Соль вопроса: как узнать, есть ли обработчик OnKeyDown() у ctrl? :-)
*/
if (есть обработчик)
ctrl->OnKeyDown(Sender, Key, Shift);
...
Рейтинг: 0 / 0
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33130514
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взять да и проверить соответсвующее свойство

Код: plaintext
1.
2.
typedef void __fastcall (__closure *TKeyEvent)(System::TObject* Sender, Word &Key, Classes::
TShiftState Shift);
__property TKeyEvent OnKeyDown = {read=FOnKeyDown, write=FOnKeyDown};
...
Рейтинг: 0 / 0
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33130518
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, Сендер - это будет форма, надо проверять ActiveControl
...
Рейтинг: 0 / 0
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33130605
Полароид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Карабас БарабасКстати, Сендер - это будет форма, надо проверять ActiveControl
Пардон, конечно же ActiveControl.
...
Рейтинг: 0 / 0
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33130869
Полароид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью свойства OnKeyDown не рулится, по причине того, что и свойство и метод для класса TWinControl является protected.
Поэтому пришлось пойти экстенсивным путем: проверять какой это контрол, если он входит в список тех, которые нужно проверять, выполнять анализ и при необходимости вызывать соответствующий метод.
НО! Этому долбанному чекбоксу по барабану!
Даже при таком способе он не реагирует на стрелки.
Так что буду выкручиваться по-другому: сгруппирую данные в гридку.
Вот код обработки KeyDown() для формы:
TDBGridEh *grd = dynamic_cast <TDBGridEh*> (ActiveControl);
TLabeledEdit *ldt = dynamic_cast <TLabeledEdit*> (ActiveControl);
TMaskEdit *mdt = dynamic_cast <TMaskEdit*> (ActiveControl);
TDBCheckBoxEh *dbchk = dynamic_cast <TDBCheckBoxEh*> (ActiveControl);
TDBEdit *dbedt = dynamic_cast <TDBEdit*> (ActiveControl);
TComboBox *cmb = dynamic_cast <TComboBox*> (ActiveControl);
TEdit *edt = dynamic_cast <TEdit*> (ActiveControl);
TTreeView *trv = dynamic_cast <TTreeView*> (ActiveControl);

if (grd != NULL)
if (grd->OnKeyDown != NULL)
grd->OnKeyDown(Sender, Key, Shift);

if (ldt != NULL)
if (ldt->OnKeyDown != NULL)
ldt->OnKeyDown(Sender, Key, Shift);

if (mdt != NULL)
if (mdt->OnKeyDown != NULL)
mdt->OnKeyDown(Sender, Key, Shift);

if (dbchk != NULL)
if (dbchk->OnKeyDown != NULL)
dbchk->OnKeyDown(Sender, Key, Shift);
if (dbedt != NULL)
if (dbedt->OnKeyDown != NULL)
dbedt->OnKeyDown(Sender, Key, Shift);

if (cmb != NULL)
if (cmb->OnKeyDown != NULL)
cmb->OnKeyDown(Sender, Key, Shift);

if (edt != NULL)
if (edt->OnKeyDown != NULL)
edt->OnKeyDown(Sender, Key, Shift);

if (trv != NULL)
if (trv->OnKeyDown != NULL)
trv->OnKeyDown(Sender, Key, Shift);
...
Рейтинг: 0 / 0
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33130966
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слушай, может тебе вместо чекбокса радиогруп использовать ? 2 колонки, 2 позиции, стрелками будет переходить из одной в другую
...
Рейтинг: 0 / 0
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33131033
Полароид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С помощью свойства OnKeyDown не рулится, по причине того, что и свойство и метод для класса TWinControl является protected.
Поэтому пришлось пойти экстенсивным путем: проверять какой это контрол, если он входит в список тех, которые нужно проверять, выполнять анализ и при необходимости вызывать соответствующий метод.
НО! Этому долбанному чекбоксу по барабану!
Даже при таком способе он не реагирует на стрелки.
Так что буду выкручиваться по-другому: сгруппирую данные в гридку.
Вот код обработки KeyDown() для формы:
TDBGridEh *grd = dynamic_cast <TDBGridEh*> (ActiveControl);
TLabeledEdit *ldt = dynamic_cast <TLabeledEdit*> (ActiveControl);
TMaskEdit *mdt = dynamic_cast <TMaskEdit*> (ActiveControl);
TDBCheckBoxEh *dbchk = dynamic_cast <TDBCheckBoxEh*> (ActiveControl);
TDBEdit *dbedt = dynamic_cast <TDBEdit*> (ActiveControl);
TComboBox *cmb = dynamic_cast <TComboBox*> (ActiveControl);
TEdit *edt = dynamic_cast <TEdit*> (ActiveControl);
TTreeView *trv = dynamic_cast <TTreeView*> (ActiveControl);

if (grd != NULL)
if (grd->OnKeyDown != NULL)
grd->OnKeyDown(Sender, Key, Shift);

if (ldt != NULL)
if (ldt->OnKeyDown != NULL)
ldt->OnKeyDown(Sender, Key, Shift);

if (mdt != NULL)
if (mdt->OnKeyDown != NULL)
mdt->OnKeyDown(Sender, Key, Shift);

if (dbchk != NULL)
if (dbchk->OnKeyDown != NULL)
dbchk->OnKeyDown(Sender, Key, Shift);
if (dbedt != NULL)
if (dbedt->OnKeyDown != NULL)
dbedt->OnKeyDown(Sender, Key, Shift);

if (cmb != NULL)
if (cmb->OnKeyDown != NULL)
cmb->OnKeyDown(Sender, Key, Shift);

if (edt != NULL)
if (edt->OnKeyDown != NULL)
edt->OnKeyDown(Sender, Key, Shift);

if (trv != NULL)
if (trv->OnKeyDown != NULL)
trv->OnKeyDown(Sender, Key, Shift);
...
Рейтинг: 0 / 0
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
    #33131044
Полароид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Карабас БарабасСлушай, может тебе вместо чекбокса радиогруп использовать ? 2 колонки, 2 позиции, стрелками будет переходить из одной в другую
По моей ситуации лучше юзать гридку. Что я уже и сделал. Теперь все хорошо
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]