Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

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 

Podobné prezentace


Prezentace na téma: "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 "— Transkript prezentace:

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;


Stáhnout ppt "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 "

Podobné prezentace


Reklamy Google