Pokrewne
- Strona Główna
- Anders Roslund & Borge Hellstrom Ewert Grens 04.Dziewczyna w tunelu (2007)
- Farmer Philip Jose wiat Rzeki 04 Czarodziejski labirynt
- Davidson MaryJanice Królowa Betsy 04 Nieumarła nieodwracalnie
- Young Samantha On Dublin Street 04 Sztuka uwodzenia
- Elliott Kate Korona gwiazd 04 Dziecko płomienia
- Salvatore Robert Tom 04 Droga do switu
- Jeff Lindsay Dzieło Dextera 04
- Binek Tadeusz 04 Oswiecenie
- R03 (4)
- Cień WolnoÂści
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- hakuna.opx.pl
[ Pobierz całość w formacie PDF ]
.Mimo ich skrytego charakteru,dobrze jest mieć świadomość ich istnienia, zaś dla zaawansowanych programistów szczegóły obsługikomunikatów trafiających do metod obiektów z pewnością okażą się interesujące.A więc: dla komunikatów wysyłanych za pomocą PostMessage() nazwijmy je komunikatamikolejkowanymi pierwszym przystankiem jest metoda Application.ProcessMessage(), cykliczniewywoływana w ramach metody Application.ProcessMessages(), aż do wyczerpania kolejki wejściowej:procedure TApplication.ProcessMessages;varMsg: TMsg;beginwhile ProcessMessage(Msg) do {loop};end;Istotą metody ProcessMessage() jest wygenerowanie zdarzenia OnMessage:function TApplication.ProcessMessage(var Msg: TMsg): Boolean;varHandled: Boolean;beginResult := False;if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) thenbeginResult := True;if Msg.Message WM_QUIT thenbeginHandled := False;if Assigned(FOnMessage)thenFOnMessage(Msg, Handled);if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) andnot IsKeyMsg(Msg) and not IsDlgMsg(Msg) thenbeginTranslateMessage(Msg);DispatchMessage(Msg);end;endelseFTerminate := True;end;end;Jak łatwo zauważyć, zdarzenie to nie jest generowane dla komunikatu WM_QUIT.Jeżeli komunikat nie zostałcałkowicie obsłużony w ramach zdarzenia OnMessage (Handled = False), jest on (pod pewnymi warunkami)kierowany do funkcji DispatchMessage() wywołującej funkcję StdWndProc(); ta ostatnia kierujekomunikat do obiektu docelowego:function StdWndProc(Window: HWND;Message, WParam: Longint;LParam: Longint): Longint; stdcall; assembler;asmXOR EAX,EAXPUSH EAXPUSH LParamPUSH WParamPUSH MessageMOV EDX,ESPMOV EAX,[ECX].Longint[4] CALL [ECX].PointerADD ESP,12POP EAXend;Komunikaty wysyłane za pośrednictwem SendMessage() nazwijmy je komunikatami bezpośrednimi nietrafiają do kolejki wejściowej.Funkcja SendMessage() przekazuje je bezpośrednio do funkcji StdWndProc() jest więc jasne, że omijają one metodę ProcessMessage() i wobec tego nie powodują wystąpieniazdarzenia OnMessage().Począwszy od funkcji StdWndProc(), dalszy los komunikatu jest już niezależny od sposobu jegowygenerowania (PostMessage() czy SendMessage()).Miejscem, do którego przekazała go proceduraStdWndProc(), jest metoda MainWndProc() obiektu docelowego, zdefiniowana w klasie TWinControl:procedure TWinControl.MainWndProc(var Message: TMessage);begintrytryWindowProc(Message);finallyFreeDeviceContexts;FreeMemoryContexts;end;exceptApplication.HandleException(Self);end;end;Właściwość WindowProc reprezentuje procedurę, której adres znajduje się w polu FWindowProc kontrolki:property WindowProc: TWndMethod read FWindowProc write FWindowProc;Domyślnie pole to zawiera wskazanie na metodę WndProc() dokonującą standardowej dla VCL obsługikomunikatu; wskazanie to jest mu przypisywane w konstruktorze kontrolki:constructor TControl.Create(AOwner: TComponent);begininherited Create(AOwner);FWindowProc := WndProc;&end;Jeżeli więc programista będzie chciał zmienić standardowy sposób obsługi komunikatu przez daną kontrolkę,może to uczynić zmieniając właściwości WindowProc.Metoda WndProc(), po wstępnym przetworzeniu komunikatu, kieruje go do metody Dispatch():procedure TControl.WndProc(var Message: TMessage);varForm: TCustomForm;KeyState: TKeyboardState;WheelMsg: TCMMouseWheel;beginif (csDesigning in ComponentState) thenbeginForm := GetParentForm(Self);if (Form nil) and (Form.Designer nil) andForm.Designer.IsDesignMsg(Self, Message) then Exitend;if (Message.Msg >= WM_KEYFIRST) and (Message.Msg = WM_MOUSEFIRST) and (Message.Msg [ Pobierz całość w formacie PDF ]
zanotowane.pl doc.pisz.pl pdf.pisz.pl agnieszka90.opx.pl
.Mimo ich skrytego charakteru,dobrze jest mieć świadomość ich istnienia, zaś dla zaawansowanych programistów szczegóły obsługikomunikatów trafiających do metod obiektów z pewnością okażą się interesujące.A więc: dla komunikatów wysyłanych za pomocą PostMessage() nazwijmy je komunikatamikolejkowanymi pierwszym przystankiem jest metoda Application.ProcessMessage(), cykliczniewywoływana w ramach metody Application.ProcessMessages(), aż do wyczerpania kolejki wejściowej:procedure TApplication.ProcessMessages;varMsg: TMsg;beginwhile ProcessMessage(Msg) do {loop};end;Istotą metody ProcessMessage() jest wygenerowanie zdarzenia OnMessage:function TApplication.ProcessMessage(var Msg: TMsg): Boolean;varHandled: Boolean;beginResult := False;if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) thenbeginResult := True;if Msg.Message WM_QUIT thenbeginHandled := False;if Assigned(FOnMessage)thenFOnMessage(Msg, Handled);if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) andnot IsKeyMsg(Msg) and not IsDlgMsg(Msg) thenbeginTranslateMessage(Msg);DispatchMessage(Msg);end;endelseFTerminate := True;end;end;Jak łatwo zauważyć, zdarzenie to nie jest generowane dla komunikatu WM_QUIT.Jeżeli komunikat nie zostałcałkowicie obsłużony w ramach zdarzenia OnMessage (Handled = False), jest on (pod pewnymi warunkami)kierowany do funkcji DispatchMessage() wywołującej funkcję StdWndProc(); ta ostatnia kierujekomunikat do obiektu docelowego:function StdWndProc(Window: HWND;Message, WParam: Longint;LParam: Longint): Longint; stdcall; assembler;asmXOR EAX,EAXPUSH EAXPUSH LParamPUSH WParamPUSH MessageMOV EDX,ESPMOV EAX,[ECX].Longint[4] CALL [ECX].PointerADD ESP,12POP EAXend;Komunikaty wysyłane za pośrednictwem SendMessage() nazwijmy je komunikatami bezpośrednimi nietrafiają do kolejki wejściowej.Funkcja SendMessage() przekazuje je bezpośrednio do funkcji StdWndProc() jest więc jasne, że omijają one metodę ProcessMessage() i wobec tego nie powodują wystąpieniazdarzenia OnMessage().Począwszy od funkcji StdWndProc(), dalszy los komunikatu jest już niezależny od sposobu jegowygenerowania (PostMessage() czy SendMessage()).Miejscem, do którego przekazała go proceduraStdWndProc(), jest metoda MainWndProc() obiektu docelowego, zdefiniowana w klasie TWinControl:procedure TWinControl.MainWndProc(var Message: TMessage);begintrytryWindowProc(Message);finallyFreeDeviceContexts;FreeMemoryContexts;end;exceptApplication.HandleException(Self);end;end;Właściwość WindowProc reprezentuje procedurę, której adres znajduje się w polu FWindowProc kontrolki:property WindowProc: TWndMethod read FWindowProc write FWindowProc;Domyślnie pole to zawiera wskazanie na metodę WndProc() dokonującą standardowej dla VCL obsługikomunikatu; wskazanie to jest mu przypisywane w konstruktorze kontrolki:constructor TControl.Create(AOwner: TComponent);begininherited Create(AOwner);FWindowProc := WndProc;&end;Jeżeli więc programista będzie chciał zmienić standardowy sposób obsługi komunikatu przez daną kontrolkę,może to uczynić zmieniając właściwości WindowProc.Metoda WndProc(), po wstępnym przetworzeniu komunikatu, kieruje go do metody Dispatch():procedure TControl.WndProc(var Message: TMessage);varForm: TCustomForm;KeyState: TKeyboardState;WheelMsg: TCMMouseWheel;beginif (csDesigning in ComponentState) thenbeginForm := GetParentForm(Self);if (Form nil) and (Form.Designer nil) andForm.Designer.IsDesignMsg(Self, Message) then Exitend;if (Message.Msg >= WM_KEYFIRST) and (Message.Msg = WM_MOUSEFIRST) and (Message.Msg [ Pobierz całość w formacie PDF ]