举例说明:
主程序:
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中而又运行正常???
主程序:
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中而又运行正常???
解决方案 »
- Dephi 把一个TEdit控件赋值另一个TEdit控件的问题
- 关于在Delphi环境下.如何给系统日志加记录..和日志空格的问题
- 上海航空股份有限公司招计算机人员
- 求update blob字段的语句,用query控件!
- 设有一应用程序服务器A,它本来是没连接好的,当A连接好后,它如何告诉SimpleObjectbroker它已连接好了?
- 关于MDI窗口的问题,急,急!
- 调用拨号函数rasdial时总是提示 ‘hrasconn’类型找不到。要use 哪个pas呢?谁知道,我的所有可用分马上派给你。在线等待,急
- 先求设计思路,我要做一个客户端监测服务器的程序,详情见内,分不够可以再加!!!!
- 如何让报表中依次显示数据库里4个表的相应内容
- 错误:Left side cannot be assigned to! 呼唤高手
- 我下了一个netspy(delphi的原代码),但里面少一个HexDump.dcu文件。有谁能帮我??
- 在delphi上连接带大字段的oracle表会出错!
但可以考虑使用DELPHI运行期包,它实质是一种扩展的DLL.
我可能想错了..在普通DLL也应该不太难的.
你在DLL写一个函数,专作取指针用.
因为不存在导出对象的麻烦, 应该会比较容易的.