Главная » C++, C++ Builder » Несколько слов об ActiveX CBuilder

0

Теперь настало время сказать пару слов об управляющих элементах 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. Откройте файл SHDOCVW.HPP в редакторе среды 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 &PostData,

const System::AnsiString Headers, Word &Cancel);

Здесь есть парочка интересных моментов для  понимания.  Во-первых,  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 &Flags, System::Variant

&TargetFrameName, System::Variant  &PostData, System::Variant &Headers);

HIDESBASE void __stdcall Refresh(void);

void __stdcall Refresh2(System::Variant &Level); 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:

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

/* TOleControl.Destroy */ __fastcall virtual

~TWebBrowser(void) { } public:

/* TWinControl.CreateParented */ __fastcall TWebBrowser(HWND ParentWindow) : Olectrls::TOleControl(ParentWindow) { }

};

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

После событий идет описание нескольких методов. Методы такие же, как и в обычных объектах C++. При наличии ссылки (или указателя) на элемент класса компонентов — управляющих элементов ActiveX вы можете вызывать любое из описанных событий (например, GoForward, GoBack) напрямую из объекта:

TWebBrowser *pObject; pObject->GoBack();

Как видите, ничего  удивительного  здесь нет.  Выглядит совсем  как компонент 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

По теме:

  • Комментарии