Слайд 1Использование строчного редактора, главного и контекстного меню, добавление новой формы
в проект и обработка исключительных ситуаций
Лекция 3
Слайд 2 Memo
Компонент Memo (вкладка Standard) является редактором многострочного текста, в котором формат текста (шрифт,
его атрибуты, выравнивание) одинаков для всего текста. Он снабжен многими
функциями, свойственными большинству редакторов со стандартными комбинациями горячих клавиш для выделения фрагментов текста, работы с буфером обмена, отмены последней команды редактирования.
Весь текст окна Memo можно рассматривать как единое целое, представленное одной строкой типа string, внутри которой используются разделители типа символов возврата каретки и перевода строки, либо как N отдельных строк, разделенных между собой клавишей Enter.
Слайд 3Основные свойства компонента Memo
Слайд 4Основные свойства компонента Memo
Слайд 5Методы свойства Lines
Для работы со строками используется свойство Lines, к
которому можно применять следующие методы
Слайд 6Методы компонента Memo
При работе с компонентом часто используются следующие методы:
• Clear –
позволяет очистить содержимое компонента Memo. Например, Memo1.Clear;
• SetFocus – делает компонент Memo активным
(устанавливает фокус). Например, Memo1.SetFocus
Пример использования компонента
procedure TForm1.Button1Click(Sender: TObject);
var a: array[1..5] of string;
i: integer;
st: string;
begin
if Memo1.Lines.Count=0 //исходные данные
then begin
ShowMessage(‘Исходные данных нет’);
exit
end
else begin
st:=’Введенный массив:’+#13;
for i:=1 to 5 do
begin
a[i]:=Memo1.lines[i-1];
st:=st+IntToStr(i)+a[i]+#13
end;
ShowMessage(st)
end
end;
Слайд 7Компонент MainMenu
Компонент MainMenu (вкладка Standard) представляет собой главное меню программы.
Он является невизуальным,
место его размещения на форме в процессе проектирования не имеет
значения для пользователя, так как при выполнении приложения он увидит только сгенерированное этим компонентом меню.
После установки компонента на форму необходимо создать пункты меню. Для этого следует либо дважды щелкнуть на компоненте левой кнопкой мыши, либо щелкнуть на нем правой кнопкой и выбрать в контекстном меню команду Menu Designer, либо щелкнуть в правой половине строки свойства Items
в инспекторе объектов:
Для создания нового пункта меню необходимо поместить курсор в рамку из точек, обозначающую место расположения раздела, и задать в Инспекторе Объектов его свойство Caption, которое обозначает подпись пункта меню.
Если в свойство Caption ввести символ «–», то будет создана разделительная черта, можно воспользоваться командой контекстного меню InsertSeparator (Вставить разделитель).
Слайд 8Компонент MainMenu
Каждый пункт меню или подменю, т.е. каждый элемент свойства
Items, является объектом типа TMenuItem, обладающим своими свойствами, методами, событиями. Свойство
Name задает имя объекта, соответствующего разделу меню. Во избежание путаницы рекомендуется задавать объектам осмысленные имена.
Для вставки нового пункта меню необходимо выбрать пункт меню, выше или левее которого требуется сделать вставку и нажать клавишу Ins или вызвать команду Insert из контекстного меню (появляется при щелчке на окне правой кнопкой мыши).
Чтобы переместить пункт меню в другое место, необходимо отбуксировать его туда мышью. Для удаления выбранного пункта меню нужно нажать Del или вызвать команду Delete из контекстного меню.
Для создания подменю необходимо выбрать пункт меню, для которого требуется создать подменю, и нажать Ctrl+-> или вызвать команду Create Submenu из контекстного меню.
В процессе конструирования меню инспектор объектов отражает свойства пункта меню, в данный момент создаваемого пользователем.
Слайд 9Компонент MainMenu
Свойства пунктов меню
Слайд 10Компонент MainMenu
При работе с меню основным используемым событием является событие OnClick,
возникающее при щелчке на пункте меню или при нажатии «горячих»
клавиш. К обработчику этого события можно перейти, используя вкладку Events инспектора объектов или щелкнув мышью по пункту меню на форме (обратите внимание – на форме, а не в Конструкторе Меню!). Если пункты меню повторяют какие-либо действия, т.е. события для данных действий уже существуют, то необходимо только в инспекторе объектов данного пункта меню выбрать уже сгенерированное событие.
Слайд 11Компонент PopupMenu
Компонент PopupMenu (вкладка Standard) предназначен для формирования контекстного меню. Контекстное меню создается аналогично
главному. Основное отличие заключается в том, что создание его завершается
привязкой к одному или несколькими элементам управления.
Свойство элементов PopupMenu должно быть в значении PopupMenu1 (имя компонента): , в противном случае контекстное меню при нажатии на правую клавишу мыши не вызовется.
Слайд 12Компонент PopupMenu
Для компонента PopupMenu основное событие – OnPopup, значение которого аналогично OnClick для MainMenu
Слайд 13Добавление в проект новой формы
Каждое приложение может иметь несколько форм,
одна из которых является главной и отображается первой при запуске программы. При
закрытии главного окна (формы) приложения прекращается работа всего приложения, при этом также закрываются все другие окна приложения. В начале работы Delphi по умолчанию делает главной первую форму (с первоначальным названием Form1).
Для подключения новой формы к проекту нужно воспользоваться командой File/New/Form или щелчком мыши на командной кнопке New Form (Создать форму). При этом появятся новая пустая форма и связанный с ней модуль. Имя формы, данное ей Delphi по умолчанию, можно изменить на имя, более подходящее по смыслу. Переключаться между имеющимися в проекте формами можно с помощью командной кнопки View Form (Отобразить форму) или комбинацией Shift+F12.
Слайд 14Добавление в проект новой формы
У программы может быть только одна главная
форма – это форма, которая показывается при запуске программы, и неограниченное
число подчиненных форм, которые исходно на экране не появляются, а вызываются по команде из программы с помощью специальных методов. При конструировании приложения, состоящего из нескольких форм (окон), указать главную форму можно в окне параметров проекта, вызываемом командой Project/Options…. Главная форма выбирается в списке
Main form вкладки Forms.
Форма с информационным окном About Box
При работе с программой иногда возникает необходимость вывода справки о приложении. Для этой цели можно использовать форму с информационным окном AboutBox, для вызова которой воспользуемся пунктом главного меню File/New/Other, в диалоговом окне New Items на закладке Form выберем пиктограмму AboutBox. Информационное окно имеет вид формы, на которой размещены компоненты Label, Image и Button . Работать с AboutBox можно как с обычной формой.
Слайд 15Организация взаимодействия форм
Главная форма должна знать о существовании другой формы,
это достигается ссылкой на модуль формы в предложении Uses, то есть,
если одна форма выполняет какие-либо действия с другой формой, то в списке uses раздела implementation (или interface) модуля первой формы должна быть ссылка на модуль второй формы, например:
Implementation
uses Unit2; //Ссылка на модуль второй формы
Ссылку на модуль другой формы можно устанавливать программно, но Delphi позволяет автоматически добавить ссылки следующим образом: на этапе разработки нужно активизировать главную форму, после чего обратиться к команде File/Uses Unit. В появившемся диалоговом окне нужно выбрать имя нужного модуля и щелкнуть на кнопке ОК. Вставляется ссылка в предложение, стоящее за зарезервированным словом Implementation, так как обычно главное окно в своей интерфейсной части не ссылается на элементы интерфейсной части второго окна.
После создания новой формы сразу нужно ее сохранить.
Слайд 16Организация взаимодействия форм
Диалоговое окно Information
Если программист забудет сослаться на модуль,
подключенный к проекту, Delphi при первой же трансляции программы сообщит об этом
в диалоговом окне Information и предложит вставить недостающую ссылку. В диалоговом окне сообщается о том, что одна форма использует другую, но модуль второй формы отсутствует в списке uses модуля первой формы. Для автоматического добавления ссылки на модуль достаточно нажать кнопку Yes. Форма может выполнять различные операции не только с другой формой, но и с её компонентами. В этом случае также нужна ссылка на модуль другой формы.
Например,
Label1.Caption:=Form2.Edit1.Text.
Здесь при нажатии кнопки Button2 формы Form1 в надписи Label1 отображается текст редактора Edit1, расположенного на форме Form2.
Слайд 17Особенности модальных форм
Форма может быть модальной и немодальной. Немодальная форма позволяет переключиться в
другую форму приложения без своего закрытия. Модальная форма требует обязательного закрытия
перед обращением к любой другой форме приложения.
Менеджер проекта автоматически подключает новую форму к списку используемых форм и обеспечивает все необходимые действия по ее инициализации. Для того чтобы показать на экране ранее созданную подчиненную форму, можно применить один из следующих методов:
Имя_формы.Show; или
Имя_формы.ShowModal.
Слайд 18Особенности модальных форм
Метод Show вызывает форму в немодальном режиме, а метод ShowModal вызывает форму
в модальном режиме и возвращает результат диалога с пользователем.
Модальная форма
полностью берет на себя дальнейшее управление программой, поэтому оператор, следующий за вызовом ShowModal, получит управление только после её закрытия.
Для удаления формы с экрана используются методы Hide (спрятать) и Close (закрыть).
Для модальной формы определено свойство ModalResult, доступное только во время выполнения приложения. При открытии формы методом ShowModal сначала свойство ModalResult равно нулю (константа mrNone). Как только при обработке каких-то событий на форме свойству ModalResult будет присвоено положительное значение, модальная форма закроется. А значение её свойства ModalResult можно будет прочитать как результат, возвращаемый методом ShowModal.
Значения свойства ModalResult определяются тем, какая кнопка была нажата при закрытии модальной формы, и задаются следующими константами: mrNone; mrOk; mrCancel;
mrAbort; mrRerty; mrIgnore; mrYes; mrNo; mrAll; mrNoToAll; mrYesToAll
(за префиксом mr следует название кнопки).
Слайд 19Исключительные ситуации
В ходе выполнения программы могут возникать динамические ошибки (ошибки
времени выполнения Run Time Errors), которые являются следствием неправильной работы
инструкций, процедур, функций или методов программы.
Для обработки динамических ошибок введено понятие исключения. Исключение – это результат выполнения некорректного оператора, вызывающий прерывание или полное прекращение работы программы.
Обработка исключения состоит в нейтрализации вызвавшей его динамической ошибки. Исключения могут возникать, например, при попытке деления на ноль или в результате выполнения вычислений; в случае нехватки памяти; из-за ошибки преобразования; при попытке обращения к несуществующему элементу массива и т.д.
Независимо от источника ошибки приложение информируется о его возникновении.
Слайд 20
Возникающие при выполнении программы динамические ошибки автоматически преобразовываются средствами Delphi в соответствующие
объекты-исключения.
Объект-исключение содержит информацию о типе ошибки и при возникновении исключения
заставляет программу временно приостановиться.
После обработки исключения объект-исключение автоматически удаляется. При работе в среде Delphi при каждой исключительной ситуации среда перехватывает управление программой.
Для отмены реакции среды на исключительную ситуацию необходимо вызвать опцию Tools/Debugger Options и на вкладке Language Exceptions отменить переключатель Stop on Delphi Exceptions.
В Delphi базовым классом для всех исключений служит класс Exception, от которого порождены многочисленные дочерние типы, соответствующие часто встречающимся случаям ошибок ввода/вывода, распределения памяти и т.п.
Исключительные ситуации
Слайд 21Наиболее используемые классы исключений
Слайд 22Обработка исключений
Для обработки исключений введены две конструкции:
try..finally и
try..except.
Конструкция try .. finally
Конструкция try..finally состоит из двух блоков (try и
finally):
try
//операторы, выполнение которых может вызвать ошибку
finally
//операторы, выполняемые всегда, даже в случае ошибки
end;
Если в любом из операторов блока try возникает исключение, то управление передается первому оператору блока finally. Если исключение не возникло, то выполняются все операторы обоих блоков. Конструкция try..finally не обрабатывает исключение, а выполняет действия, которые должны быть произведены даже в случае возникновения ошибки.
Слайд 23Обработка исключений
Например,
var f: File;
begin
AssignFile(f, 'Somefile.ext');
try // оператор, в котором возможна
ошибка
Reset(f); // работы с файлом
Finally
CloseFile(f)
end;
Слайд 24Обработка исключений
Конструкция try .. except
Конструкция try..except также состоит из двух блоков
(try
и except):
try
//операторы, выполнение которых может вызвать ошибку
except
//операторы, которые выполняются только
в случае ошибки
end;
Конструкция try..except работает так: если в любой из инструкций блока try возникает исключение, то управление передается первой инструкции блока except, которая ликвидирует исключительную ситуацию и восстановит работоспособность программы. Если же исключение не возникло, то инструкции блока except не выполняются.
Слайд 25Обработка исключений
Например:
var f: File;
begin
AssignFile(f, 'Somefile.txt');
try //оператор, в котором возможна ошибка
Reset(f);
// работы с файлом
except
ShowMessage(‘Ошибка работы с файлом Somefile.txt’);
CloseFile(f)
end;
end;
Слайд 26Обработка исключений
Блок except можно разбить на несколько частей с помощью конструкции on..do,
позволяющей анализировать класс исключения для его более удобной и полной
обработки:
Try
Оператор1;
Оператор2;
. . .
Except
on Идентификатор1: класс исключения do Оператор обработки ИС этого класса;
on Идентификатор2: класс исключения do Оператор обработки ИС этого класса;
. . .
else Операторы обработки исключения по умолчанию
end;
Слайд 27Обработка исключений
При возникновении исключительной ситуации конструкции on..do просматриваются последовательно, в
порядке их описания.
Каждый тип исключительной ситуации, описанный после ключевого
слова on, обрабатывается именно этим блоком: только то, что предусмотрено в нем, и будет реакцией на данную ситуацию.
Если при этом обработчик родительского класса стоит перед дочерним, последний никогда не получит управление.
Если класс возникшего исключения не совпадает с проверяемым классом, то выполняется оператор после слова else.
Блок else является необязательным и может отсутствовать.
Слайд 28Обработка исключений
Идентификатор – это локальная переменная класса исключения, которую можно использовать
для доступа к объекту возникшего исключения внутри конструкции on..do.
Идентификатор (произвольное имя, заданное
программистом) является необязательным элементом и может отсутствовать, при этом не ставится и разделительный знак двоеточия (:).
Стандартная обработка подразумевает вывод на экран сообщения с указанием типа ошибки, имени модуля и адреса, где она имела место. Однако ее легко переопределить:
Try
U:= 220.0;
R:= 0;
I:=U/R;
Except
on EZeroDivide do ShowMessage('Короткое замыкание!')
end;
Слайд 29Обработка исключений
Можно обработать исключение со стандартным сообщением кода ошибки. Например:
try
Reset(f);
while
not EOF(f) do
begin … end; // возможна ошибка работы с
файлом
Close(f);
except
on E:EInOutError do ShowMessage(′При выполнении файловой операции’ + #13#10 + ‘возникла ошибка №′+ IntToStr(E.ErrorCode))
end;