В ходе глобального рефакторинга кода в Microsoft Dynamics AX 2009 изменились и классы семейства SysOperationProgress. Но к сожалению, и в исходной версии dax2009, и в первом сервис-паке пропущены досадные погрешности в программировании классов SysOperationProgress и SysOperationProgressForm. В этой статье попытаемся улучшить ProgressBar. К сожалению, в этой версии Аксапты не все так просто как в прошлых.

Комфортный ProgressBar в Dynamics AX 2009

Как я уже говорил в прошлой статье, что стандартный ProgressBar был создан когда гайды диктовали делать окна такими, чтобы они умещались в размер 640х480 пикселей. С тех пор прошло много времени, а дизайн и поведение ProgressBar'а не менялись. А самое главное - стандартный ProgressBar по прежнему очень узкий, хотя современные мониторы стали достаточно широкими.

Как и раньше, узкий ProgressBar скрывает массу полезной информации. Да, в версии dax2009 разработчики постарались сделать так, чтобы длинный текст автоматически расширял высоту формы. Но во-первых, такое поведение в узких формах все равно неудобно. А во-вторых, при работе с Windows Vista и Windows 7 форма отрисовывывается неправильно. Попробуем решить эти проблемы.

Делаем ProgressBar широким

Исправленные классы SysOperationProgress и SysOperationProgressForm в AOTВ версии dax2009 разработчики избавились от констант в теле метода SysOperationProgressForm.setupForm. Теперь в этом классе есть статический метод getDefaultTextLength(), который по-умолчанию возвращает 40 символов. Казалось бы, вот оно! Исправляем на 100 символов. Ура? Нет, не работает!

Разбираемся. Оказывается разработчики сделали типичную ошибку, объявив метод не на том уровне. Оказывается теперь "магические константы" присуствуют в классе SysOperationProgress, в методах new, newGeneral, newMultiBar.

Что ж берем в руки шашки и начинаем рефакторинг.

Во-первых, копируем метод getDefaultTextLength() в класс SysOperationProgress из класса SysOperationProgressForm.

static int getDefaultTextLength()
{
   return 100;
}

Во-вторых, исправляем метод getDefaultTextLength() в классе SysOperationProgressForm таким образом, чтобы он вызывал метод getDefaultTextLength() из класса SysOperationProgress.

static int getDefaultTextLength()
{
   return SysOperationProgress::getDefaultTextLength();
}

В третьих, исправляем методы new, newGeneral, newMultibar в классе SysOperationProgress так, чтобы параметры инициализировались не константой, а вызывали статический метод SysOperationProgress::getDefaultTextLength().

void new(
    int     numberOfBars = 1,
    boolean smoothProgress = false,
    int     textLength = SysOperationProgress::getDefaultTextLength() // Здесь была константа!!
    )
{
...

client server static SysOperationProgress newGeneral(
    Filename    animation,
    Caption     caption,
    int64       total,
    int         textLength = SysOperationProgress::getDefaultTextLength() // Здесь была константа!!
    )
{
...

client server static SysOperationProgress newMultiBar(
    int         numOfBars,
    Filename    animation,
    Caption     caption,
    int         textLength = SysOperationProgress::getDefaultTextLength() // Здесь была константа!!
    )
{
...

Ура! Progress bar стал широким.

ProgressBar

Исправляем глюк отображения окна в Windows Vista и Windows 7

Но у него осталась одна досадная бага, которая проявляется в Windows Vista и Windows 7, если размер окна с ProgressBar изменится. Например, при появлении строки, которое показывает оставшееся время, при появлении второй полосы или при переносе текста на следующую строку.

Бага проявляется в том, что окно размер не меняет, а начинает масштабироваться. После чего перестает обновляться, хотя код продолжает выполняться. Вот так:

ProgressBar с ошибкой отображения

Чтобы исправить этот глюк достаточно закомментировать одну строчку кода в методе setupForm класса SysOperationProgressForm:

  //formBuildDesign.windowResize(FormWindowResize::Fixed);      // Fixed

В результате получаем послушный и удобный ProgressBar в Microsoft Dynamics AX 2009.

ProgressBar в Microsoft Dynamics AX 2009

Буду рад Вашим замечаниям и предложениям.
E-Mail: mazzy@mazzy.ru, Мазуркин Сергей