15.10.2009, 12:44 | #1 |
Модератор
|
На диалоговом поле метод Modified
Напомните, пожалуйста, как в класе для диалогового окна написать метод modified для поля содержашего дату.
От значения даты должно менять значение в соседнем текстовом поле. |
|
15.10.2009, 12:47 | #2 |
Модератор
|
Цитата:
|
|
15.10.2009, 12:49 | #3 |
Ищущий знания...
|
вот, нашел в своем загашнике знаний
Как динамически изменять активность поля диалога: Если перекрыть в вашем классе метод void dialogSelectCtrl() и произвести вызов метода dialog.allowUpdateOnSelectCtrl(true); в перекрытом методе dialog(), то ваш перекрытый метод dialogSelectCtrl() будет вызываться каждый раз при получении фокуса элементом ввода. Вконце метода dialog() добавляете следующий код: X++: { ... dialog.allowUpdateOnSelectCtrl(true); this.dialogSelectCtrl(); return dialog; } X++: public void dialogSelectCtrl() { super(); flag = dlgControlFlag.value(); if(flag) dlgControlField.active(false); else dlgControlField.active(true); }
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
15.10.2009, 13:18 | #4 |
Moderator
|
офф-совет
Цитата:
Сообщение от Poleax
тема закрыта. Нашел решение вопроса в Похожие темы метод Modified к stringControl
Можно примерно так, как я пробую в этом сообщении: Gustav: Unsorted, или Записки DAX-дилетанта - II |
|
|
За это сообщение автора поблагодарили: Lemming (4). |
15.10.2009, 17:05 | #5 |
Модератор
|
Цитата:
Сообщение от lev
вот, нашел в своем загашнике знаний
Как динамически изменять активность поля диалога: Если перекрыть в вашем классе метод void dialogSelectCtrl() и произвести вызов метода dialog.allowUpdateOnSelectCtrl(true); в перекрытом методе dialog(), то ваш перекрытый метод dialogSelectCtrl() будет вызываться каждый раз при получении фокуса элементом ввода. ... добавил методы модификации на поля: X++: void dateField_modified() { ; info('dateField_modified'); breakpoint; } void numberField_modified() { ; info('numberField_modified'); breakpoint; } 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); } РЕАКЦИИ НИ КАКОЙ Не видит методы _modified метод dialogSelectCtrl() бесполезен, так как он отрабатывает только один раз при открытии диалогового окна. При изменении значения в поле, метод dialogSelectCtrl() даже не реагирует. Как заставить видить _modified ? Надо учесть что Classes\RAssetReport ни от кого не наследован. Последний раз редактировалось Poleax; 15.10.2009 в 17:11. |
|
15.10.2009, 17:13 | #6 |
Участник
|
Выложите, пожалуйста, метод RAssetReport.dialog().
|
|
15.10.2009, 17:21 | #7 |
Moderator
|
Цитата:
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 |
Модератор
|
стандартный 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 |
Участник
|
Цитата:
Сообщение от Poleax
\Classes\RAssetReport
добавил методы модификации на поля: X++: void dateField_modified() { ; info('dateField_modified'); breakpoint; } void numberField_modified() { ; info('numberField_modified'); breakpoint; } А вы уверены, что созданные контролы на диалоге имеют имена "dateField" и "numberField" ? В стандарте они создаются как "Fld1_1" и "Fld2_1". Соответственно, методы должны называться fld1_1_modified() и fld2_1_modified(). |
|
15.10.2009, 17:40 | #10 |
Модератор
|
Цитата:
X++: DialogField dateField; DialogField numberField; |
|
|
За это сообщение автора поблагодарили: Lemming (-2). |
15.10.2009, 17:42 | #11 |
Участник
|
Цитата:
dateField и numberField - названия переменных, а названия контролов совсем другие. Посмотрите также методы dialog.addField() и dialogField.fieldName() - все станет ясно... |
|
|
За это сообщение автора поблагодарили: Lemming (4), Poleax (2). |
15.10.2009, 17:57 | #12 |
Модератор
|
Ты абсолютно прав, чет я запарился уже
|
|
15.10.2009, 17:58 | #13 |
Модератор
|
Lemming Где обсуждалось, линка? Прежде чем рейтинги ставить, ответил бы по теме.
Последний раз редактировалось Poleax; 15.10.2009 в 18:05. |
|
15.10.2009, 18:05 | #14 |
Moderator
|
Цитата:
Цитата:
Сообщение от 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())); } } 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; } Последний раз редактировалось Gustav; 15.10.2009 в 18:43. |
|
|
За это сообщение автора поблагодарили: Poleax (4). |
15.10.2009, 18:44 | #15 |
Moderator
|
Всё! ПолучИте законченный пример - джоб и класс к нему (см. выше).
|
|
16.10.2009, 09:04 | #16 |
Участник
|
В очередной раз на камент в репе(это, кмк, становится традицией)
Цитата:
"Их есть у меня" 1. интересно было выпендрится динамическим программированием 2. Бинго! Ну и вообще, если очень уж хочется "выпендрится", то лучше сразу на Top Coder. А тут, это... проекты там делать надо, ну и вообще. Кстати, принципы именования контролов на диалоге, можно и самому глянуть в классе Dialog, это не только форма(sic!). Кстати, например на Хабре, любые посты про карму люто бешено минусуют, а вот тут каждый минус прям трагедия Regards! |
|
|
За это сообщение автора поблагодарили: Poleax (-2). |
20.10.2009, 16:50 | #17 |
Возьми свет!!!
|
Я проблему с 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; } |
|
20.10.2009, 17:32 | #18 |
Участник
|
Цитата:
Сообщение от 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; } IMHO, лучше всего пользоваться вот этим "велосипедом": Modified поля на форме-наследнике RunBase Тут решена так же проблема перехвата методов RunBase-диалога на стороне сервера. |
|
|
За это сообщение автора поблагодарили: kashperuk (1). |
21.10.2009, 07:49 | #19 |
Возьми свет!!!
|
Цитата:
Сообщение от Bishop
Класс DialogField не имеет метода parmFieldName() (в стандарте)...
IMHO, лучше всего пользоваться вот этим "велосипедом": Modified поля на форме-наследнике RunBase Тут решена так же проблема перехвата методов RunBase-диалога на стороне сервера. 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 |
Участник
|
useName и nameField нужно добавить в currentList.
Без этого не работает в некоторых случаях. |
|