Создание отдельной формы
Этот пример аналогичен приведенному в разделе "Создание отдельной формы для изменения записи ПД. Форма добавления 1корректировки записи с использованием механизма совмещения курсоров ".
Отличия в реализации следующие. Во-первых, НД переводится в состояние Insert или Edit в родительской форме. Во-вторых, в дочерней форме доступ к НД осуществляется переадресацией DataSource во время выполнения.
Родительская форма:
// нажата кнопка "Вставить"
procedure TPrntForm.InsertButtonClick(Sender: TObject);
begin
PrntForm.Table1.Insert;
ChldForm.ShowModal;
end;
// нажата кнопка "Изменить"
procedure TPrntForm.EditButtonClick(Sender: TObject);
begin
PrntForm.Table1.Edit;
ChldForm.ShowModal;
end;
// нажата кнопка "Удалить"
procedure TPrntForm.DeleteButtonClick(Sender: TObject);
begin
IF MessageDIg('Подтвердите удаление записи', mtlnformation, [mbYes, mbNo], 0) = mrYes THEN PrntForm.Table1.Delete;
end;
Дочерняя форма:
// обработчик активизации дочерней формы
procedure TChldForm.FormActivate(Sender: TObject);
begin
// при активизации дочерней формы ее DataSource указывает на НД из родительской формы
ChldForm.DataSourcel.DataSet := PrntForm.Table1;
end;
// обработчик нажатия клавиши "Запомнить"
procedure TChldForm.PostButtonClick(Sender: TObject);
begin
TRY
PrntForm.Table1.Post;
// при успешном выполнении Post выходим из модальной формы:
ChldForm.ModalResult := mrOk;
EXCEPT
on EDBEngineError do begin
ShowMessage('Дублирование ключевого поля!');
DBEditI.SetFocus; // возвращаемся на 1 поле DBEdit
end; {on}
ELSE
begin
ShowMessage('Ошибка иного типа при Post');
DBEditI.SetFocus;
end;
END; {try}
end;
// нажата кнопка "Отменить" (ModalResulfc = mrCancel)
procedure TChldForm.CancelButtonClick(Sender: TObject);
begin
PrntForm.Table1.Cancel;
end; ,
// обработчик события деактивизации дочерней формы DataSource дочерней формы указывает в "пустоту";
// принудительный перевод НД в состояние Browse, если на момент выхода из дочерней формы НД находится
// в ином состоянии
procedure TChldForm.FormDeactivate(Sender: TObject);
begin
ChldForm.DataSourcel.DataSet := nil;
IF PrntForm.Table1.State <> dsBrowse THEN
PrntForm.Table1.Cancel;
end;
// обработчик события создания формы
procedure TChldForm.FormCreate(Sender: TObject);
begin
// DataSource дочерней формы изначально указывает в "пустоту"
ChldForm.DataSourcel.DataSet := nil;
end;