Значения по полям LenSm (длина в см) и LenIn (длина в дюймах) отдельной записи весьма просто рассчитываются одно через другое поскольку 1 дюйм = 2,54 см. Поэтому чтобы не вводить такие значения в оба поля, увеличивая себе объем работы, достаточно ввести одно из них, а другое рассчитать через первое. Удобнее заполнять поле LenSm, а LenIn рассчитывать.
Прежде всего запретим в сетке ввод в поле LenIn. Двойным щелчком на сетке вновь вызовем редактор ее колонок (см. рис. 3.21) и свойству ReadOnly (только чтение) колонки LenIn назначим значение true. Теперь в этой колонке нельзя будет изменять значения с клавиатуры. Заметим, что при этом таблице Table1 аналогичное свойство ReadOnly останется в значении false, то есть значение может быть изменено, что мы и будем использовать при вычислении LenIn через LenSm.
Когда же следует выполнять такой расчет? Очевидно, перед тем, как в таблице будут зафиксированы изменения в поле LenSm. В этот момент происходит событие BeforePost (перед сохранением) таблицы Table1. Щелкните на компоненте Table1, затем в Инспекторе объектов на закладке События (Events) дважды щелкните в клетке рядом с названием этого события (рис. 4.1). При этом будет создана заготовка процедуры, в которой нужно объяснить программе, что следует сделать перед сохранением изменений в таблице. Внесите в процедуру текст, который приведен на рис. 4.1.
|
|
Рис. 4.1. Программирование расчета длины в дюймах
Поясним, что представляет собой этот программный код. Тело процедуры содержит блок try-except-end. Он работает следующим образом
try
Формулы для вычислений и иных действий
except
Что делать если возникла исключительная ситуация (ошибка)
end
В нашем случае производится расчет с помощью оператора присваивания
Table1LenIn.AsFloat:= Table1LenSm.AsFloat/2.54;
Значение поля Table1LenIn (полное имя поля, то есть " имя таблицы " + " имя поля ") следует рассчитывать как вещественное число (AsFloat - как вещественное число) для текущей записи (на ней стоит указатель в таблице Table1 и в сетке DBGrid1). Результат определяется умножением значения Table1LenSm. AsFloat на число 2,54.
В случае если по каким-то причинам такой расчет привет к непредвиденной ошибке, сработает сегмент except-end. При этом действия по вычислению будут отменены и на экран будет выброшено окошко с сообщением о том, что произошла ошибка. Ниже на рис. 4.2 приведет пример состояния сетки после таких вычислений.
Рис. 4.2. Отображение данных, содержащих неформатированную колонку
Видно, что в клетках колонки LenIn находится непонятный набор цифр. В действительности же, в этих клетках записаны правильные числа, однако они содержат слишком большое количество цифр в дробной части, что затрудняет визуальное восприятие таких данных. К примеру,если разделить 50 на 2,54 то получится 19,6850393700787 - число с большим количеством знаков в дробной части. Именно такие числа и отображены в колонке LenIn сетки. Чтобы исправить положение следует задать формат вывода данных в колонке. Для этого нужно дважды щелкнуть на Table1 и для поля LenIn установить значение свойства DisplayFormat в 0.00 (два знака в дробной части). Эта ситуация показана рисунке справа.
|
|
Теперь сетка примет желаемый вид (рис. 4.3).
Рис. 4.3. Отображение данных с форматированной колонкой