-
Объявление класса
Вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (опубликованные), private (закрытые), protected (защищенные), public (открытые) и automated (автоматизированные). Внутри каждой секции вначале определяются поля, а затем методы и свойства.
Разделы определяют область видимости элементов описания класса. Поля, свойства и методы описанные в секции public можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (в окне инспектора объектов). Закрытые элементы описания указанные в секции private доступны только внутри методов данного класса и подпрограммах, находящихся в том же модуле где описан класс. Секция protected (защищенные) доступна только методам самого класса, а также любым его потомкам, независимо от того, находятся ли они в том же модуле или нет. Секция automated (автоматизированные) используется только для объявления свойств и методов, которые будут добавлены к интерфейсу OLE-объектов автоматизации.
Разрешается многократно объявлять любую секцию, причем порядок следования секций значения не имеет.
Создание нового компонента начинается по команде File/New…/Component. В результате открывается диалоговое окно новый компонент (New Component).
В этом окне определяется тип класса-родителя, имя создаваемого класса, страница палитры компонентов, имя файла модуля, список каталогов, в которых выполняется поиск файла модуля.
После заполнения всех полей и нажатия кнопки Ok создается модуль QMyButton, текст которого отображается в редакторе кода. Этот модуль содержит описание класса TMyButton, созданного на основе класса TMyButton.
unit QMyButton;
interface
uses
SysUtils, Classes, QControls, QStdCtrls;
type
TMyButton = class(TButton)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TMyButton]);
end;
end.
Модуль содержит процедуру Register, которая будет выполнять регистрацию нового компонента на странице Samples (образцы). Первым параметром процедуры регистрации RegisterComponents является название страницы, вторым множество классов добавляемых компонентов.
-
Создание простых свойств
Класс содержит поля, в которых хранится информация данного класса. По соглашению имена полей начинаются с буквы “F”. Обычно поля описываются в разделе частных (private) описаний и недоступны для прямого обращения к ним. Программно доступ к значениям полей осуществляется через свойства, которые обычно имеют имена, определяющие их принадлежность к конкретному полю. Свойства, которые должны быть доступны программно, описываются в разделах published (опубликованные) и public (открытые), в противном случае их помещают в раздел protected (защищенные).
Описание свойства имеет следующий синтаксис:
property <имя_свойства>: <тип_свойства> <Спецификаторы>;
Основными спецификаторами свойства являются read и write, соответственно определяющие возможность чтения и записи значения свойства. Необходимо указать хотя бы один из этих спецификаторов. После спецификатора указывается имя поля или метода. Если значение свойства непосредственно связано со значением своего поля, то в спецификаторе указывается имя этого поля.
Пример формата описания:
property <имя_свойства>: <тип_свойства> read <имя_поля> write <имя_поля>;
Если взаимосвязь между свойством и полем носит более сложный характер, то после спецификатора указывается имя метода, которые считывает или устанавливает значение свойства. Метод чтения является функцией без параметров, которая имеет тот же тип, что и тип читаемого свойства. По соглашению имя функции начинается со слова Get. Метод записи является процедурой с одним параметром, которая имеет того же типа, что и устанавливаемое свойство. По соглашению имя процедуры начинается со слова Set.
Пример формата описания:
property <имя_свойства>: <тип_свойства> read <имя_метода> write <имя_метода>;
Если отсутствует спецификатор read, то значение свойства нельзя считывать, а если не указан спецификатор write, то свойство предназначено только для чтения.
Пример. Создание простых свойств.
TMyButton = class(TButton)
private
{ Private declarations }
FMyInteger: integer;
FMyChar: Char;
FMyString: string;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property MyInteger: integer read FMyInteger write FMyInteger;
property MyChar: char read FMyChar write FMyChar;
property MyString: char read FMyString write FMyString;
end;
Созданные свойства доступны в Инспекторе объектов для чтения и записи и непосредственно связаны со своими полями.