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; //основной конструктор
procedure DoDivide;//объявление процедуры выполнения деления
Property Res: Double read FRes;//значение свойства 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); //заголовок конструктора
begin inherited Create(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
if Val2<>0 then FRes:=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). Далее компонент можно размещать как обычно. Для удаления компонента выполняется команда Components/Install Packages. В списке компонентов помечается удаляемый; нажимаем кнопку Remove.
Рис. 4.2.2. Окно установки компонента
4.3. Создание и установка ActiveX‑элементов
Можно визуально создать компонент (OCX‑файл) на основе уже имеющегося командой File/New/ActiveX/ActiveX Control. В поле VCL Class Name выберите базовый класс (например, TButton) и нажмите кнопку OK. Получим исходный текст потомка TButtonX наследника TButton. После компиляции проекта (^F9) появится компонент ActiveX под именем ButtonXControl1.OCX, который можно использовать в других проектах.
Активная форма является одним из видов ActiveX‑элементов и создается командой File/New/ActiveX/ActiveForm. Далее можно размещать на этой форме нужные компоненты, и после трансляции (^F9) формируется OCX‑файл (со всеми компонентами и процедурами), который можно использовать в проектах после размещения на форме проекта.
Для размещения нового компонента ActiveX (в том числе и активной формы) на панели компонентов (например, ActiveX) выполните команду Component/Import ActiveX Control/Add и выберите имя нужного OCX‑файла (например, ButtonXControl1.OCX или ActiveFormProj1.OCX) и нажмите кнопку Install.
Дата добавления: 2016-03-22; просмотров: 865;