DFW们 请进,关于 动态加载的运行期包如何调用主窗口的方法和其他包的方法(在线等...) (100分)

  • 主题发起人 主题发起人 TMXYB
  • 开始时间 开始时间
T

TMXYB

Unregistered / Unconfirmed
GUEST, unregistred user!
问题1
如datamodlue 的包为'datamodule_Package.bpl;我现在要在B包中和主程序中调用 datamodlue中的方法XXX,该如何调用;
我已经创建了全局变量FPackageHandle,admGlobal;并在主窗口开启时写了如下代码。
if FPackageHandle = 0 then
FPackageHandle := LoadPackage('datamodule_Package.bpl');
//
dataModuleClass := GetClass('TDataModule1');
//变量已经声明了。
if dataModuleClass <> nil then
begin
admGlobal :=nil;
admGlobal :=TDataModule(TComponentClass(dataModuleClass).Create(Application));
for iCounter := 0 to admGlobal.ComponentCount - 1 do
begin
if admGlobal.Components[iCounter].Tag=10 then
begin
// 这是调用对象,调用方法又该如何呢?
aQuery := TDataSource(admGlobal.Components[iCounter]);
DBGrid1.DataSource:=aQuery;
DBNavigator1.DataSource:=aQuery;
break;
end;
end;
end;

问题2
假如将上面的datamodlue 不打包,而是直接在主窗口中uses,其他包又如何引用他的方法呢,这种方法我试过好像不能直接引用,是不是有什么妙招?
 
国庆放假,厉害的DFW也放假了啊!
 
这个问题很简单的啊,真的很简单。
我一般用2种方法实现,
1:通过发送消息
2:通过运行期类型信息(RTTI)
你可以用上面2种方法传送一个TMethod的指针,再在要使用的地方换成TEvent就可以了。
 
可不可以举个例子,我到现在为止还没用过你说的方法。谢了先。
 
假如要传一个TNotifyEvent的方法
传送:
var
Method:TMethod;
begin
Method.Code:=@YourMethodName;
Method.Data:=self;
//RTTI
setvariantprop(YourClassInstance,PropName,vararrayof([integer(@Method)]));
//Message
//SendMessage(TargetHandle,WM_User+$XXX,integer(@Method),0);
end;

接收
var
NotifyEvent:TNotifyEvent;
begin
//RTTI
NotifyEvent:=TNotifyEvent(TMethod(integer(PropName[0])));
NotifyEvent(sender);
//Execute the Method;
//Message (In Message-Handle proc)
NotifyEvent:=TNotifyevent(TMethod(Wparam));
NotifyEvent(sender);
end;
 
想不到动态调用会这么难,你的方法待测
 
接受答案了.
 
后退
顶部