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
 
1,970 / 877 (33) +++++++
Регистрация: 03.04.2002
Адрес: Australia
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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,848 / 3764 (183) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
согласен, что это изврат.

видимо, рыть надо в сторону классов SysDict*
Еще можно посмотреть на мастера отчетов. Масте программно создает отчетв в АОТе. Может можно сделать также.
Старый 14.06.2002, 10:51   #5  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
1,970 / 877 (33) +++++++
Регистрация: 03.04.2002
Адрес: Australia
Вариант №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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,848 / 3764 (183) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
предполагается, что твои изменения лежат слоем выше.
см рекомендации по использованию слоев.
хотя бы в хелпе.

кстати, насчет 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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,848 / 3764 (183) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
универсальность лучше получить через 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
Участник
 
86 / 12 (1) ++
Регистрация: 21.06.2002
Адрес: Moscow
Post Зачем перекрывать?
Создай метод с параметром, а внутри метода IF, т.е. неперекрытый вариант метода вызывается когда параметр = 0, а перекрытый, если не 0. И не надо извращаться.
Старый 21.06.2002, 18:17   #13  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,848 / 3764 (183) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Про 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
Moderator
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,715 / 2257 (83) +++++++++
Регистрация: 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,728 / 841 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
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, время: 15:45.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.