:ciao:
Sempre su questo tema, sto cercando di impostare la mappa su un scollview.
Per poter mettere le "tende" sul campo impiego una icona che poi sarà posta in un Vpanel (come l'esempio DragNDrop negli esempi di gambas).
Il mio problema è che dopo il drag, non riesco a capire come fare il drop nella scroll view.
' Gambas class file
Public Sub _new()
End
Public Sub Form_Open()
Me.center
End
'
Public Sub PictureBox1_MouseDown()
Drag.icon = Last.picture '
Last.drag(Last.picture.image)
Endif
End
Public Sub ScrollView1_DragMove()
Drag.show(ScrollView1, ScrollView1.X, ScrollView1.Y)
End
Public Sub ScrollView1_Drop()
??? E ' qui che casca l'asino!!!
Endif
End
Grazie :)
Sono partito dall'esempio DragNDrop 3.2.0. L'ho modificato, riducendo il codice all'essenziale ed aggiungendo una ScrollView. Nella ScrollView ho posto, poi, una PictureBox7.
Public Sub PictureBox1_MouseDrag()
If Mouse.Left Then
Drag.Icon = Last.Picture
Last.Drag(Last.Picture.Image)
Endif
End
Public Sub TreeView1_Drop()
PictureBox7.Picture = Drag.Data.Picture
End
Public Sub ScrollView3_Drop()
PictureBox7.Picture = Drag.Data.Picture
End
Dunque, prendendo un'immagine, posta nel pannello laterale destro (è rimasto identico all'esempio originale), e, dopo averla trascinata, la rilascio all'interno della TreeView1, l'immagine viene mostrata nella nuova PictureBox7 (posta nella ScrollView).
Se, invece, la rilascio all'interno della ScrollView, non accade niente.
Attualmente, non so il perché.
Se, invece, la rilascio all'interno della ScrollView, non accade niente.
Attualmente, non so il perché.
Allora, kikko: svelato l'arcano !
La proprietà .Drop dell'oggetto, che deve sollevare l'evento _Drop(), deve essere posta a True !
Quindi il codice di sopra diventa (tenendo conto che la proprietà .Drop dell'oggetto TreeView1 dell'esempio originario DragNDrop 3.2.0 era nell'Ide già posta a True ):
Public Sub Form_Open()
ScrollView3.Drop = True
End
Public Sub PictureBox1_MouseDrag()
If Mouse.Left Then
Drag.Icon = Last.Picture
Last.Drag(Last.Picture.Image)
Endif
End
Public Sub TreeView1_Drop()
PictureBox7.Picture = Drag.Data.Picture
End
Public Sub ScrollView3_Drop()
PictureBox7.Picture = Drag.Data.Picture
End
Non droppa sia nello ScrollView che nel TreeView
Innanzitutto, devo precisare che anche la proprietà .Drop dell'oggetto TreeView deve essere posta ovviamente a .True.
Mah.... è strano che non funzioni...
Fai questa semplice prova:
* su un Form poni un oggetto VPanel, nel quale poni tre PictureBox. Nell'IDE - per fare prima - assegni a ciascuna di queste PictureBox il medesimo nome di Gruppo (ad esempio: pb). Quindi assegni ancora a ciascuna di esse una diversa immagine.
* sul Form poni anche un oggetto ScrollView, nel quale poni una sola PictureBox (che così avrà il nome PictureBox4).
* infine dai il seguente codice all'applicativo-prova:
Public Sub Form_Open()
ScrollView1.Drop = True
End
Public Sub pb_MouseDrag()
If Mouse.Left Then
Drag.Icon = Last.Picture
Last.Drag(Last.Picture.Image)
Endif
End
Public Sub ScrollView1_Drop()
PictureBox4.Picture = Drag.Data.Picture
End
Questo è sostanzialmente il codice essenziale per generare un completo evento Drag-Drop
Nel mio progettino che simula la roulette nell'evento drop del tavolo di gioco per posizionare le fiches sul numero scelto in posizione casuale ma senza uscire ho fatto così:
fiches[fiches.max].Reparent(Tavolodigioco)
fiches[fiches.max].x = Tavolodigioco.x + .x + CInt(Rnd(0, .width - fiches[fiches.max].width))
fiches[fiches.max].y = Tavolodigioco.y + .y + CInt(Rnd(0, .height - fiches[fiches.max].height))
Magari può esserti d'aiuto. :)
Errata corrige, le ultime 2 righe che ho messo sopra vanno scritte così:
fiches[fiches.max].x = Last.x + CInt(Rnd(0, .width - fiches[fiches.max].width))
fiches[fiches.max].y = Last.y + CInt(Rnd(0, .height - fiches[fiches.max].height))
Com'erano scritte prima ti mandava fuori dalla control su cui droppavi.
Ho fatto qualche prova, ed ho visto che le coordinate del puntatore del mouse restituite con l'evento _Drop() non sono risultate coerenti con la posizione del puntatore medesimo all'interno dell'oggetto nel momento in cui viene sollevato quell'evento
Su un Form pongo una ScrollView ed una PictureBox, nella quale è presente l'immagine che trascinerò poi con il mouse all'interno della ScrollView.
Public Sub Form_Open()
ScrollView1.Drop = True
End
Public Sub PictureBox1_MouseDrag()
If Mouse.Left Then
Drag.Icon = Last.Picture
Last.Drag(Last.Picture.Image)
Endif
End
Public Sub ScrollView1_Drop()
Dim pb As PictureBox
' Poiché la "ScrollView" non è in grado di supportare in modo autonomo un'immagine,
' allora creo una "PictureBox" all'interno della "ScrollView" all'atto del "_Drop()" .
' Le assegno coordinate del puntatore del mouse, immagine prelevata e trascinata
' con il mouse, e le medesime dimensioni della predetta immagine trascinata e rilasciata:
With pb = New PictureBox(ScrollView1)
.X = Mouse.X
.Y = Mouse.Y
.Picture = Drag.Data.Picture
.W = Drag.Data.Picture.W
.H = Drag.Data.Picture.H
End With
' Per curiosità vedo in console le coordinate "stranissime"
' del mouse riportate nel caso dell'evento "_Drop()":
With Mouse
Print .X
Print .Y
End With
End
In effetti c'è qualcosa che non quadra con le coordinate del mouse.
Ho provato a modificare le linee sopra in questa maniera:
fiches[fiches.max].x = Last.x + Mouse.X
fiches[fiches.max].y = Last.y + Mouse.y
Print Mouse.X
Print Mouse.Y
Droppa in un punto differente da dove mollo, pur restando all'interno della Label, e mi riporta delle coordinate che poco c'entrano con la posizione effettiva dove ho droppato.