Newsgroup: it.comp.lang.visual-basic
Titolo: Drag & Drop in un treeview!!

Salve era da un po' che non mi facevo vedere!!!
Cmq ho un probl con il drag & drop.
Ho un elenco in una listview e voglio che prendendo uno di questi items
riesca a trascinarlo in una parte del treeview.
Questo è semplice!
Il problema nasce dal fatto che quando muovo il cursore (già carico delle
informazioni dell'item, ossia dopo aver fatto il drag!) nel treeview non è
possibile fare la selezione del nodo, ma solo effettuare il drop nell'ultimo
elemento che abbiamo selezionato, cioè prima del drag!!!!
Come faccio!!!
Vorrei poter scegliere la posizione nel treeview anche durante il
trascinamento!!!!
Aiuto & Ciao
Ivan

trascinamento!!!!
Se ho capito il tuo dubbio, penso che basti forzare la selezione del nodo
sul quale ti trovi:
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, _
                                                   Effect As Long, Button As Integer, _
                                                   Shift As Integer, x As Single, y As Single)
    Dim mi_Node As Node
    Set mi_Node = TreeView1.HitTest(x, y)
    If Not mi_Node Is Nothing Then
        mi_Node.Selected = True
        mi_Node.EnsureVisible
    End If
End Sub
-- 
hth, hal

 ha scritto nel messaggio
news:hTWq8.116441$%g7.37...@twister2.libero.it...

[SNIP]
E' sufficiente che tu memorizzi l'ultimo nodo su cui sei passato,
nell'evento DragOver del treeview, prima del drop, che gestisci immagino
nell'evento DragDrop
Il nodo lo puoi trovare passando le coordinate al metodo HitTest, ma non
solo: esiste una property DropHighlight che serve proprio per memorizzare
questa informazione e dare anche un feedback visivo per le operazioni di
trascinamento.
Cerca sulla guida DropHighlight e vedrai un esempio completo...
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 ha scritto nel messaggio
news:a8hhfb$sioem$1...@ID-138791.news.dfncis.de...


 MsgBox?
[SNIP]
Se rileggi le risposte precedenti trovi gia' la risposta; in particolare
vedrai che l'elemento determinante e' l'utilizzo del metodo HitTest...
questo puo' essere usato in qualsiasi momento tu abbia a disposizione le
coordinate x e y da testare
Gli eventi DragDrop, OleDragDrop, DragOver, MouseMove ecc... restituiscono
tutti le coordinate che ti interessano, per cui e' sufficiente verificare in
quello piu' appropriato (diciamo uno dei due "Drop") se esiste un nodo
corrispondente al punto indicato
Nel messaggio di Hal, cosi' come sulla guida di HitTest,  c'e' l'esempio di
codice che ti serve...


 codice che ti serve...
Scusami ma non riesco proprio a capire come risolvere il problema, ho
provato a utilizzare il codice di HAL:
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, _
                                                   Effect As Long, Button As
Integer, _
                                                   Shift As Integer, x As
Single, y As Single)
    Dim mi_Node As Node
    Set mi_Node = TreeView1.HitTest(x, y)
    If Not mi_Node Is Nothing Then
        mi_Node.Selected = True
        mi_Node.EnsureVisible
    End If
End Sub
ma non succede niente io vorrei che mi apparisse un messaggio a video con
indicato la stringa presente nel nodo selezionato per l'operazione del drag
and drop oppure che i nodi si spostassero esattamente come succede in
Esplora risorse!
Ti ringrazio in anticipo.


Esplora risorse!
Pensavo che questo lo avresti aggiunto da solo:
	MsgBox mi_Node.Text 
-- 
ciao, hal


----------------------------------------------------------------------------
----------------
Scusami HAL, non vorrei insistere troppo ma ho aggiunto la riga
MsgBox mi_Node.Text  quindi diventa:
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, _
                                                   Effect As Long, Button As
Integer, _
                                                   Shift As Integer, x As
Single, y As Single)
    Dim mi_Node As Node
    Set mi_Node = TreeView1.HitTest(x, y)
    'MsgBox mi_Node
    If Not mi_Node Is Nothing Then
        mi_Node.Selected = True
        mi_Node.EnsureVisible
    End If
    MsgBox mi_Node.Text
End Sub
Solo che mi restituisce sempre la radice principale dell'albero e non dove è
posizionato il mouse! Inoltre si verifica questo problema:
se ho un albero del tipo
nomeradice
    nodo1
    nodo2
        nodo1-nodo2
    nodo3
    nodo4
ed eseguo il seguente percorso:
1. Seleziono il nodo1
2. Seleziono il nodo3 tenendo premuto il tasto del mouse per trascinarlo
all'interno del nodo2, ma succede che si autoseleziona il nodo1 perchè è
l'ultimo selezionato prima del drag and drop e la tua funzione mi
restituisce comunque "nomeradice".
Da cosa può dipendere? Sperando profondamente in un tuo aiuto ti saluto e ti
ringrazio per la disponibilità dimostrata.
Se vuoi ti spedisco il programma, in modo che tu possa aiutarmi meglio.


Se vuoi ti spedisco il programma, in modo che tu possa aiutarmi meglio.
Qualsiasi cosa mi spediate, e' poco probabile che riesca a leggerla
perche' applico dei filtri ferocissimi sulla posta in
entrata ;-)
Eventualmente copia e incolla il codice su un messaggio e invialo di
seguito a questo thread.
-- 
hth, hal


[SNIP]
Devi essere sicuro che sia "scattato" correttamente l'OLE drag nel Tree,
perche' tutto funzioni... per fare questo in automatico devi impostare di
conseguenza le property OLEDragMode e OLEDropMode.
Prova a creare un semplice form con un TreeView e incolla questo codice:
Private Sub Form_Load()
With TreeView1
    .OLEDragMode = ccOLEDragAutomatic
    .OLEDropMode = ccOLEDropManual
    .Nodes.Add , , "root", "Root"
    .Nodes.Add "root", tvwChild, "c1", "Child 1"
    .Nodes.Add "root", tvwChild, "c2", "Child 2"
    .Nodes.Add "root", tvwChild, "c3", "Child 3"
    .Nodes.Add "c1", tvwChild, "c1.1", "Child 1.1"
    .Nodes.Add "c1", tvwChild, "c1.2", "Child 1.2"
    .Nodes.Add "c2", tvwChild, "c2.1", "Child 2.1"
    .Nodes("root").Expanded = True
End With
End Sub
Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, _
 Effect As Long, Button As Integer, Shift As Integer, _
 x As Single, y As Single)
Dim mi_Node As Node
Set mi_Node = TreeView1.HitTest(x, y)
If Not mi_Node Is Nothing Then
    mi_Node.Selected = True
    mi_Node.EnsureVisible
    'Nota: questa e' interna all'IF, deve essere eseguita solo
    'se esiste un nodo alle coordinate passate...
    MsgBox mi_Node.Text
End If
End Sub
Private Sub TreeView1_OLEDragOver(Data As MSComctlLib.DataObject, _
 Effect As Long, Button As Integer, Shift As Integer, _
 x As Single, y As Single, State As Integer)
'questa e' solo una finezza estetica; il drop
'funziona corretamente comunque
Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
End Sub


 Ciao
Ora forse ho capito il problema! LA tua soluzione funziona benissimo se la
utilizzo in VisualBasic ma se provo in VisualBAsic for Application per
AutoCAD mi restituisce sempre "Root" in qualsiasi nodo io faccia il drag and
drop!
Da cosa può dipendere?
Ringrazio in anticipo.
