Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Обработка ошибок



Если за ошибку в расчете отвечает больше

одного человека, виноватых не найти.

Из законов Мерфи

Наша программа страдает существенным недостатком: если в поле ввода вместо числа ввести, скажем, "Вася", программа "свалится" с выдачей сообщения об ошибке (проверьте!) Оно и понятно – функция FloatToStr не может преобразовать "Васю" в вещественное число. В Delphi реализован очень элегантный механизм реакции на ошибки в программе при помощи оператора TRY..EXCEPT..END. Вот его общий вид:

TRY

здесь может произойти ошибка

EXCEPT

эти команды выполняются, если ошибка произошла

END;

Применим данный оператор в нашей процедуре:

procedure TForm1.Button1Click(Sender: TObject);

var a,b,c:real;

Begin

Try

a:=StrToFloat(LabeledEdit1.Text);

b:=StrToFloat(LabeledEdit2.Text);

Except

Label1.Caption:='Неверные данные';

Exit

End;

c:=SQR(a+b)

Label1.Caption:=FoatToStr(c)

End;

Оператор Exit вызывает досрочный выход из всей процедуры. Если бы его не было, оператор Label1.Caption:=FoatToStr(c) выполнятся бы в любом случае, так как он никак не связан с оператором try.

6. Ввод – вывод массивов данных

Не позволяйте фактам вводить вас в заблуждение.

Из законов Мэрфи

Как быть, если результатом работы вашей программы является не один ответ, а целый массив данных? Например, нужно рассчитать значения функции f(x) при х, меняющемся от 0 до 1 с шагом 0.1 или вычислить сумму нескольких чисел, причем заранее неизвестно, сколько их будет.

Для ввода и вывода переменного числа данных удобно использовать компонент Memo, который находится на закладке Standard (). Главное его свойство – динамический массив текстовых строк Lines. По умолчанию в нем записана одна строчка – "Memo1". При помощи инспектора объектов уберите весь текст из свойства Lines, чтобы "Memo1" не маячило на экране. Для этого щелкните мышью по кнопке с троеточием рядом с Lines – (TStrings) для открытия окна текстового редактора.

Свойство Lines доступно из программы. С ним можно выполнять следующие основные операции:

Memo1.Lines.Clear – полностью очистить все строки;

Memo1.Lines.Add(s) – добавить текстовую строку s в список, отображаемый на экране.

Для обращения к строке с номером I нужно использовать запись Memo1.Lines[i].

7. Пример: расчет синуса

В военное время значение синуса может достигать четырех.

Армейская мудрость.

Решим задачу вычисления значений функции sin(x) при х, меняющемся от a до b с шагом h. Для ввода трех исходных данных (a, b и h) будем использовать привычные компоненты LabeledEdit, а для вывода результата – компонент Memo. Форма должна выглядеть так, как показано на Рис. 3. Чтобы у компонента Memo отображалась вертикальная полоса прокрутки, установите его свойство ScrollBars в значение ssVertical. Свойство ReadOnly этого же компонента надо установить в True, чтобы защитить информацию в нем от изменения пользователем (из программы ее все равно можно будет менять).

Рис. 3 - Вид формы для вычисления функции.

Теперь напишем процедуру, выполняющуюся при щелчке по кнопке "Расчет". Выделяем кнопку на форме, в инспекторе объектов переходим на закладку Events и дважды щелкаем мышкой в поле OnClick. На экране отобразится заготовка процедуры.

Прежде всего надо считать введенные в поля ввода данные и проверить их на корректность. Заведем три переменные Xmin, Xmax и h типа REAL для хранения введенных данных. Следует ясно понимать, что сами по себе переменные с компонентами на форме никак не связаны и значения, введенные пользователем, в переменных автоматически никак оказаться не могут. Поэтому нужно написать (подчеркнуты строки, которые пишет сам Delphi):

procedure TForm1.Button1Click(Sender: TObject);

VAR Xmin, Xmax, h: REAL;

begin

TRY

Xmin:=StrToFLoat(LabeledEdit1.Text);

Xmax:=StrToFLoat(LabeledEdit2.Text);

h:=StrToFLoat(LabeledEdit3.Text)

EXCEPT

MessageDlg('Неверные данные', mtError, [mbOK],0);

Exit

END;

IF Xmax<=Xmin THEN

BEGIN

MessageDlg('Xmin>Xmax!', mtError, [mbOK],0);

Exit

END

end;

Здесь применен новый способ отображения сообщений об ошибках – функция MessageDlg. Она отображает на экране стандартное окно сообщения об ошибке, как показано на Рис. 4.

Рис. 4 – Результат работы функции MessageDlg.

Параметр mtError отвечает за картинку, отображаемую. в левом верхнем углу сообщения (в данном случае это белый крест в красном круге; возможны также варианты mtInformation, mtConfirmation, mtWarning). Параметр [mbOK] указывает, что на окне будет одна-единственная кнопка OK. Квадратные скобки указывают на то, что это массив. апример, можно отобразить кнопки ОК и Отмена при помощи параметра [mbOK, mbCancel]. Наконец, последний ноль представляет собой номер темы в файле помощи, если бы таковой у нашей программы имелся.

Оператор Exit завершает выполнение процедуры в случае ошибки в исходных данных.

Собственно расчет весьма прост:

Memo1.Lines.Clear;

WHILE Xmin<=Xmax DO

BEGIN

Memo1.Lines.Add('sin('+FloatToStrF(Xmin,ffFixed,10,4)+')='+

FloatToStrF(sin(Xmin),ffFixed,10,4));

Xmin:=Xmin+h

END

Здесь прежде всего очищается список текстовых строк в компоненте Memo, иначе при неоднократных расчетах он будет расти и расти. В качестве переменной, меняющейся от Xmin до Xmax с шагом h, используется сама переменная Xmin. Строка Memo1.Lines.Add добавляет рассчитанный результат в компонент Memo. Для "красивого" преобразования типа данных Real в текстовую строку применена новая функция FloatToStrF(число, режим, всего, после_запятой). Режим ffFixed означает, что в числе будет именно столько знаков после запятой, сколько указано. В нашем случае мы отводим под все число 10 позиций, из них 4 – под дробную часть.

Результат работы программы показан на Рис. 5.

Рис. 5 – Результат работы программы.





Дата публикования: 2014-12-08; Прочитано: 174 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...