TControl = class(TComponent) // 控件的Windows功能从TControl开始

property Caption: TCaption read GetText write SetText stored IsCaptionStored;
property Text: TCaption read GetText write SetText; // 和Caption是一回事,别名而已
property WindowText: PChar read FText write FText; // Windows窗口的真正标题

destructor TControl.Destroy;
begin
StrDispose(FText);
inherited Destroy;
end;

procedure TControl.DefaultHandler(var Message);
var
P: PChar;
begin
// 很好的帖子:http://blog.163.com/as_liaokun/blog/static/6492896120092514029260
// 问题:为什么要处理这个几个看似不重要的消息呢?原因是:Windows 系统中每个窗口都有一个 WindowText 属性,
// 而VCL 的 TControl 为了模拟成窗口也存储了一份保存在 FText 成员中,所以 TControl 在此接管这几个消息。
// TControl.DefaultHandler 并没有调用 inherited,其实也没有必要调用,因为 TControl 的祖先类都没有实现 DefaultHandler函数。
// 可以认为 DefaultHandler 的执行到此为止。VCL 的消息流程至此为止。

// 针对图形控件的消息处理:
// 处理三个文字消息,反正所有的TControl都有的
// 问题:不过为什么不放在WndProc里面呢。影响效率?取得文字还用的挺多的呢。因为这样更容易截断它,否则放在WndProc第一时间就处理,就难以截断消息了
// 问题:自己给图形按钮发消息执行一遍,写个Blog:
with TMessage(Message) do
case Msg of
WM_GETTEXT: // 取得文字
begin
if FText <> nil then P := FText else P := '';
Result := StrLen(StrLCopy(PChar(LParam), P, WParam - 1));
end;
WM_GETTEXTLENGTH: // 取得文字长度
if FText = nil then Result := 0 else Result := StrLen(FText);
WM_SETTEXT: // 设置文字,如果把这段去掉,所有按钮、标签都没有文字了
begin
P := StrNew(PChar(LParam));
StrDispose(FText);
FText := P; // 这里设置Caption
SendDockNotification(Msg, WParam, LParam); // 类函数
end;
end;
// important 不再继续传递消息了。但是它的子类,都应该调用父类的DefaultHandler函数,以求全面处理,或者避免重复处理。
// 但是这个函数本来就是第三优先级(最低)的消息处理函数,不能奢求太多。
// 问题:最后的消息流向去哪里?回答:Win控件的消息处理,到它自己的DefaultHandler就结束了,因为认识的消息已经处理过了,不认识的消息也一定调用了DefWinProc让系统来处理,并到此结束。
// 图形控件的消息处理是Delphi自己的事情,所以可以很随意,但一般到此也就结束了。当然,这是TObject具有的函数,图形控件还可以覆盖这个函数进行处理呢。
end;

--------------------------------------------------------------------------

Caption属性的来龙去脉:

    property Caption: TCaption read GetText write SetText stored IsCaptionStored;

function TControl.GetText: TCaption;
var
Len: Integer;
begin
Len := GetTextLen;
SetString(Result, PChar(nil), Len); // RTL函数
if Len <> 0 then GetTextBuf(Pointer(Result), Len + 1); // 类函数
end; procedure TControl.SetText(const Value: TCaption);
begin
if GetText <> Value then // 类函数
SetTextBuf(PChar(Value)); // 类函数
end; procedure TControl.SetTextBuf(Buffer: PChar);
begin
// important 无论是否Win控件,都会执行到这里,才能取得标题文字
Perform(WM_SETTEXT, 0, Longint(Buffer)); // 先发消息设置Caption fixme 是不是所有子类都是这样发消息设置Text的?
Perform(CM_TEXTCHANGED, 0, 0); // 就这一处应用。设置完了,还要通知一下,TEdit,TLabel和TGroupBox都有相应的消息处理函数
end;

写一个Label1.Caption:='Hello World';的分析过程~

Caption,Text,WindowText的区别——TControl也有FText,是为了模拟一个窗口的更多相关文章

  1. 宽字符————_T、_TEXT、L、TEXT之间的区别

    _T._TEXT.L.TEXT之间的区别 在分析前先对三者做一个简单的分类 _T._TEXT.TEXT三者都是根据编译器的环境进行ANSI/UNICODE变换的,_T和_TEXT是根据_UNICODE ...

  2. jquery html属性和text属性的区别

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. python requests的content和text方法的区别(转)

    原文地址: http://blog.csdn.net/xie_0723/article/details/51361006 问题: 一直在想requests的content和text属性的区别,从pri ...

  4. application/xml 和 text/xml的区别

    application/xml and text/xml的区别 经常看到有关xml时提到"application/xml" 和 "text/xml"两种类型, ...

  5. jquery 中 html与text函数的区别

    jquery 中 html与text函数的区别 共同点:它们都能讲函数中的参数渲染到页面中: 异同点: text() 只是简单的讲参数的内容写入到页面中: html() 会根据参数的值,判断是否字体符 ...

  6. nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

    nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...

  7. alt text 与 tooltip区别

    在做工具的Accessiblity测试时, 对于image对象,一直分不清它的alt属性与tooltip属性的区别与用法, 从网上查了下, 比较认同这样的观点: alt属性: alternative ...

  8. application/x-www-form-urlencoded multipart/form-data text/plain 的区别和作用

    我们知道在通过POST方式向服务器发送AJAX请求时最好要通过设置请求头来指定为application/x-www-form-urlencoded编码类型.知道通过表单上传文件时必须指定编码类型为&q ...

  9. Python:bs4中 string 属性和 text 属性的区别及背后的原理

    刚开始接触 bs4 的时候,我也很迷茫,觉得 string 属性和 text 属性是一样的,不明白为什么要分成两个属性. html = '<p>hello world</p>' ...

随机推荐

  1. [RxJS + AngularJS] Sync Requests with RxJS and Angular

    When you implement a search bar, the user can make several different queries in a row. With a Promis ...

  2. Java多线程,哲学家就餐问题

    问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条.哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭.上述问题会产生死锁的情况,当5个哲学家都拿起自己右手 ...

  3. UITableView beginUpdate和endUpdate使用的前提

    转载地址:http://blog.csdn.net/vieri_ch/article/details/46893023 UITableView有两个方法,用于单元格动画变化的方法,beginUpdat ...

  4. Linux yum命令重装mysql

    如果是 rpm 安装的话,可以用 rpm -e mysql-server 如果是yum安装的,可以用 yum remove mysql* 删除MySQL安装文件夹 然后使用yum安装mysql: 1. ...

  5. 第二篇:python基础之文件读写

    python基础之文件读写   python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使 ...

  6. web前端开发随手笔记 - 持续更新

    本文仅为个人常用代码整理,供自己日常查阅 html 浏览器内核 <!--[if IE]><![endif]--> <!--[if IE 6]><![endif ...

  7. 访问nginx提示gateway timeout 504 ,发现总是当调用时间超过30s时提示504错误

    解决办法: 需要修改php-fpm的配置文件 request_terminate_timeout=30s 参考文档: http://baike.baidu.com/view/641394.htm ht ...

  8. SQL SERVER字符集的研究(中英文字符集,varchar,nvarchar).

    一. 试验归类测试SQL: drop table a )) insert into a values('a') insert into a values(N'a') insert into a val ...

  9. string.Join和Reverse的简单使用示例

    String.Join 方法 (String, String[]) 串联字符串数组的所有元素,其中在每个元素之间使用指定的分隔符. 例如,如果 separator 为“,”且 value 的元素为“a ...

  10. Eclipse从数据库逆向生成Hibernate带注解的实体类

    http://www.2cto.com/database/201501/372023.html