Delphi - Rejtett eszköztár

forráskód letöltése
A Microsoft Internet Explorer 6-os változatában többek között megjelent egy olyan lehetőség, hogy amikor az egér kurzort egy kép fölé mozgatjuk, és ott egy kis ideig megtartjuk, megjelenik egy eszköztár, amelyen a képhez tartozó leggyakrabban alkalmazott parancsok foglalnak helyet. Ez az eszköztár azért praktikus, mert nem foglalja a helyet feleslegesen, csak akkor jelenik meg, amikor tényleg szükség van rá. Ebben a példában egy ilyen eszköztárat készítünk.
A mellékelt példaprogram megnyitása előtt a *.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Az új komponens neve FlyOverToolBar lesz, és a TToolBar osztályból származtatjuk. Ehhez az eszköztárhoz hozzárendelhetünk egy TControl-ból származtatott komponenst a FlyOverControl property-n keresztül. Amikor a felhasználó az ebben a property-ben megadott komponens fölé mozgatja az egér kurzort, akkor egy bizonyos idő letelte után megjelenik az eszköztár. Ezt az időt a ShowInterval property-ben adhatjuk meg. Ha a felhasználó lehúzza az egeret a komponensről, akkor szintén egy bizonyos idő leteltével eltűnik az eszköztár. Ezt az időt a HideIntervall property-ben állíthatjuk be. Ha az eszköztárat nem a komponens felett jelenítjük meg, akkor ezt az időintervallumot válasszuk akkorára, hogy legyen ideje a felhasználónak az egeret az eszköztár fölé mozgatni, mielőtt az eltűnne.
Ahhoz, hogy tudjuk mikor van az egér a megadott komponens fölött, szükség van arra, hogy elkapjuk a komponensnek küldött üzeneteket. Ezt úgy érjük el, hogy a komponens eseménykezelő eljárását átirányítjuk a saját eljárásunkra (CtrlWndMethod). Amikor az egér a komponens fölé ér, a CM_MOUSEENTER üzenetet, amikor pedig elhagyja a komponenst, akkor a CM_MOUSELEAVE üzenet kapja a komponens.
procedure TFlyOverToolBar.CtrlWndMethod(var Message: TMessage);
begin
  FCtrlWndMethod(Message);
  case Message.Msg of
  ...
  CM_MOUSEENTER:
    if not Visible then begin
      FTimer.Interval:=FShowInterval;
      FTimer.Enabled:=true;
    end else FTimer.Enabled:=false;
  CM_MOUSELEAVE:
    if Visible then begin
      FTimer.Interval:=FHideInterval;
      FTimer.Enabled:=true;
    end else FTimer.Enabled:=false;
  end;
end;
Az időzítést egy Timer komponenssel oldjuk meg, melynek OnTimer eseményéhez a DoTimer eljárást rendeljük. Ebben az eljárásban az eszköztár Visible property-jének értékét változtatjuk az ellenkezőjére. Amikor az eszköztár Visible property-jének értékét megváltoztatjuk a Timer Enabled property-jét hamisra állítjuk.
procedure TFlyOverToolBar.DoTimer(Sender: TObject);
begin
  SetVisible(not Visible);
end;