Сторнирование соединения Master-Detail в Delphi

У меня есть 2 таблицы, которые связаны с помощью подключения master-detail. Мне нужно, чтобы соединение было отменено при создании Form2 - поэтому основная таблица становится таблицей подробностей, а таблица подробностей становится главной таблицей.

Я попытался сделать это, и программа компилируется, но не работает так, как я хочу (предыдущее соединение разрывается, но не переворачивается, поэтому программа вроде работает так, что таблицы вообще не связаны):

    Form1.ADOTableDetail.MasterSource.Destroy;
    Form1.ADOTableMaster.MasterSource :=  Form1.DataSourceDetail;
    Form1.ADOTableMaster.MasterFields := 'the_field_that_connects_them';

Есть идеи, как мне этого добиться?

3 ответа

Решение

Не разрушайте MasterSource!

Для того чтобы разорвать отношения сделай

Form1.ADOTableDetail.MasterSource:= nil;
Form1.ADOTableDetail.MasterFields:= '';

чем использовать это, чтобы перенаправить MasterDetail

Form1.ADOTableMaster.MasterSource :=  Form1.DataSourceDetail;
Form1.ADOTableMaster.MasterFields := 'the_field_that_connects_them';

Также никогда не звоните .Destroy напрямую, используйте .Free вместо.
Бесплатно делает дополнительную проверку, чтобы увидеть, если ссылка вы Freeing не ноль, предотвращая некоторые нарушения прав доступа.

procedure TForm1.ExchangeMasterDetail;
begin
  ADOTableDetail.Close;
  ADOTableMaster.Close;
  ADOTableMaster.MasterFields := ADOTableDetail.IndexFieldNames;
  ADOTableMaster.IndexFieldNames := ADOTableDetail.MasterFields;
  ADOTableDetail.IndexFieldNames := '';
  ADOTableDetail.MasterFields := '';
  ADOTableDetail.MasterSource := nil;
  ADOTableMaster.MasterSource := DataSourceDetail;
  ADOTableDetail.Open;
  ADOTableMaster.Open;
end;

Просто установите мастер- стол Active уместность false,

Затем делай то, что хочешь, и возвращай true,

Другие вопросы по тегам