Стараюсь писать про Аксапту, хотя частенько тянет в Офис
События FormActiveXControl не получается использовать в диалоге
Запись от Gustav размещена 17.11.2009 в 18:49
Хотел воспользоваться такими родными событиями Spreadsheet в динамической форме (диалоге), как SelectionChange, DblClick и еще некоторыми, которые видны через ActiveX Explorer при правом щелчке на узле контрола этого типа в дизайне обычной формы, сохраненной в AOT.
Уверенности придавал тот факт, что в форме, сохраненной в AOT, всё работает отлично. Методы событий добавляются во время разработки при помощи ActiveX Explorer с именами onEvent_SelectionChange, onEvent_DblClick и т.п. Внедренный в форму Spreadsheet (как FormActiveXControl) прекрасно на них реагирует и должным образом отрабатывает.
Как известно, для обработки событий в диалоге приходится прибегать к хитростям "перегрузки", заключающимся в использовании операторов
в некотором методе, формирующем диалог перед его исполнением.
Во втором операторе необходимо указать место хранения методов обработки событий. Таким местом обычно выступает некий отдельно стоящий класс, используемый только для данного диалога (в сам диалог по понятным "динамическим" причинам мы, к сожалению, не можем добавить методы событий).
Также известно, что для названий методов событий в таком классе существуют определенные правила. Согласно этим правилам название метода должно начинаться с имени элемента управления ("контрола") в форме и и далее через символ подчеркивания - название выбранного метода. Если в форме имеется кнопка MyButton, нажатие на которую обрабатывается методом clicked(), то предназначенный для тех же целей метод, вынесенный в класс, должен называться MyButton_clicked().
Имея в диалоге Spreadsheet с именем ss, я создал поддерживающий класс с методом под названием ss_onEvent_SelectionChange(). В метод я поместил оператор box::info('Изменилась ячейка!') и стал щелкать мышкой по разным ячейкам Spreadsheet'а. Ожидаемая с каждым щелчком реакция - появление сообщения - не наблюдалась.
Сделал шаг назад - вернулся к сохраненной в AOT обычной форме, но обработку событий оставил в поддерживающем классе (вызов element.controlMethodOverload поместил в init формы). И опять Spreasheet никак не реагировал Родная же аксаптовская кнопка (FormButtonContol) нормально "кликалась" со срабатыванием вынесенного метода MyButton_clicked() во всех вариантах: и в диалоге, и в сохраненной форме.
И всё же для этого промежуточного варианта - сохраненная форма, но вынесенная обработка - решение нашлось. Оказалось, что для вынесенного метода в узле методов Spreadsheet'а сохраненной формы должен присутствовать аналогичный пустой метод. Например, чтобы сработал вынесенный метод ss_onEvent_SelectionChange() - в узле ss\Methods сохраненной формы должен присутствовать метод с кодом "void onEvent_SelectionChange(){}", добавленный с помощью ActiveX Explorer.
И хотя практического смысла в таком промежуточном решении немного, важно другое - получен ответ, пусть и отрицательный, на вопрос "Можно ли использовать события для FormActiveXControl в диалоге?". Нельзя! Негде для диалога написать "void onEvent_SelectionChange(){}"... (Ax 3.0 SP4)
Или всё-таки можно? Может, как-то в более новых версиях?..
Уверенности придавал тот факт, что в форме, сохраненной в AOT, всё работает отлично. Методы событий добавляются во время разработки при помощи ActiveX Explorer с именами onEvent_SelectionChange, onEvent_DblClick и т.п. Внедренный в форму Spreadsheet (как FormActiveXControl) прекрасно на них реагирует и должным образом отрабатывает.
Как известно, для обработки событий в диалоге приходится прибегать к хитростям "перегрузки", заключающимся в использовании операторов
X++:
<FormRun>.controlMethodOverload(true); <FormRun>.controlMethodOverloadObject ( new < >(<FormRun>) );
Во втором операторе необходимо указать место хранения методов обработки событий. Таким местом обычно выступает некий отдельно стоящий класс, используемый только для данного диалога (в сам диалог по понятным "динамическим" причинам мы, к сожалению, не можем добавить методы событий).
Также известно, что для названий методов событий в таком классе существуют определенные правила. Согласно этим правилам название метода должно начинаться с имени элемента управления ("контрола") в форме и и далее через символ подчеркивания - название выбранного метода. Если в форме имеется кнопка MyButton, нажатие на которую обрабатывается методом clicked(), то предназначенный для тех же целей метод, вынесенный в класс, должен называться MyButton_clicked().
Имея в диалоге Spreadsheet с именем ss, я создал поддерживающий класс с методом под названием ss_onEvent_SelectionChange(). В метод я поместил оператор box::info('Изменилась ячейка!') и стал щелкать мышкой по разным ячейкам Spreadsheet'а. Ожидаемая с каждым щелчком реакция - появление сообщения - не наблюдалась.
Сделал шаг назад - вернулся к сохраненной в AOT обычной форме, но обработку событий оставил в поддерживающем классе (вызов element.controlMethodOverload поместил в init формы). И опять Spreasheet никак не реагировал Родная же аксаптовская кнопка (FormButtonContol) нормально "кликалась" со срабатыванием вынесенного метода MyButton_clicked() во всех вариантах: и в диалоге, и в сохраненной форме.
И всё же для этого промежуточного варианта - сохраненная форма, но вынесенная обработка - решение нашлось. Оказалось, что для вынесенного метода в узле методов Spreadsheet'а сохраненной формы должен присутствовать аналогичный пустой метод. Например, чтобы сработал вынесенный метод ss_onEvent_SelectionChange() - в узле ss\Methods сохраненной формы должен присутствовать метод с кодом "void onEvent_SelectionChange(){}", добавленный с помощью ActiveX Explorer.
И хотя практического смысла в таком промежуточном решении немного, важно другое - получен ответ, пусть и отрицательный, на вопрос "Можно ли использовать события для FormActiveXControl в диалоге?". Нельзя! Негде для диалога написать "void onEvent_SelectionChange(){}"... (Ax 3.0 SP4)
Или всё-таки можно? Может, как-то в более новых версиях?..
Всего комментариев 0