如何在多文档界面里显示模态窗口, 就是不关闭当前窗口,不能对主窗口进行操作。

解决方案 »

  1.   

    你试一下。
    不行,出现一个错误提示。cannot make a visible window modal.
      

  2.   

    首先保证窗体不是自动生成的,在Project->Option->forms里把自窗体从Auto区移出
    然后动态生成此窗体,showmodal出
    例:
    Application.CreateForm(TFrmLogOn, FrmLogOn);
      with FrmLogOn do
      begin
        ShowModal;
      end;
      FreeAndNil(FrmLogOn);
      

  3.   

    楼上。
    你说的这些在单文档界面里可以.但是在多文档界面里是不行的
    它的用途很广泛。
    像WPS2000 里面,文件编辑好以后对文档进行加密,打开加密窗口以后,就禁止对主窗口进行操作.动态生成窗体也不行,象下面这样
      Application.CreateForm(TloginForm, loginForm);
      loginform.Showmodal;
      

  4.   

    我是一只菜鸟,只能说说自己的想法,实现就不行了。希望大家看了我的想法不要笑我。
    方法一:将鼠标限制在当前窗体中。
    方法二:在主Form中所有控件的OnMouseMove事件中,判断是否有MDI Form,并且Form的Windowstate属性不是wsMinimized,如果有的话,将鼠标弹进MDI Form中。
    方法三:在MDI窗体Show的时候,干脆将主Form中的东东统统Disable掉,关闭或最小化MDI Form时再Enable.
      

  5.   

    楼上的,你说的第一种方法到是容易实现,mapwindowpoint 以及 clipcursor 就可以搞定
    但是 何时来解除呢 ?
      

  6.   

    像WPS2000 里面,文件编辑好以后对文档进行加密,打开加密窗口以后,就禁止对主窗口进行操作.并且鼠标可以在桌面任何位置移动
      

  7.   

    可以在父窗体的某一事件中用窗体的动态生成来完成:
    example:Form1 := TForm1.Create(Application);
      try
        Form1.ShowModal;   //将窗体以实模显示,也就是说不关闭Form1不能对父窗体操作
      finally
        Form1.Free;
        Form1 := nil;
      end;不过要先将Form1在应用程序创建中拿掉,不然就会出现两个Form1
      

  8.   

    to:  xiaoyuer0851(小鱼儿0851) 可以在MDI Form最小化或关闭的时候还原。(不过如果使用Win+M,Win+Tab等热键,就不晓得如何处理了)如下:
    在  private 中定义:
    procedure WMSysCommand(var Msg: TWMSysCommand);
    message WM_SYSCOMMAND;在程序部份加入:
    procedure TForm2.WMSysCommand(var Msg: TWMSysCommand);
    var
      btScreen: TRect;
    begin
      if (Msg.CmdType = SC_MINIMIZE) or
    //     (Msg.CmdType = SC_MAXIMIZE) or
         (Msg.CmdType = SC_Close) then
      begin
        btScreen := Rect(0, 0, Screen.Width, Screen.Height);
        ClipCursor(@btScreen);
        inherited;
      end;
    end;
      

  9.   

    to guosq(郭子) :
    第三种方法不能达到你的要求吗?
      

  10.   

    fireking88(秋水) :据我所知,多窗体是不可以ShowModal的,Visible属性也不可以设为False。如果可以,请告诉我方法。
      

  11.   

    终于做出来了,一定要给分哦!!有问题可以QQ找我:(
    program Project1;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Form2},
      Unit3 in 'Unit3.pas' {Form3};{$R *.res}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);//先创建mdi主窗体
      try
        form2:=Tform2.Create(application);//form2为一个非子窗体
        form2.ShowModal ;
      finally
       if form2.Button1.ModalResult =1 then
         Halt
       else
       begin  
      Application.CreateForm(TForm3, Form3);
      Application.CreateForm(TForm2, Form2);
      application.Run;
      end;
      end;
    end.procedure TForm2.Button1Click(Sender: TObject);
    begin
     //在此之前天加数据验证
       self.ModalResult :=mrOk;end;procedure TForm2.Button2Click(Sender: TObject);
    begin   self.Button1.ModalResult:=mrcancel;
       application.terminate;
    end;end.