AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 12.01.2009, 16:41   #1  
Dima_Dima ist offline
Dima_Dima
Участник
 
144 / 11 (1) +
Registriert seit: 09.10.2008
Можно ли программно определить, какая форма активная?
Всем здравствуйте, у меня вопрос: Существует ли способ программно определить, какая форма активная (открытая) и вытащить FormName? заранее спасибо!
Alt 12.01.2009, 16:48   #2  
Lucky13 ist offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Registriert seit: 21.10.2004
Существует. Метод InfoLog.parmLastActivatedForm().
This post has been rated by: Dima_Dima (1).
Alt 12.01.2009, 16:51   #3  
Lucky13 ist offline
Lucky13
Участник
1C
 
714 / 198 (8) ++++++
Registriert seit: 21.10.2004
Вытащить имя формы
X++:
infolog.parmLastActivatedForm().object().name();
Alt 12.01.2009, 16:53   #4  
ZVV ist offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1.006 / 246 (11) ++++++
Registriert seit: 13.02.2004
Ort: Минск
->
Zitat:
Zitat von Dima_Dima Beitrag anzeigen
Всем здравствуйте, у меня вопрос: Существует ли способ программно определить, какая форма активная (открытая) и вытащить FormName? заранее спасибо!
Не совсем понятно, уточните. Открытых форм в Аксапте одновременно может быть много. Какую из них? И на какой момент и в какойм месте вы хотите это определить?
И если не секрет, зачем это?
__________________
Zhirenkov Vitaly
Alt 12.01.2009, 17:14   #5  
Dima_Dima ist offline
Dima_Dima
Участник
 
144 / 11 (1) +
Registriert seit: 09.10.2008
Zitat:
Zitat von ZVV Beitrag anzeigen
Не совсем понятно, уточните. Открытых форм в Аксапте одновременно может быть много. Какую из них? И на какой момент и в какойм месте вы хотите это определить?
И если не секрет, зачем это?
Форма, которая активна. Или на которой сейчас мышь. Не секрет: чтобы открыть другое приложение в котором форма так-же называется как и в АХ.
Alt 13.01.2009, 14:08   #6  
Dima_Dima ist offline
Dima_Dima
Участник
 
144 / 11 (1) +
Registriert seit: 09.10.2008
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?

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

Храниться ли где-нибудь эта информация?
Alt 13.01.2009, 14:17   #7  
kashperuk ist offline
kashperuk
Участник
Benutzerbild von kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.361 / 2084 (78) +++++++++
Registriert seit: 30.05.2004
Ort: Atlanta, GA, USA
Zitat:
Zitat von Dima_Dima Beitrag anzeigen
Возможно ли с помощью класса Infolog (или другого) выяснить какие формы были открыты?

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

Храниться ли где-нибудь эта информация?
Нет, не хранится. Придется собирать эту информацию самому.
Возможно вот это чем-то поможет:
http://www.axaptapedia.com/DEV_Tabax..._RecentWindows
This post has been rated by: belugin (2), Dima_Dima (1).
Alt 13.01.2009, 14:17   #8  
belugin ist offline
belugin
Участник
Benutzerbild von belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.622 / 2925 (107) +++++++++
Registriert seit: 16.01.2004
Blog-Einträge: 5
у Ивана Кашперука был плагин для табакса для открытия предыдущих форм - общий принцип по таймеру запоминать их список


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

Geändert von belugin (13.01.2009 um 14:18 Uhr) Grund: duplicated
This post has been rated by: Gustav (2), Dima_Dima (1).
Alt 13.01.2009, 15:30   #9  
DSPIC ist offline
DSPIC
Боец
 
1.077 / 1243 (44) ++++++++
Registriert seit: 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-формы, не системные.
This post has been rated by: Dima_Dima (1).
Alt 19.01.2009, 12:35   #10  
petergunn ist offline
petergunn
Участник
 
118 / 279 (10) ++++++
Registriert seit: 30.08.2005
Ort: Tyumen
Zitat:
Zitat von Dima_Dima Beitrag anzeigen
Возможно ли с помощью класса 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 ) ) ;
}
This post has been rated by: Dima_Dima (1).
Alt 20.11.2009, 18:58   #11  
Sergey Petrov ist offline
Sergey Petrov
Участник
 
80 / 19 (1) ++
Registriert seit: 03.04.2007
Ort: Saint-Petersburg, Russia
А как быть с формами, которые в DAX2009 открываются в других (отдельных) окнах? Предложенный petergunn механизм отображает только заголовки форм, открытых в основном окне аксапты.
Alt 20.11.2009, 23:52   #12  
gl00mie ist offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.684 / 5813 (201) ++++++++++
Registriert seit: 28.11.2005
Ort: Москва
Blog-Einträge: 3
Zitat:
Zitat von Dima_Dima Beitrag anzeigen
Не секрет: чтобы открыть другое приложение в котором форма так-же называется как и в АХ.
Это не очень прояснило постановку задачи. Чего вы в итоге хотите? Если у вас есть возможность в "другом приложении" пускаться во все тяжкие ради поиска заголовка нужной формы или если вы можете повлиять на это приложение из Аксапты, то почему не воспользоваться в самой Аксапте какими-то более "прямыми" путями открытия формы? Может, ActiveX-элемент встроить в форму или .net-сборку подключить, если версия ядра Аксапты позволяет...

Geändert von gl00mie (20.11.2009 um 23:56 Uhr) Grund: дополнение
Alt 18.09.2014, 15:45   #13  
maldini ist offline
maldini
Участник
 
103 / 30 (2) +++
Registriert seit: 06.03.2007
Ort: москва
DAX 2012
Добрый день! Подскажите как в DAX 2012 определить запущена рабочая оболасть разработки или нет?
Alt 18.09.2014, 16:23   #14  
lvan ist offline
lvan
Участник
Benutzerbild von lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Registriert seit: 15.04.2011
Blog-Einträge: 1
а зачем? от того, запущена она или нет, ничего ведь не меняется.
Alt 18.09.2014, 16:54   #15  
maldini ist offline
maldini
Участник
 
103 / 30 (2) +++
Registriert seit: 06.03.2007
Ort: москва
Zitat:
Zitat von lvan Beitrag anzeigen
а зачем? от того, запущена она или нет, ничего ведь не меняется.
Может я не правильным путем иду, но в рабочей области на форме есть кнопка которая через TreeNode.AOTRun() открывает форму AOT. Она открывается не в рабочей области разработки и соответственно с ней работать нельзя.Надо открывать AOT сразу в среде разработки, а вот как это сделать не пойму. Вернее можно открыть разработческую среду и в ней AOT но вот при следующем нажатии на кнопку надо как то проверять запущена она или нет, чтобы еще раз не запускать.
Alt 18.09.2014, 17:06   #16  
oip ist offline
oip
Axapta
Лучший по профессии 2014
 
2.564 / 1416 (53) ++++++++
Registriert seit: 28.11.2005
Blog-Einträge: 1
Проверить, если ли панель ContеntPane или нет.

X++:
HWND contentPane = WinApi::findWindowEx(WinAPI::findWindowEx(infolog.hWnd(), 0, 'MDIClient', ''), 0, 'ContentFrame', '');
This post has been rated by: maldini (1).
Alt 18.09.2014, 17:38   #17  
maldini ist offline
maldini
Участник
 
103 / 30 (2) +++
Registriert seit: 06.03.2007
Ort: москва
Zitat:
Zitat von oip Beitrag anzeigen
Проверить, если ли панель ContеntPane или нет.

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

Geändert von maldini (19.09.2014 um 09:09 Uhr)
Stichworte
axapta, faq, форма

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Можно ли определить что запись была сторнирована ? 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 02:32 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.