Borland C++ Builder

       

Модули данных


В предыдущем примере мы размещали компоненты со страницы 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();

}

}

//----------------------------------------------------


Содержание раздела