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

Da Gambas-it.org - Wikipedia.
Riga 10: Riga 10:
 
===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 spy As Short
 +
 +
 +
'''Public''' Sub Button1_MouseDown()
 +
 +
  spx = Mouse.X
 +
  spy = Mouse.Y
 +
 +
'''End'''
 +
 +
 
  '''Public''' Sub Button1_MouseMove()
 
  '''Public''' Sub Button1_MouseMove()
 
   
 
   
    Button1.X = (Mouse.ScreenX - Me.ScreenX) - (Button1.W / 2)
+
<FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
   
+
  With Button1
    Button1.Y = (Mouse.ScreenY - Me.ScreenY) - (Button1.H / 1.2)
+
    .X = Mouse.ScreenX - Me.ScreenX - spx
 +
    .Y = Mouse.ScreenY - Me.ScreenY - spy
 +
  End With
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
 +
 +
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()
 +
 +
  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()
 +
 +
<FONT color=gray>' ''Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
 +
  With Button1
 +
    .X = Mouse.ScreenX - Me.ScreenX - Button1.Tag[0]
 +
    .Y = Mouse.ScreenY - Me.ScreenY - Button1.Tag[1]
 +
  End With
 +
 +
'''End'''
 +
  
  
 
===Spostamento con riferimento alla posizione del cursore del mouse rispetto al contenitore===
 
===Spostamento con riferimento alla posizione del cursore del mouse rispetto al contenitore===
 
Poniamo il caso di voler spostare con il mouse una ''TextLabel'' all'interno di una ''ScrollView'':
 
Poniamo il caso di voler spostare con il mouse una ''TextLabel'' all'interno di una ''ScrollView'':
 +
Private spx As Short
 +
Private spy As Short
 +
 +
 +
'''Public''' Sub TextLabel1_MouseDown()
 +
 +
  spx = Mouse.X
 +
  spy = Mouse.Y
 +
 +
'''End'''
 +
 +
 
  '''Public''' Sub TextLabel1_MouseMove()
 
  '''Public''' Sub TextLabel1_MouseMove()
 
   
 
   
  <FONT color=#006400>' ''La "TextLabel" sarà posizionata in questo caso, rispetto al cursore del Mouse,''
+
  <FONT color=gray>' ''La "TextLabel" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:''</font>
' ''alle coordinate come appresso determinate:''</font>
 
 
   With TextLabel1
 
   With TextLabel1
     .X = (Mouse.X + TextLabel1.X) - TextLabel1.W
+
     .X = TextLabel1.X + Mouse.X - spx
     .Y = (Mouse.Y + TextLabel1.Y) - TextLabel1.H
+
     .Y = TextLabel1.Y + Mouse.Y - spy
 
   End With
 
   End With
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
  
  
Riga 49: Riga 105:
 
    
 
    
 
   With Button1
 
   With Button1
  <FONT color=#006400>' ''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>
 
     Print .Parent.Name
 
     Print .Parent.Name
 
   End With
 
   End With
Riga 67: Riga 123:
 
   
 
   
 
     With Button1
 
     With Button1
  <FONT color=#006400>' ''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, Mouse.X - Panel1.X)
 
       .Reparent(Panel1, Mouse.X - Panel1.X)

Versione delle 07:59, 16 giu 2015

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 spx As Short
Private spy As Short


Public Sub Button1_MouseDown()

  spx = Mouse.X
  spy = Mouse.Y

End


Public Sub Button1_MouseMove()

' Il "Button" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:
  With Button1
   .X = Mouse.ScreenX - Me.ScreenX - spx
   .Y = Mouse.ScreenY - Me.ScreenY - spy
  End With

End


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()

  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
   .X = Mouse.ScreenX - Me.ScreenX - Button1.Tag[0]
   .Y = Mouse.ScreenY - Me.ScreenY - Button1.Tag[1]
  End With

End


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

Poniamo il caso di voler spostare con il mouse una TextLabel all'interno di una ScrollView:

Private spx As Short
Private spy As Short


Public Sub TextLabel1_MouseDown()

  spx = Mouse.X
  spy = Mouse.Y

End


Public Sub TextLabel1_MouseMove()

' La "TextLabel" sarà posizionata in questo caso, rispetto al cursore del Mouse, alle coordinate come appresso determinate:
  With TextLabel1
    .X = TextLabel1.X + Mouse.X - spx
    .Y = TextLabel1.Y + Mouse.Y - spy
  End With

End


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

Public Sub TextLabel1_MouseMove()

  With TextLabel1
    .X = (Mouse.X + TextLabel1.X) - TextLabel1.W / 2
    .Y = (Mouse.Y + TextLabel1.Y) - TextLabel1.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:

Public Sub Button1_MouseDown()
 
 With Button1
' Solo per curiosità vediamo il contenitore Padre attuale dell'oggetto:
   Print .Parent.Name
 End With
 
End


Public Sub Button1_MouseMove()
     
   Button1.X = (Mouse.ScreenX - Me.ScreenX) - (Button1.W / 2)
   Button1.Y = (Mouse.ScreenY - Me.ScreenY) - (Button1.H / 1.2)
 
End


Public Sub Button1_MouseUp()

   With Button1
' Si effettua la modifica del contenitore genitore dell'oggetto;
' il contenitore "Panel1" diventa il nuovo "Padre" dell'oggetto:
     .Reparent(Panel1, Mouse.X - Panel1.X)
   End With
   
  With Button1
    Print .Parent.Name
  End With

End