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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2009, 16:41   #1  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Можно ли программно определить, какая форма активная?
Всем здравствуйте, у меня вопрос: Существует ли способ программно определить, какая форма активная (открытая) и вытащить FormName? заранее спасибо!
Старый 12.01.2009, 16:48   #2  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Существует. Метод InfoLog.parmLastActivatedForm().
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 12.01.2009, 16:51   #3  
Lucky13 is offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Регистрация: 21.10.2004
Вытащить имя формы
X++:
infolog.parmLastActivatedForm().object().name();
Старый 12.01.2009, 16:53   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от Dima_Dima Посмотреть сообщение
Всем здравствуйте, у меня вопрос: Существует ли способ программно определить, какая форма активная (открытая) и вытащить FormName? заранее спасибо!
Не совсем понятно, уточните. Открытых форм в Аксапте одновременно может быть много. Какую из них? И на какой момент и в какойм месте вы хотите это определить?
И если не секрет, зачем это?
__________________
Zhirenkov Vitaly
Старый 12.01.2009, 17:14   #5  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от ZVV Посмотреть сообщение
Не совсем понятно, уточните. Открытых форм в Аксапте одновременно может быть много. Какую из них? И на какой момент и в какойм месте вы хотите это определить?
И если не секрет, зачем это?
Форма, которая активна. Или на которой сейчас мышь. Не секрет: чтобы открыть другое приложение в котором форма так-же называется как и в АХ.
Старый 13.01.2009, 14:08   #6  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?

X++:
infolog.parmLastActivatedForm().object().name()
- даёт информацию о последней открытой форме. А если есть надобность выяснить имя предпоследней открытой формы? т.е. имя формы, по которой я хлопнул мышкой в предпоследний раз. и т.д.

Храниться ли где-нибудь эта информация?
Старый 13.01.2009, 14:17   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от 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  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
у Ивана Кашперука был плагин для табакса для открытия предыдущих форм - общий принцип по таймеру запоминать их список


P.S. Gustav: взял на себя модераторскую смелость восстановить сообщение Максима, которое он удалил, посчитав его дублированием. Считаю, что пост содержит хорошую сжатую фразу "общий принцип по таймеру запоминать их список" (т.е. уже вкратце представляешь себе механизм еще до начала изучения кода Ивана).

Последний раз редактировалось belugin; 13.01.2009 в 14:18. Причина: duplicated
За это сообщение автора поблагодарили: Gustav (2), Dima_Dima (1).
Старый 13.01.2009, 15:30   #9  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Можно обойтись и без сторонних плагинов, например встроиться в метод new класса SysSetupFormRun:

X++:
public void run()
{
    super();

    // 13.01.09 DSPIC -->
    info (strfmt("Activated: %1", this.design().caption()));
    // 13.01.09 DSPIC <--
}
А ещё у каждой формы есть уникальный в рамках "монитора" hWnd: formRun.hWnd(), с помощью которого, например, можно мониторить открытия\закрытия форм в разрезе пользователей в реальном времени - т.е. шпионить за пользователями.
Правда в этом случае, будут фиксироваться только formRun-формы, не системные.
За это сообщение автора поблагодарили: Dima_Dima (1).
Старый 19.01.2009, 12:35   #10  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от Dima_Dima Посмотреть сообщение
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?
...
А если есть надобность выяснить имя предпоследней открытой формы?
...
Если интересуют только заголовки открытых в Ax окон, подобно тому что отображается в форме 'Выбрать окно' (меню Окно\Окна...), то можно средствами Win32 API перебрать дочерние MDI окна приложения.

В качестве примера вот что получилось для 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  
Sergey Petrov is offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Регистрация: 03.04.2007
Адрес: Saint-Petersburg, Russia
А как быть с формами, которые в DAX2009 открываются в других (отдельных) окнах? Предложенный petergunn механизм отображает только заголовки форм, открытых в основном окне аксапты.
Старый 20.11.2009, 23:52   #12  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Dima_Dima Посмотреть сообщение
Не секрет: чтобы открыть другое приложение в котором форма так-же называется как и в АХ.
Это не очень прояснило постановку задачи. Чего вы в итоге хотите? Если у вас есть возможность в "другом приложении" пускаться во все тяжкие ради поиска заголовка нужной формы или если вы можете повлиять на это приложение из Аксапты, то почему не воспользоваться в самой Аксапте какими-то более "прямыми" путями открытия формы? Может, ActiveX-элемент встроить в форму или .net-сборку подключить, если версия ядра Аксапты позволяет...

Последний раз редактировалось gl00mie; 20.11.2009 в 23:56. Причина: дополнение
Старый 18.09.2014, 15:45   #13  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
DAX 2012
Добрый день! Подскажите как в DAX 2012 определить запущена рабочая оболасть разработки или нет?
Старый 18.09.2014, 16:23   #14  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
856 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
а зачем? от того, запущена она или нет, ничего ведь не меняется.
Старый 18.09.2014, 16:54   #15  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от lvan Посмотреть сообщение
а зачем? от того, запущена она или нет, ничего ведь не меняется.
Может я не правильным путем иду, но в рабочей области на форме есть кнопка которая через TreeNode.AOTRun() открывает форму AOT. Она открывается не в рабочей области разработки и соответственно с ней работать нельзя.Надо открывать AOT сразу в среде разработки, а вот как это сделать не пойму. Вернее можно открыть разработческую среду и в ней AOT но вот при следующем нажатии на кнопку надо как то проверять запущена она или нет, чтобы еще раз не запускать.
Старый 18.09.2014, 17:06   #16  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Проверить, если ли панель ContеntPane или нет.

X++:
HWND contentPane = WinApi::findWindowEx(WinAPI::findWindowEx(infolog.hWnd(), 0, 'MDIClient', ''), 0, 'ContentFrame', '');
__________________
С уважением,
Олег.
За это сообщение автора поблагодарили: maldini (1).
Старый 18.09.2014, 17:38   #17  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Цитата:
Сообщение от oip Посмотреть сообщение
Проверить, если ли панель ContеntPane или нет.

X++:
HWND contentPane = WinApi::findWindowEx(WinAPI::findWindowEx(infolog.hWnd(), 0, 'MDIClient', ''), 0, 'ContentFrame', '');
Спасибо, это то что я искал.
Старый 19.09.2014, 08:55   #18  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
Но возникла еще проблема. Например есть 2 рабочих области, как в нужной мне открыть объект AOD. Я уже все перепробовал, но ничего не получается. Все время открывается в той области в которой я запускаю код.
Как то глючено работает, например если AOD с проектом будет открыт в рабочей области не для разработки, то нажатие на проект в рабочей области разработки активирует форму AOD в рабочей области не для разработки, и открыть его в разработке не выходит.

Последний раз редактировалось maldini; 19.09.2014 в 09:09.
Теги
axapta, faq, форма

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно ли определить что запись была сторнирована ? zZ_TOP_Zz DAX: Функционал 4 31.05.2007 17:55
Программно добавить поле Salha DAX: Программирование 4 22.03.2007 11:12
Как программно установить DataSource DIron DAX: Программирование 2 10.01.2007 13:08
Работа с диалогом программно (новичок) Pavel Pustovalov DAX: Программирование 7 10.08.2004 11:51
Что и как можно резать? George Nordic DAX: Администрирование 1 11.05.2004 18:44
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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