怎么样定义自己的消息,并在消息中传递自定义的数据? ( 积分: 100 )

  • 主题发起人 GalfordLiu
  • 开始时间
G

GalfordLiu

Unregistered / Unconfirmed
GUEST, unregistred user!
unit uClass;

interface

uses Messages, Classes, Dialogs;

const
WM_MYTEST = WM_USER + $1000; // 测试用

type
TMyClass = class
private
FHandle: THandle;
procedure WinProc(var Msg: TMessage);
procedure WMMyTest(var Msg: TMessage); message WM_MYTEST; // 测试用
public
constructor Create;
destructor Destroy; override;
property Handle: THandle read FHandle;
end;

implementation

{ TMyClass }

constructor TMyClass.Create;
begin
if FHandle = 0 then
FHandle := AllocateHwnd(WinProc);
end;

destructor TMyClass.Destroy;
begin
if FHandle <> 0 then
DeallocateHWnd(FHandle);
end;

procedure TMyClass.WinProc(var Msg: TMessage);
begin
try
//if Msg.Msg = WM_MYTEST then
// ShowMessage('I''m the first get the message "WM_MYTEST"');
Dispatch(Msg);
except
if Assigned(ApplicationHandleException) then
ApplicationHandleException(Self);
end;
end;

procedure TMyClass.WMMyTest(var Msg: TMessage);
begin
ShowMessage('Test OK!' + #10
+ 'I''m coming from Class "TMyClass" with message "WM_MYTEST"!');
end;

end.

后记:这样,这个类就具有了一个句柄,发个消息WM_MYTEST看看。还能执行。呵呵,以后再写需要响应消息的类的时候,直接继承它就可以了,记得要把 WMMyTest过程删掉,它只是一个测试。

测试:
var
mc: TMyClass;
begin
mc := TMyClass.Create;
PostMessage(mc.Handle, WM_MYTEST, 0, 0);
end;
============================================================================
这段代码是在坛子里抄的. 是自定义消息的示例.

我想在自定义的消息中传递自定义的数据到响应的事件函数中,要怎么做?

如,我想自定义一个消息结构,在消息中包含一个字符串字段,在事件函数中显示出来,事件里的代码是下面这个样子
procedure TMyClass.WMMyTest(var Msg: TUserMessage);
begin
ShowMessage(Msg.Message);
end;
如果这个能解决自定义消息结构的话.那么,我如何在发送消息的函数中加入自定义的数据,再产生此消息?
PostMessage(mc.Handle, WM_MYTEST, 0, 0);
明显不能这么做啊......

不知道我表达清楚没有,请各位大大指教啊
 
“日行一善,积善积德”,呵呵。
把你自定义的数据用一个记录封装起来,然后动态把指向该记录的指针用消息发送过去,
wParam来封装你这个指针的,详见我给你写的:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
WM_MYTEST = WM_USER + $1000;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure WMMyTest(var Msg: TMessage); message WM_MYTEST;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type
info = record
name: string;
code: string;
end;
pinfo = ^info;
{ TForm1 }

procedure TForm1.WMMyTest(var Msg: TMessage);
begin
ShowMessage((pinfo(msg.WParam).name));
dispose(pinfo(msg.WParam));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
ainfo: pinfo;
begin
new(ainfo);
ainfo.name:= 'lisongmagic';
ainfo.code:= '007';
PostMessage(Handle, WM_MYTEST, integer(ainfo), 0);
end;

end.
 
消息的结构标准的,windows制定的
你如果要传复杂的结构,你可你把对象的地址传过去
 
哦,忘了补充了;
如果你的数据结构比较复杂,用我上面的记录不好封装,那就建立一个类来封装你的
数据,然后照我上面的方法,把该类的对象传过去,就像我上面的传记录指针一样的
方法
 

Similar threads

I
回复
0
查看
519
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部