|  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). | |