Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 164. – OnMouseEnter a OnMouseLeave

Jan Šindelář 24.11.2004

Dnešní tip je opět na přání a to hned několika čtenářů. Ukážeme si, jak odchytit události, při kterých uživatel myší najede nad nějakou komponentu a poté zase kurzor přesune jinam. Jinými slovy naučíme komponenty dvě nové události - OnMouseEnter a OnMouseLeave.

Je až s podivem, že tyto poměrně užitečné události v základní nabídce u komponent chybí. A přitom se nejedná o nic složitého a stejně jako v ostatních případech je to záležitost zpráv Windows. Ukážeme si tedy na velmi primitivním příkladu jak na to.

Pro náš příklad si vytvoříme novou komponentu, která bude mít tyto dvě události navíc. Jako základ nám poslouží komponenta TImage. Nebudeme si znovu podrobně říkat, jak vytvářet novou komponentu a raději vás odkáži na starší články. V rychlosti jen připomenu, že vybereme z nabídky File položku New a zde místo aplikace zvolíme komponentu. V dialogovém okně nejprve zvolíme rodičovský objekt naší komponenty, tedy TImage, dále pak název (v našem příkladu je to ImageMouse) a kam zdrojový soubor uložit (na disku i na paletě komponent). Vygeneruje se nám základ pro novou komponentu.

Jelikož budeme pracovat se systémem zpráv Windows, musíme do používaných knihoven nejprve přidat unit Messages. Poté nadeklarujeme dvě nové události, které budou "napojeny" na zprávy CM_MOUSEENTER a CM_MOUSELEAVE. Budou to zmiňované události OnMouseEnter a OnMouseLeave. Nesmíme rovněž zapomenout nadefinovat příslušné vlastnosti (property), abychom pak mohli prostřednictvím Object Inspectoru napsat kód k příslušným událostem.

Zdrojový kód komponenty pak bude vypadat nějak takto:

unit ImageMouse;

interface

uses
  SysUtils, Classes, Controls, ExtCtrls, Messages;

type
  TImageMouse = class(TImage)
  private
    { Private declarations }
    FOnMouseLeave: TNotifyEvent;
    FOnMouseEnter: TNotifyEvent;
    procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
  protected
    { Protected declarations }
    procedure DoMouseEnter; dynamic;
    procedure DoMouseLeave; dynamic;
  public
    { Public declarations }
  published
    { Published declarations }
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(`Samples`, [TImageMouse]);
end;

procedure TImageMouse.CMMouseEnter(var msg: TMessage);
begin
  DoMouseEnter;
end;

procedure TImageMouse.CMMouseLeave(var msg: TMessage);
begin
  DoMouseLeave;
end;

procedure TImageMouse.DoMouseEnter;
begin
  if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TImageMouse.DoMouseLeave;
begin
  if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.

Takto vytvořenou komponentu pak standardním způsobem nainstalujeme, vytvoříme nový projekt a umístíme na formulář. Pak už je jen třeba nějakým vhodným způsobem nové události využít. V ukázkovém projektu se při najetí na obrázek změní barva pozadí formuláře.

Obdobným způsobem můžete vylepšit i jiné vizuální komponenty, takže si klidně zaexperimentujte. Upravenou komponentu a ukázkový projekt si můžete stáhnout zde.