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

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
Vedremo di seguito come spostare un oggetto all'interno di un contenitore <SPAN style="text-decoration:underline">senza</span> l'uso del ''Drag 'n Drop''. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
+
Vedremo di seguito come spostare un oggetto all'interno di un contenitore <SPAN style="text-decoration:underline">senza</span> l'uso del ''Drag 'n Drop''. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
  
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.
+
Per effettuare lo spostamento dell'Oggetto grafico 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=
 
=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.
+
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''==
+
==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 x As Short
 
  Private x As Short
Riga 13: Riga 13:
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_MouseDown()
+
  Public Sub Button1_MouseDown()
 
   
 
   
 
   x = Mouse.X
 
   x = Mouse.X
 
   y = Mouse.Y
 
   y = Mouse.Y
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_MouseMove()
+
  Public Sub Button1_MouseMove()
 
   
 
   
 
  <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>
 
   Button1.Move(Mouse.ScreenX - Me.ScreenX - x, Mouse.ScreenY - Me.ScreenY - y)
 
   Button1.Move(Mouse.ScreenX - Me.ScreenX - x, Mouse.ScreenY - Me.ScreenY - y)
 
   
 
   
  '''End'''
+
  End
  
 
===Usando la Proprietà ".Tag" dell'Oggetto da spostare===
 
===Usando la Proprietà ".Tag" dell'Oggetto da spostare===
Riga 34: Riga 34:
 
   Button1.Tag = [0, 0]
 
   Button1.Tag = [0, 0]
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_MouseDown()
+
  Public Sub Button1_MouseDown()
 
   
 
   
 
   With Button1
 
   With Button1
Riga 43: Riga 43:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_MouseMove()
+
  Public Sub Button1_MouseMove()
 
   
 
   
 
  <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>
Riga 52: Riga 52:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
  
  
Riga 62: Riga 62:
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_MouseDown()
+
  Public Sub Button1_MouseDown()
 
   
 
   
 
   x = Mouse.X
 
   x = Mouse.X
 
   y = Mouse.Y
 
   y = Mouse.Y
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_MouseMove()
+
  Public Sub Button1_MouseMove()
 
   
 
   
 
  <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>
Riga 76: Riga 76:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 
Se vogliamo che il puntatore del mouse capiti durante lo spostamento esattamente al centro dell'oggetto, allora scriveremo così:
 
Se vogliamo che il puntatore del mouse capiti durante lo spostamento esattamente al centro dell'oggetto, allora scriveremo così:
  '''Public''' Sub Button1_MouseMove()
+
  Public Sub Button1_MouseMove()
 
   
 
   
 
   With Button1
 
   With Button1
Riga 84: Riga 84:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 +
 
 
===Spostare un Oggetto grafico all'interno di un Contenitore entro un limite minimo e un limite massimo di coordinate x,y===
 
===Spostare un Oggetto grafico all'interno di un Contenitore entro un limite minimo e un limite massimo di coordinate x,y===
 
Nel seguente esempio sarà possibile spostare un ''Button'' esclusivamente in verticale fra le coordinate 10 e 200 dell'asse delle "Y".
 
Nel seguente esempio sarà possibile spostare un ''Button'' esclusivamente in verticale fra le coordinate 10 e 200 dell'asse delle "Y".
Riga 93: Riga 94:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
   Button1.Text = CStr(Button1.Y)
 
   Button1.Text = CStr(Button1.Y)
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_MouseDown()
+
  Public Sub Button1_MouseDown()
 
   
 
   
 
   x = Mouse.X
 
   x = Mouse.X
 
   y = Mouse.Y
 
   y = Mouse.Y
 
   
 
   
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_MouseMove()
+
  Public Sub Button1_MouseMove()
 
   
 
   
 
   With Button1
 
   With Button1
Riga 115: Riga 116:
 
  End With
 
  End With
 
   
 
   
  '''End'''
+
  End
  
 
=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 x As Short
 
  Private x As Short
 
  Private y As Short
 
  Private y As Short
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_MouseDown()
+
  Public Sub Button1_MouseDown()
 
+
 
   With Button1
 
   With Button1
 
  <FONT color=gray>' ''Solo per curiosità vediamo il contenitore ''Padre'' attuale dell'oggetto:''</font>
 
  <FONT color=gray>' ''Solo per curiosità vediamo il contenitore ''Padre'' attuale dell'oggetto:''</font>
Riga 133: Riga 134:
 
   y = Mouse.Y
 
   y = Mouse.Y
 
    
 
    
  '''End'''
+
  End
 +
 +
Public Sub Button1_MouseMove()
 
   
 
   
'''Public''' Sub Button1_MouseMove()
 
     
 
 
   With Button1
 
   With Button1
 
     .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
 
     .Move(.X + Mouse.X - x, .Y + Mouse.Y - y)
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub Button1_MouseUp()
+
  Public Sub Button1_MouseUp()
 
   
 
   
 
   If Button1.Parent.Name = "FMain" And Mouse.Inside(Panel1) Then
 
   If Button1.Parent.Name = "FMain" And Mouse.Inside(Panel1) Then
 
     With Button1
 
     With Button1
  <FONT color=gray>' ''Si effettua la modifica del contenitore ''genitore'' dell'oggetto;''
+
  <FONT color=gray>' ''Si effettua la modifica del contenitore ''genitore'' dell'oggetto; il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto:''</font>
' ''il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto:''</font>
 
 
       .Reparent(Panel1, .X - Panel1.X, .Y - Panel1.Y)
 
       .Reparent(Panel1, .X - Panel1.X, .Y - Panel1.Y)
 
       Print "\nNuovo 'Genitore':", .Parent.Name
 
       Print "\nNuovo 'Genitore':", .Parent.Name
Riga 154: Riga 154:
 
   Endif
 
   Endif
 
   
 
   
  '''End'''
+
  End
  
  
  
 
=Nota=
 
=Nota=
[1] Vedere anche: [[Spostare_con_il_mouse_un_oggetto_in_una_DrawingArea|Spostare con il mouse un oggetto in una DrawingArea]]
+
[1] Vedere anche: [[Spostare con il mouse un Controllo grafico generato in una DrawingArea]]

Versione delle 12:12, 10 giu 2023

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

Per effettuare lo spostamento dell'Oggetto grafico 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:
 With Button1
   .Move(Mouse.ScreenX - Me.ScreenX - .Tag[0], Mouse.ScreenY - Me.ScreenY - .Tag[1])
 End With

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.
Nell'esempio che segue, altresì, in particolare il puntatore del mouse durante lo spostamento del Controllo grafico resterà nel punto interno all'Oggetto, ove si è cliccato.

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:
 With 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

Spostare un Oggetto grafico all'interno di un Contenitore entro un limite minimo e un limite massimo di coordinate x,y

Nel seguente esempio sarà possibile spostare un Button esclusivamente in verticale fra le coordinate 10 e 200 dell'asse delle "Y".

Private Const LIMITE_MINIMO As Byte = 10
Private Const LIMITE_MASSIMO As Byte = 200
Private x As Short
Private y As Short


Public Sub Form_Open()

 Button1.Text = CStr(Button1.Y)

End

Public Sub Button1_MouseDown()

 x = Mouse.X
 y = Mouse.Y

End

Public Sub Button1_MouseMove()

 With Button1
   If (Not ((.Y + Mouse.Y - y) < LIMITE_MINIMO)) And (Not ((.Y + Mouse.Y - y) > LIMITE_MASSIMO)) Then
     .Move(.X, .Y + Mouse.Y - y)
     .Text = CStr(.Y)
  Endif 
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


Nota

[1] Vedere anche: Spostare con il mouse un Controllo grafico generato in una DrawingArea