我在窗口的panel中调用了一个dll文件中的窗口,调用是一切正常的,但要加
Panel1.updatecontrolstate窗口才能正常的显示出来。如果我的dll窗体中用了pagecontrol,问题就出现了,当按上面的tab切换时, panel的显示不会发生变化,除非再次调用Panel1.updatecontrolstate。 关键是这个语句怎么加,加在什么地方?大家可以尝试一下。

解决方案 »

  1.   

    你跟踪以下就知道了,Panel1.updatecontrolstate,实际上是给vcl发送消息,
    updatecontrolstate发送的是cm_base+25;所以要么你在本地窗口切换的时候sendmessage,要么在dll窗口中的onpaint事件里
    写入.//不知道对不对,楼主看看
      

  2.   

    我的子窗口代码:
    function CreateDLLForm(myAPP:TApplication;myScr:TScreen):TForm;
    begin
     Application:=myApp;
     Screen:=myScr;
     application.CreateForm(TfrmDllForm,frmDllForm);
     result:=frmDllForm;
    end;我的主窗口代码:
    myHandle:=LoadLibrary('dllproj.dll');
    if myHandle<>0 then
      begin
        @myProc:=GetProcAddress(myHandle,'CreateDLLForm');
        if assigned(myProc) then
           begin
             DLLForm:=myProc(Application,Screen);
             DllForm.Parent:=Panel1;
             DLLform.Show;
             Panel1.UpdateControlState;
           end;
      end;我尝试过了,dll窗口的pagecontrol发生变化的时候,主窗口好像无法感知。
      

  3.   

    可以通过发消息的办法和主窗体通信!
    SENDMESSAGE(APPLICATION。MAINFORM。HANDLE,WM-XXXX,XX,XX);
    然后主窗体在对应的消息处理函数里面执行相应的操作!
      

  4.   

    前提是DLL要用主程序的APPLICATION
      

  5.   

    带包编译(vcl70.bpl, rtl70.bpl)
      

  6.   

    to:newfang(传说中的MIC)
    我本来想在dll窗口的pagecontrolchange中用sendmessage,结果,主程序根本就没收到,问题确实如你所说,主程序的application句柄得不到啊,所以这个发消息的动作写在什么地方还没研究出来
      

  7.   

    另外,我处理消息的过程是在主form中定义的,好像消息传给应用程序也不行,要传给form的句柄。
      

  8.   


    在创建Dllform的时候把applicaton.handle作为DLLForm单元中的全局变量。
    (或者直接传递panel1的handle);这样就可以给application或者panel1发送消息直接通信了。消息在pagecontrol的onchange事件里发送即可。
      

  9.   

    现在的问题变成了DLL子窗口发消息时怎样知道主窗口的句柄,不是应用程序的,