
- •Лекция № 1. Интегральная среда Delphi. Окна Delphi.
- •1. Среда Delphi. Главное окно.
- •2. Окно Инспектора объектов, Конструктора формы и Редактора кода.
- •Лекция № 2. Характеристика проекта. Компиляция и выполнение проекта.
- •1. Характеристика проекта Delphi.
- •2.Компиляция и выполнение проекта
- •Лекция № 3. Библиотека компонентов (vcl). Понятие класса и объекта.
- •1. Организация библиотеки компонентов
- •2. Понятие класса. Элементы класса.
- •Свойства
- •События
- •Лекция № 4. Общие свойства визуальных компонентов. События, методы. Обращение к объектам.
- •1. Основные общие свойства компонентов.
- •2. Основные общие методы компонентов.
- •3.Обращение к объектам.
- •Основные события.
- •Лекция № 5. Визуальные компоненты для отображения текстовой информации. Основные свойства компонентов.
- •Отображение текста
- •Лекция № 6. Визуальные компоненты для редактирования многострочных данных. Основные свойства компонентов.
- •1. Многострочный редактор
- •2.Общие элементы компонентов редактирования
- •Лекция № 7. Визуальные компоненты: работа со списками: простой, комбинированный. Основные свойства компонентов.
- •1.Работа со списками.
- •2.Комбинированный список
- •3.Общая характеристика списков
- •4.Другие характеристики списков
- •Лекция № 8. Компоненты-кнопки. Переключатели. Основные свойства компонентов.
- •Виды кнопок, используемые компоненты и их свойства.
- •2. Виды переключателей, используемые компоненты и их свойства.
- •Лекция № 9. Визуальные компоненты-контейнеры. Компоненты-закладки. Основные свойства компонентов.
- •1. Основные компоненты, используемые для объединения других компонентов.
- •Лекция № 10. Компоненты для редактирования данных в табличной форме.
- •Лекция № 11. Визуальные компоненты для изменения числового значения в заданном диапазоне. Визуальные компоненты для выбора дат. Основные свойства компонентов.
- •Визуальные компоненты для изменения числового значения в заданном диапазоне.
- •2.Визуальные компоненты для выбора дат.
- •Лекции № 12-13. Форма как Delphi-компонент. Жизненный цикл формы. Отображение формы. Управление доступом к форме. Особенности визуального проектирования форм.
- •1.Форма
- •2.Характеристики формы. Свойства
- •3.Характеристики формы. Методы.
- •4.Характеристики формы. События
- •5.Взаимодействие форм.
- •6.Шаблоны форм.
- •Лекции № 14-15. Главное и контекстное меню. Пункты меню, их свойства. Конструктор меню, настройка меню. Комбинации клавиш.
- •1.Главное и контекстное меню.
- •2.Пункты меню, их свойства, события.
- •3.Конструктор меню, настройка меню. Комбинации клавиш.
- •Лекция № 16. Использование диалоговых компонентов.
- •Лекция № 17. Компоненты-индикаторы. Компоненты для отображения геометрических фигур.
- •Компоненты-индикаторы.
- •Компоненты для отображения геометрических фигур.
- •Лекция № 18. Вывод сложной графической информации.
- •Лекция № 19. Создание элементов справочной системы. Создание строки состояния. Создание подсказок.
- •1. StatusBar (Строка состояния).
- •2. Использование в Delphi подсказок
- •Лекция № 20. Создание заставки, информационных окон.
- •1. Создание заставки.
- •Лекция № 21. Понятие и назначение dll-библиотек. Создание dll-библиотек. Использование dll-библиотек.
- •Создание dll-библиотек.
- •Использование dll-библиотек.
- •Лекция № 22. Понятие исключительной ситуации. Обработка исключений.
- •1. Понятие исключительной ситуации.
- •Обработка исключений.
- •Список использованных источников
- •Содержание
1. Понятие исключительной ситуации.
Исключительные ситуации в Delphi встречаются постоянно. Исключительная ситуация - это такая ситуация, в результате которой генерируется ошибка, и выполнение программы прерывается. Именно потому такая ситуация и называется исключительной. Например, деление на ноль - классический пример исключительной ситуации.
Как в такой ситуации действует человек? Если он пытается что-то сделать, и это не получается - он идёт другим путём. Так же и компьютер, следующий программе, умеющей обрабатывать исключительные ситуации. Он не бросает выполнение программы, не виснет, а обходит исключительную ситуацию, выполняя альтернативный вариант фрагмента, в которой исключительная ситуация возникла.
Возникает вопрос, почему бы не поставить проверку, например, на равенство нулю знаменателя при делении? Можно и поставить. Но во многих случаях источник исключительной ситуации далеко не так очевиден, а на все случаи жизни проверки не введёшь.
Обработка исключений.
Когда некоторый фрагмент программного кода необходимо защитить от досрочного завершения по ошибке, его следует заключить в блок обработки исключения («защищенный блок»). Для контроля исключительных ситуаций программист должен подготовить как основной вариант фрагмента, где возможна исключительная ситуация, так и его вариант, в котором она заведомо невозможна, или выводится информационное сообщение для пользователя.
Локальная обработка исключительных ситуаций позволяет при возникновении ошибки перейти к специально подготовленному коду программы. Такой подход реализуется с помощью языковых конструкций, которые как бы «охраняют» фрагмент кода программы и определяют обработчики ошибок, которые будут вызываться, если в защищённом участке кода что-то пойдет не так, как предполагалось.
Для обозначения начала защищенного участка кода используется служебное слово try, завершается конструкция словом end. Существует два типа защищенных участков: try...except и try...finally, которые имеют похожий синтаксис, но отличаются по назначению. Первый тип используется для обработки исключительных ситуаций. Его синтаксис:
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; 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)); Mend; emo1.Lines.Add(floattostr(rez));
Во время работы приложения исключительные ситуации могут возникнуть при выполнении преобразования строка-число и при вычислении частного от деления, если делитель равен нулю или нулю равны оба введённых числа. Если запустить программу на выполнение, то при возникновении любого из исключений сработает глобальная система обработки исключительных ситуаций. При этом выполнение процедуры будет прервано и будут выводиться сообщения о причине ошибки.
Введём локальную обработку исключительных ситуаций. Для этого сформируем защищённый блок. Анализировать ошибки не будем.
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;
В этом случае при возникновении любого исключения будет прерываться выполнение операторов защищённого блока, в Edit3 результат не появится. На экран будет выведено окно с сообщением «Ошибка!». Операторы, расположенные после защищённого блока, будут выполняться, то есть в Memo1 появятся записи.
Конструкцию try...finally используют в тех случаях, когда существуют действия, которые обязательно надо выполнить до завершения программы. Код, расположенный в части finally, выполняется в любом случае, даже если возникает исключительная ситуация. Если ошибки не возникло, то последовательно выполняются все операторы секций.
try ...{Операторы, выполнение которых может вызвать ошибку} finally {Операторы, которые должны быть выполнены даже в случае ошибки} end;
Конструкцию try...finally можно включить в блок try...except. Это позволяет выполнить обязательные операторы секции finally и обработать исключение операторами секции except. Оба типа конструкций можно использовать в любом месте, допускается вложенность любой глубины.
Есть ещё один способ контроля исключительных ситуаций, касающийся ошибок операций ввода-вывода.
Перед участком программы, где возможны ошибки ввода-вывода (а это, по сути, все операторы ввода-вывода), ставится директива {$I-}, заставляющая компилятор не включать в код автоконтроль ошибок ввода-вывода. Таким образом, в случае ошибки ввода или вывода программа не прерывается. В конце участка с операторами ввода-вывода ставится директива, включающая автоконтроль: {$I+}. Затем анализируется результат вызова функции IOResult. Если функция IOResult (вызывается без параметров) возвращает 0, значит, ошибок ввода-вывода на данном участке не было. Пример использования директив {$I} и функции IOResult содержит справка системы Delphi:
var F: file of Byte; begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); {$I-} Reset(F); {$I+} if IOResult = 0 then begin MessageDlg('File size in bytes: ' + IntToStr(FileSize(F)), mtInformation, [mbOk], 0); CloseFile(F); end else MessageDlg('File access error', mtWarning, [mbOk], 0); end; end;
Функция IOResult досталась Delphi в наследство от Turbo Pascal. Тот же самый фрагмент можно составить и с использованием оператора try. На мой взгляд, это удобнее и проще.
Базовым классом для всех исключений является класс Exception. Потомки этого класса охватывают большое количество исключений, которые могут возникнуть в процессе работы приложений. Имена потомков класса Exception начинаются с буквы E. Ниже приведены наиболее часто используемые классы исключений.
EConvertError – ошибка преобразования типов, может возникнуть при выполнении функций StrToInt и StrToFloat.
EInOutError – ошибка ввода/вывода при включенной директиве {$I+}.
EDivByZero – деление целого на ноль.
EIntOverflow – переполнение в операции с целыми переменными.
ERangeError – присвоение значения, выходящего за пределы допустимого диапазона. Например, при попытке обращения к элементам массива по индексу, выходящему за пределы массива.
EInvalidGraphic – попытка загрузки методом LoadFromFile файла, несовместимого графического формата.
EInvalidPointer – некорректная операция с указателем.
EFCreateError – ошибка создания файла
EFOpenError – ошибка открытия файла
EListError, EStringListError – ошибка при работе со списками.
EMathError – предок исключений, возникающих при выполнении операций с плавающей точкой.
EInvalidOp – попытка передачи математическому сопроцессору ошибочной инструкции.
EOverflow –переполнение при слишком больших величинах.
EUnderflow – потеря значимости при операции с плавающей точкой (слишком малая величина). Результат получает нулевое значение.
EZeroDivide – попытка деления на ноль.
EMenuError –ошибка при работе с пунктами меню для компонент TMenu, TMenuItem, TPopupMenu и их наследников.
EOutOfMemory – вызов методов New, GetMem или конструкторов классов при невозможности распределения памяти.
EOutOfResources – ошибка при выполнении запроса на выделение или заполнение Windows-ресурсов (например, обработчика handles).
Структурную обработку исключительных ситуаций, реализованную в Delphi, можно дополнять традиционным подходом к обработке ошибок, который заключается в анализе кодов ошибок, возвращаемых функциями.