首頁 考試吧論壇 Exam8視線 考試商城 網絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載 | ||
![]() |
2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試 MPA考試 | 中科院 |
|
![]() |
四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT 新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語 |
|
![]() |
計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證 華為認證 | Java認證 |
|
![]() |
公務員 | 報關員 | 銀行從業資格 | 證券從業資格 | 期貨從業資格 | 司法考試 | 法律顧問 | 導游資格 報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師 人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業資格 | 廣告師職業水平 駕駛員 | 網絡編輯 |
|
![]() |
衛生資格 | 執業醫師 | 執業藥師 | 執業護士 | |
![]() |
會計從業資格考試(會計證) | 經濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師 注冊資產評估師 | 高級會計師 | ACCA | 統計師 | 精算師 | 理財規劃師 | 國際內審師 |
|
![]() |
一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監理工程師 | 安全工程師 質量工程師 | 物業管理師 | 招標師 | 結構工程師 | 建筑師 | 房地產估價師 | 土地估價師 | 巖土師 設備監理師 | 房地產經紀人 | 投資項目管理師 | 土地登記代理人 | 環境影響評價師 | 環保工程師 城市規劃師 | 公路監理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師 |
|
![]() |
繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲 |
對于某些種類的事件,用戶可能想取代缺省處理甚至刪除所有的響應。為支持用戶實現這種功能,你需要傳遞var參數給事件處理過程,并在事件處理過程返回時檢測某個值。空事件處理過程與無事件處理過程有相同作用。因為空事件處理過程不會改變任何var參數值。所以缺省處理總是在調用空事件處理過程后發生。
例如在處理Key-Press事件,用戶可以通過將var參數key的值設置為空字符(#0)來壓制部件的缺省處理,代碼如下:
if Assigned(OnkeyPress) then OnkeyPress(Self key);
if key <> #0 then { 執行缺省處理 } ;
實際的代碼將與這稍有不同,因為它只處理窗口消息,但處理邏輯是相同的。在缺省情況下,部件先調用任何用戶賦予的事件處理過程,然后執行標準處理。如果用戶的事件處理過程將key設為空,則部件跳過缺省處理。
19.2.2.3 處理消息
在傳統Windows編程中,一個很關鍵的方面是處理Windows發送給應用程序的消息。Delphi已經幫你處理了大多數的普通消息,但是在創建部件的過程中有可能Delphi沒有處理方法,得由自己處理消息,也可能創建了新的消息需要處理它們。
學習掌握Delphi的消息處理,要掌握以下三個方面:
● 理解消息處理系統
● 修改(改變)消息處理方法
● 建立新的消息處理方法
1. 理解消息處理系統
所有的Delphi對象內部具有處理消息的機制,如調用消息處理方法或消息處理過程。消息處理的基本思想是對象接收某種消息并派送它們,這是通過調用與接收的消息相應的方法來實現的,如果沒有相應于消息的指定的方法,那就調用缺省處理。下面的圖解表示消息派送系統:
Delphi部件庫定義了將所有Windows消息(包括用戶自定義消息)直接轉換到對象方法調用的消息派送系統。一般沒有必要改變這種消息派送系統,只要建立消息處理方法。
⑴Windows消息中有什么?
Windows消息是包含若干有用的域的數據記錄。記錄中最重要的是一個整型大小的值,該值標識消息。Windows定義了大量的消息。庫單元Messages聲明了所有消息的標識。消息中其它的有用信息包括兩個域參數和結果域。兩個參數分別是16位和32位的。Windows代碼總是以wParam和lParam來引用它們。
最初,Windows程序員不得不記住包含的每一個參數。現在,微軟公司已經命名了這參數。這樣理解伴隨這些消息的信息就更簡單了。例如,WM_KEYDOWN消息的參數被稱為vkey和keydata,這就比wParam和lParam給出了更多的描述信息。
Delphi為不同類型的消息定義了指定的記錄類型。如鼠標消息在long參數中傳遞鼠標事件的x、y座標,一個在高字,一個在低字。使用鼠標消息記錄,你不需要自己關心哪個字是哪個座標,因為引用這些參數時通過名子Xpos和Ypos取代了lParamLo和lParamHi。
⑵ 派送方法
當應用程序創建窗口時,在Windows Kernel中注冊了一個窗口過程。窗口過程是處理窗口消息的函數。傳統上,窗口過程包括了Case表達式,表達式的每個入口是窗口要處理的每一條消息。當你每次創建窗口時,必須建立完整的窗口過程。
Delphi在下列三方面簡化了消息派送:
● 每個部件繼承了完整的消息派送系統
● 派送系統具有缺省處理。用戶只需定義想響應的消息的處理方法
● 可以修改消息處理的一部分,依靠繼承的方法完成大多數處理
這種消息派送系統的最大優點是用戶能在任何時候安全地發送任何消息給任何部件。如果部件沒有為該消息定義處理方法,那缺省處理方法會解決這個問題,通常是忽略它。
Delphi為應用程序每種類型的部件注冊了名為MainWndProc的方法作為窗口過程。MainWndProc包含了異常處理塊,它完成從Windows到名為WndProc的虛方法傳送消息記錄,并且通過調用應用程序對象的HandleException方法處理異常。
MainWndProc是靜態方法,沒有包含任何消息的指定處理方法。定制過程發生在WndProc中,因為每個部件類型都能覆蓋該方法以適合特定的需要。
WndProc方法為每個影響它們處理的任何條件進行檢查,以捕捉不要的消息。例如,當被拖動時,部件忽略鍵盤事件,因此,TWinControl的WndProc只在沒有拖動時傳送鍵盤事件。最后WndProc調用Dispatch方法,該方法是從TObject繼承來的靜態方法,決定什么方法來處理消息。
Dispatch使用消息記錄的Msg域來決定怎樣派送特定消息。如果部件已經給該消息定義了處理方法,則Dispatch調用該方法,反之,Dispatch調用缺省處理方法。
2. 改變消息處理方法
在改變自定義部件的消息處理方法之前,先要弄清楚你真正想要做什么。Delphi將大多數的Windows消息轉換成部件編寫者和部件用戶都能處理的事件。一般來說,你應當改變事件處理行為而不是改變消息處理行為。
為了改變消息處理行為,要覆蓋消息處理方法。也能提供捕獲消息防止部件處理該消息。
⑴ 覆蓋處理方法
為了改變部件處理特定消息的方法,要覆蓋那個消息的處理方法。如果部件不處理該消息,你就需要聲明新的消息處理方法。
為了覆蓋消息處理方法,要在部件中以相同的消息索引聲明新的方法。不要使用override指令,你必須使用Message指令和相應的消息索引。
例如,為了覆蓋一個處理WM_PAINT消息的方法,你要重聲明WMPaint方法:
type
TMyComponent=class(…)
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
end;
⑵ 使用消息參數
在消息處理方法內部,自定義部件訪問消息記錄的所有參數。因為消息總是var參數,如果需要的話,事件處理過程可以改變參數的值。Result域是經常改變的參數。Result是Windows文檔中所指的消息的返回值:由SendMessage返回。
因為消息處理方法的消息參數的類型隨著被處理的消息的變化而變化,所以應當參考Windows消息文檔中的參數的名字和含義。如果出于某種原因要使用舊風格的消息參數(wParam、lParam),可以配合通用類型TMessage來決定Message。
相關推薦:2010年9月計算機等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |