我自定义的消息,怎么把参数传递到我的消息处理过程中?(50分)

N

nywjx

Unregistered / Unconfirmed
GUEST, unregistred user!
我自定义了一个消息WM_SHOWCAPTION,写了消息处理过程WMSHOWCAPTION,在这个过程中
将一个Lable的Caption改变显示。
在发送消息的时候我用SendMessage(Form1.Handle,WM_SHOWCAPTION,0,0),我怎么把
参数也带过去呢?
就是说我在发送消息的时候就已经知道了要显示什么,比如说,要显示“已收到消息”,
那么我在发送消息的时候怎么把这个“已收到消息”字符串同时传递过去,让消息处理
过程能直接显示呢?
 
在后面两个 0 的地方,填充你的参数,可以两都用,也可以只用一个。
若是简单数据类型,如整数,可直接传值,
如果是字符串,就填上它的指针(地址);
 
哦,那消息处理过程中,怎么使用这两个参数呢?
 
不是 TMsg 中有 wparam 和 lparam 嘛
 
不好意思,能不能详细点,我对这方面不熟。我的例子是这样的:
procedure TForm1.WMTEST(var Message:TMessage);
begin
Label1.Caption:=
//这里怎么得到参数呢?
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Form1.Handle,WM_TEST,'收到',0);
end;
 
你要的参数可以有多种取法:
如果你放在第一个0的地方用:Message.WParam
如果你放在第二个0的地方用:Message.LParam
当然还有其它取法。以下是TMessage的定义:
type
TMessage = packed record

Msg: Cardinal;
case Integer of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);

end;
 
procedure TForm1.WMTEST(var Message:TMessage);
var
s : PChar;
begin
s := PChar(Pointer(Message.lParam));
Label1.Caption:= s;
//这里怎么得到参数呢?
Message.Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s : String;
begin
s := '收到';
SendMessage(Form1.Handle,WM_TEST,0,Longint(PChar(s)));
end;
 
我看了帮助,TMessage的定义如下:
type
TMessage = packed record

Msg: Cardinal;
case Integer of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint);
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);

end;
可这都是整数啊,我要传递字符串、TDateTime、自定义的类型怎么办呢?
 
你这里如果就两个汉字,可以传递汉字的 Ord ,
如果很长就要传送指针。
如果你还不清楚,我等会告诉你。
 
你把消息定义也贴出来,这样我调通后,你就可以用了。
 
干吗去了,你的参数传递是有问题的。赶快贴出来,马上解决。
 
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const
WM_TEST=WM_USER+1;

type

TUser=record
UserName:string;
UserID:word;
UserDateTime:TDateTime;
end;

TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure WMTEST(var Message:TMessage);message WM_TEST;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMTEST(var Message:TMessage);
begin
在这里显示出这个用户的信息
end;

procedure TForm1.Button1Click(Sender: TObject);
var User:TUser;
begin
User.UserName:='王建欣';
User.UserID:=4825;
User.UserDateTime:=Now;
//SendMessage(Form1.Handle,WM_TEST,0,Longint(PChar(User)));
怎么写?
end;
 
谢谢你,jsxjd。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

const
WM_TEST=WM_USER+1;

type
PUser=^TUser;
TUser=record
UserName:string;
UserID:word;
UserDateTime:TDateTime;
end;

TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure WMTEST(var Message:TMessage);message WM_TEST;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMTEST(var Message:TMessage);
var
a : PUser;
begin
a := Pointer(Message.lParam);
Label1.Caption := a^.UserName;
end;

procedure TForm1.Button1Click(Sender: TObject);
var User:TUser;
begin
User.UserName:='王建欣';
User.UserID:=4825;
User.UserDateTime:=Now;
SendMessage(Form1.Handle,WM_TEST,0,Longint(Pointer(@User)));
//怎么写?
end;


end.
 
谢谢,能留个email吗?有事再请教你啊。
我的email是wjx@easyentry.com.cn
 
tseug@263.net, 不过, 不要给我发病毒或木马,最近老有人这么干。[:D]
 
以下是成功的代码,注意连接 Button1的点击事件,我一开始没连接,
老没反应,花了我好长时间。
里面多定义了一个 PUser,你可以酌情处理。
要传送的参数最好放在全局变量中,因为局部变量马上会消失。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,shellapi;

const
WM_MYTEST=WM_USER+1;

type

TUser=record
UserName:string;
UserID:word;
UserDateTime:TDateTime;
end;
PUser=^tUser ;

TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure WMTEST(var Message:TMessage);message WM_MYTEST;
public
{ Public declarations }
end;

var
Form1: TForm1;
User:TUser;
implementation

{$R *.DFM}

procedure TForm1.WMTEST(var Message:TMessage);
var
p:pUser;
begin
p:=PUser(message.wparam);
label1.caption:=format('%s %d %s',[p^.UserName,p^.UserId,datetimetostr(p^.Userdatetime)]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
User.UserName:='王建欣';
User.UserID:=4825;
User.UserDateTime:=Now;
SendMessage(Form1.Handle,WM_MYTEST,Integer(@User),0);
end;

end.


 
带来了一个相关的问题,我在SendMessage时,可能是一个一个接连不断地发,而且时间
间隔很短。但是在消息处理过程中,可能要根据接收到的用户ID和用户名到表中查询一些
信息,这样在消息处理过程中可能要耽误一些时间。
那么,会不会漏掉消息?就是说我在SendMessage中发了,但是消息处理过程中来不及处
理,丢失信息?
 
多人接受答案了。
 
顶部