我正在打开一个新表单。每次打开时都会变慢。我尝试了FormClose事件FreeAndnil、Free、Release、DisposeOf,但没有尝试解决方案。我添加了一个备用计时器:
按钮1第一次点击,表格2显示0,18秒后
按钮1第二次点击,表格2显示0.2秒后
按钮1第三次点击,在表格2显示0,23秒之后
按钮第四次单击,在窗体2显示0,28秒之后。。.
按钮1 xxxx点击,表格2显示6.30秒后
//Form1 Button1 Click
Application.CreateForm(TFrom2,Form2);
Form2.Show;
//Form2 OnCLose
//i try
//FreeAndNil, Free, Relsease,DisposeOf ...
如何解决这个问题?示例项目来源:https://www.dropbox.com/s/yeqpizr6rfo6254/LeakProblem.rar
尝试20-30次点击"Form2显示按钮"请参阅备忘录中的增加等待时间。
好吧,我把你的项目搞砸了一点,让它发挥了作用,但你做的很多事情与我通常的编程方式不同。
对于初学者来说,在移动设备中处理表单时,您要使用.DisposeOf,而不是FreeAndNil。请参阅此链接,特别是:
在某些情况下,您需要正确执行析构函数代码离开,不管事实上可能还有其他悬而未决的对对象的引用。[…]新编译器引入了一个dispose模式:
MyObject.DisposeOf
;
我注意到的另一件事是您的第三单元创建Form4。但是第四单元访问第三单元的备忘录。我希望这只是为了演示的目的,因为我不认为这种设计是建议的。
因此,简要总结一下我是如何让它工作的:我在Form4中设置了一个TNotifyEvent
,用于它完成时:
procedure TForm4.Button1Click(Sender: TObject);
begin
if assigned(FOnCloseEvent) then
FOnCloseEvent(Self);
end;
在Uni3中,我在创建表单时设置了一个处理程序:
MyForm.OnCloseEvent := CloseEvent;
事件触发此代码:
procedure TForm3.CloseEvent(Sender: TObject);
begin
if assigned(MyForm) then
MyForm.DisposeOf;
end;
我还将MyForm
作为TForm3
的私有对象,而不是局部变量。
有了这些变化,我可以随心所欲地表演和结束,而且形式总是会很快展现出来。如果有更好的方法,请告诉我!