关于自定义消息的问题 类对象继承 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 消息脱离窗体就啥也不是,TObject不是个窗体。继承它的子类需要整容,添加所有窗体必要的一切。其他的不说,你至少得整个窗体句柄出来,否则你如何发这个自定义消息。还是至少从TControl继承吧,别给自己找麻烦 TObject有个虚函数Dispatch用于发送消息,有个DefaultHandler用于接收消息。举个例子:type TChild = class(TObject) procedure MSG2000(var msg: TMessage); message 2000; end;implementationprocedure TChild.MSG2000(var msg: TMessage);begin ShowMessage('This is message 2000');end;procedure TForm1.Button1Click(Sender: TObject);var child : TChild; msg: Integer;begin child := TChild.Create; msg := 2000; child.Dispatch(msg); child.Free;end;结果是弹出一个框,说明Delphi从TObject就支持消息机制 如果要句柄的话可以从wincountrol继承下来,或是用下面的代码uses Messages, Dialogs, Classes, Windows, SysUtils;const My_Message = WM_USER+100;type TMyObject = class(Tobject) private FHandle: Thandle; procedure CMmessage(var Message: TMessage); Message My_Message; protected procedure WndProc(var Message: TMessage); virtual; public constructor Create; destructor Destroy; override; property Handle: Thandle read FHandle write FHandle; end;implementation{ TMyObject }procedure TMyObject.CMmessage(var Message: TMessage);begin if Message.Msg = My_Message then ShowMessage(Format('消息:%d',[Message.Msg])) else Message.Result := DefWindowProc(FHandle, Message.Msg, Message.wParam, Message.lParam);end;constructor TMyObject.Create;begin FHandle := AlLocateHWnd(WndProc);end;destructor TMyObject.Destroy;begin DealLocateHWnd(FHandle); inherited;end;procedure TMyObject.WndProc(var Message: TMessage);begin Dispatch(Message);end;var MyObject: TMyObject;begin MyObject := TMyObject.Create; try SendMessage(MyObject.Handle,My_Message, 0, 0); finally MyObject.Free; end;end; 就像LS那样整容,注册窗体类、创建实例、添加窗体过程,加入消息循环,这些窗体必要的条件都整上去。不过写那么多东东完全没必要,从twincontrol继承就得了btw因为forms和classes单元都有AlLocateHWnd和DealLocateHWnd,而AlLocateHWnd、DealLocateHWnd最早定义在forms单元,默认是调用forms单元的,不过forms单元的AlLocateHWnd、DealLocateHWnd都都标记为废弃了的,而建议用classes单元的,所以最好明确指明classes.AlLocateHWnd(WndProc);classes.DealLocateHWnd(FHandle); 的确,消息因窗体而生。但TObject着实封装了消息 delphi的登陆窗口 请问QUERY组件的问题 想用Mediaplaer控件播放某个声音文件若干次,怎么控制? qrlabel和qrdbtext 问题 如何从文件中读入内容到数组中? 关于DBGRID的问题 问问数据库的价格 Nicrosoft《Delphi高手突破》网上已经有卖了,另外开通读者论坛,欢迎交流和反馈 请问怎么给QRRichText赋值啊?(以ADOQUERY为例)。另外QRDBRICHTEXT是干吗的?为什么不用他? delphi 5 在win2000中不能使用 用SHGetFileInfo乱码了 Delphi域用户登录验证的代码不起作用
其他的不说,你至少得整个窗体句柄出来,否则你如何发这个自定义消息。
还是至少从TControl继承吧,别给自己找麻烦
举个例子:type
TChild = class(TObject)
procedure MSG2000(var msg: TMessage); message 2000;
end;implementationprocedure TChild.MSG2000(var msg: TMessage);
begin
ShowMessage('This is message 2000');
end;procedure TForm1.Button1Click(Sender: TObject);
var
child : TChild;
msg: Integer;
begin
child := TChild.Create;
msg := 2000;
child.Dispatch(msg);
child.Free;
end;结果是弹出一个框,说明Delphi从TObject就支持消息机制
Messages, Dialogs, Classes, Windows, SysUtils;
const
My_Message = WM_USER+100;
type
TMyObject = class(Tobject)
private
FHandle: Thandle;
procedure CMmessage(var Message: TMessage); Message My_Message;
protected
procedure WndProc(var Message: TMessage); virtual;
public
constructor Create;
destructor Destroy; override;
property Handle: Thandle read FHandle write FHandle;
end;implementation{ TMyObject }procedure TMyObject.CMmessage(var Message: TMessage);
begin
if Message.Msg = My_Message then
ShowMessage(Format('消息:%d',[Message.Msg]))
else
Message.Result := DefWindowProc(FHandle, Message.Msg, Message.wParam, Message.lParam);
end;constructor TMyObject.Create;
begin
FHandle := AlLocateHWnd(WndProc);
end;destructor TMyObject.Destroy;
begin
DealLocateHWnd(FHandle);
inherited;
end;procedure TMyObject.WndProc(var Message: TMessage);
begin
Dispatch(Message);
end;var
MyObject: TMyObject;
begin
MyObject := TMyObject.Create;
try
SendMessage(MyObject.Handle,My_Message, 0, 0);
finally
MyObject.Free;
end;
end;
不过写那么多东东完全没必要,从twincontrol继承就得了
btw
因为forms和classes单元都有AlLocateHWnd和DealLocateHWnd,而AlLocateHWnd、DealLocateHWnd最早定义在forms单元,默认是调用forms单元的,不过forms单元的AlLocateHWnd、DealLocateHWnd都都标记为废弃了的,而建议用classes单元的,所以最好明确指明
classes.AlLocateHWnd(WndProc);
classes.DealLocateHWnd(FHandle);