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屬性賦予一個檔案名稱的值,或是在設計時Project|Options對話方塊的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。在設計時可透過Project|Options對話框中的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訊息類型。