Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб.раб. программирование.pdf
Скачиваний:
111
Добавлен:
21.05.2015
Размер:
764.95 Кб
Скачать

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 <> ''

end;then FDoc^.Lines.LoadFromFile(FileTMP);

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

Если в приложении выполнялся вызов процедуры SetDoc, то был создан

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

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

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

destructor TPerson.Destroy; begin

if FileTMP <> ' ' then DeleteFile(FileTMP);

inherited; end;

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

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

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

© ИМПИ ОГПУ

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

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

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

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

методы SetFontColo и 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

end; Result := FFontColor

procedure TMyLabel.SetFontColor(AValue: TColor); begin

FFontColor := Avalue;

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

Метод 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. Практикум / А. В. Желонкин. – М.: БИНОМ. Лаборатория знаний, 2004. – 192 с.

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

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

9.Delphi. Программирование на языке высокого уровня: Учебник для вузов /

В.В. Фаронов. – СПб: Питер, 2004. – 640 с.

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

© ИМПИ ОГПУ