我打开一张新表格。每次打开它时都会变慢。我尝试使用FormClose事件FreeAndnil,Free,Release,DisposeOf但不是解决方案。我添加了一个待机计时器:
Button1首先点击,表格2后显示0,18秒
Button1第二次单击,表单2后显示0,20秒
Button1第三次点击,表格2后显示0,23秒
Button1第四次点击,表格2后显示0,28秒 。 。
Button1 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显示按钮" 请参阅备忘录中的增加等待时间。
答案 0 :(得分:1)
好吧,我把你的项目搞砸了一点并让它运转起来,但是你做的很多事情与我正常编程的方式不同。
对于初学者来说,在移动设备中处理表单时,您要使用.DisposeOf,而不是FreeAndNil。请参阅this link,尤其是:
有些情况需要正确执行析构函数代码 离开,不管可能有其他待处理的事实 对象的引用。 [...]新编译器引入了一个dispose 模式:
MyObject.DisposeOf
;
我注意到的另一件事是你的Unit3创建了Form4。但是你有Unit4访问Unit3中的备忘录。我希望这只是为了演示目的,因为我不认为这种设计是建议的。
所以,简要介绍一下我如何使用它:我在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
的私有对象,而不是局部变量。
通过这些更改,我可以根据需要点击显示和关闭,表单将始终快速显示。如果让我知道的话,可以有更好的方法来做到这一点!