Показать сообщение отдельно
Старый 12.08.2010, 08:17   #1  
ziva is offline
ziva
Иван Захаров
Злыдни
Лучший по профессии AXAWARD 2013
 
65 / 106 (4) +++++
Регистрация: 25.03.2005
Расширенные возможности отслеживания событий на диалогах классов-наследников RunBase
В AX2009 RU5 появилась возможность простого расширения возможностей отслеживания событий на диалогах классов-наследников RunBase.
Поясню как это использовать (на примере InventBaileeCreateCalc_RU):

1. Добавляем в classDeclaration следующую конструкцию:
X++:
    CustAccount         custAccount;
    DialogField         dialogCustAccount;
    #define.dialogCustAccount('dialogCustAccount')
Здесь мы вынуждены иметь hardcoded название будущего контрола на форме, но дальше мы увидим как красиво это играет.

2. В метод dialog() добавляем вызов ещё пары методов:

X++:
   ...

    dialog.customFieldName_RU(#dialogCustAccount);
    // здесь насильно устанавливаем название создаваемого контрола в форме диалога
    dialogCustAccount = dialog.addFieldValue(typeid(CustAccount), custAccount);

    ...

    dialog.allowControlMethodOverload_RU(true);
    // а теперь разрешаем инстансу настоящего класса отлавливать события контролов

3. Теперь создаём метод dialogCustAccount_modified(), который позволяет отлавливать события контрола с названием 'dialogCustAccount' (если бы мы не изменяли название контрола, то метод бы назвался Fld1_modified, или Fld3_2 - взависимости от того где и как вы вызываете dialog.addField или dialog.addFieldValue)

Примечание: Поля-массивы (Dimension) будут иметь наименование с суффиксом содержащим номер элемента массива. Пример: dialogDimension_1, dialogDimension_2, ...

Очень важное примечание: поскольку в этом методе вы имеете дело с серверной версией класса Dialog, то для корректной работы нужно не забывать обновлять значения полей "обрамляющим" вызовом методов updateServer() и updateClient())

X++:
protected boolean dialogCustAccount_modified()
{
    boolean ret = dialog.curFormControl_RU().modified();
    ;
    dialog.dialogOnClient_RU().updateServer();

    dialogContractCode.value('');
    dialogContractAccount.value('');

    this.dialogActivateFields();

    dialog.updateClient(dialog.dialogOnClient_RU());

    return ret;
}
Вот собственно и всё!
Таким же точно образом можно отслеживать методы lookup(), validate(), selectionChange() и др...

P.S.
Собственно изначально делал это в AX3, а теперь удалось получить это в рамках RU5. Пользуйтесь на здоровье!
За это сообщение автора поблагодарили: db (3), sukhanchik (5), gefr (1), konopello (2), MikeR (1), gl00mie (3), alex55 (1), jeky (1), imir (1).