Формулировка проблемы: на форме реестра есть однострочные поля, в которые вводятся числа. Необходимо чтобы данные числа отображались с разделителями (пробелами), и чтобы можно было вводить только цифры. Данные числа участвуют в арифметических операциях при формировании отчетов, в связи с использованием маски появилась проблема проведения арифметических операций в отчетах (и во внешних модулях), т.к. в базе данных эти числа хранятся как текст (к тому же с пробелами, запятыми и нижними прочерками). В результате появилась необходимость в наличии типизированного компонента «Числовое поле», который сможет отображать значения в соответствии с разрядностью (421 252 262) и с дробной частью с возможностью указания количества символов после точки (2 121 232.11), но использоваться как числа при проведении арифметических операций. И в данное поле можно ввести только цифру или одну точку при наличии возможности ввода дробной части.
Решение: в группе элементов «Текстовые элементы» между элементами «Неизменяемый текст» и «Однострочное поле» реализовать новый компонент формы «Числовое поле», который позволит отобразить типизированные десятичные числовые значения. Числовое поле, кроме того, должно позволять выполнять следующие простые математические вычисления:
сложение;
вычитание;
умножение;
деление;
Внешне компонент аналогичен компоненту «Однострочное поле».
Разрешенные символы для ввода в компонент:
цифры 0-9;
знак =
(см. подробнее в подразделе «Числовое
поле как калькулятор»);
разделители дробной части .
,
: в рамках одного компонента допускается
ввод 2 и более не подряд идущих разделителей дробной части
только в том случае, если между этими двумя разделителями
расположен хотя бы 1 знак арифметической операции.
Значение числового поля должно иметь два
представления: непосредственно число
,
которое будет вводиться при редактировании компонента и
использоваться в математических расчетах с участием данного
компонента, и его текстовое представление
,
которое будет отображено пользователю в режиме чтения компонента
согласно настройкам. Переключение между этими представлениями должно
происходить:
по нажатию на клавишу Enter
либо при потере
фокуса на компоненте: из режима редактирования в режим чтения;
при попадании фокуса на компонент (кликом мыши либо перемещением
с помощью Tab
): из режима чтения в режим
редактирования.
Схематически данный принцип можно визуализировать следующей схемой:
где:
Read --- ввод числа (формулы);
Eval --- преобразование;
Print --- текстовое представление;
Примечание: Число
должно
храниться как число, а текстовое представление
-
как текст.
Настройки компонента:
Настройки форматирования:
Количество десятичных знаков (обяз.);
Разделитель дробной части (не имеет пустого значения);
Действие с лишними десятичными знаками (не имеет пустого значения);
Разделитель тысяч (для включенного флажка - обяз.);
Пример;
Настройки компонента
Граничные значения (обяз.).
Поле ввода «Количество десятичных знаков» определяет, сколько в текстовом представлении компонента будет отображено десятичных знаков. Значение по умолчанию: 18, валидация: целое число от 0 до 18 включительно (число, большее 18, по смыслу приравнивается к 18). При редактировании самого числового поля ограничений на количество вводимых десятичных знаков отсутствует - на этапе «Eval» числовое поле должно преобразовать число согласно данной настройке и настройке «Действие с лишними десятичными знаками».
Выпадающий список «Разделитель дробной части»
определяет символ, который будет отображаться в текстовом
представлении числа как разделитель дробной части. Возможные
значения списка - запятая
(по умолчанию) и
точка
. На этапе «Read» должна происходить
валидация на невозможность ввода нескольких разделителей дробной
части (за исключением, описанным выше). При редактировании самого
числового поля в качестве разделителя дробной части можно
использовать как запятую, так и точку, но на этапе «Eval» числовое
поле должно преобразовать данный разделитель согласно данной
настройке.
Переключатель «Действие с лишними десятичными
знаками» определяет то действие, которое необходимо
применять в случае превышения установленного количества десятичных
знаков при вводе. Возможные значения - Округлить
(по умолчанию) и Отбросить
. Для выключенной
настройки «Количество десятичных знаков» данное поле недоступно, для
включенной настройки - поле доступно и имеет значение по умолчанию.
Данная настройка влияет на этап «Eval»: числовое поле должно
преобразовать введенное значение согласно данной настройке.
Флажок и поле ввода «Разделитель тысяч»
определяют, использовать ли в текстовом представлении разделитель
тысяч. Значение по умолчанию: флажок выключен, поле ввода недоступно
(разделение на разряды отсутствует). Для включенного флажка
становится доступным поле ввода со значением по умолчанию
пробел
, валидация: допускается ввод любого
символа, кроме цифр 0-9 и знаков +
-
*
/
,
кроме того, в качестве разделителя тысяч нельзя использовать
настроенный разделитель дробной части.
Отделенное от вышеописанных настроек и недоступное на редактирование
поле ввода Пример: отображает пользователю в
режиме реального времени согласно настройкам пример текстового
представления числового поля. Для значения настроек «Количество
десятичных знаков» = 2
, «Разделитель дробной
части» = запятая
, «Действие с лишними десятичными
знаками» = Округлить
, «Разделитель тысяч» =
пробел
и для введенного числа
1234,5678
:
числовым представлением будет 1234.57
;
текстовым представлением будет 1 234,57
.
2 поля ввода «Граничные значения» определяют
минимальное и максимальное значения, которые будут доступны для
ввода в данный компонент в режиме редактирования. Значения по
умолчанию: -9223372036854775807
---
9223372036854775806
, валидация: допускается ввод
любых чисел, не превышающих значения по умолчанию.
Поведение компонента.
Значение числового поля по умолчанию задается в конфигураторе на этапе создания / редактирования формы. Пустое значение по умолчанию эквивалентно нулю.
Ноль в начале последовательности цифр удаляется.
По нажатию на Enter
числовое поле, не
содержащее формулу, отображает текстовое представление
введенного числа, снимается фокус с компонента.
По нажатию на Enter
числовое поле, содержащее
формулу, отображает числовое значение формулы, фокус на
компоненте остается (снятие фокуса происходит по следующему
нажатию на Enter
).
При попадании фокуса на компонент числового поля на форме все содержимое компонента должно выделиться, положение курсора - в конце строки.
Если введенное число выходит за рамки граничного, то при потере
фокуса числовое поле должно выделиться красным, в поле должно
отобразиться ближайшее граничное значение в текстовом
представлении. При следующем фокусе - выделение красным цветом
снимается, отображается снова то введенное число (в числовом
представлении). При сохранении формы с невалидным значением поля
должна выводиться стандартная ошибка
Некоторые значения чисел не входят в установленный интервал
(поле подсвечивается красным).
С числового поля доступно копирование выделенной части в
системный буфер обмена сочетаниями Ctrl+C
,
Ctrl+Insert
, ПКМ[20] -> Копировать.
С числового поля доступно вырезание выделенной части в системный
буфер обмена сочетаниями Ctrl+X
,
Shift+Delete
, ПКМ -> Вырезать. В случае
вырезания всего содержимого в поле должно установиться значение
по умолчанию.
В числовое поле доступна вставка только числовых данных из
системного буфера обмена сочетаниями клавиш
Ctrl+V
, Shift+Insert
, ПКМ
-> Вставить. В случае вставки данных, в которых содержится
хотя бы один неразрешенный символ, в т.ч. второй (по отношению к
уже имеющемуся в поле) разделитель дробной части, с буфера
обмена в компонент числового поля должна завершиться неуспешно с
немедленным выводом ошибки
Недопустимое содержимое вставляемых данных
.
Вставка должна происходить с заменой выделенного значения и
справа от положения курсора.
Числовое поле как калькулятор.
Если запись в числовом поле начинается с символа
=
, то в компоненте включается режим калькулятора.
В данном режиме пользователю доступны для ввода символы
арифметических операций +
-
*
/
, причем нельзя подряд
вводить 2 и более знаков арифметических операций, за исключением
случаев, когда вторым знаком идет -
. Пользователь
вводит подряд без пробелов элементарные математические формулы из
доступных операций.
Пример =200000*12+60*365
Расчет формулы происходит только по нажатию на
Enter
, при этом поле остается в фокусе (в режиме
редактирования числа, формула более не хранится нигде). При переходе
из режима редактирования в режим чтения (при повторном нажатии на
Enter
либо расфокусе) происходит преобразование
числа в текстовое представление. При переходе обратно в режим
редактирования отображается не формула, а число, являющееся итоговым
значением формулы.
[20] Контекстное меню, вызываемое кликом правой кнопкой мыши либо нажатием аналогичной кнопки на клавиатуре