Spostare oggetti con il mouse all'interno di un contenitore senza Drag & Drop

Da Gambas-it.org - Wikipedia.

Vedremo di seguito come spostare un oggetto all'interno di un contenitore senza l'uso del Drag 'n Drop.

Per effettuare lo spostamento dell'oggetto useremo l'evento _MouseMove() che viene sollevato quando il mouse, stando all'interno dell'oggetto, viene spostato, mentre un tasto del mouse è tenuto premuto.


Semplice spostamento

Il semplice spostamento può far riferimento alle posizioni assolute orizzontale e verticale del cursore del mouse all'interno dello schermo, ossia alle proprietà .ScreenX e .ScreenY della Classe Mouse; oppure può far riferimento alla posizione del cursore del mouse rispetto al contenitore genitore dell'oggetto da spostare.

Spostamento con riferimento alle proprietà .ScreenX e .ScreenY

Poniamo il caso di voler spostare con il mouse un Button all'interno di un Form:

Private x As Short
Private y As Short


Public Sub Button1_MouseDown()

 x = Mouse.X
 y = Mouse.Y

End

Public Sub Button1_MouseMove()

' Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:
 Button1.Move(Mouse.ScreenX - Me.ScreenX - x, Mouse.ScreenY - Me.ScreenY - y)

End

Usando la Proprietà ".Tag" dell'Oggetto da spostare

Se non si intende utilizzare alcuna variabile globale, sarà possibile servirsi - ad esempio - della proprietà .Tag dell'Oggetto da spostare, avendo però cura di istanziare tale Proprietà come vettore con due elementi:

Public Sub Form_Open()

' Istanzia la Proprietà ".Tag" dell'Oggetto "Button" come vettore con due elementi:
 Button1.Tag = [0, 0]

End

Public Sub Button1_MouseDown()

 With Button1
   .Tag[0] = Mouse.X
   .Tag[1] = Mouse.Y
 End With

End

Public Sub Button1_MouseMove()

' Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:
 Button1.Move(Mouse.ScreenX - Me.ScreenX - .Tag[0], Mouse.ScreenY - Me.ScreenY - .Tag[1])

End


Spostamento con riferimento alla posizione del cursore del mouse rispetto al contenitore

In questo caso non si fa riferimento allo Schermo, bensì al Contenitore dell'Oggetto da spostare.

Private x As Short
Private y As Short


Public Sub Button1_MouseDown()

 x = Mouse.X
 y = Mouse.Y

End

Public Sub Button1_MouseMove()

' Il "Button" sarà posizionato in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:
 Button1
   .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
 End With

End

Se vogliamo che il puntatore del mouse capiti durante lo spostamento esattamente al centro dell'oggetto, allora scriveremo così:

Public Sub Button1_MouseMove()

 With Button1
   .Move((Mouse.X + .X) - .W / 2, (Mouse.Y + .Y) - .H / 2)
 End With

End


Spostamento in altro contenitore e modifica della proprietà Parent

Il caso che segue prevede lo spostamento di un Oggetto (nell'esempio: un Button) dal Form in un Panel con conseguente modifica della sua proprietà Parent:

Private x As Short
Private y As Short


Public Sub Button1_MouseDown()
 
 With Button1
' Solo per curiosità vediamo il contenitore Padre attuale dell'oggetto:
   Print "Attuale 'Genitore':", .Parent.Name
 End With
 
 x = Mouse.X
 y = Mouse.Y
 
End

Public Sub Button1_MouseMove()
     
 With Button1
   .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
 End With
 
End

Public Sub Button1_MouseUp()

 If Button1.Parent.Name = "FMain" And Mouse.Inside(Panel1) Then
   With Button1
' Si effettua la modifica del contenitore genitore dell'oggetto;
' il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto:
     .Reparent(Panel1, .X - Panel1.X, .Y - Panel1.Y)
     Print "\nNuovo 'Genitore':", .Parent.Name
   End With
 Endif

End