Уроки Delphi | Создание компонента Delphi

Выбор базового класса

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


 Перед началом работы по созданию нового компонента нужно создать отдельный каталог для модуля и других файловкомпонента. После этого можно приступить к созданию модуля компонента. Для того чтобы создать модуль компонента, необходимо из меню Component выбрать команду New Component и в поля открывшегося диалогового окна New Component(рис. 16.1) ввести информацию о создаваемом компоненте.

Рис. 16.1. Диалоговое окно New Component

 

Поле Ancestor type должно содержать базовый тип для создаваемого компонента. Базовый тип компонента можно задать непосредственным вводом имени типа или выбором из раскрывающегося списка. Для разрабатываемого компонента базовым компонентом является стандартный компонент Edit (поле ввода-редактирования). Поэтому базовым типом для типа разрабатываемого компонента является тип TEdit.

В поле Class Name необходимо ввести имя класса разрабатываемого компонента, например THkedit. Вспомните, что в Delphiимена типов должны начинаться буквой т. В поле Palette Page нужно ввести имя вкладки палитры компонентов, на которую после создания компонента будет добавлен его значок. Название вкладки палитры компонентов можно выбрать из раскрывающегося списка.

Если в поле Palette Page ввести имя еще не существующей вкладки палитры компонентов, то непосредственно перед добавлением компонента вкладка с указанным именем будет создана.

В поле Unit file name находится автоматически сформированное имя файла модуля создаваемого компонентаDelphiприсваивает модулю компонента имя, которое совпадает с именем типа компонента, но без буквы т. Щелкнув на кнопке с тремя точками, можно выбрать каталог, в котором должен быть сохранен модуль компонента.

После нажатия кнопки ОК к текущему проекту добавляется сформированный Delphi-модуль, представляющий собой заготовку (шаблон) модуля компонента. Текст этого модуля приведен в листинге 16.1.

Листинг 16.1. Шаблон модуля компонента

 

01.unit NkEdit;
02.interface
03.uses
04.Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
05.type
06.TEditl - class(TEdit)
07.private
08.{ Private declarations }
09.protected
10.{ Protected declarations }
11.public
12.{Public declarations }
13.published
14.{Published declarations }
15.end;
16.procedure Register;
17.implementation
18.procedure Register;
19.begin
20.Register<a href="http://delphicomponent.ru/" title="Component" target="_blank">Component</a>s('Samples', [TNkEdit]);
21.endend.
 

В объявлении нового класса указан только тип родительского класса. В раздел реализации помещена процедура Register, которая используется во время установки созданного программистом компонента на указанную вкладку палитры компонентовDelphi для регистрации нового класса.

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

В листинге 16.2 приведен текст модуля компонента NkEdit после внесения всех необходимых изменений.

Листинг 16.2. Модуль компонента NkEdit

01.unit NkEdit;
02.interface
03.uses
04.Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
05.Dialogs, StdCtrls;
06.type
07.TNkEdit - class(TEditl
08.private
09.FNumb: single// число, находящееся в поле редактирования
10.// Это описание функции доступа
11.// и процедуры установки поля FNumb
12.function GetNumb: single;
13.procedure SetNumb(value:single];
14.protected
15.procedure KeyPress(var Key: Char); override;
16.public
17.published
18.constructor Create [AOwner:T<a href="http://delphicomponent.ru/" title="Component" target="_blank">Component</a>); override;
19.property Numb : single // свойство <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a>
20.read GetNumb
21.write SetNumb;
22.end;
23.procedure Register;
24.implementation
25.// процедура регистрации <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a>
26.procedure Register;
27.begin
28.Register<a href="http://delphicomponent.ru/" title="Component" target="_blank">Component</a>s('Samples',[TNkEdit]);
29.end;
30.// конструктор <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a>
31.constructor TNkEdit. Create (AOwnsr:T<a href="http://delphicomponent.ru/" title="Component" target="_blank">Component</a>) ;
32.begin
33.// don't forget to call the ancestors' constructor
34.inherited Create (AOwrier) ;
35.end;
36.// функция доступа к полю FtJanib
37.function TNkEdit .GetNumb: single;
38.begin
39.try // поле Text может быть пустим
40.Result:=StrToFloat(text) ;
41.except
42.on EConvert Error do
43.begin
44.Result :=Q;
45.text : = " ;
46.end;
47.end;
48.end;
49.// процедура записи в поле FTJumb
50.procedure TNkEdit .3etNumb(Value:single] ;
51.begin
52.Fnumb:=Value;
53.Text :=FloatToStr (value) ;
54.end;
55.// процедура обработки события KsyPress
56.procedure TNkEdit.KeyPress(var key:charl ;
57.begin
58.case key of
59.'0'..'3','#13','#0';
60.'-'if Length (text )<>0 then key:='#0';
61.else
62.if not ( (key = DecimalSeparator] and
63.(Pos(DecimalSeparator,text)=0))
64.then key:= %0;
65.end;
66.inherited KeyPress(key); // вызов процедуры обработки события
67.// onkeypress родительского класса
68.endend.
 

В описание класса TNkEdit добавлено объявление свойства Numb, которое представляет собой число, находящееся в поле редактирования. Для хранения значения свойства Numb используется поле FNumb. Функция GetNumb необходима для доступа к полю FNumb, а процедура setNumb — для установки значения свойства.

Конструктор класса TNkEdit сначала вызывает конструктор родительского класса (TEdit), присваивает значение свойству Text, затем устанавливает значение свойства Numb.

Реакция компонента NkEdit на нажатие клавиши клавиатуры определяется процедурой обработки события TNkEdit.KeyPress, которая замещает соответствующую процедуру базового класса. В качестве параметра процедура THkEdit-Keypress получает код нажатой клавиши. Перед вызовом процедуры обработки события onkeypress родительского класса код нажатой клавиши проверяется на допустимость. Если нажата недопустимая для компонента NkEdit клавиша, то код символа заменяется на ноль. Допустимыми для компонента Nkedit являются цифровые клавиши, разделитель целой и дробной частей числа (в зависимости от настройки Windows: точка или запятая), "минус", (позволяет удалить ошибочно введенный символ) и .

Здесь следует вспомнить, что в тексте программы дробная часть числовой константы отделяется от целой части точкой. Во время работы программы при вводе исходных данных пользователь должен использовать тот символ, который задан в настройке Windows. В качестве разделителя обычно применяют запятую (это для России стандартная настройка) или точку. Приведенная процедура обработки события onkeypress учитывает, что настройка Windows может меняться, и поэтому введенный пользователем символ сравнивается не с константой, а со значением глобальной переменной Decimaiseparator, которая содержит с и мв о л-разделитель, используемый в Windows в данный момент.

После ввода текста модуля компонента модуль нужно откомпилировать и сохранить.

 

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

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

Создается тестовое приложение обычным образом: сначала создается форма приложения, а затем — модуль приложения.

Вид формы приложения тестирования компонента NkEdit приведен на рис. 16.2.

Рис. 16.2. Форма приложения Тест компонента NkEdit

 

Форма содержит две метки и командную кнопку. Первая метка предназначена для вывода информационного сообщения, вторая метка (на рисунке она выделена) используется для вывода числа, введенного в поле редактирования. Самого поля редактирования компонента NkEdit в форме нет.

Этот компонент будет создан динамически во время работы программы, но для него оставлено место над полем метки.

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

  1. В список используемых модулей (раздел uses) добавить имя модуля тестируемого компонента (NkEdit).
  2. В раздел объявления переменных (var) добавить инструкцию объявления компонента. Здесь следует вспомнить, что компонент является объектом, поэтому объявление компонента в разделе переменных не обеспечивает созданиекомпонента, а только генерирует указатель на компонент, следовательно необходима инструкция вызова конструктора объекта, которая действительно создает компонент (объект).
  3. Для формы приложения создать процедуру обработки события OnCreate, которая вызовом конструктора тестируемогокомпонента создаст компонент и установит значения его свойств.

В листинге 16.3 приведен модуль приложения тестирования компонента NkEdit.

Листинг 16.3. Тест компонента NkEdit

 

01.unit tstNkEdit_;
02.interface
03.Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
04.Foims, Dialogs, StdCtrls,
05.NkEdit; // ссыпка на модуль <a href="http://delphicomponent.ru/" title="компонента" target="_blank">компонента</a>
06.type
07.TForml = class(TForm)
08.Label!: TLabel;
09.Label2: TLabel;
10.Buttonl: TButton;
11.procedure FomCreate (Sender: TObject);
12.procedure ButtonlClick(Sender: TObject);
13.private
14.{ Private declarations }
15.public
16.{ Public declarations}
17.end;
18.var
19.Forml: TForml;
20.myEdit: TnkEdit; // компонент NkEdit
21.impletnen ta ti on
22.{$R *.dfm}
23.procedure TForml.FormCreate(Sender: TObject);
24.begin
25.// создамим компонент и поместим его на форму
26.myEdit := TNkEdit.Create(self];
27.myEdit.Parent := self;
28.myEdit.Left := 8;
29.myEdit.Top := 64;
30.end;
31.procedure TForml.ButtonlClick(Sender: TObject);
32.begin
33.Iabel2.Caption :- FloatToStr(myEdit.Numb);
34.endend.

 

Тестируемый компонент создается процедурой обработки события FormCreate (Создание формы) посредством вызова конструктора компонента, которому в качестве параметра передается значение self, показывающее, что владельцемкомпонента является форма приложения.

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

На рис. 16.3 приведено окно программы Тест компонента NkEdit во время ее работы, после ввода числа в поле редактирования и щелчка на кнопке Тест.

Рис. 16.3. Тестирование компонента. Поле ввода— компонент NkEdit

 

 

Для того чтобы значок компонента появился в палитре компонентов, компонент должен быть добавлен в один из пакетов (Packages) компонентов Delphi. Пакет компонентов — это файл с расширением dpk (Delphi Package File). Например, компоненты, созданные программистом, находятся в пакете DclusrVO.dpk.

Во время добавления компонента в пакет Delphi использует модуль компонента и файл ресурсов компонента, в котором должен находиться битовый образ значка компонента. Имя файла ресурсов компонента должно обязательно совпадать с именем файла модуля компонента. Файл ресурсов имеет расширение dcr (Dynamic Component Resource). Битовый образ, находящийся внутри файла ресурсов, должен иметь имя, совпадающее с именем класса компонента.

 

Файл ресурсов компонента можно создать при помощи утилиты Image Editor, которая запускается выбором из меню Tools команды Image Editor. Для того чтобы создать новый файл ресурса компонента, нужно из меню File выбрать команду New и из появившегося списка выбрать тип создаваемого файла — Component Resource File (рис. 16.4).

Рис. 16.4. Выбор типа создаваемого файла

 

В результате открывается окно файла ресурсов Unfitted I.dcr, а в меню диалогового окна Image Editor появляется новый пункт -- Resource. Теперь нужно из меню Resource выбрать команду New/Bitmap и в открывшемся окне Bitmap Properties (рис. 16.5) установить характеристики битового образа значка компонента: Size — 24x24 пиксела, Colors — 16.

Рис. 16.5. Диалоговое окно Bitmap Properties

 

В результате этих действий в создаваемый файл ресурсов компонента будет добавлен новый ресурс -— битовый образ с именем Bitmap 1. Двойной щелчок на имени ресурса (Bitmap 1) раскрывает окно редактора битового образа, в котором можно нарисовать нужную картинку.

Изображение в окне графического редактора можно увеличить. Для этого необходимо выбрать команду Zoom In меню View. Следует обратить внимание, что нвет правой нижней точки рисунка определяет "прозрачный" цвет. Элементы значкакомпонента, закрашенные этим цветом, на палитре компонентов Delphi не видны.

Перед тем, как сохранить файл ресурсов компонента, битовому образу надо присвоить имя. Имя должно совпадать с именем класса компонента. Чтобы задать имя битового образа, необходимо щелкнуть правой кнопкой мыши на имени битового образа (Bitmapl), выбрать в появившемся контекстном меню команду Rename и ввести новое имя.

Созданный файл ресурсов компонента нужно сохранить в том каталоге, в котором находится файл модуля компонента. Для этого надо из меню File выбрать команду Save.

На рис. 16.6 приведен вид окна Image Editor, в левой части которого содержится файл ресурсов компонента TNkEdit (nkedit.dcr), а в правой части окно редактора битового образа, в котором находится изображение значка для создаваемого компонента.

Внимание!: Имя файла ресурсов компонента (NkEdit.dcr) должно совпадать с именем модуля компонента (NkEdit. pas), а имя битового образа (TNkEdit) — с именем класса компонента (TkNEdit).

Рис. 16.6. Значок компонента NkEdit

 

 

После создания файла ресурсов компонента, в котором находится битовый образ значка компонента, можно приступить к установке компонента. Для этого надо из меню Component выбрать команду Install Component и заполнить поля открывшегося окна Install Component (рис. 16.7).
 
Рис. 16.7. Диалоговое окно Install Component
 

В поле Unit file name нужно ввести имя файла модуля. Для этого удобно воспользоваться кнопкой Browse. Поле Search path (Путь поиска) должно содержать разделенные точкой с запятой имена каталогов, в которых Delphi во время установкикомпонента будет искать необходимые файлы, в частности файл ресурсов компонента. Если имя файла модуля было введено в поле Unit file name выбором файла из списка, полученного при помощи кнопки Browse, то Delphi автоматически добавляет в поле Search path имена необходимых каталогов.

Примечание: Файл ресурса компонента должен находиться в одном из каталогов, перечисленных в поле Search path. Если его там нет, то компоненту будет назначен значок его родительского класса.

Поле Package file name должно содержать имя пакета, в который будет установлен компонент. По умолчанию компоненты, создаваемые программистом, добавляются в пакет Dclu.sr70.dpk.

Поле Package description содержит название пакета. Для пакета DclusrTO.dpk ЭТО Текст: Borland User's Components. 

После заполнения перечисленных полей и нажатия кнопки ОК начинается процесс установки. Сначала на экране появляется окно Confirm (рис. 16.8), в котором Delphi просит подтвердить обновление пакета.

 Рис. 16.8. Запрос подтверждений обновления пакета в процессе установки компонента

  

После нажатия кнопки Yes процесс установки продолжается. Если он завершается успешно, то на экране появляется информационное сообщение (рис. 16.9) о том, что в результате обновления пакета палитра компонентов обновлена, т. е. в нее добавлен значок компонента, и новый компонент зарегистрирован.

Рис. 16.9. Сообщение об успешной установке компонента 

После установки компонента в пакет открывается диалоговое окно Package (Редактор пакета компонентов) (рис. 16.10), в котором перечислены компоненты, находящиеся в пакете.

Рис. 16.10. Окно редактора пакета компонентов 

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

dle

Помоги проекту! Расскажи друзьям об этом сайте: