|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Оголошення автоматизованих властивостей і методів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: public Tautoobject { // Приватні властивості і методи 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(); // Створення об'єкту автоматизованого сервера _ fastcall Buttonserver::buttonserver(): Tautoobject() { } // Читання текстового значення автоматизованої властивості Ansistring _ fastcall Buttonserver::geteditstr() { return Forml->editl->text; // Запис текстового значення автоматизованої властивості void _fastcall Buttonserver:-.SetEditStr (Ansistring Newval) { Forml->editl->text = Newval; } // Читання чисельного значення автоматизованої властивості int _ fastcall Buttonserver::GetEditNum() val; (int sscanf(Forml->editl->text.c_str(), "%d" &val); val; return // Запис чисельного значення автоматизованої властивості void _fastcall Buttonserver::seteditnum(int Newval){ Forml->editl->text = Newval; } // Очищення значення автоматизованої властивості void_ fastcall Buttonserver::clear() { Forml->editl->text = ""; // Складання текстового значення властивості з трьох рядків void _ fastcall Buttonserver::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 _ fastcall Tformi::button3click(Tobject *Sender){ // Очищення автоматизованої властивості сервера Autoserver.OleProcedure("Clear"); Лістинг 3.17. Кодовий файл Auto1.cpp модуля контроллера. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.011 сек.) |