Mozgó timage alakja futásidőben - Cikk

Mozgás a TImage az űrlap futási időben

Sok, valószínűleg szembe azzal a problémával, mozgó Image'a formában. Ez megoldható háromféleképpen (talán több).

Most írjuk onMouseDown kezelőjét a képet:

eljárás TForm1.Image1MouseDown (Sender: TObject; gomb: TMouseButton;
Shift: TShiftState; X, Y: Egész szám);
kezdődik
ha a gombot<>mbLeft majd lépni: = false // ha megnyomja a bal gombot, akkor nem fog mozogni!
elsebegin
mozog: = true;
x0: = x; // tároljuk az eredeti koordinátákat
y0: = y; // tároljuk az eredeti koordinátákat
végén;
végén;

Ez a kódrészletet van jelölve, hogy melyik gombot nyomja meg a képen. Ha nem, akkor memorizálni a helyzet, és ha van, akkor nem lehet mozgatni.

Most írjuk onMouseMove kezelőjét a képet:

eljárás TForm1.Image1MouseMove (Sender: TObject; Shift: TShiftState; X,
Y: Egész szám);
kezdődik
ha mozog thenbegin
image1.Left: = image1.Left + x-x0; // Állítsa át a bal szélén
image1.Top: = image1.Top + y-y0; // Állítsa át a felső szélét
végén;
végén;

Végül onmouseup kezelőjét képeinket lesz:

eljárás TForm1.Image1MouseUp (Sender: TObject; gomb: TMouseButton;
Shift: TShiftState; X, Y: Egész szám);
kezdődik
mozog: = false;
végén;

itt minden nagyon egyszerű. Ha a gomb elengedésekor a lépés a változó értéke hamis, úgy, hogy csak a következő kattintson a képre nem lehet mozgatni.

Ez a módszer nagyon egyszerű, mind megérteni és megvalósítani. De ugyanez a helyettesítési algoritmus lehet végrehajtani egy kicsit szebb. Egyes alkatrészek, beleértve a képeket, van olyan hideg eljárással SetBounds (Bal, Fel, szélesség, magasság), amely megváltoztathatja egyszerre mind a négy paramétert. Így onMouseMove esemény lehet az alábbiak szerint változott:

De van egy másik nagyon érdekes módon: a képernyőn lehet mozgatni nem a kép, hanem csak a keretre, ha a felhasználó kiválaszt egy helyet egy képet, és engedje el a gombot - mozgatni. Ehhez szükségünk van egy globális változó: rec: TRect, amely tárolja a paramétereit a képet. Most kissé változik a eseménykezelőkkel a képet. Így mindenki általában a következőképpen néz ki:

eljárás TForm1.Image1MouseUp (Sender: TObject; gomb: TMouseButton;
Shift: TShiftState; X, Y: Egész szám);
kezdődik
Form1.Canvas.DrawFocusRect (rec);
A image1 dobegin
setbounds (rec.left + x-x0, rec.top + y-y0, szélesség, magasság); // mozgassa a képet
mozog: = false;
végén;
végén;

Mivel DrawFocusRect dobozt rajzol Xor eljárás során a második hívás ez a funkció azonos paraméterekkel, a keret törlődik.

Ez egy szép módszer, hogy adjunk egy csomó érdekes a programban. Így használja.

Beszúrni egy hivatkozást ezt a cikket egy másik oldalon, az alábbi HTML-kód:

Kapcsolódó cikkek