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: | ||
Private lt As Short | Private lt As Short | ||
Private cp As String | Private cp As String | ||
− | Private | + | Private pnt As New Point[] |
Private w As Short | Private w As Short | ||
Private w2 As Short | Private w2 As Short | ||
Riga 55: | Riga 55: | ||
Next | Next | ||
w = Mouse.X | w = Mouse.X | ||
− | + | pnt.Push(Point(Mouse.X, Mouse.Y)) | |
clr = Color.SetAlpha(Color.Red, 150) | clr = Color.SetAlpha(Color.Red, 150) | ||
DrawingArea1.Show | DrawingArea1.Show | ||
Riga 102: | Riga 102: | ||
With Paint | With Paint | ||
For i As Short = 0 To k.Max | For i As Short = 0 To k.Max | ||
− | .FillRect( | + | .FillRect(pnt[0].X, pnt[0].Y, w2, pnt[i].Y, clr) |
.Fill | .Fill | ||
Next | Next | ||
Riga 119: | Riga 119: | ||
Label1.Text = Clipboard.Paste() | Label1.Text = Clipboard.Paste() | ||
+ | |||
+ | pnt.Clear | ||
+ | w = 0 | ||
+ | w2 = 0 | ||
+ | clr = Color.Transparent | ||
+ | DrawingArea1.Hide | ||
+ | DrawingArea1.Refresh | ||
End | End |
Versione delle 16:45, 31 mag 2023
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 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 k.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