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

Лаб.работы по программированию

.pdf
Скачиваний:
30
Добавлен:
21.05.2015
Размер:
1.07 Mб
Скачать

Лабораторная работа 35. Создание собственного класса

Создание класса содержащего сведения о сотруднике некоторой организации.

Создадим класс в модуле MyClasses.

unit MyClasses; interface

uses SysUtils, Dialogs, Classes; type

TPerson = class private

FName: string; // Фамилия, имя и отчество

FDepl, FDep2, FDep3: string; // Место работы (учебы)

FYear: word;

// Год рождения

FSex: char;

// Пол: "м" или "ж"

FAttr: boolean;

//

Булев атрибут

FComment: string;

//

Комментарий

protected

procedure SetSex(Value: char); // Процедура записи public

property Name: string read FName write FName; property Depl: string read FDepl write FDepl; property Dep2: string read FDep2 write FDep2; property Dep3: string read FDep3 write FDep3; property Year: word read FYear write FYear;

property Sex: char read FSex write SetSex default 'м'; property Attr: boolean read FAttr write FAttr default

true;

property Comment: string read FComment write FComment; end;

implementation

procedure TPerson.SetSex(Value: char); // Процедура записи пола

begin

if Value in ['м', 'ж'] then FSex := Value

else ShowMessage('Недопустимый символ "' + Value + '" в указании пола');

end; end.

Вы создали класс в вашем модуле MyClasses. Давайте посмотрим, как можно использовать объекты нашего класса. Создайте в модуле формы Unit1 вашего приложения тест класса TPerson. Введите в модуль операторы:

© ИМПИ ОГПУ

uses MyClasses; var Pers: TPerson;

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

Создание объекта вашего класса TPerson должно осуществляться вызовом его конструктора Create. Так что создайте обработчик события OnCreate вашей формы, и вставьте в него оператор: Pers := TPerson.Create;

Вот теперь объект создан, и переменная Pers указывает на него. Чтобы не забыть очистить память от этого объекта при завершении работы приложения, сразу создайте обработчик события OnDestroy формы, и вставьте в него оператор:

Pers.Free;

Теперь перенесите на форму четыре окна Edit, окно Memo и две кнопки. Пусть первая кнопка с надписью Запись заносит в объект Pers данные из окон редактирования: фамилию с именем и отчеством, пол, подразделение, в котором работает или обучается человек, год рождения, характеристику из окна Memo. Обработчик щелчка на ней может иметь вид:

with Pers do begin

Name := Editl.Text;

if Edit2.Text <> " then Sex := Edit2.Text[1]; Depl := Edit3.Text;

Year := StrToInt(Edit4.Text); Comment := Memol.Text;

end;

А вторая кнопка с надписью Чтение пусть осуществляет чтение информации из объекта в окна редактирования. Обработчик щелчка на ней может иметь вид:

with Pers do begin

Editl.Text:= Name;

Edit2.Text:= Sex;

Edit3. Text:= Depl; Edit4.Text:= IntToStr(Year); Memol.Text:= Comment;

end;

© ИМПИ ОГПУ

Задания для самостоятельной работы

Выполните рассмотренное приложение. Занесите в окна редактирования какуюто подходящую информацию и щелкните на кнопке Запись. А потом сотрите тексты всех окон редактирования и щелкните на кнопке Чтение. Информация в окнах должна восстановиться. Проверьте также реакцию на неверный символ, задающий пол.

Лабораторная работа 36. Конструкторы и деструкторы

Добавим в класс открытые поля AgeMin, AgeMax, обозначающие минимальную и максимальную границы допустимого возраста. Для реализации этой идеи в объявлении класса надо произвести следующие изменения в предыдущем проекте:

uses

...,

DateUtils;

type

 

 

TPerson = class private

protected

procedure SetYear(Value: word); // Процедура записи

public AgeMin, AgeMax: word;

property Year: word read FYear write SetYear; end;

Реализация процедуры записи SetYear может быть следующей:

procedure TPerson.SetYear(Value: word); // Процедура записи года рождения

var NowYear: word; begin

NowYear := YearOf(Date);

if (NowYear - Value >= AgeMin) and (NowYear - Value <= AgeMax)

then

FYear := Value else ShowMessage('Недопустимый год рождения '+IntToStr(Value));

end;

Далее целые поля AgeMin и AgeMax в обработчике события формы OnCreate после оператора создания объекта класса операторы вида:

Pers.AgeMax := 45; Pers.AgeMin := 16;

© ИМПИ ОГПУ

Поскольку начальные значения полей задать в их объявлениях невозможно, для этого и служит конструктор класса. Добавьте в открытый раздел вашего класса объявление: constructor Create;

А в раздел implementation добавьте реализацию конструктора:

constructor TPerson.Create; const Unknown = 'неизвестный'; begin

inherited; FSex := #0; AgeMax := 150;

FName := Unknown;

FDepl := Unknown;

FDep2 := Unknown;

FDep3 := Unknown; end;

Давайте введем в наш класс TPerson еще одно добавление, которое расширит его возможности. Создадим возможность хранить форматированный текст в формате .rtf, который может поступать, как вы знаете, из окна RichEdit. Но форматированный текст можно хранить или в объекте класса TRichEdit, или в

файле,

в

который

он

записан

методом SaveToFile

свойства Lines окна RichEdit.

Создать в

нашем

классе внутренний объект

класса TRichEdit мы не можем. Так что остается вариант хранения во временном файле. Добавьте в класс TPerson два поля:

FDoc: ^TRichEdit;

FileTMP: string;

Введите в открытый раздел класса объявления двух процедур:

procedure SetDoc(var Value: TRichEdit); procedure GetDoc(var Value: TRichEdit);

Первая из них будет запоминать форматированный текст из окна RichEdit, переданного в нее как указатель на объект (вспомните смысл ключевого слова var). А вторая процедура будет заносить в окно, указанное аналогичным образом ее параметром, текст из файла. Реализация этих функций может иметь вид:

procedure TPerson.SetDoc(var Value: TRichEdit); begin

if FileTMP = ''

then FileTMP:= FName +‘.tmp’; FDoc := @Value; FDoc^.Lines.SaveToFile(FileTMP);

© ИМПИ ОГПУ

end;

procedure TPerson.GetDoc(var Value: TRichEdit); begin

if FileTMP <> ''

then FDoc^.Lines.LoadFromFile(FileTMP);

end;

Добавьте в свое тестовое приложение окно RichEdit. Можете добавить также компонент FontDialog и обеспечить возможность форматирования текста в окне RichEdit . В обработчик щелчка на кнопке Запись вставьте оператор: SetDoc(RichEditl); а в обработчик щелчка на кнопке Чтение вставьте оператор: GetDoc(RichEditl);

Если в приложении выполнялся вызов процедуры SetDoc, то был создан временный файл. И когда приложение завершается, этот файл остается на диске. Вам нужно написать деструктор, который удалял бы этот файл.

В нашем случае в открытый раздел класса следует ввести объявление деструктора:

destructor Destroy; override;

Реализация деструктора имеет вид:

destructor TPerson.Destroy;

begin

FileTMP <> ' ' then DeleteFile(FileTMP);

if

inherited; end;

Если файл создавался, то он уничтожается. Введение такого деструктора никак не отразится на внешнем поведении вашего тестового приложения. Но теперь вы не оставляете на диске временный и уже ненужный файл.

Задания для самостоятельной работы

Дополнить созданный в л.р. 35 проект рассмотренными конструктором и деструктором.

Лабораторная работа 37. Создание собственных компонентов

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

© ИМПИ ОГПУ

невизуальных компонентов это будет класс TComponent, для графических –

TGraphicControl, для оконных – TCustomControl.

Рассмотрим основы технологии на примере разработки простейшего компонента, работающего как обычная надпись, но включающего дополнительные возможности. К ним относятся свойство FontColor для задания цвета шрифта, методы SetFontColor и GetFontColor для установки и получения цвета.

1.Дайте команду File > New (Файл > Создать) и на вкладке New выберите значок Component (Компонент).

2.В открывшемся диалоговом окне в поле Ancestor type (Тип родителя) выбирается класс TLabel. Мы создадим наш компонент на основе стандартной надписи. В поле Class Name (Имя класса) укажем название нового класса TMyLabel,

в поле Palette Page (Страница палитры компонентов) — имя панели Samples (Образцы),

в поле File name (Имя файла модуля) — полный путь поиска и имя (например,

C:\Program Files\Borland\delphi5\lib \MyLabel).

Если теперь щелкнуть на кнопке ОК, система Delphi сгенерирует начальный текст будущего компонента. Пока что он полностью соответствует компоненту

TLabel.

3.Следующий шаг — определение нового свойства FontColor, доступного на этапе проектирования. Так как параметры проектирования желательно сохранять между сеансами работы с проектом, в класс TMyLabel (раздел private) надо добавить внутреннюю переменную FFontColor (такие переменные начинаются с буквы F). Она сохраняет значение свойства FontColor в файле, описывающем форму с расположенными на ней объектами.

4.Само свойство FontColor записывается в раздел published с указанием типа, а также способа изменения его значения. Таких способов может быть два: либо простое присваивание (или считывание) значения внутренней переменной FFontColor, либо вызов специального метода, возвращающего значение (если происходит считывание свойства

FontColor), или устанавливающего значение для этого свойства property FontColor: TColor read GetFontColor write SetFontColor;

Ключевое слово read определяет способ считывания значения свойства FontColor, ключевое слово write — способ изменения его значения.

© ИМПИ ОГПУ

Замечание: Названия этих функций должны начинаться с Get для считывания значения и с Set для его установки. Заканчивается имя метода названием свойства.

Сами методы помещаются в раздел protected.

procedure SetFontColor( AValue: TColor ); virtual; function GetFontColor: TColor; virtual;

Их реализация в простейшем случае запишется следующим образом.

function TMyLabel.GetFontColor: TColor; begin

Result := FFontColor

end;

procedure TMyLabel.SetFontColor(AValue: TColor); begin

FFontColor := Avalue;

Repaint; {перерисовка компонента}

end;

Метод SetFontColor (и любой другой метод, указанный после ключевого слова write) должен иметь один параметр, тип которого совпадает с типом свойства. Этот параметр является тем значением, которое требуется записать в данное свойство.

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

Paint в разделе protected. procedure Paint; override;

Его реализация может быть, например, такой.

procedure TMyLabel.Paint;

begin

Font.Color := FFontColor;

inherited;

end;

6.Установка и использование компонента. Для этого выполняется команда

Component > Install Component (Компонент > Установить компонент). В появившемся диалоговом окне надо выбрать вкладку Into new package (В новый пакет). В поле Unit file name (Имя файла с модулем компонента) выбирается подготовленный модуль MyLabel.pas, в ноле Package file name (Имя файла пакета) указывается произвольное имя пакета (например, LabelPack). В поле Package description (Описание пакета) обычно записывают название компонента в форме комментария (например, My Label), затем можно

©ИМПИ ОГПУ

щелкнуть на кнопке ОК. После компиляции модуля появится сообщение, что он успешно установлен на панель Samples. Если теперь взглянуть на эту панель, то компонент TMyLabel окажется самым последним в списке.

Далее можно создать новый проект и разместить на форме компонент TMyLabel. В Инспекторе объектов у него появится свойство FontColor.

При его модификации сразу изменится и цвет надписи в поле.

7.Для удаления компонена надо дать команду Component > Install Packages (Компонента Установка пакетов). В диалоговом окне, содержащем список установленных пакетов, найдите пакет My Label, выделите его и щелкните на кнопке Remove (Удалить). Компонент будет удален.

Задания для самостоятельной работы

1.Дополните компонент TLabel свойством FontSize для выбора размера шрифта метки.

2.Создайте компонент TNumLabel для вывода целых чисел. Компонент

должен содержать свойство Value:integer – выводимое значение.

3.Создайте компонент TNumEdit для ввода целых чисел. Компонент должен содержать свойство Value:integer – введенное значение. Компонент должен работать безошибочно в случае ввода нечислового значения. Обработайте событие OnKeyPress, так чтобы можно было вводить только цифры.

4.Создайте компонент TTimeLabel – метку, отображающую текущее время. Для этого добавьте скрытое поле Timer- объект TTimer. В конструкторе компонента TTimeLabel создайте объект Timer и настройте у него обработку события OnTimer на метод, обновляющий текст метки.

5.Создайте графический визуальный компонент TArrow – стрелку.

Размер стрелки должен меняться при изменении размера компонента. Добавьте свойство перечислимого типа Orientation– ориентация стрелки со значениями oaUp, oaDown, oaLeft, oaRight. Обеспечьте правильное отображение стрелки в зависимости от ориентации.

Добавьте событие OnChangeOrientation, возникающее при изменении ориентации стрелки.

© ИМПИ ОГПУ

Использованная и рекомендованная литература:

1.Архангельский А. Я. Object Pascal в Delphi 5. – М.: ЗАО «Издательство БИНОМ», 1999. – 224 с.

2.Архангельский А. Я. Программирование в Delphi 7. – М.: ООО «Бином-Пресс», 2004. – 1152 с.

3.Гради Буч, Роберт А. Максимчук, Майкл У. Энгл, Бобби Дж. Янг, Джим Коналлен, Келли А. Хьюстон Объектно-ориентированный анализ и проектирование с примерами приложений Object-Oriented Analysis and Design with Application. – М.: Вильямс, 2008. – 720 с.

4.Грэхем И. Объектно-ориентированные методы. Принципы и практика. 3-е издание. / Пер. с англ. – М.: Издательский дом "Уильямс", 2004. – 880 с.

5.Нефедова В. Ю. Объектно-ориентированное программирование на языке Delphi. Издание второе. Учебно-методическое пособие для педагогов, студентов и школьников. Оренбург, 2011. – 70 с.

6.Нефедова В. Ю. Объектно-ориентированное программирование на языке Delphi. Учебно-методическое пособие для студентов и школьников. – Оренбург: Издательство ОГПУ, 2007. – 84 с.

7.Нефедова В. Ю. Программирование на языке Pascal: учебно-методическое пособие для студентов и школьников / В.Ю. Нефедова. – Оренбург: Издательство ГУ "РЦРО", 2007. – 72 с.

8.Нефедова В. Ю. Учебное пособие «Теоретические основы структурного и объектно-ориентированного программирования на языке Pascal». – Оренбург, ГБОУ РЦРО Оренбургской области, 2013. – 170 с.

9.Нефедова В. Ю., Шухман А. Е. Учебное пособие «Языки и системы программирования: лабораторный практикум». – Оренбург, ГБОУ РЦРО Оренбургской области, 2012. – 132 с.

10.Основы программирования в интегрированной среде Delphi. Практикум / А. В. Желонкин. – М.: БИНОМ. Лаборатория знаний, 2004. – 192 с.

11.Угринович Н. Д. Исследование информационных моделей. Элективный курс – 2-е издание, исправленное и дополненное + CD. – М.: БИНОМ. Лаборатория знаний, 2006. – 200 с.

12.Угринович Н. Д. Информатика и информационные технологии 10-11. –М.: Лаборатория Базовых Знаний, 2001. Лабораторный практикум (приложение к лабораторному практикуму на CD-ROM), 2002. – 512 с.

13.Delphi. Программирование на языке высокого уровня: Учебник для вузов / В. В. Фаронов. – СПб: Питер, 2004. – 640 с.

14.Delphi 7. Учебный курс / С. И. Бобровский. – СПб: Питер, 2003. – 736 с.

© ИМПИ ОГПУ