我如何从记忆中摧毁(免费)一张表格?

Use*_*ser 1 delphi delphi-xe

我的项目中有2个Form(Form1和Form2),Form1是自动创建表单,但Form2是可用表单.我怎么能创建Form2并卸载Form1?

我在此代码中收到"访问验证"错误.

这是Form1代码:

1.  uses Unit2;
//*********
2.  procedure TForm1.FormCreate(Sender: TObject);
3.  var a:TForm2;
4.  begin
5.      a := TForm2.Create(self);
6.      a.Show;
7.      self.free;  // Or self.destory;
8.  end;
Run Code Online (Sandbox Code Playgroud)

谢谢.


我将"Serg"代码修改为:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.CreateForm(TForm2, Form2);
  Release;
end;

end.
Run Code Online (Sandbox Code Playgroud)

///

program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Form1:= TForm1.Create(Application);
  Application.Run;
end.
Run Code Online (Sandbox Code Playgroud)

但是这个项目开始然后自动退出,为什么?我想显示Form1,当我们单击Button1然后显示Form2和免费(Release)Form1.我怎么能这个?

Too*_*the 12

当您销毁表单时,最好使用Release.

版本与免费版本几乎相同,但它会等待待处理的消息以避免崩溃.

你永远不应该使用Destroy.Free/Release调用析构函数.

Self是当前对象(在你的代码Form1中,所以self.Free杀死了当前的表单.这导致访问冲突.Form1是自动创建的,它也被自动销毁,所以你不应该自己销毁它.如果你不想要它,隐藏它.

如果您想稍后处理它,您应该保留对新创建的表单的引用.

您修改后的代码应该是:

uses Unit2;

TForm1 = class (TForm)
private
  FChild : TForm2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FChild := TForm2.Create(nil);
  Hide; // Hides form 1
  FChild.Show;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  FChild.Release;
end;
Run Code Online (Sandbox Code Playgroud)

但是为什么要在创建第一个表单的表单中创建另一个表单.为什么不完全删除第一个表单而只使用第二个表单(自动创建)?