|
|
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
Всем добрый день! Окажите услугу, плиз: помогите разобраться с одним затыком. 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 10:30 |
|
||
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
Взять да и проверить соответсвующее свойство Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 10:37 |
|
||
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
Кстати, Сендер - это будет форма, надо проверять ActiveControl ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 10:38 |
|
||
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
Карабас БарабасКстати, Сендер - это будет форма, надо проверять ActiveControl Пардон, конечно же ActiveControl. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 10:59 |
|
||
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
С помощью свойства 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:08 |
|
||
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
Слушай, может тебе вместо чекбокса радиогруп использовать ? 2 колонки, 2 позиции, стрелками будет переходить из одной в другую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:36 |
|
||
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
С помощью свойства 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); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:53 |
|
||
|
Как выяснить, есть ли у контрола обработчик нажатия клавиш и вызвать его при необходимости
|
|||
|---|---|---|---|
|
#18+
Карабас БарабасСлушай, может тебе вместо чекбокса радиогруп использовать ? 2 колонки, 2 позиции, стрелками будет переходить из одной в другую По моей ситуации лучше юзать гридку. Что я уже и сделал. Теперь все хорошо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:55 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2033108]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 342ms |

| 0 / 0 |
