- •2. Інтегроване середовище розробки Delphi: призначення і загальний опис середовища
- •3. Загальна організація програми в Delphi
- •4. Деякі довідкові відомості для роботи у середовищі Delphi
- •Цикл (программирование)
- •[Править]Определения
- •[Править]Виды циклов [править]Безусловные циклы
- •[Править]Цикл с предусловием
- •[Править]Цикл с постусловием
- •[Править]Цикл с выходом из середины
- •[Править]Цикл со счётчиком
- •[Править]Совместный цикл
- •[Править]Досрочный выход и пропуск итерации
- •[Править]Досрочный выход из цикла
- •[Править]Пропуск итерации
- •[Править]Необходимость
- •[Править]Вложенные циклы
- •[Править]Циклы с несколькими охраняемыми ветвями [править]Цикл Дейкстры
- •[Править]Цикл «паук»
- •[Править]Интересные факты
- •3.1 Інкапсуляція
- •3.2 Класи, компоненти і об'єкти
- •3.3 Спадкоємство
- •3.4 Розробка класів
- •3.4.1 Оголошення базового класу
- •3.4.2 Конструктори і деструкції
- •3.4.3 Оголошення похідних класів
- •3.5 Поліморфізм
- •3.5.1 Віртуальні функції
- •3.5.2 Дружні функції
- •3.6.1 Компоненти
- •3.6.1.1 Оголошення компонентних класів
- •3.6.1.2 Оголошення властивостей
- •3.6.1.3 Оголошення обробників подій
- •3.6.1.4 Оголошення автоматизованих властивостей і методів
- •3.6.1.5 Швидкий виклик функцій
- •3.6.1.6 Розширені типи даних Delphi
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 модуля контроллера.