29.05.2007, 09:47 | #1 |
Участник
|
вернуть параметр в вызывающую форму
Всем доброго времени суток.
Если бы была премия "Пользователь, задающий самое большое кол-во вопросов" - я бы взяла первый приз В общем... Я из метода validateWrite() датасорса вызываю свой класс-дилог. Спасибо всем, кто помог мне в этом А теперь мне нужно сделать так, чтобы при нажатии на кнопку "Отмена" в форму в этот же метод (или в метод write())передался как-нибудь параметр true/false, чтобы сделать false на сохранение введенных данных. Я нашла, что это можно сделать как-то через Args, но конкретного способа человек не сказал. Там же (в той теме, где нашла) Muzzy советовал читать про Args. Где читать? Вот такая проблемка |
|
29.05.2007, 10:05 | #2 |
Moderator
|
Вам нужно понять, что пользователь нажал кнопку Отмена в диалоге? Вызов dialog.run() как раз возвращает true по ok и false по отмене.
__________________
Андрей. |
|
29.05.2007, 10:10 | #3 |
Участник
|
А почему вы не хотите в run-е класса написать всю обработку. Нажали ok вызвали run всё стедали всё сохранили. Нажали отмена не вызвали. Если передать датасорс в класс, то можно ещё и обновить. Чтоб на форме из которой вызывали обработку отобразились новые значения. А вы что то делаете очень страшное.
|
|
29.05.2007, 10:24 | #4 |
Участник
|
Вообще-то, метод validateWrite для того и сделан boolean, чтобы в случае возвращения этим методом значения false (
X++: return false у Вас не так? |
|
29.05.2007, 10:38 | #5 |
Пенсионер
|
Цитата:
X++: args.parm(YourNiceStringParametr); класс args виден и в форме и в диалоге...
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ Последний раз редактировалось blokva; 29.05.2007 в 10:41. |
|
29.05.2007, 11:02 | #6 |
Участник
|
Я неточно написала и соответственно сама из себя сделала ду...
Смысл есть в том, что на форме CustTable я ввожу какие-то данные и на нажатие кнопки сохранить у меня вылазить окошко-диалог (со своей обработкой). Так вот, если на окошке нажали "Отмена", то данные, которые я вводила в форме CustTable не должны быть сохранены. Пока им сохраняться никто не мешает, т.к validateWrite() = true и все здорово. А мне нужно, чтобы этот validateWrite() стал false. Dron AKA andy, очень Вас прошу - расскажите как это сделать? Ведь вызываю свой класс-диалог через X++: new MenuFunction(menuItemDisplayStr(SUG_ChangeDialog), MenuItemtype::Display).run(args); А пока буду пробовать совет blokva.
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 11:13 | #7 |
Участник
|
Появился большой интерес, а что делает класс.???
Вызов через menuItem тогда вам не подходит. Вызывайте класс через создание обьекта класса. |
|
29.05.2007, 11:33 | #8 |
Участник
|
Цитата:
Появился большой интерес, а что делает класс.???
Цитата:
Вызывайте класс через создание обьекта класса.
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 11:36 | #9 |
Участник
|
А вы в метод main() вашего класса (или его предка) загляните - и сделайте так же
__________________
Axapta v.3.0 sp5 kr2 |
|
29.05.2007, 11:43 | #10 |
Участник
|
Метод main моего класса выглядит так:
X++: static void main(Args args) { SUG_Change_Dial sug_ChD = new SUG_Change_Dial(); ; // если вызов из формы "Расчеты с клиентами"-"Клиенты" if (args.name() == 'CustTable') { sug_ChD.setCustTable(args); sug_ChD.setFormName(args); if (sug_ChD.prompt()) { sug_ChD.run(); } } // если вызов из формы "Расчеты с клиентами"-"Договоры" if (args.name() == 'RContractTable') { sug_ChD.setRContrTable(args); sug_ChD.setFormName(args); if (sug_ChD.prompt()) { sug_ChD.run(); } } }
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 12:13 | #11 |
Пенсионер
|
Цитата:
Сообщение от Tiruvileijadal'
Метод main моего класса выглядит так:
X++: static void main(Args args) { SUG_Change_Dial sug_ChD = new SUG_Change_Dial(); ; // если вызов из формы "Расчеты с клиентами"-"Клиенты" if (args.name() == 'CustTable') { sug_ChD.setCustTable(args); sug_ChD.setFormName(args); if (sug_ChD.prompt()) { sug_ChD.run(); } } // если вызов из формы "Расчеты с клиентами"-"Договоры" if (args.name() == 'RContractTable') { sug_ChD.setRContrTable(args); sug_ChD.setFormName(args); if (sug_ChD.prompt()) { sug_ChD.run(); } } }
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
29.05.2007, 12:30 | #12 |
Участник
|
Та блин, ничего не мешает, кроме как незнание этого вот самого!
Т.е. все, что я написала в main() своего класса я с тем же успехом могу написать в validateWrite() датасорса вызывающей формы? Не, зашибись, но где здесь ret = false, если run у меня не есть булеан? Или здесь это заменяет prompt()? Ух, у меня этот проект будет наглядным пособием по программированию !
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 12:38 | #13 |
Участник
|
Суть в следующем:
Все довольно просто. Вы вызываете объект 1 из объекта 2. И потом хотите вернуть результат в объект 2 из объекта 1. Для этого вам нужно иметь доступ из объекта 2 к объекту 1 или наоборот, помнить ссылку на объект 2 в объекте 1. Так как вызываете вы класс из метода, то вызывающего объекта (объект 2) в том смысле, что описан выше, у Вас нет. Поэтому применим второй вариант. Для этого вместо вызова пункта меню (что приведет к вызову метода main) можно эту логику поместить непосредственно в метод validateWrite, как советуют выше X++: SUG_Change_Dial sug_ChD = new SUG_Change_Dial(); ; sug_ChD.setCustTable(this); sug_ChD.setFormName('CustTable'); if (sug_ChD.prompt()) { sug_ChD.run(); } return sug_ChD.parmReturnValue(); 1. Как видим, определять тип вызова уже не нужно, потому что код вызывается из каждого метода разных таблиц по-своему. 2.Нужно в классе создать переменную, в которую в методе run будет записано значение возврата (то есть true или false для validateWrite()) 3. Реализации методов setCustTable, setFormName Вы не приводили, поэтому написал в них то, что ближе всего подходило по смыслу. |
|
29.05.2007, 12:51 | #14 |
Участник
|
В метод validateWrite() вставила
X++: args.caller(element); args.record(custTable); sug_ch_dial.setCustTable(args); sug_ch_dial.setFormName(args); if (sug_ch_dial.prompt()) { sug_ch_dial.run(); } else { ret = false; }
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 13:08 | #15 |
Участник
|
Ээээ... как всегда, сначала написала, потом увидела и прочитала. Спасибо, Иван Пытаюсь сделать, как Вы написали. Правда, опять же, мало что понимаю из всего этого.
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 13:10 | #16 |
Участник
|
В classdeclaration класса создайте переменную boolean. И в самый верх Поставьте flag=true. Сделайте метод на классе getflag. И после вашего if (ug_ch_dial.prompt()) проверьте getflag(). Но что то мне подсказывает что вам не это надо. Мне кажется вам надо успешно ли отработал ваш класс или нет. А не нажал кто то на ok или не нажал.
|
|
29.05.2007, 13:22 | #17 |
Участник
|
Уважаемый модератор, можно попросить удалить сообщения 17 и 18? Может у Вас это быстрее получится
Почему, когда в окошке быстрый ответ нажимаешь "Home" и потом "Del" - это считается как отправка сообщения? Не буду больше этим окошком пользоваться
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 13:26 | #18 |
Участник
|
Ваши сообщения вы можете удалить сами. Просто зайдите в его редактирование и нажмите удалить сообщение. (в расширенном режиме редактирования)
А в быстром ответе home и del работают правильно, - видимо это у вас какие-то личные настройки браузера |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
29.05.2007, 13:29 | #19 |
Участник
|
miklenew, Вы не правы Мне как раз и нужно отловить нажатие "Отмена" на моем диалоге. И если нажата "Отмена" - отменить сохранение изменений в таблицу CustTable из аналогичной формы.
Может объясните все-таки почему у меня форма не закрывается, пока я ОК не нажму? Почему ret = false так на закрытие действует?
__________________
MBS-Axapta 3.0 CIS SP3 |
|
29.05.2007, 13:34 | #20 |
Участник
|
Я знаю, что могу сама удалять, просто инет тормознутый. Бесит ждать.
__________________
MBS-Axapta 3.0 CIS SP3 |
|