Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Делфи 2-3 / 1. Delphi-2.doc
Скачиваний:
57
Добавлен:
30.03.2015
Размер:
486.4 Кб
Скачать

Inc (yk) ; {увеличиваем значение указателя}

StatusBar1.Panels[1].Text:=IntToStr(MyList.Count);

{отображаем количество записей в панели статуса}

StatusBar1.Panels[3].Text:=IntToStr(yk+1);

{отображаем номер отображаемой записи в панели статуса}

end;

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

Задание для самостоятельного выполнения

1. Дополните приложение PhoneBook кнопками для перемещения по записям списка.

Примечание. Для обращения к полям записи воспользуйтесь операторами:

ARecord:=MyList[yk];...

procedure TMainF.BackBtnClick(Sender: TObject); {Назад}

begin

If yk>=1 then Begin

dec(yk);

ARecord:=MyList[yk];

LastNameEdt.Text:=Arecord.LastName;

NameEdt.Text:=Arecord.Name;

PatronymicEdt.Text:=Arecord.Patronymic;

StreetEdt.Text:=ARecord.Street;

HouseEdt.Text:=IntToStr(ARecord.House);

FlatEdt.Text:=IntToStr(ARecord.Flat);

PhoneME.Text:=ARecord.Phone;

StatusBar1.Panels[3].Text:=IntToStr(yk+1);

end

end;

procedure TMainF.ForvBtnClick(Sender: TObject); {Вперед}

begin

If yk<MyList.Count-1 then Begin

inc(yk);

ARecord:=MyList[yk];

LastNameEdt.Text:=Arecord.LastName;

NameEdt.Text:=Arecord.Name;

PatronymicEdt.Text:=Arecord.Patronymic;

StreetEdt.Text:=ARecord.Street;

HouseEdt.Text:=IntToStr(ARecord.House);

FlatEdt.Text:=IntToStr(ARecord.Flat);

PhoneME.Text:=ARecord.Phone;

StatusBar1.Panels[3].Text:=IntToStr(yk+1);

end

end;

2. Добавьте главное меню.

Сохраните список записей телефонной книги в файле.

3. При запуске приложения считайте данные из файла.

4. Дополните приложение PhoneBook процедурой поиска записей в телефонной книге по фамилии и вывода найденных записей в диалоговое окно.

5. Дополните приложение PhoneBook функцией добавления абонента в список, сохраните внесенные изменения в файле.

6. Дополните приложение PhoneBook процедурой удаления абонента из списка, сохраните изменения в файле.

Примечание. Для удаления записи из списка необходимо выполнить следующую последовательность операторов:

ARecord := MyList.Items[В]; {В — это номер удаляемой записи}

Dispose(ARecord);

Исключительная ситуация

Исключительная (или особая) ситуация представляет собой сигнал о произошедшей в приложении ошибке (переполнение, деление на нуль, попытка открыть несуществующий файл и т.п.). При возникновении такихисключительных ситуацийпрограмма генерирует прерывание, называемоеисключением. В результате выполнение дальнейших вычислений прекращается.Исключение— это объект специального вида, характеризующий возникшую в программе особую ситуацию.

Если исключениене перехвачено нигде в программе, то оно автоматически обрабатывается методомTApplication.HandleException. Он обеспечивает стандартную реакцию программы на большинствоисключений— выдачу пользователю краткой информации в окне сообщений и уничтожение экземпляра исключения. При необходимости можно отключить появление сообщений отладчика. Для этого надо выполнить командуTools|DebuggerOptions, в открывшемся диалоговом окне выбрать страницуLanguageExceptionsи на ней выключить опциюStopOnDelphiExceptions.

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

Второй способ борьбы с исключениями состоит в использовании программного блока try...finally. Блок, содержащий совокупность операторов, способных привести к исключению, можно оформить следующим образом:

Try

<операторы, способные привести к исключению и к появлению "мусора">

finally

<операторы, выполняемые в любом случае и производящие зачистку "мусора">

end;

В этом случае операторы в разделе finallyбудут выполняться всегда, независимо от того, было или не было исключение. После выполнения этих операторов вычисления, как и ранее, прерываются. Если в блокеtryбыли открыты какие-то временные файлы, динамически выделялась память под временные объекты, выполнялись соединения с какими-то базами данных, а после всего этого произошла ошибка, вызвавшая исключение, то в блокеfinallyможно убрать весь «мусор»: удалить ненужные временные файлы, освободить память от временных объектов, разорвать связь с базой данных.

Блок try except используется для обработки исключительных ситуаций.

Try

<Исполняемый код>

except

<Код, исполняемый в случае ошибки>;

end;

В Object Pascal исключительные ситуации представляют собой объекты, содержащие информацию, идентифицирующую ошибку и место ее возникновения. Внутри части except создаются обработчики особых ситуаций для классов исключительных ситуаций. Обработчик особой ситуации имеет следующий формат:

try

защищаемый блок except

on E: ESomeException do <обработчик исключениям> end;

Для обработки особой ситуации Delphi предоставляет возможность создания временных объектов особой ситуации (Е), которые могут использоваться в обработчике исключения. Временный объект особой ситуации имеет тот же тип, что и объект исключения, который он обозначает (ESomeException).

Существуют предопределенные классы исключительных ситуаций для обработки стандартных ошибок, таких как нехватка памяти, деление на нуль, числовое переполнение, ошибки ввода-вывода и другие. Некоторые из них следующие:

1. EMathError- класс-предок исключений, случающихся при выполнении операций с плавающей точкой;

EInvalidArgument - значение параметра выходит за диапазон значений

EInvalidOp- передача математическому сопроцессору ошибочной конструкции;

EOverflow- переполнение разрядов при работе со слишком большими величинами;

EUnderflow- потеря разрядов при работе со слишком малыми величинами;

EZeroDivide- деление на ноль.

2. EIntError- класс-предок исключений, случающихся при выполнении целочисленных операций;

EDivByZero- деление на ноль;

EIntOverflow- выполнение операций, приводящих к переполнению целых переменных;

ERangeError- значение целочисленного выражения выходит за пределы установленного целочисленного типа. Попытка обращения к элементу массива по индексу, выходящему за пределы массива.

3. EListError- обращение к элементу списка (String, List, TStringList) по индексу, выходящему за пределы допустимых значений.

4. EInOutError- ошибки при операциях с файловой системой. Код ошибки возвращается в локальной переменнойErrorCode, которая может принимать следующие значения:

2 - файл не найден;

3 - неверное имя файла;

4 - слишком много открыто файлов;

5 - отказ в доступе;

100 - конец файла;

101 - диск полон;

106 - неверная операция ввода.

5. EConvertError- ошибки преобразования типов (простых, объектных).

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

begin

assignfile (f, 'data.dan1);

try

append(f);

try

writeln(f,s);

finally

closefile(f);

end;

except

on E: EInOutError do

if E.ErrorCode = 2 then

if MessageDlg('Файл не найден. Создать его?', mtError, [mbYes, mbNo],0)=mrYes

then FileCreate('data.dan');

end;

end;

В данном листинге внутренний блок try finally используется для того, чтобы файл был закрыт в любом случае, т. е. незави­симо от того, была ошибка или нет.

Внешний блок try except используется для обработки иск­лючительной ситуации, которая может произойти в программе. После закрытия файла во внутреннем блоке finally блок except использует временный объект Е для определения типа произошедшей ошибки ввода/вывода.

Исключительные ситуации