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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.10.2009, 12:44   #1  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
:) На диалоговом поле метод Modified
Напомните, пожалуйста, как в класе для диалогового окна написать метод modified для поля содержашего дату.
От значения даты должно менять значение в соседнем текстовом поле.
Старый 15.10.2009, 12:47   #2  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Poleax Посмотреть сообщение
Напомните, пожалуйста, как в класе для диалогового окна написать метод modified для поля содержашего дату.
От значения даты должно менять значение в соседнем текстовом поле.
тема закрыта. Нашел решение вопроса в Похожие темы метод Modified к stringControl
Старый 15.10.2009, 12:49   #3  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
вот, нашел в своем загашнике знаний
Как динамически изменять активность поля диалога:

Если перекрыть в вашем классе метод void dialogSelectCtrl() и произвести вызов метода dialog.allowUpdateOnSelectCtrl(true);
в перекрытом методе dialog(), то ваш перекрытый метод dialogSelectCtrl() будет вызываться каждый раз при получении фокуса
элементом ввода.

Вконце метода dialog() добавляете следующий код:
X++:
{
  ...
  dialog.allowUpdateOnSelectCtrl(true);
  this.dialogSelectCtrl();

  return dialog;
}
далее перекрываете метод dialogSelectCtrl(), в котором и обрабатываете ваши контролы. Например так:
X++:
public void dialogSelectCtrl()
{
    super();

    flag = dlgControlFlag.value();
    if(flag)
        dlgControlField.active(false);
    else
        dlgControlField.active(true);
}
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 15.10.2009, 13:18   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
офф-совет
Цитата:
Сообщение от Poleax Посмотреть сообщение
тема закрыта. Нашел решение вопроса в Похожие темы метод Modified к stringControl
Да, Poleax... А темка-то - ваша же... Пора вам активировать свой блог (http://www.axforum.info/forums/blog.php?u=4016) и создать там хотя бы одно сообщение и записывать туда узелки на память с краткими комментариями.

Можно примерно так, как я пробую в этом сообщении: Gustav: Unsorted, или Записки DAX-дилетанта - II
За это сообщение автора поблагодарили: Lemming (4).
Старый 15.10.2009, 17:05   #5  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от lev Посмотреть сообщение
вот, нашел в своем загашнике знаний
Как динамически изменять активность поля диалога:

Если перекрыть в вашем классе метод void dialogSelectCtrl() и произвести вызов метода dialog.allowUpdateOnSelectCtrl(true);
в перекрытом методе dialog(), то ваш перекрытый метод dialogSelectCtrl() будет вызываться каждый раз при получении фокуса
элементом ввода.
...
\Classes\RAssetReport
добавил методы модификации на поля:
X++:
void dateField_modified()
{
    ;
    info('dateField_modified');
    breakpoint;
}

void numberField_modified()
{
    ;
    info('numberField_modified');
    breakpoint;
}
переписал \Classes\RAssetReport\prompt
X++:
protected boolean prompt()
{
    Dialog      dlg;
    ;

    dlg = this.dialog();

//    dlg.run();
    dlg.doRun();
    this.dialogPostRun(dlg); 
    dlg.wait();

    if (dlg.closedOk())
        return this.getFromDialog();

    return false;
}

public void dialogPostRun(Dialog _dialog)
{
    ;
    _dialog.dialogForm().formRun().controlMethodOverload(true);
    _dialog.dialogForm().formRun().controlMethodOverloadObject(this);
}
при изменений полей даты документа или номера документа "Акт приемки оборудования (№ ОС-14)"
РЕАКЦИИ НИ КАКОЙ Не видит методы _modified

метод dialogSelectCtrl() бесполезен, так как он отрабатывает только один раз при открытии диалогового окна.
При изменении значения в поле, метод dialogSelectCtrl() даже не реагирует.

Как заставить видить _modified ?

Надо учесть что Classes\RAssetReport ни от кого не наследован.

Последний раз редактировалось Poleax; 15.10.2009 в 17:11.
Старый 15.10.2009, 17:13   #6  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Выложите, пожалуйста, метод RAssetReport.dialog().
Старый 15.10.2009, 17:21   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Poleax Посмотреть сообщение
\Classes\RAssetReport
добавил методы модификации на поля:
X++:
void dateField_modified()
{
    ;
    info('dateField_modified');
    breakpoint;
}

void numberField_modified()
{
    ;
    info('numberField_modified');
    breakpoint;
}
Такие методы надо писать, следуя определенным правилам, примерно так:
X++:
public boolean OKOFCode_modified()
{
    boolean             ret;
    FormStringControl   me = dialog.formRun().controlCallingMethod();
    ;

    ret = me.modified(); // как super()

    // далее наш функционал, который должен отрабатывать на modified

    return ret;
}
За это сообщение автора поблагодарили: Poleax (1).
Старый 15.10.2009, 17:30   #8  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Bishop Посмотреть сообщение
Выложите, пожалуйста, метод RAssetReport.dialog().
стандартный dis слой
X++:
protected Dialog dialog()
{
    Dialog                dlg;
    DialogGroup           dlgGroup;
    FormBuildGroupControl grCtrl;
    ;

    dlg         = new Dialog(this.comment(), this);

    dlgGroup = dlg.addGroup("@SYS21873");

    dateField   = dlg.addField(typeId(RAssetDocumentDate));
    numberField = dlg.addField(typeId(RAssetDocumentNum));

    dlgGroup = dlg.addGroup("@SYS54716");
    grCtrl = dlgGroup.formBuildGroup();
    grCtrl.top(1);

    return dlg;
}
Старый 15.10.2009, 17:34   #9  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Цитата:
Сообщение от Poleax Посмотреть сообщение
\Classes\RAssetReport
добавил методы модификации на поля:
X++:
void dateField_modified()
{
    ;
    info('dateField_modified');
    breakpoint;
}
 
void numberField_modified()
{
    ;
    info('numberField_modified');
    breakpoint;
}
при изменений полей даты документа или номера документа "Акт приемки оборудования (№ ОС-14)"
Извините за дурацкий вопрос...
А вы уверены, что созданные контролы на диалоге имеют имена "dateField" и "numberField" ?
В стандарте они создаются как "Fld1_1" и "Fld2_1". Соответственно, методы должны называться fld1_1_modified() и fld2_1_modified().
Старый 15.10.2009, 17:40   #10  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Bishop Посмотреть сообщение
Извините за дурацкий вопрос...
А вы уверены, что созданные контролы на диалоге имеют имена "dateField" и "numberField" ?
В стандарте они создаются как "Fld1_1" и "Fld2_1". Соответственно, методы должны называться fld1_1_modified() и fld2_1_modified().
в AX 3.0 SP6 \Classes\RAssetReport\classDeclaration
X++:
    DialogField             dateField;
    DialogField             numberField;
Не наблюдаю "Fld1_1" и "Fld2_1"
За это сообщение автора поблагодарили: Lemming (-2).
Старый 15.10.2009, 17:42   #11  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Цитата:
Сообщение от Poleax Посмотреть сообщение
в AX 3.0 SP6 \Classes\RAssetReport\classDeclaration
X++:
    DialogField             dateField;
    DialogField             numberField;
Не наблюдаю "Fld1_1" и "Fld2_1"
А вы посмотрите на форме диалога по правой кнопке в Настройках - увидите совсем другие имена...
dateField и numberField - названия переменных, а названия контролов совсем другие.
Посмотрите также методы dialog.addField() и dialogField.fieldName() - все станет ясно...
За это сообщение автора поблагодарили: Lemming (4), Poleax (2).
Старый 15.10.2009, 17:57   #12  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Цитата:
Сообщение от Bishop Посмотреть сообщение
А вы посмотрите на форме диалога по правой кнопке в Настройках - увидите совсем другие имена...
dateField и numberField - названия переменных, а названия контролов совсем другие.
Посмотрите также методы dialog.addField() и dialogField.fieldName() - все станет ясно...
Ты абсолютно прав, чет я запарился уже
Старый 15.10.2009, 17:58   #13  
Poleax is offline
Poleax
Модератор
Аватар для Poleax
MCP
MCBMSS
Злыдни
 
1,353 / 595 (22) +++++++
Регистрация: 17.02.2005
Адрес: msk
Записей в блоге: 34
Lemming Где обсуждалось, линка? Прежде чем рейтинги ставить, ответил бы по теме.

Последний раз редактировалось Poleax; 15.10.2009 в 18:05.
Старый 15.10.2009, 18:05   #14  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Bishop Посмотреть сообщение
В стандарте они создаются как "Fld1_1" и "Fld2_1". Соответственно, методы должны называться fld1_1_modified() и fld2_1_modified().
Вспомнил свою цитату:
Цитата:
Сообщение от Gustav Посмотреть сообщение
Можно перейти от fld5_1 к "нормальному" названию поля типа "Kontragent", создав переменную контрола соответствующего типа, и тогда метод приобретет более осмысленное название типа Kontragent_modified(). Соответственно, никаких проблем с последующим добавлением полей в серединку не возникнет. Делал такое в Ax 3.0 sp4.
Там обещал выложить, а здесь-таки выложу:
X++:
static void Job220(Args _args)
{
    Dialog              dialog = new Dialog('Наш диалог');

    FormStringControl   fscOKOFCode;
    FormIntControl      ficLifeTime;

    DialogField         fieldOKOFCode;
    DialogField         fieldLifeTime;
    ;

    fieldOKOFCode   = dialog.addField(Types::String,'ОКОФ');
    fieldLifeTime   = dialog.addField(Types::Integer, 'Срок амортизации');

    fscOKOFCode     = fieldOKOFCode.fieldControl();
    ficLifeTime     = fieldLifeTime.fieldControl();

    fscOKOFCode.name('OKOFCode');
    ficLifeTime.name('LifeTime');

    dialog.doInit();

    dialog.formRun().controlMethodOverload( true );
    dialog.formRun().controlMethodOverloadObject( new KKu_TestForPoleax( dialog ));
    // KKu_TestForPoleax - класс, содержащий метод OKOFCode_modified

    dialog.run();

    // опытным путём было установлено, что здесь еще раз необходима инициализация переменных,
    // чтобы дальше ими свободно оперировать
    fscOKOFCode = dialog.formRun().design().controlName('OKOFCode');
    ficLifeTime = dialog.formRun().design().controlName('LifeTime');

    if(dialog.closedOk())
    {
        box::info(strFmt('ОКОФ: %1, Срок: %2', fscOKOFCode.text(), ficLifeTime.value()));
    }
}
Создайте у себя класс KKu_TestForPoleax:
X++:
class KKu_TestForPoleax
{
    Dialog dialog;
}

void new(Dialog _dialog)
{
    ;
    dialog = _dialog;
}

public boolean OKOFCode_modified()
{
    boolean             ret;
    FormStringControl   me = dialog.formRun().controlCallingMethod();
    ;

    ret = me.modified(); // как super()

    box::info('Привет, Poleax! Вон оно, оказывается, как надо было!');

    return ret;
}
и потом запустите вышеуказанный Job220

Последний раз редактировалось Gustav; 15.10.2009 в 18:43.
За это сообщение автора поблагодарили: Poleax (4).
Старый 15.10.2009, 18:44   #15  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Всё! ПолучИте законченный пример - джоб и класс к нему (см. выше).
Старый 16.10.2009, 09:04   #16  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
:) В очередной раз на камент в репе(это, кмк, становится традицией)
Цитата:
Сообщение от Poleax Посмотреть сообщение
Lemming Где обсуждалось, линка? Прежде чем рейтинги ставить, ответил бы по теме.
Линки?

"Их есть у меня"

1. интересно было выпендрится динамическим программированием

2. Бинго!

Ну и вообще, если очень уж хочется "выпендрится", то лучше сразу на Top Coder. А тут, это... проекты там делать надо, ну и вообще. Кстати, принципы именования контролов на диалоге, можно и самому глянуть в классе Dialog, это не только форма(sic!). Кстати, например на Хабре, любые посты про карму люто бешено минусуют, а вот тут каждый минус прям трагедия

Regards!
За это сообщение автора поблагодарили: Poleax (-2).
Старый 20.10.2009, 16:50   #17  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Я проблему с fld_1 давно решил проство в класс Dialog я добавил такой метод
X++:
DialogField addFieldName(
    int         type,
    FieldLabel  label   = '',
    FieldName   _fieldName = '',
    FieldHelp   help    = ''
    )
{
    DialogField dialogField;
    fields += 1;
    dialogField = new DialogField(this,type,fields);
    dialogField.parmFieldName(_fieldName);
    this.addCtrlDialogField(dialogField.name());
    dialogField.init(this);
    if (label)
        dialogField.label(label);
    if (help)
        dialogField.helpText(help);
    this.addDialogClass(dialogField);
    return dialogField;
}
и им пользуюсь, кстати возможно проблемы с получение данных методом getFromDialog если не использовать мой метод.
Старый 20.10.2009, 17:32   #18  
Bishop is offline
Bishop
Участник
 
89 / 60 (3) ++++
Регистрация: 12.08.2004
Адрес: Москва
Цитата:
Сообщение от Murlin Посмотреть сообщение
Я проблему с fld_1 давно решил проство в класс Dialog я добавил такой метод
X++:
DialogField addFieldName(
    int         type,
    FieldLabel  label   = '',
    FieldName   _fieldName = '',
    FieldHelp   help    = ''
    )
{
    DialogField dialogField;
    fields += 1;
    dialogField = new DialogField(this,type,fields);
    dialogField.parmFieldName(_fieldName);
    this.addCtrlDialogField(dialogField.name());
    dialogField.init(this);
    if (label)
        dialogField.label(label);
    if (help)
        dialogField.helpText(help);
    this.addDialogClass(dialogField);
    return dialogField;
}
и им пользуюсь, кстати возможно проблемы с получение данных методом getFromDialog если не использовать мой метод.
Класс DialogField не имеет метода parmFieldName() (в стандарте)...

IMHO, лучше всего пользоваться вот этим "велосипедом":
Modified поля на форме-наследнике RunBase
Тут решена так же проблема перехвата методов RunBase-диалога на стороне сервера.
За это сообщение автора поблагодарили: kashperuk (1).
Старый 21.10.2009, 07:49   #19  
Murlin is offline
Murlin
Возьми свет!!!
Аватар для Murlin
Самостоятельные клиенты AX
Злыдни
 
291 / 32 (2) +++
Регистрация: 22.09.2008
Адрес: Тюмень, Рашан Федерашан
Цитата:
Сообщение от Bishop Посмотреть сообщение
Класс DialogField не имеет метода parmFieldName() (в стандарте)...

IMHO, лучше всего пользоваться вот этим "велосипедом":
Modified поля на форме-наследнике RunBase
Тут решена так же проблема перехвата методов RunBase-диалога на стороне сервера.
Извините старая доработка уже все забыл, действительно еще кое что нужно переопределить в классе dialogField
X++:
class DialogField extends DialogControl
{
    // Packed
    int             type;
    int             fieldNo;
    // Is set in init()
    DictType        dictType;
    Types           baseType;
    boolean         checkBox;
    anytype         dummy;
    // C/S optimize
    container       value;      // Hopefully temporary, a container can't be stored in a struct
   //доработка -->
    boolean         useName;
    FieldName       nameField;
   //доработка -->
    #properties
    #define.widthMode('widthMode')
    #define.heightMode('heightMode')
    #define.setHeightFromLines('setHeightFromLines')
    #localmacro.currentList
        type,
        fieldNo
    #endmacro
}
X++:
str fieldname(int arrIdx = 1)
{
    ;
    //доработка -->
    if (useName)
        return nameField;
//доработка --->
    return #PrefixField+int2str(fieldNo)+'_'+int2str(arrIdx);
}
X++:
void new(
    Dialog  _dialog,
    int     _type = 0,
    int     _fieldNo = 0
    )
{
    type        = _type;
    fieldNo     = _fieldNo;
    //Доработка --->
    useName     =   false;
//Доработка --->
    if (_dialog.isOnServer())
    {
        properties = new Struct();
        return;
    }
}
X++:
//Доработка -->
FieldName parmFieldName(FieldName _nameField = nameField)
{
    ;
    if (_nameField)
        useName = true;
    nameField = _nameField;
    return  nameField;
}
//доработка -->
За это сообщение автора поблагодарили: Alexx7 (1).
Старый 22.03.2010, 00:02   #20  
DmitryS is offline
DmitryS
Участник
 
37 / 13 (1) ++
Регистрация: 01.08.2006
Адрес: Москва
useName и nameField нужно добавить в currentList.
Без этого не работает в некоторых случаях.
Теги
dialog, modified, runbase

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Можно ли динамически созданному контролу CheckBox прикрутить метод modified? Poleax DAX: Программирование 4 31.03.2009 19:58
метод Modified к stringControl Poleax DAX: Программирование 15 21.07.2008 18:39
Форма: как привязать метод до выбора в поле Arahnid DAX: Программирование 9 22.11.2007 16:18
Метод на поле датасурса. Deusik DAX: Программирование 6 09.11.2006 16:38

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

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

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