20.06.2016, 11:16 | #1 |
Участник
|
вызов класса из меню
И снова всем привет =) Продолжаю осваивать DAX, и сегодня на повестке дня у меня следующая проблема:
У меня есть таблица типа: |_Номер документа для разноски_|_Posted_ | |______DAT-000005_____________|__нет___| и так далее. Я написал класс, который изменяет поле Posted для заданного номера DAT. Запуск класса осуществлялся из формы: пользователь нажимал кнопку, появлялся диалог, запрашивающий номер, осуществлялся ввод номера и Posted изменялось. Теперь мне необходимо осуществить запуск класса не из формы, а напрямую из меню. Я создал в меню ссылку на этот класс,но после того, как пытаюсь запустить его на выполнение, мне выдает ошибку: FormDataSource Объект не инициализирован. Трассировка стека (C)\Classes\MyChangePostedClass\new - line 9 (C)\Classes\MyChangePostedClass\main - line 11 Я понимаю, почему эта ошибка возникает: никакие параметры на вход класса не подаются. А вопрос в том, каким образом это исправляют? Заранее спасибо. |
|
20.06.2016, 11:28 | #2 |
Участник
|
Добрый день!
В new аргументы из формы передаёте? Удостоверьтесь в том, что на форме в параметрах контрола заполнено поле DataSource. |
|
20.06.2016, 11:39 | #3 |
Участник
|
Цитата:
На контрол поставил DataSource. Так, я делаю следующим образом: X++: public static void main(Args _args) { MyChangePostedClass objClass; TableHead tableHead; FormDataSource tableHead_ds; ; tableHead =_args.record(); tableHead_ds = tableHead.dataSource(); objClass = new MyChangePostedClass(tableHead); } Когда из формы этот класс вызываю - проблем нет, все работает. Но из меню отдельный вызов класса делать отказывается |
|
20.06.2016, 12:19 | #4 |
Участник
|
Потому что у пункта меню нет свойства DataSource, поэтому на строчке
X++: tableHead_ds = tableHead.dataSource(); Добавьте проверку на наличие источника данных - ошибка уйдет. Если поставить созданный меню айтем на контрол меню айтем на форме и указать свойство ему DataSource = ваш источник данных - тогда будет работать корректно. Если же вы хотите вызывать этот класс ещё где-то - добавите условие и будет Ок все. |
|
20.06.2016, 13:16 | #5 |
Участник
|
Пока у Вас не сформировалась "вредная привычка"
Метод new - не должен принимать никаких параметров. От слова "совсем" Причина в том, что есть ряд ситуаций, когда объект класса создается "анонимно". Например, при формировании пакетных заданий. В этом случае метод new() будет выполнен, но, естественно, никаких параметров ему передано не будет. А это может привести к неожиданным ошибкам исполнения. Вот чтобы подобных казусов не случалось, лучше заранее считать, что метод new() параметры принимать не должен! Создавайте отдельные методы для приема/передачи параметров и выполняйте их после методе New() примерно так X++: objClass = new MyChangePostedClass();
objClass.setTableHead(tableHead);
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: AlGol (1), Artikov (1). |
20.06.2016, 13:58 | #6 |
Участник
|
Спасибо за ответы, в частности за указание на вредную привычку =) Не знал, сейчас буду переделывать и переписывать. Вроде суть уловил
|
|