我想把DLL里的窗体显示在主程序界面上的Panel上,但试了很多方法都有点问题。不在DLL里建立的窗体一点击就能出现,可DLL里的有时能显示有时不能显示。下面是我的代码,是不是方法用错了?
主程序调用DLL代码:
type
  TDllFrm = function (Panel: TPanel; App : TApplication; MainFrm: TForm): Boolean;StdCall;
procedure TForm1.Button1Click(Sender: TObject);
var
  ShowDllFrm : TDllFrm;
  DLLHandle  : THandle;
begin
  ClearPanel;
  DLLHandle := LoadLibrary('Test.dll');
  if DLLHandle <> 0 then
  begin
    @ShowDllFrm := GetProcAddress(DLLHandle, 'ShowFrm');
    ShowDllFrm(panel1, Application, Form1);
  end;
end;
DLL中代码:
function ShowFrm(Panel: TPanel; App : TApplication; MainFrm: TForm): Boolean;StdCall;
begin
   Result := True;
   Application := App;
   Application.Handle := App.Handle;
   Frm_UserDllForm := TFrm_UserDllForm.Create(Application);
   try
     Frm_UserDllForm.Parent := Panel;
     Frm_UserDllForm.Align := alClient; 
     Frm_UserDllForm.Show;
   except
     Result := False;
   end;
end;

解决方案 »

  1.   

    DLL调用就存在很多问题,建议你不用在嵌到主窗体上面,DLL在实际中要用到很参数传递
      

  2.   

    是不是提示什么带“TFont Assign这些错误?时间久忘记错误信息,大概是这个。
      

  3.   

    是不是这个错误"Cannot Assign a font to a font"?一个解决办法:在project->option中,勾选 Runtime Packages。  保证主程序和DLL的编译选项都要使用
      

  4.   

    没错误提示,正常的!只是显示不到Panel上,但关掉能显示在Panel上的窗体后,发现前面点击不能显示的窗体在关闭窗体的后面!
      

  5.   

    我原先做过在dll中动态创建控件然后显示到主窗体上,提示就是我说的这个错误,认为他们的错误信息应该一样的。既然不一样,等其他人来看吧。建议你同时打开两个delphi分别跟踪调试dll和主程序,看到底是什么问题。
      

  6.   

    我以前做MDI窗体的时候碰到过你们说的问题,但现在只是普通的窗体调用。我在DLL直接返回窗体(TForm),再在主程序中接收也是显示不出来,可能是方法有问题!
      

  7.   

    我改成用包的方式,主程序静态调用包里的Form就成功了。但动态调用BPL还是跟DLL一样的问题!