Автор: Пользователь скрыл имя, 09 Октября 2011 в 01:57, статья
Borland C++ Builder - выпущенное недавно компанией Borland средство быстрой азработки приложений, позволяющее создавать приложения на языке C++, используя при этом среду разработки и библиотеку компонентов Delphi. В настоящей статье рассматривается среда разработки C++ Builder и основные приемы, применяемые при проектировании пользовательского интерфейса.
Введение
Среда разработки C++ Builder
Компоненты C++ Builder
Свойства компонентов
События
Методы
Менеджер проектов
Создание приложений в С++ Builder
Пример: создание простейшего приложения
Создадим обработчик события OnClick для кнопки Button1:
void __fastcall
TForm1::Button1Click(TObject *Sender)
{
if (Table1->Active)
{
Table1->Close();
Button1->Caption
= "Ioe?uou nienie &eeeaioia";
}
else
{
Table1->Open();
Button1->Caption=
"Cae?uou nienie &eeeaioia";
}
}
Теперь при нажатии на эту кнопку таблица Customer будет то открываться, то закрываться, при этом будет изменяться и надпись на кнопке.
Создадим обработчик события OnClick для кнопки Button2:
void __fastcall
TForm1::Button2Click(TObject *Sender)
{
if (Query1->Active)
{
Query1->Active
= false;
Button2->Caption
= "Ioe?uou список &caeacia";
}
else
{
Query1->Active
= true;
Button2->Caption
= "Заe?uou список &caeacia";
}
}
При нажатии на кнопку Button2 будет то открываться, то закрываться запрос Query1, содержащий список заказов:
Создадим обработчики событий OnClick для радиокнопок RadioButton1 и RadioButton2:
void __fastcall
TForm1::RadioButton1Click(
{
DBGrid1->DataSource
= DataSource1;
}
//----------------------------
void __fastcall
TForm1::RadioButton2Click(
{
DBGrid1->DataSource
=DataSource2;
}
Теперь с помощью этих радиокнопок можно переключаться между списком клиентов и списком заказов.
Создадим обработчик события OnClick для кнопки Button3:
void __fastcall
TForm1::Button3Click(TObject *Sender)
{
if (Table1->Active)
{
Table1->SetRangeStart();
Table1->Fields[0]->AsString
= Edit1->Text;
Table1->SetRangeEnd();
Table1->Fields[0]->AsString
= Edit2->Text;
Table1->ApplyRange();
}
}
Теперь с помощью полей редактирования Edit1 и Edit2 и кнопки Button3 можно выбрать диапазон номеров клиентов для отображения сведений о них в DBGrid1.
Затем с помощью Visual Query Builder установим свойство SQL компонента Query2. Выберем в качестве имени базы данных BCDEMOS и внесем в запрос таблицы CUSTOMER и ORDERS. Затем установим связь между таблицами, проведя линию от поля CustNo в таблице CUSTOMER к полю CustNo в таблице ORDERS.
Внесем в запрос следующие поля:
Рис. 12. Использование Visual Query Builder для создания комбинированного запроса
Теперь отсортируем результаты запроса по номеру покупателя и выйдем из Visual Query Builder.
Используя инспектор объектов, выберем компонент Query2 и установим его свойство Active равным true.
Создадим обработчик события OnClick для RadioButton3:.
void __fastcall
TForm1::RadioButton3Click(
{
DBGrid1->DataSource=
DataSource3;
}
Скомпилируем приложение. Щелкнем кнопками и "Открыть список заказов", чтобы открыть оба набора данных. Попробуем, используя радиокнопки, переключаться между ними.
Рис. 13. Так выглядит готовое приложение
Нажмем кнопку "Открыть список клиентов". Введем значения полей "Начало" и "Конец" (например, 1200 и 1700 соответственно) и затем нажмем кнопку "Установить диапазон". Убедимся, что значения номеров заказов действительно находятся в пределах этого диапазона.
Щелкнем на радиокнопке "Заказы клиентов" и убедимся, что результирующий набор данных действительно содержит сведения из обеих таблиц.
В предыдущем примере мы размещали компоненты со страницы Data Access непосредственно на главную форму приложения. Однако наличие на форме большого количества невидимых компонентов в ряде случаев затрудняет проектирование пользовательского интерфейса. Кроме того, нередко бывает удобно отделить компоненты, отвечающие за доступ к данным и бизнес-логику информационной системы, от интерфейсных элементов, например, для обегчения ее дальнейшей модернизации. Для этой цели в C++ Builder имеется специальный тип, называемый модулем данных - TDataModule. Компонент этого типа можно условно считать специальным видом формы, хотя он и порожден непосредственно от TСomponent. Такой компонент-контейнер может содержать компоненты со страницы Data Access, а сам он не виден пользователю во время выполнения.
Создадим другую версию рассмотренного выше примера с использованием модуля данных. В этом случае компоненты Data Access помещаются в модуль данных, а ссылка на соответствующий h-файл помещается в модуль, связанный с главной формой приложения.
Рис.14. Размещение компонентов доступа к данным в DataModule
Приведем исходный текст модуля, связанного с главной формой новой версии приложения:
//----------------------------
#include <vcl\vcl.h>
#pragma hdrstop
#include"cust1.h"
#include"custdm1.h"//
//----------------------------
#pragmalink"Grids"
#pragmaresource"*.dfm"
TForm1*Form1;
//----------------------------
__fastcallTForm1::TForm1(
{
}
//----------------------------
void__fastcallTForm1::
{
if(DataModule1->Table1->
{
DataModule1->Table1->Close();
Button1->Caption="
}
else
{
DataModule1->Table1->Open();
Button1->Caption="
};
}
//----------------------------
void__fastcallTForm1::
{
if(DataModule1->Query1->
{
DataModule1->Query1->Active=
Button2->Caption="
else
{
DataModule1->Query1->Active=
Button2->Caption="
}
}
//----------------------------
void__fastcallTForm1::
{
DBGrid1->DataSource=
}
//----------------------------
void__fastcallTForm1::
{
DBGrid1->DataSource=
}
//----------------------------
void__fastcallTForm1::
{
DBGrid1->DataSource=
}
//----------------------------
void__fastcallTForm1::
{
if(DataModule1->Table1->
{
DataModule1->Table1->
DataModule1->Table1->Fields[0]
DataModule1->Table1->
DataModule1->Table1->Fields[0]
DataModule1->Table1->
}
}
//----------------------------