Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции D.DOC
Скачиваний:
3
Добавлен:
16.08.2019
Размер:
193.02 Кб
Скачать

4.9.4.Простой пример из лабораторной работы № 2

4.9.4.1.Взаимодействие с Delphi

Как уже было сказано для всех исключений существуют стандартные обработчики подключаемые средой разработки. Как правило эти обработчики бывают разными в зависимости от способа запуска приложение:

  • как самостоятельного приложения или

  • в рамках интегрированной среды (по отладчиком).

В последнем случае все исключения перехватывает сам отладчик. И даже в том случае, если в приложение встроены средства перехвата исключений. Однако этот режим опционален.

Итак, при запуске в интегрированной среде возможны два варианта:

  1. при возникновении исключения управление передается отладчику.

  2. при возникновении исключения управление передается встроенным или стандартным средствам.

Для изменения режима реакции на исключения следует воспользоваться командой: Tools+Options и на вкладке Preferances изменить флажок  Break on exeption. (Вкл. –отладчик; выкл. – стандартный или собственный обработчик).

4.9.4.2.Пример:

Вспомним процедуру вычисления по формуле из примера ЛР 2

procedure TMainWindow.btCalcClick(Sender: TObject);

var a, b, h: real;

begin

//=== Преобразование входных данных ===

a := StrToFloat(edA.Text); { Текст из поля edA преобразовать в Float }

b := StrToFloat(edB.Text); { Текст из поля edB преобразовать в Float }

//=== Вычисление ===

if (((a>=0.1)and(a<=1.0)) and ((b>=0.05)and(b<=3.0))) then begin

if ( a>=b ) then begin

h := 3.0*a*a - b*b;

end

else begin

h := ln(3.0*a*a - b*b);

end;

{ В заголовок метки lbResult вывести результат }

lbResult.Caption := FloatToStr( h );

end

else begin

{ В заголовок метки lbResult вывести сообщение об ошибке }

lbResult.Caption := 'Неверные параметры';

end;

end;

Если во время работы программы попытаться ввести в соответствующие поля ввода ввести нечто не соответствующее правильному числу, то возникнет исключение EConvertError при выполнении функции StrToFloat и программа будет снята. Что бы избежать такой ситуации следует перехватить это исключение.

procedure TMainWindow.btCalcClick(Sender: TObject);

var

a, b, h: real;

begin

try

//=== Преобразование входных данных ===

a := StrToFloat(edA.Text); { Текст из поля edA преобразовать в Float }

b := StrToFloat(edB.Text); { Текст из поля edB преобразовать в Float }

//=== Вычисление ===

if (((a>=0.1)and(a<=1.0)) and ((b>=0.05)and(b<=3.0))) then begin

if ( a>=b ) then begin

h := 3.0*a*a - b*b

end

else begin

h := ln(3.0*a*a - b*b);

end;

lbResult.Caption := FloatToStr( h );

else begin

{ В заголовок метки lbResult вывести сообщение об ошибке }

lbResult.Caption := 'Неверные параметры';

end;

except

on EConvertError do begin

MessageBeep(MB_ICONEXCLAMATION);

lbResult.Caption := 'Неверные параметры';

end;

end;{try}

end;{TMainWindow.btCalcClick}

4.9.5.Вложенные блоки try…except и генерация исключений

Ключевое слово raise используется для генерации исключения, как предопределенного в Delphi, так и своего собственного. Синтаксис оператора генерации исключения:

raise <исключение>

где <исключение> - переменная типа исключения, или

raise <класс исключения>.<конструктор>

Оператор raise прерывает дальнейший нормальный ход вычислений, генерирует экземпляр объекта исключения заданного класса и передает управление ближайшему обработчику соответствующего типа. Обработчик разрушает экземпляр исключения, так что о деструкторе этого объекта заботиться не приходится.

Иногда при обработке исключения возникает потребность повторной генерации исключения того класса. Это может быть связано с тем, что, проведя первичную обработку этого исключения, желательно завершить обработку с помощью обработчика верхнего уровня. Повторная генерация осуществляется оператором raise без каких либо параметров:

raise;

Допустимы вложенные блоки try…except.

Для передачи управления обработчику внешнего блока try…except можно использовать оператор raise без параметров.

Как использовать оператор raise для возбуждения исключения по инициативе приложения (см. пример ниже).

4.9.6.Класс Exception

Как уже было сказано исключение это объект класса Exception, точнее одного из его подклассов. Возможно создание своих собственных исключений.

Мы не будем подробно разбирать структуру этого класса, но обратим внимание на некоторые свойства и методы.

4.9.6.1.Свойство Message

Message: PString;

Это свойство содержит текстовую строку – сообщение.

Возможное использование:

...

try

...

except

on e: Exception do { e идентфикатор объекта исключения }

lbResult.Caption: = e.Message;

...

4.9.6.2.Метод Create

procedure Create( s: PString );

Позволяет создать объект – исключение, параметр – свойство Message. (см. пример ниже).

4.9.7.Продолжение примера из лабораторной работы № 2.

...

procedure ConvInputData(var a:real; var b:real);

begin

a := StrToFloat(MainWindow.edA.Text);

b := StrToFloat(MainWindow.edB.Text);

if not (((a>=0.1)and(a<=1.0)) and ((b>=0.05)and(b<=3.0))) then

raise EConvertError.Create(''); {строка Message не нужна}

end;{ConvInputData}

procedure TMainWindow.btCalcClick(Sender: TObject);

var

a, b, h: real;

begin

try

ConvInputData(a,b);

if ( a>=b ) then begin

h := 3.0*a*a - b*b

end

else begin

h := ln(3.0*a*a - b*b);

end;

lbResult.Caption := FloatToStr( h );

except

on EConvertError do begin

MessageBeep(MB_ICONEXCLAMATION);

lbResult.Caption := 'Неверные параметры';

end;

on e: Exception do begin {какое-то неожиданное исключение}

MessageBeep(MB_ICONEXCLAMATION);

lbResult.Caption := e.Message;

end;

end;{try}

end;{TMainWindow.btCalcClick}

4.10.Menu

В рамках Windows имеются два типа компонентов:

  1. T Main Menu (Menu Bar).

  2. T Pop Up Menu (контекстное меню).