gpt4 book ai didi

delphi - 如何完成从内存分配中释放子表单

转载 作者:行者123 更新时间:2023-12-03 19:37:21 24 4
gpt4 key购买 nike

我有下面的示例代码
有人可以解释为什么delphi编译器不释放所有内存分配
对于对象,所以 nil 检查总是正确的。我使用释放方法来销毁 TLoginForm 我没有使用免费方法,因为当在空闲之前或之后调用某些接口(interface)事件时,这给了我异常。

type
TMainForm = class(TForm)
{some stuf}
public
procedure Create(AOwner: TComponent); override;
procedure doLogout();
end;

TChildBase = class(TForm)
{some stuf}
public
procedure Create(AOwner: TComponent); override;
end;

TLoginForm = class(TChildBase)
public
procedure doLogin();
end;

var
MainForm: TMainForm; {<== created automaticaly at runtime}
LoginForm: TLoginForm; {<== created at create event in TMainForm}

implementation

{TLoginForm}
procedure TLoginForm.doLogin;
begin
if true then
begin
{ Do Interfaced Event to main form }
Release;
end;
end;

procedure TMainForm.Create(AOwner: TComponent);
begin
inherited;
FormStyle := fsMDIForm;
LoginForm := TLoginForm.Create(Application); {Create login form}
end;

procedure TMainForm.doLogout;
begin
{ Do Interfaced Event to Child Form except TLoginForm to close}

if LoginForm <> nil then {<== this still alocated at memory}
LoginForm := TLoginForm.Create(Application)
else
LoginForm.Show; {<== Error raised here.}
end;

最佳答案

Release()只是延迟破坏。它发布了 CM_RELEASE给Form发送消息,然后Form调用Free在处理该消息时对自身进行处理。

释放 Form 对象(或任何其他对象,就此而言)不会自动将指向该对象的任何指针设置为 nil。您必须在自己的代码中手动执行此操作。在这种情况下,您可以设置全局 LoginForm TLoginForm 中指向 nil 的指针的析构函数或 OnDestroy事件。

您也可以考虑使用 TLoginForm.OnClose事件而不是调用 Release()直接地。有doLogin()调用Close() ,当窗体实际关闭时,设置事件的 Action caFree 的参数所以表单会释放自己(通过 Release() )。您仍然需要设置全局 LoginForm指向 nil 的指针不过手动。

关于delphi - 如何完成从内存分配中释放子表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419494/

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