程序采用一个EXE+DLL的形式,DLL中输出一个函数GetFrame用来得到DLL中的一个Frame,
function GetFrame(AOwner : TComponent : TFrame;
begin
  Result := TMyFrame.Create(AOwner); //TMyFrame是DLL中的一个Frame 
end;
然后由EXE把这个Frame嵌入到主窗体中使用(一般是主窗体的一个Panel中)。
但是这样做我发现有几个问题:1.当MyFrame的ParentFont设置为True的时候,根本不能创建这个MyFrame,提示
  'Cannot assign a TFont to a TFont'
2.如果MyFrame的父窗体已经显示,无法正确显示MyFrame,
  必须先把父窗体Visible := False;等MyFrame创建并显示后,再把父窗体Visible := True,
  这样才能正确显示MyFram
3.MyFrame中一定不能有Hint,如果有Hint显示,一定会报错,错误也是:
  'Cannot assign a TFont to a TFont'我不知道是不是我哪里没有弄对,还是Delphi本身的局限。
谁能给我一个好的建议,或者答案?像这种问题,我在网上也查过,好像说把Exe的Application和Screen替换Dll,但是我试过一样的。在我的测试程序中只发现这3个问题,但是在我实际的程序中,问题比这个还要多,比如MyFrame中的字体
不能改变,颜色不能改变,一改变也会出现'Cannot assign a TFont to a TFont'或者其他莫名
错误。

解决方案 »

  1.   

    这是Exe程序和Dll能不共享Handle的问题。我前二天就遇到过,我是传Exe文件中的Font传给Dll中,封装了一个专门负责打印文件的类。Borland公司说编译程序的时候编译Runtime pakge。我没这做做,我是用内存映射的方法解决的。但我不知道这种方法对于LZ是否适用
      

  2.   

    Frame都是DLL中预先设计好的,而且为了追求界面美观,字体也有多种,这样通过传Exe的Font恐怕太麻烦了。
    不知道aaronhocn采用内存映射方法大概是怎么实现的?
      

  3.   

    Build with runtime package: vcl; rtl
      

  4.   

    budded:
      只要这两个runtime package 就可以了吗?那我做安装程序的时候需要增加哪些文件?最好不用runtime package。
      

  5.   

    打包就把VCLXX.bpl、RTLXX.bpl一起打包,XX:不同版本的版本号