为什么DLL中的Form就不能Dock到Exe?

时间:2021-04-19 20:14:59
tbcMain: TTabControl;//tbcMain.DockSite := True;
  vFormClass: TFormClass;
  vForm: TForm;
------------------------------------   
  if tbcMain.DockClientCount > 0 then
    for i := 0 to tbcMain.DockClientCount - 1 do
      tbcMain.DockClients[i].Free;
  if tbcMain.DockClientCount = 0 then
    try
      vForm := vFormClass.Create(Self);
      vForm.Align := alClient;
      vForm.Dock(tbcMain, BoundsRect);
      vForm.Show;
    except
      vForm.Free;
    end;//end of try
---------------------------------------
问题:vFormClass是从某个DLL中获得的Form类(类似TForm1),如果去掉Dock语句,Form也能Show出来而且运行正常,加上Dock就没反映了,步进跟踪时发现Form创建了就是没显现出来.
另外,如果vFormClass是本Project中的Form类,Form也可以被正确的Dock,运行正常。
怎么解决这个问题,实现Dock DLL's Form?
---------------------------------------
要分可以再加,我的可用分还有好多!!!!!

10 个解决方案

#1


你是这个意思吗?
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(self);
  Form2.Parent := Panel1;
  Form2.Align := alClient;
  Form2.Show;
end;

#2


不是,要的问题的关键是直接使用Project中的Form可以实现Dock,利用调用Dll函数中传过来的TFormClass类型的变量来创建Form时,不能实现Dock功能

关键:Dock Dll's Form!!!!
---------------------------------

请楼下的不要再走偏了,谢谢!!!!

#3


borland的包括delphi、C++Builder制作出的包含窗体和其他可视VCL组件dll文件工作起来都有一些不可克服的问题:焦点获得和转移、停靠、主控程序和DLL中VCL组件的互操作等,原因非常复杂,解决起来难度大,主要原因是主控程序和DLL中均有一个Application、Screen对象,虽然在调用时用主Application、Screen替代dll中相关对象可解决部分问题,但总体上基本上没有好办法可用。
建议用Bpl代替dll,由于BPL是面向对象的,整体工程中只有一个application和screen对象,则所有问题都不复存在。

#4


可以的,比较麻烦而已

#5


to aiirii(ari-淘金坑) 
怎么实现?????

#6


传递Application, Screen的址址到Dll中应该就可以实现的,因为我实现过DLL+MDI
我想原理是一样的吧,别忘了在退出的时间还原Application, Screen.





***********************************
 高级群号:16497064欢迎编程高手加入.
***********************************

#7


sharemem了没?
如果没有那么dll中传出的变量地址对exe来说在它的内存管理器之外。

#8


看来,我只好帮大家顶顶了

#9


>>怎么实现?????
印象 <<delphi 深度探索>>II 就有谈到

#10


我放弃了,还是改用MDI实现,结贴

#1


你是这个意思吗?
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(self);
  Form2.Parent := Panel1;
  Form2.Align := alClient;
  Form2.Show;
end;

#2


不是,要的问题的关键是直接使用Project中的Form可以实现Dock,利用调用Dll函数中传过来的TFormClass类型的变量来创建Form时,不能实现Dock功能

关键:Dock Dll's Form!!!!
---------------------------------

请楼下的不要再走偏了,谢谢!!!!

#3


borland的包括delphi、C++Builder制作出的包含窗体和其他可视VCL组件dll文件工作起来都有一些不可克服的问题:焦点获得和转移、停靠、主控程序和DLL中VCL组件的互操作等,原因非常复杂,解决起来难度大,主要原因是主控程序和DLL中均有一个Application、Screen对象,虽然在调用时用主Application、Screen替代dll中相关对象可解决部分问题,但总体上基本上没有好办法可用。
建议用Bpl代替dll,由于BPL是面向对象的,整体工程中只有一个application和screen对象,则所有问题都不复存在。

#4


可以的,比较麻烦而已

#5


to aiirii(ari-淘金坑) 
怎么实现?????

#6


传递Application, Screen的址址到Dll中应该就可以实现的,因为我实现过DLL+MDI
我想原理是一样的吧,别忘了在退出的时间还原Application, Screen.





***********************************
 高级群号:16497064欢迎编程高手加入.
***********************************

#7


sharemem了没?
如果没有那么dll中传出的变量地址对exe来说在它的内存管理器之外。

#8


看来,我只好帮大家顶顶了

#9


>>怎么实现?????
印象 <<delphi 深度探索>>II 就有谈到

#10


我放弃了,还是改用MDI实现,结贴