logo
Программирование в среде Delphy / Программирование в среде Delphi

31. Создание собственных компонентов

В состав Delphi входит более 450 стандартных компонентов. Но иногда возникает необходимость усовершенствовать некоторые компоненты или создать свои новые компоненты. Все компоненты должны являться наследниками класса TComponent.

В Delphi можно создать заготовку для нового компонента, пройдя путь:

ADOConnection1

ADOQuery1

DataSource1

DBGrid1

Button1

File New Component или

Component → NewComponent

После этого на экране появляется окно, в котором нужно определить:

• наследуемый класс (Ancestor Type);

• имя нового класса (Class Name);

• имя странички палитры компонентов (Paletter Page);

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

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

Component Install Component

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

Для нового компонента можно создать свой значек, войдя в графический редактор: Tools Image Editor. В нем нужно создать компонентный ресурсный файл: File New Component Resource File, в котором задать растровое изображение значка размером 24 х 24 пикселя с палитрой из 16 цветов: Resource New BitMap. Далее нужно назвать новый ресурс именем класса компонента, причем используя только прописные буквы, затем сохранить ресурсный файл с именем модуля, описывающего компонент, и расширением «.dcr». При регистрации нового компонента ему будет автоматически присвоен новый значок.

Рассмотрим пример создания нового компонента – наследника класса TListBox, который будет поддерживать табуляцию строк. Табуляция строк нужна для разбивки содержимого строк на колонки, начинающиеся с определенной позиции в строке. Например, мы хотим вывести в виде таблицы фамилии и должности сотрудников. Фамилии, допустим, будут начинаться с 5–й позиции в строке, а должности – с 40–й. Стандартный компонент TListBox не поддерживает табуляцию, и так как фамилии имеют разное количество символов, в таблице названия должностей будут начинаться с разных позиций, что затрудняет ее восприятие.

В новом компоненте предлагается в строки, помещаемые в новый LisBox, записывать между словами символы табуляции (код #09) и в класс компонента ввести новое свойство STabStop типа TStrings, в которое будем записывать в каждой ее строке номера позиций табуляции.

В результате получим компонент, который из таблицы

Иванов Инженер

Сидоренко Техник

Там Технолог

позволит получить более воспринимаемую таблицу:

Иванов

Инженер

Сидоренко

Техник

Там

Технолог

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

Реализация такого компонента приведена ниже:

unit Ulistmy;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

type

TListmy = class(TListBox) // Имя нового класса – TListMy

private

FfTabStop:TStrings; // Поле для хранения позиций табуляции

// Метод задания позиций табуляции

Procedure SetTabStop(value:Tstrings);

protected

public

Atabstop:Array[1..20] of integer; // Массив значений позиций табуляции

// Новый метод создания окна компонента

Procedure CreateWnd; override;

// Новый метод определения параметров окна компонента

Procedure CreateParams(var Params:TcreateParams);override;

// Новый конструктор компонента с выделением дополнительной памяти

constructor create(Aowner:TComponent);override;

// Новый деструктор по освобождению памяти

Destructor Destroy;override;

// Метод задания компоненту массива значений позиций табуляции

Procedure tabset;

Published

// Определяем новое свойство STabStop, доступное на этапе проектирования

property STabStop:Tstrings read FfTabstop write SetTabStop;

end;

procedure Register; // Метод регистрации компонента

implementation

procedure Register;

begin

// Регестрируем новый компонент ListMy на страничке Samples

RegisterComponents('Samples', [TListmy]);

end;

// Метод записи значений в свойство STabStop

Procedure Tlistmy.SetTabStop(value:TStrings);

Begin

ffTabStop.Assign(value); // Запись значений в поле FFTabStop

tabset; // Устанавливаем в компоненте новую табуляцию

Invalidate; // Перерисовываем компонент

end;

Procedure TListmy.CreateParams(var Params:TCreateParams);

Begin

// Вызываем наследуемый метод задания параметров компонента

inherited CreateParams(Params);

with Params do Begin

// Изменяем стиль окна нового компонента, разрешаем табуляцию

Style:=Style or $80{Lbs_Usetabstops};

end;

end;

Procedure Tlistmy.CreateWnd;

var i,j,err:integer;s:String;

Begin

// Вызываем наследуемый метод создания окна

Inherited CreateWnd;

tabset; // Устанавливаем табуляцию для нашего окна

end;

Procedure Tlistmy.Tabset;

var i,j,err:integer;s:string;

Begin

// Проверяем наличие строк, задающих позиции табуляции в FFTabStop

if fFTabStop.count>0 then Begin

// Открываем цикл переписи позиций табуляции из FFTabStop в ATabStop

for i:=1 to fFtabstop.count do Begin

s:=Fftabstop.strings[i-1];

val(s,j,err); // Переводим строку s в число j

if err<>0 then Atabstop[i]:=0 else

// Записываем позиции табуляции в ATabStop с учетом того, что ширина одного // символа равна четырем базовым единицам Windows

Atabstop[i]:=j*4;

end;

end else Begin

Atabstop[1]:=0;

end;

// Посылаем сообщение окну нового компонента, устанавливающее табуляцию

SendMessage(Handle,LB_SetTabStops,

Fftabstop.count,Longint(@Atabstop));

end;

Constructor Tlistmy.Create(Aowner:Tcomponent);

Begin

inherited Create(Aowner); // Вызываем наследуемый конструктор Create

// Выделяем память под список позиций табуляции

Fftabstop:=Tstringlist.create;

end;

Destructor Tlistmy.Destroy;

Begin

Fftabstop.Free; // Освобождаем память из–под списка табуляции

Inherited Destroy; // Вызываем наследуемый деструктор Destroy

end;

end.

Для подключения своего значка к вновь созданному компоненту можно создать компонентный ресурсный файл с именем UListMy.dcr, в котором необходимо определить растровое изображение значка размером 24 х 24 пикселя и названием TListMy.

Запись новый строки в компонент ListMy1 можно осуществить оператором:

ListMy1.Items.Add(#09+’Иванов’+#09+’Инженер’);

При этом слова «Иванов» и «Инженер» будут располагаться с позиций, заданных в свойстве STabStop.

Если создается целый набор своих компонентов, то их можно поместить в один пакет. Для этого нужно пройти путь:

Component Install Packages Add

Затем нужно создать свой пакет и поместить в него свои компоненты.