Copiare uno o più caratteri di un testo da una Label o da una TextLabel e incollarli in un altro Controllo di testo

Da Gambas-it.org - Wikipedia.

Per copiare mediante il passaggio del puntatore del mouse uno o più caratteri - anche quelli accentati (àèéìòù) - di un testo da una Label o da una TextLabel e incollarli in un altro Controllo grafico di testo, non è di norma possibile.

Mostriamo un possibile codice, che intende permettere l'operazione prima descritta.
Basta cliccare nella TextLabel sul primo carattere, dal quale si intende cominciare a copiare, e, mantenendo premuto il tasto del mouse, proseguire fino al carattere da copiare e rilasciare il tasto del mouse. Quindi cliccare sulla Label, per incollare quanto copiato nella TextLabel.

Private DrawingArea1 As DrawingArea
Private fo As New Font
Private rrcc As New Rect[]
Private t As New Byte[]
Private lt As Short
Private cp As String
Private pnt As New Point[]
Private w As Short
Private w2 As Short
Private clr As Integer


Public Sub Form_Open()

 Clipboard.Clear

 TextLabel1.Text = "Lì o là andrò, perché è sempre di più !"

 With Label1
   .Alignment = Align.TopLeft
   .Background = Color.SoftYellow
 End With 

 For c As Short = 0 To TextLabel1.Text.Len - 1
' Per ogni carattere del testo, presente nella "TextLabel", viene individuato il rettangolo dato dalle sue dimensioni:
   rrcc.Push(fo.TextSize(TextLabel1.Text[c]))
' Per ogni carattere del testo si individua a quanti pixel dall'inizio del testo si trova il lato sinistro del proprio rettangolo (quindi a quanti pixel il carattere si trova dal pixel iniziale del testo):
   rrcc[c].X = fo.TextSize(Left(TextLabel1.Text, c)).W
 Next

 With DrawingArea1 = New DrawingArea(TextLabel1) As "DrawingArea1"
   .X = 0
   .Y = 0
   .W = TextLabel1.W
   .H = TextLabel1.H
   .Background = Color.Transparent
   .Hide
 End With

End

Public Sub TextLabel1_MouseDown()

 For Each rc As Rect In rrcc
' Se il puntatore del mouse clicca all'interno di un rettangolo di un carattere...:
   If rc.Contains(Mouse.X, Mouse.Y) Then
' ...allora copia il carattere sul quale si è cliccato con il mouse:
     For c As Short = rrcc.Find(rc) To rrcc.Find(rc) + 1
       t.Push(Asc(TextLabel1.Text[c]))
       cp = t.ToString(0, t.Count)
       If Asc(TextLabel1.Text[c]) < 128 Then Break 
     Next
     w = Mouse.X
     pnt.Push(Point(Mouse.X, Mouse.Y))
     clr = Color.SetAlpha(Color.Red, 150)
     DrawingArea1.Show
     DrawingArea1.Refresh
     t.Clear
' Ricorda la posizione numerica all'interno della stringa testuale del primo carattere copiato :
     lt = rrcc.Find(rc)
   Endif 
 Next

End

Public Sub TextLabel1_MouseMove()

 For c As Short = 0 To rrcc.Max
' Se spostando il puntatore del mouse, si passa sopra il rettangolo di un carattere...:
   If rrcc[c].Contains(Mouse.X, Mouse.Y) Then
' ...allora, se si sta andando da sinistra a destra, ossia in senso inverso alla scrittura del testo, oppure se si continua a passare sul medesimo rettangolo di un carattere, il passaggio del puntatore del mouse non viene preso in considerazione...:
     If rrcc.Find(rrcc[c]) <= lt Then Continue
' ...altrimenti, si copia nella variabile "cp" di tipo stringa il carattere sul quale il puntatore del mouse è passato:
     For n As Short = rrcc.Find(rrcc[c]) To rrcc.Find(rrcc[c]) + 1
       If Asc(TextLabel1.Text[n]) > 127 Then 
         t.Push(Asc(TextLabel1.Text[n]))
         t.Push(Asc(TextLabel1.Text[n + 1]))
' Incrementa il contatore del ciclo "FOR...NEXT":
         n += 1 
       Else 
         t.Push(Asc(TextLabel1.Text[n]))
       Endif 
       cp &= t.ToString(0, t.Count)
       If Asc(TextLabel1.Text[n]) < 128 Then Break 
     Next
     w2 = Mouse.X - w 
     DrawingArea1.Show
     DrawingArea1.Refresh
     t.Clear
' Inoltre ricorda la posizione numerica del carattere copiato all'interno della stringa testuale:
     lt = rrcc.Find(rrcc[c])
   Endif
 Next

End

Public Sub DrawingArea1_Draw()

 With Paint
   For i As Short = 0 To pnt.Max
     .FillRect(pnt[0].X, pnt[0].Y, w2, pnt[i].Y, clr)
     .Fill
   Next
   .End
 End With
 
End

Public Sub TextLabel1_MouseUp()

 Clipboard.Copy(cp)

End

Public Sub Label1_MouseUp()

 Label1.Text = Clipboard.Paste()

 pnt.Clear
 w = 0
 w2 = 0
 clr = Color.Transparent
 DrawingArea1.Hide
 DrawingArea1.Refresh

End