请高手指点VCL消息发送问题.(100分)

  • 主题发起人 主题发起人 lzw529
  • 开始时间 开始时间
L

lzw529

Unregistered / Unconfirmed
GUEST, unregistred user!
想问一下VCL消息传递,在制作控件时,自定义控件包含其它标准型控件.
自定义控件怎样发送消息给自定义控件中的控件的?可通过什么方法?
在处理自定义控件的消息时能否发送消息给自定义控件中的控件?
procedure TlzwBtnLabel.CMMouseLeave(var Message:TMessage);
begin
FLabel.Font.Color := FLabelFontOutColor;
UserMsg.Visible:=false;
//FSpeedBtn.Perform(CM_MOUSELEAVE,0,0);
//inherited;
end;
TlzwBtnLabel是自定义控件,FSpeedBtn是自定义控件中创建的控件,加入注释部分后出现堆栈益出的错误.请问是那里有问题?
 
在处理自定义控件的消息时能否发送消息给自定义控件中的控件?
按道理是可以的,不过你得特别小心。考虑不好很任意出问题。

你试一试,PostMessage(FSpeedBtn, CM_MOUSELEAVE,0,0)呢
 
只要inherited不要/FSpeedBtn.Perform(CM_MOUSELEAVE,0,0),这样就递归调用了,而且没有结束代码,自然就堆栈溢出。
 
不需要 FSpeedBtn.Perform(CM_MOUSELEAVE,0,0), 因为 FSpeedBtn 的父控件(即TlzwBtnLabel)会自动向子控件发送的。但可以向子控件发送不同的消息,没有问题。
 
回yostgxf:试过了,不行.
回铁盒子:inherited无论放在什么位置或者删掉都不行,堆栈一样会溢出.
回自由者:不需要 FSpeedBtn.Perform(CM_MOUSELEAVE,0,0)的话,跟本就没有任何反应.
很多谢大家的建议,我想问一下大家有没有实践过,可否给些代码参考.
我试过几种方法了,自定义的控件应该要发消息使内含的控件响应的吧!
我怀疑是内含的控件CM_MOUSELEAVE与自定义的控件的CMMouseLeave有冲突之类的东西出现.因为消息函数都是调用CM_MOUSELEAVE.
我把代码改成这样:
procedure TlzwBtnLab.WndProc(var Message: TMessage);
begin
if (Message.Msg=WM_MOUSEMOVE) then
begin
FSpeedBtn.Perform(CM_MOUSEENTER,0,0);
end
else if (Message.Msg=CM_MOUSELEAVE{WM_MOUSELEAVE}) then
begin
FSpeedBtn.Perform(CM_MOUSELEAVE,0,0);
end;
用大括号之内的参数,就不会发生堆栈益出.但是就不会响应CM_MOUSELEAVE.
而程序的上部分的if是可以正常运行.我想堆栈益出是发生在消息发送和接收之中.
CM_MOUSELEAVE是用来响应MOUSE离开FSpeedBtn的事件的.
 
多人接受答案了。
 
后退
顶部