02.07.2009, 16:58 | #1 |
Участник
|
Modified поля на форме-наследнике RunBase
Всем привет!
Отчет. Для задания его параметров делаю форму на базе RunBase. Кроме самого запроса на ней отображается 7 полей: 1. дата начала 2. дата конца 3. контрагент 4. ... Никак не пойму почему модификация 3го по счету поля (контрагент) не отлавливается методом fld3_1_modified()? Зато отлавливается "динамически" либо через fld4_1_modified() либо fld5_1_modified().... Почему? |
|
02.07.2009, 17:11 | #2 |
program-ёр
|
Eсли включен showQueryValues(), порядковый номер поля на форме считается начиная с полей запроса
__________________
Становись лучше |
|
|
За это сообщение автора поблагодарили: RVS (1), Gustav (2), decoder (1). |
02.07.2009, 17:19 | #3 |
Боец
|
Цитата:
Сообщение от decoder
Всем привет!
Отчет. Для задания его параметров делаю форму на базе RunBase. Кроме самого запроса на ней отображается 7 полей: 1. дата начала 2. дата конца 3. контрагент 4. ... Никак не пойму почему модификация 3го по счету поля (контрагент) не отлавливается методом fld3_1_modified()? Зато отлавливается "динамически" либо через fld4_1_modified() либо fld5_1_modified().... Почему? И суппортить такой оптимальный код невыносимо неприятно. |
|
|
За это сообщение автора поблагодарили: RVS (1). |
02.07.2009, 17:52 | #4 |
Moderator
|
Можно перейти от fld5_1 к "нормальному" названию поля типа "Kontragent", создав переменную контрола соответствующего типа, и тогда метод приобретет более осмысленное название типа Kontragent_modified(). Соответственно, никаких проблем с последующим добавлением полей в серединку не возникнет. Делал такое в Ax 3.0 sp4. Примера кода под рукой сейчас нет - нахожусь в отпуске. Но как только доберусь до Аксапты (где-нибудь через недельку), то если вспомню - выложу. Там ничего особо сложного.
|
|
|
За это сообщение автора поблагодарили: DSPIC (1), decoder (1). |
02.07.2009, 18:05 | #5 |
Участник
|
Как гарантированно перехватывать события на полях диалога
Коллега придумал оригинальный и вполне надежный способ гарантированно перехватывать события на полях диалога - даже когда заранее неизвестно, сколько полей будет в этом диалоге выведено (ну, в разумных пределах, конечно). Суть-то проблемы в чем?
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 |
Участник
|
|
|
02.07.2009, 18:37 | #7 |
Участник
|
Думаю надо бы все это в полезные материалы занести.
|
|
02.07.2009, 18:40 | #8 |
Участник
|
|
|
03.07.2009, 00:04 | #9 |
Участник
|
Ну, раз уж делимся ссылками, запостю и свою (мне это решение, ессно, нравится больше всего ), правда требует модификации системных классов диалога
Позволяет указать название для создаваемого DialogField, а соответственно называть метод именно FieldName_modified(), etc. В проект включены еще две полезности http://kashperuk.blogspot.com/2007/0...xtensions.html |
|
|
За это сообщение автора поблагодарили: Bishop (2), decoder (1). |
03.07.2009, 06:59 | #10 |
Участник
|
Добавил тег "Полезное".
И вы тоже так можете. |
|
19.10.2009, 11:43 | #11 |
Участник
|
Еще трабл
При модификации одного поля мой метод .._modified() меняет значение другого поля формы, но никак не пойму: как при этом обновить форму без перехода на следующее поле диалога.. |
|
19.10.2009, 15:45 | #12 |
Moderator
|
Если контрол, modified() которого должен срабатывать - не комбо-бокс, а к примеру обычное текстовое поле, то никак. Подумайте сами - чтобы сработал modified надо как-то объяснить системе, что редактирование закончено. Стандартно это происходит при переходе к другому контролу. Ну или надо пересчет другого поля добавлять не в modified, а в обработку какого-нибудь другого события, которое условиться считать сигналом окончания редактирования, например, mouseDblClick
|
|
|
За это сообщение автора поблагодарили: decoder (1). |
20.10.2009, 08:53 | #13 |
Участник
|
Как уже сказали, *_modified() работает только для лукап-полей. Для текстовый полей используйте метод *_textchange()
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: Logger (3), Gustav (2), decoder (1). |
07.04.2010, 16:33 | #14 |
Участник
|
X++: protected void fld10240_1_modified() // df1 { FormRealControl formControl; ; formControl = dialog.formRun().controlCallingMethod(); if (formControl.modified()) // вызываем super() { // дальше выполняем нужные действия } } Сделал все так как в примере, только у меня класс наследник класса, который наследник от RunBase (не думаю что это как то влияет) При изменении значения поля, только звук ошибки выдает винда. Причем нужно раза два еще щелкнуть на другое поле, чтобы соскочить с того поля, которое менял. В итоге значение поля остается тем же. Проверил дебагером, в метод ld10240_1_modified попадает причем два раза: 1 - из \Classes\FormComboBoxControl\SelectionChange 2 - из \Classes\FormComboBoxControl\leave Последний раз редактировалось propeller; 07.04.2010 в 17:39. |
|
07.04.2010, 22:53 | #15 |
Участник
|
Пардон, в своем примере я, можно сказать, ввел всех в заблуждение: перекрытый метод fld10240_1_modified() должен возвращать, конечно же, не void, а boolean.
PS. Благодаря mazzy пример исправлен. Последний раз редактировалось gl00mie; 07.04.2010 в 23:19. |
|
|
За это сообщение автора поблагодарили: propeller (1). |
05.10.2011, 13:31 | #16 |
Участник
|
Не получается перехватить метод 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, законченный пример, контрол, полезное |
|
|