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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.01.2009, 15:59   #1  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
DAX 4.0: infolog & workspaceNum
Для начала небольшая симуляция в качестве разминки: запускаем клиент Dynamics AX 4.0 и открываем из него дополнительно 2 рабочие области.
Закрываем рабочую область с номером 2 - таким образом остаются 2 окна: 'Microsoft Dynamics AX - 1...' и 'Microsoft Dynamics AX - 3...' (с 'дыркой' в последовательности).

Не запуская приведенный ниже job попробуйте ответить что будет выведено в infolog: количество строк и текст?
X++:
static void jbEnumerateWorkspace(Args _args)
{
    HWND    hWndWorkspace   ;
    int     workspaceNum    ;
    
    #define.WorkspaceCount(3)
    ;
    
    try
    {
        for( workspaceNum =1 ; workspaceNum <=#WorkspaceCount; workspaceNum++ )
        {
            info( strfmt( "Workspace num: %1", workspaceNum ) ) ;
            hWndWorkspace = infolog.hWnd( workspaceNum ) ;
            info( hWndWorkspace ? strfmt( "Workspace HWND: %1", hWndWorkspace) : "Workspace HWND: oops :(" ) ;
        }
    }
    catch
    {
        info( strfmt( "catched in %1", funcname() ) ) ;
    }

    info( 'finished' ) ;
}
Теперь запускаем job и можно проверить свои выводы.
Тестировалось на 2 приложениях: kernel version 4.0.2163.0 и kernel version 4.0.2501.116

Результат, который был получен в infolog на этих релизах:
Цитата:
Workspace num: 1
Workspace HWND: 1234567
Workspace num: 2
т.е. вызов infolog.hWnd(...) на второй итерации цикла с номером несуществующей (закрытой уже) рабочей области привел к 'аварийному' завершению выполнения прикладного кода, при этом эта ситуация не была перехвачена в блоке catch. Аналогичная ситуация с вызовом другой функции ожидающей в качестве параметра workspaceNum: infolog.taskPane( ... ) (отличие - infolog.taskPane( 0 ) отрабатывает корректно)

С 'наскоку' не обнаружил в DAX 4.0 штатной функциональности позволяющей проверить валидность workspaceNum или получить их текущий набор (функция infolog.getWorkspaceList() возвращает контейнер с HWND открытых рабочих областей)

P.S. Склонен отнести это bug'ам если приведенный сценарий воспроизводится и на более поздних версиях kernel Dynamics Ax 4.0.
За это сообщение автора поблагодарили: kashperuk (3).
Старый 21.01.2009, 17:50   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Так а чем не устроил getWorkspaceList()? Он как раз и возвращает набор валидных workspace
Распарси getWindowText() и получишь номер
Старый 22.01.2009, 09:51   #3  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Так а чем не устроил getWorkspaceList()? Он как раз и возвращает набор валидных workspace
Распарси getWindowText() и получишь номер
Рассматривал ранее такой вариант как work around
Парсить getWindowText() (ориентироваться на текст заголовка окна) не самый лучший выход, если взять во внимание обстоятельство что заголовок окна мог быть изменен произвольным образом без сохранения штатного 'шаблона' информации, например в workspaceWindowCreated() или внешним кодом - в этом случае полезной (однозначной) информации из него не определить.

Цитата:
Сообщение от kashperuk
... Я не полностью согласен, что это баг, правда
Все же, в качестве результата выполнения функции infolog.hWnd(<некорректный workspaceNum>) можно было бы ожидать 0 (по аналогии с NULL как результат в функциях Win32) или выброс исключения который бы перехватывался в блоке catch. Это давало бы возможность для дальнейшего анализа и принятия решения в коде.
Старый 22.01.2009, 11:32   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Я создал это как баг в нашей системе, и уже сделали фикс. Теперь будет возвращать 0 в случае, если workspace закрыли. (ну, и в других случаях, когда handle окна некорректен)
Правда backportить это на пред. релизы врядли будут. Сорри.
Но, еще раз спасибо за то, что сообщили об этом.
Теги
infolog, hwnd, ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DAX 2K9 & EP: Cookies, SOS! DSPIC DAX: Программирование 0 25.11.2008 11:19
Почему отказались от InventJournalVoucher в DAX 3.0 & 4.0 aidsua DAX: Функционал 0 20.05.2008 12:26
dax-lessons: Problem when creating a dynamic form with ActiveX control & Solution :) Blog bot DAX Blogs 0 30.04.2008 16:05
Сориентируйте в направлении куда копать...DAX 4. Report&Query проверка связи DAX: Программирование 0 28.01.2008 13:17
infolog.getImportedNode() в DAX 4.0 Masia DAX: Программирование 4 24.05.2007 22:29
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:04.