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. Android 图标上面添加提醒(一)使用Canvas绘制

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在我们开发一些如通讯录.社交等应用或者应用添加新功能模块时,会考虑在对应的图标上加上未读信息的数量,或者是新功能提醒的图标,这样不占太大空间还能达 ...

  2. xslt语法之---position()函数

    最近在学习使用XSLT,很好很强大的样式表语言.使用到了position()函数特此记录一下. position()函数--返回节点位置 语法:position() 参数:无 返回值:整数 用途:该函 ...

  3. Map 迭代 两种方法

    Map 迭代 两种方法 Map<String, String> map=new HashMap<String,String>(); map.put("1", ...

  4. python之enumerate枚举 第二篇(六):enumerate枚举

    [Python之旅]第二篇(六):enumerate枚举   python enumerate枚举 摘要: 1.普通情况下打印列表中索引号及其对应元素     使用下面的循环: 1 2 3 4 5 6 ...

  5. SQL常用的语句和函数

    order by 的数值型灵活使用 select * from table_a where order by decode(函数,'asc',1,'desc',-1)*jsny; 控制试图的访问时间: ...

  6. Tomcat- java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet

    在MyEclipse中启动Tomcat的时候报错: java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServ ...

  7. 关于SQL IO的一些资料

      前些天在做优化的时候发现一个有意思的现象,单纯的SQL执行很快,秒级返回,但是页面响应却很慢,一直在想这是为什么呢?有点怀疑服务器的IO有问题,想了想做了个实验,模拟了同样的场景,通过优化SQL将 ...

  8. CSRF 攻击的应对之道

    转载自imb文库 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在 ...

  9. 【转】 iOS开发之手势gesture详解

    原文:http://www.cnblogs.com/salam/archive/2013/04/30/iOS_gesture.html 前言 在iOS中,你可以使用系统内置的手势识别 (Gesture ...

  10. 如何制作css3的3d动画——以骰子旋转为例,详解css3动画属性

    首先先来看两个用css3实现的炫酷的3d动画效果 1 2 3 4 5   6 你没看错,这个炫酷的效果都是用css3实现的. 下面是动画实现所需要用到的几个css3属性. 1.perspective: ...