// .h #ifndef mainfmH #define mainfmH //--------------------------------------------------------------------------- #include #include #include #include #include #include "maindm.h" #include #include //--------------------------------------------------------------------------- class TfmMain : public TForm { __published: // IDE-managed Components TPageControl *pgMain; void __fastcall pgMainChange(TObject *Sender); void __fastcall FormDblClick(TObject *Sender); private: // User declarations TdmMain *dmMain; TDBGrid * __fastcall getCurrentGrid(); public: // User declarations __fastcall TfmMain(TComponent* Owner); __fastcall TfmMain(TComponent* Owner, TADOConnection *db); }; //--------------------------------------------------------------------------- extern PACKAGE TfmMain *fmMain; //--------------------------------------------------------------------------- #endif // .cpp //--------------------------------------------------------------------------- #include #pragma hdrstop #include "mainfm.h" #include "addedit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TfmMain *fmMain; //--------------------------------------------------------------------------- __fastcall TfmMain::TfmMain(TComponent* Owner) : TForm(Owner),dmMain(Owner) { //тут пишете код, в котором инициализируете подключение к БД. Если БД уже подключена - используется другой конструктор } __fastcall TfmMain::TfmMain(TComponent* Owner, TADOConnection *db) : TForm(Owner),dmMain(Owner,db) { dmMain->loadPages(this->pgMain); dmMain->loadReference(getCurrentGrid()); } //--------------------------------------------------------------------------- TDBGrid * __fastcall TfmMain::getCurrentGrid() { if(pgMain->ActivePageIndex == -1)return; TDBGrid* db = NULL; for(int i = 0; i < this->ComponentCount; ++i){ if(this->Components->ClassName()!= "TDBGrid")continue; db = dynamic_cast<"TDBGrid">(this->Components); if(db->Parent == pgMain->ActivePage) break; } return db; } void __fastcall TfmMain::pgMainChange(TObject *Sender) { dmMain->loadReference(getCurrentGrid()); } //--------------------------------------------------------------------------- void __fastcall TfmMain::FormDblClick(TObject *Sender) { TStringList *ls; TfmAddEdit *fm; try{ fm = new TfmAddEdit(NULL); //получаем перевичный ключ fm->id = dmMain->adoQuery->Fields->FieldByNumber(0)->AsInteger; //тут получаем параметры наших полей из доптаблицы в список ls = new TStringList; dmMain->loadReferenceFields(ls); //тут обрабатываем наш список - как создавать объекты и инициализировать их параметры // показано выше. не забывайте проверять высоту формы и высоту объектов ... } __finally{ if(fm)delete fm; if(ls)delete ls; } } //--------------------------------------------------------------------------- Код модуля данных: // .h //--------------------------------------------------------------------------- #ifndef maindmH #define maindmH //--------------------------------------------------------------------------- #include #include #include #include #include #include #include #include //--------------------------------------------------------------------------- class TdmMain : public TDataModule { __published: // IDE-managed Components TADOConnection *adoConnect; TADOQuery *adoQuery; TDataSource *dsQuery; TADOQuery *adoExecute; private: // User declarations public: // User declarations __fastcall TdmMain(TComponent* Owner); __fastcall TdmMain(TComponent *Owner, TADOConnection *db); void __fastcall loadPages(TPageControl* pg,const int index = 0); void __fastcall loadReference(TDBGrid *gb); void __fastcall loadReferenceFields(TStrings *ls); }; //--------------------------------------------------------------------------- extern PACKAGE TdmMain *dmMain; //--------------------------------------------------------------------------- #endif //--------------------------------------------------------------------------- #include #pragma hdrstop #include "maindm.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" #include "mainfm.h" TdmMain *dmMain; //--------------------------------------------------------------------------- __fastcall TdmMain::TdmMain(TComponent* Owner) : TDataModule(Owner) { } void __fastcall TdmMain::loadPages(TPageControl *pg, const int index) { TTabSheet *tab; adoExecute->SQL->LoadFromFile("loadreferense.sql"); adoExecute->Active = true; while(!adoExecute->Eof){ tab = new TTabSheet(pg); tab->Name = adoExecute->FieldByName("tablename")->AsString; //так же настраиваем другие параметры если надо TDBGrid *grid = new TDBGrid(tab); grid->Name = "gd"+tab->Name; grid->Parent = tab; grid->Tag = adoExecute->FieldByName("referenceid")->AsInteger; grid->Align = alClient; grid->OnDblClick = fmMain->OnDblClick; //устанавливаем обработчик двойного клика adoExecute->Next(); } if(pg->PageCount > index) pg->ActivePageIndex = index; else pg->ActivePageIndex = 0; } void __fastcall TdmMain::loadReference(TDBGrid *gb) { if(!gb)return; adoQuery->Active = false; adoQuery->LoadFromFile(gb->Name+".sql"); adoQuery->Active = true; gb->DataSource = dsQuery; } //---------------------------------------------------------------------------