gpt4 book ai didi

delphi - 创建后如何更改 DataModule 的所有者?

转载 作者:行者123 更新时间:2023-12-03 18:57:16 27 4
gpt4 key购买 nike

我正在尝试将 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 更改为表单上的一个属性。然后我可以先创建表单,然后创 build 置所有者的数据模块,最后在表单上设置属性。我正在尝试在这个项目上使用构造函数依赖注入(inject)。当我有一个将主表单传递给多个表单的共享数据模块时,它一直工作得很好。在这种情况下,主窗体会保留数据模块,直到它存在。在这种情况下,只有一个表单需要这个数据模块,所以我想通过设置所有者来强制它管理数据模块的生命周期。

另一种选择是在我关闭第二个表单时显式释放 DataModule。但是,该表单无法知道调用者是否也将数据模块传递给了不同的表单。

有没有办法使用构造函数来注入(inject)我的对象,但仍然获得表单来管理生命周期?

目前使用德尔福XE3。

最佳答案

使用 NewOwner.InsertComponent(TheComponent) 可以更改组件的所有权.由于一个组件一次只能由一个组件拥有,因此 RTL 会自动从前一个所有者那里移除所有权。

但...

Another option would be to explicitly free the DataModule when I close the second form. However that form has no way of knowing if the caller also passed the datamodule to a different form.



如果您希望将单个 DataModule 传递给多个 Form,那么更改 DataModule 的所有权不是解决方案:拥有 DataModule 的一个 Form 将无法决定是否可以释放 DataModule。因此,结论是 DataModule 不能被任何表单拥有,除了 MainForm。 (那么我宁愿让它由 Application 对象拥有,但这是一个品味问题。)

随后,您将需要在 DataModule 中为它所附加的表单提供一个引用计数机制。

关于delphi - 创建后如何更改 DataModule 的所有者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20554287/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com