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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2009, 17:14   #1  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Цитата:
Сообщение от ZVV Посмотреть сообщение
Не совсем понятно, уточните. Открытых форм в Аксапте одновременно может быть много. Какую из них? И на какой момент и в какойм месте вы хотите это определить?
И если не секрет, зачем это?
Форма, которая активна. Или на которой сейчас мышь. Не секрет: чтобы открыть другое приложение в котором форма так-же называется как и в АХ.
Старый 13.01.2009, 14:08   #2  
Dima_Dima is offline
Dima_Dima
Участник
 
144 / 11 (1) +
Регистрация: 09.10.2008
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?

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

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

Последний раз редактировалось gl00mie; 20.11.2009 в 23:56. Причина: дополнение
Старый 18.09.2014, 15:45   #8  
maldini is offline
maldini
Участник
 
103 / 30 (2) +++
Регистрация: 06.03.2007
Адрес: москва
DAX 2012
Добрый день! Подскажите как в DAX 2012 определить запущена рабочая оболасть разработки или нет?
Теги
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, время: 03:06.