AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.06.2002, 14:50   #1  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
? Возможно ли перекрыть событие динамически?
Возможно ли перекрыть событие динамически (программно) у динамически созданного контрола в форме, например mouseMove( ).
Старый 11.06.2002, 15:25   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,250 / 980 (37) +++++++
Регистрация: 03.04.2002
Angry
Не извращайся! Ты сопровождаешь программу, а не пишешь. Если уж очень приспичило, почитай help, там все описано.
Старый 14.06.2002, 09:31   #3  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
Angry
Форум называется "Разработка", а не поддержка.
И вместо того что-бы выражать свои эмоции, напиши конкретно где искать...
Старый 14.06.2002, 10:41   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
согласен, что это изврат.

видимо, рыть надо в сторону классов SysDict*
Еще можно посмотреть на мастера отчетов. Масте программно создает отчетв в АОТе. Может можно сделать также.
Старый 14.06.2002, 10:51   #5  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,250 / 980 (37) +++++++
Регистрация: 03.04.2002
Вариант №1:
Найди в любой форме элемент нужного типа, правый клик на методы выбираешь пункт "Перекрыть метод" и получаешь список открытых методов по этому классу. Дальше дело техники.
Вариант №2:
Идешь в AOT-> SystemDocumentation-> Classes, находишь нужный FormControl и смотришь, что про него написано. Если написано ;-)
Старый 14.06.2002, 10:55   #6  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
Почему "изврат"???

Учитывая то, что при накате update юзерский слой снесется, лучше если мои изменения умели бы встраиваться сами в формы, причем в моем случае их можно будет использовать в нескольких если не в большинстве форм.
Потом, есть возможность динамически встраивать FormTreeControl, но без перекрытия метода expanding давольно тяжело организовать динамическое заполнение дерева по мере раскрытия юзером веток.
Старый 14.06.2002, 10:57   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
предполагается, что твои изменения лежат слоем выше.
см рекомендации по использованию слоев.
хотя бы в хелпе.

кстати, насчет Tree чиатай technet. Там об этом писалось.
Старый 14.06.2002, 11:36   #8  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
Мне не нужно, не 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
}
Have also a look in the form named "tutorial_addControl" ..."

но это не то, здесь метод создается в репозитарии...
Старый 14.06.2002, 14:04   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
универсальность лучше получить через MAP.
По крайней мере, это штатный способ.
Старый 14.06.2002, 14:24   #10  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
Если можно поподробней...
Старый 14.06.2002, 14:39   #11  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
Хочу еще раз поделиться своими изысканиями по изначальной теме.
Цитирую 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  
Axapta is offline
Axapta
Участник
 
91 / 12 (1) ++
Регистрация: 21.06.2002
Адрес: Moscow
Post Зачем перекрывать?
Создай метод с параметром, а внутри метода IF, т.е. неперекрытый вариант метода вызывается когда параметр = 0, а перекрытый, если не 0. И не надо извращаться.
Старый 21.06.2002, 18:17   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Про MAP
Есть возможность задать не таблицу, а "интерфейс" к таблице. В Аксапте это называется MAP. В map'е можно определить поля и методы. Кроме того, можно определить какое поле из map'а чему соотвтествует в разных таблицах. Это не совсем то что ты хочешь, но это штатный способ добиться универсальности.

Например,
SalesPurchLine, SalesPurchTable, CustVendTrans, AddressMap и т.п.
Старый 01.07.2002, 12:25   #14  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
Спасибо за разяснения MAP-а интересная штука....

По поводу предидущего совета:
У меня контрол у которого нужно перекрыть метод динамически создан как в классе Dialog, и поэтому просто написать метод нельзя, так, как сам контрол в AOT-е не существует....
Старый 09.07.2002, 21:00   #15  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
В версии 2.5 нет возможности обрабатывать события в элементах управления, созданных программно (в RunBase, очевидно). В версии 3.0, как обещают, такая возможность в классах RunBase/RunBaseDialog появится. Пока же элементы интерактивности приходится добавлять в runBase.validate(), использовать продвинутые EDT с relations.
Старый 27.08.2002, 12:33   #16  
Andrevv is offline
Andrevv
Участник
 
1 / 10 (1) +
Регистрация: 27.08.2002
Попробуй создать класс-потомок от того контрола который хочешь добавить динамически и там обработай тот метод который тебе нужен. Дальше при добавлении контрола создавай объект типа твоего класса. Я пробовал , не получилось. Покопай в этом направлении может будут какие-то идеи.
Старый 27.08.2002, 12:53   #17  
art is offline
art
Участник
 
46 / 10 (1) +
Регистрация: 11.06.2002
Адрес: Москва
Пробовал наследовать класс от класса контрола, но не получилось создать контрол моего унаследованного класса, может я что-то не так делал, но динамически можно создать только стандартные АХАПТовские контролы (помоемому)...
Старый 13.02.2003, 13:17   #18  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
У меня получилось сделать следующее:

По нажатию на кнопку, создать Dialog, в котором есть ListView с перегруженным методом mouseDblClick, выводящим Infolog. Очевидно, можно перегрузить практически любой его метод произвольным кодом.

Это требовалось?
Старый 13.02.2003, 13:42   #19  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
2KSS
В 2.5? Подробнее раскажи (покажи), pls, как перегружал.
Старый 13.02.2003, 14:30   #20  
KSS is offline
KSS
Коллективное бессознательn ое
 
116 / 10 (1) +
Регистрация: 09.12.2002
Адрес: Москва
Привет, Вась. Давно не виделись.
Мы, кстати, в ПРК вместе работали.
Единственное, что прошу учесть - я аналитик, а не программист. Так что возможны тупые ошибки. Ну это лирика...

Теперь к делу.
Была у меня мечта - на лету делать Dialog, в него пихать мой любимый ListView и там его заполнять какими-то данными, рисовать контекстное меню и.т.д.

В коде ниже по нажатию на кнопку рисуется диалог, в него добавляется ListView и перегружается метод mouseDblClick. Делается так:

1. В форму Dialog добавляем метод с именем:
<MyFormControlName>_<OverloadedMethodName>
сигнатура метода должна совпадать с сигнатурой стандартного метода. (Все это описано выше в тексте, приведенным ART)

2. В Source метода пишем свой код (стоит его заранее отладить, это просто).
3. Сохраняем все это добро, компилируя без вывода в окно сообщений.
4. Создаем и инициализируем диалог
5. Включаем "режим" перегрузки методов контролов
6. Создаем свой контрол с именем <MyFormControlName>
7. Пускаем диалог
8. Удаляем свой метод

Это "топорный метод", неприемлемый для боевых условий по очевидным причинам (динамически изменяется форма Dialog). И когда у нас хотябы 70 юзеров запустят этот диалог (пусть даже с проверками на существование метода), может быть плохо. Решение я вижу в том, чтобы сделать "свою" форму диалога и добавить туда сразу методов, а потом просто манипулировать именем создаваемого контрола. Вот.

Код:

PHP код:
void clicked()
{
    
Dialog     dlgTest;
    
FormRun    fr;
    
FormDesign fd;

    
UtilElements   ueTable;
    
TreeNode       tnTablemethodsNode;
    
MemberFunction newMethod;
    
str            source;
    ;
    
select firstonly ueTable
    where ueTable
.recordType == UtilElementType::Form
    
&& ueTable.name == 'Dialog';

    
tnTable     xUtilElements::getNodeInTree(ueTable);
    
methodsNode tnTable.findChild('Methods');
    
methodsNode.AOTadd('MyListView_mouseDblClick');
    
newMethod   methodsNode.findChild('MyListView_mouseDblClick');

    
source      ' public int MyListView_mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)' +
                  
' {' +
                  
' int ret;' +
                  
' FormListControl listView = element.controlCallingMethod();' +
                  
' ; ' +
                  
' ret = listView.mouseDblClick(_x, _y, _button, _Ctrl, _Shift); info("It works!");' +
                  
' Return ret;' +
                  
' }';

    
newMethod.AOTsetSource(sourcefalse);
    
newMethod.AOTsave();
    
tnTable.AOTcompile(1);
    
tnTable.AOTsave();

    
dlgTest = new Dialog('TestDialog');
    
dlgTest.doInit();
    
fr dlgTest.formRun();
    
fd fr.design();

    
fr.controlMethodOverload(true);
    
fd.addControl(FormControlType::LISTVIEW'MyListView');

    
dlgTest.run();

    
newMethod.delete();
    
newMethod.AOTsave();
    
tnTable.AOTcompile(1);
    
tnTable.AOTsave();

За это сообщение автора поблагодарили: Lemming (1).
Теги
aot, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Перехватить событие динамически созданного контрола. Как? Hub DAX: Программирование 1 31.07.2008 17:05
Событие CloseCanсel ViV DAX: Программирование 6 27.10.2005 12:40
Событие на ActiveX Bars DAX: Программирование 3 20.10.2005 13:26
Возможно ли учитавть ресурсы рабочих центров Nic DAX: Функционал 0 07.10.2004 12:20
Как получить значение поля Datasource на динамически созданной форме? storer DAX: Программирование 2 14.11.2003 16:41
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:48.