
- •Delphi. Визуальное программирование–2 Класс tStrings
- •Разработка программы «Блокнот» для хранения информации по месяцам года
- •Задания для самостоятельного выполнения
- •If MessageDlg ('Вы уверены, что хотите очистить?',
- •Модификация программы блокнот
- •InputQuery('Введите полное имя каталога ' , ‘’,dir);
- •InputQuery('Введите полное имя каталога ', ‘’ , dir);
- •Задания для самостоятельного выполнения
- •If SelectDirectory3 ('Выберите каталог', 'd:',dir) then begin
- •Класс tList
- •Inc (yk) ; {увеличиваем значение указателя}
- •Задание для самостоятельного выполнения
- •Исключительная ситуация
- •Методы класса Tstrings
- •Компонент ListBox
- •Методы добавления строк в компонент Delphi ListBox
- •Cвойство ItemIndex — выбранный в списке элемент
- •Свойство MultiSelect — возможность выбора одновременно более 1 элемента списка
- •Другие свойства
- •Диалоговые окна вDelphi
- •Компонент Delphi UpDown
- •Главное меню
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 использует временный объект Е для определения типа произошедшей ошибки ввода/вывода.
Исключительные ситуации