Jeśli chodzi o obsługę komunikatów, to schemat zastosowany przez Ciebie — @jw_developer — wykorzystuje się wtedy, gdy obsługa danego komunikatu nie jest zaimplementowana w klasie kontrolki. Załóżmy, że jest sobie komunikat LM_RECEIVEDATA
(zmyślony) i chcesz dodać kod jego obsługi oraz zdarzenie z nim powiązane. Szablon dla tego wszystkiego wygląda tak:
type
TOnReceiveData = procedure(ASender: TObject; const AData: Integer) of object;
type
TMyForm = class(TForm)
private
FOnReceiveData: TOnReceiveData;
private
procedure DoReceiveData(AData: Integer);
protected
procedure LMReceiveData(const AMessage: TLMessage); message LM_RECEIVEDATA;
public
property OnReceiveData: TOnReceiveData read FOnReceiveData write FOnReceiveData;
end;
procedure TMyForm.DoReceiveData(AData: Integer);
begin
if Assigned(FOnReceiveData) then
FOnReceiveData(Self, AData);
end;
procedure TMyForm.LMReceiveData(const AMessage: TLMessage);
begin
DoReceiveData(AMessage.lParam);
end;
W skrócie. LMReceiveData
otrzymuje paczkę komunikatu i dane w niej zawarte wykorzystuje do dalszych operacji. W tym przypadku przekazuje liczbę zawartą w polu lParam
do procedury wywołującej zdarzenie, czyli do DoReceiveData
. Ta z kolei sprawdza czy zdarzenie jest w ogóle przypisane i jeśli tak, wywołuje je, przekazując własną referencję oraz dane w parametrach. I to wszystko.
Tak więc jeśli chodzi o obsługę własnego komunikatu lub takiego, którego obsługa w danej klasie nie istnieje, wykorzystuje się podany wyżej szablon. W Twoim przypadku, taki zabieg nie jest konieczny, dlatego że klasa formularza posiada już pełną obsługę komunikatu wciśnięcia lewego przycisku myszy, a także posiada zdarzenie wywoływane po otrzymaniu takiego komunikatu.
Implementacja obsługi zawarta jest w klasie bazowej (dokładnie w klasie TControl
) pod postacią zdarzenia OnMouseDown
, które oprócz dostarczenia informacji na temat tego, który przycisk został przyciśnięty, dorzuca także zestaw dodatkowych przycisków (takich jak Shift
, Ctrl
, Alt
itd.) oraz współrzędne kursora. Tak więc jeśli chesz podłączyć własną metodę do klasy okna i przechwytywać kliknięcia, to zadeklaruj metodę zgodną parametrami z typem TMouseEvent
i podłącz ją pod zdarzenie OnMouseDown
, tuż po utworzeniu instancji klasy okna:
type
TMyForm = class(TForm)
{..}
end;
type
TMainForm = class(TForm)
private
procedure HandleMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
procedure CreateMyForm();
end;
procedure TMainForm.CreateMyForm();
var
MyForm: TMyForm;
begin
MyForm := TMyForm.Create(Self);
MyForm.OnMouseDown := @HandleMouseDown;
end;
Pisane z palca, jakby co. ;)