- •Розподілені системи обробки інформації
- •Передмова
- •Розділ 1. Огляд компонентних технологій створення розподілених програмних систем
- •1.1. Узагальнена архітектура і механізм функціонування об'єктних розподілених систем
- •1.2. Основні приклади технологій створення розподілених систем
- •1.3. Переваги використання розподілених технологій
- •Розділ 2. Розроблення розподілених систем на основі модели com/dcom у Delphi
- •2.1. Використання dll у Delphi
- •2.1.1. Поняття dll
- •2.1.2. Створення dll у середовищі Delphi (експорт)
- •2.1.3. Використання dll у Delphi (імпорт)
- •2.1.4. Створення динамічних бібліотек для редагування ресурсів
- •2.2. Основи сом-технології
- •2.2.1. Загальний опис
- •2.2.2. Базові поняття
- •2.2.3. Бібліотека сом
- •2.2.4. Бібліотека типів
- •2.3.2. Сервер сом у Delphi
- •2.3.3. Бібліотека типів у delphі
- •2.4. Створення системи клієнт-сервер на основі базового com-об’єкту у складі внутрішнього сервера
- •2.4.1. Створення сом-сервера
- •2.4.2. Створення сом-клієнта
- •2.4.3. Використання сом-об’єкту в клієнтській програмі
- •2.5. Механізм міжпроцесного обміну
- •2.6. Створення систем клієнт-сервер на основі зовнішнього базового сом-об’єкту
- •2.6.1. Основні поняття
- •2.6.2. Засоби організації потокової взаємодії клієнта і сервера
- •2.6.3. Методи формування екземпляра сом-об’єкту
- •2.6.4. Формування екземпляра зовнішнього сом-об’єкту
- •2.6.5. Створення сом-сервера
- •2.6.6. Створення сом-клієнта
- •2.7. Автоматизація
- •Створення сервера автоматизації;
- •2.7.1. Базові поняття
- •2.7.2. Сервер автоматизації
- •2.7.3. Контролер автоматизації
- •2.8. Створення системи клієнт-сервер на основі внутрішнього сервера автоматизації
- •2.8.1. Об'єкт автоматизації. Клас tAutoObject
- •2.8.2. Вбудований сервер автоматизації
- •2.8.3. Створення клієнта автоматизації
- •2.9. Зовнішній сервер автоматизації
- •2.9.1. Основні визначення
- •2.9.2. Виконання маршалінгу з рядками, шрифтами і зображеннями
- •2.9.3. Перетворення наявного застосунка в сом-сервер автоматизації
- •2.9.4. Створення клієнта автоматизації
- •2.10. Події в сом і зворотні виклики на основі інтерфейсів диспетчирування
- •2.10.1. Створення сервера автоматизації
- •3. Формування бібліотеки типів
- •4. Формування методів
- •5. Реєстрація сервера
- •2.10.2. Створення клієнтського застосунка
- •2.10.3. Підключення множини клієнтів до сервера
- •2.11. Інтерфейси зі зворотним викликом
- •2.11.1. Створення сервера
- •2.11.2. Створення клієнтського застосунка
- •2.12. Технологія ActiveХ
- •2.12.1. Використання готових елементів АctiveХ
- •2.12.2. Розроблення власних елементів АctiveХ
- •2.12.3. Поширення елементів керування ActiveХ і форм ActiveХForm у Web-середовище
- •2.14. Dcom технологія
- •2.14.1. Загальна схема взаємодії сом-клієнта і сом-сервера
- •2.14.2. Розроблення системи «клієнт-віддалений сом-сервер»
- •Розділ 3. Проектування розподілених систем на платформі Microsoft .Net
- •3.1.1. Здійсненя викликань з типів .Net до типів сом
- •3.1.2. Звернення клієнта сом до збірки .Net
- •3.2. Об’єктно-орієнтована архітектура .Net Remotіng – основа створення розподілених систем Mіcrosoft .Net.
- •3.2.1. Створення системи клієнт-сервер на основі технології Remoting
- •Розділ 4. Створення системи "клієнт - сервер" на основі технології corba
- •4.1. Загальні теоретичні відомості
- •4.2. Створення серверного застосунка
- •1. Створення файла опису інтерфейсу
- •Викликання конструктора створення corba сервера
- •Формуємо модуль Unit1
- •Формуємо реалізацію методу
- •4.3. Створення клієнтського застосунка
- •Викликання конструктора corba-клієнта
- •2. Формування форми
- •3. Запуск застосунка
- •Приклад програмних кодів сервера
- •4.4. Порівняльний аналіз технологій сом і соrва
- •4.4.1. Основні принципи об'єктних моделей
- •4.4.2. Об'єктні моделі
- •4.4.3. Підтримка операційних систем
- •4.4.4. Формальний опис архітектури і проблеми реалізації
- •4.4.5. Підсумки порівняння
- •Літературні джерела
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-елемента здійснюється за допомогою такого ланцюжка:
ComponentImport ActiveX Control.
На цьому, загалом, закінчено створення елементу ActiveX. Тепер він розміщений на палітрі інструментів і ним можна користуватися.
Перетворення форм Delphi у ActiveХ
Більш цікавою видається можливість створення в Delphi комплексного елемента керування, що складається з багатьох простих. Такий комплексний елемент керування може бути створений у вигляді окремої форми проекту.
Створення ActiveX на базі такої форми дозволить поєднати багатство можливостей із простотою реалізації. Ця технологія називається ActiveXForms.
Розглянемо для ілюстрації процесу створення ActiveXForms практичний приклад. Програмістам, що створюють графічні застосунки, потрібні можливості вибору користувачем параметрів пера та кисті. Отже, об’єднаємо ці можливості всередині елемента керування.
Для його створення необхідно зробити ряд кроків:
-
Викликання конструктора створення активних форм
У меню File->New… на сторінці ActiveX вибираємо елемент списку ActiveXForm.
-
У діалоговому вікні конструктора вводимо ім’я нового елемента керування – PenX; синхронно видозмінюються й інші імена: ім’я модуля, ім’я проекту, ім’я бібліотеки типів.
-
Проект, що утворився, складається з файлів PENIMPL1.PAS (це власне код реалізації нашого ActiveX), зв’язаного з ним PENPROJ1_TLB.PAS, а також файла PENROJ1.PAS (там міститься заголовок DLL).
-
Встановлюємо додаткові опції: наявність вікна ліцензування, вікна з інформацією про версію, вікна About Box.
-
Компілюємо і зберігаємо усі файли на диску.
-
Тепер поверхня форми 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) та насолоджуватися можливостями, що надає вам компонентний підхід до програмування.