举例说明:
主程序:
    TForm1中有TClientDataSet对象ClientDataSet1。
    ClientDataSet1有多个TField对象,如fieldA,fieldB。
----首先:假定TForm1中已有多个TFieldGetTextEvent过程FieldAOnGetText,  FieldBOnGetText如
   published
    procedure FieldAOnGetText( Sender: TField; var Text: string; DisplayText: boolean ); 
    procedure FieldBOnGetText( Sender: TField; var Text: string; DisplayText: boolean ); 
   ...    我知道对fieldA.OnGetText赋值FieldOnGetText方法是:
      fieldA.OnGetText := FieldOnGetText ;
    如果是动态通过过程名赋值,如有时fieldA.OnGetText赋FieldAOnGetText,有时fieldA.OnGetText赋FieldBOnGetText。则可以如下完成:
    var
      FuncOnGetText: TFieldGetTextEvent ;
    begin
      if ( ...) then
        TMethod(FuncOnGetText).code := MethodAddress( 'FieldAOnGetText' )
      else
        TMethod(FuncOnGetText).code := MethodAddress( 'FieldBOnGetText' );
      TMethod(FuncOnGetText).data := self ;      fieldA.OnGetText := FuncOnGetText ;
    end;
------如果把刚才假定的过程定义在另一个Delphi的中,如
      procedure FieldAOnGetText( Sender: TField; var Text: string; DisplayText: boolean ); stdcall; export;
      procedure FieldBOnGetText( Sender: TField; var Text: string; DisplayText: boolean ); stdcall; export;
      这时主程序相应调用的代码改为:
    var
      FuncOnGetText: TFieldGetTextEvent ;
    begin
      if ( ...) then
        TMethod(FuncOnGetText).code := 
           GetProcAddress( Dllhandle, 'FieldAOnGetText' )
      else
        TMethod(FuncOnGetText).code :=
           GetProcAddress( Dllhandle, 'FieldBOnGetText' );
      TMethod(FuncOnGetText).data := self ;
      fieldA.OnGetText := FuncOnGetText ;
    end;
      这样当触发fieldA的OnGetText时,会出错,DLL中FieldAOnGetText的Sender传入值总是错。
     我该怎么样才能把这些带对象的过程移到DLL中而又运行正常???

解决方案 »

  1.   

    赋给OnGetText事件的值应该是对象函数而不是独立的函数.
      

  2.   

    halfdream DLL中怎样定义对象函数?
      

  3.   

    在通用的DLL里面不容易实现.
    但可以考虑使用DELPHI运行期包,它实质是一种扩展的DLL.
      

  4.   

    哦...
    我可能想错了..在普通DLL也应该不太难的.
    你在DLL写一个函数,专作取指针用.
    因为不存在导出对象的麻烦, 应该会比较容易的.