我在Exe中调用Dll窗体,并将Dll中一个主窗体嵌入到Exe主窗体中.Dll其他窗体showmodal显示,但是这些窗体经过windows窗口切换等操作之后,这些窗口会跑到主窗口背后去,怎么处理? 
测试代码如下:exe 主要代码
procedure TForm1.Button1Click(Sender: TObject);
begin
  DllHandle := LoadLibrary(PAnsiChar(ExtractFilePath(Paramstr(0)) + 'Dllp.dll'));  if DllHandle <> 0 then
  begin
    @ShowDllForm := GetProcAddress(DllHandle, 'ShowDllForm');
  end;
  ShowDllForm(Application, Panel1);end;Dll主要代码:///显示Dll窗口 DllFrm1
procedure ShowDllForm(AOwner: TApplication; AParent: TWincontrol);
begin
  Application := AOwner;
  Dllfrm1 := TDllfrm1.Create(Application);
  DllFrm1.ParentWindow := AParent.Handle;
  DllFrm1.Align := alClient;
  DllFrm1.Show;
end;///点击Dllfrm1上按钮显示DllFrm2
procedure TDllfrm1.Button1Click(Sender: TObject);
begin
  with TDllFrm2.Create(Self) do
    ShowModal;
end;
以这种形式载入的Dll窗体, Dllfrm2 经过windows窗口切换,或者在任务栏上多点几次程序图标,Dllfrm2会显示到主窗口后面去,主窗口就无法响应操作.请问这种问题怎么解决. 谢谢

解决方案 »

  1.   

    将Dll中窗口的 FormStyle 属性改成 fsStayOnTop
      

  2.   

    如果不是为别的语言提供调用的dll,而是在本项目中使用,建议使用bpl代替dll实现窗口调用。
    用dll去实现窗口调用会遇见很多问题,解决一个会出现另一个,随着开发的深入,会让你在项目中花费很多精力去处理与业务无关的麻烦,这是delphi的实现机制,即application对象机制决定的,除非你弄懂了delphi最低层的几个源代码文件,否则还是治标不治本的方案。
    如果使用bpl,则项目中一个application统管了包括所有
    分布在不同bpl中的form和vcl,一切麻烦不复存在。
      

  3.   

    1楼的方法经测试是不行的.
    2楼方法应该可行,但还没有试过.我在网上看到有这样实现的能解决这个问题.但会有其他问题出现. 
    procedure ShowDllForm(AOwner: TApplication; AParent: TWincontrol); 
    beign
      application.handle := AParent.Handle;
    end;