我做了一个小程序,在主窗口(Form1)之外,动态建立了一个新的窗口(Form2)。Form1窗口对应的单元文件是“Unit1”;Form2窗口对应的单元文件是“unit2”。
  现在要动态删除新窗口(Form2),问题就来了。
  一是在Form2中不好用“Free”命令删除自己;
  二是如果在Form1窗口中用“Form2.Free”命令,则“Form2”窗口一建立,即被释放。
  三是在“Form2”中用“close”命令,窗口是关闭了,但内存不被释放。
  敬请高手指点指点迷津。
  部分程序如下:
  在Unit1中,implementation之后有:
uses Unit2;
var
  Form2:TForm2;   ......
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2:=TForm2.Create(Self);
  Form2.Show;
  ???
  Form2.Free;
end;  在Unit2中:
unit Unit2;interfaceuses  ... , Unit1;type
  TForm2 = class(TForm)
    procedure Button11Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    ......implementation{$R *.dfm}procedure TForm2.Button11Click(Sender: TObject);
begin
  Close;
end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ???
end;end.

解决方案 »

  1.   

    uses Unit2;
    var
      Form2:TForm2;   ......
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Form2=nil then                               //LGG
        Form2:=TForm2.Create(Self);
      Form2.Show;
      ???
      //  Form2.Free;                                //LGG
    end;  在Unit2中:
    unit Unit2;interfaceuses  ... , Unit1;type
      TForm2 = class(TForm)
        procedure Button11Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        ......implementation{$R *.dfm}procedure TForm2.Button11Click(Sender: TObject);
    begin
      Close;
    end;procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Form2=nil;                               // LGG
      Action:= caFree;                         //LGG
      ???
    end;end.
      

  2.   


      Form2=nil;                               // LGG
      应为 Form2:= nil;
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2:=TForm2.Create(Self);
      Form2.Showmodal;                     这样
      ???
      Form2.Free;
    end;
      

  4.   

    定义一个全局变量Unit1的在{Public}的后面
    Form2_boot:Boolean;Procedure Tform1.Button1Click(Sender:TObject);
    begin
    try
    If Form_boot=False then
    begin
    Form2:=TForm2.Creat(Self);
    Form2.Show;
    Form2_boot:=True;
    end
    else
    begin
    Form2.Free;
    Form2_boot:=False;
    end;
    except
    end;
    end;
      

  5.   

    不要复制上面的代码,因为可能有单词写错了
    查出一个
    Creat应为Create这样你第一次点击按钮窗体创建,第二次点击释放.
      

  6.   

    我采用消息来实现的
    OnCloseQuery发送自定义WM_FreeForm消息给MainForm
    由MainForm负责Free那个Sender
      

  7.   

    学习消息中,
    ly_liuyang(Liu Yang)能说详细一点吗