Проблемы совместимости

C++ Builder предоставляет свою мощность и широкие возможности языка C++ всему семейству систем объектно-ориентированного программирования. C++ Builder может быть использован везде, где требуется дополнить существующие приложения расширенным промышленным стандартом языка C++, повысить быстродействие и придать пользовательскому интерфейсу профессиональный облик.

1.3.1 C++ Builder и Borland C++

Между программными продуктами C++ Builder и Borland C++ существует полная и взаимная функциональная совместимость. C++ Builder добавляет процессу программирования новое качество - быструю визуальную разработку приложений на языке C++. Если вы привыкли работать в системах программирования Borland C++ (версий 3.1. 4.5 и 5.0), то ни переход к новой системе, ни возврат к старой не окажутся слишком затруднительными. В вашем распоряжении остаются удобный администратор проектных файлов, компилятор и инкрементальный загрузчик.

Поначалу C++ Builder разочарует многих разработчиков тем, что вместо привычных библиотек OWL и MFC он использует неведомую дотоле библиотеку VCL. Каждая библиотека представляет собой специфическую модель объектно-ориентированного программирования под Windows. Каждая библиотека решает проблемы ООП по-своему, и нельзя сказать, что какая-то одна справляется с задачей лучше или хуже других. Впервые инсталлировав C++Builder, я продолжал разделять приверженность к OWL с большинством C++ программистов. Уже через несколько дней работы я начал ощущать всю прелесть, легкость и удобство использования компонентной модели. Чем больше я проникал в суть VCL, тем больше она мне нравилась, и теперь уже не могу отказаться от работы в среде C++Builder. Время от времени я обращаюсь к проверенному в боях заслуженному ветерану ВС45, чтобы повозиться со старыми OWL программами, постоянно ловя себя на мысли: "Это было бы гораздо легче сделать с помощью C++Builder". И эта мысль отдаляет меня от OWL все дальше и дальше, так что скоро я вовсе распрощаюсь со своей прежней привязанностью.

Borland C++ версий 5.0 и выше поддерживает внедрение в ранее разработанные OWL или MFC программы типовых форм, спроектированных в среде C++Builder на базе VCL. Разработчик идет на такого рода переделки из-за простой причины: C++Builder позволяет включить в форму все диалоги с пользователем чрезвычайно быстро, придавая приложению для Windows законченный профессиональный облик, устраняя из программы всю шелуху вспомогательного кода и оставляя только содержательную часть, воплощающую основную идею алгоритма. Таким образом, совместимость обеспечивается на уровне форм. Перенос отдельных компонент из VCL оказывается затруднительным, да и не нужным, поскольку в предельном случае форма может содержать единственную компоненту. Далее ваша комбинированная программа сможет использовать форму как окно диалога или окно клиента. Подробное описание процедур интеграции OWL или MFC программ с VCL формами и примеры создания комбинированных приложений можно найти в сети Internet no адресу http://www.borland.com/bcppbuilder/papers

Не удивительно, что совместная работа с двумя библиотеками объектных классов заметно увеличивает размер ЕХЕ файла.

1.3.2 C++Builder и Delphi

Все компоненты, формы и модули данных, которые накопили программисты, работающие в Delphi, могут быть повторно использованы в приложениях C++Builder для Windows без каких бы то ни было изменении. Delphi пока еще продолжает оставаться самой легкой в использовании и самой продуктивной системой RAD. Поэтому C++Builder идеально подойдет тем разработчикам, которые предпочитают выразительную мощность языка C++, однако хотят сохранить продуктивность Delphi. Уникальная взаимосвязь этих систем программирования позволяет при создании приложения без труда переходить из одной среды разработки в другую.

Политика, проводимая руководством отделов математического обеспечения большинства фирм и организаций, допускает свободу разработчиков в выборе языка программирования, при условии совместимости производимых ими объектов и кодов. Неукоснительно следуя этой политике, C++Builder сохраняет материальные вложения в Delphi, вобрав в себя Библиотеку Визуальных Компонент, интуитивную интегрированную среду, визуальные механизмы двунаправленной разработки, методику наследования форм и разномасштабные средства доступа к базам данных.

Гамлетовская проблема выбора между двумя альтернативами вообще не ставится - в мире программистов достаточно жизненного пространства для "мирного сосуществования" обеих систем. Оставьте ненужные споры политического толка о преимуществе одной системы над другой. Используйте тот аппарат программирования, который сделает решение ваших задач более продуктивным, который вам больше нравится и который вам представляется более выразительным. C++ и Delphi равноправны в вашей работе - почти все, что вы написали в Delphi, можно легко использовать в C++Builder, и наоборот. Не забывайте об основном направлении своей профессиональной деятельности - создании качественных и надежных программ под операционную систему Windows.

Преимущества разделения кода между C++Builder ч Delphi:

• Программисты могут работать в той среде, которая лучше и быстрее обеспечит реализацию поставленной текущей задачи. Delphi и C++Builder скомпилируют и соберут готовое приложение с одинаковым успехом.

• Написав некоторый объект для проекта Delphi, вы сможете повторно использовать его, без изменений, в проекте C++Builder.

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

• Выбирайте Delphi, когда вам надо как можно скорее создать какой-нибудь простой модуль или объект, даже если вы привыкли работать на C++.

Таким образом, C++Builder в симбиозе с Delphi образует исключительно продуктивную пару систем для быстрой коллективной разработки сложнейших приложений для Windows.

1.3.2.1 Какую систему выбрать?

Для тех, кто впервые остановился на перепутье, неизменным ответом на этот сакраментальный вопрос будет: "Смотря для чего".

Вы должны знать (если уже не знаете), что Delphi использует язык Объектный Паскаль, который преподается во многих специализированных школах и учебных институтах. Если вы только начинаете пробовать свои силы в программировании для Windows, лучше, видимо, выбрать Delphi. Придуманный Н.Виртом как средство для обучения студентов программированию, язык Паскаль стараниями специалистов корпорации Borland видоизменился в Объектный Паскаль для Windows и стал основой мощной профессиональной системы, которой по силам любые задачи - от создания простых вычислительных программ, до разработки сложнейших реляционных СУБД.

C++Builder, как следует из названия, построен на языке C++, который наиболее распространен в крупных фирмах, занимающихся разработкой математического обеспечения профессионального уровня. Если вы обладаете определенными познаниями в языке C++ и программирование должно стать, или уже является, вашей основной специальностью - выбирайте C++Builder. Не излишне заметить, что на западном рынке профессиональные C++ разработки пользуются гораздо большим спросом, нежели продукты системы Delphi, да и оплачиваются C++ программисты несколько выше, чем "паскальщики".

Современные программисты, как правило, владеют по меньшей мере одним из этих языков. Если вы уже работаете в среде Delphi, переход на C++Builder не покажется слишком болезненным, и наоборот. Обе системы находятся на примерно одинаковом уровне популярности среди потребителей. Обе системы построены на идентичном фундаменте - Библиотеке Визуальных Компонент.

1.3.2.2 Какая система является более мошной?

"Конечно C++Builder" - вот моя первая реакция на подобный вопрос. Однако, хорошо известно, что опытные разработчики способны справиться с поставленной задачей на Паскале лучше, чем большинство рядовых C++ программистов. Я знаком с несколькими настоящими мастерами программирования на Паскале и могу сказать, что в их руках этот инструмент способен производить удивительно красивые, эффективные и надежные творения. Если вы намерены специализироваться в области разработки компонент для VCL, используйте более удобные и гибкие средства Delphi, хотя созданные вами компоненты предназначены для внедрения в обе системы.

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

1.3.2.3 Как использовать код Delphi в C++Builder

C++Builder не делает различия между тем, какие программные модули вы добавляете к проекту своего приложения - написаны они на C++ (файлы с расширением СРР) или на Delphi (файлы с расширением PAS). Компилятор свободно принимает следующие кодовые конструкции модулей Delphi 2.0: компоненты,формы, объекты, константы, простые методы и функции - все перечисленные коды можно прямо подставлять в свои проектные файлы. Технология визуального наследования форм дает возможность модифицировать формы Delphi в среде C++Builder без каких бы то ни было проблем.

Опытным программистам откроются следующие возможности системы C++Builder:

• Подгружать к проекту динамические библиотеки Delphi (файлы с расширением DLL). Разделение кода с помощью динамически подгружаемых DLL особенно целесообразно при ограниченном объеме оперативной памяти.

• Использовать OLE объекты Delphi и компоненты ActiveX. Связь OLE объектов позволяет разделять код не только с Borland C++Builder, но и с программными комплексами производства других фирм (Microsoft Word, Excel или Visual Basic).

• Разделять с Delphi общие объекты посредством унифицированных Таблиц Виртуальных Методов (VMTs).

1.3.2.4 Как использовать код C++Builder в Delphi

В C++ разрешен ряд синтаксических конструкций (таких как множественное наследование и перегрузка функций), которые делают невозможным прямой перенос кода C++Builder в проект для Delphi. Однако, существуют следующие обходные пути:

• Компоновать СОМ объекты, написанные на C++, которые поддерживают типизированные библиотеки - все необходимые для сборки проекта приложения файлы Delphi 97 генерирует автоматически из соответствующих библиотек.

• Любая функция, написанная на C++ и помещенная в DLL, может быть прямо вызвана из Delphi - Delphi поддерживает все общие спецификаторы вызова функций CDECL, PASCAL и STDCALL.

• Обращаться к объектам, написанным на C++, из Delphi посредством упомянутых Таблиц Виртуальных Методов.

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

1.3.2.5 Перевод кода Delphi на C++Builder

Быть может, вы действительно собираетесь ретранслировать все свои программы из Delphi в C++Builder. Или, скорее всего, вам понадобилось наскоро переложить какие-то интересные примеры Delphi на язык C++. В любом случае следует остерегаться подстерегающих вас ловушек и "ложных друзей переводчика". Безусловно, вы преодолеете принципиальные различия синтаксиса объектно-ориентированных языков, а компилятор поможет вам в этом. Опасность скорее таится в ошибочной трактовке простых операторов и понятий, на которые следует обратить внимание.

Оператор членства используется для доступа к любой функции, свойству или переменной, принадлежащих некоторому классу - объявленному на Паскале или на C++. Все объекты Паскаля создаются в куче (heap) и для обращения к перечисленным членам класса используется оператор "точка" (.), например:

Label.Text := 'Hello There;';

Ha C++ дело обстоит несколько сложнее, поскольку объекты могут быть созданы не только в куче, но и на стеке. Для обращения к объекту C++, созданному на стеке, служит оператор прямого членства "точка", например:

TMyCiass myClass;

myClass.DoSomething() ;

Синтаксически приведенная кодовая конструкция сходна с паскалевой. Различие заключается в способе распределения памяти для хранения объекта. Для создания объекта в куче C++ использует операторnew, а для доступа к нему - оператор косвенного членства (->):

TMyCiass* myClass =new TMyCiass;

myClass->DoSomething() ;

delete myClass;

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

Оператор присваивания в Паскале записывается в виде двоеточия со знаком равенства (: =), а на C++ - это одиночный знак равенства (=). Таким, образом код Delphi:

Label.Top := 20;

должен выглядеть на C++ как:

Label->Top = 20;

Приобретенная в Паскале привычка записи оператора присваивания приводит к раздражающему обилию синтаксических ошибок на C++, впрочем, легко обнаруживаемых компилятором.

Оператор логического равенства в Паскале записывается в виде одиночного знака равенства (=), а на С - это удвоенный знак равенства (==). Таким, образом код Delphi:

if Labell.Text = Label2.Textthen ... должен записываться на C++как:

if (Labell->Text == Label2->Text) { ... } Если вы случайно написали одиночный знак равенства в предыдущей инструкции сравнения, то она будет воспринята как операция присваивания - не совсем так, как вы подразумевали. Предупреждение "Possibly incorrect assignment", которое выдаст компилятор, здесь надо трактовать как ошибку. Вообще следует приучить себя доводить программу до полного отсутствия такого рода предупреждений -неизвестно, к каким последствиям они могут привести.

Одиночные и двойные кавычки служат для обозначения текстовых строк. Код Delphi:

Label. Text := 'Иван Иванов' должен выглядеть на C++ как:

Label->Text = "Иван Иванов";

Это различие будет, вероятно, раздражать вас не меньше, чем разница в записи операторов присваивания. Запутывая ситуацию еще более, C++ также использует одиночные кавычки, но совсем для другой цели.

Символьный тип служит для объявления байтовых величин. В Паскале значения символов типаChar заключены в диапазоне от 0 до 255. В C++ символ без знака(unsigned char) эквивалентен описаниюChar Паскаля, однако символ со знаком(signed char) имеет другой диапазон значении от -127 до +128. Два варианта присваивания значения некоторому символу на Паскале выглядят как:

с : Char ;

с := #65;

с := Char(0rd('А' ) ) ;

что эквивалентно следующему C++ коду: