AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 11.06.2002, 14:50   #1  
art ist offline
art
Участник
 
46 / 10 (1) +
Registriert seit: 11.06.2002
Ort: Москва
? Возможно ли перекрыть событие динамически?
Возможно ли перекрыть событие динамически (программно) у динамически созданного контрола в форме, например mouseMove( ).
Alt 11.06.2002, 15:25   #2  
macklakov ist offline
macklakov
NavAx
Benutzerbild von macklakov
 
2.347 / 996 (38) +++++++
Registriert seit: 03.04.2002
Angry
Не извращайся! Ты сопровождаешь программу, а не пишешь. Если уж очень приспичило, почитай help, там все описано.
Alt 14.06.2002, 09:31   #3  
art ist offline
art
Участник
 
46 / 10 (1) +
Registriert seit: 11.06.2002
Ort: Москва
Angry
Форум называется "Разработка", а не поддержка.
И вместо того что-бы выражать свои эмоции, напиши конкретно где искать...
Alt 14.06.2002, 10:41   #4  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
согласен, что это изврат.

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

Учитывая то, что при накате update юзерский слой снесется, лучше если мои изменения умели бы встраиваться сами в формы, причем в моем случае их можно будет использовать в нескольких если не в большинстве форм.
Потом, есть возможность динамически встраивать FormTreeControl, но без перекрытия метода expanding давольно тяжело организовать динамическое заполнение дерева по мере раскрытия юзером веток.
Alt 14.06.2002, 10:57   #7  
mazzy ist offline
mazzy
Участник
Benutzerbild von mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29.472 / 4494 (208) ++++++++++
Registriert seit: 29.11.2001
Ort: Москва
Blog-Einträge: 10
предполагается, что твои изменения лежат слоем выше.
см рекомендации по использованию слоев.
хотя бы в хелпе.

кстати, насчет Tree чиатай technet. Там об этом писалось.
Alt 14.06.2002, 11:36   #8  
art ist offline
art
Участник
 
46 / 10 (1) +
Registriert seit: 11.06.2002
Ort: Москва
Мне не нужно, не 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" ..."

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

Например,
SalesPurchLine, SalesPurchTable, CustVendTrans, AddressMap и т.п.
Alt 01.07.2002, 12:25   #14  
art ist offline
art
Участник
 
46 / 10 (1) +
Registriert seit: 11.06.2002
Ort: Москва
Спасибо за разяснения MAP-а интересная штука....

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

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

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

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

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

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

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

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

Код:

PHP-Code:
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();

This post has been rated by: Lemming (1).
Stichworte
aot, программно

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Перехватить событие динамически созданного контрола. Как? 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 06:21 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.