КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Создание новых компонентов
Компоненты компилируются и хранятся в специальных, динамически вызываемых библиотеках ‑ пакетных файлах (BPL). Пакетные файлы (Packages) служат для передачи и использования компонентов в различных приложениях, разрабатываемых на различных языках программирования, поддерживающих стандартный интерфейс компонентов. Для примера создадим новый компонент Divide, который делит два числа, задаваемых его свойствами Val1 (делимое) и Val2 (делитель), а результат помешается в свойство Res. Событие OnZero возникает при делении на ноль. Компонент разместим на панели Samples. Создадим новый проект командой File/New/Component. В появившемся окне заполним первые четыре поля Ancestor Type (тип родителя), ClassName (имя создаваемого класса), Palette Page (панель для размещения), Unit file name (имя файла) (рис. 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; //основной конструктор 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.
Дата добавления: 2014-12-08; Просмотров: 426; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |