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.
(5 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | 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 | + | Per copiare mediante il passaggio del puntatore del mouse uno o più caratteri - anche quelli accentati (àèéìòù) - di un testo da una ''<SPAN Style="text-decoration:underline">Label</span>'' o da una ''<SPAN Style="text-decoration:underline">TextLabel</span>'' e incollarli in un altro Controllo grafico di testo, non è di norma possibile. |
+ | |||
+ | Mostriamo un possibile codice, che intende permettere l'operazione prima descritta. | ||
+ | <BR>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 fo As New Font | ||
Private rrcc As New Rect[] | Private rrcc As New Rect[] | ||
Riga 5: | Riga 9: | ||
Private lt As Short | Private lt As Short | ||
Private cp As String | 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() | Public Sub Form_Open() | ||
+ | |||
+ | Clipboard.Clear | ||
TextLabel1.Text = "Lì o là andrò, perché è sempre di più !" | TextLabel1.Text = "Lì o là andrò, perché è sempre di più !" | ||
Riga 22: | Riga 32: | ||
rrcc[c].X = fo.TextSize(Left(TextLabel1.Text, c)).W | rrcc[c].X = fo.TextSize(Left(TextLabel1.Text, c)).W | ||
Next | 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 | End | ||
Riga 36: | Riga 55: | ||
If Asc(TextLabel1.Text[c]) < 128 Then Break | If Asc(TextLabel1.Text[c]) < 128 Then Break | ||
Next | Next | ||
+ | w = Mouse.X | ||
+ | pnt.Push(Point(Mouse.X, Mouse.Y)) | ||
+ | clr = Color.SetAlpha(Color.Red, 150) | ||
+ | DrawingArea1.Show | ||
+ | DrawingArea1.Refresh | ||
t.Clear | t.Clear | ||
<FONT Color=gray>' ''Ricorda la posizione numerica all'interno della stringa testuale del primo carattere copiato :''</font> | <FONT Color=gray>' ''Ricorda la posizione numerica all'interno della stringa testuale del primo carattere copiato :''</font> | ||
Riga 64: | Riga 88: | ||
If Asc(TextLabel1.Text[n]) < 128 Then Break | If Asc(TextLabel1.Text[n]) < 128 Then Break | ||
Next | Next | ||
+ | w2 = Mouse.X - w | ||
+ | DrawingArea1.Show | ||
+ | DrawingArea1.Refresh | ||
t.Clear | t.Clear | ||
<FONT Color=gray>' ''Inoltre ricorda la posizione numerica del carattere copiato all'interno della stringa testuale:''</font> | <FONT Color=gray>' ''Inoltre ricorda la posizione numerica del carattere copiato all'interno della stringa testuale:''</font> | ||
Riga 70: | Riga 97: | ||
Next | 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 | End | ||
Riga 81: | Riga 120: | ||
Label1.Text = Clipboard.Paste() | Label1.Text = Clipboard.Paste() | ||
+ | |||
+ | pnt.Clear | ||
+ | w = 0 | ||
+ | w2 = 0 | ||
+ | clr = Color.Transparent | ||
+ | DrawingArea1.Hide | ||
+ | DrawingArea1.Refresh | ||
End | End |
Versione attuale delle 16:48, 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 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