[ 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