отдельные экземпляры набора данных с использованием модулей данных в Delphi - PullRequest
3 голосов
/ 20 июля 2011

Я использую Delphi6 и у меня есть модуль данных с ADO DataSet, который используется двумя формами, formA и FormB.Каждая форма имеет Dataset.Open() в OnCreate и Dataset.Close() в OnClose.Если обе формы открыты одновременно и форма B закрыта, набор данных закрывается в форме A.Как я могу предотвратить это, по сути, мне нужны отдельные экземпляры набора данных для каждой формы, но в то же время использовать модуль данных.

Ответы [ 4 ]

3 голосов
/ 20 июля 2011

Самый простой способ достичь желаемого - создать экземпляр модуля данных для каждой формы и передать его в форму, чтобы его можно было освободить при закрытии формы:

var
  Data: TDataModule;
begin
  Data := T<YourDataModule>.Create(Self);
  try
    Form := T<YourForm>.Create(Self);
    Form.DataModule := Data;
    Data.Name := '';
  except
    Data.Free;
    raise;
  end;

  Form.Show;
end;

Установка имени модуля DataModule в пустую строку выполняется для обеспечения того, чтобы логика VCL для подключения элементов управления, осведомленных о данных, к их источнику данных / набору данных выполнялась с использованием вновь созданного экземпляра вместо первого в истории экземпляра.

В обработчике формы OnClose (или его деструкторе) обязательно освободите модуль данных.

3 голосов
/ 20 июля 2011

Возможно, вам нужен отдельный экземпляр от модуля данных для каждой формы.

Если вы действительно хотите использовать тот же экземпляр модуля данных форма обе формы, то вы должны открыть и закрыть набор данных из модуля данных, добавив несколько механизм подсчета ссылок.

Как правило, вы делаете это, имея процедуру для открытия набора данных и одну для его закрытия в модуле данных и целое число для подсчета вызовов открытия и закрытия. Процедура, которая открывает набор данных, фактически открывает его только при первом вызове, при любом последующем вызове просто увеличивает счетчик. Процедура сближения уменьшает значение счетчика при каждом вызове и закрывает базу данных, когда значение счетчика уменьшается до 0.

0 голосов
/ 20 июля 2011

Поскольку вы сказали, что вам нужны отдельные экземпляры, тогда мое решение будет иметь переменную Datamodule в каждом объявлении формы:

TForm1 = class(TForm)
...
private
  fDatamodule : TDatamodule1;
...
end;

procedure TForm1.FormCreate(Sender : TObject)
begin
  fDatamodule := TDatamodule1.Create(self);
  MyDatasource.Dataset := fDatamodule.MyDataset;
end;

(повторите для формы 2 и т. Д.)

У вас естьодин и тот же модуль данных, созданный дважды и, таким образом, полностью отделенный друг от друга, но использующий одну и ту же бизнес-логику в каждой форме.

Пока речь идет об объекте, убедитесь, что код модуля данных не содержит ссылки ни на одну из форм.Это плохая практика.

0 голосов
/ 20 июля 2011

Пытаетесь ли вы одновременно обращаться к одному и тому же набору данных из FormA и FormB при отображении разных данных, если это так:

Используйте TClientDataSet и TDataSetProvider для загрузки данных из вашего набора данных ADO.Затем клонируйте курсор, используя ClientDataSet.CloneCursor, вы получите отдельный курсор для тех же данных.Затем передайте их формам или назначьте элементы управления FormA ClientDataSetA и FormB клону ClientDataSetB.Чтение, запись и обновления из обеих форм изменяют базовый набор данных, который затем может применить обновления к базе данных через набор данных ADO позже с помощью DataSetProviders ApplyUpdates.

Здесь можно найти некоторую помощь: http://www.podgoretsky.com/ftp/docs/Delphi/D5/dg/5_ds3.html Илиесть действительно хорошая книга Кэри Дженсона: http://www.jensendatasystems.com/cdsbook/ (бесплатный плагин, но это хорошее чтение)

...