Delphi中關(guān)于TApplication類的詳解
TApplication是Delphi應(yīng)用程序的類型,該類是從TComponent繼承,在單元Forms中聲明。并且在Forms中有個(gè)公用的對(duì)象Application。其方法和屬性集中包括了 Windows操作系統(tǒng)中創(chuàng)建、運(yùn)行和銷毀應(yīng)用程序等既定的基本操作和屬性,因此在用Delphi編寫 Windows應(yīng)用程序時(shí)簡化了用戶和Windows環(huán)境之間的接口。TApplication封裝了以下四個(gè)功能:
1、Windows消息處理。
2、菜單加速和鍵盤處理。
3、異常處理。
4、上下文聯(lián)機(jī)幫助。
下面就向大家介紹TApplication中的常用屬性、方法和事件。
1、屬性
1. 1屬性Active
屬性Active指明了應(yīng)用程序是否處于活動(dòng)狀態(tài)且擁有焦點(diǎn)。定義如下:
property Active: Boolean;
Active是只讀屬性。當(dāng)應(yīng)用程序是活動(dòng)狀態(tài)時(shí)Active為True,否則為False。TApplica-tion的構(gòu)造器(constructor) 置Active為True。如果窗口或應(yīng)用程序擁有焦點(diǎn),那么該應(yīng)用程序是活動(dòng)的。當(dāng)其它應(yīng)用程序的窗口成為活的時(shí),當(dāng)前應(yīng)用程序即為非活動(dòng)的。應(yīng)用程序關(guān)閉時(shí)TApplication的析構(gòu)器(destructor) 置Active為False。
在應(yīng)用程序中,可以用一個(gè)計(jì)時(shí)器(TTimer)來檢查屬性Active的值,從而確定當(dāng)前的應(yīng)用程序是否是活動(dòng)狀態(tài),以便作出相應(yīng)的處理。也可以在事件OnActive和事件OnDeactive中定義指定的操作。
1.2屬性DialogHandle
屬性DialogHandle提供使Delphi應(yīng)用程序使用非Delphi對(duì)話框的一種機(jī)制。定義如下:
property DialogHandle: HWnd;
當(dāng)使用API函數(shù)CreateDialog創(chuàng)建一個(gè)非模式化對(duì)話框時(shí)需要使用 DialogHandle,并且需要查看應(yīng)用程序消息循環(huán)中的消息以進(jìn)行相應(yīng)的操作。比如,當(dāng)一個(gè)非模式化對(duì)話框收到一條激活消息(WM_NCACTIVATE)時(shí)可以將其句柄賦值到 DialogHandle,當(dāng)對(duì)話框收到一條解除激活消息時(shí)置DialogHandle為0。
1.3屬性ExeName
屬性ExeName包含了可執(zhí)行的應(yīng)用程序文件名極其路徑信息。定義如下:
property ExeName: string;
ExeName是只讀屬性。使用ExeName能夠得到應(yīng)用程序可執(zhí)行文件的文件名。
這是一個(gè)很有用的屬性。例如,運(yùn)行光盤中的應(yīng)用程序 f:\media\myapp.exe 時(shí),可能需要訪問目錄 f:\media\data\ 中的文件或者確定應(yīng)用程序所在的驅(qū)動(dòng)器盤符。 這時(shí)可以使用Delphi提供的函數(shù)ExtractFilePath和ExtractFileName對(duì)屬性ExeName 進(jìn)行解析,從而得到需要的信息。
1.4屬性Handle
屬性Handle提供了對(duì)應(yīng)用程序主窗口句柄的訪問。定義如下:
property Handle: HWND;
當(dāng)調(diào)用一個(gè)需要父窗口句柄的 Windows API函數(shù)時(shí)需要使用Handle屬性。例如,應(yīng)用程序中某個(gè)動(dòng)態(tài)鏈接庫(DLL) 可能需要父窗口句柄以使得其自身能夠彈出并且顯示在最前端。使用Application.Handle構(gòu)成應(yīng)用程序的若干窗口,使得這些窗口在應(yīng)用程序中能夠被最小化、恢復(fù)、有效或無效。注意:編寫一個(gè)使用 VCL窗體的動(dòng)態(tài)鏈接庫時(shí),應(yīng)將主運(yùn)行程序中主窗口的句柄賦值到該動(dòng)態(tài)鏈接庫的Application.Handle屬性。這樣就使得動(dòng)態(tài)鏈接庫的窗體成為主應(yīng)用程序的一部分。需要特別指出的是,永遠(yuǎn)不要在EXE應(yīng)用程序中給Application.Handle賦值。
1.5屬性HelpFile
屬性HelpFile指明了應(yīng)用程序用于顯示幫助內(nèi)容的文件名。定義如下:
property HelpFile: string;
使用HelpFile是為了應(yīng)用程序擁有一個(gè)使用標(biāo)準(zhǔn)Windows幫助系統(tǒng)的幫助文件。Windows顯示由HelpFile屬性指明的幫助文件。要讓應(yīng)用程序?qū)崿F(xiàn)這一點(diǎn),必須在運(yùn)行時(shí)為HelpFile屬性賦予一個(gè)文件名的值,或者在設(shè)計(jì)時(shí)Project|Options對(duì)話框的Application頁面中指定一個(gè)幫助文件。默認(rèn)情況下,HelpFile是一個(gè)空串(‘‘),并且應(yīng)用程序的幫助方法忽略所有的試圖顯示幫助。如果HelpFile包括任何內(nèi)容,幫助主題的方法將根據(jù)文件名調(diào)出 Windows幫助系統(tǒng)以提供聯(lián)機(jī)幫助。
注意:如果活動(dòng)窗口的幫助文件已指定,則該文件將優(yōu)先于應(yīng)用程序的幫助文件顯示。
1.6屬性Hint
屬性Hint指明了出現(xiàn)在幫助提示框(Help Hint box)中的文本字符串。定義如下:
property Hint: string;
TApplication.Hint屬性就是鼠標(biāo)正在移動(dòng)經(jīng)過的控件或菜單項(xiàng)的 Hint值。該屬性也能被賦予一個(gè)向用戶提供動(dòng)作、錯(cuò)誤或其它信息的字符串值。因此,使用Hint屬性也能夠:從控件傳遞提示信息到另一顯示區(qū),例如通過OnHint事件句柄將提示顯示到狀態(tài)欄中。這時(shí)是讀取Hint屬性。當(dāng)應(yīng)用程序正在進(jìn)行某一動(dòng)作時(shí)簡要描述其狀態(tài)。這時(shí)是設(shè)置Hint屬性。當(dāng)OnHint事件發(fā)生時(shí)幫助提示才出現(xiàn)。因此,即使TApplication的Hint屬性被賦予狀態(tài)欄的標(biāo)題,例如狀態(tài)欄控件的標(biāo)題顯示Hint屬性的當(dāng)前字符串值,也應(yīng)歸于OnHint事件。
Hint字符串包括兩部分:短提示和長提示。短提示用于簡潔的彈出提示;長提示與短提示之間用豎線"|"隔開,用于在狀態(tài)欄中顯示較詳細(xì)的提示信息??梢允褂脝卧?/span> Controls中提供的字符串函數(shù)GetShortHint和GetLongHint從Hint屬性中分解得到短提示和長提示。
注意:當(dāng)應(yīng)用程序通過設(shè)置Hint屬性向用戶提供某一事件發(fā)生的信息時(shí)應(yīng)當(dāng)切記,默認(rèn)情況下,當(dāng)鼠標(biāo)移動(dòng)經(jīng)過某一控件時(shí),Hint字符串被復(fù)位到該控件的Hint屬性值。
1.7屬性HintHidePause
屬性HintHidePause 指定了鼠標(biāo)尚未從控件或菜單項(xiàng)上移開、在隱藏幫助提示之前的時(shí)間間隔。定義如下:
property HintHidePause: Integer;
用HintHidePause以毫秒為單位指定等待時(shí)間,在TApplication 的構(gòu)造器中該屬性被置為2500毫秒(2.5秒)??丶虿藛雾?xiàng)的幫助提示在Hint屬性中指定。
注意:默認(rèn)應(yīng)將HintHidePause的值預(yù)先確定為HintPause屬性值的3到5倍較合適。
1.8屬性MainForm
屬性MainForm唯一標(biāo)識(shí)了應(yīng)用程序的主窗體。定義如下:
property MainForm: TForm;
屬性MainForm指定的窗體不一定等同于應(yīng)用程序的主窗口。屬性MainForm的值一定是由方法CreateForm創(chuàng)建的所有窗體中的第一個(gè)窗體,但該窗體未必是應(yīng)用程序的主窗口。新建一個(gè)工程時(shí),MainForm屬性值自動(dòng)置為Form1。在設(shè)計(jì)時(shí)可通過Project|Options對(duì)話框中的Forms頁面在多個(gè)窗體中指定其中之一為MainForm。在運(yùn)行時(shí)是不能修改MainForm屬性的,因?yàn)樵搶傩允侵蛔x的。主窗體是應(yīng)用程序主題創(chuàng)建的第一個(gè)窗體。主窗體關(guān)閉即應(yīng)用程序終止。在應(yīng)用程序中,可以調(diào)用方法Application.MainForm.Close來終止應(yīng)用程序運(yùn)行,可以獲取Application.MainForm.Top、Application.MainForm.Left 等屬性的值從而確定當(dāng)前活動(dòng)窗口的位置以及尺寸等。
1.9屬性ShowMainForm
屬性ShowMainForm確定了是否在應(yīng)用程序啟動(dòng)時(shí)顯示主窗體。定義如下:
property ShowMainForm: Boolean;
應(yīng)用程序用ShowMainForm屬性控制是否以及何時(shí)顯示其主窗體。TApplication的構(gòu)造器置ShowMainForm為True。默認(rèn)情況下主窗體將被顯示,MainForm屬性中指明了主窗體。
如果需要在應(yīng)用程序啟動(dòng)時(shí)隱藏主窗體,那么應(yīng)在主工程文件中調(diào)用 Application.Run之前置ShowMainForm為False,并且確信主窗體的Visible屬性值為False。這在許多實(shí)現(xiàn)OLE自動(dòng)化服務(wù)器是很有用的,比如在啟動(dòng)自動(dòng)化服務(wù)時(shí)隱藏服務(wù)器程序的主窗體。
另外,如果需要在應(yīng)用程序啟動(dòng)時(shí)顯示一個(gè)閃出圖片(Flash) 并為應(yīng)用程序的環(huán)境做一些準(zhǔn)備,同時(shí)需要禁止主窗體顯示,這也可以利用屬性ShowMainForm來實(shí)現(xiàn)。比如Delphi啟動(dòng)時(shí)就禁止了主窗體的顯示。
1.10屬性Terminated
屬性Terminated報(bào)告程序是否收到終止程序的Windows消息WM_QUIT。定義如下:
property Terminated: Boolean;
Terminated是只讀屬性。該屬性主要用于調(diào)用ProcessMessages 方法時(shí)應(yīng)用程序不必在停止后試圖處理Windows 消息。當(dāng)ProcessMessages方法收到消息WM_QUIT時(shí),Terminated將被置為True。
Delphi應(yīng)用程序總會(huì)因?yàn)橹鞔绑w或應(yīng)用程序關(guān)閉,或者因?yàn)?/span>Terminate 方法被調(diào)用而收到消息WM_QUIT。
當(dāng)應(yīng)用程序執(zhí)行強(qiáng)度較大、占用系統(tǒng)資源較多的運(yùn)算時(shí),應(yīng)當(dāng)周期性地調(diào)用Applicati-on.ProcessMessages方法,并檢查屬性Application.Terminated以確定是否需要終止運(yùn)算從而終止應(yīng)用程序。
1.11屬性UpdateFormatSettings
屬性UpdateFormatSettings指明了當(dāng)用戶改變系統(tǒng)配置時(shí)應(yīng)用程序是否自動(dòng)更新格式設(shè)置。定義如下:
property UpdateFormatSettings: Boolean;
使用UpdateFormatSettings屬性應(yīng)用程序可以控制自動(dòng)更新格式設(shè)置。TApplication的構(gòu)造器置該屬性為True。當(dāng)應(yīng)用程序收到消息WM_WININICHANGE時(shí)將檢查UpdateFormatSett-ings屬性。建議使用默認(rèn)的格式設(shè)置,也就是Windows本地的設(shè)置??梢灾?/span>UpdateFormatSe-ttings為False以避免在Delphi應(yīng)用程序執(zhí)行期間改變格式設(shè)置。
1.12屬性UpdateMetricSettings
屬性UpdateMetricSettings屬性指明是否對(duì)提示窗口字體和圖標(biāo)標(biāo)題等相關(guān)設(shè)置進(jìn)行更新。定義如下:
property UpdateMetricSettings: Boolean;
UpdateFormatSettings屬性指明系統(tǒng)中提示窗口字體和圖標(biāo)標(biāo)題等設(shè)置改變是否反映到應(yīng)用程序中相關(guān)設(shè)置的改變。TApplication的構(gòu)造器置UpdateMetricSettings的初始值為True。
2、方法
2.1方法BringToFront
方法BringToFront設(shè)置應(yīng)用程序中最近一次的活動(dòng)窗口到桌面上所有窗口的最前端。其定義如下:
procedure BringToFront;
用BringToFront方法可以找到屬于主窗體的最近一次的活動(dòng)窗口并且將其置于最前端。BringToFront方法也可以測(cè)試和查看一個(gè)窗口在成為最前端窗口之前是否是可見 (Visible) 和有效的(Enabled) 。 例如,當(dāng)應(yīng)用程序收到郵件時(shí),可能需要將專門的處理程序激活并置于Windows 桌面的最前端。這時(shí)就可以調(diào)用Application.BringToFront方法來實(shí)現(xiàn)。
2.2方法CreateForm
方法CreateForm方法用于創(chuàng)建新的窗體(form)。定義如下:
procedure CreateForm(FormClass: TFormClass; var Reference);
Delphi應(yīng)用程序總會(huì)調(diào)用CreateForm方法。因此程序員很少有必要直接調(diào)用CreateForm方法。一個(gè)典型的Delphi工程在工程的主體代碼部分包括一處或多處調(diào)用CreateForm方法,并且在使用窗體設(shè)計(jì)器時(shí)自動(dòng)控制窗體的創(chuàng)建。也可以在運(yùn)行時(shí)可以調(diào)用CreateForm方法來動(dòng)態(tài)創(chuàng)建窗體。CreateForm方法根據(jù)FormClass 參數(shù)創(chuàng)建一個(gè)新的指定的窗體并且將窗體賦予到變量參數(shù)Reference。 新創(chuàng)建的窗體的所有者就是對(duì)象Application。 應(yīng)用程序?qū)⒌谝粋€(gè)調(diào)用CreateForm 創(chuàng)建的窗體默認(rèn)為工程的主窗體。
2.3方法HandleException
方法HandleException為應(yīng)用程序的異常提供默認(rèn)的句柄。定義如下:
procedure HandleException(Sender: TObject);
方法HandleException 對(duì)于編寫特定組件的作者來說是很有用的,因?yàn)樗梢援a(chǎn)生一個(gè)不必對(duì)Windows 消息產(chǎn)生響應(yīng)的事件。在應(yīng)用程序中可以利用OnException 事件句柄將其它的異常操作控制在自定義的代碼中。在應(yīng)用程序代碼中,如果異常跳過了所有的try 塊,那么應(yīng)用程序?qū)⒆詣?dòng)調(diào)用HandleE-xception方法,并將顯示一個(gè)提示有錯(cuò)誤發(fā)生的對(duì)話框。除非異常對(duì)象是EAbort,此時(shí)Han-dleException將調(diào)用OnException句柄(如果存在),否則將調(diào)用ShowException顯示一個(gè)提示有錯(cuò)誤發(fā)生的對(duì)話框。
2.4方法UnhookMainWindow
UnhookMainWindow方法用于釋放由HookMainWindow方法掛在主窗體的程序。定義如下:
type TWindowHook = function(var Message: TMessage): Boolean of object;
procedure UnhookMainWindow(Hook: TWindowHook);
用UnhookMainWindow可以釋放掛鉤窗口。在參數(shù)Hook中指明對(duì)話框過程?! ?/span>TwindowHook 類型是調(diào)用HookMainWindow方法的參數(shù)。該參數(shù)是非Delphi對(duì)話框中調(diào)用對(duì)話程序的方法指針。對(duì)話程序與窗口程序相似,都是為對(duì)話框處理消息,只是語法不同。
3、事件
3.1事件OnActivate
當(dāng)應(yīng)用程序成為活動(dòng)狀態(tài)時(shí)OnActivate事件發(fā)生。定義如下:
type TNotifyEvent = procedure (Sender: TObject) of object;
property OnActivate: TNotifyEvent;
用OnActive事件編寫一個(gè)事件句柄來完成當(dāng)應(yīng)用程序成為活動(dòng)狀態(tài)時(shí)指定特別的處理。當(dāng)一個(gè)Windows 應(yīng)用程序最初運(yùn)行時(shí)或其焦點(diǎn)從另一個(gè)Windows 應(yīng)用程序轉(zhuǎn)移回到當(dāng)前應(yīng)用程序時(shí),該應(yīng)用程序成為活動(dòng)狀態(tài)。
3.2事件OnDeactivate
當(dāng)應(yīng)用程序成為非活動(dòng)狀態(tài)時(shí)OnDeactivate事件發(fā)生。定義如下:
type TNotifyEvent = procedure (Sender: TObject) of object;
property OnDeactivate: TNotifyEvent;
在應(yīng)用程序成為非活動(dòng)狀態(tài)之前可以立即觸發(fā)OnDeactive事件,從而完成在該事件句柄中指定的特別處理。當(dāng)用戶從當(dāng)前應(yīng)用程序轉(zhuǎn)換到另一應(yīng)用程序時(shí),當(dāng)前應(yīng)用程序的OnDeactive事件即發(fā)生。
3.3事件OnException
當(dāng)應(yīng)用程序中的某個(gè)無句柄的異常發(fā)生時(shí)事件OnException發(fā)生。定義如下:
type TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
property OnException: TExceptionEvent;
可以通過OnException 事件來改變?cè)趹?yīng)用程序中無句柄的異常發(fā)生時(shí)的默認(rèn)動(dòng)作。在方法TApplication.HandleException方法中,OnException 事件句柄被自動(dòng)調(diào)用。
OnException 事件僅用于處理在進(jìn)行消息處理時(shí)發(fā)生的異常。在Application.Run 執(zhí)行前或執(zhí)行后發(fā)生的異常不會(huì)導(dǎo)致OnException事件發(fā)生。
如果某個(gè)異常在應(yīng)用程序代碼的try 塊中被忽略,那么應(yīng)用程序?qū)⒆詣?dòng)調(diào)用HandleException方法。除非異常對(duì)象是EAbort,此時(shí)HandleException 將調(diào)用OnException句柄(如果存在), 否則將調(diào)用ShowException 顯示一個(gè)提示有錯(cuò)誤發(fā)生的對(duì)話框。TExceptionEvent類型是OnException事件的類型,該類型在應(yīng)用程序中指向一個(gè)處理異常的方法。參數(shù)Sender是引發(fā)異常的對(duì)象,而參數(shù)E 是異常對(duì)象。
3.4事件OnHelp
當(dāng)應(yīng)用程序收到幫助請(qǐng)求時(shí)OnHelp事件發(fā)生。定義如下:
type THelpEvent = function (Command: Word; Data: Longint; var CallHelp: Boolean): Boolean of object;
property OnHelp: THelpEvent;
用OnHelp編寫一個(gè)事件句柄以完成有請(qǐng)求幫助時(shí)特別的處理。HelpContext方法和HelpJump方法自動(dòng)引發(fā)OnHelp事件。在事件發(fā)生之后置CallHelp為True使VCL調(diào)用WinHelp;置CallHelp為False以防止VCL調(diào)用WinHelp。 Delphi應(yīng)用程序中所有與幫助有關(guān)的方法都經(jīng)過OnHelp事件。僅當(dāng)OnHelp事件中的CallHelp參數(shù)返回True或OnHelp事件沒有被指定到有效的句柄時(shí),WinHelp被調(diào)用。
3.5事件OnHint
當(dāng)鼠標(biāo)指針移動(dòng)經(jīng)過某個(gè)控件或菜單項(xiàng)并且該控件或菜單項(xiàng)能夠顯示幫助提示時(shí),事件OnHint發(fā)生。定義如下:
type TNotifyEvent = procedure (Sender: TObject) of object;
property OnHint: TNotifyEvent;
用OnHint編寫的事件句柄能夠在OnHint事件發(fā)生時(shí)執(zhí)行指定的操作。當(dāng)用戶停放鼠標(biāo)指針在某個(gè)控件上,并且該控件的Hint屬性值不是空串(‘‘),這時(shí)OnHint事件將發(fā)生。通常用OnHint事件顯示控件或菜單項(xiàng)Hint屬性的值作為某個(gè)面板控件(如TStatusBar)的標(biāo)題,因此把面板(panel) 用作狀態(tài)欄(status bar)。當(dāng)OnHint事件發(fā)生時(shí),Hint屬性通常被指定為一個(gè)幫助提示(Help Hint)和一個(gè)在別處顯示的長提示(longer hint)。
3.6事件OnIdle
當(dāng)應(yīng)用程序成為空閑狀態(tài)時(shí)OnIdle事件發(fā)生。定義如下:
type TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;
property OnIdle: TIdleEvent
用OnIdel編寫一個(gè)事件句柄當(dāng)應(yīng)用程序空閑時(shí)完成指定的操作。當(dāng)應(yīng)用程序不執(zhí)行任何代碼時(shí)即為空閑的。例如,當(dāng)應(yīng)用程序等待用戶輸入時(shí)該應(yīng)用程序是空閑的。 TIdelEvent類型是OnIdel事件的類型,它指向一個(gè)當(dāng)應(yīng)用程序空閑時(shí)運(yùn)行的方法。對(duì)象TIdelEvent有一個(gè)默認(rèn)為True的布而變量Done。當(dāng)Done為True時(shí),Windows API 函數(shù)WaitMessage將在OnIdel返回時(shí)被調(diào)用。WaitMessage 使其它應(yīng)用程序得到控制焦點(diǎn)直到應(yīng)用程序的消息隊(duì)列中出現(xiàn)一條新的消息。當(dāng)參數(shù)Done為False 且應(yīng)用程序不忙時(shí),應(yīng)用程序不會(huì)使其它應(yīng)用程序得到控制焦點(diǎn)。當(dāng)應(yīng)用程序轉(zhuǎn)為空閑狀態(tài)時(shí),OnIdel事件僅發(fā)生一次,直到參數(shù)Done置為True才可能發(fā)生下一次OnIdel事件。應(yīng)用程序置Done為False消除了紊亂的CPU時(shí)間計(jì)數(shù),而該計(jì)數(shù)可能影響整個(gè)系統(tǒng)的性能。
3.7事件OnMessage
當(dāng)應(yīng)用程序收到WINDOWS消息時(shí)產(chǎn)生,定義如下:
type TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object;
property OnMessage: TmessageEvent
用于接收WINDOWS消息,該事件能接收程序向WINDOWS發(fā)送的所有消息。應(yīng)用程序接收到一個(gè)消息時(shí)產(chǎn)生該事件。變量Msg是WINDOWS消息類型。
聯(lián)系客服