
Программирование Часть 2 - Delphi
.pdf61
canvas.lineTo(x2,y2);
l:=round(l*r);
if l>l_min then
begin
f1:=f-df;
branch1(x1,y1,l,f1,df,l_min,r); //Рекурсивный вызов процедуры
f2:=f+df;
branch1(x2,y2,l,f2,df,l_min,r);//Рекурсивный вызов процедуры
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
branch1(150,250,50,-90,10,5,0.8);
end;
3.7. Обработка исключительных ситуаций в Delphi
Исключительная ситуация – это некоторое ошибочное состояние, возникающее во время выполнения программы. Исключительные ситуации (исключения) могут возникать по самым разным причинам, например из-за невозможности выполнить преобразование,
при делении на ноль и др. В любом случае приложение получает сообщение о возникновении исключения.
В Delphi предусмотрен глобальный обработчик исключительных ситуаций и могут быть задействованы локальные обработчики. Глобальная обработка исключений реализуется через объект Application. Глобальная обработка обеспечивает пользователя информацией об ошибке, но не устраняет причины.
Локальная обработка исключительных ситуаций позволяет при возникновении ошибки перейти к специально подготовленному коду программы. Такой подход реализуется с помощью языковых конструкций, которые как бы «охраняют» фрагмент кода программы и определяют обработчики ошибок, которые будут вызываться, если в защищѐнном участке кода что-то пойдет не так, как предполагалось.
Для обозначения начала защищенного участка кода используется служебное слово try, завершается конструкция словом end. Существует два типа защищенных участков: try...except и try...finally, которые имеют похожий синтаксис, но отличаются по назначению. Первый тип используется для обработки исключительных ситуаций. Его синтаксис:
62
try
{Операторы, выполнение которых может вызвать ошибку}
except
{Операторы, которые должны быть выполнены в случае ошибки}
end;
Конструкция try...except применяется для перехвата исключительной ситуации и позволяет восстановить работоспособность программы. Секция except может быть разбита на несколько частей on...do для обработки разных классов исключений. После конструкций on...do может быть помещѐн раздел else, который относится ко всему блоку.
По логике работы группа конструкций on...do напоминает оператор case. К исключениям,
не имеющим своих локальных обработчиков, применяется механизм глобальной обработки через объект Application.
try
{Операторы, выполнение которых может вызвать ошибку}
except
{ Операторы, которые должны быть выполнены в случае ошибки} on Exception1 do ...;
on Exception2 do ...;
...
else
...
end;
Рассмотрим следующий пример. В поля Edit1 и Edit2 записываются целые числа.
При щелчке по кнопке Button1 выполняется перевод введѐнных строк в числовой формат,
первое число делится на второе и результат выводится в Edit3. Затем в Memo1
записываются исходные строки, сумма чисел и частное от деления первого числа на второе.
Внимание! При тестировании приложений желательно пользоваться созданным exe-файлом. Запускать приложения из Delphi можно, но при этом надо учитывать, что при возникновании исключительной ситуации, прежде всего, сработает система защиты Delphi. При появлении системного сообщения его надо прочитать, окно сообщения закрыть и выполнить команду Run для продолжения работы.
procedure TForm1.Button1Click(Sender: TObject);
Var a,b:integer;
rez:extended;
63
begin
a:=strtoint(Edit1.Text);
b:=strtoint(Edit2.Text);
rez:=a/b;
Edit3.Text:=floattostr(rez);
Memo1.Lines.Add(Edit1.Text);
Memo1.Lines.Add(Edit2.Text);
Memo1.Lines.Add(inttostr(a+b));
Memo1.Lines.Add(floattostr(rez));
end;
Во время работы приложения исключительные ситуации могут возникнуть при выполнении преобразования строка-число и при вычислении частного от деления, если делитель равен нулю или нулю равны оба введѐнных числа. Если запустить программу на выполнение, то при возникновении любого из исключений сработает глобальная система обработки исключительных ситуаций. При этом выполнение процедуры будет прервано и будут выводиться сообщения о причине ошибки.
Введѐм локальную обработку исключительных ситуаций. Для этого сформируем защищѐнный блок. Анализировать ошибки не будем.
procedure TForm1.Button1Click(Sender: TObject);
Var a,b:integer;
rez:extended;
begin
try
a:=strtoint(Edit1.Text);
b:=strtoint(Edit2.Text);
rez:=a/b;
Edit3.Text:=floattostr(rez);
except
ShowMessage('Ошибка!');
end;
Memo1.Lines.Add(Edit1.Text);
Memo1.Lines.Add(Edit2.Text);
Memo1.Lines.Add(inttostr(a+b));
Memo1.Lines.Add(floattostr(rez));
end;
64
В этом случае при возникновении любого исключения будет прерываться выполнение операторов защищѐнного блока, в Edit3 результат не появится. На экран будет выведено окно с сообщением «Ошибка!». Операторы, расположенные после защищѐнного блока, будут выполняться, то есть в Memo1 появятся записи.
Изменим секцию except. Проверим одну из возможных ошибок – деление на ноль.
Далее приводится фрагмент кода, в который внесены изменения.
except
on EZeroDivide do
begin
ShowMessage('Попытка деления на ноль!');
Edit2.SetFocus;
end;
В этом случае при возникновении других исключений сработает глобальный обработчик, то есть выполнение процедуры будет прервано.
Добавим локальный обработчик для контроля над преобразованием вводимых данных. При этом глобальная обработка исключений будет задействована только для нулевых введѐнных значений (0/0).
except
on EZeroDivide do
begin
ShowMessage('Попытка деления на ноль!');
Edit2.SetFocus;
end;
on EConvertError do ShowMessage('Ошибка преобразования!');
Если ввести секцию else, то все исключения будут обработаны локально.
except
on EZeroDivide do
begin
ShowMessage('Попытка деления на ноль!');
Edit2.SetFocus;
end;
on EConvertError do ShowMessage('Ошибка преобразования!') else ShowMessage('Ошибка в защищѐнном блоке!');
Конструкцию try...finally используют в тех случаях, когда существуют действия,
которые обязательно надо выполнить до завершения программы. Код, расположенный в
65
части finally, выполняется в любом случае, даже если возникает исключительная ситуация. Если ошибки не возникло, то последовательно выполняются все операторы секций.
try
...{Операторы, выполнение которых может вызвать ошибку}
finally
{Операторы, которые должны быть выполнены даже в случае ошибки}
end;
Конструкцию try...finally можно включить в блок try...except. Это позволяет выполнить обязательные операторы секции finally и обработать исключение операторами секции except. Оба типа конструкций можно использовать в любом месте, допускается вложенность любой глубины.
Базовым классом для всех исключений является класс Exception. Потомки этого класса охватывают большое количество исключений, которые могут возникнуть в процессе работы приложений. Имена потомков класса Exception начинаются с буквы E.
Ниже приведены наиболее часто используемые классы исключений.
EConvertError – ошибка преобразования типов, может возникнуть при выполнении функций StrToInt и StrToFloat.
EInOutError – ошибка ввода/вывода при включенной директиве {$I+}.
EDivByZero – деление целого на ноль.
EIntOverflow – переполнение в операции с целыми переменными.
ERangeError – присвоение значения, выходящего за пределы допустимого диапазона. Например, при попытке обращения к элементам массива по индексу,
выходящему за пределы массива.
EInvalidGraphic – попытка загрузки методом LoadFromFile файла, несовместимого графического формата.
EInvalidPointer – некорректная операция с указателем.
EFCreateError – ошибка создания файла
EFOpenError – ошибка открытия файла
EListError, EStringListError – ошибка при работе со списками.
EMathError – предок исключений, возникающих при выполнении операций с плавающей точкой.
EInvalidOp – попытка передачи математическому сопроцессору ошибочной инструкции.
EOverflow –переполнение при слишком больших величинах.
66
EUnderflow – потеря значимости при операции с плавающей точкой (слишком малая величина). Результат получает нулевое значение.
EZeroDivide – попытка деления на ноль.
EMenuError –ошибка при работе с пунктами меню для компонент TMenu,
TMenuItem, TPopupMenu и их наследников.
EOutOfMemory – вызов методов New, GetMem или конструкторов классов при невозможности распределения памяти.
EOutOfResources – ошибка при выполнении запроса на выделение или заполнение
Windows-ресурсов (например, обработчика handles).
Структурную обработку исключительных ситуаций, реализованную в Delphi, можно дополнять традиционным подходом к обработке ошибок, который заключается в анализе кодов ошибок, возвращаемых функциями.
67
СПИСОК ЛИТЕРАТУРЫ
1.Шейкер, Т.Д. Разработка приложений в системе Delphi: учеб. пособие/ Т.Д. Шейкер. –
Владивосток: Изд-во ДВГТУ, 2006 – 172 с.
2.А.Я. Архангельский. Программирование в Delphi 7. — М.: ООО «Бином-Пресс»,
2003 г. — 1152 с.
3.Дарахвелидае П. Г., Марков Е. П. Программирование в Delphi 7. — СПб.: БХВ-
Петербург, 2003. — 784 с.
4.Фаронов В.В. Система программирования Delphi. – СПб.:БХВ – Санкт-Петербург,
2003. – 912 с.
5.Фаронов В.В. Delphi 6:Учебный курс. – М.: Издатель Молгачева С.В., 2003. – 672 с.
6.Delphi 7. Наиболее полное руководство/Хомоненко А.Д. и др.. – СПб.: БХВ – Санкт-
Петербург, 2004. – 1216 с.
7.Бобровский С.И. Delphi 7: Учебный курс. – СПб.: Питер, 2004. – 736 с.
|
68 |
|
|
ОГЛАВЛЕНИЕ |
|
1. |
ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ |
.......3 |
2. |
ЯЗЫК ПРОГРАММИРОВАНИЯ OBJECT PASCAL..................................................... |
6 |
2.1. |
Объектная модель.......................................................................................................... |
6 |
2.2. |
Объекты и классы .......................................................................................................... |
7 |
2.3. |
Поля ................................................................................................................................ |
9 |
2.4. |
Свойства ......................................................................................................................... |
9 |
2.5. |
Методы ......................................................................................................................... |
10 |
2.6. Управление доступом к классу .................................................................................. |
15 |
3.РАЗРАБОТКА ПРИЛОЖЕНИЙ В СРЕДЕ ВИЗУАЛЬНОГО
ПРОГРАММИРОВАНИЯ DELPHI ........................................................................................... |
16 |
||
3.1. Проект и управление проектом .................................................................................. |
16 |
||
3.1.1. |
Проект Delphi ....................................................................................................... |
16 |
|
3.1.2. |
Управление проектом.......................................................................................... |
18 |
|
3.1.3. |
Настройка параметров проекта .......................................................................... |
20 |
|
3.1.4. |
Компиляция и выполнение проекта................................................................... |
21 |
|
3.2. |
Создание приложения ................................................................................................. |
21 |
|
3.2.1. |
Этапы создания приложения .............................................................................. |
21 |
|
3.2.2. |
Создание интерфейса приложения .................................................................... |
22 |
|
3.2.3. |
Определение функциональности проекта......................................................... |
24 |
|
3.2.4. |
События и их обработка ..................................................................................... |
25 |
|
3.2.5. |
Формирование кода............................................................................................. |
26 |
|
3.2.6. |
Организация взаимодействия форм................................................................... |
27 |
|
3.3. |
Форма............................................................................................................................ |
28 |
|
3.3.1. |
Свойства формы .................................................................................................. |
29 |
|
3.3.2. |
События формы ................................................................................................... |
30 |
|
3.3.3. |
Создание форм разного вида .............................................................................. |
30 |
|
3.4. |
Компоненты ................................................................................................................. |
31 |
|
3.4.1. |
Общие свойства управляющих элементов........................................................ |
31 |
|
3.4.2. |
Общие события управляющих элементов......................................................... |
33 |
|
3.4.3. |
Кнопки .................................................................................................................. |
35 |
|
3.4.4. |
Контейнеры .......................................................................................................... |
38 |
|
3.4.5. |
Компоненты для работы со строками................................................................ |
40 |
|
3.4.6. |
Компоненты для отображения текста ............................................................... |
45 |
|
3.4.7. |
Компоненты для работы с графикой ................................................................. |
46 |
|
|
69 |
|
3.4.8. |
Формирование меню ........................................................................................... |
47 |
|
3.4.9. |
Другие компоненты............................................................................................. |
50 |
|
3.5. |
Создание окон диалога................................................................................................ |
51 |
|
3.5.1. |
Процедуры и функции, реализующие диалоги ................................................ |
51 |
|
3.5.2. |
Стандартные диалоговые панели....................................................................... |
52 |
|
3.5.3. |
Использование модального окна ....................................................................... |
54 |
|
3.5.4. |
Использование заготовок.................................................................................... |
56 |
|
3.6. |
Графика......................................................................................................................... |
56 |
|
3.6.1. |
Поддержка графики в Windows ......................................................................... |
56 |
|
3.6.2. |
Восстановление изображений ............................................................................ |
57 |
|
3.6.3. |
Вывод графической информации в Delphi........................................................ |
58 |
|
3.6.4. |
Классы и компоненты для работы с графикой ................................................. |
58 |
|
3.6.5. |
Программное рисование ..................................................................................... |
59 |
|
3.7. Обработка исключительных ситуаций в Delphi ....................................................... |
61 |
||
СПИСОК ЛИТЕРАТУРЫ ........................................................................................................... |
67 |