25.01.2024, 18:17 | #1 |
Участник
|
TemporaryFormName - поймать в классе метод формы
Привет всем.
Задачка Аксапта 2012 R3 Есть самописный класс лукапа (копия SysTableLookup со своими переделками) В нем потребовалось запретить лукапу закрываться по клику на нем. Ну, как обычно, хотим перехватит close, closeSelect и не дать уйти в super. Но там используется псевдоформа TemporaryFormName, которой нет в АОТ. Попробовал применить controlMethodOverloadObject а оно не работает для методов формы close, closeSelect Для контролов работает. Видимо предназначено только для ловли методов контролов. Мне это показалось странным. Был же сарайчик. Должна же быть возможность перехватить. P.S. Сделал иначе - создал в АОТ свою форму MyTemporaryFormName Прописал ее в классе. Методы все также не перехватываются в классе, но поскольку форма существует в аот, то можно в ней в методах close, closeSelect прописать нужный код. P.P.S. Видел еще в 4-ке метод \Classes\TableLookup_RU\waitAndSearch там жестко через WinApi идет работа. Но мне казалось что можно попроще средствами платформы 12-ки сделать. P.P.P.S. В 2009-й еще были \Classes\SysSetupFormRun\addListener_W добавляла к форме обработчик и тогда к нему приходили события на init / run формы Но в 12-ке это похоже выпилили Да и это были просто подписчики на события они не позволяли логику менять т.е. не подходит этот костыль. В общем, ощущение, что я просто что-то неправильно сделал и методы формы можно перехватить в управляющем классе и можно обойтись без создания своей формы лукапа в AOT |
|
26.01.2024, 20:24 | #2 |
Участник
|
В dax2012 форма для раскрывающегося списка - это просто базовый класс формы. А "TemporaryFormName" - это имя этой новой формы, чтобы не создавать макрос
X++: protected FormRun formRun() { Form form = new Form(); form.name(identifierstr(TemporaryFormName)); (...) Т.е. TemporaryFormName - не есть объект-форма. Здесь это используется просто как имя. Текст. Никаких реквизитов формы TemporaryFormName (да и самой формы) здесь не используют Поэтому блокировка закрытия lookup-формы - это именно что запрет вызова super() в методе closeSelect() Например, если посмотреть форму Lookup для множественного выбора SysLookupMultiSelectGrid, то у нее именно что метод closeSelect() закомментирован Здесь же в ссылках ниже есть статья Максима Горбунова Создание Lookup формы, где он также пишет, что надо просто перекрыть closeSelect() если нужен контроль закрытия формы PS: Чтобы создать форму именно на основе формы из AOT нужен другой синтаксис X++: form = new Form(formstr(Dialog)) SysTableLookup - создает форму "с нуля". Без какого-либо шаблона формы в AOT. Поэтому и перехват методов невозможен. Не известен объект у которого эти методы надо перехватывать
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 26.01.2024 в 20:35. |
|
27.01.2024, 12:47 | #3 |
Участник
|
*
Цитата:
Но вопрос был в другом. Как сделать так чтобы перехватить методы формы close, closeSelect классом обработчиком, не модифицируя саму форму. Потому-что как-то странно система себя ведет - методы контролов формы перехватывать можно, а методы формы не получается. Нет. Дело не в этом. Движок аксапты одинаково работает. Для несуществующей в AOT формы созданной на лету успешно работает перехват методов на контролах. |
|
28.01.2024, 13:43 | #4 |
Участник
|
Ну да, не до конца реализованы некоторые возможности.
На подавляющем большинстве контролов есть registerOverrideMethod методы. А вот на FormRun такого не предусмотрели, как и для FormDataSource (в целом). Для полей FormDataSource некоторые события перехватываются - есть registerOverrideMethod в FormDataObject, но опять же не все работают (например, lookup хотя написать можно, но не срабатывает). А сам FormDataSource вроде наследник FormDataObject, но на нем перехват не работает. Вроде selectionChanged можно перехватить, но как-то из-за одного метода завязываться нет смысла. Последний раз редактировалось Raven Melancholic; 28.01.2024 в 13:46. |
|
29.01.2024, 11:11 | #5 |
Участник
|
Цитата:
Если есть класс и в нем метод с заранее известным именем (validate ?), то выполнить этот метод
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|