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:
Kopiuj
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:
Kopiuj
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. ;)