30.05.2008, 16:00 | #21 |
Участник
|
Притом что это он и есть. Только жутко древний.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
30.05.2008, 16:05 | #22 |
Участник
|
|
|
30.05.2008, 16:21 | #23 |
Участник
|
Да, работает.
Закройте все клиенты. Запустите reg.bat. Попробуйте перекомпилировать все обьекты к нему относящиеся. Проверьте EditorScripts класс - дописали ли вы там метод showScripts. Должно сработать. Проект для 3ки.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
30.05.2008, 16:33 | #24 |
Участник
|
Ну вот появляется формочку пустая.
В showScripts пробовал и X++: if(AxAssistSingleton::getThisClass().parmAltMEmulate()) { AxAssistSingleton::getThisClass().parmEditor(e); AxAssistSingleton::getThisClass().parmAltMEmulate(false); return; } X++: if(AxAssistSingleton::getThisClass().parmAltMEmulate()) { AxAssistSingleton::getThisClass().parmEditor(e); return; } |
|
30.05.2008, 16:39 | #25 |
Участник
|
Компонент регистрировали ДО этого? С закрыванием Аксы.
Попробуйте работает ли ActiveX Explorer. Должно быть так (тулбар в эдиторе):
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
30.05.2008, 16:51 | #26 |
Участник
|
Цитата:
В тулбаре ничего не изменилось. Захожу в метод showScripts появились кнопки. Похоже закэшировался Editor. Закрываю форму кнопки остались. Так а смысл то в чём. Какая практическая ценность таких телодвижений. Изначально я думал открываешь форму на ней кнопки. |
|
30.05.2008, 17:05 | #27 |
Участник
|
Цитата:
С данной задачей форма справляется.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
20.06.2008, 16:01 | #28 |
Боец
|
Хотелось бы с автором AxAssist, а также с остальными участниками поделится ещё одним способом отлова объекта Editor. Суть его заключается в использовании стандартной формы SysEditorGotoLine, которая вызывается при правке кода нажатием Ctrl+G и в которую kernel передаёт объект Editor’а.
1. Итак, каждый раз, когда мы хотим получить Editor, мы посылаем активному редактору WinMsg аналогичное нажатию Ctrl+G, после чего у нас активизируется форма sysEditorGotoLine, с уже переданным туда объектом Editor, где мы, собственно его и получаем. 2. Конечно же, видеть форму SysEditorGotoLine нам не нужно, да и ломать её не хочется. Решение – создать класс – наследник от FormRun, у которого убрать вызовы super() в методах init(), run(). Добавить методы, которые вызываются kernel’ем при использовании оригинальной формы: editor(), showForm(). В этом классе и будет жить наш editor, c которым мы можем что-нибудь делать. 3. Далее остается только заставить систему думать, что наш класс – это форма SysEditorGotoLine. Делается это в классе ClassFactory\formRunClassOnClient, - точка входа для старта всех форм в Axapta(в идеале ), в которую в объекте Args передается имя формы, которая стартует. Здесь мы и возвращаем не стандартный new SysSetupFormRun(), а new НашКласс(), по условию: _args.name() = formstr(SysEditorGotoLine); Данная функциональность проверена и работоспособна. Написано для реализации дополнительных HotKeys при написании кода. Есть правда один недостаток – мы лишаемся формы SysEditorGotoLine, но за всю свою практику мне не пришлось ею воспользоваться ни разу. Достоинство – изменение только одной строки в стандартном методе ClassFactory\formRunClassOnClient. Этот подход должен избавить от необходимости правки методов класса EditorScripts для AxAssist. Надеюсь - это пригодится. |
|
|
За это сообщение автора поблагодарили: aidsua (1), Alex_KD (1), alex55 (1), nano3 (1). |
23.06.2008, 13:12 | #29 |
Участник
|
Цитата:
Есть правда один недостаток...
Данная методика в AxAssist работает - работоспособность стандартного меню по ALT+M не нарушается. Думаю этот вариант как альтернатива. Идеально было бы вообще не трогая стандартный ф-л получить Editor e. В любом случае - спасибо
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
23.06.2008, 22:50 | #30 |
Administrator
|
Цитата:
Эта "одна" строчка задевает системный класс Classfactory. А правка системных классов - куда более опасна и напряжна с т.з. дальнейшей поддержки приложения. Если не будет компилироваться один из системных классов (Info, Application, Classfactory) - то есть шанс вообще не запустить приложение. В то же время - ошибки в EditorScripts не будут настолько критичны для запуска приложения. Поэтому уменьшение кол-во правок в предлагаемой альтернативе - на самом деле (с моей т.з.) наоброт - более опасно, нежели модификация EditorScripts. Те же слова можно сказать при попытке правки класса SysSetupFormRun, т.к. он инициализируется для каждой формы.
__________________
Возможно сделать все. Вопрос времени |
|
24.06.2008, 12:26 | #31 |
Боец
|
Цитата:
А правка системных классов - куда более опасна и напряжна с т.з. дальнейшей поддержки приложения.
X++: if( args.name() = formstr(SysEditorGotoLine)) return new () Ну а вообще, если у разработчика будут кривые руки, то тут уж "против лома нет приема..." |
|
26.06.2008, 16:48 | #32 |
Боец
|
Цитата:
Идеально было бы вообще не трогая стандартный ф-л получить Editor e.
Пропатчить клиентский файл Ax32.exe: Открыть его в HEX редакторе, найти имя формы в формате Unicode "SysEditorGotoLine" и заменить на ту что нам нужно. (только длина имени должна остаться такой же). Ещё как идея, если хватит ума, и если возможно, то же самое сделать динамически с образом этого ехe в памяти. Но стоит ли овчинка выделки... |
|
26.06.2008, 16:59 | #33 |
Участник
|
Цитата:
Сообщение от DSPIC
И так можно, если опустить моральный аспект подхода.
Пропатчить клиентский файл Ax32.exe: Открыть его в HEX редакторе, найти имя формы в формате Unicode "SysEditorGotoLine" и заменить на ту что нам нужно. (только длина имени должна остаться такой же). Ещё как идея, если хватит ума, и если возможно, то же самое сделать динамически с образом этого ехe в памяти. Но стоит ли овчинка выделки... И потом это противоречит лицензионным условиям.
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0 |
|
26.06.2008, 17:06 | #34 |
Боец
|
Цитата:
И потом это противоречит лицензионным условиям.
Цитата:
В экзашники не будет никаких форм.
|
|
31.08.2009, 12:19 | #35 |
Участник
|
Цитата:
Сообщение от DSPIC
2. Конечно же, видеть форму SysEditorGotoLine нам не нужно, да и ломать её не хочется. Решение – создать класс – наследник от FormRun, у которого убрать вызовы super() в методах init(), run(). Добавить методы, которые вызываются kernel’ем при использовании оригинальной формы: editor(), showForm(). В этом классе и будет жить наш editor, c которым мы можем что-нибудь делать.
Есть правда один недостаток – мы лишаемся формы SysEditorGotoLine, но за всю свою практику мне не пришлось ею воспользоваться ни разу. Достоинство – изменение только одной строки в стандартном методе ClassFactory\formRunClassOnClient. Этот подход должен избавить от необходимости правки методов класса EditorScripts для AxAssist. Надеюсь - это пригодится. ЗЫ Я editor храню в infolog, как где-то тут описано было. ClassFactory не менял. Последний раз редактировалось Denicce; 31.08.2009 в 12:21. |
|
31.08.2009, 13:25 | #36 |
Боец
|
Цитата:
Сообщение от Denicce
можно и не лишаться формы. Я через globalCache() храню признак запуска Alt+M из класса-плугина Табакса и анализирую его в EditorScripts.getApplicableScripts(). Если вкл., то тут же return, иначе - стандартная обработка. Думаю, аналогично и в случае формы перехода к строке можно сделать.
ЗЫ Я editor храню в infolog, как где-то тут описано было. ClassFactory не менял.
|
|
03.11.2009, 13:04 | #37 |
Возьми свет!!!
|
Цитата:
все было это сделано для класса который постоянно торчит в памяти и при нажатию на нек. кнопку вставляет в код комментарий с именем пользователя и датой X++: void sendMessage() { #WinAPI int i=infolog.hWnd(); ; i = WinAPI::findWindowEx(i,0,"MDIClient",""); i = WinAPI::findWindowEx(i,0,"AxMDIChildWindow",""); i = WinAPI::findWindowEx(i,0,"AxEdTabCtrl",""); i = WinAPI::findWindowEx(i,0,"AxPaneWnd",""); WinAPI::sendMessageEx(i,#WM_SYSKEYDOWN,0x4D,0x20320001); WinAPI::sendMessageEx(i,#WM_SYSCHAR,0x6D,0x20320001); WinAPI::sendMessageEx(i,#WM_SYSKEYUP,0x4D,0xF0320001); } void sendMessageEscMessage() { #WinAPI int i=infolog.hWnd(); ; i = WinAPI::findWindowEx(i,0,"MDIClient",""); i = WinAPI::findWindowEx(i,0,"AxMDIChildWindow",""); i = WinAPI::findWindowEx(i,0,"AxEdTabCtrl",""); i = WinAPI::findWindowEx(i,0,"AxPaneWnd",""); WinAPI::sendMessageEx(i,0x7EE,0,0x00CA00E0); } infolog.globalCache.set() Последний раз редактировалось Murlin; 03.11.2009 в 13:07. |
|
|
За это сообщение автора поблагодарили: alex55 (1). |
Теги |
download, editor script, полезное, axapta |
|
|