32 Урока по Delphi
Урок 27 : Создание собственных компонент
Содержание урока 27:
Обзор
Добавление новых объектов
в VCL
Заготовка для нового компонента
Соглашения по наименованиям
Выбор предка
Пример создания компонента
ex27.zip
Поскольку Delphi является
открытой средой и позволяет не только использовать объекты из Библиотеки
Визуальных Компонент (VCL) в своей
программе, но и создавать новые объекты. Причем, ничего другого, кроме
Delphi, для этого не требуется. Создание
нового объекта в Delphi не является
очень сложной задачей, хотя для этого и требуется знание Windows
API, объектно-ориентированного программирования
и иерархии классов в VCL.
Может возникнуть вопрос; если в Delphi уже есть своя библиотека, то зачем еще создавать какие-то объекты? Ответ прост: нельзя создать библиотеку на все случаи жизни и на все вкусы. Новые компоненты, во-первых, позволяют расширить область применения Delphi: например, с помощью библиотек объектов третьих фирм разрабатывать приложения для работы в Internet. Во-вторых, позволяют дополнить или настроить для себя имеющиеся в VCL объекты (например, переопределить значения свойств, устанавливаемые по умолчанию).
Предположим, что у вас
появился уже готовый компонент. Как его добавить в VCL? Для
этого выберите пункт меню Options|Install Components… Появится
диалог, как на рис.1
Рис.A: Диалог установки нового компонента
Нажмите “Add” и укажите
модуль, содержащий процедуру регистрации, нажмите “OK” и
после успешной перекомпиляции новый объект появится в палитре.
В среде Delphi есть
специальный эксперт, создающий заготовку для нового компонента. Вызвать
его можно в пункте меню File|New Component… (см
рис.2)
Рис.B: Эксперт для создания нового компонента
В диалоге нужно указать имя нового класса (например, TMyButton), предка класса (TButton) и страницу палитры, куда поместить новый компонент (Samples). Если нажать “OK”, то эксперт создаст модуль - заготовку для нового компонента:
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
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.
Модуль содержит декларацию нового класса и процедуру его регистрации в Палитре Компонент. В процедуре RegisterComponents первый параметр - имя страницы (можно указать свое имя - появится новая страница); второй параметр - множество объектов для регистрации.
Теперь модуль нужно сохранить под новым именем (например, NEW_BTN.PAS) и приступить к дописыванию новых свойств и методов. После того, как эта работа закончена и новый компонент отлажен, можно добавить его в Палитру (см. предыдущую главу). Но перед этим желательно создать файл ресурсов, в котором будет лежать пиктограмма для представления данного объекта в Палитре Компонент. Файл ресурсов можно создать с помощью программы Resource Workshop, называться он должен точно так же, как модуль регистрации компонента и иметь расширение .DCR (т.е., если объект регистрируется в модуле NEW_BTN.PAS, то тогда имя файла ресурсов будет NEW_BTN.DCR). В файле ресурсов должен находиться ресурс типа BITMAP - картинка размером 28x28 точки (можно меньше), название картинки должно совпадать с именем класса (в нашем случае TMYBUTTON).
Итак:
unit New_btn;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls;
type
TMyButton = class(TButton)
private
{ Private declarations }
FClickCount : Longint;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner : TComponent); override;
procedure Click; override;
property ClickCount : Longint read FClickCount write
{ Published declarations }
end;
procedure Register;
implementation
constructor TMyButton.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
ShowHint:=True;
FClickCount:=0;
end;
procedure TMyButton.Click;
begin
Inc(FClickCount);
inherited Click;
end;
procedure Register;
begin
RegisterComponents('Samples', [TMyButton]);
end;
end.
Для того, чтобы переопределить начальное значение свойства при создании объекта, нужно переписать конструктор Create, в котором и присвоить этому свойству нужное значение (не забыв перед этим вызвать конструктор предка).
Новое свойство для подсчета
нажатий на клавишу называется ClickCount. Его
внутреннее поле для сохранения значения - FClickCount
имеет тип Longint, емкости поля хватит
надолго.