问题关键字  动态编译;静态编译问题时这样产生的:
    主程序调用了一个动态库,在动态库中创建了一些控件(一个TPanel,一个TSplitter),控件的Parent被指向了主程序的MainForm,当主程序和动态库都是动态编译的时候一切都很正常Splitter可以正常拖动,一切都很好; 然而,主程序和动态库都静态编译的时候,问题出现了,Splitter的拖动图标可以显示,但是拖动的时候出现“Control '' has no parent window ”(说Splitter没有ParentWindow)而弹出Bug,郁闷好久了,谁能解释这是什么原因?

解决方案 »

  1.   

    x.Parent:=Self; 
    自己创建的对象都必须加这句。
      

  2.   

    动态创建一定要把他的Parent属性给它赋值的,要不然它放在那个地方,系统不知道啊
      

  3.   

    Dll中Procedure PrjMng(const AppMain : TApplication); stdcall;
    Begin
      With TPanel.Create(AppMain.MainForm) do
      Begin
        parentFont := False;
        Parent := Application.MainForm;
        Width := 300;
        Align := alLeft;
      End;
      With TSplitter.Create(AppMain.MainForm) Do
      Begin
        Parent := AppMain.MainForm;
        Align := alLeft;
        Left := 300;
      End;
    End;
      

  4.   

    不知道啥叫动态编译,静态编译,没听说过,只听说过动态调用,静态调用,exe和dll是2个独立的编译程序,他们的froms单元的Application是不同的,一般来说,为了保证窗体控件的正常使用,在进入dll之后,会替换dll的Application.handle,在dll卸载时,回恢复原Application的handle,不然的话,会存在一些使用上的错误和异常,你目前这种使用方法就是解决了当前的问题,也有可能会有关闭程序时出现地址错误的,一个简单的办法,使用windwos.setParent ,这样就不会出现你现在的错误了
      

  5.   

    我所说的动态编译是指在  Options...->Packages->Runtime packages 的 Build with runtime packages 打勾,表示运行时动态的加载那些bpl
      

  6.   


    Application.Handle 我在 进入Dll之后(DLL_PROCESS_ATTACH)已经作了设置,退出的时候(DLL_PROCESS_DETACH)复原,另外你所说的windows.SetParent(h
    WndChild, hWndNewParent)在这里是不能使用的,因为此时的hWndChild没法得到
      

  7.   

    Procedure PrjMng(const AppMain : TApplication); stdcall; 
    Begin 
      With TPanel.Create(AppMain.MainForm) do 
      Begin 
        parentFont := False; 
        Parent := Application.MainForm; 
        Width := 300; 
        Align := alLeft; 
      End; 
      With TSplitter.Create(AppMain.MainForm) Do 
      Begin 
        Parent := AppMain.MainForm; 
        Align := alLeft; 
        Left := 300; 
      End; 
    End;Name都等于空 没有报错?Control '' already exists
      

  8.   

    没有,不是这段代码的问题,当主程序和Dll都是 [Build with runtime packages] 时程序运行非常好
      

  9.   


     Parent为空也就说明  执行Parent := Application.MainForm; 时,MainForm还没有创建 
      

  10.   

    不能调用指定以外的bpl包
    Build with runtime packages 可以自主搜索所需的bpl包
      

  11.   

    构造函数中   
          Width   =   200;   
          Height   =   225;   
          ParentColor   =   false;   
      等属性的设置都会引起控件的重绘,在构造的时候,其Parent是不存在的,或者说是这种窗体包含关系还没有形成的,尽管你给Parent赋值了。 
      

  12.   

    谢谢你的关注,问题是 Build with runtime packages 时程序运行正常,而不是这种编译方式的时候程序就出错了。
      

  13.   

    Procedure PrjMng(const AppMain : TApplication); stdcall; 
    var
      frm,frm1 : TForm;
    Begin 
      frm := TPanel.Create(AppMain.MainForm);
      frm.parentFont := False; 
      frm.Parent := Application.MainForm; 
      frm.Width := 300; 
      frm.Align := alLeft; 
     
      frm1 := TSplitter.Create(AppMain.MainForm);    frm1.Parent := AppMain.MainForm; 
        frm1.Align := alLeft; 
        frm1.Left := 300; End;
    试试
      

  14.   

    更改:
    var
      frm :TPanel;
      frm1 : TSplitter;
      

  15.   

    那是因为你在模块之间传递了对象,而在设置Parent属性后显示窗体时,会有is的类型检测,而该窗体对象是另外一个模块传递过来的(地址),is类型检测自然无法通过,所以报异常了。