VCL -- Understanding the Message-Handling System
Understanding the Message-Handling System
http://docwiki.embarcadero.com/RADStudio/XE7/en/Understanding_the_Message-Handling_System
All VCL classes have a built-in mechanism for handling messages, called message-handling methods or message handlers.
The basic idea of message handlers is that the class receives messages of some sort and dispatches them,
calling one of a set of specified methods depending on the message received.
If no specific method exists for a particular message, there is a default handler.
The following diagram shows the message-dispatch system:

Dispatching Messages
http://docwiki.embarcadero.com/RADStudio/XE7/en/Dispatching_Messages
When an application creates a window, it registers a window procedure with the Windows kernel.
The window procedure is the routine that handles messages for the window.
Traditionally, the window procedure contains a huge case statement with entries for each message the window has to handle.
Keep in mind that "window" in this sense means just about anything on the screen:
each window, each control, and so on.
Every time you create a new type of window,
you have to create a complete window procedure.
The VCL simplifies message dispatching in several ways:
- Each component inherits a complete message-dispatching system.
- The dispatch system has default handling.
You define handlers only for messages you need to respond to specially. - You can modify small parts of the message handling and rely on inherited methods for most processing.
The greatest benefit of this message dispatch system is that you can safely send any message to any component at any time.
If the component does not have a handler defined for the message, the default handling takes care of it, usually by ignoring the message.
Tracing the flow of messages
The VCL registers a method called MainWndProc as the window procedure for each type of component in an application.
MainWndProc contains an exception-handling block, passing the message structure from Windows to a virtual method called WndProc
and handling any exceptions by calling the application class's HandleException method.
MainWndProc is a nonvirtual method that contains no special handling for any particular messages.
Customizations take place in WndProc, since each component type can override the method to suit its particular needs.
WndProc methods check for any special conditions that affect their processing so they can "trap" unwanted messages.
For example, while being dragged, components ignore keyboard events,
so the WndProc method of TWinControl passes along keyboard events only if the component is not being dragged.
Ultimately, WndProc calls Dispatch, a nonvirtual method inherited from TObject,
which determines which method to call to handle the message.
Dispatch uses the Msg field of the message structure to determine how to dispatch a particular message.
If the component defines a handler for that particular message, Dispatch calls the method.
If the component does not define a handler for that message, Dispatch calls DefaultHandler.
The WndProc Method
http://docwiki.embarcadero.com/RADStudio/XE7/en/The_WndProc_Method
WndProc is the default Windows message handling function for a given control,
and the first method that receives messages on a form.
The WndProc method can be overridden in order to implement specific message responses.
WndProc passes any unhandled messages to the Dispatch method.
VCL controls have a property called WindowProc that points to the WndProc method.
This property can be used to replace or subclass the window procedure.
Before assigning a new value to WindowProc, the original value should be stored.
After completing any specialized message handling, call the original WindowProc
to make sure the normal message processing works as expected.
Note: If you are a component writer customizing the window procedure for a descendent class, y
ou should override theWndProc method instead of replacing or subclassing it.
Note: When overriding WndProc to provide specialized responses to messages,
be sure to call the inherited WndProc method at the end,
in order to dispatch any unhandled messages.
Trapping Messages
http://docwiki.embarcadero.com/RADStudio/XE7/en/Trapping_Messages
Under some circumstances, you might want your components to ignore messages.
That is, you want to keep the component from dispatching the message to its handler.
To trap a message, you override the virtual method WndProc.
For VCL components, the WndProc method screens messages
before passing them to the Dispatch method,
which in turn determines which method gets to handle the message.
By overriding WndProc, your component gets a chance to filter out messages before dispatching them.
An override of WndProc for a control derived from TWinControl looks like this:
procedure TMyControl.WndProc(var Message: TMessage);
begin
{ tests to determine whether to continue processing } inherited WndProc(Message);
end;
The TControl component defines entire ranges of mouse messages that it filters when a user is dragging and dropping controls.
Overriding WndProc helps this in two ways:
- It can filter ranges of messages instead of having to specify handlers for each one.
- It can preclude dispatching the message at all, so the handlers are never called.
VCL -- Understanding the Message-Handling System的更多相关文章
- Android Message Handling Mechanism
转自:http://solarex.github.io/blog/2015/09/22/android-message-handling-mechanism/ Android is a message ...
- Understanding the WPF Layout System
Many people don't understand how the WPF layout system works, or how that knowledge can help them in ...
- Android Message handling (based on KK4.4)
一.几个关键概念 1.MessageQueue:是一种数据结构,见名知义,就是一个消息队列.存放消息的地方.每个线程最多仅仅能够拥有一个MessageQueue数据结构. 创建一个线程的时候,并不会自 ...
- 7.4 GRASP原则四:控制器 Controller
4.GRASP原则四:控制器 Controller What first object beyond the UI layer receives and co-ordinates (control ...
- Meandering Through the Maze of MFC Message and Command Routing MFC消息路由机制分析
Meandering Through the Maze of MFC Message and Command Routing Paul DiLascia Paul DiLascia is a free ...
- TAxThread - Inter thread message based communication - Delphi
http://www.cybletter.com/index.php?id=3 http://www.cybletter.com/index.php?id=30 Source Code http:// ...
- System IPC 与Posix IPC(semaphore信号灯)
POSIX下IPC主要包括三种: posix message queue posix semaphores posix shared memory sysytem v IPC包括: system v ...
- Exception Handling Considered Harmful
异常处理被认为存在缺陷 Do, or do not. There is no try. - Yoda, The Empire Strikes Back (George Lucas) by Jason ...
- System中记录体函数命名怪异
//1019unit System; 中发现记录体函数命名怪异//乍一看,很怪异,其实是结构体里面 的变量后面直接写 函数类型了.不像传统先定义T***Event = procedure(S ...
随机推荐
- ssh 或者 scp 无需输入密码的解决办法
这里假设主机A(192.168.100.3)用来获到主机B(192.168.100.4)的文件. 在主机A上执行如下命令来生成配对密钥: ssh-keygen -t rsa 遇到提示回车默认即 ...
- App中嵌入网页浏览器
TOWebViewController 插件 NSURL *url =[NSURL URLWithString:@"http://192.168.1.134:8180/Home/IndexP ...
- 如何在MySql中记录SQL日志
SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用.例如:别人写的复杂代码.生产系统.无调试环境.无原代码... ... 查了一下资 ...
- 获取Request请求的路径信息
从Request对象中可以获取各种路径信息,以下例子: 假设请求的页面是index.jsp,项目是WebDemo,则在index.jsp中获取有关request对象的各种路径信息如下 String p ...
- lua的三目运算符
会lua的都知道三目运算符在lua中的写法是 a and b or c 但这里有个问题,就是当b是nil的时候会返回c的值 今天无意中看到一个大神的写法 (a and {b} or {c})[1] 不 ...
- C++容器和算法
转自:http://www.cnblogs.com/haiyupeter/archive/2012/07/29/2613145.html 容器:某一类型数据的集合. C++标准顺序容器包括:vecto ...
- DouNet学习_收发邮件
一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里 不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...
- 基于Heritrix的特定主题的网络爬虫配置与实现
建议在了解了一定网络爬虫的基本原理和Heritrix的架构知识后进行配置和扩展.相关博文:http://www.cnblogs.com/hustfly/p/3441747.html 摘要 随着网络时代 ...
- Linux配置静态IP
在一块SSD的CentOS配置静态IP 1. 配置静态IP #vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" ...
- [原创]Devexpress XtraReports 系列 10 创建标签报表
今天这篇是Dx Reports 基础初级系列的最后一篇了.以后如果有什么高级的应用,应该另开一个中级使用系列. 昨天发表了Devexpress XtraReports系列第九篇[原创]Devexpre ...