HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Jobb gombbal scrollozható ToolBar


Példaprogram letöltése

9499 bájt

Képzeljünk el egy olyan Form-ot, ami olyan keskeny, hogy a benne alkalmazott ToolBar nem látszik teljes szélességében, vagyis a ToolBar-on található gombok némelyike kilóg az ablakból, vagy egyáltalán nem is látszik. Ekkor két eset lehetséges. Az első, hogy átméretezzük az ablakot akkorára, hogy a ToolBar teljes egészében látszódjon. Ez bizonyos esetekben nem túl elegáns megoldás, és az ablak feleslegesen foglalhat sok helyet a képernyő amúgy is mindig kevésnek bizonyuló területéből. A másik megoldás az, hogy a ToolBar-t valamilyen módszerrel vízszintesen mozgathatóvá tesszük, így a kívánt része mindig "begörgethető" a látható területre.
A mellékelt példaprogram megnyitása előtt a MoveToolbar.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A példában azzal a funkcióval egészítjük ki a TToolBar komponenst, hogy a jobb egérgomb lenyomva tartása mellett az egeret elmozgatva a ToolBar-t jobbra-balra lehet csúsztatni. A csúsztatást egy egyszerű trükkel valósítjuk meg. A TToolBar komponensnek van egy Indent property-je, amely azt határozza meg, hogy a ToolBar-on elhelyezett gombok az eszköztár bal széléhez viszonyítva hány pixellel arrébb jelenjenek meg. Ennek a property-nek lehet negatív értéket is adni. Tehát a csúsztatáshoz nincs más dolgunk, mint ennek a property-nek az értékét növelni, vagy csökkenteni, attól függően, hogy jobbra vagy balra szeretnénk mozgatni a gombokat.

Az alapok tehát megvannak, már csak azt kell elérnünk, hogy az egér jobb gombjával lehessen a csúsztatást megvalósítani. Nyilvánvaló, hogy ehhez két eseményt kell figyelnünk. Az egyik az egér gombjának lenyomása, amikor az egér pozícióját el kell tárolnunk. A másik az egér mozgatásának figyelése, amikor ki kell számolnunk, hogy a gomb lenyomásakor eltárolt pozícióhoz képest mennyivel mozgattuk el az egeret. Ugyanis ezzel az értékkel kell az Indent property értékét is növelni, illetve csökkenteni.

Az egérgomb lenyomását a MouseDown eljárásban tudjuk regisztrálni, mivel ez automatikusan lefut, amikor a jobb vagy a bal egérgombot lenyomja a felhasználó. Mivel ez az eljárás már létezik, azért felül kell írnunk azt:
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
Ebben az eljárásban csak annyi dolgunk van, hogy ellenőrizzük, hogy a jobb egérgombot nyomták-e le, és ha igen, akkor az FStartPos változóban eltároljuk az egér X pozícióját.
procedure TMoveToolBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var cp:TPoint;
begin
  inherited;
  GetCursorPos(cp);
  if Button=mbRight then begin
    FStartPos:=cp.X-Indent;;
  end;
end;
A másik eljárás a MouseMove, ami akkor fut le, amikor az egeret elmozgatták. Ebben szintén ellenőrizni kell, hogy a jobb gomb le van-e nyomva, és ha igen, akkor ki kell számolni, hogy mennyivel mozgatták el az egeret, majd az aktuális pozíciót eltárolni az FStartPos változóba.
Mivel ez egy szintén már deklarált eljárás, ezért ezt is felül kell írnunk:
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
Mint látható, itt nincs TMouseButton típusú paraméter, ezért a jobb egérgomb lenyomását egy kicsit másképpen kell ellenőriznünk.
procedure TMoveToolBar.MouseMove(Shift: TShiftState; X, Y: Integer);
var cp:TPoint;
begin
  inherited;
  GetCursorPos(cp);
  if ssRight in Shift then begin
    Indent:=cp.X-FStartPos;
  end;
end;
Ahhoz, hogy ez a módszer akkor is működjön, amikor egy gombon nyomjuk le a jobb egérgombot, illetve egy gombon mozgatjuk az egeret, néhány dolgot még el kell végeznünk. Mivel a gombok létrehozása csak azután történik meg, miután a komponens Create konstruktora lefutott, ezért nyilvánvaló, hogy itt nem tudjuk a szükséges módosításokat elvégezni. Ehhez annak a Form-nak az OnCreate eseményét használjuk fel, amire a komponenst helyeztük.

Az UpdateButtons eljárást hozzárendeljük a Form OnCreate eseményéhez. Az eljárásban a gombok OnMouseDown és OnMouseMove eseményeihez létrehoztunk egy-egy eljárást. Ezek nem tesznek mást, mint a fent bemutatott eljárásokat hívják meg a megfelelő paraméterekkel.
procedure TMoveToolbar.UpdateButtons;
var i: integer;
begin
  i:=0;
  while i<ButtonCount do begin
    Buttons[i].OnMouseDown:=MouseDownEvent;
    Buttons[i].OnMouseMove:=MouseMoveEvent;
    inc(i);
  end;
  if Assigned(FOldCreate) then FOldCreate(Sender);
end;


Cikksorozat

#IDKategóriaCikk címeSorozat
3333WindowsNet Shell parancsok1. rész
3367WindowsNet Shell parancsok2. rész
3396WindowsNet Shell parancsok3. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 265. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |