小弟用VC调用一个DELPHI做的OCX控件,发现其在OCX中定义的事件没有触发。高人指点是MFC不支持多线程触发OCX事件,所以想在OCX控件本身做一些修改,改在通过发送消息的方式来启动事件。但是如何在ActionX Form中实现这一点呢?请各位大大指点一下源码大概如下:
const EventMessage = WM_USER + 100;
TAppServerThread = class(TThread)
public
constructor Create();
procedure Execute; override;
procedure Terminate;
end;
type
TClientX = class(TActiveForm, IClientX)
private
{ Private declarations }
FEvents: IClientXEvents;
procedure OnReceiveInfo();
public
{ Public declarations }
procedure Initialize; override;
procedure GetWinMessage(var Msg:TMessage);message EventMessage; //处理消息的函数
end;在线程执行体中
procedure TAppServerThread.synchAddDataToControl;
var
ThisWnd:THandle;
begin
ThisWnd := FindWindow(nil, 'ClientX');
if (ThisWnd<>0) then //此处ThisWnd确实不为0
PostMessage(ThisWnd, EventMessage, 0, 0);
end;procedure TClientX.GetWinMessage(var Msg:TMessage);
begin
if FEvents <> nil then FEvents.OnReceiveInfo(); //没有进入此函数体
end;调试中发现,消息发送后就无了任何响应.
分还可以加啊,只求能解决这个问题
const EventMessage = WM_USER + 100;
TAppServerThread = class(TThread)
public
constructor Create();
procedure Execute; override;
procedure Terminate;
end;
type
TClientX = class(TActiveForm, IClientX)
private
{ Private declarations }
FEvents: IClientXEvents;
procedure OnReceiveInfo();
public
{ Public declarations }
procedure Initialize; override;
procedure GetWinMessage(var Msg:TMessage);message EventMessage; //处理消息的函数
end;在线程执行体中
procedure TAppServerThread.synchAddDataToControl;
var
ThisWnd:THandle;
begin
ThisWnd := FindWindow(nil, 'ClientX');
if (ThisWnd<>0) then //此处ThisWnd确实不为0
PostMessage(ThisWnd, EventMessage, 0, 0);
end;procedure TClientX.GetWinMessage(var Msg:TMessage);
begin
if FEvents <> nil then FEvents.OnReceiveInfo(); //没有进入此函数体
end;调试中发现,消息发送后就无了任何响应.
分还可以加啊,只求能解决这个问题
解决方案 »
- jpg图片文件存入SQL SERVER数据库的IMAGE字段,再次显示图片不完整!!!
- Delphi控件与注册表信息有关吗?
- 本鲨写的个人收支管理小程序 带源码
- 再一个quickreport分页问题!急…
- 怎样将combobox的每一个item都有不同的字体,和颜色
- 8410分求解:如何在发送正文为HTML格式的邮件(同时带附件)!!!
- 各位:如何复制对象?不是复制对象指针?
- ADO:无法更新;当前被锁定。.
- Delphi SPComm设置的问题
- 更换图片问题
- 如何取得实数类型的最大值,有序类型Integer的最大值为 High(Integer),实数 High(Double) 如何写.
- 在一个Active Form里创建一个工作线程,如何让Form接收到这个工作线程发送的消息?
procedure TClientX.EventSinkChanged(const EventSink: IUnknown);
begin
FEvents := EventSink as ISMSClientXEvents;
inherited EventSinkChanged(EventSink);
end;
var
ThisWnd:THandle;
begin
ThisWnd := FindWindow(nil, 'ClientX');
if (ThisWnd<>0) then //此处ThisWnd确实不为0
PostMessage(ThisWnd, EventMessage, 0, 0);
end;Thiswnd 是TAppServerThread的句柄不是TClientX的句柄 不能用TClientX的方法截取
要用復盖TAppServerThread的wndPRoc方法处理。
的方法放入TAppServerThread
类中,或者在Activeform中调用TAppServerThread 的方法synchAddDataToControl
Activeform 为Tfrmact
则復盖 Tfrmact 的 wndproc 的方法
procedure WndProc(var Message: TMessage);override
var tmpclass:TClientX ;
begin
if message = EventMessage then
begin
tmpclass := TClientX.create(..) ;
TClientX(tmpclass).FEvents.OnReceiveInfo();
end; inherited;
end;
在wndproc中处理,要把消息的事件也传递过来
不知道是不是我理解错误了chludlf的代码,线程类是没有WndProc函数的。我是直接写另一个处理函数,然后指认到TClientX的WndProc去
tmpclass := TClientX.create(..) ;
TClientX(tmpclass).FEvents.OnReceiveInfo();
程序直接就退出了。
是说TClientX要把事件传给wndproc执行,这是在delphi中用处理的,你post 的消息不在TClientX类中不能由TClientX类的接收消息函数处理,只能由post消息的
TAppServerThread类或父类处理,如果都没有处理向上追踪,一直追到windows 的消息处理机制,