29.02.2008, 12:32 | #1 |
Участник
|
Вопрос по sysContextMenu
Итак, знатоки, внимание вопрос: sysContextMenu содержит 3 абстрактных метода: first, next, selectionCount. Допустим, мне в моём блоке в verifyItem методе этого класса необходимо пройтись по всем выбранным узлам, таким образом необходимо пользовать next и selectionCount методы класса. Разумеется, компиль выбрасывает рантайм, так как методы не реализованы. Нашел в АOT классы-наследники от sysContextMenu, например sysContextMenuFind. В этих-то классах first, next, selectionCount и реализуются. Тут всё ясно, не ясно только две вещи: 1.) почему реализации этих 3оих методов для каждого класса-наследника отличаются? 2.) как заставить систему использовать мой собственный класс-наследник(в самом sysContextMenu никакой привязки не нашел)?
З.Ы Сорри, если допустил ламаразмы, мне простительно Зарание спасибо)
__________________
Axapta has seduced me deadly! |
|
29.02.2008, 13:11 | #2 |
Участник
|
Цитата:
Разумеется, компиль выбрасывает рантайм, так как методы не реализованы.
Цитата:
1.) почему реализации этих 3оих методов для каждого класса-наследника отличаются?
Цитата:
2.) как заставить систему использовать мой собственный класс-наследник(в самом sysContextMenu никакой привязки не нашел)?
Вы уверены, что спросили то, что хотели узнать? Подозреваю, что вопрос мог звучать как "как добавить подменю в контекстное меню(то что в АОТ по правой кнопке) и как отслеживать когда показывать/когда не показывать пункты этого меню?". Поправьте, если не прав.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
29.02.2008, 14:05 | #3 |
Участник
|
Поправляю, вы не правы. Очевидно, что если бы я не знал как добавить этот пункт и не знал бы как его показывать\непоказывать, едва бы говорил о verifyItem методе.
Собственно вопрос и заключался в том, как используются классы аля SysContextMenuAotImportDialog. Вот ща апдейтну кросс-референсы и ещё раз посмотрю, потому что в первый раз ничего не узнал. З.Ы Цитата:
А почему должны совпадать?
UPD: иными словами, каким образом, например, работает вот этот код внутри verifyItem метода sysContextMenu, если метод selectionCount абстрактный??? Цитата:
case menuItemActionStr(sysCompare): if (!firstNode.applObjectLayerMask()) return 0; if (this.selectionCount() == 2) { return 1; } if (this.selectionCount() == 1) { return 1; }
__________________
Axapta has seduced me deadly! Последний раз редактировалось HorrR; 29.02.2008 в 14:54. |
|
29.02.2008, 15:17 | #4 |
Участник
|
Работает примерно так:
Цитата:
[c] \Classes\sysContextMenuAOT\selectionCount 1
[c] \Classes\SysContextMenu\verifyItem 354 [c] \Classes\sysContextMenuAOT\verifyItem 21
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
29.02.2008, 15:24 | #5 |
Участник
|
Цитата:
Создайте свою реализацию класса SysContextMenu, реализуйте в нем абстрактные методы и можете свой код писать в собственном verifyItem, не трогая родителя (см. SysContextMenuAotImportDialog).
__________________
ZAZнайка Последний раз редактировалось AsTeRiX; 29.02.2008 в 15:33. |
|
29.02.2008, 15:51 | #6 |
Участник
|
Так это собсна понятно. Но главный вопрос остается в силе. Каким образом дать понять системе, что использовать нужно именно мой класс, а не SysContextMenu?
__________________
Axapta has seduced me deadly! |
|
29.02.2008, 16:10 | #7 |
Участник
|
класс SysImportElements/buildTreeContextMenu и аналогичные методы.
__________________
ZAZнайка |
|
29.02.2008, 16:21 | #8 |
Участник
|
Цитата:
Т.е. изменить это поведение нельзя
__________________
Axapta v.3.0 sp5 kr2 |
|
29.02.2008, 16:33 | #9 |
Участник
|
Что-то я тогда совсем не понял. Какая же тогда поочерёдность вызовов методов при запуске поп-апа на айтеме? Логично было бы предположить, что экземпляр класса SysImportElements создаеться из его же main метода, а мейн метод запускается из меню айтема. Значит к моменту создания экземпляра класса этот меню айтем уже должен быть активирован с помощь пункта контекстного меню. Каким же образом уже после создания экземпляра класса можно влиять на отображение меню-айтема до того, как мain метод класса был им вызван. Это ж какие-то временные петли получаюццо.
В общем, возможно так будет намного проще мне тупице обьяснить, опишу всё по порядку. Для того что бы мой пункт меню отображася в адд-инах надо что бы все! выделенные элементы были определенного типа. Как это сделать?(Ясно что нужно пройтись по всем выделенным элементам, а для этого надо обязательно как минимум реализованный метод next, без selectionCount можно обойтись) З.Ы Догадываюсь, что многим будет лень, но поймите, плз, я не пытаюсь чужими руками жар загребать, просто человеку только постигающему истинный путь Axapt"ы нелегко видеть все детали сразу)
__________________
Axapta has seduced me deadly! |
|
29.02.2008, 16:48 | #10 |
Участник
|
Прошу прощения, но я совершенно запутался в ваших построениях.
Какое отношение к исходному вопросу имеет класс sysImportElements, его метод main() (которого вообще-то в стандарте нет) и временные петли? И скажите, что вы в конечном итоге хотите получить
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: HorrR (1). |
29.02.2008, 16:50 | #11 |
Участник
|
Хм. В verifyItem класса SysContextMenu есть секция
X++: case MenuItemType::Action: X++: SysUpdateProjectMarkAsResolved::canMarkAsResolved. Я что хочу сказать - что если работает для UpgradeProject, то и у Вас должно работать |
|
29.02.2008, 16:51 | #12 |
Участник
|
О. AndyD уже про ядро сказал.
оффтопик: Привет. Как поживаешь? |
|
29.02.2008, 17:02 | #13 |
Участник
|
В том то и дело, что пробовал, то ли Аксапта у меня рехнулась, то ли мозг и руки ростут немного не из того места) Вот блок, который я добавляю в verifyItem метод SysContextMenu(разумеется после
X++: case MenuItemType::Action: switch (menuItemName) X++: //MY BLOCK case menuItemActionStr(Generator): currentNode=firstNode; typeMatch=true; for(SelectionIndex=0;SelectionIndex<this.selectionCount();SelectionIndex++) { currentNodeType=currentNode.applObjectType(); typeMatch=( currentNodeType==UtilElementType::Table || currentNodeType==UtilElementType::TableField || currentNodeType==UtilElementType::PrivateProject || currentNodeType==UtilElementType::SharedProject); if(!typeMatch)return typeMatch; currentNode=this.next(); } return typeMatch; //MY BLOCK
__________________
Axapta has seduced me deadly! |
|
29.02.2008, 17:10 | #14 |
Участник
|
Зачем так городить, если есть this.first() и this.next()?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
29.02.2008, 17:18 | #15 |
Участник
|
Ну, во-первых, а что я собсна использую?) А во-вторых, к моей проблеме рациональность не имеет особого отношения, куда более важно понять, почему не работает элементарная вещь:
X++: SelectionIndex<this.selectionCount();
__________________
Axapta has seduced me deadly! |
|
29.02.2008, 17:27 | #16 |
Участник
|
Наверное, имелось в виду
X++: currentNode=this.first(); while (currentNode) { ... currentNode=this.next(); } Кстати, такое использование X++: currentNode=firstNode; for(SelectionIndex=0;SelectionIndex<this.selectionCount();SelectionIndex++) { currentNodeType=currentNode.applObjectType(); currentNode=this.next(); }
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 29.02.2008 в 17:48. Причина: не исправил при копировании |
|
29.02.2008, 17:45 | #17 |
Участник
|
Скорее всего, кстати. Я уже писал, что можно обойтись и без selectionCount, и имел в виду именно то, что вы уже написали. Но суть не в том. Суть в том, ПОЧЕМУ эта зараза не хочет работать.
__________________
Axapta has seduced me deadly! |
|
29.02.2008, 17:46 | #18 |
Участник
|
Ок. Извиняюсь.
Но все же делал бы как AndyD написал. Сделал все как у вас. 1 в 1. Работает - МИ отображается когда надо. Когда не надо - не отображается. Все откомпилировалось на ура. ЗЫ А всетаки я был прав в 2м посте со своим вопросом)
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
29.02.2008, 17:48 | #19 |
Участник
|
Цитата:
Суть в том, ПОЧЕМУ эта зараза не хочет работать.
Сюда MI добавили \Menus\sysContextMenu ?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
29.02.2008, 17:57 | #20 |
Участник
|
Вы в двух/трехзвенке работаете?
Попробойте почистить кэш AOT ([Ваш профиль]\Local Settings\Application Data\ файлы aoc)
__________________
Axapta v.3.0 sp5 kr2 |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Вопрос по созданию отчета | 6 | |||
Вопрос по возвратам | 2 | |||
SysContextMenu issue | 3 | |||
Вопрос по Проектам | 35 | |||
расчеты с персоналом. НДФЛ. вопрос чайника | 2 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|