Co je zpráva? Vágně řečeno, zpráva je krátká informace o tom, že se kdesi v systému něco stalo. Po tom, co uživatel udělal cokoli – pohnul myší, stisknul klávesu – ale i „velké“ operace, tedy pokyn k zavření okna, smazání souboru… A s nimi se v tomto článku naučíme pracovat…
Zprávy jsou ryze systémová záležitost, tedy v Delphi nejsou zprávy hlavní parketa, a proto můžeme již poměrně dlouhou dobu v Delphi programovat, aniž bychom pojem zpráva vůbec znali.
Poté, co systém Windows vytvoří zprávu, ji odešle aplikaci, které náleží, a zařadí jí do fronty zpráv pro zpracování smyčkou zprav, což je jakýsi proces v nitru aplikace, který má jedinný ůkol: Převzít zprávu a vyvolat náležitou proceduru, která ji zpracuje. Pozornému čtenáři jistě neunikla spojitost s principem programování v Delphi – „událostmi řízený“.
Ošetření zprávy
První příklad dává čtenáři představu, kolik zpráv asi tak v systému „běhá“. Ošetřovat budeme jednoduše bez rozlišení typů zpráv pomocí procedury Application.onmessage
. Tato procedura je zavolána vždy, když smyčka zpráv vyhodnotí jakoukoli zprávu. Vytvoříme proceduru AppOnMessage
a proměnnou PocetZprav a v události OnCreate
formuláře svážeme námi vytvořenou proceduru s procedurou Application.onmessage
. Nyní již kód:
type
...
private
{ Private declarations }
PocetZprav: Integer; // atribut uchovavajici dosavadni pocet doslych zprav
// procedura AppOnMessage bude spustena vzdy po doruceni jakekoliv zpravy
procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
...
...
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := "Počet zpráv: 0";
Button1.Caption := "&Do seznamu";
Edit1.Text := "";
Application.OnMessage := AppOnMessage; // svazeme udalost OnMessage a metodu AppOnMessage
PocetZprav := 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
// pokud neni editacni pole prazdne, pridame text do seznamu
if Edit1.Text <> "" then ListBox1.Items.Add(Edit1.Text);
end;
procedure TForm1.AppOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
Inc(PocetZprav); // zvysime citac zprav
// upravime titulek formulare
Caption := "Počet zpráv: " + IntToStr(PocetZprav);
end;
Metoda OnMessage
se o zprávě doví dřív než její konkrétní adresát (komponenta). Zprávy, které nejsou zde odchyceny, projdou dál do svého místa určení. Je však možno zajistit, aby zprávu dostal původní příjemce: provádí se to v parametru Handled
, který označuje, zda je zpráva zpracována a nemá pokračovat dál či naopak. Jen tak pro zajímavost, zkuste dopsat do obsluhy události AppOnMessage řádek
:
if Msg.message = $0118 then handled:=true;
Nezdá se vám efekt dostatečný? Zkuste dopsat pouze Handled:=true;
, ale před tím doporučuji uložit rozpracovanou práci.
Po chvilkové práci s aplikací zjistíme, že počet zpráv není vůbec malý, a vezmeme-li v úvahu, že naše aplikace je opravdu jednoduchá, vyjde nám, že u velkých a složitých aplikací se počet zpráv pohybuje v řádu desetitisíců.
Tip: Ošetření události OnMessage
nemusíme provádět programově jako v příkladu, jde to i pomocí komponenty ApplicationEvents
z palety Additional. Ta nám „zapouzdřuje“ všechny procedury typu Application.