Delphi 德尔菲:如何自由形式,通过参数?

Delphi 德尔菲:如何自由形式,通过参数?,delphi,Delphi,我有两个表单,我通过传递参数表单的函数释放表单2。 Delphi关闭表单,但仍按指定方式继续 销毁表单后,仍然显示分配! 见下例: ***对不起,我的英语,我正在使用谷歌翻译 {Procedure to destroy form} procedure TForm1.Destruir(aForm: TForm); begin FreeAndNil(aForm); end; {button create form} procedure TForm1.btnCreateClick(Sender

我有两个表单,我通过传递参数表单的函数释放表单2。 Delphi关闭表单,但仍按指定方式继续

销毁表单后,仍然显示分配! 见下例:

***对不起,我的英语,我正在使用谷歌翻译

{Procedure to destroy form}
procedure TForm1.Destruir(aForm: TForm);
begin
  FreeAndNil(aForm);
end;


{button create form}
procedure TForm1.btnCreateClick(Sender: TObject);
begin
  Form2:= TForm2.Create(nil);
  Form2.Show;
end;

{button Destroy Form}
procedure TForm1.btnDestroyClick(Sender: TObject);
begin
  Destruir(Form2);
end;


{button Verify}
procedure TForm1.btnVerifyClick(Sender: TObject);
begin

  if Assigned(Form2) then
    ShowMessage('Assigned')
  else
    ShowMessage('unAssigned');

end;

您需要将参数pass to
Destruir
作为
var
参数,以便对传递的参数进行修改以修改传递的变量,而不是它的本地副本

procedure TForm1.Destruir(var aForm: TForm);
begin
  FreeAndNil(aForm);
end;

当然,这个函数有点不必要,因为您可以直接调用
FreeAndNil
,而不是调用
Destruir

,您需要将参数pass to
Destruir
作为
var
参数,以便对传递的参数所做的修改能够修改传递的变量,而不是它的本地副本

procedure TForm1.Destruir(var aForm: TForm);
begin
  FreeAndNil(aForm);
end;

当然,这个函数有点不必要,因为您可以直接调用<代码> FreeAndNil <代码>,而不是调用<代码> DESTURIIR < /代码>。< /P> < P>这正是我认为Delphi关于“代码>销毁< /代码>、<代码>免费< /代码>和<代码> FreeAndNil <代码>的文档有点不足之处。它会导致对何时分配引用或何时不分配引用的不现实的加速,以及对常见内存/资源管理错误的理解不足


当有多个变量引用单个对象(或窗体)时,它们都被视为“赋值”,因为它们有一个值;指向共享对象的相同值

这些引用中的任何一个都可以用来“销毁”对象。上述三种方法中的任何一种都足够了
FreeAndNil
将一个传入的引用设置为nil。但是所有其他引用将完全不知道对象已被销毁,并且仍将被视为“已分配”

在代码中,
过程TForm1.Destruir(aForm:TForm)按值获取其参数。这意味着它将复制输入引用。换言之,你有两个参考资料

[Destruir-aForm]-----\
                      [The actual form instance]
[Form2]--------------/
所以当你调用
FreeAndNil(aForm),您仅将
Destruir aForm
设置为nil。而
Form2
仍分配给无效对象

[Destruir-aForm]--(nil)
                      [Nothing here, Form was destroyed.]
[Form2]--------------/
因此,解决问题需要做的是使用var通过引用传递参数。(注意:constvar类似,因为它也是通过引用传递的,但具有不允许更改的限制。)

因此,如果您声明
过程TForm1.Destruir(var-aForm:TForm)则内存看起来有点像以下内容:

                                        [The actual form instance]
[Destruir-aForm]=>[Form2]--------------/
现在当
FreeAndNil(aForm)时
,将
a表单设置为nil它还将
Form2
设置为nil;因为他们都是同一件事。也就是说,
Destruir aForm
不仅仅是一个副本


请注意,您可能无意中使用了
Destruir
中的错误参数声明创建了对Form2的引用副本


但是,当您显式地对同一对象有多个共享引用时,原则是相同的
FreeAndNil
只能将其中一个引用设置为nil。你需要编写你的应用程序,这样你就可以确信你不会试图重用无效的引用。

< P>这正是我认为Delphi关于“代码>销毁< /代码>,<代码>免费< /代码>和<代码> FreeAndNil <代码>的文档有点不足之处。它会导致对何时分配引用或何时不分配引用的不现实的加速,以及对常见内存/资源管理错误的理解不足

[Destruir-aForm]-----\
                      [The actual form instance]
[Form2]--------------/

当有多个变量引用单个对象(或窗体)时,它们都被视为“赋值”,因为它们有一个值;指向共享对象的相同值

这些引用中的任何一个都可以用来“销毁”对象。上述三种方法中的任何一种都足够了
FreeAndNil
将一个传入的引用设置为nil。但是所有其他引用将完全不知道对象已被销毁,并且仍将被视为“已分配”

在代码中,
过程TForm1.Destruir(aForm:TForm)按值获取其参数。这意味着它将复制输入引用。换言之,你有两个参考资料

[Destruir-aForm]-----\
                      [The actual form instance]
[Form2]--------------/
所以当你调用
FreeAndNil(aForm),您仅将
Destruir aForm
设置为nil。而
Form2
仍分配给无效对象

[Destruir-aForm]--(nil)
                      [Nothing here, Form was destroyed.]
[Form2]--------------/
因此,解决问题需要做的是使用var通过引用传递参数。(注意:constvar类似,因为它也是通过引用传递的,但具有不允许更改的限制。)

因此,如果您声明
过程TForm1.Destruir(var-aForm:TForm)则内存看起来有点像以下内容:

                                        [The actual form instance]
[Destruir-aForm]=>[Form2]--------------/
现在当
FreeAndNil(aForm)时
,将
a表单设置为nil它还将
Form2
设置为nil;因为他们都是同一件事。也就是说,
Destruir aForm
不仅仅是一个副本


请注意,您可能无意中使用了
Destruir
中的错误参数声明创建了对Form2的引用副本


但是,当您显式地对同一对象有多个共享引用时,原则是相同的
FreeAndNil
只能将其中一个引用设置为nil。编写应用程序时,您需要确保不会重复使用无效引用。

这些函数的文档很好。这里的问题是关于值参数和变量参数之间的区别。为什么?
[Destruir-aForm]-----\
                      [The actual form instance]
[Form2]--------------/