请问ActiveFormX和TActiveFormXImpl的关系是什么?
最近刚学ActiveX,对于很多细节不了解,特别是ActiveFormX和TActiveFormXImpl的关系是什么?
我在IActiveFormX中增加了一个函数Test(),里面的实现很简单就是执行ActiveFormX中的Button1Click()函数,
STDMETHODIMP TActiveFormXImpl::Test()
{
try
{
if (::ActiveFormX != NULL) {
::ActiveFormX-> Button1Click(NULL);
} else {
MessageBox(Application-> Handle, "ActiveFormX is NULL ", "Message ", MB_OK);
}
}
catch(Exception &e)
{
return Error(e.Message.c_str(), IID_IActiveFormX);
}
return S_OK;
};
执行结果发现ActiveFormX为NULL,请问,在TActiveFormXImpl中如何调用AcitveFormX中的代码呢?
还有如果上面的代码中把::去掉,编译会出错,提示AcitveFormX有二义性,Project1_tlb中也有一个ActiveFormX,这是为什么呢?我看了代码,没找Project1_tlb中关于ActiveFormX的声明啊
还有一个功能我不知道怎么实现。如果在ActiveForm上有一个按钮,用户按了以后,我想让控件出发一个事件,这个该怎么做?
有谁对这方面比较了解的请告知一二,或者告诉我哪里可以找到这方面的资料也好,谢谢!
[解决办法]
简单说,TActiveFormXImpl把ActiveFormX包装成ActiveX,
ActiveFormX 其实基本上就是普通的VCL form,TActiveFormXImpl是个ActiveX“外壳”。
上面的代码,在Test()中正确的使用ActiveFormX应该用 m_VclCtl,它是TActiveFormXImpl的成员变量。
想让控件发出事件,可以在“Type Library”编辑器中“IxxxxEvents”下添加事件...(以下省去3万字)