|  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 | 
| Участник | 
			
			Спасибо за ответы, в частности за указание на вредную привычку =) Не знал, сейчас буду переделывать и переписывать. Вроде суть уловил
		 | 
|  |