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>' ...
随机推荐
- nodejs 简单对mongodb 操作
路由到了 index.js /* * GET home page. 控制器 */ exports.index = function(req, res){ // res.render('index', ...
- 分享一个牛逼的PHP无限极分类生成树方法,巧用引用(转)
你还在用浪费时间又浪费内存的递归遍历无限极分类吗,看了该篇文章,我觉得你应该换换了.这是我在OSChina上看到的一段非常精简的PHP无限极分类生成树方法,巧在引用,整理分享了. function g ...
- ini格式数据生成与解析具体解释
ini格式数据生成与解析具体解释 1.ini格式数据长啥样? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/ ...
- Java基础知识强化之集合框架笔记30:集合之泛型的引入
1. 泛型的引入: (1)首先我们看看下面这一段代码,如下: package cn.itcast_01; import java.util.ArrayList; import java.util.It ...
- svn 树冲突
情况类似如下:(其中 removed_directory 是你工作的某个目录) 代码如下 复制代码 $svn statusD C removed_directory> local ...
- HTML特效代码大全
1)贴图:<img src="图片地址">2)加入连接:<a href="所要连接的相关地址">写上你想写的字</a>1)贴 ...
- 【转】到底EJB是什么
[转]到底EJB是什么 到底EJB是什么?被口口相传的神神秘秘的,百度一番,总觉得没有讲清楚的,仍觉得一头雾水.百度了很久,也从网络的文章的只言片语中,渐渐有了头绪. 用通俗话说,EJB就是:&quo ...
- oc常用正则表达式
常用的第三方正则库: http://regexkit.sourceforge.net/RegexKitLite/index.html 匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹 ...
- ILMerge合并程序
在DOS窗口中,进入到ILMerge的安装目录 中 如图所示,之后写合并代码, 使用命令进行捆绑,以如图为例,将CSkin.dll和MyTool.exe捆绑成一个新的newtool.exe文件./ou ...
- Nhibernate 智能提示 以及其他类库智能提示
Nhibernate 的智能提示 Nhibernate.dll 放到以下路径 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framewo ...