Задача [FORMS2]: Новый компонент формы «Числовое поле»

Формулировка проблемы: на форме реестра есть однострочные поля, в которые вводятся числа. Необходимо чтобы данные числа отображались с разделителями (пробелами), и чтобы можно было вводить только цифры. Данные числа участвуют в арифметических операциях при формировании отчетов, в связи с использованием маски появилась проблема проведения арифметических операций в отчетах (и во внешних модулях), т.к. в базе данных эти числа хранятся как текст (к тому же с пробелами, запятыми и нижними прочерками). В результате появилась необходимость в наличии типизированного компонента «Числовое поле», который сможет отображать значения в соответствии с разрядностью (421 252 262) и с дробной частью с возможностью указания количества символов после точки (2 121 232.11), но использоваться как числа при проведении арифметических операций. И в данное поле можно ввести только цифру или одну точку при наличии возможности ввода дробной части.

Решение: в группе элементов «Текстовые элементы» между элементами «Неизменяемый текст» и «Однострочное поле» реализовать новый компонент формы «Числовое поле», который позволит отобразить типизированные десятичные числовые значения. Числовое поле, кроме того, должно позволять выполнять следующие простые математические вычисления:

Внешне компонент аналогичен компоненту «Однострочное поле».

Разрешенные символы для ввода в компонент:

Значение числового поля должно иметь два представления: непосредственно число, которое будет вводиться при редактировании компонента и использоваться в математических расчетах с участием данного компонента, и его текстовое представление, которое будет отображено пользователю в режиме чтения компонента согласно настройкам. Переключение между этими представлениями должно происходить:

Схематически данный принцип можно визуализировать следующей схемой:

Рисунок 201. Принцип преобразований

Принцип преобразований

где:

Примечание: Число должно храниться как число, а текстовое представление - как текст.

Настройки компонента:

Рисунок 202. Настройки числового поля

Настройки числового поля

Поле ввода «Количество десятичных знаков» определяет, сколько в текстовом представлении компонента будет отображено десятичных знаков. Значение по умолчанию: 18, валидация: целое число от 0 до 18 включительно (число, большее 18, по смыслу приравнивается к 18). При редактировании самого числового поля ограничений на количество вводимых десятичных знаков отсутствует - на этапе «Eval» числовое поле должно преобразовать число согласно данной настройке и настройке «Действие с лишними десятичными знаками».

Выпадающий список «Разделитель дробной части» определяет символ, который будет отображаться в текстовом представлении числа как разделитель дробной части. Возможные значения списка - запятая (по умолчанию) и точка. На этапе «Read» должна происходить валидация на невозможность ввода нескольких разделителей дробной части (за исключением, описанным выше). При редактировании самого числового поля в качестве разделителя дробной части можно использовать как запятую, так и точку, но на этапе «Eval» числовое поле должно преобразовать данный разделитель согласно данной настройке.

Переключатель «Действие с лишними десятичными знаками» определяет то действие, которое необходимо применять в случае превышения установленного количества десятичных знаков при вводе. Возможные значения - Округлить (по умолчанию) и Отбросить. Для выключенной настройки «Количество десятичных знаков» данное поле недоступно, для включенной настройки - поле доступно и имеет значение по умолчанию. Данная настройка влияет на этап «Eval»: числовое поле должно преобразовать введенное значение согласно данной настройке.

Флажок и поле ввода «Разделитель тысяч» определяют, использовать ли в текстовом представлении разделитель тысяч. Значение по умолчанию: флажок выключен, поле ввода недоступно (разделение на разряды отсутствует). Для включенного флажка становится доступным поле ввода со значением по умолчанию пробел, валидация: допускается ввод любого символа, кроме цифр 0-9 и знаков + - * /, кроме того, в качестве разделителя тысяч нельзя использовать настроенный разделитель дробной части.

Отделенное от вышеописанных настроек и недоступное на редактирование поле ввода Пример: отображает пользователю в режиме реального времени согласно настройкам пример текстового представления числового поля. Для значения настроек «Количество десятичных знаков» = 2, «Разделитель дробной части» = запятая, «Действие с лишними десятичными знаками» = Округлить, «Разделитель тысяч» = пробел и для введенного числа 1234,5678:

2 поля ввода «Граничные значения» определяют минимальное и максимальное значения, которые будут доступны для ввода в данный компонент в режиме редактирования. Значения по умолчанию: -9223372036854775807 --- 9223372036854775806, валидация: допускается ввод любых чисел, не превышающих значения по умолчанию.

Поведение компонента.

Числовое поле как калькулятор.

Если запись в числовом поле начинается с символа =, то в компоненте включается режим калькулятора. В данном режиме пользователю доступны для ввода символы арифметических операций + - * /, причем нельзя подряд вводить 2 и более знаков арифметических операций, за исключением случаев, когда вторым знаком идет -. Пользователь вводит подряд без пробелов элементарные математические формулы из доступных операций.

Пример =200000*12+60*365

Расчет формулы происходит только по нажатию на Enter, при этом поле остается в фокусе (в режиме редактирования числа, формула более не хранится нигде). При переходе из режима редактирования в режим чтения (при повторном нажатии на Enter либо расфокусе) происходит преобразование числа в текстовое представление. При переходе обратно в режим редактирования отображается не формула, а число, являющееся итоговым значением формулы.



[20] Контекстное меню, вызываемое кликом правой кнопкой мыши либо нажатием аналогичной кнопки на клавиатуре