Delphi中关于TApplication类的详解
TApplication是Delphi应用程序的类型,该类是从TComponent继承,在单元Forms中声明。并且在Forms中有个公用的对象Application。其方法和属性集中包括了 Windows操作系统中创建、运行和销毁应用程序等既定的基本操作和属性,因此在用Delphi编写 Windows应用程序时简化了用户和Windows环境之间的接口。TApplication封装了以下四个功能:
1、Windows消息处理。
2、菜单加速和键盘处理。
3、异常处理。
4、上下文联机帮助。
下面是TApplication中的常用属性、方法和事件。
1、属性
1.1属性Active
属性Active指明了应用程序是否处于活动状态且拥有焦点。定义如下:
property Active: Boolean;
Active是只读属性。当应用程序是活动状态时Active为True,否则为False。TApplica-tion的构造器(constructor) 置Active为True。如果窗口或应用程序拥有焦点,那么该应用程序是活动的。当其它应用程序的窗口成为活的时,当前应用程序即为非活动的。应用程序关闭时TApplication的析构器(destructor) 置Active为False。
在应用程序中,可以用一个计时器(TTimer)来检查属性Active的值,从而确定当前的应用程序是否是活动状态,以便作出相应的处理。也可以在事件OnActive和事件OnDeactive中定义指定的操作。
1.2属性DialogHandle
属性DialogHandle提供使Delphi应用程序使用非Delphi对话框的一种机制。定义如下:
property DialogHandle: HWnd;
当使用API函数CreateDialog创建一个非模式化对话框时需要使用 DialogHandle,并且需要查看应用程序消息循环中的消息以进行相应的操作。比如,当一个非模式化对话框收到一条激活消息(WM_NCACTIVATE)时可以将其句柄赋值到 DialogHandle,当对话框收到一条解除激活消息时置DialogHandle为0。
1.3属性ExeName
属性ExeName包含了可执行的应用程序文件名极其路径信息。定义如下:
property ExeName: string;
ExeName是只读属性。使用ExeName能够得到应用程序可执行文件的文件名。
这是一个很有用的属性。例如,运行光盘中的应用程序 f:/media/myapp.exe 时,可能需要访问目录 f:/media/data/ 中的文件或者确定应用程序所在的驱动器盘符。 这时可以使用Delphi提供的函数ExtractFilePath和ExtractFileName对属性ExeName 进行解析,从而得到需要的信息。
1.4属性Handle
属性Handle提供了对应用程序主窗口句柄的访问。定义如下:
property Handle: HWND;
当调用一个需要父窗口句柄的 Windows API函数时需要使用Handle属性。例如,应用程序中某个动态链接库(DLL) 可能需要父窗口句柄以使得其自身能够弹出并且显示在最前端。使用Application.Handle构成应用程序的若干窗口,使得这些窗口在应用程序中能够被最小化、恢复、有效或无效。注意:编写一个使用 VCL窗体的动态链接库时,应将主运行程序中主窗口的句柄赋值到该动态链接库的Application.Handle属性。这样就使得动态链接库的窗体成为主应用程序的一部分。需要特别指出的是,永远不要在EXE应用程序中给Application.Handle赋值。
1.5属性HelpFile
属性HelpFile指明了应用程序用于显示帮助内容的文件名。定义如下:
property HelpFile: string;
使用HelpFile是为了应用程序拥有一个使用标准Windows帮助系统的帮助文件。Windows显示由HelpFile属性指明的帮助文件。要让应用程序实现这一点,必须在运行时为HelpFile属性赋予一个文件名的值,或者在设计时ProjectOptions对话框的Application页面中指定一个帮助文件。默认情况下,HelpFile是一个空串(''),并且应用程序的帮助方法忽略所有的试图显示帮助。如果HelpFile包括任何内容,帮助主题的方法将根据文件名调出 Windows帮助系统以提供联机帮助。
注意:如果活动窗口的帮助文件已指定,则该文件将优先于应用程序的帮助文件显示。
1.6属性Hint
属性Hint指明了出现在帮助提示框(Help Hint box)中的文本字符串。定义如下:
property Hint: string;
TApplication.Hint属性就是鼠标正在移动经过的控件或菜单项的 Hint值。该属性也能被赋予一个向用户提供动作、错误或其它信息的字符串值。因此,使用Hint属性也能够:从控件传递提示信息到另一显示区,例如通过OnHint事件句柄将提示显示到状态栏中。这时是读取Hint属性。当应用程序正在进行某一动作时简要描述其状态。这时是设置Hint属性。当OnHint事件发生时帮助提示才出现。因此,即使TApplication的Hint属性被赋予状态栏的标题,例如状态栏控件的标题显示Hint属性的当前字符串值,也应归于OnHint事件。
Hint字符串包括两部分:短提示和长提示。短提示用于简洁的弹出提示;长提示与短提示之间用竖线""隔开,用于在状态栏中显示较详细的提示信息。可以使用单元 Controls中提供的字符串函数GetShortHint和GetLongHint从Hint属性中分解得到短提示和长提示。
注意:当应用程序通过设置Hint属性向用户提供某一事件发生的信息时应当切记,默认情况下,当鼠标移动经过某一控件时,Hint字符串被复位到该控件的Hint属性值。
1.7属性HintHidePause
属性HintHidePause 指定了鼠标尚未从控件或菜单项上移开、在隐藏帮助提示之前的时间间隔。定义如下:
property HintHidePause: Integer;
用HintHidePause以毫秒为单位指定等待时间,在TApplication 的构造器中该属性被置为2500毫秒(2.5秒)。控件或菜单项的帮助提示在Hint属性中指定。
注意:默认应将HintHidePause的值预先确定为HintPause属性值的3到5倍较合适。
1.8属性MainForm
属性MainForm唯一标识了应用程序的主窗体。定义如下:
property MainForm: TForm;
属性MainForm指定的窗体不一定等同于应用程序的主窗口。属性MainForm的值一定是由方法CreateForm创建的所有窗体中的第一个窗体,但该窗体未必是应用程序的主窗口。新建一个工程时,MainForm属性值自动置为Form1。在设计时可通过ProjectOptions对话框中的Forms页面在多个窗体中指定其中之一为MainForm。在运行时是不能修改MainForm属性的,因为该属性是只读的。主窗体是应用程序主题创建的第一个窗体。主窗体关闭即应用程序终止。在应用程序中,可以调用方法Application.MainForm.Close来终止应用程序运行,可以获取Application.MainForm.Top、Application.MainForm.Left 等属性的值从而确定当前活动窗口的位置以及尺寸等。
1.9属性ShowMainForm
属性ShowMainForm确定了是否在应用程序启动时显示主窗体。定义如下:
property ShowMainForm: Boolean;
应用程序用ShowMainForm属性控制是否以及何时显示其主窗体。TApplication的构造器置ShowMainForm为True。默认情况下主窗体将被显示,MainForm属性中指明了主窗体。
如果需要在应用程序启动时隐藏主窗体,那么应在主工程文件中调用 Application.Run之前置ShowMainForm为False,并且确信主窗体的Visible属性值为False。这在许多实现OLE自动化服务器是很有用的,比如在启动自动化服务时隐藏服务器程序的主窗体。
另外,如果需要在应用程序启动时显示一个闪出图片(Flash) 并为应用程序的环境做一些准备,同时需要禁止主窗体显示,这也可以利用属性ShowMainForm来实现。比如Delphi启动时就禁止了主窗体的显示。
1.10属性Terminated
属性Terminated报告程序是否收到终止程序的Windows消息WM_QUIT。定义如下:
property Terminated: Boolean;
Terminated是只读属性。该属性主要用于调用ProcessMessages 方法时应用程序不必在停止后试图处理Windows 消息。当ProcessMessages方法收到消息WM_QUIT时,Terminated将被置为True。
Delphi应用程序总会因为主窗体或应用程序关闭,或者因为Terminate 方法被调用而收到消息WM_QUIT。
当应用程序执行强度较大、占用系统资源较多的运算时,应当周期性地调用Applicati-on.ProcessMessages方法,并检查属性Application.Terminated以确定是否需要终止运算从而终止应用程序。
1.11属性UpdateFormatSettings
属性UpdateFormatSettings指明了当用户改变系统配置时应用程序是否自动更新格式设置。定义如下:
property UpdateFormatSettings: Boolean;
使用UpdateFormatSettings属性应用程序可以控制自动更新格式设置。TApplication的构造器置该属性为True。当应用程序收到消息WM_WININICHANGE时将检查UpdateFormatSett-ings属性。建议使用默认的格式设置,也就是Windows本地的设置。可以置UpdateFormatSe-ttings为False以避免在Delphi应用程序执行期间改变格式设置。
1.12属性UpdateMetricSettings
属性UpdateMetricSettings属性指明是否对提示窗口字体和图标标题等相关设置进行更新。定义如下:
property UpdateMetricSettings: Boolean;
UpdateFormatSettings属性指明系统中提示窗口字体和图标标题等设置改变是否反映到应用程序中相关设置的改变。TApplication的构造器置UpdateMetricSettings的初始值为True。
2、方法
2.1方法BringToFront
方法BringToFront设置应用程序中最近一次的活动窗口到桌面上所有窗口的最前端。其定义如下:
procedure BringToFront;
用BringToFront方法可以找到属于主窗体的最近一次的活动窗口并且将其置于最前端。BringToFront方法也可以测试和查看一个窗口在成为最前端窗口之前是否是可见 (Visible) 和有效的(Enabled) 。 例如,当应用程序收到邮件时,可能需要将专门的处理程序激活并置于Windows 桌面的最前端。这时就可以调用Application.BringToFront方法来实现。
2.2方法CreateForm
方法CreateForm方法用于创建新的窗体(form)。定义如下:
procedure CreateForm(FormClass: TFormClass; var Reference);
Delphi应用程序总会调用CreateForm方法。因此程序员很少有必要直接调用CreateForm方法。一个典型的Delphi工程在工程的主体代码部分包括一处或多处调用CreateForm方法,并且在使用窗体设计器时自动控制窗体的创建。也可以在运行时可以调用CreateForm方法来动态创建窗体。CreateForm方法根据FormClass 参数创建一个新的指定的窗体并且将窗体赋予到变量参数Reference。 新创建的窗体的所有者就是对象Application。 应用程序将第一个调用CreateForm 创建的窗体默认为工程的主窗体。
2.3方法HandleException
方法HandleException为应用程序的异常提供默认的句柄。定义如下:
procedure HandleException(Sender: TObject);
方法HandleException 对于编写特定组件的作者来说是很有用的,因为它可以产生一个不必对Windows 消息产生响应的事件。在应用程序中可以利用OnException 事件句柄将其它的异常操作控制在自定义的代码中。在应用程序代码中,如果异常跳过了所有的try 块,那么应用程序将自动调用HandleE-xception方法,并将显示一个提示有错误发生的对话框。除非异常对象是EAbort,此时Han-dleException将调用OnException句柄(如果存在),否则将调用ShowException显示一个提示有错误发生的对话框。
2.4方法UnhookMainWindow
UnhookMainWindow方法用于释放由HookMainWindow方法挂在主窗体的程序。定义如下:
type TWindowHook = function(var Message: TMessage): Boolean of object;
procedure UnhookMainWindow(Hook: TWindowHook);
用UnhookMainWindow可以释放挂钩窗口。在参数Hook中指明对话框过程。TwindowHook 类型是调用HookMainWindow方法的参数。该参数是非Delphi对话框中调用对话程序的方法指针。对话程序与窗口程序相似,都是为对话框处理消息,只是语法不同。
3、事件
3.1事件OnActivate
当应用程序成为活动状态时OnActivate事件发生。定义如下:
type TNotifyEvent = procedure (Sender: TObject) of object;
property OnActivate: TNotifyEvent;
用OnActive事件编写一个事件句柄来完成当应用程序成为活动状态时指定特别的处理。当一个Windows 应用程序最初运行时或其焦点从另一个Windows 应用程序转移回到当前应用程序时,该应用程序成为活动状态。
3.2事件OnDeactivate
当应用程序成为非活动状态时OnDeactivate事件发生。定义如下:
type TNotifyEvent = procedure (Sender: TObject) of object;
property OnDeactivate: TNotifyEvent;
在应用程序成为非活动状态之前可以立即触发OnDeactive事件,从而完成在该事件句柄中指定的特别处理。当用户从当前应用程序转换到另一应用程序时,当前应用程序的OnDeactive事件即发生。
3.3事件OnException
当应用程序中的某个无句柄的异常发生时事件OnException发生。定义如下:
type TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
property OnException: TExceptionEvent;
可以通过OnException 事件来改变在应用程序中无句柄的异常发生时的默认动作。在方法TApplication.HandleException方法中,OnException 事件句柄被自动调用。
OnException 事件仅用于处理在进行消息处理时发生的异常。在Application.Run 执行前或执行后发生的异常不会导致OnException事件发生。
如果某个异常在应用程序代码的try 块中被忽略,那么应用程序将自动调用HandleException方法。除非异常对象是EAbort,此时HandleException 将调用OnException句柄(如果存在), 否则将调用ShowException 显示一个提示有错误发生的对话框。TExceptionEvent类型是OnException事件的类型,该类型在应用程序中指向一个处理异常的方法。参数Sender是引发异常的对象,而参数E 是异常对象。
3.4事件OnHelp
当应用程序收到帮助请求时OnHelp事件发生。定义如下:
type THelpEvent = function (Command: Word; Data: Longint; var CallHelp: Boolean): Boolean of object;
property OnHelp: THelpEvent;
用OnHelp编写一个事件句柄以完成有请求帮助时特别的处理。HelpContext方法和HelpJump方法自动引发OnHelp事件。在事件发生之后置CallHelp为True使VCL调用WinHelp;置CallHelp为False以防止VCL调用WinHelp。 Delphi应用程序中所有与帮助有关的方法都经过OnHelp事件。仅当OnHelp事件中的CallHelp参数返回True或OnHelp事件没有被指定到有效的句柄时,WinHelp被调用。
3.5事件OnHint
当鼠标指针移动经过某个控件或菜单项并且该控件或菜单项能够显示帮助提示时,事件OnHint发生。定义如下:
type TNotifyEvent = procedure (Sender: TObject) of object;
property OnHint: TNotifyEvent;
用OnHint编写的事件句柄能够在OnHint事件发生时执行指定的操作。当用户停放鼠标指针在某个控件上,并且该控件的Hint属性值不是空串(''),这时OnHint事件将发生。通常用OnHint事件显示控件或菜单项Hint属性的值作为某个面板控件(如TStatusBar)的标题,因此把面板(panel) 用作状态栏(status bar)。当OnHint事件发生时,Hint属性通常被指定为一个帮助提示(Help Hint)和一个在别处显示的长提示(longer hint)。
3.6事件OnIdle
当应用程序成为空闲状态时OnIdle事件发生。定义如下:
type TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;
property OnIdle: TIdleEvent
用OnIdel编写一个事件句柄当应用程序空闲时完成指定的操作。当应用程序不执行任何代码时即为空闲的。例如,当应用程序等待用户输入时该应用程序是空闲的。
TIdelEvent类型是OnIdel事件的类型,它指向一个当应用程序空闲时运行的方法。对象TIdelEvent有一个默认为True的布而变量Done。当Done为True时,Windows API 函数WaitMessage将在OnIdel返回时被调用。WaitMessage 使其它应用程序得到控制焦点直到应用程序的消息队列中出现一条新的消息。当参数Done为False 且应用程序不忙时,应用程序不会使其它应用程序得到控制焦点。当应用程序转为空闲状态时,OnIdel事件仅发生一次,直到参数Done置为True才可能发生下一次OnIdel事件。应用程序置Done为False消除了紊乱的CPU时间计数,而该计数可能影响整个系统的性能。
3.7事件OnMessage
当应用程序收到WINDOWS消息时产生,定义如下:
type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;
property OnMessage: TmessageEvent
用于接收WINDOWS消息,该事件能接收程序向WINDOWS发送的所有消息。应用程序接收到一个消息时产生该事件。变量Msg是WINDOWS消息类型。