Сторнирование соединения Master-Detail в Delphi - PullRequest
3 голосов
/ 22 мая 2011

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 22 мая 2011

Не уничтожайте MasterSource!

Чтобы разорвать отношения, сделайте

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

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

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

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

3 голосов
/ 22 мая 2011
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;
0 голосов
/ 26 октября 2013

Просто установите Master table Activeроприличность на false.

Затем сделайте то, что вы хотите сделать, и установите его обратно на true.

...