如何扑捉触发的消息!(100分)

  • 主题发起人 主题发起人 wzl1027
  • 开始时间 开始时间
W

wzl1027

Unregistered / Unconfirmed
GUEST, unregistred user!
本人学习写控件,遇到了一些小问题,请高手指点:
比如:TEdit控件的设置输入长度问题,里头在设置长度的时候触发了EM_LimitText消息,但是不知道在哪里扑捉消息,这是什么原因呢?
经常看到一些只是触发消息,但是不知道怎么接收,望高手指点!!!
 
定义方法:
procedure yourprocedure(var Msg :TMessage); message EM_LimitText;
 
同意楼上
在你需要扑捉消息的地方定义一个消息处理过程就行了.
当消息出现时, 就会响应这个过程
 
用WNDPROC 来做,重载TWINCONTROL的。
 
to eyes4
就是没有找到
procedure yourprocedure(var Msg :TMessage); message EM_LimitText;
这样的函数啊

to Wind28
利用WNDProc该怎么处理呢?
能说详细一点吗?谢谢!
 
有的话就覆载,没有的话自己定义啊。
 
'就是没有找到
procedure yourprocedure(var Msg :TMessage); message EM_LimitText;
这样的函数啊' 什么意思?
在你需要扑捉消息的地方自己定义的.
当消息出现时, 就会响应这个过程
 
这个函数是你自己定义的啊,你在函数体里写上你要响应的代码,有消息来的时候,自然会转入这个函数的
 
樓上的都說的很白了...
 
从TCustomEdit继承一个类,然后用eyes4方法就可以处理.如果不知道VCL处理消息的机制,可以找本书看一看.
 
利用
procedure yourprocedure(var Msg :TMessage); message EM_LimitText;来扑捉消息可以理解
但是问题是比如TEdit控件在过程中触发了很多消息,但是接收消息的很少,基本上没有发现,就比如上面这个消息就没有接收过程,但是就是触发了!
但是实际中的TEdit控件是接受到该消息了的,请问哪里还有写接收消息的过程?
 
一般来说,对应一个消息由一个消息处理过程来处理。
也可以去拦截Window的所有消息。

你的意思是说,很少看到接收消息的过程,是吗?如果不需要处理这些消息,当然就不需要加消息处理的过程。很多消息是为别人服务的,它自己没必要去处理。
 
to yostgxf:
就是能否看到为别人服务的消息处理过程,不然的话我就觉得消息不知道在哪里接收,被谁接收!
 
消息发送都是有接收值的句柄的呀。
消息发送首先到消息队列里,(消息队列由操作系统来处理的),然后转发到各目的地。

消息接收以后自己处理。需要定义一个消息处理过程(上面都已经讨论过了)来处理。也就是你收到这个消息怎么办。

还有不明白的吗? :(
 
谢谢你!还有点不大清楚,能否给个例子。
就比如编辑框的MaxLength消息发送后,是不是由操作系统自身接收呢?
如果不是,那么在哪里定义其接收的过程!
 
我现在忙,有时间马上给你做个例子。
 
好的,谢谢你!!!
 
请问各位大哥:
很多控件都直接触发消息就行了,而没有定义接收过程,是不是消息由操作系统自动接收处理掉了
 
不好意思,最近比较忙。
消息触发和接收,一般在做组件时使用,做个例子有点麻烦。

是这样的。(好难解释哦)
很多window的消息,都由系统自己处理掉了,但你可以去拦截(有必要的话)
也可以自己定义消息。
 
申明 procedure WndProc(var Message: TMessage);override;

sendmessage(frmmain.Handle,EM_LimitText,0,0)//发送你自定义消息

procedure TfrmMain.WndProc(var Message: TMessage);
begin
inherited;
if (Message.Msg = WM_EM_LimitText(你自己定义的消息)) then//接受你到消息
begin
showmessage('接受到了消息');
end;
end;
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
794
DelphiTeacher的专栏
D
D
回复
0
查看
822
DelphiTeacher的专栏
D
D
回复
0
查看
765
DelphiTeacher的专栏
D
后退
顶部