許多的面向對象程序設計語言都支持對消息的處理。消息處理是一種動態響應客戶類發出的請求,它與過程調用不同。過程調用中,客戶類必須知道服務類提供了哪些過程,以及每個過程的調用約定,並且在調用時需要明確指出要調用服務類中的哪個過程,相當於靜態地將客戶類與服務類進行了某種調用關系的綁定,這將導致客戶類與服務類的耦合度增加。消息處理則是動態的,當客戶類需要某程服務時,會向服務類發送一個消息,當服務類收到此消息後,會檢查自己是否有響應此消息的處理過程,如果有則調用該過程。我們可以舉個例子來說明這兩種處理方式的不同。比如我們想從A城市到B城市去,一種方法是你知道酒店商務中心提供訂票服務,打電話訂一張機票,這相當於是過程調用,你明確的知道誰可以提供服務,提供哪種服務;另一種方法是打電話到灑店前台,說你要一張前往B城市的機票,需要其幫你准備,稍後前台就會告訴你是否准備好了,我們並不知道前台是否提供這種服務,只是說出了我們的要求(發送消息給前台)。
下面我們以Delphi為使用語言,說明在程序設計中消息是如何定義、發送和處理的。在Delphi中聲明消息處理過程之前,首先要定義一個消息常,其值為一個整數(取值范圍在1到49151之間),一般我們會使用Messages單元中定義的WM_USER常量作為基數。
const
CM_EmbeddableFormClose = WM_User + $01;
一般情況下Windows消息是使用WM_作為前綴,表示Windows Message;用戶自定義的消息則以CM_作為前綴,表示Customer Message。
在定義好消息之後,就需要定義一個處理該消息的消息過程。消息方法是由消息發分發而觸發的,不需要程序員顯示的調用,所以一般都是將其聲明為一個類的私有方法Private,當然如果該類的子類需要改寫這方法,則可以將其聲明為保護方法Protected。
Type
TMessageTester = class
private
procedure EmbeddableFormClose(Var Msg: TMessage); Message CM_EmbeddableFormClose;
public
......
end;
此處僅為了說明消息方法的使用,故沒有列出其全部的代碼。由於它被聲明為私有方法,所在在客戶類中是看不到這個方法的,也就無法通過指定方法名的方式調用,但我們可以使用發送消息來調用這一方法。
PostMessage(HostForm.Handle, CM_EmbeddableFormClose, 0, Handle);
Application.ProcessMessages;
這樣我們就向服務類(即上面代碼中的HostForm)發送了CM_EmbeddableFormClose消息,服務類在查找到該消息的處理方法時即執行該方法中的代碼。