C++Builder 4: новые возможности и некоторые примеры их применения
Автоматизация создания кода (Code Inside)
Новые возможности отладки приложений
Новые средства проектирования пользовательских интерфейсов
«Плавающие» окна и инструментальные панели (dockable tool windows)
Манипуляция размерами и расположением интерфейсных элементов
Поддержка новых версий СУБД и новых типов данных
Новые возможности генерации отчетов
Автоматизация создания приложений для публикации данных в Internet
В начале 1999 года компания Inprise Сorporation объявила о выпуске Borland С++Builder 4 — новой версии весьма популярного в нашей стране средства разработки приложений. В данной работе приводится краткий обзор новых возможностей этой версии.
Изменения в среде разработки
Новая среда разработки С++Builder содержит так называемые плавающие окна и панели, напоминающие панели инструментов MS Office. Настраивая среду разработки, можно переместить инструментальные панели в произвольное место формы, объединить несколько окон в одно, пристыковать одно окно к другому, собрать несколько окон в многостраничный блокнот. Как всегда, все особенности интерфейса среды разработки могут быть с успехом перенесены в создаваемые приложения.
Менеджер проектов
Менеджер проектов С++Builder позволяет перетаскивать имена файлов с помощью мыши из других приложений Windows и из других проектов, а также использовать буфер обмена для копирования частей одного проекта в другой проект. Помимо этого имя активного проекта теперь можно выбрать из выпадающего списка в верхней части окна. Возможно также включение в проект любых типов файлов (например, текстовых файлов с пояснениями, заранее скомпилированных объектных модулей и др.).
Class Explorer
Для навигации внутри модуля можно использовать новый инструмент среды разработки — Class Explorer, содержащий в виде иерархической структуры все типы, классы, методы, глобальные переменные и процедуры, определенные в модуле. Отметим, что этот инструмент выполнен в виде «плавающей» формы, которую можно присоединить к другому окну среды разработки, наприме, к инспектору объектов, менеджеру проектов или редактору кода.
Содержимое Class Explorer синхронизировано с содержимым редактора кода — изменения в коде отображаются в Class Explorer, то есть этот инструмент производит разбор исходного текста непосредственно во время его создания. Изменения в Class Explorer приводят к соответствующим изменениям в коде приложения. В частности, возможно визуальное редактирование классов путем добавления новых свойств, полей и методов (опции контекстного меню New Field, New Property, New Method), вызывающих соответствующие диалоговые панели:
После заполнения диалоговой панели автоматически генерируется соответствующий код объявления и реализации методов, который в дальнейшем можно отредактировать:
Положение курсора в Class Explorer синхронизировано с положением курсора в редакторе текста, что позволяет легко находить реализации методов и ссылки на используемые модули. Контекстное меню Class Explorer позволяет находить объявление и реализацию выбранного класса.
Возможен также просмотр иерархии классов приложения, также синхронизированной с редактором кода и Class Explorer: В представленном списке возможна алфавитная сортировка по любому из параметров (имени поля, типа поля и др.). Соответствующий инструмент также представляет собой «плавающую» панель.
Автоматизация создания кода (Code Inside)
Новой особенностью C++Builder является возможность отображения контекстно-чувствительных выпадающих списков методов, свойств и событий, связанных с классом объекта при вводе точки или символа указателя на объект (так называемых Code Completion dialog boxes). Из этого списка можно выбрать необходимый элемент, который будет автоматически помещен в редактируемый код.
При вводе оператора присвоения нажатие комбинации клавиш Ctrl+пробел приведет к появлению списка аргументов, допустимых для данной переменной. Нужный аргумент можно выбрать из списка.
При вводе имени функции и открытой скобки нажатие комбинации клавиш Shift+Ctrl+пробел приводит к появлению списка аргументов данной функции.
Отметим, что указанные выше опции (Code Completion, Code Parameters) могут быть включены (тогда соответствующие списки появляются автоматически при вводе кода в редакторе) либо отключены (тогда для отображения этих окон требуется ввод указанных выше комбинаций клавиш).
Отметим также, что редактор кода теперь может использовать «горячие клавиши» Visual Studio, что облегчает пользователям этого продукта применение C++Builder.
Новые возможности отладки приложений
В C++Builder 4 появились новые возможности отладки приложений. В частности, поддерживается удаленная отладка исполняемых файлов и динамически загружаемых библиотек. Возможна отладка нескольких процессов (в том числе удаленных):
Помимо обычных точек прерывания можно добавить специфические точки остановки, связанные с загрузкой модулей и исполняемых файлов.
Возможен также просмотр загруженных модулей и потоков для нескольких процессов.
В С++Builder 4 возможна также отладка распределенных приложений (использующих как COM, так и CORBA).
В С++Builder 4 возможна отладка процессов, запущенных вне среды разработки (если соответствующие исполняемые файлы содержат отладочную информацию). При пошаговой отладке внутри функции возможно ее прекращение до возврата в вызывающую функцию, если нет дальнейшей необходимости в отладке вызванной функции.
Возможна также установка правил обработки исключений, вывода сведений о событиях в Log-файл. Для этой цели в среду разработки добавлен диалог Debugger Options.
Новые средства проектирования пользовательских интерфейсов
Компонент TActionList
На странице Standard палитры компонентов C++Builder 4 появился новый компонент TActionList. Он предназначен для упорядочения обработчиков событий различных интерфейсных элементов (меню, инструментальных панелей, кнопок и др.). Нередко при использовании широкого спектра интерфейсных элементов и изменения их поведения на этапе выполнения (например, изменения доступности некоторых элементов меню) отслеживание связей интерфейсных элементов и имеющихся в приложении процедур становится затруднительным. Теперь можно имеющиеся в приложении процедуры сделать обработчиками событий компонентов TAction, коллекция которых может быть свойством Actions компонента TActionList.
Рассмотрим в качестве иллюстрации следующий пример. Поместим на форму компонент TImageList, добавим в него какие-нибудь изображения из каталога Common Files\Borland Shared\Images\Buttons (например, FileOpen.bmp, FileNew.bmp, FileSave.bmp, FileClose.bmp).
Далее поместим на форму компонент TActionList. С помощью его редактора свойств создадим несколько объектов TAction, присвоим им имена, установим соответствующие значения свойств Caption и ImageIndex и создадим для каждого из них какие-нибудь обработчики событий OnExecute.
Теперь поместим на форму компонент TToolBar, добавив к нему четыре кнопки TToolButton, четыре компонента TButton, одно главное меню и одно popup-меню. У всех этих компонентов есть свойство Action, и, если выбрать его из выпадающего списка, соответствующий интерфейсный элемент будет обладать соответствующим набором свойств (надписью, графическим изображением) и обработчиком событий OnClick (у компонентов TMainMenu, TPopupMenu и TToolBar перед этим следует установить значение свойства Images, выбрав компонент ImageList1).
Помимо добавления собственных объектов TAction можно использовать готовые шаблоны таких объектов для выполнения стандартных операций:
Отметим, что без использования компонента TActionList на определение свойств и обработчиков событий интерфейсных элементов ушло бы значительно больше времени. Иными словами, использование компонента TActionList позволяет отделить пользовательский интерфейс от логики приложения, что облегчает создание приложения и повышает эффективность разработки.
«Плавающие» окна и инструментальные панели (dockable tool windows)
Одним из новшеств в создании пользовательского интерфейса приложений, отвечающего современным стандартам, является поддержка «плавающих» окон и инструментальных панелей. Все наследники TControl могут быть превращены в дочерние «плавающие» окна (наподобие инструментальных панелей MS Office), а наследники компонента TWinControl могут выполнять роль объектов, к которым эти окна могут приcтыковываться. Помимо этого «плавающие» формы могут образовывать страницы многостраничного блокнота, что само по себе является новшеством в создании пользовательских интерфейсов.
Рассмотрим простейший пример, иллюстрирующий эти возможности. Создадим проект, содержащий три формы.
На главную форму поместим кнопку и компонент TPageControl:
Установим следующие значения свойств компонентов приложения:
Компонент | Свойство | Значение |
---|---|---|
PageControl1 | Align | alBottom |
DockSite | true | |
DragKind | dkDock | |
Form2 | UseDockManager | true |
DragKind | dkDock | |
DragMode | dmAutomatic | |
Form3 | UseDockManager | true |
DragKind | dkDock | |
DragMode | dmAutomatic |
Сошлемся на модули, связанные с формами Form2 и Form3, в модуле, связанном с главной формой приложения, и создадим обработчик события, связанного с нажатием на кнопку:
void __fastcall TForm1::Button1Click(TObject *Sender) { Form3->Show(); Form2->Show(); }
В процессе выполнения приложения после нажатия на кнопку появятся две дополнительные формы — Form2 и Form3, которые можно переместить на блокнот, после чего в нем образуются страницы с именами Form2 и Form3. Изъять форму из блокнота можно, перемещая соответствующий ярлычок с помощью мыши, — ярлычок при этом превратится в заголовок формы.
Отметим, что можно также превратить в «плавающие» окна интерфейсные элементы форм, например панели.
Из компонентов, поддерживающих «плавающие» интерфейсные элементы, особенно хотелось бы отметить TControlBar — компонент, служащий контейнером для любого интерфейсного элемента C++Builder и позволяющий пользователю на этапе выполнения перемещать внутри него интерфейсные элементы по своему усмотрению на этапе выполнения.
Следует также обратить внимание на то, что сама среда разработки C++Builder 4 почти целиком состоит из «плавающих» форм и панелей. В частности, почти все окна отладчика, Code Explorer, инспектор объектов, менеджер проектов, элементы инструментальной панели выполнены в виде «плавающих» форм.
Манипуляция размерами и расположением интерфейсных элементов
Из других новых возможностей C++Builder 4, связанных с созданием пользовательского интерфейса, следует отметить возможность ограничения размеров компонентов и форм. Теперь наследники компонента TControl в C++Builder 4 обладают свойством Constraints, определяющим максимально и минимально возможные значения ширины и высоты компонента или формы; при этом это свойство передается компоненту-контейнеру, содержащему такой компонент, если последний имеет свойство Align, отличное от alNone.
Помимо этого интерфейсные элементы имеют также свойство Anchors, указывающее на то, с каким из краев формы или компонента-контейнера связан данный интерфейсный элемент.
В качестве примера создадим форму, содержащую панель, ListBox и четыре кнопки.
Установим следующие значения подсвойств Top,Left,Bottom,Right свойства Anchors для этих компонентов:
Компонент | Top | Left | Bottom | Right |
---|---|---|---|---|
Panel1 | + | + | + | + |
ListBox1 | + | + | + | |
YesBtn | + | + | ||
NoBtn | + | |||
CancelBtn | + | + | ||
HelpBtn | + | + |
Теперь при изменении размера формы компоненты будут перемещаться вместе с теми краями содержащих их контейнеров, которые выбраны в свойстве Anchors, и при необходимости менять размер.
Если теперь установить для компонента Panel1 в свойстве Constraints минимальную ширину и высоту, то при уменьшении размеров формы поведение этого компонента несколько изменится:
Поддержка сервисов Windows NT
В C++Builder 4 имеется возможность создания приложений-сервисов Windows NT, выполняющихся в фоновом режиме и стартующих при загрузке операционной системы. С этой целью в репозитарии объектов имеются два дополнительных шаблона для создания подобных приложений: Service и Service Application.
Работа с базами данных
Поддержка новых версий СУБД и новых типов данных
Библиотека Borland Database Engine (BDE) теперь поддерживает Access ’97 и Oraclе 8, при этом поддерживаются новые расширения Oracle 8, такие, как абстрактные типы данных (ADT — Abstract Data Type), массивы, ссылки, вложенные таблицы. В соответствии с этим созданы новые классы объектов — потомков TField: TADTField, TReferenceField, TDataSetField, TArrayField.
Поддержка вложенных таблиц
Компонент TDBGrid теперь может отображать вложенные таблицы. Для иллюстрации этой возможности воспользуемся таблицами customer.db, orders.db и items.db, поставляемыми вместе с С++Builder. Поместим на форму три компонента TTable, три компонента TDataSourse, один компонент TClientDataSet и один компонент TProvider. Установим следующие свойства этих компонентов:
Компонент | Свойство | Значение |
---|---|---|
DBGrid1 | DataSource | DataSource3 |
DBNavigator1 | DataSource | DataSource3 |
Table1 | DatabaseName | BCDEMOS |
TableName | customer.db | |
Active | true | |
DataSource1 | DataSet | Table1 |
Table2 | DatabaseName | BCDEMOS |
TableName | orders.db | |
IndexFieldNames | CustNo | |
MasterFields | CustNo | |
MasterSource | DataSource1 | |
Active | true | |
DataSource2 | DataSet | Table2 |
Table3 | DatabaseName | BCDEMOS |
TableName | items.db | |
IndexFieldNames | OrderNo | |
MasterFields | OrderNo | |
MasterSource | DataSource2 | |
Active | true | |
Provider1 | DataSet | Table1 |
ClientDataSet1 | ProviderName | Provider1 |
Active | true | |
DataSource3 | DataSet | ClientDataSet1 |
Сами таблицы формата Paradox, естественно, не поддерживают поля, содержащие вложенные таблицы, но такие поля поддерживает компонент TClientDataSet со страницы MIDAS палитры компонентов. Связав его с компонентом Table1 посредством компонента Provider1, мы получим набор данных, содержащий поле Table2 типа TDataSetField, а внутри вложенной таблицы — поле Table3 того же типа:
Такое представление данных даже в случае использования настольных СУБД весьма удобно просто потому, что оно решает общеизвестную проблему нехватки места на форме при наличии нескольких связанных таблиц. Единственное, о чем при этом следует позаботиться, — это вызов метода ApplyUpdates компонента TClientDataSet (например, в обработчике события, связанного с выбором какого-либо пункта меню или с нажатием на кнопку):
ClientDataSet1->ApplyUpdates(-1);
Если не использовать этот метод, данные будут сохраняться только в кэше, которым фактически и является компонент TClientDataSet, а не в самих таблицах.
Новые возможности генерации отчетов
В генераторе отчетов QuickReport добавлены компоненты TQRTextFilter, TQRHTMLFilter и TQRCSVFilter, позволяющие сохранять отчеты не только в оригинальном формате *.qrp, но и в виде текстового файла, файла формата HTML или CSV (Comma Separated Value).
Автоматизация создания приложений для публикации данных в Internet
В C++Builder 4 имеется DB Web Application Wizard, позволяющий автоматизировать создание приложения для публикации данных в Internet. После выбора соответствующей пиктограммы в репозитарии объектов можно выбрать тип приложения и тип компонентов TDBDataSet для построения приложения.
Далее следует выбрать псевдоним базы данных и имя публикуемой таблицы.
После этого следует выбрать публикуемые поля таблицы:
И, наконец, следует ввести текст заголовка генерируемой приложением страницы, а также текст, помещенный перед таблицей и после нее.
После этого можно открыть полученный компонент TWebModule, выбрать компонент Table1 и установить его свойство Active равным True.
Далее можно выбрать сгенерированный объект TWebAction, выбрать его в качестве действия по умолчанию — и можно компилировать приложение.
Обработчик события OnAction для сгенерированного объекта WebActionItem1 также генерируется автоматически:
void __fastcall TWebModule1::WebModule1WebActionItem1Action(TObject *Sender, TWebRequest *Request, TWebResponse *Response, boo &Handledl) { DataSetTableProducer1->DataSet->Open(); Response->Content = DataSetTableProducer1->Content(); DataSetTableProducer1->DataSet->Close(); }
Теперь можно тестировать созданное приложение с помощью Web-сервера и Web-браузера, поместив его в каталог, где хранятся исполняемые файлы-скрипты для Web-сервера, запустив Web-сервер и обратившись к созданному исполняемому файлу:
Вторая часть данного обзора будет посвящена новым возможностям C++Builder 4, связанным с созданием многозвенных систем.
Российское представительство Inprise: Тел.:7(095)238-36-11
e-mail: info@inprise.ru.
КомпьютерПресс 4'1999