Главная » C++, C++ Builder » Использование форм Delphi в CBuilder

0

Когда был выпущен 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

Эта простенькая форма содержит надпись, поле редактирования и кнопку с заголовком «Закрыть». Мы используем эти элементы для создания законченной формы, которую сможем потом использовать в системе 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.

Рис. 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.  В  отображенном

диалоге выберите название 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.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

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