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

2.8. Створення системи клієнт-сервер на основі внутрішнього сервера автоматизації

2.8.1. Об'єкт автоматизації. Клас tAutoObject

Для забезпечення роботи інтерфейсу IDispatch і створення серверів автоматизації використовується клас TAutoObject, який є нащадком класів TCOMObject і TTypedCOMMbject.

Для створення нового об’єкту автоматизації використовується репозитарій. Активізація значка Automation Object на сторінці ActiveX виводить вікно майстра створення об’єкту автоматизації.

Поле Class Name використовується для задання імен базового інтерфейсу та СОМ-класу. Список Threading Model визначає варіант багатопотокової роботи сервера. Прапорець Generate event support code забезпечує підтримку подій у СОМ-сервері. Одночасно з об'єктом автоматизації створюється фабрика класу і бібліотека типів. Для роботи з бібліотекою типів існує спеціальний редактор, який завантажується одразу після введення вказаних вище параметрів у вікні Візарда і натисканні кнопки ОК. Опис бібліотеки типів створюється в нотації Object Pascal.

2.8.2. Вбудований сервер автоматизації

Термін "вбудований" означає що застосунок-сервер використовує той самий адресний простір у пам'яті, що й застосунок-клієнт.

Технологію створення системи клієнт-сервер розглянемо на прикладі створення сервера перетворення одиниць виміру.

Сервер автоматизації, створенння якого буде розглянуто, призначений для перерахування величин площ з одних одиниць вимірів в інші. Використовуються наступні одиниці — квадратні метри, сантиметри, ярди, фути, дюйми, кілометри, милі й акри. Метод Convert, що власне і відповідає за перерахування, оголошений у такий спосіб:

function Convert(Quantity: Double; InUnit: Integer; OutUnit: Integer): Double; safecall;

Значення параметра InUnit визначає одиниці виміру, значення яких необхідно перерахувати, a OutUnit — одиниці виміру результату. Фрагмент програмного коду, у якому виконується перерахування, виглядає так:

const

auSquareMeters = $00000000;

auSquareCentimeters = $00000001;

auSquareYards = $00000002;

auSquareFeet = $00000003;

auSquarelnches = $00000004;

auSquareKilometers = $00000005;

auSquareMiles = $00000006;

auAcres = $00000007;

function TAreaUnitConverter.Convert(Quantity: Double, InUnit, OutUnit: Integer): Double;

const

AreaFactor: Array[auSquareMeters..auAcres] of Double = (10000.0, 1.0, 8361.2736, 929.0304, 6.4516, 10000000000.0, 25899881103.4, 40468726.0987);

begin

Result := Quantity * AreaFactor [InUnit] / AreaFactor [OutUnit];

end;

У масиві AreaFactor зберігаються коефіцієнти перерахування між значенням площі, вираженим у заданих одиницях виміру, і тією самою площею, вираженою в квадратних сантиметрах. Наприклад, 1 квадратний метр – це 10000 квадратних сантиметрів, а 1 акр дорівнює 40468726.0987 квадратних сантиметрів. Функція Convert спочатку перераховує одиниці виміру, задані через InUnit, у квадратні сантиметри, а потім квадратні сантиметри в одиниці, задані через OutUnit.

Створення сервера автоматизації. Для створення сервера автоматизації, що надасть клієнту необхідні функції, необхідно виконати певну послідовність дій.

  1. Виберіть у меню Delphi команду FileNew, а потім, коли відкриється діалогове вікно New Items (Нові елементи), виберіть у ньому вкладку ActiveX. Після цього двічі клацніть на елементі ActiveX Library (Бібліотека ActiveX) або клацніть на ньому, а потім на кнопці OK.

  2. Знову виберіть у меню команду FileNew, активізуйте піктограму Automation Objects на вкладці ActiveХ. Delphi виведе на екран діалогове вікно майстра Automation Object Wizard.

  3. У поле Class Name (Ім'я класу) введіть AreaUnitConverter і активізуйте кнопку OK. У відповідь Delphi сформує модуль для цього класу і бібліотеку типів. На екран автоматично буде виведене вікно Type Library Editor.

  4. Виділіть елемент IAreaUnitConverter у списку об'єктів. На інформаційній панелі вікна з'явиться інформація про інтерфейс IAreaUnitConverter, з якої видно, що він є нащадком IDispatch. Нам уже відоме призначення методу Convert, тому додамо його в інтерфейс.

  5. Активізуйте кнопку New Method панелі інструментів і назвіть новий метод Convert. Зверніть увагу на інформаційну панель, де автоматично буде привласнене значення 1 числовому ідентифікатору цього методу.

  6. Активізуйте вкладку Parameters і встановіть у поле Return Type тип значення, що повертається, як Double. Додайте параметри — Quantity типу Double, InUnit типу Integer і OutUnit типу Integer.

  7. Тепер додамо перерахування констант, які визначають поточні і цільові одиниці виміру площі. Натисніть на кнопку New Enumeration панелі інструментів. У відповідь Delphi сформує нове перерахування, якому треба присвоїти ім'я AreaUnit. Натисніть на кнопку New Constant і додайте в перерахування константу auSquareMeters. Так само додайте константи auSquareCentimeters, auSquareYards, auSquareFeet, auSquareInches, auSquareKilometers, auSquareMiles і auAcres. У міру того, як ви будете додавати константи, Delphi автоматично буде присвоювати їм послідовні значення, почавши з 0 для auSquareMeters.

  8. Натисніть на кнопку Refresh Implementation (Обновити реалізацію) панелі інструментів, щоб гарантувати генерування програмного коду відповідно до виконаних у вікні Type Library Editor маніпуляцій. Тепер редактор Type Library Editor можна закрити.

  9. Збережіть модуль під ім'ям AreaUnit.pas, а проект — під ім'ям UnitSrv.dpr. Виведіть на екран програмний код методу Convert, реалізація якого міститься у модулі AreaUnit.pas. Він повинен виглядати так, як було показано вище.

На цьому створення внутрішнього сервера автоматизації закінчено. Скомпілюйте його, щоб переконатися, що у процесі створення не було зроблено жодних помилок. У підсумку буде створено файл UnitSrv.dll, що власне і є внутрішнім сервером автоматизації, а також файл бібліотеки типів UnitSrv.tlb та опис бібіліотеки типів мовою ObjectPascal (UnitSrv_TLB.pas). Потім виберіть у головному меню Delphi команду Run  Register Active Server, щоб зареєструвати сервер у системному реєстрі Windows.