Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
34
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

Лекция №29 Тема: Разработка собственных компонентов

План:

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

2.Создание и установка ActiveX-элементов

3. Создание и установка пакетов

4. Использование пакетов

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

Компоненты компилируются и хранятся в специальных, динамически вызываемых библиотеках - пакетных файлах (BPL). Пакетные файлы (Packages) служат для передачи и использования компонентов в различных приложениях, разрабатываемых на различных языках программирования, поддерживающих стандартный интерфейс компонентов.

Для примера создадим новый компонент Divide, который делит два числа, задаваемых его свойствами Val1 (делимое) и Val2 (делитель), а результат помешается в свойство Res. Событие OnZero возникает при делении на ноль. Компонент разместим на панели Samples.

Рис. 85. Настройка компонента Divide

Создадим новый проект командой File/New/Component. В появившемся окне заполним первые четыре поля Ancestor Type (тип родителя), ClassName (имя создаваемого класса), Palette Page (панель для размещения), Unit file name (имя файла) (рис. 85). Нажмем кнопку Ok, сформируется текст оболочки компонента. Далее введем дополнительный код. Приведем весь текст компонента с комментариями (для наглядности выделим строки с кодами оболочки компонента жирным шрифтом).

Текст компонента Divide

unit Divide; //имя модуля

interface //интерфейсная часть

uses //подключаемые модули

Windows, Messages, SysUtih, Classes, Graphics, Controls, Forms, Dialogs;

Type //раздел типов

//Можно формировать потомка на основе класса, например TLabel, используя //свойства родителя и добавляя новые свойства и события.

//MyLabel = class(TLabel)

//формирование потомка из класса TLabel

//Если имя родительского класса начинается с текста TCustom, то //потомок существенно отличается от родителя и не все

// свойства и события переносятся потомку, например;

//MyLabel = class(TCustomLabel)

//формирование потомка из TCustomLabel

//Если имя родительского класса TComponent, то компонент практически //наследует самые общие свойства компонентов.

TDivide = class(TComponent) //формирование нового класса TDivide

Private //поля, методы, свойства и события, доступные только в классе

{Private declarations} //объявление переменных и методов

Fzero : TNotifyEvcnt; //переменная типа события (имена начинаются с F)

FVall : Double; //переменная для хранения значения свойства Val1 FVal2 : Double; //переменная для хранения значения свойства Val2

FRes : Double; //переменная для хранения значения свойства Res

procedure SetVall(InVal:Double); //метод установки делимого (Val1)

procedure SetVal2(InVal:Double); //метод установки делителя (Val2)

protected //аналогичен Private и дополнительно доступен потомкам

{ Protected declarations }

public //поля, методы, свойства и события, доступные всем вне класса

{Public declarations}

//Конструктор создает представителя класса при размещении //или при выполнении. Он имеет один параметр - компонент

// владелец. Слово Override означает, что заменяется наследуемый //конструктор TComponent.

constructor Create (AOwner:TComponent); override;

//основной конструктор

procedure DoDividey//объявление процедуры выполнения деления

Property Res: Double read FRes;//значение свойства Res в переменной FRes

Published //аналогичен Public и изменяемый в Инспекторе Объектов

{ Published declarations }

//Объявления свойств. Значения свойств (read) читаются из переменных

//Fval1, Fval2, а устанавливаются (write) процедурами SetVal1, SetVal2.

Property Val 1: Double read FVal 1 write SetVal 1; //свойство Val 1

Property Val2: Double read FVal2 write SetVal2; //свойство Val2

//Объявления свойства-события OnZero. Значения свойств (read) читаются

//и устанавливаются переменной-событием FZero

Property OnZero: TNotifyEvent read FZero write FZero; //событие OnZero

end;

procedure Register; //объявление процедуры регистрации компонента

implementation //исполнимая часть

procedure Register; //заголовок процедуры регистрации компонента

begin //процедура регистрации компонента TDivide на панели Samples RegisterComponents('Samples', [TDivide]);

end; //конец процедуры регистрации

constructor TDivide.Create(AOwner:Tcomponent);//заголовок конструктора

begin

inherited Create(AOwner);// вызов конструктора родительского класса

FVall :=1; //установка значения FVal (свойства Val1) по //умолчанию =1

FVal2:=l; //установка значения Fval2 (свойства Val2) по //умолчанию =1

end; //конец конструктора

procedure TDivide.SetVall(InVal:Double);

//метод установки значения Val1

begin

FVall:=InVal; DoDivide; end;//переменной Fvall (свойства Val)

procedure TDivide.SetVal2(InVal:Double);

//метод установки значения Val2

begin FVal2:=InVal; DoDivide;

end; //переменной Fval2 (свойства Val2)

procedure TDivide.DoDivide; //метод деления двух чисел

begin

if Val2<>0 then FRes :=F Val1/FVal2//формирование значения свойства Res //Функция Assigned возвращает истину, если имеется процедура обработки

//события и процедура OnZero данного компонента (Self) выполняется

else if assigned(FZero) then ОпZего(Self);//выполнение обработчика OnZero

end; //конец метода деления

end. //конец компонента

Для отладки компонента создадим новый проект и включим в него модуль компонента Divide командой Project/Add to Project/Divide. Дополним команду Uses модуля Unitl именем Divide (подключим этот модуль). В разделе переменных (Var) модуля Unitl объявим переменную D типа TDivide (D:TDivide;) и составим обработчик события OnCreate для формы:

procedure TForml.FormCreate(Sender: TObject); //заголовок

begin D:=TDivide.Create(Self); //создание экземпляра компонента TDivide

D.Vall:=3; D.Val2:=4; //задание свойств для созданного компонента

//для проверки обработчика события OnZero нужно задать D.Val2=0

D.DoDivide; //выполнение деления методом DoDivide

Forml.Caption:=FloatToStr(D.Res);//вывод результата (свойство Res)

end;

Рис. 86. Окно установки компонента

Установим компонент на палитру после отладки командой Component/Install Component/Into new package. В появившемся окне заполним его поля (рис. 86). Далее компонент можно размещать как обычно. Для удаления компонента выполняется команда Components/Install Расkages. В списке компонентов помечается удаляемый; нажимаемый кнопку Remove.