Для реализации данного этапа будет использоваться Мастер компонентов. Выполните в главном меню Delphi команду Component / NewComponent. В открывшемся диалоговом окне New Component введите следующие значения:
• Ancestor Type (тип родительского класса): выберите из списка TComboBox;
Примечание. Мастер предлагает в качестве наследника два класса TComboBox. Один из модуля StdCtrls, второй из QStdCtrls. Первый наследник относится к иерархии классов VCL, второй к CLX . В данном примере (и во всех последующих) будет рассматриваться создание компонентов для VCL.
• Class Name (имя класса, реализующего новый компонент): согласно правилам, имя каждого класса в Delphi должно начинаться буквой Т. При этом имя вновь создаваемого класса должно отражать содержание компонента и ни в коем случае не совпадать с именем уже зарегистрированного компонента. Выберем имя «TPrinterList».
• Palette Page (вкладка палитры): вкладка в палитре компонентов, на которую Delphi поместит созданный компонент. Можно выбрать любую из имеющихся вкладок либо ввести имя новой, которую Delphi создаст. Поместим компонент па новую вкладку с именем New.
Примечание. При выполнении работы с целью разделения пользователей рекомендуется в имени вкладки использовать одну последнюю (для групп с трехзначным номером) цифру номера группы или две последних цифры (для групп с четырехзначным номером), например New0, New1 и т. д.
• Unit File Name (имя файла модуля): здесь для имени файла можно оставить значение по умолчанию и выбрать текущую папку, в которой будет сохранен исходный код модуля компонента.
• Search Path (последовательность поиска): список папок, в которых Delphi будет искать исходные файлы компонентов.
После ввода всех значений окно New Component примет вид рис. 4
Рис. 4
Нажмите в этом окне ОК. Delphi создаст заготовку кода модуля нового компонента:
unit PrinterList;
interface
uses
SysUtils, Classes, Controls, StdCtrls;
type
TPrinterList = class(TComboBox)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('New', [TPrinterList]);
end;
end.
В самом новом классе объявлены четыре стандартные секции, а также определена процедура Register, которая вызывается средой разработки Delphi при инсталляции данного модуля как компонента. Она содержит имя страницы на палитре, куда помещается данный компонент, и в квадратных скобках – имя класса.
Полученный компонент пока ничем — ни внешним видом, ни поведением — не отличается от своего предка, компонента ComboBox. Компонент PrinterList должен отображать список всех установленных принтеров. Это значит, что сразу после создания объекта класса TPrinterList приложение должно получить список установленных в системе принтеров и поместить их имена в выпадающий список компонента на форме. Здесь необходимо определить, на каком участке программы компонента можно реализовать это действие. Возможны следующие варианты:
• в конструкторе Create. Однако этот способ не подходит, потому что в момент помещения компонента на форму у него еще нет родительского окна (не установлено значение свойства ParentWindow), вследствие чего свойство Items еще не доступно;
• в инициализационном методе Loaded. Этот вариант также нельзя использовать, потому что метод Loaded вызывается при загрузке компонента в память и при помещении компонента на форму его список окажется пуст;
• в методе CreateWnd, унаследованном от класса TCustomComboBox. Это решение наиболее целесообразно, потому что этот метод вызывается именно в момент создания элемента интерфейса оконного типа.
Таким образом, в модуле компонента нужно переопределить метод CreateWnd. Для этого следует указать в секции public заготовки модуля заголовок метода:
procedure CreateWnd; override;
(с обязательной директивой override!) и реализовать его в секции реализации:
procedure TPrinterList.CreateWnd;
begin
inherited;
Items.Assign(Printer().Printers);
end;
В теле этого метода вызывается функция Assign() доступа к принтерам, реализованная в модуле Printers, поэтому следует добавить в секцию Uses модуля PrinterList имя модуля Printers. Дополненный текст модуля компонента должен иметь следующий вид:
unit PrinterList;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Printers;
type
TPrinterList = class(TComboBox)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
procedure CreateWnd; override;
published
{ Published declarations }
end;
procedure Register;
implementation
procedure TPrinterList.CreateWnd;
begin
inherited;
Items.Assign(Printer().Printers);
end;
procedure Register;
begin
RegisterComponents('New', [TPrinterList]);
end;
end.
Сохраните модуль компонента командой File/Save As в рабочем каталоге, используя в качестве имени модуля имя, указанное в строке Unit File Name диалогового окна New Component.
Сноски:
1 Библиотека CLX (Component Library for Cross Platform) является дальнейшим развитием библиотеки VCL для разработки кроссплатформенных приложений, которые могут работать как под ОС Windows, так и Linux.
|