再提个小问题,有关发送消息的句柄。(50分)

  • 主题发起人 主题发起人 dirk
  • 开始时间 开始时间
D

dirk

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序中有两个窗体,A、B,在 A 中 创建 B ,并将 A 的句柄传给 B , B 在运行过
程中利用此句柄向 A 发送消息,postmessage(TA(Owner).Handle,wm_user+1,0,0);,但
总是报错,都是读地址错误,为什么?该怎么做?

procedure TA.Button1Click(Sender: TObject);
begin
B:= TB.Create(self);
// B.FormAHandle:=self.handle
//改为直接传句柄
B.Show
end;

procedure TB.FormClick(Sender: TObject);
begin
postmessage(TA(Owner).Handle,wm_user+1,0,0)
//出错
// postmessage(FFormAHandle,wm_user+1,0,0)
//FormAHandle为传入的句柄,也出错
end;
 
wm_user+1存在吗?或者定义了吗?
 
不需要定义吧,procedure pA(var Msg: Tmessage);message wm_user+1;在窗体A中定义这样一个
响应消息的过程不就行了?
 
我想知道传入Handle为什么没有用?

 
不行了,先睡觉!
 
不知道是不是你的代码没有写完全,反正我也是按你的代码写的,但没有问题的啊!
是不是wm_user+1的值在两个地方对应不到?那样就会出现你的那种错误的!
 
很好,是没有收到消息,还是什么?
编译是没问题的。
你是不是 TB 没有 uses TA:

procedure TForm1.Button1Click(Sender: TObject);
begin
form2:=TForm2.create(Self);
form2.show
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
sendmessage(TForm1(owner).handle,WM_user+1,0,0);
end;
 
[:(!][:(!][:(!][:(!][:(!][:(!][:(!][:(!][:(!]

奇怪了,昨晚在家,只要一运行到postmessage(TA(Owner).Handle,wm_user+1,0,0);这句
就出错,现在在公司,怎么用怎么好,太奇怪了,我再回家试试,没问题就给两位发分!
 
WM_USER+1不对,WINDOWS给用户自定义消息的范围应该是
WM_USER+100到$7FFF
 
fmz说的是,我只是随便写了个,不过WM_USER+1也能响应,不会出错(至少在这个程序中)。
 
fmz说的不对。消息标识只是个32位数而已,交给用户定义的范围就是从WM_USER到$7FFF,
前面的部分已经或是将来要定义消息的(系统保留的)标识数!自定义消息一定要先将
定义消息标识的常量,即一定要先有Const WM_YouMSG=WM_User+1;不可以在程序中直接
用WM_User+1!!!
 
to 晶晶:
“自定义消息一定要先将定义消息标识的常量,即一定要先有Const WM_YouMSG=WM_User+1;
不可以在程序中直接用WM_User+1!!!”
不对吧,我试过了,不用定义常量的。
发:
postmessage(TWinControl(Owner).Handle,wm_user+1,0,0);
收:
procedure wmmymessage1(var Msg: Tmessage);message wm_user+1;
fmz所说正是帮助中说的。
 
To dirk:
谢谢你,刚刚试过直接用wm_user+1,的确可以通过,看来编译器会直接将他转换,
以后回答问题可得注意呀!![:)]
[red]Thank You ![/red]
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
606
import
I
后退
顶部