Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Властивості класів,,,.docx
Скачиваний:
5
Добавлен:
26.10.2018
Размер:
252.91 Кб
Скачать

3.6.1.4 Оголошення автоматизованих властивостей і методів

OLE Automation - це різновид механізму зв'язку Object Linking and Embedding, що дозволяє додаткам для Windows управляти іншим. Автоматизований контроллер OLE є додатком, який здатний автоматизувати інше застосування - автоматизований сервер OLE. По суті, OLE Automation є протоколом обміну, за допомогою якого контроллер управляє діями сервера. Всі компонентні об'єкти OLE, що експортуються автоматизованим сервером своїм контроллерам, є похідними від базового класу Tautoobject.

При створенні автоматизованого сервера необхідно визначити його інтерфейс з контроллером, що містить оголошення властивостей і методів OLE об'єкту з тим, щоб контроллер дістав до них доступ. Ніколи не видаляйте вже включені в інтерфейс властивості і методи - це приведе до помилок в роботі існуючих контроллерів. C++Builder використовує модифікатор _automated у оголошеннях автоматизованого методу (Лістинг 3.13). Це оголошення може закінчуватися ще одним новим ключовим словом _dispid яке асоціює значення ідентифікатора диспетчеризації OLE Automation з даною функцією. Myoleautoclass : Tautoobject

 

class

  function(void) _dispid(1000); };

{ _automated: void_fastcall

Лістинг 3.13. Оголошення автоматизованого методу.

Правила видимості, визначувані цим ключовим словом, не відрізняються від правил видимості, оголошених в секції public. Єдина відмінність виявляється в тому, що інформація, що генерується компілятором, про типи властивостей і методів OLE Automation, робить можливим створення автоматизованих серверів.

C++Builder поставляється разом з прикладом (дивовижним по зовнішній простоті і лаконічності коди) взаємодії додатків контроллера і сервера за допомогою механізму OLE Automation. Цей приклад проливає світло на дану методику, викладену в системній документації вельми плутано і туманно. Автоматизований сервер Autosrv демонструє використання:

• компонентних об'єктів Tautoobject і Tautoclassinfo;

• методу Registerautoclass автоматизованого об'єктного класу для реєстрації сервера;

• властивостей і методів, оголошених з ключовим словом _automated. Контроллер Autocon управляє сервером і демонструє:

• установку і вибірку властивостей об'єкту сервера;

• використання варіантів (детальна інформація про тип Variant міститься в параграфі 3.6.1.6 "Розширених типів даних Delphi".

Щоб випробувати на практиці що дає взаємодію додатків OLE Automation, виконаєте наступні дії:

=> По команді головного меню File [ Open Project відкрийте діалог вибору проектів. => Увійдіть до каталога ...cbuilderexamplesappsautosrv => Виберіть проектний файл з ім'ям Autosrv і натисніть кнопку Open.

=> Командою головного меню Run | Run запустите процес компіляції і збірки автоматизованого сервера. => Знову відкрийте діалог вибору проектів, увійдіть до каталога

...Cbuilderexamplesappsautocon, виберіть проектний файл з ім'ям

Autocon і натисніть кнопку Open. => Запустите процес компіляції і збірки контроллера.

Вводячи повідомлення в області редагованого введення і натискаючи кнопки контроллера, ви можете моделювати деякі процеси управління сервером. отримуючи результати, які відображені на нижченаведених малюнках:

 

Мал. 3.4. Контроллер готує повідомлення і посилає його серверу.

Мал. 3.5. Контроллер приймає повідомлення, "оброблені" сервером.

Мал. 3.6. Контроллер знімає старе повідомлення з сервера.

Щоб дізнатися як реалізована така взаємодія, необхідно розібратися в текстах модулів автоматизованого сервера (Лістинг 3.14 і Лістинг 3.15) і контроллера (Лістинг 3.16 і Лістинг 3.17), які заслуговують того, щоб привести їх повністю, забезпечивши необхідними коментарями. Сервер містить єдиний об'єкт Edit1 компоненти Tedit для редагованого введення і прийому повідомлень від контроллера у властивість Text. Контроллер записує введене користувачем повідомлення у властивість Text свого об'єкту Edit1, а управляє сервером за допомогою трьох кнопок Buttoni, Button2 і Buttons компоненти Tbutton (з назвами "Послати", "Прийняти" і "Очистити").

#ifndef Auto2h

#define Auto2h

ftinclude <Classes.hpp> ftinclude <01eauto.hpp>

#include <System.hpp>

// Клас сервера Buttonserver. похідний від Tautoob-iect class Buttonserver : publicTautoobject {

  // Приватні властивості і методи Ansistring _fastcall Geteditstr() ;

private:

  Seteditstr(Ansistring Newval);

void _fastcall

  Geteditnum() ;

int _fastcall

  Seteditnum(int Newval);

void _fastcall

  // Автоматизовані властивості і методи property Ansistring Editstr = // властивість типу Ansistring / / з атрибутами функції читання/запису значенні{read=geteditstr, write=seteditstr} ;

_automated:

  Editnum = // властивість типу int / / з атрибутами функцій читання/запису значень {read=geteditnum, write=seteditnum); : Clear (); // метод очищення повідомлення void_fastcall Setthreestr // метод складання текстового / / повідомлення з рядків в параметрах si, s2, s3 типу Ansistring (Ansistring si, Ansistring s2, Ansistring s3);

property int

void _fastcall

void _fastcall Setthreenum // метод складання текстового / / повідомлення з чисел в параметрах п 1, п2, п3 типу int (int п1, int п2, int п3) ; // Загальнодоступні властивості і методи Buttonserver Про; // конструктор об'єкту сервера

public:

_fastcall

};

//----------------------------------------------------------

#endif

Лістинг 3.14. Файл оголошень Auto1.h модуля автоматизованого сервера.

#include <vcl.h>

#pragma hdrstop

#undef Registerclass

#include "Auto2.h"

#include "Autol.h"

int Initialization();

static int Initializer = Initialization();

// Створення об'єкту автоматизованого сервера _fastcallButtonserver::buttonserver() : Tautoobject()

{ }

// Читання текстового значення автоматизованої властивості Ansistring _fastcallButtonserver::geteditstr() { return Forml->editl->text;

// Запис текстового значення автоматизованої властивості void _fastcallButtonserver:-.SetEditStr (Ansistring Newval) { Forml->editl->text = Newval;

} // Читання чисельного значення автоматизованої властивості

int _fastcall Buttonserver: :GetEditNum()

  val;

( int

sscanf(Forml->editl->text.c_str(), "%d" &val);

  val;

return

// Запис чисельного значення автоматизованої властивості void _fastcallButtonserver::seteditnum(int Newval){ Forml->editl->text = Newval;

}

// Очищення значення автоматизованої властивості void_fastcall Buttonserver::clear() { Forml->editl->text = "";

// Складання текстового значення властивості з трьох рядків void _fastcallButtonserver::setthreestr (Ansistring si, Ansistring s2, Ansistring s3) { Forml->editl->text = si + ", " + s2 + ", " + s3;

) // Складання текстового значення властивості з трьох чиселButtonserver::setthreenum (int nl int n2 int n3) { Ansistring sl(nl), s2(n2), s3(n3);

void _fastcall

Forml->editl->text = si + ", " + s2 + ", " + s3;

 void _fastcall Registerbuttonserver() { Tautoclassinfo Autoclassinfo;

// Реєстрація об'єкту автоматизованого сервера

// Ініціалізація полів структури типу Tautoclassinfo Autoclassinfo.AutoClass = _classid(Buttonserver);

Autoclassinfo.ProgID = "Bcbautosrv.EditServer" ;

Autoclassinfo.ClassID =

"{61e124e1-c869-11cf-9ea7-ooa02429b18a}";

Autoclassinfo.Description =

"Borland C++builder Autosrv Example Server Class";

Autoclassinfo.Instancing = acmultiinstance;

// Реєстрація класу автоматизованого сервера Automation->registerclass(Autoclassinfo);

}

// Ініціалізація об'єкту автоматизованого сервера Initialization()

int

{ Registerbuttonserver() ;

  0;

return

}

Лістинг 3.15. Кодовий файл Auto2cpp модуля автоматизованого сервера.

#ifndef AUTOLH #efine AUTOLH

  Tformi : public Tform {

class

  // Ide-managed Components

published:

Tedit *Editl;

Tbutton *Buttonl

Tbutton *Button2

Tbutton *Button3

Tlabel * Label 1;

  Buttonlclick(Tobject *Sender);

void _fastcall

  Button2click(Tobject * Sender);

void _fastcall

  Button3click(Tobject * Sender);

void _fastcall

  // User declarations

private:

Variant Autoserver;

  // User declarations

public:

  Tformi(Tcomponent *0wner);

virtual _fastcall

  Tformi *Forml;

extern

#endif

Лістинг 3.16. Файл оголошень Auto1.h, всі рядки якого (за винятком виділеного рядка оголошення варіанту) C++Builder генерує автоматично при розміщенні компоненів на формі контроллера.

include <vcl.h> #pragma hdrstop

#include "autol.h"

#pragma resource "*.dfm" #ormi *Forml;

_fastcall Tformi::tformi(Tcomponent *0wner): Tform(Owner){ try

{ // Створення автоматизованого сервера як об'єкту OLE Autoserver = Createoleobject("Bcbautosrv.Edit Server");

}

  (...) { // Обробка виключення

catch

Showmessage("Спочатку компілюйте і запустите Autosrv");

Application-terminate () ;

}

} // Обробник події при натисненні кнопки Buttoni Tformi::buttonlclick(Tobject *Sender){ // Установка автоматизованої властивості сервера Autoserver.OlePropertySet("Editstr", Editl->text);

void _fastcall

)

// Обробник події при натисненні кнопки Button2

void _fastcall Tformi::button2click(Tobject *Sender)

{ // Читання автоматизованої властивості сервера

Editl->text = Autoserver.OlePropertyGet("Editstr");

// Обробник події при натисненні кнопки Button3 void _fastcallTformi::button3click(Tobject *Sender){ // Очищення автоматизованої властивості сервера Autoserver.OleProcedure("Clear") ;

Лістинг 3.17. Кодовий файл Auto1.cpp модуля контроллера.