В предыдущем примере мы размещали компоненты со страницы 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= "Закрыть таблицу &клиентов";