AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.07.2002, 11:31   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Args
Помогите разобраться с Args

Открываю форму следующим образом:

new MenuFunction(menuItemDisplayStr("frm"), MenuItemType :: Display).run(args);

В Args хочу передавать несколько параметров. Как это сделать ?

Метод param передает всего один параметр, причем это строка. Есть, конечно, возможность передать объект, полями которого и будут мои переменные. Но для этого в АОТ надо создать свой объект, что не есть хорошо.

Что делают в таких случаях ?
Старый 23.07.2002, 12:38   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Берешь, AOT.
Делаешь поиск строки "new MenuFunction(menuItemDisplayStr"
получешь результат.

Например, Form AddressCheck

PHP код:
void clicked()
{
    
Args            parameters = new Args();
    
MenuFunction    addressFormatMenu;
    ;

    
addressFormatMenu = new MenuFunction(menuItemDisplayStr(AddressFormat),MenuItemType::Display);
    
parameters.caller(this);
    
addressFormatMenu.run(parameters);

Обрати внимание, что parameters, это объект.
Перед Run установи параметры.
Старый 23.07.2002, 12:42   #3  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Если параметры - простые типы данных (int, string и т.д.), можно их упаковывать в строку с разделителями и передавать чераз args.parm(). При упаковке могут пригодиться методы con2str() и str2con():
PHP код:
string s;
int i;
;
...
args.parm(con2str([sint2str(i)])) 
__________________
Андрей.
За это сообщение автора поблагодарили: bagyr (1), alex55 (1).
Старый 23.07.2002, 13:06   #4  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Если параметры - простые типы данных (int, string и т.д.), можно их упаковывать в строку с разделителями и передавать чераз args.parm(). При упаковке могут пригодиться методы con2str() и str2con():
Спасибо. Это то, что я и хотел узнать.
Старый 23.07.2002, 13:18   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Dron AKA andy, классный прием.
Спасибо.
Старый 23.07.2002, 13:41   #6  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Например, Form AddressCheck

void clicked()
{
Args parameters = new Args();
MenuFunction addressFormatMenu;
;

addressFormatMenu = new MenuFunction(menuItemDisplayStr(AddressFormat),MenuItemType:<img src="http://www.axforum.info/forums/images/smilies/biggrin.gif" border="0" alt="">isplay);
parameters.caller(this);
addressFormatMenu.run(parameters);

Обрати внимание, что parameters, это объект.
Хм. Честно, говоря я не понял этот пример.

parameters это объект класса Args. Согласен.

Цитата:
Перед Run установи параметры.
В этом собственно и был мой вопрос. Как установить параметры ?

Если у меня есть класс (например А) и я в нем говорю args.caller(this), то тем самым я передаю в вызываемый класс/форму (назовем его Б) ссылку на него. Имея эту ссылко я могу много чего сделать, в том числе вызывать методы этого класса А и посредством этих методов обращаться к переменным класс А.

Но у меня есть форма (А) с клавишей. При нажатии на клавишу, я конечно могу сказать args.caller(this). Более того в вызываемом классе/форме (Б) я получу ссылку на эту кнопку. Но на фига мне ссылка на кнопку....
Казалось бы, в этом случае разумно передавать не ссылку на кнопку, а ссылку на форму - args.caller(element). Тогда в форме Б я пытаюсь делать так:

public void init()
{
Args args;
Б б;
;

super();
args = element.args();

б = args.caller();
б.Имя метода формы Б
}

Но Аксапта ругается, говорит, что Б это не класс. Ясно дело, что это форма.

Или это я чего-то не понял ?
Старый 23.07.2002, 14:31   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Не могу сейчас проверить, но мне кажется что дело в приведении типов

public void init()
{
Args args;
FormRun f;
Б б;
;

super();
args = element.args();

f = args.caller();
б = f;
б.Имя метода формы Б
}

Опять же поищи в AOT'е как уже сделано.
Старый 23.07.2002, 14:45   #8  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Не могу сейчас проверить, но мне кажется что дело в приведении типов
Приведение типов было бы вот здесь:

PHP код:
args.caller(); 
б f
б.Имя метода формы Б 
А у меня ругается вот здесь:

PHP код:
Б б
Б - это форма. При этом нет класса с таким же названием, нет таблцы с таким же названием.
Старый 23.07.2002, 14:47   #9  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:

...
FormRun f;
Б б;
;
...
б.Имя метода формы Б
Если нужно вызвать какой-либо метод из формы, то переменную "б" следует объявить как Object:
PHP код:
...
Object б;

...
б args.caller();
б.Имя метода формы Б 
... 
__________________
Андрей.
Старый 23.07.2002, 14:49   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Dron AKA andy, точно? Разве так можно?
Старый 23.07.2002, 14:59   #11  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Однозначно !
По перекрестным ссылкам на Object можно найти кучу примеров.
Например, в методе
\Data Dictionary\Tables\LedgerTable\Methods\lookupAccountNumByType
__________________
Андрей.
Старый 23.07.2002, 15:04   #12  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Если нужно вызвать какой-либо метод из формы, то переменную "б" следует объявить как Object
Да. Действительно так работает. Я проверил.

Большое спасибо.
Старый 18.03.2004, 10:16   #13  
ArturK is offline
ArturK
Участник
 
81 / 10 (1) +
Регистрация: 13.08.2003
Цитата:
Изначально опубликовано Dron AKA andy
Если параметры - простые типы данных (int, string и т.д.), можно их упаковывать в строку с разделителями и передавать чераз args.parm(). При упаковке могут пригодиться методы con2str() и str2con():
PHP код:
string s;
int i;
;
...
args.parm(con2str([sint2str(i)])) 
А как извлекать все переданные параметры?

Я пишу:
PHP код:
smNum  element.args().parm(); 
И получаю только первый параметр ...
Старый 18.03.2004, 10:40   #14  
DMA is offline
DMA
Участник
 
109 / 19 (1) ++
Регистрация: 30.09.2003
Цитата:
Изначально опубликовано ArturK


А как извлекать все переданные параметры?

Я пишу:
PHP код:
smNum  element.args().parm(); 
И получаю только первый параметр ...
Ну если вы передаете контейнер, то и принимайте в контейнер, а не в строку
Старый 11.09.2006, 10:45   #15  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
А у меня все получается нормально с передачей, но после приема в сонтейнер из аргса, он говорит, что там данные типа int, а мне нужно чтобы они остались string (дело в том что это у меня номерная серия, а при инт'е он отбрасывает лишние нули)?
Старый 11.09.2006, 10:59   #16  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А покажите, как именно вы передаете параметры - и как принимаете
Старый 11.09.2006, 11:14   #17  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
2 DMA : Злостный офф, но в Вашей подписи 2 ошибки. Исправьте хотя бы одну, не вводите людей в заблуждение
__________________
Best Regards,
Roman
Старый 11.09.2006, 11:50   #18  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от kashperuk Посмотреть сообщение
А покажите, как именно вы передаете параметры - и как принимаете
передаю так:
cont=[code1,code2]; ///code1, code строковые переменные
args().param(con2str(Cont));
..........................
В классе обращаюсь

cont=args.parm(str2con);

И здесь при просмотре типов данных в дебагере он показывает тип интежер и вместо значения 000000002 он показывает 2. А при обращении к строке с кодом 2 он выдаст ошибку, что такой строки нет
Старый 11.09.2006, 11:55   #19  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
небольшая поправка, когда в классе обращаюсь не
cont=args.parm(str2con);
а cont=str2con(args.parm());
Старый 11.09.2006, 11:59   #20  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Используйте вместо str2con метод того же класса Global - str2con_RU()

Вот тестовый job:
Код:
static void Job5(Args _args)
{
    container cont;
    str       strCont;
    str     code1, code2;
    ;
    code1 = "00000001";
    code2 = "00000002";
    cont = [code1, code2];
    info(con2str(cont));
    strCont = con2str(cont);
    cont = str2con_RU(strCont);
    info(conPeek(cont, 1));
}
Теги
args, menufunction, как правильно, полезное, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов метода element.args().caller().setOfficialsParams(.... Poleax DAX: Программирование 6 04.09.2008 19:49
Использование caller в args Zoe DAX: Программирование 3 23.04.2008 12:18
args.dataset() и args.record().tableid - могут ли отличаться? gl00mie DAX: Программирование 5 06.08.2007 13:21
args.caller() и .dialog maximka DAX: Программирование 2 04.06.2007 13:27
args().caller() - ссылка puz DAX: Программирование 2 16.09.2003 12:49

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:39.