Собственная ветвь в иерархии классов

 

Введение


Целью моей курсовой работы является реализовать собственную ветвь в иерархии классов. Описать классы и свойства объектно-ориентированного пространства, методику создание новых классов в Delphi,создать новую ветвь классов в Delphi.

1. Классы ООП


Для поддержки ООП в язык Delphi введены объектные типы данных, с помощью которых одновременно описываются данные и операции над ними. Объектные типы данных называют классами, а их экземпляры - объектами.

Классы объектов определяются в секции type глобального блока. Описание класса начинается с ключевого слова class и заканчивается ключевым словом end. По форме объявления классы похожи на обычные записи, но помимо полей данных могут содержать объявления пользовательских процедур и функций. Такие процедуры и функции обобщенно называют методами, они предназначены для выполнения над объектами различных операций. Приведем пример объявления класса, который предназначен для чтения текстового файла в формате "delimited text" (файл в таком формате представляет собой последовательность строк; каждая строка состоит из значений, которые отделены друг от друга символом-разделителем):

type= class

// Поля: TextFile;: array of string;: Char;

// МетодыPutItem(Index: Integer; const Item: string);SetActive(const AActive: Boolean);ParseLine(const Line: string): Integer;NextLine: Boolean;GetEndOfFile: Boolean;;

Класс содержит поля (FileVar, Items, Delimiter) и методы (PutItem, SetActive, ParseLine, NextLine, GetEndOfFile). Заголовки методов, (всегда) следующие за списком полей, играют роль упреждающих (forward) описаний. Программный код методов пишется отдельно от определения класса и будет приведен позже.

Класс обычно описывает сущность, моделируемую в программе. Например, класс TDelimitedReader представляет собой "читатель" текстового файла с разбором считываемых строк на элементы (подстроки), которые отделены друг от друга некоторым символом, называемым разделителем.

Класс содержит несколько полей:- файловая переменная, необходимая для доступа к файлу;- символ, который служит разделителем элементов;- массив элементов, полученных разбором последней считанной строки;

Класс также содержит ряд методов (процедур и функций):- помещает элемент в массив Items по индексу Index; если индекс превышает верхнюю границу массива, то размер массива автоматически увеличивается;- открывает или закрывает файл, из которого производится чтение строк;- осуществляет разбор строки: выделяет элементы из строки и помещает их в массив Items; возвращает количество выделенных элементов;- считывает очередную строку из файла и с помощью метода ParseLine осуществляет ее разбор; в случае успешного чтения очередной строки функция возвращает значение True, а иначе - значение False (достигнут конец файла);- возвращает булевское значение, показывающее, достигнут ли конец файла.

Обратите внимание, что приведенное выше описание является ничем иным, как декларацией интерфейса для работы с объектами класса TDelimitedReader. Реализация методов PutItem, SetActive, ParseLine, NextLine и GetEndOfFile на данный момент отсутствует, однако для создания и использования экземпляров класса она пока и не нужна.

Свойства ООП

Помимо полей и методов в объектах существуют свойства. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Например, в объекте Reader присваивание свойству Active значения True вызовет открытие файла, а присваивание значения False - закрытие файла. Создание сопутствующего эффекта (открытие или закрытие файла) достигается тем, что за присваиванием свойству значения стоит вызов метода.

Объявление свойства выполняется с помощью зарезервированного слова property, например:

type = class

...

FActive: Boolean;

...

// Метод записи (установки значения) свойства

procedure SetActive(const AActive: Boolean);Active: Boolean read FActive write SetActive; // Свойство

end;

Ключевые слова read и write называются спецификаторами доступа. После слова read указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства, а после слова write - поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, чтение свойства Active означает чтение поля FActive, а установка свойства - вызов метода SetActive. Чтобы имена свойств не совпадали с именами полей, последние принято писать с буквы F (от англ. field). Мы в дальнейшем также будем пользоваться этим соглашением. Начнем с того, что переименуем поля класса TDelimitedReader: поле FileVar переименуем в FFile, Items - в FItems, а поле Delimiter - в FDelimiter.

type= class

// Поля: TextFile; // FileVar -> FFile: array of string; // Items -> FItems: Boolean;: Char; // Delimiter -> FDelimiter

...;

Обращение к свойствам выглядит в программе как обращение к полям:

var: TDelimitedReader;: Boolean;

....Active := True; // Эквивалентно Reader.SetActive(True);:= Reader.Active; // Эквивалентно IsOpen := Reader.FActive

Если один из спецификаторов доступа опущен, то значение свойства можно либо только читать (задан спецификатор read), либо только записывать (задан спецификатор write). В следующем примере объявлено свойство, значение которого можно только читать.

type= class

...: array of string;

...GetItemCount: Integer;

...ItemCount: Integer read GetItemCount; // Только для чтения!;TDelimitedReader.GetItemCount: Integer;:= Length(FItems);;

Здесь свойство ItemCount показывает количество элементов в массиве FItems. Поскольку оно определяется в результате чтения и разбора очередной строки файла, пользователю объекта разрешено лишь узнавать количество элементов.

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


2. Методика создания новых классов в Delphi


В этой главе рассматриваются основные этапы создания компонентов для Delphi.

Выбор родительского класса.

Создание модуля для компонента.

Создание свойств, методов и событий.

Тестирование и отладка компонента.

Оформление компонента.

Два первых этапа относительно просты и целиком описываются в этой главе. Три других более подробно рассматриваются в отдельных главах.

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

Выбор родительского класса

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

изменением существующих компонентов;

созданием новых оконных компонентов;

созданием новых графических (не оконных) компонентов;

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

созданием невизульных компонентов.

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


Таблица 2.1 - Рекомендуемые родительские классы

ЦельРекомендуемые классыИзменить существующий компонентЛюбой существующий компонент (например, TButton или TListBox) или класс TCustomXXXX (например, TCustomListBox)Создать оконный компонентTWinControl или TCustomControlСоздать графический компонентTGraphicControlСоздать подкласс для элемента управленияЛюбой компонент WindowsСоздать невизуальный компонентTComponentМожно также наследовать классы, которые не являются компонентами и не могут быть помещены на форму (например, TRegIniFile и TFont). В этом случае вы должны добавить в класс свойства, позволяющие ему взаимодействовать со средой Delphi на этапе разработки программы, потому что только при этом условии вновь созданный класс будет компонентным классом. Вообще, удачный выбор родительского класса в значительной степени упрощает проблему создания нового компонента. Помните замечательный девиз корпорации Borland: "Не нужно изобретать велосипед - просто наследуйте его!".

Изменение существующих компонентов

Самый простой способ создать компонент - изменить уже существующий. При этом в качестве родительского класса чаще всего используется соответствующий компонентный класс или класс TCustomXXXX. Как уже отмечалось в главе 3, классы TCustomXXXX реализуют основную функциональность соответствующих компонентов, но не публикуют многие их свойства и события. Наследовать от таких классов лучше тогда, когда новый компонент должен отличаться от своего предшественника набором свойств и событий. Пусть, например, создается простой компонент для отображения текущего системного времени. Для вывода текстовых сообщений хорошо подходит метка TLabel. Однако она имеет свойство Caption, которое для наших целей публиковать нельзя (это свойство в новом компоненте предназначено только для вывода системного времени). Выход из положения - наследовать новый компонент от класса TCustomLabel и оставить свойство Caption в секции protected (именно в этой секции свойство Caption объявляется в классе TCustomLabel). Тогда в самом компоненте можно обращаться к этому свойству, но ни в наследниках компонента, ни в работающей программе этого сделать нельзя.

Простой компонент для отображения на форме системного времени.

Он иллюстрирует два момента:

) Сокрытие свойств, которые противоречат функциональности компонента.

) Использование в компоненте уже существующего компонента. ===================================================================} interfaceSysUtils, Classes, Controls, StdCtrls, ExtCtrls; type TFarClock = class(TCustomLabel) private { Private declarations } FTimer: TTimer; protected { Protected declarations } procedure UpdateClock(Sender: TObject); public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property Align; // property Caption; Не публикуем это свойство! // Не публикуем также несколько других свойств // (AutoSize, Alignment, BiDiMode и т.п.), которые // не используются в новом компоненте. property Color; property Font; property ParentColor; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property Transparent; property Visible; end; procedure Register; implementation constructor TFarClock.Create(AOwner: TComponent); {В конструкторе создается вложенный компонент FTimer и инициируется его работа } begin inherited Create(AOwner); // Унаследованный конструктор FTimer := TTimer.Create(Self); // Создаем таймер FTimer.OnTimer := UpdateClock; // Его обработчик OnTimer FTimer.Enabled := True // Запускаем таймер end; procedure TFarClock.UpdateClock(Sender: TObject); { Эта процедура - обработчик события OnTimer встроенного таймера. Обновляет отображение времени в компоненте } begin Caption := TimeToStr(Time); // Изменяем надпись Invalidate; // Отрисовываем компонент end; procedure Register; begin RegisterComponents('Far', [TFarClock]); end; end. Вместе со свойством Caption не публикуются многие другие свойства стандартной метки, которые излишни в новом компоненте. Например, значение свойства AutoSize всегда предполагается равным True, поэтому не публикуются свойства Alignment, Height и Width.

Создание оконных компонентов

Оконные компоненты - это объекты, которые появляются в окне и с которыми пользователь может взаимодействовать. Каждый оконный компонент имеет дескриптор оконного ресурса, содержащийся в свойстве Handle, с помощью которого операционная система управляет этим компонентом. Оконный ресурс позволяет компоненту получать фокус ввода и может быть передан API-функциям Windows. Все оконные компоненты являются наследниками класса TWinControl. В них входят так называемые контейнеры компонентов (формы, панели, компоненты группирования), а также компоненты, нуждающиеся в фокусе ввода (кнопки, списки, поля ввода). Хотя вы можете наследовать оригинальный компонент непосредственно от TWinControl, Delphi предоставляет для этих целей также класс TCustomControl, который является наследником от TWinControl и дополняет его свойством Canvas.

Создание графических компонентов

Если получение фокуса ввода вашим компонентом не предусматривается, вы можете сделать его графическим компонентом. Графические компоненты идентичны оконным, но не имеют оконных процедур, поэтому потребляют меньше системных ресурсов. Компоненты типа TLabel, которые никогда не получают фокус ввода, являются графическими. Хотя эти элементы не могут получить фокус ввода, вы можете заставить их реагировать на определенные события мыши (щелчок, двойной щелчок и т.п.). Чтобы создать собственные графические компоненты, наследуйте их от класса TGraphicControl. Этот класс предоставляет канву для рисования и в Windows может управлять всеми событиями WM_PAINT (нужно просто перекрыть метод Paint).

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

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

класс delphi ветвь windows

3. Создание новой ветви классов

= class(TPanel)

public

procedure CMMouseEnter (var message: TMessage); message CM_MOUSEENTER;

procedure CMMouseLeave (var message: TMessage); message CM_MOUSELEAVE;;: TForm1;:TMypanel;

{$R *.dfm}TMyPanel.CMMouseEnter (var message: TMessage);.Label1.Caption := 'Мышь на панели';;TMyPanel.CMMouseLEAVE (var message: TMessage);.Label1.Caption :='Мышь вне панели';;TForm1.FormCreate(Sender: TObject);:= TMyPanel.Create(self);MyPanel1 do:= Form1;:= true;:= 100;:= 100;;;TForm1.Button1Click(Sender: TObject);

begin;;.

Заключение


В данной работе был реализован способ создание новой ветви классов. Подробно описано и показано в программе.

Список литературы


1.А.Я. Архангельский Приемы программирование в Delphi на основе VCL.- М.: ООО <<Бином-Пресс>>, 2006 г. - 944 c.

2.В. Фаронов Искусство создания компонентов Delphi (+CD). Библиотека программиста. - СПб.: Питер, 2005. - 463 с.

.М. Кэнту Delphi 7 для профессионалов.

.Фленов М.Е. Delphi 2005. Секреты программирования - СПб.: Питер, 2006. - 266 с.



Введение Целью моей курсовой работы является реализовать собственную ветвь в иерархии классов. Описать классы и свойства объектно-ориентированного простр

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ