Drag-Drop di un testo in una DrawingArea
Mostriamo un possibile codice per effettuare un semplice Drag-Drop di un testo da un qualsiasi oggetto in una DrawingArea. In particolare nell'esempio che segue un testo verrà semplicemente prelevato e trascinato da una TextArea e rilasciato in una DrawingArea:
Private drX As Short
Private drY As Short
Private testo As String
Public Sub Form_Open()
TextArea1.Text = "testo qualsiasi"
' Attiviamo la capacità della "DrawingArea" di sollevare l'evento "_Drop()":
DrawingArea1.Drop = True
End
Public Sub TextArea1_MouseDrag()
' Preleviamo e trasciniamo il testo dalla "TextArea":
TextArea1.Drag(TextArea1.Text, "text/html")
End
Public Sub DrawingArea1_Drop()
' All'atto del rilascio del testo vengono assegnate in apposite variabili
' il testo medesimo, nonché le coordinate X ed Y di rilascio all'interno della "DrawingArea".
' I valori contenuti in dette variabili, saranno utilizzati per disegnare il testo nella "DrawingArea":
testo = Drag.Data
drx = Drag.X
drY = Drag.Y
End
Public Sub DrawingArea1_Draw() ' Si disegna il testo nella "DrawingArea"
DrawingArea1.Refresh
With Paint
.Font.Size = 10
.Brush = Paint.Color(Color.Red)
.DrawRichText(testo, drX, drY)
.End
End With
End
Va fatto notare che, qualora il testo da trascinare contenga caratteri di controllo supportati attualmente da Gambas (come ad esempio \n "fine riga e a capo"), se viene effettuato il semplice trascinamento del testo, esso sarà disegnato nella DrawingArea su un'unica riga senza rispettare l'effetto dei caratteri di controllo in esso presenti. Se il testo, invece, viene evidenziato, cliccando prima con il tasto sinistro del mouse all'inizio del testo medesimo tenendo contemporaneamente premuto il tasto dello Shift, e poi cliccando (sempre tenendo premuto il tasto dello Shift) alla fine del testo, allora il testo trascinato e rilasciato nella DrawingArea sarà disegnato con il rispetto dell'effetto dei caratteri di controllo supportati da Gambas.
Conservare il testo precedentemente trascinato
Per conservare - durante un nuovo rilascio del testo nella DrawingArea - il testo già trascinato, bisognerà inserire i valori (ed in particolare: testo e coordinate di rilascio) di ciascun trascinamento effettuato in una variabile di tipo Struttura, che a sua volta dovrà essere memorizzata all'interno di una variabile vettoriale del tipo della Struttura dichiarata nel programma.
Ogni qualvolta avviene il disegno all'interno della DrawingArea del nuovo testo trascinato, bisognerà mediante un apposito ciclo far ridisegnare dalla DrawingArea anche gli elementi grafici (i vari testi), sino a quel momento trascinati e disegnati, sulla base dei valori memorizzati - per ciascun testo trascinato - in un'apposita variabile di tipo Struttura dichiarata.
Mostriamo un semplice esempio (si deve avere l'accortezza possibilmente di non prelevare per il trascinamento parti del testo evidenziate. Pertanto si provvederà a cliccare all'esterno del testo da prelevare per eliminare una eventuale evidenziazione di parte del testo da trascinare):
Public Struct VALORITESTO
drx As Short
dry As Short
testo As String
End Struct
Private vt As New VALORITESTO[]
Private i As Integer
Public Sub Form_Open()
TextArea1.Text = "testo 1"
' Attiviamo la capacità della "DrawingArea" di sollevare l'evento "_Drop():
DrawingArea1.Drop = True
End
Public Sub TextArea1_MouseDrag()
' Preleviamo e trasciniamo il testo dalla "TextArea":
TextArea1.Drag(TextArea1.Text, "text/html")
End
Public Sub DrawingArea1_Drop()
Dim t As VALORITESTO
' All'atto del rilascio del testo viene creata una variabile del tipo della "Struttura" dichiarata.
' Inoltre vengono assegnate ai corrispondenti membri della variabile "Struttura" il testo trascinato,
' nonché le coordinate X ed Y di rilascio del testo medesimo all'interno della "DrawingArea".
' I valori contenuti nei predetti membri della "Struttura", saranno utilizzati per disegnare il testo nella "DrawingArea".
With t = New VALORITESTO
.testo = Drag.Data
.drx = Drag.X
.dry = Drag.Y
End With
vt.Push(t)
Inc i
TextArea1.Text = "testo " & CStr(i + 1)
End
Public Sub DrawingArea1_Draw() ' Si disegna il testo nella "DrawingArea"
Dim n As Integer
DrawingArea1.Refresh
For n = 0 To vt.Max
With Paint
.Font.Size = 10
.Brush = Paint.Color(Color.Red)
.DrawRichText(vt[n].testo, vt[n].drX, vt[n].drY)
End With
Next
End