Delphi中的訊息處理

2021-09-26 04:10:01 字數 4900 閱讀 7401

1、windows的訊息驅動體系

在windows系統中,訊息傳遞是實現物件間通訊和控制的主要手段。可以系統都以訊息驅動的方式工作。系統中發生的使用者輸入操作、顯示資訊的改變、系統環境引數變化等所有事件都以系統定義訊息的形式出現在相關的應用程式和視窗。所以程式設計的主要任務就是為這些訊息的處理設計**。 

在應用程式中,傳送者可以通過傳送訊息,要求接收者完成相應的處理。當程式執行時,windows系統為每個應用程式例項建立乙個訊息佇列,依次儲存傳送給該程式例項的訊息,在應用程式的主控部分,需要設定乙個訊息迴圈,利用一組系統函式從該程式例項的訊息佇列中依次讀取和分析訊息,並將他們傳送給指定的訊息。這種訊息傳遞可以使用系統定義訊息,也可以使用使用者自定義的訊息。現有的多種視覺化開發環境,都已經將這一過程封裝到了各種類,部件,以及部件的方法中。

當我們利用它們寫乙個應用程式時,必須考慮每個物件要做什麼,將他們分解為不同的訊息處理函式,並且對應不同的訊息。雖然有的控制項(部件)種類繁多,編寫程式非常便利。但這些畢竟是一些通用的物件和訊息處理函式,如果我們要編寫自己的部件或者想要更加靈活的運用現有控制項,就必須深刻了解訊息驅動體系以及訊息的對映,訊息處理函式編寫和系統有關訊息操作的函式。 

2、delphi開發環境:

delphi已成為日益普及的優秀的32位windows開發環境,其中乙個最大的特點就是在delphi 中可自定義訊息寫自己的構件(cmponent)的,因為編寫構件一般要對相應的訊息進行處理.。 

3、delphi中的訊息:

在delphi 中所有的類都有乙個內建的用於處理訊息、呼叫訊息處理過程的機制。vcl定義了傳送所有windows訊息(包括自定義訊息)的訊息派送系統,你只需要建立訊息處理方法。乙個windows 訊息是乙個包含多個欄位的資料記錄。其中最重要的是訊息標識,在windows中已經定義了許多訊息,其他有用的字段是兩個引數和乙個結果字段。乙個16位和乙個32位引數wparan錄資料型別:

type

tmessage = packed

record

msg: cardinal;

case integer of

0: (

wparam: longint;

lparam: longint;

result: longint);

1: (

wparamlo: word;

wparamhi: word;

lparamlo: word;

lparamhi: word;

esultlo: word;

resulthi: word);

end;

4、訊息的使用:

在delphi 中使用者可以自定義訊息及訊息處理控制代碼訊息處理控制代碼的定義有如下幾個原則:

1、訊息處理控制代碼方法必須是乙個過程 

2、方法宣告後要有乙個message命令型常數. 

3、訊息處理控制代碼方法不需要用override 命令來顯式指明過載祖先的乙個訊息處理控制代碼 

4、在訊息處理控制代碼中一般先是使用者自己對訊息的處理,用祖先類中對應此訊息的處理控制代碼(有些情況下可能正相反).由於可能對祖先類中對此訊息的處理控制代碼的名字和引數型別不清楚避免,此麻煩呼叫defaulthandler方法.(當然如果要遮蔽掉此訊息了)。

訊息處理控制代碼方法宣告為:

procedure mymsgmethod(var

message:tmessage); message msgtype;

同樣使用者也可以定義自己的訊息自定義訊息及訊息處理控制代碼舉例如下:

const my_paint=wm_user 1

; type

tmypaint=record

msgid:cardinal;

msize:word;

mcolor:longint;

msgresult:longint;

end; //

也可以使用tmessage型別

type

tmycontrol=class

(tcustomcontrol)

protected

procedure change(var

message:tmypaint); message

my_paint;

.....

end;

......

procedure tmycontrol.change(var

message

:tmypaint);

begin

size:=message.msize;

color:=message.mcolor;

inherited;

end;

過載訊息控制代碼方法:你可以直接過載windows定義的視窗訊息新增自己的處理。例如在應用中過載windows的視窗訊息wm_paint:

type

tmycomponent = class

(...)

...

procedure wmpaint(var message: twmpaint); message

wm_paint;

end;

然後再實現部分新增訊息控制代碼的過程。 

5、delphi中有關訊息的重要函式和屬性:

(1) procedure defaulthandler(var message); virtual; 

如果乙個物件處理某個訊息,則該函式提供對訊息的預設處理。 

(2) procedure dispatch(var message); virtual; 

這個函式用於呼叫物件的訊息處理函式。 

(3)windowproc屬性: 

type twndmethod = procedure(var message: tmessage) of object; 

property windowproc: twndmethod;

這個屬性用於指定乙個函式,用這個函式來響應message引數指定的windows訊息。例如:

procedure tmylistboxdescendant.togglesubclass(on: boolean); 

begin 

if on then 

windowproc := subclasswndproc; 

else 

windowproc := wndproc; 

end;

(4)function perform(msg: cardinal; wparam這個函式用來向控制項自己發乙個訊息。 

例如:procedure tform1.button1click(sender: tobject); 

begin 

with richedit1 do 

begin 

selstart := strtoint(maskedit1.text); 

richedit1.perform(em_scrollcaret 

end; 

end;

(5)procedure broadcast(var message);這個函式用於向所有的子控制項廣播乙個訊息。 

(6)procedure defaulthandler(var message); virtual;該函式提供了隊所有訊息的預設處理,可以過載這個虛函式。message引數是無型別的,但可以強制轉換成tmessage型別。

6、windows api中有關訊息的幾個重要函式:

(1)getmessage函式: 

bool getmessage(lpmsg lpmsg hwnd hwnd 

uint wmsgfiltermin uint wmsgfiltermax// 最後的訊息); 

delphi中的定義: 

function getmessagea(var lpmsg: tmsg; hwnd: hwnd; wmsgfiltermin 

這個函式可以有選擇的從訊息佇列重得到訊息。 

(2)translatemessage函式: 

bool translatemessage(const msg *lpmsg // 訊息的位址); 

delphi中的定義: 

function translatemessage(const lpmsg: tmsg): bool; stdcall; 

這個函式用於將virtul-key訊息翻譯為字元訊息。 

(3)dispatchmessage函式: 

long dispatchmessage(const msg *lpmsg // 訊息的指標); 

delphi中的定義: 

function dispatchmessage(const lpmsg: tmsg): longint; stdcall; 

這個函式派送訊息到視窗過程。 

(4)postmessage函式: 

bool postmessage(hwnd hwnd uint msg wparam wparam 

lparam lparam // 第二個訊息引數); 

delphi中的定義: 

function postmessagea(hwnd: hwnd; msg: uint; wparam: wparam; lparam: lparam): bool; stdcall;這個函式用於將訊息傳送到視窗的訊息佇列。

**:

delphi訊息處理

摘自 劉藝 delphi6企業級解決方案與應用剖析 2009 8 23 delphi訊息處理 訊息的資料結構 tmessage record msg word case integer of 0 wparam word lparam longint result longint 1 wparamlo...

Delphi的訊息處理

delphi中的訊息 訊息是windows發出的乙個通知,它告訴應用程式某個事件發生了。在delphi中,大多數情況下windows的訊息被封裝在vcl的事件中,我們只需處理相應的vcl事件就可以了,但如果我們需要編寫自己的控制項 截獲或過濾訊息就必須深入研究win32的訊息處理機制。在delphi...

Delphi中的訊息截獲

windows是乙個基於訊息驅動的系統,因此,在很多時候,我們需要截獲一些訊息然後自己進行處理。而vcl系統又有一些特定的訊息。下面對我所了解的delphi環境中截獲訊息進行一些總結。就個人了解,共有6種方法來截獲 處理訊息。1.訊息鉤子 message hook 特點 可以針對所有有控制代碼的窗體...