05.04.2012, 10:53 | #1 |
Участник
|
С Формы в Класс
Доброго времени суток!
Помогите пожалуиста начинающему. Необходимо создать возможность для гененрирования дополнительного отчета по Реестру прикладных документов по складу.Для этого на форме которая вызывается для работы я ввел дополнительный CheckBox ,при нажатии на которыи есть возможность создать другой вид реестра. Поработал с классом которыи генерирует эти реестры, создал метод которыи будет генерировать реестр другого вида. Но вот проблема (видимо связанна с пробелами знаннии в ООП и вообще AX) я не могу передать в этот класс значения checkBox что бы внутри класса происходило переключение между типами отчета.поскольку не вижу тревиального обращения с формы к классу.Есть только момент в котором выбирается название этого класса из Enum а дальше происходит что-то непонятное. Дебагером отследить происходящее не могу потому как ход работы останавливается изза пользовательских настроек. При создании public метода в классе ,в котором я запоминаю значения ChekBox'а с формы-значение теряется видимо по тому, что создатся далее по ходу программы новый экземпляр этого класса. Посоветуйте пожалуитса как передать значение ChekBox'а с формы.Жеательно с примерами в виде кода. Поскольку не первый раз мучаюсь с этим проблемами. вот кусок код в котором происходит запрос к Enum X++: public void init() { curUser = CurUserId(); formreport = vsn_ReportInputFormTable::VSN_ReestrReceipOrder; if (! element.args().caller()) throw error("Class not found"); caLClass = element.args().caller().runbase(); super(); } |
|
05.04.2012, 11:02 | #2 |
Участник
|
Как мне кажется, лучше сделать через menuFunction - на кнопке в форме перекрыть метод clicked() и добавить примерно следующий код:
X++: void clicked() { MenuFunction menuFunction; Args args = new Args(); args.record( ); args.caller(element); args.parmEnumType(typeid(NoYes); args.parmEnum(CheckBox.checked()); menuFunction = new menuFunction(menuItemActionStr( ), MenuItemType::Action); menuFunction.run(args); } X++: Args parmArgs(Args _args = args)
{
;
args = _args;
return args;
} X++: this.parmArgs(_args) X++: if (args.parmEnum() && args.parmEnumType() == typeId(NoYes) ) { if (args.parmEnum() == NoYes::Yes) { } else { } }
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 05.04.2012 в 11:11. |
|
|
За это сообщение автора поблагодарили: FridmanV (1). |
05.04.2012, 11:27 | #3 |
Участник
|
у меня возникают проблемы с перекртыием метода на форме.
X++: void clicked() { MenuFunction menuFunction; Args args = new Args(); args.record( ); args.caller(element); args.parmEnumType(typeid(NoYes); args.parmEnum(CheckBox.checked()); menuFunction = new menuFunction(menuItemActionStr( ), MenuItemType::Action); menuFunction.run(args); } 2.args.record(можно положить курсор);-можно туда ниче не класть? 3.Выдает Синтаксическую ошибку при упоминании args. Все рано спасибо за ответ - он полюбому работает-просто я чет не могу догнать как его адаптировать под свою формочку |
|
05.04.2012, 11:35 | #4 |
Участник
|
Цитата:
1.Зачем тут использовать MenuItem?
Цитата:
2.args.record(можно положить курсор);-можно туда ниче не класть?
Цитата:
3.Выдает Синтаксическую ошибку при упоминании args.
__________________
С уважением, Александр. |
|
05.04.2012, 11:37 | #5 |
Участник
|
Изнавчально когда OnClick перекрываю .
|
|
05.04.2012, 11:39 | #6 |
Участник
|
какой OnClick, к чему относится этот метод?
__________________
С уважением, Александр. |
|
05.04.2012, 11:43 | #7 |
Участник
|
Ой пардон метод clicked на кнопке формы.
а MenyItem должен быть тот к которому относится данная форма?я ниче не путаю в смысле) |
|
05.04.2012, 11:47 | #8 |
Участник
|
Нет, как я уже написал, MenuItem должен быть создан для вызываемого класса. Посмотрите внимательно метод Clicked() - я привел его в качестве шаблонного примера, в нем нужны некоторые исправления, в частности наименование менюшки.
__________________
С уважением, Александр. Последний раз редактировалось samolalex; 05.04.2012 в 11:50. |
|
05.04.2012, 11:51 | #9 |
Участник
|
Так вот сеичас я написал вот таким образом этод метод
X++: ; MenuFunction menuFunction; Args args = new Args(); args.record( ); args.caller(element); args.parmEnumType(typeid(NoYes)); args.parmEnum(CheckBox.checked()); menuFunction = new menuFunction(menuItemActionStr( ), MenuItemType::Action); menuFunction.run(args); выдает синтаксическую ошибку. я немного тромажу получается чем служит menuItem - вообще чет не понимаю к сожалению.( Последний раз редактировалось FridmanV; 05.04.2012 в 11:53. |
|
05.04.2012, 13:14 | #10 |
Участник
|
Все исправил юперекрыл метод но что то походу сделал не так.
X++: void clicked() { MenuFunction menuFunction; Args args = new Args(); ; args.record(); args.caller(checkBox); args.parmEnumType(typeid(NoYes)); args.parmEnum(CheckBox.value(1)); menuFunction = new menuFunction(menuItemActionStr(Vsn_Item4chenge),MenuItemType::Action); menuFunction.run(args); super(); element.runCollection(); } пишет что No object specified on Vsn_Item4chenge |
|
05.04.2012, 13:31 | #11 |
Участник
|
в свойствах menuItem нужно выбрать вызываемый объект и его тип, в данном случае класс.
__________________
С уважением, Александр. |
|
05.04.2012, 14:07 | #12 |
Участник
|
Все собрал но где то опять напортачил-ошибок не выдает но инче не происходит
так перекрыл метод на форме X++: public void closeOk() { VSN_ReestrReceipOrder ReestrReceip; dialogRunbase dialog = element.args().caller(); ; caLClass.parmParam(param1); dialog.updateServer(); If (caLClass.CheckCloseDialog()) { super(); } } X++: Args parmArgs(Args _args = args)
{
;
args = _args;
return args;
} сделал переключение в Start X++: if (args.parmEnum() && args.parmEnumType() == typeId(NoYes) ) { if (args.parmEnum() == NoYes::Yes) {this.vendcalc(); } else { this.vendcalcInvoice(); } } |
|
05.04.2012, 14:11 | #13 |
Участник
|
ои ои чет вообще не здооровое я сделал
теперь при нажатии Ok выскакивает такая же форма- а при закрытии формируется пустои отчет |
|
05.04.2012, 16:15 | #14 |
Участник
|
Так теперь -все почти норм только он в If во внтурь не проходит.
вот тут X++: if (args.parmEnum() && args.parmEnumType() == typeId(NoYes) ) { if (args.parmEnum() == NoYes::Yes) { this.vendcalc(); } else { this.vendcalcInvoice(); } } |
|
18.04.2012, 14:48 | #15 |
Участник
|
У меня подобная проблема. Если мне нужно переменную в класс передать, то как поправить то что выше написано для меня?
|
|
18.04.2012, 15:02 | #16 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: smailik (1). |
18.04.2012, 15:10 | #17 |
Программатор
|
завести в классе парм метод и пихать туда свой параметр
|
|
18.04.2012, 15:14 | #18 |
северный Будда
|
Коллеги, если вам нужно передать переменную, которая в классе определяет тип отчёта, то вы КМК изначально идёте по неверному пути. Должен быть один исходный класс-родитель, запускающий формирование отчёта. Вы заводите енум, который перечисляет все типы отчётов, строимые этим классом и его потомками. В настройках менюайтема вы указываете класс, енум и конкретное значение (какой тип отчёта запускает кнопка). А далее уже в самом классе заводите статический метод construct, который по _args.parmEnum() создаёт правильный экземпляр потомка. И уж в потомке надо расписывать логику построения отчёта.
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: G.Menshikh (1). |
18.04.2012, 15:18 | #19 |
Участник
|
Мне надо передать в класс значение поля таблицы.
В методе parmArgs выдает ошибку "Имя _args уже употребляется во внешнем контексте" А в main ругается на надпись this.parmArgs(_args) "Таблица не содержит это поле" |
|
18.04.2012, 15:22 | #20 |
Участник
|
Напраление этого пути задал автор вопроса. В вашем варианте необходимо под каждый отчёт иметь отдельную кнопку. Автор же хотел одну кнопку + ComboBox
|
|
Теги |
args, значение, класс, форма |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|