30.09.2009, 22:16 | #1 |
Участник
|
Свойства элемента управления в отладчике.
Коллеги кто нибудь знает способ как можно посмотреть на лету свойства произвольного контрола формы.
Чтобы было понятнее опишу проблему: На форме после определенных действий слетает до нуля ширина контрола. Чтобы проконтролировать причину, хотелось бы иметь метод который выведет в инфолог все актуальные свойства для данного элемента управления на текущий момент. Есть какой нибудь готовое решение или полуфабрикат решения ? Чтобы тупо не перечислять все свойства в коде. В отладчике их к сожалению не видно. Хочу сравнить как меняются свойства контрола после того как его внешний вид "сломался". |
|
01.10.2009, 08:36 | #2 |
Участник
|
Что за контрол, какого типа? И что за действия?
По идее можно инфологи в горячих точках понаставить: X++: info(strfmt("Ширина контрола: %1", element.design().controlName("MyControl").width(0, 0) ));
__________________
// no comments |
|
01.10.2009, 08:55 | #3 |
Боец
|
Вот такой вот метод за кружкой чая накидал.
Не идеальный, но условно работает 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 |
Участник
|
Чуть более универсально, но тупо
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 |
Участник
|
Спасибо, всем ответившим.
Ситуация была такова : на форме создания заказа при выборе адреса из кода X++ подставлялось значение в контрол отображающий поле salesTable.deliveryAddress После такой подстановки для некоторых клиентов контрол становился очень узким- несколько пикселей или совсем невидимым. Собственно я пытался понять что с ним происходит, может быть какое-нить свойство слетает, но тупо перебирать все было лениво. В итоге выяснил, что для слишком длинных текстов ядро пытается нарисовать сбоку элемента управления вертикальную полосу прокрутки (высота контрола была 3 символа и не все адреса помещались в FormStringEdit высотой 3 символа и шириной 30). После такое прорисовки проявлялся глюк. Рецепт лечения: после изменения значения - принудительно добиться перерисовки контрола с нуля вызовом X++: ctrl.visible(false); ctrl.visible(true); |
|
01.10.2009, 11:26 | #6 |
Участник
|
Цитата:
Посадил на нажатие кнопки вывод в инфолог значений 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 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
В некоторых пропертях в вызов метода в обязательном порядке необходимо передавать параметры
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 |
Боец
|
Цитата:
Сообщение от AndyD
В некоторых пропертях в вызов метода в обязательном порядке необходимо передавать параметры
X++: public final int height(int _value [, int _mode] ) public final int heightMode( [int _value] ) К сожалению, не нашел возможность проверять это с помощью каких-либо методов. В общем, я же говорю: тупо parameterCnt parameterId parameterName parameterOptional parameterType |
|
01.10.2009, 12:30 | #10 |
Участник
|
Еще немного и мы свой отладчик напишем
|
|
01.10.2009, 12:53 | #11 |
Участник
|
В тройке нет метода parameterOptional, к сожалению
__________________
Axapta v.3.0 sp5 kr2 |
|