Delphi - Egérrel mozgatható kép komponens

forráskód letöltése
Ha egy olyan képet akarunk megjeleníteni egy Form-on, amely kép nagyobb, mint az a terület, ahová a képet rajzoljuk, akkor két lehetőségünk van. Az egyik, hogy a képet lekicsinyítjük úgy, hogy elférjen a rajzterületen. A másik megoldás az, hogy megengedjük a felhasználónak, hogy az egérrel megfogva görgethesse azt. Ebben a példában egy olyan komponenst készítünk, amely ez utóbbi feladatot oldja meg. A görgetésre természetesen programból is lehetőség van.
A mellékelt példaprogram megnyitása előtt a MoveImage.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Az új komponenst a TCustomControl osztályból fogjuk származtatni. Ha a megjelenítendő kép vízszintesen, vagy függőlegesen kilógna a komponens kliens területéről, akkor abba az irányba engedélyezzük a mozgatást. Az új komponens property-jei és eseményei a következők:
Picture
Osztály: TMoveImage
property Picture: TPicture;
Ebben a property-ben adhatjuk meg a megjelenítendő képet.
Transparent
Osztály: TMoveImage
property Transparent: boolean;
Ha ennek a property-nek az értéke igaz, akkor a kép átlátszó lesz. Az átlátszó szín a kép bal alsó pixelének színe lesz. Az átlátszó részeken a komponens háttérszíne lesz látható (Color property).
ImageLeft
Osztály: TMoveImage
property ImageLeft: integer;
Ez a property a kép vízszintes pozícióját tartalmazza a komponensen belül. Értéke 0, vagy 0-nál kisebb szám lehet. Ha 0, akkor a kép bal széle a komponens bal szélével egyvonalban van. Ha negatív, akkor a kép annyi pixellel lesz balra tolva, amennyi a property értéke.
ImageTop
Osztály: TMoveImage
property ImageTop: integer;
Ez a property a kép függőleges pozícióját határozza meg a komponensen belül. Értéke 0, vagy 0-nál kisebb szám lehet. Ha 0, akkor a kép felső széle a komponens felső szélével lesz egyvonalban. Ha negatív, akkor a kép annyi pixellel lesz felfelé tolva, amennyi a property értéke.
OnChange
Osztály: TMoveImage
property OnChange: TNotifyEvent;
Ez az esemény akkor jön létre, amikor a komponens valamelyik property-jének értéke megváltozik.
OnStartMove
Osztály: TMoveImage
property OnStartMove: TNotifyEvent;
A mozgatás elkezdése előtt jön létre az esemény, vagyis akkor, amikor a felhasználó a képen lenyomja a bal egérgombot. Fontos, hogy a képen, és nem a komponensen!
OnMoving
Osztály: TMoveImage
property OnMoving: TNotifyEvent;
Az OnMouseMove eseménnyel együtt jön létre ez az esemény is, de csak akkor, amikor a kép mozgatása folyamatban van, vagyis az FDrag globális változó értéke igaz.
OnEndMove
Osztály: TMoveImage
property OnEndMove: TNotifyEvent;
A mozgatás befejezésekor jön létre ez az esemény.
Ahhoz, hogy a kép mozgatását meg tudjuk oldani, felül kell írnunk a MouseDown, MouseUp és MouseMove eljárásokat. A MouseDown eljárásban ellenőrizzük, hogy a bal egérgomb lett-e lenyomva, és ha igen, akkor a kép fölött állt-e az egér kurzor. Ha a feltételek teljesülnek, akkor az FDrag globális változó értékét igazra állítjuk, és eltároljuk az egér pozícióját az FDragPos TPoint típusú változóban, majd generálunk egy OnStartMove eseményt.
A MouseMove eljárásban szintén ellenőrizzük, hogy a bal egérgomb lett-e lenyomva, valamint azt is, hogy az FDrag változó értéke igaz-e. Az egér pozíciójából kiszámítjuk a kép új pozícióját, majd ellenőrizzük a ValidLeftPos és ValidTopPos függvényekkel. Ha a függvények visszatérési értéke igaz, akkor az új pozíció megfelelő, ellenkező esetben az adott irányba történő mozgatás nem valósul meg. Az eljárás végén generálunk egy OnMoving eseményt.