В предыдущем примере мы размещали
компоненты со страницы 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" // Ссылка на модуль данных
//-----------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
//-----------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (DataModule1->Table1->Active)
{
DataModule1->Table1->Close();
Button1->Caption = "Открыть таблицу &клиентов";
}
else
{
DataModule1->Table1->Open();
Button1->Caption= "Закрыть таблицу &клиентов";
};
}
//-----------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (DataModule1->Query1->Active)
{
DataModule1->Query1->Active = false;
Button2->Caption = "Открыть таблицу &заказов";}
else
{
DataModule1->Query1->Active = true;
Button2->Caption = "Закрыть таблицу &заказов";
}
}
//-----------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
DBGrid1->DataSource = DataModule1->DataSource1;
}
//-----------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
DBGrid1->DataSource = DataModule1->DataSource2;
}
//-----------------------------------------------------
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
DBGrid1->DataSource = DataModule1->DataSource3;
}
//----------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (DataModule1->Table1->Active)
{
DataModule1->Table1->SetRangeStart();
DataModule1->Table1->Fields[0]->AsString = Edit1->Text;
DataModule1->Table1->SetRangeEnd();
DataModule1->Table1->Fields[0]->AsString = Edit2->Text;
DataModule1->Table1->ApplyRange();
}
}
//----------------------------------------------------
|