piu' o meno ho capito come funziona il drag & drop in gambas (anche guardando l'esempio presente nell'IDE come suggerito in un vecchio tread) .... pero' l'esempio faceva riferimento ad un treeview (con i suoi bei nodi ....) mentre io devo gestire le celle di una tableview.
ovviamente questo codice:
' If Not TableView_schedule.FindChild(Drag.x, Drag.y) Then
' Drag.Show(TableView_schedule, TableView_schedule.Item.x, TableView_schedule.Item.y, TableView_schedule.Current.Width, TableView_schedule.Current.Height)
' Else
' Drag.Show(TableView_schedule)
' Endif
If TableView_schedule.FindChild(Drag.x, Drag.y) Then
Drag.Show(TableView_schedule, TableView_schedule.Current.X, TableView_schedule.Current.y, TableView_schedule.Current.Width, TableView_schedule.Current.Height)
Else
Drag.Show(TableView_schedule)
Endif
non funziona ....
quello commentato perche' il concetto di ITEM e' sconosciuto alla tableview :D
il secondo perche' il findchild non individua nessun oggetto figlio di tableview (le celle sono figlie di table?) .....
SUGGERIEMENTI?
PS: prelevo da una lista un item e lo devo "droppare" nella cella che sto' attraversando con il mouse ;-)
PPS: se poi riuscissi a far vedere il rettangolino con il testo dell'item che sto' draggando con il mouse non sarebbe male ..... per ora ho solu un fogliett standard
Esistono dei metodi della classe per capire qual'è la cella su cui si è fatto il click del mouse, in base alle coordinate del mouse.
...exactement !
Per individuare il numero d'indice della colonna e della riga, sulle quali si è cliccato, si utilizzano rispettivamente le funzioni:
.ColumnAt( X As Integer ) As Integer
e
.RowAt( Y As Integer ) As Integer
Facciamo un semplice esempio:
Public Sub Form_Open()
With TableView1
.Columns.count = 3
.Rows.Count = 3
End With
TableView1[0, 0].Text = "zero e zero"
TableView1[1, 1].Text = "uno e uno"
TableView1[2, 2].Text = "due e due"
End
Public Sub TableView1_MouseUp()
With TableView1
Print "Colonna n. "; .ColumnAt(Mouse.X)
Print "Riga n. "; .RowAt(Mouse.Y)
Print "Testo raccolto: "; TableView1[.RowAt(Mouse.Y), .ColumnAt(Mouse.X)].Text
End With
End
.... pero' rimane il mistero di come usare il .findchild .....
La funzione in questione individua e ritorna l'eventuale oggetto "figlio" di un Contenitore, solo se tale Oggetto risulta posizionato nell'ambito delle coordinate .X e .Y (ossia dei due argomenti della funzione).
If IsNull(Me.FindChild(valore_x, valore_y)) = False Then Print Object.Type(Me.FindChild(valore_x, valore_y))
Le predette coordinate possono anche avere valori minori di zero.
Nel caso in cui, poi, alle predette coordinate siano posti più Oggetti, Figli del medesimo Genitore, viene ritornato l'Oggetto posto in prevalenza gerarchica.
ci provo .... cosi' sarebbe risolto (e sareste in credito per una birra a testa ;-) ) .... pero' rimane il mistero di come usare il .findchild ...... :D
ok provato il codice ed effettivamente funziona SENZA IL DRAG
Il drag&drop sembra catturare TUTTI gli eventi relativi al mouse e quindi gli eventi legati al suo movimento SE IN QUEL MOMENTO SI STA' FACENDO DRAG&DROP non restituiscono nulla.
ho dovuto mettere il try perche' senno dovevo forzare gambas ad uscire (F4) ma il seguente codice
Public Sub TableView_schedule_DragMove()
With TableView_schedule
Try Debug "Colonna n. " & .Column(Mouse.x) & " - Riga n. " & .RowAt(Mouse.y);
End With
End
non stampa nulla sulla consolle di debug se non l'errore:
FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.Ta
bleView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_DragMove.476: FMain.TableView_schedule_Drop.449
provero' ad aggirare il drag & drop ma era comodo ......
ALLELUYA ALLELUYA !!!!!
riguardando il vecchio codice mi sono accorto dell'esistenza di drag.x e drag.y !!!!!
evidentemente per intercettare gli eventi del mouse, il drag&drop cattura tutti gli eventi, ma deve ri-esporre alcune proprieta' (fortunatamente :D) e quindi il codice cambiando moouse.x con drag.x e mouse.y con drag.y funziona:
Public Sub TableView_schedule_DragMove()
Dim Riga As Integer
Dim Colonna As Integer
Riga = TableView_schedule.RowAt(Drag.y)
Colonna = TableView_schedule.ColumnAt(Drag.x)
Debug riga & " - " & Colonna
End