【发布时间】:2013-12-12 21:08:08
【问题描述】:
我正在尝试将 DataModule 传递给表单构造函数中的表单。我还希望表单成为 DataModule 的“所有者”,以便表单在关闭时破坏 DataModule。这产生了两个对象在其构造函数中相互需要的问题。
我试图在创建后设置 DataModule 的所有者,但这是一个只读属性。
我的第二个表单如下所示:
type
TSecondPopup = class(TForm)
private
FMyData: TMyData;
public
constructor Create(MyData: TMyData); reintroduce;
end;
var
SecondPopup: TSecondPopup;
implementation
{$R *.dfm}
constructor TSecondPopup.Create(MyData: TMyData);
begin
FMyData := MyData;
inherited Create(nil);
end;
我的数据模块中没有特殊代码。
在我的主窗体中,我想在显示第二个窗体时做这样的事情:
procedure TMainApp.Button1Click(Sender: TObject);
var
MyData: TMyData;
SecondPopup: TSecondPopup;
begin
MyData := TMyData.Create(nil);
SecondPopup := TSecondPopup.Create(MyData);
// Can't change owner now. It is a read only property.
// MyData.Owner := SecondPopup;
SecondPopup.Show;
end;
我知道我可以将 DataModule 更改为表单上的一个属性。然后我可以先创建表单,然后创建设置所有者的数据模块,最后在表单上设置属性。我正在尝试在这个项目上使用构造函数依赖注入。当我有一个将主表单传递给多个表单的共享数据模块时,它一直工作得很好。在这种情况下,主窗体会保留数据模块,直到它存在。在这种情况下,只有一个表单需要这个数据模块,所以我想通过设置所有者来强制它管理数据模块的生命周期。
另一种选择是在我关闭第二个表单时显式释放 DataModule。但是,该表单无法知道调用者是否也将数据模块传递给了不同的表单。
有没有办法使用构造函数来注入我的对象,但仍然获得表单来管理生命周期?
目前使用 Delphi XE3。
【问题讨论】:
-
所有者是只读的,创建后我找不到更改它的方法。
-
您可以更改所有权,使用 RemoveComponent、InsertComponent。虽然我不明白这个问题..
-
你想让他们拥有彼此?
-
否 - 表单使用并拥有数据模块。如果我只是在表单的创建中创建它,那将不是问题。但是我试图将 DataModule 传递到表单中。我已经阅读了太多关于依赖注入、IoC 和单元测试的文章。我想我只需要放弃并回到我知道可行的简单设置:-)。
-
这对我来说似乎很愚蠢。为什么?为什么要这样做?
标签: delphi