Пришел праздник и на улицу любителей языка Си++. И пришел он в виде новейшего средства быстрой разработки Borland C++ Builder. Обделенные ранее вниманием, программисты на Си++ могут воспрянуть духом: теперь и у них есть свой Delphi.
Выходящий в свет пакет Borland C++ Builder начинает новую эпоху для компиляторов Borland С++, как в свое время это случилось с серией компиляторов Borland Pascal, превратившихся в Delphi. Программисты получают высококлассный инструмент для скоростной разработки приложений в среде Windows 95 и Windows NT. Хотелось бы отметить, что, несмотря на то что сама компания Borland позиционирует этот продукт как средство разработки приложений архитектуры "клиент-сервер", с его помощью можно создавать любые программы, включая утилиты, прикладные программы и т. д., в общем все то, что можно разработать при помощи любого компилятора Си++. Это должно вызвать переход большинства фирм, выпускающих коммерческие программы, от старых средств разработки к C++ Builder, что вполне закономерно, поскольку экономия времени при работе над проектом - это прямая прибыль.
Пакет C++ Builder умеет создавать приложения, в составе которых используются различные интерфейсы программирования (API). Помимо базового Win32 API, на котором построены все 32-битовые программы для Windows, C++ Builder разбирается в API, применяемых в технологиях ActiveX, ODBC, DCOM, MAPI, DirectX, WinSock, ISAPI и NSAPI. Замечу, ISAPI и NSAPI особенно актуальны сейчас, когда сеть WWW растет с неимоверной скоростью, что требует разработки все большего количества приложений для ее серверов.
Компания Borland уже обнародовала свои планы относительно пакета C++ Builder и даже начала ознакомительную кампанию с пререлизом этого продукта. Всего будет выпущено три разновидности Borland C++ Builder: Standard, Professional и Client/Server Suite, отличающиеся набором инструментов, входящих в поставку:
Standard - базовая конфигурация, включающая компилятор, среду разработки, более 100 готовых компонентов для создания приложений;
Professional - все возможности Standard плюс полный исходный текст библиотеки визуальных компонентов VCL, средства расширенного создания Internet-приложений, баз данных, QuickReports, Internet Solution Pack, Local InterBase Server, InstallShield Express, полный ODBC-доступ;
Client/Server Suite - все возможности Professional плюс SQL Monitor, SQL Database Explorer, SQL Links, Visual Query Builder, InterBase с лицензией на четырех пользователей, встроенное средство контроля версий Intersolv PVCS и многое другое.
Среда разработки и инструменты
Интегрированная среда разработки (IDE) С++ Builder представляет собой набор самостоятельных окон, каждое из которых выполняет свою функцию. Главное окно содержит главное меню, кнопки быстрого доступа к таким командам, как открытие и закрытие файла, компиляция, открытие форм и модулей исходного текста и прочее. Разумеется, здесь присутствует и палитра с компонентами, разбитыми по категориям:
- Standard - часто используемые компоненты пользовательского интерфейса;
- Win95 - компоненты Common Controls, присущие Windows 95;
- Additional - табличные, графические и прочие менее часто используемые компоненты;
- Data Access - компоненты доступа к базам данных;
- Data Controls - визуальные элементы, настроенные на просмотр и редактирование данных;
- Win 3.1 - компоненты 16-битовой Windows 3.1;
- Internet - строительные блоки Internet- и intranet-приложений;
- Dialogs - разнообразные диалоговые панели;
- System - утилитные и системные компоненты, включая управление OLE и DDE;
- QReport - компоненты создания отчетов на основе баз данных;
- ActiveX - набор элементов ActiveX.
Для работы с проектом в состав среды входят несколько окон, среди которых палитра выравнивания компонентов, инспектор объекта, списки модулей исходного текста и форм. Особенно полезен инспектор объекта (Object Inspector). Это - центр управления всей создаваемой программой. Параметры любого компонента можно настроить из окна инспектора свойств. Когда пользователь щелкает на компоненте, список свойств в окне инспектора изменяется, отображая свойства, характерные для выделенного компонента. Щелкнув на закладке Events, можно переключить окно инспектора в режим создания обработчиков событий компонентов. Двойной щелчок на названии сообщения приводит к генерации пустого обработчика события со всеми необходимыми параметрами и его описания в заголовочном файле. Программист добавляет внутрь этой пустой функции-обработчика исходный текст, который должен быть выполнен при возникновении обрабатываемого события.
Создание программ в С++ Builder - дело довольно простое. Рассмотрим простейший пример: вывод строки по нажатию кнопки. Для этого создадим новый проект или воспользуемся пустым проектом, который предоставляется C++ Builder в момент его запуска. На пустую форму положите два компонента: строку редактирования Edit и кнопку Button. Для этого щелкнем мышью на пиктограмме требуемого элемента в палитре, а затем остается передвинуть его в нужное место формы. Теперь изменим размер шрифта в строке ввода, чтобы он был покрупнее, и уберем текст, чтобы строка ввода была пустой. Для этого выделите компонент строки ввода и в окне инспектора объекта щелкните на свойстве Font (шрифт). Рядом возникает кнопка с тремя точками, говорящая о том, что для изменения данного свойства можно воспользоваться диалоговой панелью. Нажмем ее и поменяем размер шрифта с 8 на 16. Теперь щелкнем на свойстве Text и удалим текст, присвоенный строке системой. С кнопкой проще - здесь нужно лишь изменить свойство Caption, введя текст "Откликнись". Форма готова. Осталось написать исходный текст для обработки нажатия кнопки. Для этого надо выделить кнопку, переключить окно инспектора объекта в режим создания обработчиков событий и дважды щелкнуть на событии OnClick. Откроется окно редактирования кода, в котором появился пустой обработчик события. Осталось добавить в него следующую строку исходного текста:
Edit1->Text = "Borland C++ Builder - это круто!";
Программа готова, дело лишь за компиляцией. Надо отдать команду Run - Run, и после недолгой обработки готовое приложение возникает на экране. Нажмем кнопку "Откликнись", и программа поприветствует нас. Надо отметить, что первая сборка проекта происходит дольше, чем последующие. Это связано с тем, что после первой сборки вступает в работу инкрементальное связывание, значительно ускоряющее этот процесс.
Позволю себе ненадолго увести читателей от основной линии рассказа. Дело в том, что компания Borland приготовила сюрприз, который порадовал автора этой статьи и наверняка придется по вкусу потенциальным пользователям пакета C++ Builder, - возможность включать в проекты формы и модули, созданные в среде Borland Delphi. Для этих "приемных детей" генерируются заголовочные файлы и интерфейс. Так что ни одна строка написанного исходного текста не пропадет.
Какую бы форму вы ни сделали в среде разработки C++ Builder, она является кандидатом на повторное использование. Зачем каждый раз создавать ее заново, если можно сделать это один раз и сохранить как шаблон для дальнейшей работы. Пакет C++ Builder предлагает вам централизованное хранилище объектов - Object Repository. Технология работы с хранилищем проста. Вы создаете некий прототип формы, который в дальнейшем будет служить вам отправной точкой для создания новых форм, заносите его в Object Repository и по ходу проекта обращаетесь к нему, когда настает время для создания новой формы. Если в вашем проекте сразу несколько однотипных форм, то Repository для вас просто находка. Можно даже переносить объекты в хранилище между различными проектами, что просто замечательно. Строго говоря, компания Borland уже сделала вашу жизнь малиной, предоставляя хранилище не пустым, а битком набитым всякой всячиной. Щелкните мышью на меню File и выберите команду New, чтобы увидеть... содержимое Object Repository. На нескольких страницах с закладками размещены объекты, которые вы можете использовать в любой момент. На первой страничке диалоговой панели New Items, служащей дверью в хранилище, располагаются базовые "кирпичики" приложений C++ Builder, которые заданы в системе; их нельзя изменить, но можно использовать. Второй следует страничка вашего открытого проекта, куда автоматически заносятся все формы вашего проекта, избавляя вас от необходимости делать это самому. Правда, эта страница действует лишь в вашем проекте, и для другого проекта она будет совершенно другой. Следующие три странички посвящены различным формам, диалоговым панелям и модулям данных. Чего здесь только нет! Хотите диалоговую панель для ввода пароля? Пожалуйста! Используйте на здоровье. Последняя страница диалоговой панели New Items хранит истинное сокровище - набор заготовок проектов со всеми, как говорится, "пирогами". Если, к примеру, вы выберете приложение с многооконным интерфейсом MDI, то C++ Builder предоставит вам главное окно с линейкой инструментов, меню, диалоговой панелью открытия файлов и статусной строкой. Разумеется, класс для вспомогательных окон тоже входит в комплект. Если вы еще не решили, что вам потребуется в вашем будущем проекте, воспользуйтесь мастером Application Wizard. Он проведет вас через серию вопросов, определяющих возможности вашего будущего приложения, и даже позволит создать линейку меню в интерактивном режиме.
Используя объекты из Object Repository, вы можете установить один из трех режимов: копирование объекта (copy), наследование объекта (inherit) и использование объекта (use). Это определяет, каким способом объект будет добавлен в вашу программу. При копировании ваша программа получает копию того исходного текста, который содержится в хранилище:
__fastcall TAboutBox::TAboutBox(TComponent* AOwner) : TForm(AOwner) { }
При наследовании объект вашей программы наследует объект из хранилища:
__fastcall TAboutBox::TAboutBox(TComponent* AOwner) : TForm(AOwner) { }
Если объект-предок в хранилище изменится, то изменения немедленно скажутся на вашем приложении. При использовании объекта из хранилища вы, как и в случае с копированием, получаете копию объекта, но связанную с хранилищем двусторонней связью. Это означает то, что любые изменения, сделанные в мастер-объекте, немедленно отразятся на вашем приложении, и наоборот, если вы измените копию объекта в своей программе, изменения тут же будут сделаны и в объекте, расположенном в хранилище. Это можно предотвратить лишь одним способом: изменить объект во время выполнения программы.
Еще один инструмент, который хотелось бы отметить, это отладчик. Это сложный комплекс инструментов, направленных на обнаружение ошибок и исключительных ситуаций, которые могут возникнуть в процессе работы над проектом. Можно трассировать программу, проверять состояние переменных и объектов, отлаживать многопоточные приложения. Все это дополняется окном отладки низкого уровня, включающим в себя исходный текст отлаживаемой программы на уровне команд ассемблера, дампы памяти и стека, регистры и флажки процессора.
Основа - язык Си++
Пакет C++ Builder унаследовал все лучшее от своего собрата Delphi, за исключением языка программирования. Это не Object Pascal, а Си++. Причем реализация языка полностью соответствует черновому стандарту ANSI. И даже больше: в реализацию языка Си++ для C++ Builder введены виртуальные конструкторы и несколько новых ключевых слов. К примеру, вы не обнаружите нигде такой строчки:
#pragma resource "*.dfm"
А вот в пакете C++ Builder без этой строки ничего не получится, так как она добавляет в проект все ресурсы программы, включая формы, кнопки и т. д. Еще одним примером обновления Си++ может служить описание класса в любом заголовочном модуле формы, автоматически генерируемое при создании формы:
class TForm1 : public TForm { __published: // IDE-managed Components TEdit *Edit1; TButton *Button1; TCheckBox *CheckBox1; private: // User declarations public: // User declarations virtual __fastcall TForm1(TComponent* Owner); };
Здесь, помимо уже известных программисту ключевых слов, добавляется новое - __published, отмечающее секцию класса, где находятся описания, размещаемые и редактируемые менеджером среды разработки.
Безусловно, программистам на Си++ понравится постоянное использование указателей, той самой части языка, которая придает ему мощь, поэтому повсюду применяется оператор ->.
Средства обработки данных
Создание баз данных и клиент-серверных приложений в среде C++ Builder - занятие не столь трудоемкое. Основную часть работы выполняют специальные компоненты. Весь обмен данными между таблицами и программой осуществляется через несколько программных слоев. Первый слой построен на универсальной системе доступа к данным Borland Database Engine (BDE32), умеющей работать напрямую с форматами данных Access, dBASE, Paradox, FoxPro. Через шлюз ODBC можно пересылать данные и к другим популярным СУБД. Настоящий секрет масштабирования приложения кроется именно здесь. Когда вам нужно переориентировать ваше приложение от данных, размещенных на персональном компьютере, на данные, располагающиеся на сервере, достаточно переконфигурировать BDE. Добавьте сюда такие компоненты, как Stored Proc (хранимая процедура), Session (сессия) и т. п., чтобы стало понятно, какая сила скрывается в C++ Builder.
Второй слой состоит из компонентов-источников данных, передающих данные от BDE на следующий слой - компоненты просмотра и редактирования данных. Это то, с чем непосредственно работает пользователь. На вид это самые обыкновенные компоненты приложений: строки ввода, кнопки, табличные сетки и прочее. Но они умеют получать, отображать, редактировать и возвращать данные в базу. И главное, они могут показывать данные даже во время разработки, максимально приближая условия работы к "боевым".
Попробуем разработать свою собственную базу данных. Добавим в новый проект два компонента: Table и DataSource. Для Table нужно настроить свойства DatabaseName и TableName так, чтобы они указывали на существующее имя базы данных (или ее псевдоним) и таблицу, с данными из которой мы хотим работать. Для компонента DataSource настроим свойство DataSet, чтобы оно указывало на имя компонента Table. На форме расположим компонент DBGrid, через который мы будем просматривать данные. Настроим его свойство DataSource на соответствующий компонент DataSource. Последний штрих - добавление компонента DBNavigator, осуществляющего перемещение по таблице с данными. Его свойство DataSource также необходимо настроить. Запускаем сборку проекта и получаем готовую СУБД.
Подводя итоги нашего знакомства с Borland C++ Builder, необходимо отметить, что этот продукт заслуживает самого пристального внимания со стороны разработчиков. Судя по рабочим качествам C++ Builder, ему уготована не одна награда. Остается только дождаться его выхода.
Отметим, что данная статья писалась по версии Prerelease продукта.