Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теллес М. - Borland C++ Builder. Библиотека программиста - 1998

.pdf
Скачиваний:
764
Добавлен:
13.08.2013
Размер:
4.35 Mб
Скачать

Borland C++ Builder (+CD). Библиотека программиста 141

CBuilder перед Delphi. Система Delphi, написанная на Object Pascal, имеет великое множество реализаций векторов (массивов), множеств и т. д. от третьих лиц, но она не поддерживает и, вероятно, никогда не будет поддерживать стандарт STL. Занавес опускается.

Еще одно изменение, которое нам нужно сделать, касается дочерних окон MDI. Во-первых, нам нужно добавить параметр Mode в вызов AddPoint в дочерних окнах. Измените следующие методы в исходном файле Unit1.cpp в проекте:

void __fastcall TForm1::OnMouseDown(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

FbMouseDown = TRUE;

//Переместиться изначально в эту точку

Canvas->MoveTo(X,Y);

//Послать новые данные в главную форму

Form2->AddPoint (MoveMode, X, Y );

}

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

void __fastcall TForm1::OnMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)

{

if (FbMouseDown )

{

Canvas->LineTo(X,Y);

// Посылаем новые данные в главную форму

Form2->AddPoint (DrawMode, X, Y );

}

}

Здесь на самом деле два изменения. Во-первых, мы добавили параметр Mode в вызове метода AddPoint главной формы. Во-вторых, мы убрали вызов метода ClearPoints, который находился в методе OnMouseDown. Теперь мы хотим, чтобы пользователь мог рисовать несколько линий (это основное изменение в возможностях самого приложения), так что нам больше не требуется удалять все записанные точки, когда пользователь отпускает кнопку мыши и снова нажимает ее где-то еще. Чтобы отследить перемещения, собственно, и нужен параметр MoveMode.

И, наконец, последнее изменение для дочерних окон состоит в добавлении кода, рисующего запомненные каракули, при этом обрабатывая два случая рисование и простое перемещение курсора мыши, которые мы добавили в приложение. Измените метод OnPaint дочернего окна в файле Unit1.cpp:

void __fastcall TForm1::OnPaint(TObject *Sender)

{

if (Form2->NumberOfPoints() > 0)

{

int X = 0, Y = 0, Mode = DrawMode;

//Теперь проходим по всем точкам, получаем

//их координаты из главной формы и рисуем их

Borland C++ Builder (+CD). Библиотека программиста 142

for (int i=0; i<Form2->NumberOfPoints(); ++i )

{

Form2->GetPoint (i, X, Y, Mode ); switch (Mode )

{

case DrawMode: Canvas->LineTo (X, Y ); break;

case MoveMode: Canvas->MoveTo (X, Y ); break;

}

}

}

}

Теперь функция будет проверять режим (рисование или перемещение) и корректно обрабатывать случаи, когда курсор мыши перемещается с нажатой кнопкой и с отпущенной кнопкой. Заметьте также, что нам больше не нужно отдельно обрабатывать первую точку. Теперь важен режим, в котором точка записана, а не порядок точек. Мы таким образом внесли в приложение более высокий уровень абстракции.

Это все изменения, которые нужны программе Scribble для использования нового объекта, использования STL и поддержки неограниченного количества точек и линий. Со всем этим у нас получилось меньше кода, чем было раньше. Я надеюсь, вы видите, что STL можно эффективно использовать для написания качественных приложений с меньшим размером исходного кода.

Один небольшой приз для читателей, у которых есть компакт-диск, прилагаемый к книге: на сопроводительном компакт-диске вы найдете программу, производящую поиск текста. Она написана с использованием STL и поддерживает поиск по нескольких ключевым словам и сортировку по количеству совпадений. Эта программа с названием Search находится в каталоге Extras на компакт-диске. Для получения исполняемого файла программы просто откройте ее в CBuilder и скомпилируйте. Search — консольное приложение, так что вам нужно запускать его из командной строки MS-DOS в Windows 95 или NT.

Что мы узнали в этой главе?

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

Библиотека стандартных шаблонов (STL) позволяет сделать программы более структурированной, доступной в обращении и более гибкой.

Класс vector представляет собой реализацию динамического массива в STL.

В CBuilder можно создавать консольные приложения, которые можно запускать с параметрами в командной строке MS-DOS в Windows 95 и NT.

Используя STL, мы можем даже упростить использование и программирование визуальных

программ в CBuilder.

Можно использовать класс string из библиотеки STL вместо символьных массивов; этот класс не имеет проблем с возможной потерей данных в области памяти за пределами строки, что является стандартной проблемой при использовании символьных массивов.

Borland C++ Builder (+CD). Библиотека программиста 143

Глава 6. Работа с ActiveX

Управляющие элементы ActiveX

Использование ActiveX

Динамические элементы ActiveX

Броузер HTML

Сегодня все говорят об ActiveX. Все в Internet строится на управляющих элементах ActiveX, шаблонных объектах ActiveX для межобъектного взаимодействия, документах ActiveX для отображения данных, Active здесь, Active там. В этой главе мы исследуем использование управляющих элементов ActiveX и особенности работы с ними. К концу этой главы вы будете знать, как устанавливать управляющий элемент ActiveX в CBuilder, как добавить его в вашу форму и как работать с ним после того, как он вставлен в ваш проект.

Хотя вы и не можете напрямую строить управляющие элементы ActiveX в первой версии CBuilder, вы можете использовать объекты и управляющие элементы ActiveX, сделанные в других средах разработки. Delphi 3.0 позволяет легко создавать управляющие элементы и документы ActiveX. Эта возможность появилась в третьей версии CBuilder, однако мы бы хотели продемонстрировать возможность использования «чужих» управляющих элементов ActiveX в ваших формах в CBuilder.

Мы рассмотрим ActiveX в CBuilder в трех аспектах. Во-первых, мы сделаем краткий обзор управляющих элементов ActiveX, которые поставляются с CBuilder и находятся на закладке

ActiveX (в поставке CBuilder Professional edition или Client/Server). Во-вторых, мы добавим новый

ActiveX-элемент в CBuilder и посмотрим, какие новые файлы создаются при этом, каков процесс добавления ActiveX-элемента и как выяснить, что доступно в созданном ActiveX-элементе в CBuilder. Третья, последняя часть главы включает использование одного из управляющих элементов ActiveX, поставляемых с CBuilder, а именно элемента HTML, для построения простого, но полностью функционирующего локального HTML-броузера, который можно использовать на локальной станции (без подключения к Internet). Поскольку все больше справочных файлов поставляются в формате HTML, эта маленькая программа может вам очень даже пригодиться.

ActiveX и CBuilder Professional

Посмотрев на палитру компонентов CBuilder, вы найдете закладку с именем ActiveX. На этой странице находится несколько управляющих элементов ActiveX, которые вы можете использовать и поставлять с вашим приложением. Обычно это урезанные версии полных управляющих элементов ActiveX, предоставленные фирмами, надеющимися продать более полные версии своих программных продуктов профессионалам.

Кроме странички ActiveX, еще один набор управляющих элементов ActiveX поставляется с версией CBuilder Professional. Эти элементы находятся на страничке Internet палитры компонентов; они предоставляют программисту возможность добавить в приложение поддержку сервисов Internet, таких как HTML, FTP и других. Управляющие элементы на страничке Internet

представляют собой поднабор полнофункциональных управляющих элементов от фирмы NetManage, но, хотя они работают, это не самый лучший выбор, если вы хотите встроить в свое приложение полнофункциональный Web-броузер.

Страница ActiveX в палитре компонентов

Если вы используете версию Professional (или Client/Server) среды разработки CBuilder, щелкните на закладке ActiveX. Давайте посмотрим на управляющие элементы на этой страничке и

Borland C++ Builder (+CD). Библиотека программиста 144

разберемся, как их использовать в ваших приложениях.

Первый управляющий элемент на странице — ChartFx, который позволяет вам изображать диаграммы, графики и некоторые другие вещи в окне формы CBuilder. Если вас интересует использование этого элемента, вероятно, вы захотите посмотреть его файл справки. При нажатии F1 в CBuilder файл помощи не появится, так как находится в другом каталоге, нежели стандартные файлы помощи. Этот файл вы найдете в каталоге CBuilder\OCX\ChartFx. Вы можете или использовать его прямо из того каталога, или добавить его в меню Tools, чтобы всегда можно было легко его посмотреть. Читать файл справки, в котором перечислены все доступные свойства и методы этого управляющего элемента, гораздо удобнее, чем рыться в заголовочном файле в поисках нужного метода и гадать, что могут означать параметры.

Второй управляющий элемент на странице ActiveX палитры компонентов CBuilder — это диаграммы VCFirstImpression. Этот элемент, как и ChartFx, позволяет вам изображать данные в разных графических представлениях. Этот элемент поддерживает линейные диаграммы, гистограммы, а также разнообразные сравнительные диаграммы. Файл помощи для управляющего элемента VCFirstImpression находится в каталоге CBuilder\OCX\Vci.

Третий управляющий элемент на странице ActiveX — это электронная таблица VCFormulaOne, очень милая таблица с возможностями, близкими к Microsoft Excel. Вы можете использовать электронную таблицу всюду, где и сетку (например, компонент TStringGrid) для ввода данных в CBuilder. Файл справки для управляющего элемента VCFormulaOne также находится в каталоге

CBuilder\ OCX\Vci.

Следующий управляющий элемент на странице ActiveX, VCSpeller, довольно интересен тем, что это невидимый ActiveX-элемент, изображаемый только во время запуска приложения. VCSpeller

позволяет программисту добавлять в приложение возможность проверки орфографии через стандартный интерфейс со словарем. Опять же, файл справки для этого управляющего элемента (как и для всех VC-элементов) находится в каталоге CBuilder\OCX\Vci.

Последняя пиктограмма на странице ActiveX — это GraphicsServer, который используется как сервер ActiveX для приложений CBuilder.

Кроме управляющих элементов на странице ActiveX, вы также можете добавлять свои управляющие элементы ActiveX. Давайте посмотрим, как это делается и что при этом происходит.

Добавление собственных управляющих элементов ActiveX

Одна из самых приятных возможностей среды разработки CBuilder — это возможность добавления в систему новых компонентов и управляющих элементов. После добавления компонентов в палитру они ведут себя так, как будто поставлялись с CBuilder. Такая расширяемость гарантирует, что ваша система не будет устаревать: вы просто добавляете новые компоненты, появляющиеся в мире. Другие системы также предоставляют похожую расширяемость, но вовсе не так легко (кроме Delphi), как CBuilder.

Для добавления компонента в палитру компонентов вы следуете одной и той же стандартной процедуре, будь ваш компонент обычным компонентом CBuilder или Delphi или же он является управляющим элементом ActiveX, написанным в какой-то другой системе. Вот процесс добавления нового компонента ActiveX на страницу ActiveX палитры компонентов.

В этом примере мы собираемся добавить Internet Explorer ActiveX-элемент (называется он WebBrowser). Компонент автоматически устанавливается на ваш компьютер, если вы используете Internet Explorer, а если вы его не используете, то у вас есть два варианта: или взять бесплатную

Borland C++ Builder (+CD). Библиотека программиста 145

копию с Web-сайта Microsoft (http://www.microsoft.com), или просто использовать другой управляющий элемент ActiveX вместо данного. Процедура установки нового управляющего элемента одинакова, независимо от того, что за элемент вы ставите, хотя получающиеся файлы будут иметь разные имена.

Первый шаг вызвать окно диалога Install Components (установка компонентов) (рис. 6.1). Выберите команду меню Component|Install для вызова окна диалога, которое позволит вам модифицировать компоненты, установленные в системе. Из этого окна вы можете добавлять или удалять обычные компоненты CBuilder/Delphi, равно как и управляющие элементы ActiveX.

Рис. 6.1. Окно диалога установки компонентов в CBuilder

В окне диалога установки компонентов с правой стороны окна вы увидите кнопку «ActiveX». Нажав ее, вы вызовете окно диалога Import OLE Control (импорт управляющего элемента OLE). Этот диалог мы будем использовать для выбора управляющего элемента ActiveX, установленного в систему. Чтобы можно было использовать этот диалог, ваш компонент (управляющий элемент ActiveX) должен быть зарегистрирован в системе. Обычно это делается само собой, если компонент используется в каком-либо приложении, так как обычно программа установки приложения регистрирует компонент (в процессе установки). Если по какой-либо причине он еще не зарегистрирован, то вы можете зарегистрировать его или с помощью приложения Test Container (которое можно найти во многих средах разработки), или используя приложение regsvr32.exe, входящее в комплект Windows 95/NT. Если вы сами разработали управляющий элемент на другом компьютере, вам нужно зарегистрировать его перед использованием в приложении на другой системе, включая CBuilder.

В любом случае, на данный момент будем считать, что вы установили управляющий элемент ActiveX для нашего теста (Internet Explorer ActiveX-элемент) и что все корректно зарегистрировано. Тогда вы сможете выбрать Microsoft Internet Controls в списке Registered controls (зарегистрированные управляющие элементы) и увидеть, как изменятся некоторые поля в диалоге. Во-первых, Unit file name (имя файла с модулем) изменится на SHDOCVW.PAS (все

компоненты генерируются в

виде модуля на Pascal для совместимости с компонентов) изменится на ActiveX, а поле Class

Delphi). Поле Palette page (страница палитры names (имена классов) — на TWebBrowser.

Borland C++ Builder (+CD). Библиотека программиста 146

Рис. 6.2. Окно диалога Import OLE Control

Вообще говоря, вы можете менять все эти поля, но лучше оставить их как есть. Исключения составляют имя страницы в палитре, на которую вы хотите положить этот компонент, и имена классов, которые стоит поменять так, чтобы они лучше отражали суть компонента. Так что в нашем случае мы просто оставляем все как было. Нажмите на кнопку OK для закрытия окна диалога Import OLE Control. Таким образом, вы вернетесь в окно диалога Install Components. Нажмите на OK в этом диалоге: мы закончили вносить изменения в компоненты в системе. Вместо нажатия на OK, если хотите, вы можете добавить еще компонент или удалить существующий.

Как только вы закрываете окно установки компонента, CBuilder начинает действовать. В первую очередь вы увидите, что запустится компилятор и CBuilder перекомпилирует библиотеку компонентов. Файлы модулей для добавленных вами компонентов (в нашем случае SHDOCVW.PAS) скомпилируются, и полученная библиотека будет собрана. Когда процесс компиляции и сборки закончится, вы увидите знакомое окно диалога, в котором будет отражено состояние сборки Done: Make («сборка закончена»).

Вэтот момент изображение палитры компонентов исчезнет на пару секунд, пока CBuilder не найдет все компоненты, входящие в палитру, и не разместит их на соответствующих страничках.

Вконце концов, однако, палитра компонентов будет перерисована. Переместитесь на вкладку ActiveX палитры и внимательно посмотрите на компоненты на странице. Вы увидите новый компонент TWebBrowser в конце странички. Пиктограмма у этого компонента, кстати, будет стандартной пиктограммой поиска файлов.

Теперь вы можете отбуксировать пиктограмму компонента TWebBrowser на вашу форму и использовать его так же, как и любой другой компонент.

Замечание

Небольшое предупреждение. Хотя управляющие элементы ActiveX и используются точно так же, как и любой другой компонент в CBuilder, задержка прорисовки для управляющих элементов ActiveX при отбуксировке их на форму значительно больше, чем для обычных компонентов. Дело в том, что создание управляющего элемента ActiveX требует на порядок больше времени, чем создание нового компонента VCL.

Borland C++ Builder (+CD). Библиотека программиста 147

Обзор файлов, сгенерированных для элементов ActiveX

Когда вы используете обычный компонент VCL, вы включаете заголовочный файл этого компонента. Исходный код для такого компонента живет в файле на языке Pascal (этого файла у вас может и не быть, все зависит от того, покупали ли вы исходные тексты VCL с вашей версией CBuilder). В любом случае, файл библиотеки содержит объектный файл для исходного кода на Pascal. Каким же образом CBuilder работает с управляющими элементами ActiveX как с обычными компонентами, когда они сделаны в другой системе и, скорее всего, у вас нет для них исходного кода?

Ответ в обложке, которая создается для управляющего элемента ActiveX. CBuilder умеет использовать ActiveX; просто он не умеет напрямую создавать управляющие элементы ActiveX (на самом деле умеет, как и любой компилятор C++; главное, CBuilder не содержит удобных средств для работы с ActiveX). Так как же CBuilder работает с таким элементом? Помните, установщик компонента сгенерировал файл SHDOCVW.PAS? Этот файл содержит «оберточный» класс, содержащий управляющий элемент. Вот фрагмент этого файла:

procedure TWebBrowser.GoBack; const DispInfo : array[0..7] of Byte = ($64,$00,$00,$00,$00,$01,$00,$00); begin

InvokeMethod(DispInfo, nil); end;

procedure TWebBrowser.GoForward; const DispInfo : array[0..7] of Byte = ($65,$00,$00,$00,$00,$01,$00,$00); begin

InvokeMethod(DispInfo, nil); end;

procedure TWebBrowser.GoHome; const DispInfo : array[0..7] of Byte = ($66,$00,$00,$00,$00,$01,$00,$00); begin

InvokeMethod(DispInfo, nil); end;

Вызов InvokeMethod, который вы видите в этих функциях на Pascal, является основной функцией класса OLECtrl, который является базовым для класса TWebBrowser. Все эти функции просто строят массив данных, который нужно передать методу (более низкого уровня) управляющего элемента ActiveX, а затем косвенно его (метод) вызывают. Выполняется все это через более низкоуровневый интерфейс OLE (IDispInterface), встроенный в управляющие элементы ActiveX.

Несколько слов об ActiveX

Теперь настало время сказать пару слов об управляющих элементах Active и их структуре. Как и компоненты VCL, управляющие элементы ActiveX содержат свойства, методы и события. Однако в отличие от них управляющие элементы ActiveX содержат словарь, который позволяет внешним приложениям (которые называются несущими объектами , container objects) узнавать, какие свойства, события и методы поддерживает данный управляющий элемент. По правде говоря, это не совсем верно. Объекты VCL также можно опрашивать об информации, содержащейся в них. Однако такая возможность существует только в системах, построенных на VCL, например Delphi

и CBuilder.

Borland C++ Builder (+CD). Библиотека программиста 148

В управляющих элементах 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. Чуть ниже в файле мы находим само описание класса. Мы рассмотрим некоторую часть (но не все) полного описания класса. Вот фрагменты блока описания класса, которые нам нужны:

Borland C++ Builder (+CD). Библиотека программиста 149

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;

Borland C++ Builder (+CD). Библиотека программиста 150

__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, уже появившаяся на свет, умеет создавать управляющие элементы

Соседние файлы в предмете Программирование на C++