unit tabletxt;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ComCtrls,comobj,OleServer,WordXP,ActiveX;const
wm_yb=wm_user+8;type
tfiletype=(mytxt,myword,myExcel);
ttabletxt = class(tcomponent)
private
procedure mymessage(var msg:tmessage);message wm_yb;
protected
public
procedure mysave(myfilename:string);
published
end; procedure Register;implementationprocedure Register;
begin
RegisterComponents('yb', [ttabletxt]);
end;
procedure ttabletxt.mysave(myfilename: string);
begin
postmessage(application.mainform.Handle,wm_yb,1,0);
end;
procedure ttabletxt.mymessage(var msg: tmessage);
begin
showmessage('dffffffffffeeeeeeeeeeeefdsf');
inherited;
end;end.
基本代码如上所示,但无法收到自定义消息,为何,如何解决,请高手赐教
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ComCtrls,comobj,OleServer,WordXP,ActiveX;const
wm_yb=wm_user+8;type
tfiletype=(mytxt,myword,myExcel);
ttabletxt = class(tcomponent)
private
procedure mymessage(var msg:tmessage);message wm_yb;
protected
public
procedure mysave(myfilename:string);
published
end; procedure Register;implementationprocedure Register;
begin
RegisterComponents('yb', [ttabletxt]);
end;
procedure ttabletxt.mysave(myfilename: string);
begin
postmessage(application.mainform.Handle,wm_yb,1,0);
end;
procedure ttabletxt.mymessage(var msg: tmessage);
begin
showmessage('dffffffffffeeeeeeeeeeeefdsf');
inherited;
end;end.
基本代码如上所示,但无法收到自定义消息,为何,如何解决,请高手赐教
错了,这是向应用程序的主窗口发送消息,ttabletxt 接受不到的。
另外ttabletxt 从tcomponent派生是不行的,因为tcomponent没有窗口,不能直接接受消息。————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
ttabletxt = class(twincontrol) postmessage(ttabletxt.Handle,wm_yb,1,0);
无法通过编译
有一个变通的办法:
1.定义一个自定义的消息
2.为你的TTableText写一个WindowProc,在其中处理你的消息
3.找到一个TControl的派生类实例(如一个窗体,假定为Form1),保证Form1的生命周期比你的TTableText实例要长
4.创建TTableText实例时,用它的WindowProc替换Form1的WindowProc
5.别忘了在TTableText的WindowProc中调用Form1原来的WindowProc
6.如果你有多个TTableText实例,那你要考虑创建和释放的先后次序,别搞乱了
7.然后要处理你的消息时向Form1发就可以了
4.5释放的时候恢复Form1原来的WindowProc
ttabletxt = class(tcomponent)
protected
procedure WindowProc(var Message: TMessage);
public
Handle: HWnd;
constructor Create(AOwner: TComponent);override;
destructor Destroy;override;
end;implementationconstructor ttabletxt.Create(AOwner: TComponent);
begin
inherited;
Handle := Classes.AllocateHWnd(WindowProc);
end;procedure ttabletxt.WindowProc(var Message: TMessage);
begin
if Message.Msg = wm_yb then
showmessage('dffffffffffeeeeeeeeeeeefdsf');
end;destructor ttabletxt.Destroy;
begin
if Handle <> 0 then
Classes.DeallocateHWnd(Handle);
inherited;
end;
发送消息示例:
SendMessage(tabletxt1.Handle, wm_yb, 0, 0);—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
我狂晕,这是我在大富翁的帖子的答案,但看你这么乐于肋人的份人,就给你80分吧
你晕啥啊,我从来就不去大富翁,神经病。—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
“const
wm_yb=wm_user+8;”
么?我没改是怕你看不懂!神经病。—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————