![]() |
#16 |
Участник
|
Привет.
Доставляет неудобства вопрос перехвата пользовательского ввода для созданных formControl'ов в runTime. Поэтому решил окунуться в омут installMessageProc с целью перехвата этих самых событий. Понятное дело, ControlMethodOverload никто не отменял, но такой объект может быть только 1-н на форму, что накладывает ограничения, поэтому его не всегда получится применить (не говоря уже об обязательном соответствии наименования метода и контрола). Для обычных контролов код события 0x0100 (для целей valueChange/textChange) покрывает проблематику в полной мере. Однако, особенности в использовании данного подхода проявляются при работе со всякими combobox, date (с formRef EDT), utcDateTime контролами - "контейнерными" контролами. HWND, который возвращает Аксапта, верхний в абстракции и события он не генерирует (которые можно перехватить с помощью installMessageProc). Говорить буду о combobox (представляет наибольший интерес). Сам он - "pane" (AxComboBoxEx) состоящий из "combobox", "editable text", "push button", "list" (list) и "list item" (это массив). Вот этот "зверинец" и необходимо перехватывать. Когда пользователь нажимает на "стрелочку вниз", он запускает button, отображающий list (из invisible становится visible) с перечнем item'ов. Согласно классике, функции findWindowEx и getWindow не могут найти list среди дочек combobox'a. Возвращаясь к теме использования "oleacc.dll" (Dax 2012 получить путь к Treenode (Toolbar, tabax)) и его функциям (AccessibleObjectFromWindow, AccessibleChildren, WindowFromAccessibleObject), вытянуть list и list item'ы можно. Последний раз редактировалось Товарищ ♂uatr; 12.08.2025 в 12:52. |
|
|
За это сообщение автора поблагодарили: Logger (5). |
|
|