定义一个窗口实例公用变量
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  fm2:  TForm2;
//在这里定义implementation{$R *.dfm}end.
然后让其它的mdi窗口不自动创建。
注意Tform2是一个mdi子窗口。
这时在菜单里这样写
if fm2<>nil then
   fm2:=Tform2.create(self);
fm2.show;
就可以了

解决方案 »

  1.   

    错了,是
    fm2= nil then
    fm2:=Tform2.create(self);fm2.show;
    对不起
      

  2.   

    这个  fm2:  TForm2;
    好像通不过
      

  3.   

    要么你把fm2向下移
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;//在这里定义implementationvar
      fm2:  TForm2;//定义在这儿
    {$R *.dfm}end.
      

  4.   

    主窗体:
    TMainForm=class(TForm)
      ...
      public
        FSpecChild:TForm;
      ...
      end;创建子窗体时:
    if FSpecChild <> nil then
      FSpecChild := TChildForm.Create(self);
      ...在ChildForm的OnClose事件中:
    implementation
     uses Main;//主窗体的单元.
    ...
    TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      MainForm.FSpecChild := nil;
    end;
      

  5.   

    先让子窗体不自动创建(option里面)然后在显示子窗体的语句里面写上:
    var 
        childform;tchildform;
    begin
        if not assign(childform) then
         childform:=tchildform.create(self);
         childform.show;
    end;
    在子窗体的onclose 事件里面写上:begin
    action:=cafree;
    end;
      

  6.   

    我觉得应该是窗体关闭时将窗体从内存了释放,这样在创建的时候就不会有问题
    释放动作
    TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Action:=caFree;
    end;
      

  7.   

    一点补充,在轻风的帖子中,最后在子窗体的关闭代码中要加上一句
    action:=cafree;
    这样这个帖子就完成了
      

  8.   

    在MDIChild窗体的OnClose事件中,Action是不起作用的,无论你设置为什么,都和caFree是一样的。事实上,MDIChild是不能被隐藏的。
    与此相似的是,在模式窗体被关闭时,都是被隐藏的。
      

  9.   

    最简单的方法:(假设主窗体是form1,按纽是button1,MDIChild窗体是form2)
    1.先将MDIChild窗体设置成不自动建立
    2.按纽事件
      Tform2.create(self);
      button1.enabled:=false;
    3.MDIChild窗体的OnClose事件
      action:=cafree;
      form1.button1.enabled:=true;
    4.OK!
      

  10.   

    主窗体:
    TForm1=class(TForm)
      ...
      public
        FChild:TChildForm;
      ...
      end;创建子窗体时:
    if FChild <> nil then
      FChild := TChildForm.Create(self);
      ...在ChildForm的OnClose事件中:
    implementation
     uses unit;//主窗体的单元.
    ...
    TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      MainForm.FChild := nil;
    end;
      

  11.   

    各位,我今天也正在学习MDI,对上面几位的回复有不明白的地方:
    1、问题很清楚了,就是怎样创建唯一的子窗体实例。在父窗体中声明一个TChildForm的变量是可以的,不过在子窗体中不也有childform:TChildForm;吗,这样:主窗体中implementation uses form2;在创建children的procedure中:if form2 = nil then  form2:=Tform2.create(self);
     在子窗体关闭事件处理中:action:=cafree;form2:= nil;这样可以实现了。
    2、我对释放内存不太理解,为什么已经指明caFree了还要明确写出form2:= nil呢?C中不是这样的。空间释放了之后原先指向该空间的指针等于什么?(在没有赋nil前)
    3、不知道创建form2后的show是否有必要?
    4、当然 halo_hell(死亡阴影)的也很有意思。不过好像是曲线救国。
    5、plainsong(轻风)说的'在MDIChild窗体的OnClose事件中,Action是不起作用的,无论你设置为什么,都和caFree是一样的。'我不明白。
      

  12.   

    procedure TfrmChild1.FormClose(Sender: TObject;
      var Action: TCloseAction);
    begin
      Action:=caFree;
      frmChild1:=nil;
    end;   
    frmMain中button Click 
    if not assigned (frmfrmChild1) then
         frmChild1:=TfrmChild1.Create(nil);另外将子窗体从自动创建的窗体列表中移去。我的答案肯定是对的
      

  13.   

    主窗体:
    TForm1=class(TForm)
      ...
      public
        FChild:TChildForm;
      ...
      end;创建子窗体时:
    if FChild <> nil then
      FChild := TChildForm.Create(self);
      ...在ChildForm的OnClose事件中:
    implementation
     uses unit;//主窗体的单元.
    ...
    TChildForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      MainForm.FChild := nil;
      Action := CAFree;
    end;
    -------------嘻…,拿分-----------
      

  14.   

    怎样判断实例个数?
    例如可以在其他地方创建窗体(用另一个按钮Button2的OnClick):frmchild:=tfrmchild.create(self);
    当用button2创建多个frmchild后,关闭其中的一个,再click上面说的button1,此时有了多个子窗体,但仍然会在生成一个frmchild,怎么办?