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

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

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

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

посвященных Delphi, вы получаете доступ к гигантскому количеству кода, который сможете использовать в своих приложениях. Можно считать, что вы используете новый элитный продукт, с

пятилетним стажем доводки и исправления мелких огрехов и теперь получили его новейшую версию с полной поддержкой. Если вы привыкли к традиционным для программирования под Windows тех лет версиям 1.0, этот переход окажет огромную помощь всей вашей команде программистов.

Первый пример, который мы разберем в этой главе, будет посвящен использованию форм Delphi в ваших приложениях на CBuilder. Если у вас нет Delphi (я использовал Delphi 3.0 для этого примера, но все будет прекрасно работать и для версии 2.0), можете просто использовать мои формы с прилагаемого к книге компакт-диска.

Использование форм Delphi

Когда был выпущен Visual C++ 4.0, фирма Microsoft громко рекламировала возможность прямого импорта форм Visual Basic. Через несколько месяцев она перестала ее рекламировать, а еще через некоторое время вообще перестала упоминать о ней. Это произошло не потому, что импорт не работал, он работал и весьма неплохо. И не потому, что существовали ограничения на импорт (не вполне адекватно воспринимался код Visual Basic, если воспринимался вообще). Не работало само преобразование. Язык Visual C++ использовал архитектуру просмотра документов, основанную на использовании MDI или SDI форм с меню и панелями состояния, а в Visual Basic, так же как и в Delphi, как и в CBuilder, применяется основанная на формах архитектура с независимыми окнами форм. Программисты на Visual C++ (и я в их числе) просто не могли заставить две столь разные концепции работать вместе.

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

На рис. 11.1 показана форма, которую я создал в Delphi 3.0 для проверки совместимости двух систем. Ничего такого глобального в ней нет. Дело в том, что переносить можно любую форму как простую, так и сложнейшую. Все формы создаются одинаково.

Рис. 11.1. Форма Delphi

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

Эта простенькая форма содержит надпись, поле редактирования и кнопку с заголовком «Закрыть». Мы используем эти элементы для создания законченной формы, которую сможем потом использовать в системе CBuilder. Цель данного примера не создать чудеснейшую форму Delphi, а научиться использовать комбинацию из систем Delphi и CBuilder.

Для создания формы запустите Delphi (версии 2.0 или 3.0 — это не имеет никакого значения) и добавьте указанные компоненты на форму. Важным моментом всей этой программы будет являться то, что вам обязательно надо будет сохранить форму под уникальным именем, поскольку CBuilder (так же, как и Delphi) не позволяет использовать в одном проекте две формы с одинаковыми именами. Это вовсе не беспочвенное ограничение, особенно если вспомнить, что вы не можете иметь две функции с одинаковыми именами и аргументами в C++, а также не можете определить два класса с одинаковыми именами в одной зоне видимости. Поскольку и Delphi и CBuilder используют по умолчанию одни и те же имена для форм (Form1, Form2), велика вероятность того, что если вы не сохраните форму Delphi под уникальным именем, она, скорее всего, пересечется по имени с одной из уже существующих в вашем проекте форм. Итак, давайте назовем форму, которую будем импортировать в приложение на CBuilder, DelphiForm.

Больше для очистки совести, чтобы уж быть совсем уверенными в том, что все действительно работает, давайте добавим в форму обработчик для кнопки Закрыть. Не будем вдаваться в детали кода на Pascal — в конце концов, эта книга о C++, и, соответственно, не будем утруждать себя написанием большого кода на Pascal. Таким образом, код, который мы добавим в обработчик для кнопки Закрыть, будет выглядеть так:

procedure TDelphiForm.Button1Click(Sender: TObject); begin

Close;

end;

Не забудьте, что это написано на Pascal, а не на C++. И не используйте в вызове функции Close круглые скобки. Что поделать ради прогресса придется пойти на небольшие жертвы. Добавив этот код в форму, сохраните ее под новым именем. Не забудьте, в каком каталоге она сохранена,

ведь она нам понадобится для осуществления дальнейших шагов. После того как форма переименована и проект сохранен, пора двигаться дальше создавать приложение в CBuilder.

Замечание

Повторюсь еще раз если у вас нет Delphi или вы не хотите запускать его вместе с CBuilder, не смущайтесь воспользоваться формой Delphi, которая находится на прилагаемом к книге компакт- диске. И, как и код всех остальных примеров книги, там же находится законченный проект CBuilder для этого примера.

Строим форму CBuilder

Следующим шагом в написании нашего примера станет создание собственно приложения CBuilder, использующего форму Delphi. Этим мы и займемся прямо сейчас.

На рис. 11.2 показана простая форма с двумя компонентами и кнопкой на ней, которую мы будем использовать при создании этого примера. Мы используем кнопку для связи с формой Delphi из нашей формы, а компонент Label2 для отображения текста, который пользователь вводит в

поле редактирования на форме Delphi.

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

Рис. 11.2. Форма CBuilder для взаимодействия с Delphi

В этом примере мы собираемся отобразить форму Delphi в модальном формате, то есть использовать форму как окно диалога, а не как «нормальную» форму, которая открыта наряду с другими формами и позволяет вам перемещаться туда-сюда между формами. Причин для этого две. Во-первых, мы до сих пор ни в одном примере не создали ни одной модальной формы, так что это хорошая возможность научиться чему-то новому. Во-вторых, форма Delphi служит у нас в этом примере для получения информации (вводимой в поле редактирования), которая отображается потом в первой форме. Если бы мы отражали вторую форму нормально (что вы, кстати, можете легко сделать), то как бы мы узнали, когда отображать информацию в первой форме? У системы есть важное ограничение — Delphi не понимает C++, так что вы не можете просто использовать форму для вызова первой (C++) формы.

Для того чтобы отобразить форму, мы добавим обработчик для кнопки (с заголовком Открыть форму Delphi). Вот код, который надо добавить в обработчик для кнопки:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (DelphiForm->ShowModal())

{

Label2->Caption = DelphiForm->Edit1->Text;

}

}

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

Добавление формы Delphi в наше приложение

Для того чтобы скомпилировать приложение, в котором есть форма Delphi, нам надо перво- наперво сообщить менеджеру проектов CBuilder (project manager) о том, что такая форма вообще присутствует в нашем приложении. Это делается так: выбирается пункт меню Project|Add To Project, а в нем (в диалоге открытия файла) вы переходите в тот каталог вашего компьютера, где хранится форма Delphi. Теперь вам надо обратиться к комбинированному списку Type диалога и выбрать *.pas из предлагаемого списка. Это позволит выбирать формы Delphi. Найдите и выберите форму DelphiForm.

После того как вы добавили форму в проект, вам надо «рассказать» о ней форме CBuilder. В этом процессе нет ничего нового или необычного. Откройте код для формы CBuilder в окне редактора проектов. Выберите команду меню File д Include Unit Hdr в среде CBuilder. В отображенном

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

диалоге выберите название DelphiForm и нажмите кнопку OK. При этом будет автоматически сгенерирован совместимый с C++ заголовочный файл для формы DelphiForm, который будет добавлен в вашу форму CBuilder. Если вас заинтересовало, как классы модуля (unit classes) устанавливаются в соответствие с C++, взгляните на текст файла DelphiForm.hpp, который откроется в окне редактора. Это довольно любопытное зрелище, если не сказать больше.

После того как вы присоединили объект DelphiForm к объекту формы CBuilder, вы можете использовать его так, как будто это обычный объект C++. Заголовоч ный файл содержит в себе трансляцию всех методов, свойств и типов, содержащихся в форме Delphi. Вы можете смело использовать ее так, как будто это обычная форма CBuilder, и не знать ни о каких различиях до тех пор, пока вы не решите сделать ее первой (главной) формой приложения.

Объекты VCL всегда будут объектами VCL, и вы можете использовать для объектов из Delphi те же методы, что использовали в Delphi. Итак, в принципе нет никакой разницы между использованием формы Delphi и формы CBuilder.

Обратите внимание, что когда вы создаете (build) и связываете формы, форма Delphi компилируется точно так же, как обычные формы CBuilder, — благодаря полному и очень мощному компилятору Object Pascal, который содержится в системе CBuilder. И в нашем следующем примере мы воспользуемся этим компилятором для того, чтобы проработать еще одну возможность использования компонентов Delphi — возможность использовать функции Delphi в программе CBuilder.

Использование функций Delphi в приложениях CBuilder

Если вы можете использовать форму Delphi в приложении, то почему бы не попробовать использовать модуль Delphi без формы, ассоциированной с ним? Как было бы здорово использовать все реализованные ранее в Delphi возможности при написании кода на C++! К счастью, это возможно.

Хочу предложить вам хороший пример, подтверждающий мои слова. Когда я приступал к написанию этой книги, я решил, что отличным примером возможностей CBuilder может послужить код, отображающий на экране текст, повернутый на определенный угол. Изящно смотрится, еще изящнее пишется. Короче говоря, идеальный пример. Пошарив по самым дальним закоулкам своего жесткого диска, я таки нашел код, который делал как раз то, что надо поворачивал текст при выводе на экран под определенным углом. Я давно уже забыл, где и для чего я его использовал, но главное он был, и он работал. Это все плоды моей идеи о хранилище кода. Но опустим это сейчас, вернемся к коду. Итак, я раскопал его только для того, чтобы убедиться, что он, конечно же, для Delphi. Чуть ниже в книге, когда мы будем говорить о работе с компонентами, вы увидите, как я перевел его на C++. А сейчас это станет потрясающим примером использования кода Delphi в CBuilder.

Код реализован в виде модуля Delphi. Это «самодостаточный» модуль, то есть в нем содержится и описание (interface) функций, и сами функции. В отличие от языка C++, в котором есть отдельный заголовочный файл для описания и исходный (source) файл для реализации, Object Pascal использует один модуль для того и другого. Это проще в эксплуатации, но плохо вяжется с C++. Или все-таки..? Давайте посмотрим.

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

Рис. 11.3. Форма примера поворота текста

Создайте форму CBuilder. Добавьте на нее надпись, поле редактирования и кнопку, так, как показано на рис. 11.3. Пространство в центре поля формы будет использовано для отображения повернутого текста. Одно замечание по поводу этой формы: для того чтобы все работало как надо, вам необходимо установить один из шрифтов типа True Type. Если вы выберете свойство font (шрифт) и в его поле в

Object Inspector щелкнете по кнопке ..., то увидите список шрифтов, отображен ный в левой части Object Inspector. В этом списке представлены все шрифты, которые могут быть выбраны в системе. Нам нужен один из тех шрифтов, перед названием которого в списке стоят две перекрывающиеся буквы T (TT — True Type). Шрифты True Type масштабируемы, и их можно повернуть при отображении на экран. Обычные, символьные шрифты не могут быть повернуты, и с ними этот пример работать не будет.

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

unit Rotate; interface Uses

Graphics, WinTypes, WinProcs;

procedure AngleTextOut(C : TCanvas; Angle,X,Y :Integer; Str :String); implementation

procedure AngleTextOut(C : TCanvas; Angle,X,Y :Integer; Str :String); var

LogRec TLOGFONT; OldFontHandle, NewFontHandle HFONT; begin

GetObject(C.Font.Handle, SizeOf( LogRec ), Addr( LogRec )); LogRec.lfEscapement := Angle * 10;

NewFontHandle := CreateFontIndirect( LogRec ); OldFontHandle := SelectObject(C.Handle, NewFontHandle); C.TextOut(X, Y, Str);

NewFontHandle := SelectObject(C.Handle,OldFontHandle); DeleteObject( NewFontHandle );

end;

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

Сохраните этот модуль под именем rotate.pas. Этот модуль способен осуществить всю работу, необходимую для поворота текста в поле формы. Он отображает текст путем временного создания нового шрифта, выбором этого шрифта в контекст устройства (device context) формы и непосредственно отрисовывания текста, после чего избавляется от старого шрифта. Программа не слишком сложна, но вполне отвечает своему назначению.

Для того чтобы использовать новую форму, вам надо включить новый модуль в модуль формы. Откройте код модуля формы и выберите в главном меню команду File д Include Unit Hdr. Выберите модуль Rotate и нажмите кнопку OK. При этом автоматически сгенерируется новый заголовочный файл для кода модуля rotate.pas формата C++. Если вы теперь взглянете в каталог проекта, то увидите там файл rotate.hpp, который содержит все описания и функции, находящиеся в файле rotate.pas, переведенные на C++. Вот как этот файл выглядит:

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

//Rotate.hpp - bcbdcc32 generated hdr (DO NOT EDIT) rev: 0

//From: Rotate.pas

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

#ifndef RotateHPP #define RotateHPP

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

#include <Windows.hpp> #include <Graphics.hpp> #include <System.hpp> namespace Rotate

{

//--type declarations----------------------------------------

//--var, const, procedure------------------------------------

extern void __fastcall AngleTextOut(Graphics::Tcanvas* C, int Angle, int X, int Y, System::AnsiString Str);

namespace Rotate

{

//--type declarations------------------------------------------------

//--var, const, procedure--------------------------------------------

extern void __fastcall AngleTextOut(Graphics::Tcanvas* C, int Angle, int X, int Y, System::AnsiString Str);

namespace Rotate

{

//--type declarations------------------------------------------------

//--var, const, procedure--------------------------------------------

extern void __fastcall AngleTextOut(Graphics::Tcanvas* C, int Angle, int X, int Y, System::AnsiString Str);

} /* namespace Rotate */

#if !defined(NO_IMPLICIT_NAMESPACE_USE) using Namespace Rotate;

#endif

//-- end unit -------------------------------------------------------

#endif // Rotate

Не стоит пытаться изменить этот файл, о чем предупреждает и комментарий в начале файла. Если вы все же попробуете его изменить, то CBuilder автоматически перепишет его, когда файл rotate.pas будет компилироваться в следующий раз, и ваши изменения, скорее всего, вступят в противоречие с содержимым самого модуля Rotate. Итак, если вы измените этот файл, то в

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

лучшем случае программа не скомпилируется, а в худшем повиснет во время работы.

Обратите внимание, что CBuilder автоматически генерирует именованную область видимости (namespace), внутрь которой заключает все функции и определения модулей, а также добавляет предложение using в заголовочный файл. Как мы уже говорили ранее на страницах этой книги, это не лучший способ работы с именованными областями видимости, но он позволяет нам вызывать в нашем коде функции напрямую, не волнуясь о том, в которой области она находится. И, что даже более важно, это дает возможность подключать несколько модулей, не заботясь о том, к которому из них принадлежит та или иная функция или объект.

Замечание

Если в подключенном модуле оказался объект Pascal, то, как нетрудно убедиться, в сгенерированном заголовочном файле будет полный перевод этого объекта как класса C++. CBuilder практически полностью совместим со всеми типами, используемыми в Object Pascal.

Последнее, на что стоит обратить внимание в преобразовании, — это на последний параметр функции. В модуле Pascal параметр Str имеет тип String. Этот тип реализованный в Pascal генеральный тип String. Однако в CBuilder нет класса String, который бы напрямую был связан с этим типом. Вместо этого параметр воспринимается как тип AnsiString, который эквивалентен типу String в Delphi.

Кроме прочего, для вызова функции нам нужны строка текста и значение угла поворота. Строку мы будем использовать, заранее заданную в коде программы, а угол поворота позволим пользователю вводить в поле редактирования на форме. Для завершения примера нам осталось добавить обработчик для кнопки Отобразить текст. Добавьте обработчик для нее, а в него добавьте следующие строки:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Canvas->Brush->Color = Color;

AngleTextOut(Canvas, atoi(Edit1->Text.c_str()), Width/2, Height/2, "Повернутый текст");

}

Цвет фона текста мы сделали таким же, как цвет формы, чтобы текст не выглядел крикливой, криво налепленной этикеткой. После этого мы устанавливаем начальную точку текста в центр формы, поделив пополам параметры Height (высота) и Width (ширина). От пользователя мы получаем значение угла поворота, заданное им в поле редактирования формы. Угол представляет собой число (градусы) от 0 (соответствующего нормальному, горизонтальному расположению текста) до 360. Теперь, после того как весь код набран, давайте пойдем дальше и скомпилируем и соберем наше приложение в CBuilder. При этом автоматически скомпилируются модуль Pascal и модуль формы C++, после чего они будут собраны воедино.

Отметьте, что компилятор Pascal автоматически запускается для модулей с расширением .pas.

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

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

Рис. 11.4. Программа поворота текста в действии

Несмотря на то что этот пример был не чересчур сложным, в нем показано все, что вам надо знать об использовании модулей Pascal в CBuilder. Если модуль компилируется в Delphi, он, скорее всего, будет компилироваться и в CBuilder. Ограничения существуют только для версии CBuilder 1.0. В приложениях, написанных на Delphi 3.0, нельзя использовать никаких новых компонентов VCL для форм, которые будут экспортироваться в CBuilder 1.0. Точно так же нельзя использовать и функции Delphi 3.0, которых нет в версии Delphi 2.0. CBuilder 1.0 совместим с Delphi 2.0 и почти совместим с Delphi 3.0, хотя, конечно, между ними и существуют различия. В отношении CBuilder 3.0 подобных ограничений не обнаружено.

Когда я работал над созданием форм в Delphi 3.0 для последующего использования в CBuilder, то выяснил, что обычно практически все переводится правильно. Использование любого из новых компонентов (например, таких как TCoolBar) в Delphi 3.0 влечет за собой невозможность использования этой формы в CBuilder 1.0. Версия CBuilder 3.0 полностью совместима с Delphi 3.0. К середине 1998 года фирма Borland привела в соответствие друг другу два своих главных программных продукта, так чтобы все последующие их версии были полностью совместимы.

Замечание

Вы можете поинтересоваться, а нет ли возможности (при том, что CBuilder может использовать формы Delphi 3.0) использовать формы CBuilder в Delphi 3.0? Как ни странно, нет. Delphi 3.0

поставляется без компилятора C++, в то время как CBuilder включает в себя полный компилятор Pascal. Так что формы CBuilder использовать в Delphi 3.0 нельзя.

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

В этой главе мы узнали довольно много важного. Главное, что вы должны были вынести из этой главы, — это то, что CBuilder поддерживает Delphi. Вы можете непосредственно использовать формы, модули и компоненты Delphi в CBuilder. Причем, что хотелось бы отдельно подчеркнуть, CBuilder работает с формами и модулями Delphi автоматически. Вы просто добавляете их в проект, и CBuilder работает с ними так же, как если бы они были формами или модулями C++. CBuilder может напрямую импортировать компоненты Delphi, представленные как в виде объектного файла (.obj), так и в виде исходного (.pas) файла. После того как компонент Delphi инсталлирован в палитру компонентов CBuilder, вы можете обращаться с ним точно так же, как с любым другим компонентом системы. CBuilder может напрямую использовать модули Object Pascal, содержащие все, что угодно, — объекты, функции или процедуры. Все это будет переведено в соответствующие прототипы C++, и вы даже не будете знать, что они написаны на Pascal, а не на C++. Формы CBuilder пока что не могут быть использованы в Delphi 3.0. Следующие версии обоих продуктов будут все ближе и ближе друг к другу и, возможно, станут когда-нибудь полностью совместимыми и переносимы ми системами. Здесь надо отметить, что

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

куда проще конвертировать Pascal в C++, чем наоборот. Это-то и является основной причиной того, что вы до сих пор не можете использовать модули и формы C++ в приложениях Delphi. Практически любое приложение Delphi может быть преобразовано в приложение CBuilder; для этого надо только сгенерировать новый проект CBuilder и импортировать в него все модули и данные проекта Delphi.

На этом мы завершаем разговор о Delphi. В следующей главе мы поговорим об использовании системы CBuilder с другими «неродными» системами на сей раз с системой MFC в Visual C++.

Глава 12•Использование CBuilder в MFC

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

Файл описания модуля

Работа с библиотеками импорта

Взаимодействие с MFC

Базы данных и MFC

Если вы работаете программистом в какой-нибудь компании и решили прочесть эту книгу, почти наверняка на изучение CBuilder вас подвигла одна из двух самых распространенных проблем. Первая из них возникает в том случае, если ваша компания уже осуществляет разработки в Delphi и вам приходится изучать CBuilder, поскольку большая часть программ написана все-таки на C++, а не на Pascal. Если это так, данная глава не представляет для вас большого интереса. Вторая проблема возникает в том случае, если ваша компания уже использует Visual C++ и MFC (эта комбинация является самым распространенным средством разработок под Windows). В этом случае предлагаемая глава то, что вам действительно надо.

Это просто позор, что большая часть компаний, использующих C++ для разработки своих коммерческих приложений под Windows, используют также и MFC, ведь MFC — это настоящее ископаемое среди средств разработки под Windows. При использовании MFC вы можете работать только в заданной им среде, не имея практически никаких возможностей сделать что-то по- своему. Как программист, вдоволь наработавшийся с Visual C++ и MFC, я знаю, как расстраивают заявления заказчика типа: «Вы сделали то, что надо. Не могли бы вы только сделать так, чтобы текст отображался нежно-зеленым цветом

Для того чтобы двигаться дальше, вам надо четко осознать разницу между подходом VCL и подходом MFC. VCL — это набор компонентов, которые позволяют вам создавать приложения с нуля, а MFC — это библиотека классов, которая позволяет вам разрабатывать приложения только в рамках шаблона, представляе мого кодом, который генерирует Мастер приложений. И здесь, конечно, главное отличие состоит в том, что MFC определяет вид приложения, каким его увидит конечный пользователь (MDI, SDI или основанный на окнах диалога), в то время как VCL позволяет вам смешивать существующие и добавлять новые элементы таким образом, чтобы ваше приложение выглядело именно так, как вы этого хотите.

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

Возможно, вы думаете, что есть-таки способ внести все то хорошее, что я перечислил, и в ваши приложения на MFC, и вы просто не знаете, как это сделать.

Так вот, я хочу сообщить вам, что нет таких причин, по которым вы не могли бы использовать прелести форм VCL в своих приложениях MFC. Заставить две системы понимать друг друга не слишком просто, но если вы хотите охватить максимум возможностей и работать сразу на двух системах, то вскоре увидите, что ваши программы на Visual C++ вполне могут выиграть от

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

использования VCL и нового подхода, основанного на использовании форм.

Не думайте, что я сошел с ума. И на солнце я тоже не перегрелся. Запомните использовать формы, основанные на VCL, и систему, основанную на MFC, вполне возможно. В данной главе мы посмотрим, как это можно сделать; весь процесс от сознания форм в CBuilder до их внедрения в приложение MFC. Мы научимся огибать все подводные камни и не оставим в своих приложениях ни одной ошибки или неточности (ну, или, во всяком случае, почти ни одной).

Использование CBuilder в приложениях MFC

Если вы на минутку задумаетесь над проблемой, которую мы хотим разрешить, то поймете, что просто невозможно встроить код, основанный на VCL, в приложение MFC. В конце концов, VCL использует свой собственный формат объектов, свой собственный код запуска и огромную библиотеку компонентов, которая наверняка не будет функционировать в MFC. С другой стороны, в CBuilder можно без особого труда создавать динамически подключаемые библиотеки (DLL), которые можно без труда использовать в других системах. Ведь DLL — и в Африке DLL, так что любая система, которая умеет с ними работать, будет работать с DLL, написанной на любом языке. Этот подход мы и будем применять при создании форм CBuilder для использования в приложениях на Visual C++, базирующихся на MFC.

Пример: из CBuilder в MFC

В этом примере мы шаг за шагом пройдем весь процесс загрузки формы CBuilder в приложение MFC — от начала до конца. Я покажу вам все ловушки, которые возникнут на пути такого преобразования, а также научу некоторым уловкам, которые облегчат вам жизнь.

Первое, что надо сделать для того, чтобы загрузить форму CBuilder в приложение MFC, — это создать в CBuilder DLL, содержащую эту форму. Не самое сложное задание, не правда ли? Просто создайте новое приложение в CBuilder, выбрав команду меню File д New, и в качестве типа создаваемого приложения укажите DLL. CBuilder автоматически сгенерирует полный скелет DLL, включая функцию для точки входа в DLL и файл сборки (make-файл). Если вы привыкли работать в других системах, вас это должно приятно удивить система сделала за вас всю рутинную работу.

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

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

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