Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций РСОИ.doc
Скачиваний:
20
Добавлен:
04.11.2018
Размер:
1.93 Mб
Скачать

2.12.2. Розроблення власних елементів АctiveХ

Щоб самому створювати СОМ-об’єкти, потрібно витратити чимало часу. Тому і досвідчені користувачі, і новачки роблять це в Delphi за допомогою цілого набору майстрів. Майстер для створення ActiveX «безпосередньо», з нуля, не передбачений. Замість цього ви можете вибрати один з компонентів Delphi чи цілу форму як початкову платформу для розроблення власних елементів ActiveX.

Перетворення компонентів в елементи АctiveХ. Перша з наданих Delphi можливостей – перетворення будь-якого віконного компонента (нащадка TWinControl) у ActiveX. Цей майстер «ховається» під іменем ActiveX Control на сторінці ActiveX меню File/New. Використання його дуже просте – ви вибираєте компонент VCL, майстер пропонує вам імена для майбутнього ActiveX і зв’язаних з ним файлів. Можливі три додаткових опції:

Include About Box – включення у проект діалогового вікна з інформацією про розроблювача;

Include Version Information – включення інформації про версію елемента (цього вимагають деякі контейнери);

Include Design Time Licence – включення ліцензійної інформації, якщо не бажаєте вільного поширення свого продукту; користуватися елементом зможуть тільки користувачі, що мають ключ.

Після того як ви відредагуєте запропоновані параметри, майстер автоматично згенерує всі необхідні файли: власне проект (нагадаємо, що елементи ActiveX завжди оформляються у виді бібліотек DLL – у нашому випадку з розширенням *.OCX), бібліотеку типів разом з її поданням мовою Object Pascal, і ще один файл із вихідним текстом – файл реалізації.

Файл реалізації і класи, що описані у ньому, теж відіграють роль містка, але якщо у випадку TLB клас ToleControl забезпечував зв’язок між можливостями ActiveX і вимогами середовища Delphi, то тут нащадки класу TactiveXControl встановлюють відповідність між колишнім компонентом і його новими «господарями» – контейнерами, у яких буде розміщуватися створений ActiveX. Звертаємо на це увагу, тому що у файлах міститься два однойменних класи (скажемо, при роботі з компонентом TCheckBox це буде клас TCheckBox). Але той з них, що є нащадком TOleControl, потрібний при імпорті ActiveX, а нащадок TActiveXControl – при експорті.

Оскільки ActiveX-елемент являє собою внутрішній сервер автоматизації, його необхідно зареєструвати.

Імпорт у Delphi створеного ActiveX-елемента здійснюється за допомогою такого ланцюжка:

ComponentImport ActiveX Control.

На цьому, загалом, закінчено створення елементу ActiveX. Тепер він розміщений на палітрі інструментів і ним можна користуватися.

Перетворення форм Delphi у ActiveХ

Більш цікавою видається можливість створення в Delphi комплексного елемента керування, що складається з багатьох простих. Такий комплексний елемент керування може бути створений у вигляді окремої форми проекту.

Створення ActiveX на базі такої форми дозволить поєднати багатство можливостей із простотою реалізації. Ця технологія називається ActiveXForms.

Розглянемо для ілюстрації процесу створення ActiveXForms практичний приклад. Програмістам, що створюють графічні застосунки, потрібні можливості вибору користувачем параметрів пера та кисті. Отже, об’єднаємо ці можливості всередині елемента керування.

Для його створення необхідно зробити ряд кроків:

  1. Викликання конструктора створення активних форм

У меню File->New… на сторінці ActiveX вибираємо елемент списку ActiveXForm.

  1. У діалоговому вікні конструктора вводимо ім’я нового елемента керування – PenX; синхронно видозмінюються й інші імена: ім’я модуля, ім’я проекту, ім’я бібліотеки типів.

  2. Проект, що утворився, складається з файлів PENIMPL1.PAS (це власне код реалізації нашого ActiveX), зв’язаного з ним PENPROJ1_TLB.PAS, а також файла PENROJ1.PAS (там міститься заголовок DLL).

    1. Встановлюємо додаткові опції: наявність вікна ліцензування, вікна з інформацією про версію, вікна About Box.

    2. Компілюємо і зберігаємо усі файли на диску.

Тепер поверхня форми TpenX (модуль PENIMPL1.PAS) стає робочою поверхнею.

4. Розміщуємо на формі два компоненти TcomboBox і один компонент TupDown таким чином, щоб наш елемент ActiveX не вийшов занадто великим.

5. Списки, що розкриваються, будуть призначені для вибору кольору і стилю пера, а компонент TUpDown – для вибору його товщини. Властивості Min і Max компонента TUpDown встановіть в 1 і 8, відповідно. Списки будуть наочно показувати його властивості, тому додамо їхнім властивостям Style значення csOwnerDrawFixed, і опишемо такі обробники подій :

const

DefColors : array [0…15] of Tcolor =(clBlack, clMaroon, clGreen, clOlive, clNavy, clPurple, clTeal, clGray, clSilver, clRed, clLime, clYellow, clBlue, clFuchia, clAqua, clWhite);

var GblWidth: Integer;

procedure TPenX.FormCreate(Sender: Tobject);

var i: Integer;

begin

for i :=Low(DefColors) to High(DefColors) do

ComboBox1.Items.Add(IntToStr(i));

for i := 0 to 7 do

begin

ComboBox2.Items.Add(IntToStr(i));

end;

end;

procedure TPenX.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);

begin

With ComboBox.Canvas do

begin

Brush.Color :=DefColor[Index];

FillRect(Rect);

end;

end;

procedure TPenX.ComboBox2DrawItem(Control:TWinControl; Index: Integer; Rect: Trect; State: TOwnerDrawState);

var hh : Integer;

begin

hh := Rect.Top + (Rect.Bottom-Rect.Top) div 2;

With ComboBox2.Canvas do

begin

Brush.Color :=clWhite;

FillRect(Rect);

Pen.Style :=TpenStyle(Index);

Pen.Width :=GblWidth;

Moveto (Rect.Left,hh);

Lineto(Rect.Right,hh);

end;

end;

Procedure TPenX.UpDown1Click(Sender: TObject; Button: TUDBtnType);

begin

GblWidth :=UpDown1.Position;

ComboBox2.Repaint;

end;

При натисканні на кнопку першого списку в ньому повинен з’являтися вибір з 16 основних кольорів; при натисканні на кнопку другого списку – вибір з можливих типів ліній.

Формально елемент ActiveX уже готовий. Однак, щоб одержати від нього якусь користь, бракує інтерфейсу з користувачем. Адже нам вибір кольорів та стилів потрібен не сам собою, а для передавання користувачеві. Переходимо до наступного пункту.

6. У меню View вибираємо пункт Type Library. У вікні Редактора бібліотеки типів відкриваємо інтерфейс IPenX і додаємо до нього три властивості – PenWidth, PenStyle і PenColor. У списку вони відобразяться як три пари методів – для читання і для запису. Натисніть кнопку Refresh Implementation у верхній панелі інструментів, при цьому в обох файлах з’являються описи властивостей, а в PENIMPL1.PAS – заготовки коду для їхньої реалізації.

Наведемо приклад реалізації тільки для методів читання. Зміна значень цих властивостей програмним шляхом не планується.

Function TPenX.Get_PenColor: Integer;

Begin

Result := DefColors[StrToInt(ComboBox1.Text)];

End;

Function TPenX.Get_PenStyle: Integer;

Begin

Result :=StrToInt(ComboBox2.Text);

End;

Function TPenX.Get_PenWidth: Integer;

Begin

Result :=UpDown1.Position;

End;

Але користувач наразі не сповіщений, коли він повинен перевстановлювати параметри свого пера. Це і буде останнім штрихом.

7. До інтерфейсу IPenXEvents потрібно додати новий метод зворотного виклику OnPenChanged, який для клієнта є подією. Реалізовувати реакцію на подію OnPenChanged буде не сервер, а програміст, що використовує наш елемент ActiveX, тому наше завдання – вчасно ініціювати генерування цієї події. Такий код треба поставити скрізь, де відбувається зміна хоча б одного з параметрів пера.

Procedure TPenX.ComboBox1Change(Sender: Tobject);

begin

if FEvents<> nil then FEvents.OnPenChanged;

end;

Елемент керування ActiveXForm загалом готовий. Залишилося скомпілювати проект та зареєструвати елемент, включити його до складу одного з пакетів (ланцюжок: ComponentImport ActiveX Control) та насолоджуватися можливостями, що надає вам компонентний підхід до програмування.