Differenze tra le versioni di "Spostare oggetti con il mouse all'interno di un contenitore senza Drag & Drop"

Da Gambas-it.org - Wikipedia.
Riga 9: Riga 9:
 
==Spostamento con riferimento alle proprietà ''.ScreenX'' e ''.ScreenY''==
 
==Spostamento con riferimento alle proprietà ''.ScreenX'' e ''.ScreenY''==
 
Poniamo il caso di voler spostare con il mouse un ''Button'' all'interno di un ''Form'':
 
Poniamo il caso di voler spostare con il mouse un ''Button'' all'interno di un ''Form'':
  Private spx As Short
+
  Private x As Short
  Private spy As Short
+
  Private y As Short
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Button1_MouseDown()
 
  '''Public''' Sub Button1_MouseDown()
 
   
 
   
  spx = Mouse.X
+
  x = Mouse.X
  spy = Mouse.Y
+
  y = Mouse.Y
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 23: Riga 23:
 
   
 
   
 
  <FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
 
  <FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
  With Button1
+
  Button1.Move(Mouse.ScreenX - Me.ScreenX - x, Mouse.ScreenY - Me.ScreenY - y)
    .X = Mouse.ScreenX - Me.ScreenX - spx
 
    .Y = Mouse.ScreenY - Me.ScreenY - spy
 
  End With
 
 
   
 
   
 
  '''End'''
 
  '''End'''
  
 
===Usando la Proprietà ".Tag" dell'Oggetto da spostare===
 
===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 <SPAN Style="text-decoration:underline">vettore con due elementi</span>:
+
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 <SPAN Style="text-decoration:underline">vettore con due elementi</span>:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
  Button1.Tag = [0, 0]
+
<FONT color=gray>' ''Istanzia la Proprietà ".Tag" dell'Oggetto "Button" come vettore con due elementi:''</font>
 +
  Button1.Tag = [0, 0]
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 40: Riga 38:
 
  '''Public''' Sub Button1_MouseDown()
 
  '''Public''' Sub Button1_MouseDown()
 
   
 
   
  With Button1
+
  With Button1
    .Tag[0] = Mouse.X
+
    .Tag[0] = Mouse.X
    .Tag[1] = Mouse.Y
+
    .Tag[1] = Mouse.Y
  End With
+
  End With
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 50: Riga 48:
 
   
 
   
 
  <FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
 
  <FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
  With Button1
+
  Button1.Move(Mouse.ScreenX - Me.ScreenX - .Tag[0], Mouse.ScreenY - Me.ScreenY - .Tag[1])
    .X = Mouse.ScreenX - Me.ScreenX - .Tag[0]
 
    .Y = Mouse.ScreenY - Me.ScreenY - .Tag[1]
 
  End With
 
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 60: Riga 55:
 
==Spostamento con riferimento alla posizione del cursore del mouse rispetto al contenitore==
 
==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.  
 
In questo caso non si fa riferimento allo Schermo, bensì al Contenitore dell'Oggetto da spostare.  
  Private spx As Short
+
  Private x As Short
  Private spy As Short
+
  Private y As Short
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Button1_MouseDown()
 
  '''Public''' Sub Button1_MouseDown()
 
   
 
   
   spx = Mouse.X
+
   x = Mouse.X
   spy = Mouse.Y
+
   y = Mouse.Y
 
   
 
   
 
  '''End'''
 
  '''End'''
Riga 74: Riga 69:
 
   
 
   
 
  <FONT color=gray>' ''Il "Button" sarà posizionato in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
 
  <FONT color=gray>' ''Il "Button" sarà posizionato in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
   With Button1
+
   Button1
     .X = .X + Mouse.X - spx
+
     .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
    .Y = .Y + Mouse.Y - spy
 
 
   End With
 
   End With
 
   
 
   
Riga 85: Riga 79:
 
   
 
   
 
   With Button1
 
   With Button1
     .X = (Mouse.X + .X) - .W <FONT color=#B22222>/ 2</font>
+
     .Move((Mouse.X + .X) - .W <FONT color=#B22222>/ 2</font>, (Mouse.Y + .Y) - .H <FONT color=#B22222>/ 2</font>)
    .Y = (Mouse.Y + .Y) - .H <FONT color=#B22222>/ 2</font>
 
 
   End With
 
   End With
 
   
 
   
Riga 94: Riga 87:
 
=Spostamento in altro contenitore e modifica della proprietà ''Parent''=
 
=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'':
 
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 spx As Short
+
  Private x As Short
  Private spy As Short
+
  Private y As Short
 
   
 
   
 
   
 
   
Riga 105: Riga 98:
 
   End With
 
   End With
 
    
 
    
   spx = Mouse.X
+
   x = Mouse.X
   spy = Mouse.Y
+
   y = Mouse.Y
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 113: Riga 106:
 
        
 
        
 
   With Button1
 
   With Button1
     .X = .X + Mouse.X - spx
+
     .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
    .Y = .Y + Mouse.Y - spy
 
 
   End With
 
   End With
 
    
 
    

Versione delle 23:08, 29 nov 2021

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