Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilAlois Kubíček
1
11. Přednáška PPR Zprávy ve Win TMsg Zprávy v Delphi Obsluha zpráv v Delphi Všechny zprávy aplikace Posílání vlastních zpráv Komponenty Volba předka První komponenta
2
Zprávy ve Windows Oznámení o výskytu nějaké události, kterou Win posílají např. naší aplikaci, aby se tato dozvěděla, že se děje něco, co se jí týká. Obsahuje informace o typu události, která nastala a další specifické info pro konkrétní druh zprávy ZPRÁVA sama je záznam-record = TMsg. Fronta zpráv – Message queue Cyklus zpráv – Message loop Procedura okna - Window procedure Co se zprávou? Coje zpráva - message Jak je zpráva implementována?
3
TMsg type TMsg = record Hwnd : Hwnd;// handle okna, pro které je zpráva určena message : Word;// konstanta identifikující zprávu wParam : Longint; // 32 bitová info specifická pro danou zprávu např. Handle okna souvisejícího se zprávou lParam : Longint;// často ukazatel na nějaká data v paměti time : Longint;// čas, kdy byla zpráva vytvořena pt : Tpoint;// pozice kurzoru myši, když vznikla zpráva end; Co když přichází „stejné zprávy“ dané aplikaci? Buď se zařadí poslušně na konec fronty Nebo se nová zpráva ignoruje – známý případ časovače Formulář Tlačítka Seznamy Editační pole ……
4
Zprávy v Delphi Cyklus zpráv je vestavěn do VCL a proto se o to nemusíme starat. Tedy o vybírání zpráv z fronty zpráv a o jejich doručování jsme zatím nemuseli nic vědět. TMsg převedou Delphi na TMessage Type TMessage = record MSg : Cardinal ; case Integer of 0: ( WParam : Longint; LParam : Longint; Result : Longint ); 1: (WParamLo : Word; WParamHi : Word; LParamLo : Word; LParamHi : Word; ResultLo: Word; ResultHi: Word); end; TMessage Je generická datová struktura pro uchování jakékoliv zprávy type TMsg = record Hwnd : Hwnd; message : Word; wParam : Longint; lParam : Longint; time : Longint; pt : Tpoint; end;
5
Nahlédněte do Message.pas Pro další zjednodušení práce se zprávami Delphi poskytují speciální datové typy pro určité typy zpráv Nemusíme tedy dekódovat parametry obecných typů TWMMouse = record Msg : Cardinal; Keys :Longint; case Integer of 0: (Xpos : SmallInt; Ypos : SmallInt); 1: (Pos : TsmallPoint; Result : Longint); end; TWMKey = packed record Msg : Cardinal; CharCode: Word; Unused : Word; KeyData : Longint; Result: Longint; End; specializace dále pokračuje
6
TWMMouseWheel = packed record Msg: Cardinal; Keys: SmallInt; WheelDelta: SmallInt; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end; TMSHMouseWheel = packed record Msg: Cardinal; WheelDelta: Integer; case Integer of 0: ( XPos: Smallint; YPos: Smallint); 1: ( Pos: TSmallPoint; Result: Longint); end; TWMLButtonDblClk = TWMMouse; TWMLButtonDown = TWMMouse; TWMLButtonUp = TWMMouse; TWMMButtonDblClk = TWMMouse; TWMMButtonDown = TWMMouse; TWMMButtonUp = TWMMouse; Typy myších události
7
Obsluha zpráv v Delphi Běžná situace = obsluha událostí Výjimečná situace Standardní situaci potřebujeme ošetřit nestandardním způsobem Chceme ošetřit speciální zprávu, která není zapouzdřena do události Delphi Vytvoříme metodu objektové třídy, která má danou zprávu zachytit Jeden z parametrů metody musí být typu TMessage nebo typu specifikujícího zprávu V deklaraci musíme použít direktivu message a za ní zprávu, která ošetřena má být
8
Příklad. Type TForm = class (TForm) private procedure WMPaint ( var Msg : TWMPaint ); message wm_Paint; public end; var Form1 : TForm1; Implementation procedure TForm1.WMPaint ( var Msg: TWMPaint ); begin MessageBeep (0); Inherited; end;.
9
TApplication.OnMessage vidí na všechny zprávy, které jsou poslány všem oknům aplikace. Je to nejvíc zaneprázděné místo aplikace – desítky i víc zpráv za vteřinu. Obsluha události OnMessage je typu TMessageEvent a musí být definována s hlavičkou procedure SomeObject.AppMessageHandler( var Msg: TMsg; var Handled : boolean); procedure TForm1.AppMessageHandler( var Msg: TMsg; var Handled: Boolean); begin Inc(NumMessage); Handled := False; end; Application.OnMessage := AppMessageHandler; Detaily domyslet
10
TApplication.OnMessage II. Když na onMessage přiřadím nějakou proceduru, bude se tato volat kdykoliv je z fronty vybrána zpráva a má být zpracována, ale ještě není.
11
Posílání vlastních zpráv Občas budeme potřebovat poslat zprávy mezi okny nebo ovládacími prvky naší aplikace. Delphi poskytují k tomuto účelu několik možností: 1. metodu Perform(), která pracuje nezávisle na WIN API 2. funkce API SendMessage(), PostMessage() VCL poskytuje metodu Perform() pro všechny potomky TControl. function Perform ( Msg : Cardinal; wParam, lParam : Longint ): Longint ;
12
function TControl.Perform (Msg: Cardinal; WParam, Lparam: Longint): Longint; var Message: TMessage; begin Message.Msg := Msg; Message.WParam := WParam; Message.LParam := LParam; Message.Result := 0; if Self <> nil then WindowProc(Message); Result := Message.Result; end; Toto mohu použít, pokud mám odkaz na instanci cílového prvku (objektu), když ho nemám – například chci poslat zprávu oknu, které není z Delphi a mám pouze handle okna, použijeme 2
13
SendMessage() &PostMessage() SendMessage() pošle zprávu přímo proceduře okna a čeká, dokud nebude zpráva zpracována. PostMessage() pošle zprávu do fronty zpráv okna a vrací se okamžitě. Function SendMessage( hWnd : HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; hWndhandle okna, kterému je zpráva určena Msgidentifikátor zprávy Wparam32bitová info specifická pro danou zprávu LParam32bitová info specifická pro danou zprávu Jak se budou lišit návratové hodnoty těchto dvou funkcí?
14
Zprávy oznamovací notification message – to jsou zprávy, které se posílají rodičovskému oknu, když se v jednom z jeho podřízených ovládacích prvků přihodí něco, co může vyžadovat pozornost rodiče. Tyto zprávy se vyskytují pouze u standardních controls WINDOWS – tlačítek, seznamů, editačních polí - například vybrání textu, posun posouvacího pruhu, klik na controls – to potom vygeneruje notification message, Což v Delphi je obsluhujeme v událostech příslušného ovládacího prvku Co může být příčinou vzniku takové zprávy?
15
Kombinované okénko se seznamem
16
Interní zprávy VCL CM_xxxx Component message CN_xxxx Component notification Co jsme si zůstali dlužni? Vlastní zprávy Posílání zpráv mezi aplikacemi Hromadné posílání zpráv
17
{ Window Messages } const {$EXTERNALSYM WM_NULL} WM_NULL = $0000; {$EXTERNALSYM WM_CREATE} WM_CREATE = $0001; {$EXTERNALSYM WM_DESTROY} WM_DESTROY = $0002; {$EXTERNALSYM WM_MOVE} WM_MOVE = $0003; {$EXTERNALSYM WM_SIZE} WM_SIZE = $0005; {$EXTERNALSYM WM_ACTIVATE} WM_ACTIVATE = $0006; {$EXTERNALSYM WM_SETFOCUS} WM_SETFOCUS = $0007; {$EXTERNALSYM WM_KILLFOCUS} WM_KILLFOCUS = $0008; {$EXTERNALSYM WM_ENABLE} WM_ENABLE = $000A; {$EXTERNALSYM WM_SETREDRAW} WM_SETREDRAW = $000B; {$EXTERNALSYM WM_SETTEXT} WM_SETTEXT = $000C; {$EXTERNALSYM WM_GETTEXT} WM_GETTEXT = $000D; {$EXTERNALSYM WM_GETTEXTLENGTH} WM_GETTEXTLENGTH = $000E; {$EXTERNALSYM WM_PAINT} WM_PAINT = $000F; {$EXTERNALSYM WM_CLOSE} WM_CLOSE = $0010; {$EXTERNALSYM WM_QUERYENDSESSION} WM_QUERYENDSESSION = $0011; {$EXTERNALSYM WM_QUIT} WM_QUIT = $0012;
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.