logo
Методичка_Delphi_Ч1

Создание процедуры вычисления результата

Создаваемая процедура должна обеспечить суммирование чисел, записанных в полях редактирования Edit1 и Edit2, и вывод результата в поле Edit3 при нажатии на кнопку «+».

Задача простая, и можно попытаться решить ее следующим образом. Активизируем окно Object Inspector, выбираем компонент btnPlus, открываем закладку Event, находим событие onClick, дважды щелкаем по пустому полю имени процедуры и получаем ее шаблон в редакторе кода.

Рисунок 1.11 – Шаблон процедуры сложения чисел

Теперь остается описать суммирование чисел, записанных в полях редактирования Edit1 и Edit2, и вывод результата в поле Edit3. Можно попытаться описать это следующим образом.

Edit3.text := Edit1.Text + Edit2.Text;

В этой строке мы говорим компьютеру: «Возьми то, что записано в поле Edit1, сложи с тем, что записано в поле Edit2, и результат запиши в поле Edit3».

Но если такая процедура будет выполнена, то мы увидим, что она складывает не числа, а строки символов. Например, если сложить 22 и 33, то получим 2233.

Для того чтобы получить правильный результат необходимо вначале строки преобразовать в числа. Для этого можно использовать стандартную функцию StrToFloat(). В эту функцию строка символов передается как аргумент. Функция преобразует ее в число и возвращает в виде результата. Выражение для сложения чисел введенных в поля Edit1 и Edit2 будет выглядеть так: StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text).

Теперь результат сложения будет числом, но возникает другая проблема. Если мы запишем тело процедуры в таком виде:

Edit3.text := StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text);

то при попытке выполнить сложение получим сообщение об ошибке. Вид окна редактора кода с сообщением об ошибке представлен на рисунке 1.12. Ошибка заключается в том, что мы пытаемся присвоить строке символов значение числа. В языке Паскаль такие присваивания недопустимы. Типы данных слева и справа от знака присваивания должны быть подобными.

Рисунок 1.12 – Окно редактора кода с сообщением об ошибке

Для того, чтобы устранить эту ошибку следует перед присваиванием преобразовать результат сложения чисел в строку символов. Для этого можно использовать функцию FloatToStr(). В результате тело процедуры станет таким:

Edit3.text := FloatToStr( StrToFloat(Edit1.Text) + StrToFloat(Edit2.Text));

На этом можно было бы закончить создание процедуры, но приложение с такой процедурой будет часто завершаться аварийно. Происходить это будет в тех случаях, когда пользователь ошибется при вводе исходных данных. Например, вместо цифры введет букву.

Пользователь имеет право ошибаться, но приложение аварийно завершаться не должно, вместо этого оно должно сообщать пользователю о его ошибке и давать возможность ее исправить.

В Delphi такая проблема решается довольно просто. Посмотрите на окончательный вариант процедуры на рисунке 1.13.

В процедуре использована конструкция try … except … end, которая позволяет решить поставленную выше задачу.

Рисунок 1.13 – Окончательный вариант процедуры сложения

При выполнении такой конструкции Delphi будет пытаться выполнить инструкции, записанные между служебными словами try и except. Если проблем при этом не возникнет, то инструкции, записанные между словами except и end, будут проигнорированы. Но если возникает исключительная ситуация, то Delphi не прерывает выполнение приложения, а переходит к выполнению инструкций между словами except и end. В нашем примере, в случае возникновения исключительной ситуации, на экране появится окно с сообщением «Ошибка в исходных данных».

Есть одна особенность в тестировании приложений с обработкой исключительных ситуаций. Если вы запускаете приложение из ИСР, то Delphi обработает исключение раньше вашего приложения, выдаст сообщение об ошибке, и приостановит работу приложения. Для того, чтобы продолжить работу приложения и увидеть его реакцию на ошибку, закройте окно с сообщением ИСР, и вызовите функцию главного меню Run->Run. Приложение продолжит работу, и вы увидите его реакцию на ошибку.

Удобнее тестировать обработку исключений, работая с откомпилированным файлом проекта (.exe файлом), запуская его напрямую.