Differenze tra le versioni di "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.
Riga 8: Riga 8:
 
  Public Sub Form_Open()
 
  Public Sub Form_Open()
 
   
 
   
   TextLabel1.Text = "Questo è un testo qualsiasi da copiare !"
+
   TextLabel1.Text = "Lì o là andrò, perché è sempre di più !"
 
   
 
   
 
   With Label1
 
   With Label1

Versione delle 10:03, 31 mag 2023

Per copiare 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, è possibile usare il seguente codice:

Private fo As New Font
Private rrcc As New Rect[]
Private lt As Short
Private cp As String


Public Sub Form_Open()

 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

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
     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, 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
     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 TextLabel1_MouseUp()

 Clipboard.Copy(cp)

End

Public Sub Label1_MouseUp()

 Label1.Text = Clipboard.Paste()

End