11.06.2002, 14:50 | #1 |
Участник
|
Возможно ли перекрыть событие динамически?
Возможно ли перекрыть событие динамически (программно) у динамически созданного контрола в форме, например mouseMove( ).
|
|
11.06.2002, 15:25 | #2 |
NavAx
|
Не извращайся! Ты сопровождаешь программу, а не пишешь. Если уж очень приспичило, почитай help, там все описано.
|
|
14.06.2002, 09:31 | #3 |
Участник
|
Форум называется "Разработка", а не поддержка.
И вместо того что-бы выражать свои эмоции, напиши конкретно где искать... |
|
14.06.2002, 10:41 | #4 |
Участник
|
согласен, что это изврат.
видимо, рыть надо в сторону классов SysDict* Еще можно посмотреть на мастера отчетов. Масте программно создает отчетв в АОТе. Может можно сделать также. |
|
14.06.2002, 10:51 | #5 |
NavAx
|
Вариант №1:
Найди в любой форме элемент нужного типа, правый клик на методы выбираешь пункт "Перекрыть метод" и получаешь список открытых методов по этому классу. Дальше дело техники. Вариант №2: Идешь в AOT-> SystemDocumentation-> Classes, находишь нужный FormControl и смотришь, что про него написано. Если написано ;-) |
|
14.06.2002, 10:55 | #6 |
Участник
|
Почему "изврат"???
Учитывая то, что при накате update юзерский слой снесется, лучше если мои изменения умели бы встраиваться сами в формы, причем в моем случае их можно будет использовать в нескольких если не в большинстве форм. Потом, есть возможность динамически встраивать FormTreeControl, но без перекрытия метода expanding давольно тяжело организовать динамическое заполнение дерева по мере раскрытия юзером веток. |
|
14.06.2002, 10:57 | #7 |
Участник
|
предполагается, что твои изменения лежат слоем выше.
см рекомендации по использованию слоев. хотя бы в хелпе. кстати, насчет Tree чиатай technet. Там об этом писалось. |
|
14.06.2002, 11:36 | #8 |
Участник
|
Мне не нужно, не Tree, не как это можно сделать с помощью репозитария, мне нужно у динамически созданного контрола (которого нет в репозитарии) динамически перекрыть метод (возможность перекрыть в репозитарии естественно тоже нет) .
В technet мне удалось кое что нарыть, цитирую: "....There are a few things you've to do if you want to overried methods for a form control which was created during runtime: (1) the form method "controlMethodOverload()" has to be called with an argument equal to "true" like ... element.controlMethodOverload(true); ... You should call the method either in the form's init() or run() method (2) on form level you have to create method(s) which are named like this: _ the parameter-profile has to be exactly the same as a method of a "regular" form control created by drag&drop. In the method you have to declare and assign a control instance; then you can code the functionality you want, t.e.: X++: // my contol generated from X++ is named "AutoButton" // this method is for overriding the clicked method.... void AutoButton_clicked() { FormButtonControl fbc = element.controlCallingMethod(); // handle to "AutoButton" fbc.clicked(); // same as calling super() info("oh - it works....."); // own program code } но это не то, здесь метод создается в репозитарии... |
|
14.06.2002, 14:04 | #9 |
Участник
|
универсальность лучше получить через MAP.
По крайней мере, это штатный способ. |
|
14.06.2002, 14:24 | #10 |
Участник
|
Если можно поподробней...
|
|
14.06.2002, 14:39 | #11 |
Участник
|
Хочу еще раз поделиться своими изысканиями по изначальной теме.
Цитирую Technet: "... X++: void example() { UtilElements ueTable; TreeNode tnTable, methodsNode; MemberFunction newMethod; str source; ; select firstonly ueTable where ueTable.recordType == UtilElementType::Table && ueTable.name == 'tablename'; tnTable = xUtilElements::getNodeInTree(ueTable); methodsNode = tnTable.findChild('Methods'); methodsNode.AOTadd('ValidateField'); newMethod = methodsNode.findChild('ValidateField'); source = 'public boolean validateField(fieldId _p1)\n'+ '{\n'+ ' boolean ret;\n'+ '\n'+ ' ret = super(_p1);\n'+ '\n'+ ' return ret;\n'+ '}\n'; newMethod.AOTsetSource(source, false); newMethod.AOTsave(); tnTable.AOTsave(); } но пока не разобрался можно ли с помощью TreeNode добраться до динамически созданных элементов. |
|
21.06.2002, 17:18 | #12 |
Участник
|
Зачем перекрывать?
Создай метод с параметром, а внутри метода IF, т.е. неперекрытый вариант метода вызывается когда параметр = 0, а перекрытый, если не 0. И не надо извращаться.
|
|
21.06.2002, 18:17 | #13 |
Участник
|
Про MAP
Есть возможность задать не таблицу, а "интерфейс" к таблице. В Аксапте это называется MAP. В map'е можно определить поля и методы. Кроме того, можно определить какое поле из map'а чему соотвтествует в разных таблицах. Это не совсем то что ты хочешь, но это штатный способ добиться универсальности. Например, SalesPurchLine, SalesPurchTable, CustVendTrans, AddressMap и т.п. |
|
01.07.2002, 12:25 | #14 |
Участник
|
Спасибо за разяснения MAP-а интересная штука....
По поводу предидущего совета: У меня контрол у которого нужно перекрыть метод динамически создан как в классе Dialog, и поэтому просто написать метод нельзя, так, как сам контрол в AOT-е не существует.... |
|
09.07.2002, 21:00 | #15 |
Banned
|
В версии 2.5 нет возможности обрабатывать события в элементах управления, созданных программно (в RunBase, очевидно). В версии 3.0, как обещают, такая возможность в классах RunBase/RunBaseDialog появится. Пока же элементы интерактивности приходится добавлять в runBase.validate(), использовать продвинутые EDT с relations.
|
|
27.08.2002, 12:33 | #16 |
Участник
|
Попробуй создать класс-потомок от того контрола который хочешь добавить динамически и там обработай тот метод который тебе нужен. Дальше при добавлении контрола создавай объект типа твоего класса. Я пробовал , не получилось. Покопай в этом направлении может будут какие-то идеи.
|
|
27.08.2002, 12:53 | #17 |
Участник
|
Пробовал наследовать класс от класса контрола, но не получилось создать контрол моего унаследованного класса, может я что-то не так делал, но динамически можно создать только стандартные АХАПТовские контролы (помоемому)...
|
|
13.02.2003, 13:17 | #18 |
Коллективное бессознательn ое
|
У меня получилось сделать следующее:
По нажатию на кнопку, создать Dialog, в котором есть ListView с перегруженным методом mouseDblClick, выводящим Infolog. Очевидно, можно перегрузить практически любой его метод произвольным кодом. Это требовалось? |
|
13.02.2003, 13:42 | #19 |
----------------
|
2KSS
В 2.5? Подробнее раскажи (покажи), pls, как перегружал. |
|
13.02.2003, 14:30 | #20 |
Коллективное бессознательn ое
|
Привет, Вась. Давно не виделись.
Мы, кстати, в ПРК вместе работали. Единственное, что прошу учесть - я аналитик, а не программист. Так что возможны тупые ошибки. Ну это лирика... Теперь к делу. Была у меня мечта - на лету делать Dialog, в него пихать мой любимый ListView и там его заполнять какими-то данными, рисовать контекстное меню и.т.д. В коде ниже по нажатию на кнопку рисуется диалог, в него добавляется ListView и перегружается метод mouseDblClick. Делается так: 1. В форму Dialog добавляем метод с именем: <MyFormControlName>_<OverloadedMethodName> сигнатура метода должна совпадать с сигнатурой стандартного метода. (Все это описано выше в тексте, приведенным ART) 2. В Source метода пишем свой код (стоит его заранее отладить, это просто). 3. Сохраняем все это добро, компилируя без вывода в окно сообщений. 4. Создаем и инициализируем диалог 5. Включаем "режим" перегрузки методов контролов 6. Создаем свой контрол с именем <MyFormControlName> 7. Пускаем диалог 8. Удаляем свой метод Это "топорный метод", неприемлемый для боевых условий по очевидным причинам (динамически изменяется форма Dialog). И когда у нас хотябы 70 юзеров запустят этот диалог (пусть даже с проверками на существование метода), может быть плохо. Решение я вижу в том, чтобы сделать "свою" форму диалога и добавить туда сразу методов, а потом просто манипулировать именем создаваемого контрола. Вот. Код: PHP код:
|
|
|
За это сообщение автора поблагодарили: Lemming (1). |