VCL组件是否不能在多个线程中使用,只能在VCL主线程中使用?
我在写一个ActiveX的控件,但是它在IE中运行时,由于IE中的多个窗口分别在不同线程中(进程是同一个),所以有些VCL组件不正常,比如TPopupMenu就只能在第一个控件中弹出,在其他窗口的控件中不能弹出,不知道大家有什么方法可以处理。谢谢
我在写一个ActiveX的控件,但是它在IE中运行时,由于IE中的多个窗口分别在不同线程中(进程是同一个),所以有些VCL组件不正常,比如TPopupMenu就只能在第一个控件中弹出,在其他窗口的控件中不能弹出,不知道大家有什么方法可以处理。谢谢
解决方案 »
- 求教DELPHI访问ORACLE数据库的高效方法
- char不是16位吗?但下面这个语句为何是1
- 如何判断RecordStream记录有没有到结尾?高手求救~~!!
- 100分求Cport控件的帮助文档!
- **** 紧急求助:熟悉ERP/MRPII(尤其是 Oracle Application R11i)接口的哥们进来指点一二 ****
- 小MM问大家个问题
- 各位大哥,小弟提一个so easy的问题
- 请教:bde和oracle9结合的问题?
- RGB到色调-亮度-饱和度颜色转换
- 关于SQL Server服务管理器的小问题。
- 菜鸟问题之3:进程和线程(快速结贴)
- QQ delphi 群,欢迎大家加入: 3010355
TThread.Synchronize
------------------------------------------
1。象通常一样设计,定义TPopupMenu,但不要写其OnClick事件2。在需要弹出菜单的地方,不要用自动弹出,或调用Popup(),在OnMouseUp(或适当的其他事件内)
用API弹出菜单: ::TrackPopupMenu(PopupMenu1->Handle,TPM_LEFTALIGN,
Mouse->CursorPos.x,
Mouse->CursorPos.y,
0,Handle,NULL);
//这里的 Handle 参数就是Form的 Handle,因为菜单的消息由Form处理(即WMMenuCommand函数)3。在 .h中加入:class TfmMain : public TForm
{
...
protected:
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_COMMAND, Messages::TWMCommand, WMMenuCommand)
END_MESSAGE_MAP(TForm)
void __fastcall WMMenuCommand(Messages::TWMCommand &msg);
};4。在 .cpp中加入消息处理函数:void __fastcall TfmMain::WMMenuCommand(Messages::TWMCommand &msg)
{
//MenuItem1,MenuItem2 是菜单项的名称
//也可用switch...case... if(msg.ItemID == MenuItem1->Command) {
...//响应菜单1
}
if(msg.ItemID == MenuItem2->Command) {
...//响应菜单2
}
...
}
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_COMMAND, Messages::TWMCommand, WMMenuCommand)
END_MESSAGE_MAP(TActiveForm)
首先,谢谢了,你的方法应该可行,先收下,但是我并不满足,因为VCL不是线程安全的,所以菜单问题可以如此解决,其他是否还有问题,总是不放心。
我不知道将线程模式ThreadMode设成tmSingle有没有用,好像还是不行,不知道这个模式有什么用,我原来用的是Apartment的。
听君一席话,胜读十年书,不过问题是,我现在正在开发的软件换用bcb或其他可能不大,必须Delphi到底,如何是好,虽然遇到的问题不是很多,也不是没有办法解决,但是对于可能遇到的问题不了然的话,尤其是还是DAX中的作物,那实在是很可怕的事情。难道没有太好的办法吗?
另外,问一下,线程模式tmSingle和tmApartment有什么区别。