|  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 | 
|  |