Кілька слів про ActiveX CBuilder

Тепер настав час сказати пару слів про керуючих елементах Active і їх структурі Як і компоненти VCL, керуючі елементи ActiveX містять властивості, методи і події Однак на відміну від них керуючі елементи ActiveX містять словник, який дозволяє зовнішнім додаткам (які називаються несучими обєктами , container objects) Дізнаватися, які властивості, події та методи підтримує даний керуючий елемент По правді кажучи, це не зовсім вірно Обєкти VCL також можна опитувати про інформацію, що міститься в них Однак така можливість існує тільки в системах, побудованих на VCL, наприклад Delphi і CBuilder

У керуючих елементах ActiveX кожне властивість доступно через методи Set і Get Ці методи дозволяють елементу ActiveX керувати доступом до властивості Також керуючий елемент містить методи, розраховані на задану кількість параметрів фіксованих типів Вам це нічого не нагадує Взагалі-повинно б Це та ж базова система, яка використовується і в VCL Обєкти VCL можуть мати (звичайно) методи Set і Get і методи в параметрах Головна відмінність між ActiveX і VCL насправді в тому, що обєкти ActiveX можуть приймати тільки обмежена кількість типів, тоді як обєкти VCL приймають все, що розуміє компілятор Ну і крім того, звичайно, застосування обєктів VCL обмежено на сьогоднішній день системами Delphi і CBuilder, а керуючі елементи ActiveX можна використовувати майже в усіх системах розробки під Windows

Керуючий елемент ActiveX використовує бібліотеку типів (TLB-файл) для визначення інформації, доступної системі від елемента Ця бібліотека і є засіб, що дозволяє системі дізнатися, що за властивості і методи є у даного керуючого елемента CBuilder використовує цю інформацію для генерації «обгорткових» файлів для керуючого елемента ActiveX і для додання елементу виду, як можна більш схожого на компонент VCL

Якщо ви подивитеся на фрагмент заголовного файлу, відповідного згенеровані

«Обгорткового» файлу, ви зрозумієте, що я маю на увазі під схожістю на компонент VCL Відкрийте файл SHDOCVWHPP в редакторі середовища CBuilder і погляньте на початок файлу Ви побачите щось подібне:

namespace Shdocvw

{

//— type declarations ————————————— typedef

void __fastcall (     closure *TwebBrowserBeforeNavigate) (System::TObject* Sender, const System::AnsiString URL, int Flags, const System::AnsiString TargetFrameName, System::Variant &ampPostData,

const System::AnsiString Headers, Word &ampCancel)

Тут є парочка цікавих моментів для розуміння По-перше, CBuilder генерує обкладинку namespace навколо компонента Це для вас добре, оскільки це означає, що класи, методи та типи подій, визначені в цьому файлі, незалежні від усього іншого в системі

Наступні кілька рядків описують подію для керуючого елемента TWebBrowser Це конкретна подія носить імя TWebBrowserBeforeNavigate У разі реального керуючого елемента ActiveX, це подія генерується керуючим елементом, перед тим як він переміститься в нове положення Ви можете додати обробник цієї події прямо через Object Inspector Це перше, у чому система проявляє себе в роботі з керуючими елементами ActiveX точно так само, як і в роботі з компонентами VCL Трохи нижче в файлі ми знаходимо сам опис класу Ми розглянемо деяку частину (але не всі) повного опису класу Ось фрагменти блоку опису класу, які нам потрібні:

class __declspec(delphiclass) TWebBrowser

class __declspec(pascalimplementation) TWebBrowser : public Olectrls::TOleControl

{

typedef OleCtrls::TOleControl inherited private:

TWebBrowserNewWindow  FOnNewWindow

TWebBrowserTitleChange  FOnTitleChange TWebBrowserFrameBeforeNavigate   FOnFrameBeforeNavigate TWebBrowserFrameNavigateComplete   FOnFrameNavigateComplete TWebBrowserFrameNewWindow  FOnFrameNewWindow TWebBrowserQuit  FOnQuit

Classes::TNotifyEvent  FOnWindowMove Classes::TNotifyEvent  FOnWindowResize Classes::TNotifyEvent  FOnWindowActivate TWebBrowserPropertyChange  FOnPropertyChange protected:

virtual void      fastcall InitControlData(void) public:

void __stdcall GoBack(void) void __stdcall GoForward(void) void __stdcall GoHome(void) void __stdcall GoSearch(void)

void __stdcall Navigate(const System::AnsiString URL, System::Variant &ampFlags, System::Variant

&ampTargetFrameName, System::Variant  &ampPostData, System::Variant &ampHeaders)

HIDESBASE void __stdcall Refresh(void)

void __stdcall Refresh2(System::Variant &ampLevel) void __stdcall Stop(void)

__property System::Variant Application =

{read=GetVariantProp,  index=200}

__property System::Variant Parent = {read=GetVariantProp, index=201}

__property System::Variant Container =

{read=GetVariantProp,  index=202}

__property System::Variant Document =

{read=GetVariantProp,  index=203}

__property Word TopLevelContainer = {read=GetOleBoolProp, index=204, nodefault}

__property System::AnsiString Type_ =

{read=GetStringProp, index=205, nodefault}

__property System::AnsiString LocationName =

{read=GetStringProp, index=210, nodefault}

__property System::AnsiString LocationURL =

{read=GetStringProp, index=211, nodefault}

__property Word Busy = {read=GetOleBoolProp, index=212, nodefault}

__published:

__property TabStop

__property DragCursor

__property DragMode

__property OnEnter

__property OnExit

__property OnStartDrag

__property int Left = {read=GetIntegerProp, write=SetIntegerProp,

stored=false, index=206, nodefault}

public:

/* TOleControlCreate */ __fastcall virtual TWebBrowser (Classes:TComponent AOwner) : Olectrls::TOleControl(AOwner) { }

/* TOleControlDestroy */ __fastcall virtual

~TWebBrowser(void) { } public:

/* TWinControlCreateParented */ __fastcall TWebBrowser(HWND ParentWindow) : Olectrls::TOleControl(ParentWindow) { }

}

Перша секція опису класу визначає всі події для керуючого елемента Всі ці події будуть один до одного відображені в подіях CBuilder для керуючого елемента, які можна побачити в Object Inspector Ви можете додавати звичайні обробники для цих подій або через Object Inspector, або безпосередньо їх встановлюючи, як ми робили вище в розділі 4 Зауважте, що події діляться на дві категорії Перша – це приватні (private) події, до яких у вас немає прямого доступу Загальні (public) події йдуть далі, ними програма вашої програми може управляти

Після подій йде опис декількох методів Методи такі ж, як і в звичайних обєктах C + + При наявності посилання (або покажчика) на елемент класу компонентів – керуючих елементів ActiveX ви можете викликати будь-яке з описаних подій (наприклад, GoForward, GoBack) безпосередньо з обєкта:

TWebBrowser *pObject pObject-&gtGoBack()

Як бачите, нічого дивного тут немає Виглядає зовсім як компонент VCL, який і є, звичайно, предмет вивчення

Точно так само властивості описані як справжні властивості (properties), як ніби це були властивості VCL Властивості керуючого елемента ActiveX можуть бути опублікованими (published), а можуть і ні, в залежності від того, як вони реалізовані в керуючому елементі ActiveX На додаток до цього, багато властивостей визначаються базовим класом керуючих елементів ActiveX, так що CBuilder автоматично робить їх опублікованими (Published) Властивості цього типу містять TabStop та інші Ці властивості насправді реалізовані обєктом VCL в CBuilder, але виглядають, як ніби реалізовані керуючим елементом ActiveX

Події в ActiveX насправді є просто властивостями VCL також відноситься до них як до подій, раз вже вони виглядають точно так само, як властивості Я сподіваюся, тепер ви бачите, чому все так чудово взаємодіє між керуючими елементами ActiveX і CBuilder Компоненти виглядають майже так само, як керуючі елементи ActiveX Через цього величезного

переваги можна бути майже напевно впевненим, що наступна версія CBuilder1 вже точно буде дозволяти легко переробляти компоненти в керуючі елементи ActiveX

1Версія Borland C + + Builder 3, вже зявилася на світ, вміє створювати керуючі елементи

ActiveX з компонентовVCL – Прямуючи перев

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*