Использование контейнера TDataModule
Компонент типа TDataModule представляет собой контейнер, в который вмещаются компоненты TTable, TQuery, DataSource и т.д. Создать экземпляр dataModule можно, выбрав в среде Delphi пункт меню File|NewDataModule. Компонент TDataModule похож на форму (TForm) в том отношении, что служит контейнером для иных компонентов. Однако, в отличие от TForm, в dataModule можно помещать только невизуальные компоненты для работы базами данных. Связь компонентов TDataSource, TTable и TQuery, расположенных в DataModule, производится так же, как если бы они были расположены в одной форме.
TDataModule нужно сохранить под каким-либо именем и добавить имя модуля unit, в котором описан TDataModule, в текст модулей unit всех иных рм приложения, которые будут использовать НД и TDataSource, положенные в этом TDataModule. Это производится в главном меню среды delphi, в элементе меню File|Use Unit.
В дальнейшем визуальные компоненты, работающие с данным НД, должны в своем свойстве DataSource содержать имя соответствующего компонента
TDataSource из TDataModule. При этом имя является составным: сначала идет имя компонента TDataModule и затем через точку - имя компонента TDataSource, например, DataModulel.DataSource1.
Перепишем предыдущий пример для использования механизма TDataModule. Для этого добавим в приложение компонент DataModule1 и разместим в нем компоненты Table1 (связанный с ТБД "Сотрудники кафедры") и DataSourcel (связанный с DataModulel.Table1).
Тогда в родительской форме установим свойство DBGrid1.DataSource = DataModulel .DataSourcel; в дочерней форме установим свойства DataSource всех компонентов, работающих с отдельными полями ТБД "Сотрудники кафедры" (в данном случае это компоненты TDBEdit) равными DataModulel .DataSourcel. При этом не будем забывать о заполнении свойства DataField этиx компонентов, иначе компоненты TDBEdit не будут связаны с полями. Пример компонента TDataModule с размещенными в нем компонентами TTable и TDataSource показан на рис. 8.37.
Виды родительской и дочерней форм во время разработки приложения показаны соответственно на рис. 8.38 а) и б).
Как видно из рисунков, в формах PrntForm и ChldForm напрочь отсутствуют компоненты TTable и TDataSource, связанные с ТБД "Сотрудники кафедры".
Приведем обработчики событий для обеих форм:
Родительская форма
// нажата кнопка "Вставить"
procedure TPrntForm.InsertButtonClick(Sender: TObject);
begin
DataModulel.Table1.Insert;
ChldForm.ShowModal ;
end;
// нажата кнопка "Изменить"
procedure TPrntForm.EditButtonClick(Sender: TObject);
begin
DataModulel.Table1.Edit;
ChldForm.ShowModal ;
end;
// нажата кнопка "Удалить"
procedure TPrntForm.DeleteButtonClick(Sender: TObject);
begin
IF MessageDIg('Подтвердите удаление записи',
mtInformation, [mbYes, mbNo], 0) = mrYes THEN DataModulel.Table1.Delete;
end;
Дочерняя форма
// обработчик нажатия клавиши "Запомнить"
procedure TChldForm.PostButtonClick(Sender: TObject);
begin
TRY
DataModulel.Table1.Post;
// при успешном выполнении Post выходим из модальной формы:
ChldForm.ModalResult := mrOk;
EXCEPT
on EDBEngineError do begin
ShowMessage('Дублирование ключевого поля!');
DBEdit1.SetFocus; // возвращаемся на 1 поле DBEdit
end; {on}
ELSE
begin
ShowMessage('Ошибка иного типа при Post');
DBEdit1.SetFocus;
end;
END; {try}
end;
// нажата кнопка "Отменить" (ModalResulfc = mrCancel)
procedure TChldForm.CancelButtonClick(Sender: TObject);
begin
DataModulel.Table1.Cancels;
end;