Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП / Заочники / ООП_ЛабРаб_Методичка

.pdf
Скачиваний:
29
Добавлен:
08.06.2015
Размер:
770.97 Кб
Скачать

Объектно-ориентированное программирование

Методические указания к лабораторным работам Составитель: В.И.Ковшов, к.т.н., доцент кафедры вычислительной техники СамГТУ

Лабораторные работы - 34 часа

(9 занятий: 8 занятий по 4 час + 1 занятие 2 часа).

Занятия 1. Лабораторная работа № 1

Основные компоненты графического интерфейса

Занятие 2. Лабораторная работа № 2

Разработка приложения «Калькулятор»

Занятие 3. Лабораторная работа № 3

Иерархия классов и элементов управления

Занятие 4. Лабораторная работа № 4

Разработка собственного класса: методы, свойства, констуктор, деструктор

Занятие 5. Лабораторная работа № 5

Наследование и полиморфизм, статические и виртуальные методы

Занятие 6. Лабораторная работа № 6

События, сообщения, обработчики событий и сообщений

Занятие 7. Лабораторная работа № 7

Создание и удаление объектов форм во время выполнения программы

Занятие 8. Лабораторная работа № 8

Построение собственных компонентов

Занятие 9. Лабораторная работа № 9

Использование офисных приложений как серверов автоматизации COM

Лабораторная работа № 1

Основные компоненты графического интерфейса

Цель работы: знакомство со средой разработки IDE Delphi 7.0 и принципами визуального программирования, разработка простой формы, содержащей основные компоненты GUI-

интерфейса: TPanel, TPageControl, TButton, TBitBtn, TLabel, TEdit, TRichEdit, TListBox, TComboBox, TCheckBox, TRadioGroup.

1. Задание

1.1.Создать показанную на рисунках форму.

1.2.Обеспечить выполнение следующих функций:

Кнопка «Очистить все» - очищает содержимое всех элементов формы и приводит их в начальное состояние.

Кнопка «Записать» - строка из поля «Текст» записывается в список «Список в зависимости от выбранного значения в выпадающем списке «Способ вставки» (в начало списка, в конец списка, перед текущей строкой, после текущей строки).

Кнопка ”>” – выделенная в списке 1 строка переносится в конец списка 2.

Кнопка ”<” – выделенная в списке 2 строка переносится в конец списка 1.

Кнопка “>>” – все строки из списка 1 переносятся в список 2.

Кнопка “<<” – все строки из списка 2 переносятся в список 1.

Кнопки «Найти», «След.» - выполняется поиск текста, набранного в поле «Поиск текста», в окне редактора, начиная с текущего положения курсора. Сравнение

выполняется с учетом или без учета регистров символов в зависимости от установки поля «С учетом регистра». Если текст найден, то активной становится кнопка «След.». В противном случае кнопка «Найти».

Кнопка «Выполнить» - все символы текста в окне редактора преобразуются в

строчные или прописные буквы в зависимости от установленного значения компонента «Преобразовать в».

2. Краткая теория

2.1. Среда программирования Delphi

Для визуальной разработки приложений cреда программирования Delphi предлагает несколько одновременно раскрытых на экране окон. Окна могут перемещаться по экрану, частично или полностью перекрывая друг друга. Наиболее важные окна:

Главное окно;

Окно формы;

Окно Инспектора объектов;

Окно кода программы.

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

Клавиша F12 переключает фокус между окном формы и окном кода программы. Клавиша F11 переключает фокус между окном Инспектора объектов, окном формы и

окном кода программы.

Главное окно осуществляет основные функции управления проектом создаваемой программы. Это окно всегда присутствует на экране и занимает его самую верхнюю часть. В главном окне располагается главное меню Delphi, набор пиктографических командных кнопок и палитра компонентов. Главное меню содержит все необходимые средства для управления проектом. Все опции главного меню представляют собой опции-заголовки, открывающие доступ к выпадающим меню второго уровня.

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

Палитра компонентов занимает правую часть главного окна и имеет закладки,

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

Как и панель кнопок, палитра компонентов может настраиваться. Для этого используется специальный редактор, окно которого появляется на экране после щелчка

правой кнопкой мыши на любой пиктограмме в палитре компонентов и выбора опции

Properties (Свойства).

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

С помощью окна формы программист конструирует интерфейс пользователя: он «достает» из палитры компонентов нужный компонент и размещает его на «наборном поле» окна формы, постепенно заполняя форму интерфейсными элементами.

Программист в любой момент времени контролирует содержание окна создаваемой программы и может внести в него необходимые изменения. Этот процесс составляет суть визуального программирования.

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

компонентом в окне формы. Для изменения других параметров предназначено окно Инспектора объектов. Это окно содержит две страницы - Properties (Свойства) и Events (События). Страница Properties служит для установки нужных свойств компонента, страница Events позволяет определить реакцию компонента на то или иное событие. Совокупность свойств отображает видимую сторону компонента: положение относительно левого верхнего угла рабочей области формы, его размеры и цвет, шрифт и текст надписи на нем и т.п. Совокупность событий определяет его поведенческую сторону: будет ли компонент реагировать на щелчок мыши или на нажатие клавиш, как он

будет вести себя в момент появления на экране или в момент изменения размеров окна и т.п.

Каждая страница окна Инспектора Объектов представляет собой таблицу из двух колонок, левая колонка которой содержит название свойства или события, а правая - конкретное значение свойства или имя подпрограммы, обрабатывающей соответствующее событие.

Строки таблицы выбираются щелчком мыши и могут отображать простые или сложные свойства. К простым относятся свойства, определяемые единственным значением - числом, строкой символов, значением True (Истина) или False (Ложь) и т.п. Например, свойство Caption (Заголовок) представляется строкой символов, свойства Height (Высота) и Width (Ширина) - числами, свойство Enabled (Доступность) - значе- ниями True или False. Сложные свойства определяются совокупностью значений. Слева от имени таких свойств указывается значок «+», а щелчок мышью по этому символу приводит к раскрытию списка составляющих сложного свойства. Чтобы закрыть раскрытый список, нужно щелкнуть по значку «-» сложного свойства.

Щелчок мышью на правой колонке строки таблицы активизирует указанное в ней значение свойства.

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

Окно кода представляет собой текстовый редактор и предназначено для создания и изменения текста программы. Этот текст составляется по специальным правилам и описывает алгоритм работы программы на языке программирования Object Pascal.

Первоначально окно кода содержит минимальный исходный текст, обеспечивающий нормальное функционирование пустой формы в качестве полноценного Windows-окна. В ходе работы над проектом программист вносит в него необходимые дополнения, чтобы придать программе нужную функциональность.

Программирование в Delphi строится на тесном взаимодействии двух процессов: процесса конструирования визуального проявления программы (т.е. ее Windows-окна) и процесса написания кода, придающего элементам этого окна и программе в целом необходимую функциональность. Для написания кода используется окно кода, для конструирования программы - остальные окна Delphi, и прежде всего - окно формы.

Между содержимым окон формы и кода существует неразрывная связь, которая строго отслеживается Delphi. Это означает, что размещение на форме компонента приводит к автоматическому изменению кода программы и наоборот - удаление тех или иных

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

Программист может перемещать любой размещенный на форме компонент и изменять его размеры с помощью мыши.

Чтобы придать компоненту нужные свойства, используется страница Properties Инспектора Объектов.

Чтобы компонент мог откликаться на то или иное событие, программист должен создать обработчик события и указать его имя на странице Events Инспектора Объектов.

Обработчик события оформляется в виде процедуры, имеющей составное имя. Первая часть имени представляет собой имя класса для формы, вторая часть отделяется от первой точкой и может быть произвольной. Если Delphi автоматически формирует заготовку для обработчика, то вторая часть имени представляет собой объединение имени компонента и имени события без предлога On.

Тело процедуры ограничено словами begin... end и состоит из отдельных предложений (операторов) языка Object Pascal. В конце каждого предложения ставится точка с запятой.

Свойства компонента могут изменяться на этапе прогона программы.

2.2. Компоненты общего назначения

2.2.1. TLabel - метка для отображения текста

Компоненты класса TLabel (метка) предназначены для размещения на форме различного рода текстовых надписей. Для этого служит центральное свойство компонента - Caption. С помощью свойства Font можно разнообразить вид надписи.

2.2.2. TEdit-ввод и отображение строки

Компонент класса TEdit представляет собой однострочный редактор текста. С его помощью можно вводить и/или отображать достаточно длинные текстовые строки.

Центральным свойством компонента является Text, которое представляет собой отображаемую компонентом строку.

2.2.3. TMemo, TRichEdit - ввод и отображение текста

Компоненты класса ТМето предназначены для ввода, редактирования и/или отображения достаточно длинного текста. Текст хранится в свойстве Lines класса TStrings и, таким образом, представляет собой пронумерованный набор строк (нумерация начинается с нуля). С помощью свойств и методов этого класса (Count, Add, Delete, Clear и т.д.) можно динамически формировать содержимое компонента. Многие свойства и методы этого класса аналогичны свойствам и методам класса TEdit. Свойство Text содержит отображаемый компонентом текст в виде одной длинной строки. В компонент можно загружать текст из файла с помощью метода LoadFromFile. Метод SaveToFile сохраняет текст из компонента в файле на диске.

2.2.4. TButton - кнопка

Кнопки TButton широко используются для управления программами. Связанный с кнопкой алгоритм управления реализуется в обработчике события OnClick.

Свойства компонента ModalResult определяет результат, с которым будет закрыто модальное окно.

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

на нее приводит к закрытию модального окна и возвращает в программу значение ModalResult как результат диалога с пользователем. В Delphi определены следующие

стандартные значения ModalResult:

 

Была нажата кнопка Ignore.

mrNone

Модальное окно не закрывается.

mr Ignore

mrOk

Была нажата кнопка ОК.

mrYes

Была нажата кнопка Yes.

mrCancel

Была нажата кнопка Cancel.

mrNo

Была нажата кнопка No.

mrAbort

Была нажата кнопка Abort.

mrAll

Была нажата кнопка Л//.

mrRetry

Была нажата кнопка Retry.

 

 

В отличие от большинства других видимых компонентов кнопка TButton является компонентом самой Windows и поэтому не может изменять свой цвет произвольным образом - она его меняет вместе с изменением палитры Windows. Кнопка всегда имеет системный цвет clBtnFace и не имеет свойства Color. Шрифт надписи на кнопке может менять свой стиль и размер, но компонент игнорирует изменение его цвета.

2.2.5. TBitBtn - кнопка с изображением

Пиктографическая кнопка TBitBtn представляет собой разновидность стандартной кнопки TButton. Ее отличительная особенность - свойство Glyph, с помощью которого определяется растровое изображение, рисуемое на поверхности кнопки. В состав поставки Delphi входит множество рисунков, разработанных специально для размещения в этих кнокпах. Свойство Kind определяет одну из 11 стандартных разновидностей кнопки. Нажатие любой из них, кроме bkCustom и bkffelp, закрывает модальное окно и возвращает в программу результат: bkOk - mrOk, bkCancel - mrCancel и т.д. Кнопка bkClose для модального окна возвращает тrСапcel, а для главного окна программы - закрывает его и завершает работу программы. Кнопка bkHelp автоматически вызывает раздел справочной службы, связанный с HelpContext формы, на которую она помещена. Если у кнопки была изменена пиктограмма Glyph, Delphi автоматически присвоит ей Kind=bkCustom. Это произойдет также в случае, когда кнопка указана как умалчиваемая (Default=True), но Kind не содержит bkOk или bkYes, а также, если ее свойство Cancel содержит True, a Kind не содержит bkCancel или bkNo.

2.2.6. TCheckBox - независимый переключатель

Независимый переключатель TCheckBox используется для того, чтобы пользователь мог указать свое решение типа Да/Нет или Да/Нет/Не знаю (в последнем случае в окошке компонента устанавливается флаг выбора, но само окошко закрашивается серым цветом). Это решение отражается в свойстве State компонента, доступном как для чтения, так и для записи. В составе диалогового окна может быть несколько компонентов TCheckBox. Состояние любого из них не зависит от состояния остальных, поэтому такие переключатели называются независимыми. Связанный с компонентом текст указывается в свойстве Caption.

Типичное использование компонента:

if CheckBoxl.Checked then

// Да

. . . .

 

Else

// Нет

. . . .

 

Или:

 

case CheckBoxl.State of

// Да

cbChecked

:...;

cbUnchecked

:...;

// Нет

cbGrayed

:...;

// Не знаю

end;

2.2.7. TRadioGroup - группа зависимых переключателей

Компонент класса TRadioGroup представляет собой специальный контейнер, предназначенный для размещения зависимых переключателей класса TRadioButton. Каждый размещаемый в нем переключатель помещается в специальный список Items и доступен по индексу, что упрощает обслуживание группы.

Свойства компонента:

property Columns: Integer; Определяет количество столбцов переключателей. property ItemIndex: Integer; Содержит индекс выбранного переключателя. property Items: TStrings; Содержит список строк с заголовками элементов.

Добавление/удаление элементов достигается добав- лением/удалением строк списка Items.

После размещения компонента на форме он пуст. Чтобы создать в нем хотя бы один переключатель, следует раскрыть редактор списка Items и ввести хотя бы одну строку: строки Items используются как поясняющие надписи справа от переключателей, а их количество определяет количество переключателей в группе. После создания компонента его свойство Itemlndex по умолчанию имеет значение -1. Это означает, что ни один переключатель в группе не выбран. Если в момент появления компонента на экране в каком-то переключателе выбор уже должен быть установлен, необходимо на этапе конструирования с помощью окна Инспектора Объектов или программно (например, в обработчике OnActivate формы) установить в свойство Itemlndex номер соответствующего переключателя (нумерация начинается с 0). Это же свойство позволяет программе проанализировать выбор пользователя, например:

case RadioGroupl.ItemIndex of

0:...; //Выбран 1-и переключатель

1:...; //Выбран 2-й переключатель

else

…. //Не выбран ни один переключатель end;

2.2.8. TListBox - список выбора

Компонент класса TListBox представляет собой стандартный для Windows список выбора, с помощью которого пользователь может выбрать один или несколько элементов выбора. В компоненте предусмотрена возможность программной прорисовки элементов, поэтому список может содержать не только строки, но и произвольные изображения. Набор строк, показываемых в компоненте, хранится в свойстве Items. Создание элементов (опций) списка компонента реализуется с помощью методов его свойства Items Add,

Append, Insert или LoadFromFile.

2.2.9. TComboBox - раскрывающийся список выбора

Комбинированный список TComboBox представляет собой комбинацию списка TListBox и редактора TEdit, и поэтому большинство его свойств и методов заимствованы у этих компонентов. Существуют пять модификаций компонента, определяемые его свойством Style: csSimple, csDropDown, csDropDownList, csOwnerDrawFixed и csOwnerDrawVariable. В первом случае список всегда раскрыт, в остальных он раскрывается после нажатия кнопки справа от редактора. В модификации csDropDownList

редактор работает в режиме отображения выбора и его нельзя использовать для ввода новой строки (в других модификациях это возможно).

Свойство DropDownCount определяет количество элементов списка, появление которых еще не приводит к необходимости прокрутки списка. По умолчанию это свойство имеет значение 8: если в списке указано 9 и более элементов (т.е. больше, чем содержит DropDownCount), при его раскрытии к окну будет добавлена полоса прокрутки. Свойство DroppedDown определяет, раскрыт ли в данный момент список. Это свойство доступно

также для записи, что позволяет программно управлять состоянием списка. Событие OnDropDown происходит при изменении состояния списка.

Наполнение списка ведется методами Add, Append, Insert и т.п. его свойства Items

класса TStrings.

2.2.10.TPanel - панель

Компонент TPanel (панель) представляет собой контейнер общего назначения. В

отличие от TGroupBox он не имеет заголовка и поэтому менее удобен для функционального группирования элементов. С другой стороны, его свойство Caption отображается в виде текстовой строки и может использоваться для вывода сообщений. Компоненты этого класса часто помещаются на форму для того, чтобы располагать

вставленные в них дочерние компоненты вдоль одной из сторон окна независимо от изменения размеров этого окна.

Компонент имеет развитые средства создания различных эффектов трехмерности за счет использующихся в нем двух кромок - внешней и внутренней.

Свойства компонента:

TBorderStyle = bsNone . .bsSingle; Определяет стиль рамки: bsNone - нет рамки; property BorderStyle : TBorderStyle; bsSingle - компонент по периметру обводится

линией толщиной в 1 пиксель.

Для компонента объявлено событие OnResize, в обработчике которого программист может предусмотреть необходимую реакцию на изменение размеров компонента.

2.2.11.TPageControl - набор страниц с закладками

Компонент TPageControl может содержать несколько перекрывающих друг друга

панелей класса TTabSheet. Каждая панель выбирается связанной с ней закладкой и может содержать свой набор помещенных на нее компонентов.

Чтобы на этапе конструирования добавить новую панель или выбрать ранее вставленную, щелкните по компоненту правой кнопкой мыши и выберите New Page (новая панель), Next Page (следующая панель) или Previous Page (предыдущая панель). Смена панелей идет циклически, т.е. после показа последней показывается первая и наоборот.

2.3. Примеры использования

2.3.1. Очистка и приведение в исходное состояние элементов формы

Edit1.Text:='';

Edit2.Text:='';

ComboBox1.ItemIndex:=0;

ListBox1.Items.Clear;

ListBox2.Items.Clear;

RichEdit1.Clear;

CheckBox1.Checked:=false;

RadioGroup1.ItemIndex:=0;

2.3.2. Вставка строки в Список 1 (ListBox1) with ListBox1 do

Case ComboBox1.ItemIndex of 0 : begin // в начало списка

Items.Insert(0,Edit1.Text);

end;

1 : begin // в конец списка

Items.Add(Edit1.Text);

end;

2 : begin // перед текущей строкой

if ItemIndex<0 then ItemIndex:=0; // Если никакая строка не выделена Items.Insert(ItemIndex,Edit1.Text);

end;

3 : begin // после текущей строки

if ItemIndex<0 then ItemIndex:=0; // Если никакая строка не выделена Items.Insert(ItemIndex+1,Edit1.Text);

end;

end;

2.3.3. Копирование строки из Списка 1 в Список 2 (ListBox2) if ListBox1.Items.Count=0 then begin // Список 1 пуст ShowMessage('Список 1 пуст!');

exit;

end;

if ListBox1.ItemIndex<0 then begin // В Списке 1 нет выбранной строки

ShowMessage(‘Выберите строку в Списке 1'); exit;

end;

//Добавление строки из Списка 1 в конец Списка 2 ListBox2.Items.Add(ListBox1.Items[ListBox1.itemIndex]); ListBox2.ItemIndex:=ListBox2.Items.Count-1; // Текущей становится вставленная строка

//Запоминаем и изменяем позицию текущей строки в Списке 1, т.к. скопированная строка

//будет удалена

i:=ListBox1.ItemIndex;

if i=(ListBox1.Items.Count-1) then // Если скопирована последняя строка ListBox1.ItemIndex:=i-1

else ListBox1.ItemIndex:=i+1;

ListBox1.Items.Delete(i); // Удаление скопированной строки из Списка 1

2.3.4.Преобразование текста в окне редактора (RichEdit1) в строчные и прописные буквы в зависимости от выбора радиокнопок (RadioGroup1).

case RadioGroup1.ItemIndex of

0 : RichEdit1.Text:=AnsiLowerCase(RichEdit1.Text);

1 : RichEdit1.Text:=AnsiUpperCase(RichEdit1.Text); end;

2.3.5.Поиск в окне редактора (RichEdit1) текста, заданного в окне ввода образца

(Edit2)

with RichEdit1 do

begin

{ Поиск начинается с текущей позиции курсора в тексте. Если курсора нет , то с первой позиции }

if SelLength > 0 then // Длина выделенного фрагмента текста

StartPos := SelStart + SelLength else

StartPos := 0;

{ SelStart – начало выделенного фрагмента в тексте StartPos – позиция, с которой начинается поиск