Использование кода Delphi в C++Builder
Как вы знаете, C++Builder вырос из Delphi. Большая часть того, что есть
в C++Builder, пришла напрямую из Delphi. Иногда это может быть
разочаровывающим, но, тем не менее, есть некоторые преимущества.
Имеется большое количество доступного кода на Delphi, который может
быть серьезным подспорьем в разработке приложений на C++Builder. В
некоторых случаях этот код может быть использован непосредственно. В
других случаях код может быть преобразован для использования в
C++Builder. Более того, существуют много компонентов Delphi, для
которых не существует их аналогов в C++Builder.
В C++Builder есть встроенный компилятор паскаля. Компилятор паскаля
позволяет вам использовать код Delphi в C++Builder'е. Он может также
помочь в конвертации кода из Delphi в C++Builder. Компилятор паскаля
доступен как из IDE C++Builder, так и из командной строки. Непосредственное использование модулей Delphi Часто
вы будет обнаруживать проекты Delphi, содержащие модуль, который бы вы
хотели использовать в своих приложениях. Простейшим путем использования
модуля Delphi является его добавление в проект. Ниже приведены шаги,
необходимые для добавления модуля Delphi в проект C++Builder'а: - Создайте в C++Builder'е свой проект.
- Выберите "Add to Project" в панели C ++ Builder 'а или в меню.
- Выберите "Pascal unit" в типах файлов выпадающего списка диалогового окна открытия файлов.
- Выберите модуль Delphi для добавления в свой проект и нажмите OK.
- Перестройте
свое приложение перед написанием кода, ссылающегося на модуль Delphi.
Перестройка проекта создаст из модуля заголовок, который вы сможете
включить в свое приложение.
- Выберите пункт "File | Include Unit Hdr…" в главном меню C++Builder 'а и добавьте форму Delphi в ваше приложение.
- Напишите код, который ссылается на модуль Delphi.
Когда
вы перестраиваете приложение, C++Builder использует встроенный
компилятор паскаля для создания obj -файла, который приложение сможет
использовать. Компилятор паскаля также создает заголовочный файл из
исходного текста. Использование этого способа подключения модулей
Delphi совсем несложно. Преобразование кода Как вы
можете заметить, добавление модуля Delphi в свой проект - это
достаточно просто. Тем не менее, вы можете не захотеть использовать
модуль Delphi таким образом. У вас могут, например, потребовать, чтобы
весь ваш код был на C++. В этом случае вы будете должны перевести код
паскаля в C++. Для меня не существует практического способа
объяснить каждую деталь преобразования кода Delphi в C++. Все, что я
могу, тем не менее - это показать, как с легкостью преобразовать
сложные объявления паскаля в С++. Давайте предположим,
например, что у вас есть модуль Delphi, (очевидно, несколько упрощенный
для данного примера), который выглядит следующим образом: unit TestUnit; interface type MyEnum = (meOne, meTwo, meThree); function DoSomething(Value : MyEnum : string; var I : Integer; Buffer : array [0..255] of Char; implementation function DoSomething(Value : MyEnum) : string; begin case Value of meOne : Result := 'One'; meTwo : Result := 'Two'; meThree : Result := 'Three'; end; end; end.
Даже
без знания паскаля вы, вероятно, можете справиться с конвертацией этого
модуля вручную. Тем не менее, вы можете получить преимущество,
используя компилятор паскаля C++Builder'а для создания заголовочного
файла для этого модуля. Вы могли бы добавить этот модуль в приложение
C++Builder'а и его откомпилировать, но вы можете также использовать
компилятор из командной строки. Вот последовательность действий: Откройте окно командной строки и перейдите к папке, содержащей модуль Delphi. В командной строке наберите: "dcc 32 - jphn TestUnit.pas" (без кавычек). DCC32.EXE
- это компилятор паскаля. Ключ -jphn сообщает компилятору о
необходимости создать заголовочный и объектный файлы, совместимые с
C++Builder. По завершению исполнения данной команды будет
откомпилирован исходный файл на паскале и будут созданы заголовочный и
объектный файлы (объектный файл в данном случае не является значимым,
поскольку вы все равно не собираетесь его использовать). Заголовок,
сгенерированный для тестового модуля, будет иметь следующий вид (строки
комментариев удалены для ясности): #ifndef TestUnitHPP #define TestUnitHPP
#pragma delphiheader begin #pragma option push -w- #pragma option push -Vx
#include <SysInit.hpp> // Pascal unit #include <System.hpp> // Pascal unit
namespace Testunit { #pragma option push -b- enum MyEnum { meOne, meTwo, meThree }; #pragma option pop extern PACKAGE int I; extern PACKAGE char Buffer[256]; extern PACKAGE AnsiString __fastcall DoSomething(MyEnum Value); }
/* namespace Testunit */ #if !defined(NO_IMPLICIT_NAMESPACE_USE) using namespace Testunit; #endif #pragma option pop // -w- #pragma option pop // -Vx #pragma delphiheader end. #endif // TestUnit
Текст немного замусорен различными опциями компилятора, но вот существенная часть: enum MyEnum {meOne, meTwo, meThree}; int I; char Buffer[256]; AnsiString __fastcall DoSomething(MyEnum Value); Заметьте,
как для вас удобно преобразованы объявления. Вы все еще должны
преобразовать настоящий код в модуле, но, по крайней мере, объявления
преобразовали за вас. Вот другой пример, только немного сложнее: const MaxSize = MaxLongInt; type TDoubleArray = array[0..(MaxSize div SizeOf(Double))-1] of Double; PDoubleArray = ^TDoubleArray; TIntArray = array[0..(MaxSize div SizeOf(Integer))-1] of Integer; PIntArray = ^TIntArray;
Сгенерированные объявления выглядят следующим образом: typedef double TDoubleArray[268435455]; typedef double *PDoubleArray; typedef int TIntArray[536870911]; typedef int *PIntArray; Предыдущие
примеры довольно просты. Некоторые объявления паскаля, однако, могут
заставить вас почесать голову в удивлении, как преобразовать их в С++.
Пример: TMyCallback = function(const S : string; Size : Integer) : Integer; Это
объявление функции обратного вызова. Когда вы откомпилируете этот
модуль компилятором паскаля, вы получите заголовок, который содержит
следующее объявление: typedef int __fastcall (*TMyCallback) (const AnsiString S, int Size); Возможно,
вы с легкостью поняли, как преобразовать код паскаля в это объявление,
но это маловероятно, что вы эксперт и в паскале, и в С++. Дело,
конечно, в том, что возможность генерации заголовка компилятором
паскаля делает простым преобразование любого объявления в паскале в
С++. Я могу предложить даже более сложные примеры, но, я думаю, вы уловили суть дела. Использование компонентов Delphi Есть
много условно-бесплатных и бесплатных компонентов, доступных для
Delphi. В большинстве случаев, авторы компонентов не поставляют их
эквивалент в C++Builder. Компоненты, поставляемые с исходным кодом на
Delphi, обычно могут быть использованы с небольшой модификацией или
вовсе без нее. Для использования компонента Delphi предпримите
следующие шаги: - Создайте новый пакет для компонента.
Обычно вы будете создавать пакет, который будет являться пакетом как
времени выполнения, так и времени разработки.
- Добавьте исходный код компонента в пакет.
- Перестройте пакет и установите его.
Предполагаю,
что этот процесс прост, но многие программисты на C++Builder'е не
представляют себе, что компоненты Delphi могут быть использованы
подобным образом
|