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 не являются надежным решением, кроме того, так вы привязываетесь к конкретному названию контрола на форме, хотя по постановке задачи скорее должны привязываться к полю таблицы.
Я так думаю, 2 знака всегда и вводятся, а 11 нужны для отображения реального числа в поле и проверки каких-нить косяков с округлением Последний раз редактировалось 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). |