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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.06.2006, 14:03   #1  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Advanced programming
Вобщем нужно было с самого начала на этом форуме регестрироваться. Вопрос следующий:

http://forum.mazzy.ru/index.php?showtopic=5695

P.S.
По желанию телезрителей засвечиваю свой пост в оригинале:

День добрый всем. С аксаптой я знаком всего несколько дней, проект ожидается не продолжительный, потому предпочтительно прибегнуть к помощи экспертов.

Кстати Аксапта эта мне очень сильно напоминает SmallTalk, аналогичные идеи, решения.
  1. Значит вопрос первый думаю стандартный, документация по классам, в нете практически ничего нет, как с этим всем разбираться? Вот хочу я создать инстанс другой формы из метода моего класса, нужно использовать ClassFactory::fromRunClassOnClient? Или что то другое? Как заполнить Args, в каком формате это принято делать? Все это можно понять только при наличии документации.
    {
    Почему формы не наследуются?
    Что такое "Args"
    }
  2. СОМ взаимодействие. Из примеров более менее ясно как построить ссылку на объект. Меня интересует как в Х++ собрать класс, который я смогу передать в методы СОМ объекта в качестве аргумента, и из СОМ-а уже вызывать эти методы Аксапта обьекта? Где то прочитал что можно унаследоваться от класса СОМ и получится как бы то что нужно. Можно подробности, какие методы, кроме наследования, нужно перекрыть, как имплементировать тот или инной интерфейс, который определен в АктивХ ТЛБ, какой тип интерфейса возможно имплементировать - дюал или только диспинтерфейс для позднего связывания?
  3. Язык видимо джавоидный, значит должна быть рефлексия, как ей воспользоваться для исследования типов в рантайме, для имплементации позднего связывания и вызовов методов посредством рефлексии? Помнится в СмолТоке можно было получить все инстансы конкретного класса, которые были построены сейчас, как с этим обстоят дела в Х++?
  4. Подписка на GUI controls Events. Судя по тому что я вижу, можно перекрыть метод и обрабатывать таким образом сообщение. Как реализовать множественного наблюдателя, как в Джаве или .Нет, котгда есть возможность засунуть список листнеров\делегатов на одно событие, чтобы можно было это проделать в рантайме, не перекрывая заранее методы в дизайн тайме.
  5. Если предыдущий пункт не получается проделать, тогда выхода нет и прийдется править классы контролов (кнопок, списков, таблиц), встраивать тот когд, который мне необходим туда. Принято ли это делать, и можно ли вообще поменять имплементацию классов стандартной библиотеки (опять же в СмолТоке это делалось), к примеру я хочу дописать пару строк в ClassFactory::fromRunClassOnClient, или в Button.clicked
  6. Если и этого нельзя сделать, тогда может есть какие то метасредства? В некоторых версиях Смолтока можно было добавлять пре и пост кондишнс на конкретные методы, для меня это как раз, например к методу Button.clicked в пост кондишн добавить пару моих строк кода, который будет вызываться с теми же аргументами что и обработчик сообщения. (Такой метод был бы предпочтительнее чем менять библиотечные классы, которые с новыми петчами могут тоже поменяться и вся моя писанина уйдет коту под хвост).
  7. Если и этого нельзя сделать! Тогда может есть возможность встроить свой типа ClassLoader, который при загрузке мне необходимых классов будет их на лету модифицировать и добавлять строчки кода в нужные мне обработчики?
Вот такие вопросы, надеюсь объяснился понятным языком?

P.P.S
Привередливые какие...

Последний раз редактировалось batiskaf_new; 15.06.2006 в 16:50.
За это сообщение автора поблагодарили: mazzy (5), belugin (3), alex55 (1).
Старый 07.06.2006, 14:12   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ну, уж текст-то свой копипастом пригоните сюда...
(сообщения можно редактировать)

P.S. Да не делайте Вы его как цитату - другим неудобно будет Вас цитировать при ответах!

P.P.S. Спасибо. Теперь хорошо.

Последний раз редактировалось Gustav; 07.06.2006 в 14:25.
Старый 07.06.2006, 14:36   #3  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
http://erpkb.com/Axapta/ActiveX
Старый 07.06.2006, 14:38   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
3. http://erpkb.com/Axapta/Metadannye

.всего остального нельзя

Последний раз редактировалось belugin; 07.06.2006 в 14:42.
Старый 07.06.2006, 14:46   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
По поводу п 1. смотрите Developer's Guide - идет в составе дистрибутива
__________________
Axapta v.3.0 sp5 kr2
Старый 07.06.2006, 15:10   #6  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
2 batiskaf_new
Вы ужас какой умный... я серьезно, просто завидую! у меня при чтении уже 4-го пункта заболела голова... я потом дочитаю... (точнее - попробую)
Старый 07.06.2006, 16:33   #7  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,129 / 916 (35) +++++++
Регистрация: 03.04.2002
Цитата:
Сообщение от Gustav
2 batiskaf_new
Вы ужас какой умный... я серьезно, просто завидую! у меня при чтении уже 4-го пункта заболела голова... я потом дочитаю... (точнее - попробую)
Имплементация, интстансы, листнеров\делегатов... Если на английском или в русском переводе, то слова простые, а вот в транслите да еще с русскими окончаниями, действительно голова болит.

2 batiskaf_new:
Продублирую свой совет с forum.mazzy.ru:
Обертывайте тестирующий код в макросы, чтоб одной константой можно было все закоментировать
__________________
Isn't it nice when things just work?
Старый 07.06.2006, 18:25   #8  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
Сообщение от belugin
Спасибо, только я это уже читал, все это не то. Мне нужно из Аксапты (Х++) создать СОМ объект, и передать в метод этого обьекта ссылку на Х++ MyInsideAxaptaObject. Попробовал унаследовать MyInsideAxaptaObject class от класса СОМ, передавать объекты теперь можно, но в коде СОМ объекта эта ссылка почему то нулевая. Может нужно еще что то заимплементировать?
Старый 07.06.2006, 18:30   #9  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
Сообщение от belugin
.всего остального нельзя
На форуме Mazzy ответили полнее. Я уже DictClass проверил, динамические вызовы можно сделать. Только вот count of the MyClass instances я так и не научился брать.

Что касается модификации библиотечных классов мне тоже ответили на Mazzy что можно, только вот как мне переделать код класса FormButtonControl? Где этот файл физически находится, как это все найти и поменять?
Старый 07.06.2006, 18:34   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Стоп-стоп-стоп.
Библиотечные классы - это классы, которые находятся в ветке class.
Системные классы - это классы, которые можно найти в AOT \ System Documentation \ Classes.

На самом деле системные классы логически находятся в том же пространстве имен, что и библиотечные. Но как правило имеют модификатор final. Поэтому наследовать от них вы не можете. Мало того, у вас нет возможности посмотреть исходный код СИСТЕМНЫХ классов (это фича такая).
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 18:47   #11  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Ага, вы и на этом форуме тоже учавствуете?

Давайте по порядку. Значит Системные классы ни посмотреть, ни поменять, только пользовательские. Верно? Как же мне тогда вставить в метод:
FormButtonControl::clicked еще своих пару строчек кода? Значит получается что и ClassLoader тоже не спасет?

Вобщем, мне нужно чтобы любая аппликация, которая бежит в Аксапте на клик по любой кнопке любого диалога, помимо пользовательского кода исполняла еще мой код, который отправит некоторую информацию в СОМ объект. При этом, изменений в пользовательстком коде делать не желательно, можно максимум один два обьекта построить при старте аппликации, или еще что то такое.
Старый 07.06.2006, 19:25   #12  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Уж не знаю зачем Вам все это нужно. Может если расскажете зачем, то люди поскажут и как это реализовать.

Как уже говорилось - вставить свой код в методы системных классов нельзя. Заставить систему везде вместо инстансов FormButtonControl создавать инстансы MySuperButtonControl то же нельзя (подкрячивание exe-шников в качестве средства не рассматривается) Зато можно навесить хук на всю аксапту и обрабатывать в нем допустим все WM_CLICKED как заблагорассудится. Пишите dll c хуком например на VC++, загружаете ее и вперед с песней.

Только еще раз - а зачем все это?
Старый 07.06.2006, 19:31   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
блин, и здесь про универсальное программирование...
Не очень понимаю, зачем это вам надо.

Но скорее всего, вы не сможете сделать задуманное вами средствами Аксапты.

Если вам действительно нужно решить вашу задачу вашими средствами, то скорее всего надо рыть в сторону работы с хандлерами окон на уровне windows...
__________________
полезное на axForum, github, vk, coub.
Старый 07.06.2006, 19:31   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от db
Только еще раз - а зачем все это?
Ап-солютно согласен.
__________________
полезное на axForum, github, vk, coub.
Старый 08.06.2006, 07:44   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от batiskaf_new
Спасибо, только я это уже читал, все это не то. Мне нужно из Аксапты (Х++) создать СОМ объект, и передать в метод этого обьекта ссылку на Х++ MyInsideAxaptaObject. Попробовал унаследовать MyInsideAxaptaObject class от класса СОМ, передавать объекты теперь можно, но в коде СОМ объекта эта ссылка почему то нулевая. Может нужно еще что то заимплементировать?
Насколько я знаю, такого делать нельзя. Колбеков в аксапте нет, кроме событий ActiveX объектов.
Старый 08.06.2006, 07:52   #16  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от batiskaf_new
Вобщем, мне нужно чтобы любая аппликация, которая бежит в Аксапте на клик по любой кнопке любого диалога, помимо пользовательского кода исполняла еще мой код, который отправит некоторую информацию в СОМ объект. При этом, изменений в пользовательстком коде делать не желательно, можно максимум один два обьекта построить при старте аппликации, или еще что то такое.
можно попробовать добавить что-то в SysSetupFormRun.run что средствами winapi будет отслеживать сообщения всем кнопкам. Или посмотреть не происходит ли чего нужного в методе task в это время.
Старый 08.06.2006, 12:55   #17  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
Сообщение от belugin
Насколько я знаю, такого делать нельзя. Колбеков в аксапте нет, кроме событий ActiveX объектов.
Есть сомнения. Для удобства я решил разделить тему на две, одна по СОМ вторая по GUI Event Model.
Старый 08.06.2006, 13:18   #18  
batiskaf_new is offline
batiskaf_new
Участник
 
39 / 19 (1) ++
Регистрация: 07.06.2006
Цитата:
Сообщение от db
Уж не знаю зачем Вам все это нужно. Может если расскажете зачем, то люди поскажут и как это реализовать.

Как уже говорилось - вставить свой код в методы системных классов нельзя. Заставить систему везде вместо инстансов FormButtonControl создавать инстансы MySuperButtonControl то же нельзя (подкрячивание exe-шников в качестве средства не рассматривается) Зато можно навесить хук на всю аксапту и обрабатывать в нем допустим все WM_CLICKED как заблагорассудится. Пишите dll c хуком например на VC++, загружаете ее и вперед с песней.

Только еще раз - а зачем все это?
Я уже писал для чего:
http://forum.mazzy.ru/index.php?showtopic=5695#

Мне нужно интегрировать в ядро Аксапта агента, который будет мне давать следующие сервисы:

1. Программа максимум - уметь подключаться к высокоуровневым сообщениям Аксапта контролов. WM_CLICKED меня не совсем устраивает, потому что я бы хотел знать точно что сделал user гридом, выбрал ячейку, выбрал строку, поменял значение ячейки, все эти вещи можно получить из нотификаций класса FormGridControl.
2. Если первое не возможно, тогда программа минимум - получить доступ к DataStructure каждого конкретного контрола. Написать хук на низкоуровневые сообщения можно, но иметь доступ к структуре данных того же грида, по которому кликают в любом случае нужно. Другими словами, мне нужно будет взять HWND из системного сообщения, подключиться к Аксапте, получить каким то образом по этому window handle ссылку на объект, который имплементирует это окно, и получить инфекс ячейки, которая была выбрана пользователем, получить содержимое ячейки, итерировать строки, столбцы, вобщем манипулировать со структурой данных. Для этих целей я думал воспользоваться СОМ, потому что вся эта информация нужна в той утилите, которая это все будет записывать в скрипте, то есть в QTP .

Если первый вариант не возможен ( в чем я лично сомневаюсь), тогда давайте обсуждать дальше только второй сценарий (программа минимум). Как мне получить через рефлексию список всех объектов типа FormGridControl, которые были созданы в системе на данный момент, далее я обойду весь список, сравню window handle и найду тот контрол, по которому кликнул пользователь, и смогу выяснить все подробности об этом объекте (допустим что проблема интерпроцесс комуникации через СОМ у меня уже решена) Или может есть возможность у какого то глобального объекта в системе спросить список всех созданных форм, пройти весь список, обойти все child controls, и найти таким образом мой грид по хеэндлу.

P.S>
Кстати, если можно поменять имплементацию SysSetupFormRun, то почему нельзя классы контролов менять, не понял?

Последний раз редактировалось batiskaf_new; 08.06.2006 в 13:26.
Старый 08.06.2006, 13:44   #19  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
есть системные закодированные на C++ объекты; есть классы которые реализованы на X++, которые являются наследником первых. (они обычно начинаются с Sys например, SysDictTable extends DictTable) не для всех классов они есть.

...
зачем обходить все активные контролы, когда можно взять
\Classes\Info\setLastActivatedForm и обойти только её
...
Еще можно сесть на таймер и отслеживать все что возникает
(пример http://belugin.info/sidax)
Старый 08.06.2006, 13:52   #20  
lagr221374
Гость
 
n/a
Цитата:
Сообщение от batiskaf_new
1. Программа максимум - уметь подключаться к высокоуровневым сообщениям Аксапта контролов. WM_CLICKED меня не совсем устраивает, потому что я бы хотел знать точно что сделал user гридом, выбрал ячейку, выбрал строку, поменял значение ячейки, все эти вещи можно получить из нотификаций класса FormGridControl.
Хук + ActiveX ( для связи в Axapta) однозначно.
Теги
crm2011

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX UK: Advanced Demand Management for AX 2009 workshops Blog bot DAX Blogs 0 28.03.2009 01:05
AX UK: Update on Advanced Demand Management for AX 2009 Blog bot DAX Blogs 0 26.03.2009 17:05
Solutions Monkey: WSS Setup for EP - Basic or Advanced Mode ? Blog bot DAX Blogs 0 23.08.2007 05:32
axaptabuilder: How to learn Axapta programming: “MorphXIT: an introduction to Axapta and the MorphX Development Suit” Blog bot DAX Blogs 0 28.10.2006 16:47
Advanced programming: Grid data and view manipulations batiskaf_new DAX: Программирование 15 21.06.2006 11:44
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:52.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.