Caption,Text,WindowText的区别——TControl也有FText,是为了模拟一个窗口
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,是为了模拟一个窗口的更多相关文章
- 宽字符————_T、_TEXT、L、TEXT之间的区别
_T._TEXT.L.TEXT之间的区别 在分析前先对三者做一个简单的分类 _T._TEXT.TEXT三者都是根据编译器的环境进行ANSI/UNICODE变换的,_T和_TEXT是根据_UNICODE ...
- jquery html属性和text属性的区别
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- python requests的content和text方法的区别(转)
原文地址: http://blog.csdn.net/xie_0723/article/details/51361006 问题: 一直在想requests的content和text属性的区别,从pri ...
- application/xml 和 text/xml的区别
application/xml and text/xml的区别 经常看到有关xml时提到"application/xml" 和 "text/xml"两种类型, ...
- jquery 中 html与text函数的区别
jquery 中 html与text函数的区别 共同点:它们都能讲函数中的参数渲染到页面中: 异同点: text() 只是简单的讲参数的内容写入到页面中: html() 会根据参数的值,判断是否字体符 ...
- nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...
- alt text 与 tooltip区别
在做工具的Accessiblity测试时, 对于image对象,一直分不清它的alt属性与tooltip属性的区别与用法, 从网上查了下, 比较认同这样的观点: alt属性: alternative ...
- application/x-www-form-urlencoded multipart/form-data text/plain 的区别和作用
我们知道在通过POST方式向服务器发送AJAX请求时最好要通过设置请求头来指定为application/x-www-form-urlencoded编码类型.知道通过表单上传文件时必须指定编码类型为&q ...
- Python:bs4中 string 属性和 text 属性的区别及背后的原理
刚开始接触 bs4 的时候,我也很迷茫,觉得 string 属性和 text 属性是一样的,不明白为什么要分成两个属性. html = '<p>hello world</p>' ...
随机推荐
- [置顶] Java Web开发教程来袭
Java Web,是用Java技术来解决相关web互联网领域的技术总和.web包括:web服务器和web客户端两部分.Java在客户端的应用有java applet不过现在使用的很少,Java在服务器 ...
- QtXML 举例
QT读取xml有2个方法 对于xml数据比较大的就要用QXmlStreamReader 对于数据比较小的就用QDomDocument,这个比较方便 我这里就是以QDomDocument为主要内容,讲解 ...
- JTA 深度历险 - 原理与实现---转
利用 JTA 处理事务 什么是事务处理 事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity ).一致性 ( Consistency ).隔离性 ( Isolatio ...
- C++实现二叉树(转)
/************************************************************************* 这是一个二叉查找树,实现了以下操作:插入结点.构造 ...
- Svg图片在asp网站上的使用
最近需要做一个动态的根据后台的返回数据而动态显示的导航图,然后我就采用了jquery+ajax+SVG矢量图来实现这个功能. 首先,客户给了个ai的矢量图,我对这一块不懂就找以前同事帮我转成了svg图 ...
- (转)VS2012网站发布详细步骤
2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 4. 在配置中,要选择“Release”——发布模式(Release 称为发布版本,它往往是进行了各种优化,使得程序 ...
- Source not found for AeceManager$$FastClassByCGLIB$$15dcd49c.invoke(int, Object, Object[]) line: not available 问题解决
一般出现这个问题,是manager的问题.控制台没有报错.是调试出来的.. 解决办法: 在调用此方法的manager里的方法上加上try ...catch 重新启动调试, 就可在控台看到问题所在. ...
- CI框架多目录设置
1,设置目的,前台与后台实现独立目录管理 2.通过http://www.myci.com 访问前台,通过http://www.myci.com/admin 访问后台, 多目录的意思是指在同一个网 ...
- 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)
委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...
- Servlet(三)
重定向 服务器向浏览器发送一个302状态码以及一个Location消息头(该消息头的值是一个地址,称之为重定向地址),浏览器收到后会立即向重定向的地址发出请求,使用相应对象的API方法实现(respo ...