问题如下:
在菜单中打开了某个MDI子窗口后,如果再次打开这个MDI子窗口,这样就会打开一个和刚才一样的MDI子窗口,可我想不打开新的MDI子窗口,而是把刚才打开的子窗口变成当前的激活状态;也就是说对于同一个MDI子窗口,程序运行时永远只能打开一个,再次打开就会把已经打开的窗口激活。该怎么做?有人提到用这个方法:
if assigned(Mdiform)<>nil then于是我就写成了下面的代码:
下面是运行主窗口的添加菜单的过程
procedure Tform_main.addClick(Sender: TObject);
begin
if assigned(Mdiform)<>nil then
  begin
    Form_add:=TForm_add.Create(Application);  //创建指定MDI子窗口
    Form_add.Show;
  end;
end;可编译通不过!下面是提示:(未定义变量)
[Error] main.pas(143): Undeclared identifier: 'Mdiform'
[Error] main.pas(143): Incompatible types
[Fatal Error] message.dpr(13): Could not compile used unit 'main.pas'本人刚学DELPHI。极菜!请各位大鸟指教。请详细些!!!

解决方案 »

  1.   

    先创建一全局数组存储窗体是否被创建,
    Createshowform(Tpform: TFormClass; pchild: TForm;pstate: integer)
      if not Gb_FormCreate[pstate] then  
        begin
          pchild:=Tpform.Create(nil);
          Gb_form[pstate]:=pchild;
          Gb_form[pstate].WindowState:=wsmaximized;
          Gb_FormCreate[pstate]:=true;
        end关闭窗体时:
    Gb_form[pstate]:=false;
      

  2.   

    可以在子窗体Tag属性中定义,然后调用时验证是否打开。
      

  3.   

    试试这条语句:
    if FrmMain.MDIChildCount =0 then
      begin
      Frm子窗体:=TFrm子窗体.Create(self);
      Frm子窗体.Show;
      end;
    end;
      

  4.   

    上面的语句是检查是否有子窗体打开!如果要检查是否同一个窗体打开(假设子窗体为frmChild):
    if assigned(frmChild)<>nil then
      begin
        FrmChild:=TFrmChild.Create(self);  //创建指定MDI子窗口
        FrmChild.Show;
      end;
      

  5.   

    假定你要show的MDI窗体为FrmChild。if assigned(frmChild)<>nil then
    begin
      FrmChild:=TFrmChild.Create(self);  //创建指定MDI子窗口
      FrmChild.Show;
    end
    else
      FrmChild.BringToFornt;  //把它激活,Show在最前面。
      

  6.   

    你的问题解决了。
    请看procedure Tform_main.addClick(Sender: TObject);
    begin
     //这里是assigned(Form_add),当然这个Form_add必须是你已经定义好的
    if assigned(Form_add)<>nil then 
      begin
        Form_add:=TForm_add.Create(Application);  //创建指定MDI子窗口
        Form_add.Show;
      end
    else
      Form_add.BringToFront;  //把它Show在最前面
    end;
      

  7.   

    给你看看我的代码//ClsFrm 是MDI子窗体的类名称, bRestore 表示是否恢复原大小
    function TFrmMain.ShowMDIChildWindowEx(ClsFrm: TFormClass;
      bRestore: boolean): boolean;
    var
      i: integer;
      frm: TForm;
    begin
      result:= false;
      frm:= nil;
      for i:=0 to self.MDIChildCount-1 do
        if (Self.MDIChildren[i].ClassNameIs(ClsFrm.ClassName)) then begin
          frm:= Self.MDIChildren[i];
          break;
        end;
      try
        if (frm = nil) then begin
          frm:= ClsFrm.Create(self);
          if self.MDIChildCount <= 1 then
            frm.WindowState:= wsMaximized;
        end;  // end of if
        with frm do begin
          if (bRestore) then begin
            if (WindowState = wsMinimized) then
              WindowState:= wsNormal;
          end;
          Show;
        end;
        Result:= true;
      except
        on E: Exception do
          MessageBox(0, pchar('错误。'#10#13'' + E.Message),'', MB_ICONERROR);
      end;
    end;
    使用方法:procedure TFrmMain.actSLogManagerExecute(Sender: TObject);
    begin
      ShowMDIChildWindowEx(TFrmLogManager, true);
    end;
      

  8.   

    if not assigned(<from>) then  <create form>;
    form.show;