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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.07.2009, 16:58   #1  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
Modified поля на форме-наследнике RunBase
Всем привет!
Отчет. Для задания его параметров делаю форму на базе RunBase. Кроме самого запроса на ней отображается 7 полей:
1. дата начала
2. дата конца
3. контрагент
4. ...
Никак не пойму почему модификация 3го по счету поля (контрагент) не отлавливается методом fld3_1_modified()? Зато отлавливается "динамически" либо через fld4_1_modified() либо fld5_1_modified().... Почему?
Старый 02.07.2009, 17:11   #2  
kvg6 is offline
kvg6
program-ёр
Аватар для kvg6
1C
 
160 / 81 (3) ++++
Регистрация: 27.09.2005
Адрес: Moscow forever
Цитата:
Сообщение от decoder Посмотреть сообщение
Никак не пойму почему модификация 3го по счету поля (контрагент) не отлавливается методом fld3_1_modified()? Зато отлавливается "динамически" либо через fld4_1_modified() либо fld5_1_modified().... Почему?
Eсли включен showQueryValues(), порядковый номер поля на форме считается начиная с полей запроса
__________________
Становись лучше
За это сообщение автора поблагодарили: RVS (1), Gustav (2), decoder (1).
Старый 02.07.2009, 17:19   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от decoder Посмотреть сообщение
Всем привет!
Отчет. Для задания его параметров делаю форму на базе RunBase. Кроме самого запроса на ней отображается 7 полей:
1. дата начала
2. дата конца
3. контрагент
4. ...
Никак не пойму почему модификация 3го по счету поля (контрагент) не отлавливается методом fld3_1_modified()? Зато отлавливается "динамически" либо через fld4_1_modified() либо fld5_1_modified().... Почему?
Вот поэтому, в таких случаях, лучше не лениться и использовать форму вместо технических лазеек типа fld5_1_modified(). Через пару месяцев захотите(кто-то захочет) добавить 8-е поле где-нить в серединке, и все ивенты поедут к бабушке...
И суппортить такой оптимальный код невыносимо неприятно.
За это сообщение автора поблагодарили: RVS (1).
Старый 02.07.2009, 17:52   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Вот поэтому, в таких случаях, лучше не лениться и использовать форму вместо технических лазеек типа fld5_1_modified(). Через пару месяцев захотите(кто-то захочет) добавить 8-е поле где-нить в серединке, и все ивенты поедут к бабушке...
Можно перейти от fld5_1 к "нормальному" названию поля типа "Kontragent", создав переменную контрола соответствующего типа, и тогда метод приобретет более осмысленное название типа Kontragent_modified(). Соответственно, никаких проблем с последующим добавлением полей в серединку не возникнет. Делал такое в Ax 3.0 sp4. Примера кода под рукой сейчас нет - нахожусь в отпуске. Но как только доберусь до Аксапты (где-нибудь через недельку), то если вспомню - выложу. Там ничего особо сложного.
За это сообщение автора поблагодарили: DSPIC (1), decoder (1).
Старый 02.07.2009, 18:05   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
! Как гарантированно перехватывать события на полях диалога
Коллега придумал оригинальный и вполне надежный способ гарантированно перехватывать события на полях диалога - даже когда заранее неизвестно, сколько полей будет в этом диалоге выведено (ну, в разумных пределах, конечно). Суть-то проблемы в чем?
  1. Методы-перехватчики идентифицируются формой в соответствии с названиями контролов на форме;
  2. Названия полям диалога даются в зависимости от числовых идентификаторов, присваиваемых объектам DialogField при добавлении полей в диалог, а также от индекса отображаемого DialogField'ом поля в поле-массиве (обычно этот индекс равен 1) - см. метод \Classes\DialogField\fieldname;
  3. В диалог в зависимости от настроек может быть добавлено произвольное количество дополнительных полей - это происходит при вызове super() в перекрытом методе \Classes\RunBase\dialog, в результате управлять нумерацией объектов DialogField внутри диалога при добавлении их методами addField()/addFieldValue() становится затруднительно.
Так вот, чтобы принудительно задавать эти самые номера объектам DialogField, коллега нашел такой способ:
X++:
class   DEV_FormMethodOverloadSample
extends RunBase
{
    // ссылка на диалог понадобится для методов-обработчиков
    // событий на полях диалога, которые мы собираемся повесить
    Dialog      dialog;
    DialogField df1;
    DialogField df2;
    // задаем идентификаторы для DialogField, заведомо бОльшие
    // того количества полей, которое может быть добавлено в диалог
    #define.DlgFldNum1  (10240)
    #define.DlgFldNum2  (10241)
    // ...
}
protected Object dialog(DialogRunbase _dialog = null, boolean _forceOnClient = false)
{
    ;
    dialog = super( _dialog, _forceOnClient );
    // вот в чем фишка! создаем DialogField сами и "привязываем" к диалогу
    df1 = new DialogField( dialog, typeid(AmountCur), #DlgFldNum1 );
    df1.init( dialog );
    // значение df1 можно установить здесь же или в putToDialog()

    df2 = new DialogField( dialog, typeid(JournalId), #DlgFldNum2 );
    df2.init( dialog );
    // ...
    return dialog;
}
public void dialogPostRun(DialogRunbase _dialog)
{
    super( _dialog );
    // вешаем свои обработчики на некоторые события контролов диалоговой формы
    // NB! наш класс должен иметь свойство RunOn == Client или Called from
    // и canSwapBetweenCS() должен возвращать true, иначе этот код будет
    // вызван на сервере, и никакого _dialog.formRun() мы не увидим
    _dialog.formRun().controlMethodOverload( true );
    _dialog.formRun().controlMethodOverloadObject( this );
}
protected boolean fld10240_1_modified()         // df1
{
    FormRealControl formControl;
    boolean         ret;
    ;
    formControl = dialog.formRun().controlCallingMethod();
    ret = formControl.modified();               // вызываем super()
    if (ret)
    {
        // дальше выполняем нужные действия
    }
    return ret;
}
protected void fld10241_1_lookup()              // df2
{
    FormStringControl formControl;
    ;
    formControl = dialog.formRun().controlCallingMethod();
    // дальше выполняем нужные действия
}
За это сообщение автора поблагодарили: mazzy (2), RVS (1), vvk (1), belugin (3), Logger (5), Denicce (2), oip (2), Stitch_MS (1), alex55 (1), plumbum (1), Kabardian (4), decoder (1), samolalex (1).
Старый 02.07.2009, 18:33   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,873 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Классно.

А была еще похожая тема
Как задать имя контрола на RunBase
Старый 02.07.2009, 18:37   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,873 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Думаю надо бы все это в полезные материалы занести.
Старый 02.07.2009, 18:40   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,873 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Еще
Перекрыть LookUp в RunBase
Старый 03.07.2009, 00:04   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну, раз уж делимся ссылками, запостю и свою (мне это решение, ессно, нравится больше всего ), правда требует модификации системных классов диалога
Позволяет указать название для создаваемого DialogField, а соответственно называть метод именно FieldName_modified(), etc.
В проект включены еще две полезности

http://kashperuk.blogspot.com/2007/0...xtensions.html
За это сообщение автора поблагодарили: Bishop (2), decoder (1).
Старый 03.07.2009, 06:59   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Думаю надо бы все это в полезные материалы занести.
Добавил тег "Полезное".
И вы тоже так можете.
__________________
полезное на axForum, github, vk, coub.
Старый 19.10.2009, 11:43   #11  
decoder is offline
decoder
Участник
Аватар для decoder
 
63 / 15 (1) ++
Регистрация: 19.12.2008
Адрес: Москва
Еще трабл
При модификации одного поля мой метод .._modified() меняет значение другого поля формы, но никак не пойму: как при этом обновить форму без перехода на следующее поле диалога..
Старый 19.10.2009, 15:45   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от decoder Посмотреть сообщение
При модификации одного поля мой метод .._modified() меняет значение другого поля формы, но никак не пойму: как при этом обновить форму без перехода на следующее поле диалога..
Если контрол, modified() которого должен срабатывать - не комбо-бокс, а к примеру обычное текстовое поле, то никак. Подумайте сами - чтобы сработал modified надо как-то объяснить системе, что редактирование закончено. Стандартно это происходит при переходе к другому контролу. Ну или надо пересчет другого поля добавлять не в modified, а в обработку какого-нибудь другого события, которое условиться считать сигналом окончания редактирования, например, mouseDblClick
За это сообщение автора поблагодарили: decoder (1).
Старый 20.10.2009, 08:53   #13  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
642 / 347 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Цитата:
Сообщение от decoder Посмотреть сообщение
Еще трабл
При модификации одного поля мой метод .._modified() меняет значение другого поля формы, но никак не пойму: как при этом обновить форму без перехода на следующее поле диалога..
Как уже сказали, *_modified() работает только для лукап-полей. Для текстовый полей используйте метод *_textchange()
__________________
// no comments
За это сообщение автора поблагодарили: Logger (3), Gustav (2), decoder (1).
Старый 07.04.2010, 16:33   #14  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
X++:
protected void fld10240_1_modified()            // df1
{
    FormRealControl formControl;
    ;
    formControl = dialog.formRun().controlCallingMethod();
    if (formControl.modified())                 // вызываем super()
    {
        // дальше выполняем нужные действия
    }
}
А в Ax 4.0 такое должно работать?
Сделал все так как в примере, только у меня класс наследник класса, который наследник от RunBase (не думаю что это как то влияет)

При изменении значения поля, только звук ошибки выдает винда. Причем нужно раза два еще щелкнуть на другое поле, чтобы соскочить с того поля, которое менял. В итоге значение поля остается тем же.
Проверил дебагером, в метод ld10240_1_modified
попадает причем два раза:
1 - из \Classes\FormComboBoxControl\SelectionChange
2 - из \Classes\FormComboBoxControl\leave

Последний раз редактировалось propeller; 07.04.2010 в 17:39.
Старый 07.04.2010, 22:53   #15  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Пардон, в своем примере я, можно сказать, ввел всех в заблуждение: перекрытый метод fld10240_1_modified() должен возвращать, конечно же, не void, а boolean.

PS. Благодаря mazzy пример исправлен.

Последний раз редактировалось gl00mie; 07.04.2010 в 23:19.
За это сообщение автора поблагодарили: propeller (1).
Старый 05.10.2011, 13:31   #16  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
Не получается перехватить метод performFormLookup, остальные нужные методы работают.
Это нужно, чтобы в уже готовой форме лукапа наложить фильтр. В нашем едт CustAccount используется своя форма выбора. Можно, конечно, в методе lookup использовать не SysTableLookup, а нашу форму, но раз уж речь зашла о переопределении методов элементов управления в диалоге, может, как-то возможно решить эту проблему?

X++:
// dfCustAccont.performFormLookup()
protected void fld10240_1_performFormLookup(FormRun _form)
{
    FormDatasource  fds = _form.dataSource();
    FormStringControl formControl;
    ;
    formControl = dialog.formRun().controlCallingMethod();
    fds.query().dataSourceTable(tablenum(CustTable)).addRange(fieldnum(CustTable, Name)).value("а*");
    formControl.performFormLookup(_form);              
}
Теги
dialog, runbase, законченный пример, контрол, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка при выборе поля "подразделение" на форме Дима DAX: Программирование 5 01.10.2007 11:23
Сортировка поля на форме, который отображается Display методом IvanS DAX: Программирование 10 06.12.2006 14:54
Вызвать modified поля датасорса axaLearner DAX: Программирование 9 25.05.2006 11:18
значения по умолчанию в наследнике от RunBase NetBus DAX: Программирование 6 29.09.2005 18:13
Связанные поля в форме ravil DAX: Программирование 2 12.06.2003 13:48
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:09.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.