All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
ASP.NET2.0+VS2005利器大评析之优点篇_.net资料_编程技术
SQL中CASE的用法_[SQL,Server教程]
使用PHP脚本修改Linux或Unix系统口令_php资料_编程技术
Asp.Net实例:为DataGrid添加自动编号功能_[Asp.Net教程]
用Php模拟asp.net的页面模型_[PHP教程]
.NET开发中ADO.NET的应用总结_[Asp.Net教程]
在PHP中显示格式化的用户输入_[PHP教程]
ASP.NET的一个简单的数据操作类_[Asp.Net教程]
虚拟主机上asp.net运行权限不足问题及解决_[Asp.Net教程]
C#中PictureBox控件应用实例
Reading number is top 10 pictures
Compared GDP and per capita income in China for 40 years
初五接财神啦!五路财神齐来到
BingBingFan apple dew point photo gallery5
The terra-cotta warriors1
The money of more than 100 countries and regions2
西方气质的东方美女3
两个妞在等世界上最短的火车
身材野火台灣美女2
Li Zongrui hunting video screenshots1
Catch prostitution woman in China
Download software ranking
VC++6.0简体中文版
Be there or be square
1400篇各类破解文章
The cock of the Grosvenor LTD handsome
传奇私服架设教程-chm
Unix video tutorial5
The king of fighters 97(Mobile phone games-apk)
Love the forty days
仙剑奇侠传98硬盘WINXP版
天龙八部最新服务端
aaa published in(发表于) 2014/7/19 0:12:52 Edit(编辑)
delphi组件VCL运行机制

delphi组件VCL运行机制

delphi组件VCL运行机制|TApplication 对象使用实例

2.TApplication 对象

如果用户曾经应用API 编写过Windows 程序,一定知道Windows 应用程序的每一个窗口都有一个大的消息循环以及一个窗口函数(WndProc),此函数用来分发和处理消息。VCL 将这些东西隐藏起来,而重新提供了一种易用的、易理解的虚拟机制给程序员。只要代码单元中包含了Form.pas,就会得到一个对象—TApplication。TApplication 对象是VCL 提供的,在Form.pas 中可以看到如下这个定义:

var

Application:Tapplication

从表面上看,TApplication 类定义了一个应用程序的特性及行为,可以从Application 对象得到应用程序的可执行文件名称(ExeName),设置应用程序的标题(Title)等属性,也可以执行最小化(Minimize)、打开帮助文件(HelpCommand)等操作。

当创建一个默认的应用程序时,会自动得到以下几行代码:

begin

Application.Initialize;

Application.CreateForm(TForm1,Form1)

Application.Run;

End.

这几行代码很简单地展示了TApplication 的功能、初始化、创建必要的窗体及运行。

TApplication 的构造函数主要完成了两项功能,注册窗口类及窗口函数,创建Application 窗口实例。TApplication 类的Run 方法中有这样一段代码:

repeat

try

HandleMessage;

except

HandleException(Self);

end;

until Terminated;

这是主消息循环。看上去似乎没有取消息、分发消息的过程,其实它们都包含在HandleMessage()方法中了。HandleMessage()方法是对ProcessMessage()方法的调用,而在ProcessMessage()中就可以看到取消息、分发消息的动作了,以下是TApplication 中的ProcessMessage()方法的源代码,请注意其中的注释:

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;

var

Handled: Boolean;

begin

Result := False;

// 取消息

if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then

begin

Result := True;

if Msg.Message <> WM_QUIT then

begin

Handled := False;

if Assigned(FOnMessage) then FOnMessage(Msg, Handled);

if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and

not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then

begin

// 熟悉的分发消息过程

TranslateMessage(Msg);

DispatchMessage(Msg);

end;

end

else

/ 如果取到的消息为WM_QUIT,则将Fterminate 设为真

//通知主消息循环退出

//这和WindowDemo 程序中判断GetMessage()函数返回值是否为0 等效

//如果GetMessage()函数取出的消息是WM_QUIT,它的返回值为0

FTerminate := True;

end;

end;

窗口函数是一个回调函数,它被Windows 系统所调用,其参数会给出消息编号、消息参数等信息,以便进行处理。TApplication 的Createhandle 函数将Application 窗口的窗口函数设置为WndProc()。整个WndProc()方法基本只包含了一个庞大的Case 分支,其中给出了每个消息的处理代码,“WM_”打头的为Windows 定义的窗口消息,“CM_?开头的为VCL 库自定义的消息。 需要注意的是,这里给出的WndProc 是属于TApplication 的,而每个Form 另外有自己的窗口函数。




添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.