先说一下要求,一个应用程序运行期间创建一个主窗体,然后创建一个无模式窗体,无模式窗体在windows任务栏占有一个独立的标签,要求主窗体和无模式窗体可以独立接受用户输入。
要求说完了,说说测试过程。
创建一个应用程序,建立一个窗体form1,再建立一个窗体form2,然后form1上加入2个button,1个button通过show方法启动form2,form2使用一些方法可以在任务栏显示标签,在另外一个button里showmessage一个模式消息框。
测试过程很简单,但是有个问题很麻烦,就是不显示消息框时,form1和form2都能接收用户点击消息,都能操作,但是显示了消息框以后,按道理消息框是模式对话框,form1不能接收用户输入,form2应该还能接收用户输入,但是实际情况是form1、form2都不能接收用户输入了,有没有什么办法让form2还能接收用户输入。另在vc和c#上都测试过,MFC的窗口就没问题,但是C#效果和delphi一样。
多窗口无模式

解决方案 »

  1.   

    unit1:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2 := TForm2.Create(self);
      Form2.Show;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ShowMessage('sdfs');
    end;unit2就是基本窗口,没有额外代码
      

  2.   

    好像没办法,Form1和Form2是共用的一个Application。
      

  3.   

    但是我很奇怪MFC的类似例子就是没有这个问题的
    难道vcl的ShowModal和MFC的Domodal实现不一样,要重载自己写ShowModal?
      

  4.   

    Form2 与 Form1 是父子关系
    你的VC代码怎么写的,应该不是父子关系吧
      

  5.   

    这个父子关系无所谓的,我试过非父子关系,把owner\parent都改为其他对象或者窗口,但是效果都一样
    MFC里无模式窗口就试了一种,没有父对象的窗口类,效果很自然就行
      

  6.   

    自己感觉还是DoModal实现不一样,vcl把本程序的所有消息都接收了,MFC仅仅接收了父对象窗口范围内的消息,本程序其他窗口的消息还是正常派发了,C#和delphi是一个效果,估计同一个设计师把vcl机制带过去了。
      

  7.   

    窗口创建无非就是CreateWindow和CreateWindowEx,你可以跟进去看看TForm.Create调用的这两个函数时候的参数
      

  8.   

     Form2 := TForm2.Create(self);
    改成
     Form2 := TForm2.Create(Application);
      

  9.   

    找到解决方法了,不过局限性还是比较大,重载ShowDoModal方法
      

  10.   

    应该是不行的,这是Delphi模式窗口的一个机制,ShowMessage弹出的也是一个模式窗口,Application弹出模式窗口后,其后面的所有窗口都无法获得焦点。
      

  11.   

    ShowModal方法会把本线程内所有非最新弹出的窗口都禁掉,这样随便其他什么正常的方法都不行,只能重载ShowModal方法,把不想让他禁掉的窗口恢复回来就可以了。
    不过这样要求程序中所有的模式对话框都要继承自这个重载过ShowModal方法的类才行
      

  12.   

    当然程序中模式对话框只能使用继承自重载过ShowModal方法的窗体类,其他的都不能用,当然包括ShowMessage这种函数
      

  13.   

    建议生成两个执行程序,由两相互调用打开。两个都是Application,都在任务栏有图标,都可以激活录入数据。完全符合你的要求。