Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Плещёв ВУМИП 2012-07-06.doc
Скачиваний:
67
Добавлен:
13.05.2015
Размер:
9.35 Mб
Скачать

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

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

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

Создадим новый проект командойFile/New/Component. В появив­шемся окне заполним пер­вые четыре поляAncestorType(тип родителя),ClassName(имя созда­ваемого клас­­са),PalettePage(па­нель для разме­ще­ния),Unitfilena­me(имя фай­­ла) (рис. 4.2.1). Наж­мем кноп­куOk, сфор­ми­руется текст обо­лоч­ки ком­по­нен­та. Далее вве­дем допол­ни­тель­ный код. Приве­дем весь текст ком­по­нен­та с коммен­та­риями (для наг­­ляд­ности выде­лим строки с ко­да­ми оболочки компонента жир­ным шрифтом).

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

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

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

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

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

Windows, Messages, SysUtils, 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:TNotifyEvent; //переменная типа события (имена начинаются сF)

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

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

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

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

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

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

{ Protected declarations }

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

{ Public declarations }

//Конструктор создает представителя класса при размещении или при //выполнении. Он имеет один параметр - компонент‑владелец. Слово //Overrideозначает, что заменяется наследуемый конструкторTComponent.

constructor Create (AOwner:TComponent); override; //основной конструктор

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

PropertyRes:DoublereadFRes;//значение свойстваResв переменнойFRes

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

{ Published declarations }

//Объявления свойств. Значения свойств (read) читаются из переменных //Fval1,Fval2, а устанавливаются (write) процедурамиSetVal1,SetVal2.

Property Val1: Double read FVal1 write SetVal1; //свойство Val1

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); //заголовок конструктора

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

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

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

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

procedure TDivide.SetVal1(InVal:Double);//метод установки значения Val1

begin FVal1:=InVal; DoDivide; end;//переменной Fval1 (свойства Val1)

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

begin FVal2:=InVal; DoDivide; end; //переменной Fval2 (свойства Val2)

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

begin

ifVal2<>0thenFRes:=FVal1/FVal2//формирование значения свойстваRes

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

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

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

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

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

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

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

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

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

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

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

end;

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

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