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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.09.2009, 22:16   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Свойства элемента управления в отладчике.
Коллеги кто нибудь знает способ как можно посмотреть на лету свойства произвольного контрола формы.

Чтобы было понятнее опишу проблему:
На форме после определенных действий слетает до нуля ширина контрола. Чтобы проконтролировать причину, хотелось бы иметь метод который выведет в инфолог все актуальные свойства для данного элемента управления на текущий момент.

Есть какой нибудь готовое решение или полуфабрикат решения ? Чтобы тупо не перечислять все свойства в коде.

В отладчике их к сожалению не видно.
Хочу сравнить как меняются свойства контрола после того как его внешний вид "сломался".
Старый 01.10.2009, 08:36   #2  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Что за контрол, какого типа? И что за действия?
По идее можно инфологи в горячих точках понаставить:
X++:
info(strfmt("Ширина контрола: %1",
    element.design().controlName("MyControl").width(0, 0)
    ));
__________________
// no comments
Старый 01.10.2009, 08:55   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Вот такой вот метод за кружкой чая накидал.
Не идеальный, но условно работает
X++:
//DSPIC
static void showControlProperties(FormControl _formControl)
{
    TreeNodePath    treeNodePath = "\\System Documentation\\Classes\\";
    TreeNode        treeNode;
    SysDictClass    dictClass;
    str             allPropertiesStr, methodName;
    ;

    if (!_formControl)
        return;

    dictClass = new SysDictClass(classIdGet(_formControl));

    if (dictClass)
    {
        treeNodePath += dictClass.name();
        treeNode      = TreeNode::findNode(treeNodePath);
    }

    if (!treeNode)
        return;

    treeNode = treeNode.AOTfirstChild();
    while (treeNode)
    {
        if (treeNode.AOTbitmapId() == 866) //check, is property method?
        {
            methodName = treeNode.treeNodeName();

            try
            {
                if (dictClass.hasObjectMethod(methodName) &&
                    methodName != "width"   &&
                    methodName != "height"  &&
                    methodName != "left"    &&
                    methodName != "top")
                {
                    allPropertiesStr += strFmt("%1: %2\n", methodName, dictClass.callObject(methodName, _formControl));
                }
            }
            catch{}
        }

        treeNode = treeNode.AOTnextSibling();
    }

    info (allPropertiesStr);
}
За это сообщение автора поблагодарили: Logger (5).
Старый 01.10.2009, 10:33   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Чуть более универсально, но тупо
X++:
client static void GetControlProperties(FormControl _control)
{
    DictClass   dictClass;
    DictMethod  dictMethod;
    int         i;
    Types       returnType;
    str         fheader;
    ;
    if (_control)
    {
        dictClass = new DictClass(_control.handle());
        if (dictClass)
        {
            SetPrefix(_control.name());
            info(strfmt('Control Name: "%1"\nClass Name: "%2"', _control.name(), dictClass.name()));
            for (i = 1; i <= dictClass.objectMethodCnt(); i++)
            {
                dictMethod = dictClass.objectMethodObject(i);
                if (dictMethod.propertyMethod())
                {
                    if(dictMethod.returnType() == Types::USERTYPE)
                        returnType = new DictType(dictMethod.returnId()).baseType();
                    else
                        returnType = dictMethod.returnType();
                    if (returnType != Types::void && returnType != Types::Class && 
                        returnType != Types::Record && returnType != Types::Container)
                    {
                        fheader = infolog.helpGenerator().funcHeader('Kerndoc://classes/'+dictClass.Name()+'/'+dictMethod.name());
                        if (!match("(.+\\ +\\[", fheader))
                            info(strfmt('Property:"%1"\tValue: "%2"', dictMethod.name(), dictClass.callObject(dictMethod.name(), _control)));
                    }
                }
            }
        }
    }
}
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: Logger (9).
Старый 01.10.2009, 11:21   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Спасибо, всем ответившим.

Ситуация была такова :
на форме создания заказа при выборе адреса из кода X++ подставлялось значение в контрол отображающий поле salesTable.deliveryAddress

После такой подстановки для некоторых клиентов контрол становился очень узким- несколько пикселей или совсем невидимым. Собственно я пытался понять что с ним происходит, может быть какое-нить свойство слетает, но тупо перебирать все было лениво.

В итоге выяснил, что для слишком длинных текстов ядро пытается нарисовать сбоку элемента управления вертикальную полосу прокрутки (высота контрола была 3 символа и не все адреса помещались в FormStringEdit высотой 3 символа и шириной 30). После такое прорисовки проявлялся глюк.

Рецепт лечения: после изменения значения - принудительно добиться перерисовки контрола с нуля вызовом
X++:
ctrl.visible(false);
ctrl.visible(true);
Старый 01.10.2009, 11:26   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от dech Посмотреть сообщение
Что за контрол, какого типа? И что за действия?
По идее можно инфологи в горячих точках понаставить:
X++:
info(strfmt("Ширина контрола: %1",
    element.design().controlName("MyControl").width(0, 0)
    ));
Ну примерно так и сделал вчера.

Посадил на нажатие кнопки вывод в инфолог значений
X++:
    info4([
        ctrl.visible(),
        SalesTable_ds.object(fieldNum(SalesTable, DeliveryAddress)).visible(),
        ctrl.widthMode(),
        ctrl.widthValue(),
        ctrl.displayLengthMode(),
        ctrl.displayLengthValue(),
        ctrl.text(),
        SalesTable.deliveryAddress,
        ctrl.dataField(),
        ctrl.dataMethod(),
        ctrl.dataSource(),
        ctrl.xml()
    ]);
ничего не менялось !
Старый 01.10.2009, 11:34   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndyD Посмотреть сообщение
Чуть более универсально, но тупо
X++:
client static void GetControlProperties(FormControl _control)
{
    DictClass   dictClass;
    DictMethod  dictMethod;
    int         i;
    Types       returnType;
    str         fheader;
    ;
    if (_control)
    {
        dictClass = new DictClass(_control.handle());
        if (dictClass)
        {
            SetPrefix(_control.name());
            info(strfmt('Control Name: "%1"\nClass Name: "%2"', _control.name(), dictClass.name()));
            for (i = 1; i <= dictClass.objectMethodCnt(); i++)
            {
                dictMethod = dictClass.objectMethodObject(i);
                if (dictMethod.propertyMethod())
                {
                    if(dictMethod.returnType() == Types::USERTYPE)
                        returnType = new DictType(dictMethod.returnId()).baseType();
                    else
                        returnType = dictMethod.returnType();
                    if (returnType != Types::void && returnType != Types::Class && 
                        returnType != Types::Record && returnType != Types::Container)
                    {
                        fheader = infolog.helpGenerator().funcHeader('Kerndoc://classes/'+dictClass.Name()+'/'+dictMethod.name());
                        if (!match("(.+\\ +\\[", fheader))
                            info(strfmt('Property:"%1"\tValue: "%2"', dictMethod.name(), dictClass.callObject(dictMethod.name(), _control)));
                    }
                }
            }
        }
    }
}
Здорово !

А подскажите что делает вот эта проверка ?
X++:
if (!match("(.+\\ +\\[", fheader))
т.е. зачем она поставлена ?

Последний раз редактировалось Logger; 01.10.2009 в 11:45.
Старый 01.10.2009, 12:03   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
В некоторых пропертях в вызов метода в обязательном порядке необходимо передавать параметры
X++:
public final int height(int _value [, int _mode] )

public final int heightMode( [int _value] )
Этой проверкой я смотрю, есть ли дополнительный текст между круглой и квадратной скобкой помимо пробела в определении вызова. Если есть, то считаю что это дополнительный параметр/параметры и не вызывают этот метод

К сожалению, не нашел возможность проверять это с помощью каких-либо методов.
В общем, я же говорю: тупо
__________________
Axapta v.3.0 sp5 kr2
Старый 01.10.2009, 12:28   #9  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от AndyD Посмотреть сообщение
В некоторых пропертях в вызов метода в обязательном порядке необходимо передавать параметры
X++:
public final int height(int _value [, int _mode] )

public final int heightMode( [int _value] )
Этой проверкой я смотрю, есть ли дополнительный текст между круглой и квадратной скобкой помимо пробела в определении вызова. Если есть, то считаю что это дополнительный параметр/параметры и не вызывают этот метод

К сожалению, не нашел возможность проверять это с помощью каких-либо методов.
В общем, я же говорю: тупо
Думаю, это можно проверить методами класса DictMethod:

parameterCnt
parameterId
parameterName
parameterOptional
parameterType
Старый 01.10.2009, 12:30   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Еще немного и мы свой отладчик напишем
Старый 01.10.2009, 12:53   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Думаю, это можно проверить методами класса DictMethod:

parameterCnt
parameterId
parameterName
parameterOptional
parameterType
В тройке нет метода parameterOptional, к сожалению
__________________
Axapta v.3.0 sp5 kr2
Теги
отладчик, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
aEremenko: Пакет управления MOM для DAX 2009 Blog bot DAX Blogs 0 03.05.2009 10:05
Значение из элемента диалога Roman777 DAX: Программирование 3 26.02.2007 12:48
Свойство элемента управления из метода класса Zeratul DAX: Программирование 4 11.05.2006 17:32
Изменение элемента в АОТ anf DAX: Программирование 0 25.11.2004 10:18
Свойства MenuItemName и MenuItemType Roman A. DAX: Программирование 1 11.05.2004 10:13

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

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

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