|  26.10.2009, 17:16 | #1 | 
| Участник | Отображение десятичных знаков в форме 
			
			Привет всем! Одно и то же поле таблицы должно отображаться в 2х разных формах по разному: в одной - количество знаков после запятой - 11 (как указано в EDT), а в другой - 2. Как сделать второй вариант?  PS NoOfDecimals в свойствах контрола не доступно из-за AutoDataGroup.. Последний раз редактировалось decoder; 26.10.2009 в 17:23. | 
|  | 
|  26.10.2009, 17:24 | #2 | 
| Ищущий знания... | 
			
			в десигне формы у полей типа RealEdit есть свойство NoOfDecimals (число десятичных знаков отображения). Выставляете там такую цифирку сколько хотите видеть на форме, и будет вам счастье.
		 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  26.10.2009, 17:26 | #3 | 
| Участник | 
			
			Вы же понимаете, что если во второй форме вы ограничите количество отображаемых знаков после запятой двумя, то и ввести в этой форме вы сможете только 2 знака после запятой, а не 11.. Просто предупреждаю заранее   | 
|  | 
|  26.10.2009, 17:27 | #4 | 
| Боец | Цитата: element.control(control::ControlName).NoOfDecimals | 
|  | 
|  26.10.2009, 17:28 | #5 | 
| Ищущий знания... | 
			
			поставить AutoDataGroup в No, и выставить нужное свойство
		 
				__________________ "Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем | 
|  | 
|  26.10.2009, 19:00 | #6 | 
| Участник | 
			
			Не, отказываться от AutoDataGroup == Yes из-за такой мелочи не стоит - уж слишком полезное это свойство   Более, на мой взгляд, гибкое решения можно найти тут: Итератор с поддержкой методов обратного вызова для обработки контролов на форме. В данном конкретном случае можно в методе обратного вызова у FormRealControl проверять свойства dataSource() и dataField(): первое должно совпадать с MyTable_DS.id() (к которому относится поле), а второе - с extendedFieldId поля в таблице, т.е., например, с fieldId2Ext( fieldnum(MyTable, MyRealField), 1 ). Если совпали, значит, итератор передал контрол, связанный с нужным полем, и надо выставить у него свойство NoOfDecimals. Учтите, что таких контролов на форме может быть несколько, поэтому, в частности, варианты с использованием enum'а Control не являются надежным решением, кроме того, так вы привязываетесь к конкретному названию контрола на форме, хотя по постановке задачи скорее должны привязываться к полю таблицы. Цитата:   Последний раз редактировалось gl00mie; 26.10.2009 в 19:05. | 
|  | 
|  26.10.2009, 20:27 | #7 | 
| Участник | 
			
			Как вариант. Сделать display или даже edit метод (если необходимо редактирование), который будет возвращать/принимать расширенный тип данных с заранее настроенной точностью. Вынести созданный метод в нужную группу полей. Преимущество: AutoDataGroup == Yes; отсутствие кода на форме Недостаток: будет невозможно сортировать и фильтровать по дисплэйному полю | 
|  | 
|  27.10.2009, 12:43 | #8 | 
| Участник | 
			
			оч удобно, но порождает ошибку run-time.. Цитата: 
		
			Сообщение от gl00mie
			   В данном конкретном случае можно в методе обратного вызова у FormRealControl проверять свойства dataSource() и dataField(): первое должно совпадать с MyTable_DS.id() (к которому относится поле), а второе - с extendedFieldId поля в таблице, т.е., например, с fieldId2Ext( fieldnum(MyTable, MyRealField), 1 ). Если совпали, значит, итератор передал контрол, связанный с нужным полем, и надо выставить у него свойство NoOfDecimals..   Последний раз редактировалось decoder; 27.10.2009 в 12:54. | 
|  | 
|  27.10.2009, 12:54 | #9 | 
| Боец | 
			
			Какую именно ошибку? Я привел "сырой" код, ест-но нужно оформить немножко. Пример для формы tutorial_Form_Controls: X++: public void init() { super(); element.setPrecision(); } X++: void setPrecision() { FormRealControl formRealControl; ; formRealControl = element.control(control::RealEdit); if (formRealControl) { formRealControl.NoOfDecimals(16); } } | 
|  | 
|  27.10.2009, 13:04 | #10 | 
| Участник | |
|  | 
|  27.10.2009, 13:16 | #11 | 
| Боец | 
			
			очень странно... Вы вместо "RealEdit" подставляете имя контрола? Вот, попробуйте рабочие примеры: DAX 3.0: tutorial_Form_Controls_30.xpo DAX 4.0: Form_tutorial_Form_Controls_40.xpo DAX 5.0: Form_tutorial_Form_Controls_50.xpo | 
|  | 
|  27.10.2009, 13:28 | #12 | 
| Участник | 
			
			ошибка проявляется не каждый раз про тож самое Итератор с поддержкой методов обратного вызова для обработки контролов на форме | 
|  | |
| За это сообщение автора поблагодарили: DSPIC (1). | |
|  27.10.2009, 13:57 | #13 | 
| Участник | 
			
			где-нить после super()  в init() формы пишем примерно следующее: X++: DEV_iterateThroughFormControls( element.design(), element, @"setFieldPrecision", DEV_FormHelpers::addRealCtrlId2Set() );X++: public void setFieldPrecision(FormRealControl _formControl) { // проверяем, связан ли контрол с нужным полем datasource'а на форме if ( _formControl.dataSource() == MyTable_DS.id() && _formControl.dataField() == fieldId2Ext( fieldnum(MyTable, MyRealField), 1 ) ) { _formControl.noOfDecimals( 11, AutoMode::Fixed ); } } | 
|  | |
| За это сообщение автора поблагодарили: decoder (1). | |