12.01.2009, 16:41 | #1 |
Участник
|
Можно ли программно определить, какая форма активная?
Всем здравствуйте, у меня вопрос: Существует ли способ программно определить, какая форма активная (открытая) и вытащить FormName? заранее спасибо!
|
|
12.01.2009, 16:48 | #2 |
Участник
|
Существует. Метод InfoLog.parmLastActivatedForm().
|
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
12.01.2009, 16:51 | #3 |
Участник
|
Вытащить имя формы
X++: infolog.parmLastActivatedForm().object().name(); |
|
12.01.2009, 16:53 | #4 |
MCITP
|
Цитата:
И если не секрет, зачем это?
__________________
Zhirenkov Vitaly |
|
12.01.2009, 17:14 | #5 |
Участник
|
Форма, которая активна. Или на которой сейчас мышь. Не секрет: чтобы открыть другое приложение в котором форма так-же называется как и в АХ.
|
|
13.01.2009, 14:08 | #6 |
Участник
|
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?
X++: infolog.parmLastActivatedForm().object().name() Храниться ли где-нибудь эта информация? |
|
13.01.2009, 14:17 | #7 |
Участник
|
Цитата:
Сообщение от Dima_Dima
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?
X++: infolog.parmLastActivatedForm().object().name() Храниться ли где-нибудь эта информация? Возможно вот это чем-то поможет: http://www.axaptapedia.com/DEV_Tabax..._RecentWindows |
|
|
За это сообщение автора поблагодарили: belugin (2), Dima_Dima (1). |
13.01.2009, 14:17 | #8 |
Участник
|
у Ивана Кашперука был плагин для табакса для открытия предыдущих форм - общий принцип по таймеру запоминать их список
P.S. Gustav: взял на себя модераторскую смелость восстановить сообщение Максима, которое он удалил, посчитав его дублированием. Считаю, что пост содержит хорошую сжатую фразу "общий принцип по таймеру запоминать их список" (т.е. уже вкратце представляешь себе механизм еще до начала изучения кода Ивана). Последний раз редактировалось belugin; 13.01.2009 в 14:18. Причина: duplicated |
|
|
За это сообщение автора поблагодарили: Gustav (2), Dima_Dima (1). |
13.01.2009, 15:30 | #9 |
Боец
|
Можно обойтись и без сторонних плагинов, например встроиться в метод new класса SysSetupFormRun:
X++: public void run() { super(); // 13.01.09 DSPIC --> info (strfmt("Activated: %1", this.design().caption())); // 13.01.09 DSPIC <-- } Правда в этом случае, будут фиксироваться только formRun-формы, не системные. |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
19.01.2009, 12:35 | #10 |
Участник
|
Цитата:
В качестве примера вот что получилось для DAx 4.0, с учетом дополнительно открытых рабочих областей: X++: static void jbShowAxWindowList(Args _args) { DLLFunction dllFunctionIsWindowVisible ; DLLFunction dllFunctionGetClassName ; container conWorkspaceListWnd ; Counter counterWorkspace ; Counter counterWindowTotal ; HWND hWndAxWorkspace ; #define.WorkspaceView(0) // 0 - all workspaces, 1 - only current workspace #define.UserDLL( 'USER32' ) #WinAPI str getClassName( HWND _hWnd ) // Win32 API GetClassName function { #define.nMaxCount(512) DLL dllUser ; Binary binaryClassName = new Binary( #nMaxCount *2 ) ; ; if( !dllFunctionGetClassName ) { dllUser = new DLL( #UserDLL ) ; dllFunctionGetClassName = new DLLFunction( dllUser, 'GetClassNameW' ) ; dllFunctionGetClassName.returns( ExtTypes::DWord ) ; dllFunctionGetClassName.arg( ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord ) ; } if( !dllFunctionGetClassName.call( _hWnd, binaryClassName, #nMaxCount ) ) return '' ; return binaryClassName.wString( 0 ) ; } boolean isWindowVisible( HWND _hWnd ) // Win32 API IsWindowVisible function { DLL dllUser ; ; if( !dllFunctionIsWindowVisible ) { dllUser = new DLL( #UserDLL ) ; dllFunctionIsWindowVisible = new DLLFunction( dllUser, 'IsWindowVisible' ) ; dllFunctionIsWindowVisible.returns( ExtTypes::Word ) ; dllFunctionIsWindowVisible.arg( ExtTypes::DWord ) ; } return dllFunctionIsWindowVisible.call( _hWnd ) ; } Counter showWorkspaceVisibleWindowList( HWND _hWndWorkspace, int _workspaceNum = 0 ) { HWND hWndClientMDI ; HWND hWndAxMDI ; HWND hWndAxPane ; TempStr tempStr ; IdentifierName objectName ; Name workSpaceName ; Counter counterWindow ; System.Text.RegularExpressions.Match sysMatch; #define.MdiClientWndClass('MDIClient') #define.AxMainFrameWndClassName('AxMainFrame') #define.AxMdiChildWndClassName('AxMDIChildWindow') #define.AxPaneWndClassName('AxPaneWnd') ; if( getClassName( _hWndWorkspace ) != #AxMainFrameWndClassName ) throw error( strfmt( "Invalid class name of window %1", _hWndWorkspace ) ) ; workSpaceName = WinAPI::getWindowText( _hWndWorkspace ) ; setprefix( workSpaceName ) ; if( !_workspaceNum && workSpaceName ) // if '_workspaceNum' not specified (=0), try get him from main window caption { sysMatch = System.Text.RegularExpressions.Regex::Match( workSpaceName, @'\d+' ) ; if( sysMatch.get_Success() ) { tempStr = sysMatch.get_Value() ; _workspaceNum = str2int( tempStr ) ; } } hWndClientMDI = WinApi::findWindowEx( _hWndWorkspace, 0, #MdiClientWndClass, '' ) ; hWndAxMDI = WinApi::findWindowEx( hWndClientMDI, 0, #AxMdiChildWndClassName, '' ); while( hWndAxMDI ) { if( isWindowVisible( hWndAxMDI ) ) { hWndAxPane = WinAPI::findWindowEx( hWndAxMDI, 0, #AxPaneWndClassName, '' ) ; objectName = WinAPI::getWindowText( hWndAxPane ) ; // try get 'internal' formRun name counterWindow++ ; info( strfmt( "%1%2%3%4 [HWND: %5]", _workspaceNum ? int2str( _workspaceNum ) + ' - ' : '', objectName, objectName ? ' : ' : '', WinAPI::getWindowText( hWndAxMDI ), hWndAxMDI ) ) ; } hWndAxMDI = WinAPI::getWindow( hWndAxMDI, #GW_HWNDNEXT ) ; // next AxMDI window } return counterWindow ; } ; info( "Dynamics AX window list" ) ; #if.WorkspaceView(0) // all workspaces conWorkSpaceListWnd = infolog.getWorkspaceList() ; for( counterWorkspace = 1; counterWorkspace <= conlen( conWorkSpaceListWnd ); counterWorkspace++ ) { hWndAxWorkspace = conpeek( conWorkSpaceListWnd, counterWorkspace ) ; counterWindowTotal += showWorkspaceVisibleWindowList( hWndAxWorkspace ) ; } #endif // WorkspaceView(0) #if.WorkspaceView(1) // only current workspace counterWindowTotal = showWorkspaceVisibleWindowList( infolog.hWnd( xInfo::currentWorkspaceNum() ), xInfo::currentWorkspaceNum() ) ; #endif // WorkspaceView(1) info( strfmt( "Listed %1 windows", counterWindowTotal ) ) ; } |
|
|
За это сообщение автора поблагодарили: Dima_Dima (1). |
20.11.2009, 18:58 | #11 |
Участник
|
А как быть с формами, которые в DAX2009 открываются в других (отдельных) окнах? Предложенный petergunn механизм отображает только заголовки форм, открытых в основном окне аксапты.
|
|
20.11.2009, 23:52 | #12 |
Участник
|
Это не очень прояснило постановку задачи. Чего вы в итоге хотите? Если у вас есть возможность в "другом приложении" пускаться во все тяжкие ради поиска заголовка нужной формы или если вы можете повлиять на это приложение из Аксапты, то почему не воспользоваться в самой Аксапте какими-то более "прямыми" путями открытия формы? Может, ActiveX-элемент встроить в форму или .net-сборку подключить, если версия ядра Аксапты позволяет...
Последний раз редактировалось gl00mie; 20.11.2009 в 23:56. Причина: дополнение |
|
18.09.2014, 15:45 | #13 |
Участник
|
DAX 2012
Добрый день! Подскажите как в DAX 2012 определить запущена рабочая оболасть разработки или нет?
|
|
18.09.2014, 16:23 | #14 |
Участник
|
а зачем? от того, запущена она или нет, ничего ведь не меняется.
|
|
18.09.2014, 16:54 | #15 |
Участник
|
Может я не правильным путем иду, но в рабочей области на форме есть кнопка которая через TreeNode.AOTRun() открывает форму AOT. Она открывается не в рабочей области разработки и соответственно с ней работать нельзя.Надо открывать AOT сразу в среде разработки, а вот как это сделать не пойму. Вернее можно открыть разработческую среду и в ней AOT но вот при следующем нажатии на кнопку надо как то проверять запущена она или нет, чтобы еще раз не запускать.
|
|
18.09.2014, 17:06 | #16 |
Axapta
|
Проверить, если ли панель ContеntPane или нет.
X++: HWND contentPane = WinApi::findWindowEx(WinAPI::findWindowEx(infolog.hWnd(), 0, 'MDIClient', ''), 0, 'ContentFrame', ''); |
|
|
За это сообщение автора поблагодарили: maldini (1). |
18.09.2014, 17:38 | #17 |
Участник
|
|
|
19.09.2014, 08:55 | #18 |
Участник
|
Но возникла еще проблема. Например есть 2 рабочих области, как в нужной мне открыть объект AOD. Я уже все перепробовал, но ничего не получается. Все время открывается в той области в которой я запускаю код.
Как то глючено работает, например если AOD с проектом будет открыт в рабочей области не для разработки, то нажатие на проект в рабочей области разработки активирует форму AOD в рабочей области не для разработки, и открыть его в разработке не выходит. Последний раз редактировалось maldini; 19.09.2014 в 09:09. |
|