Dans une richtexbox composée d'une chaine A, d'une chaine X et d'une chaine B (dans cet ordre), je souhaite que toute sélection qui inclurait un ou plusieurs
caractères de la chaîne X soit étendue pour englober la totalité de la chaîne X.
Et je souhaite que ce résultat soit obtenu quel que soit le sens (de gauche à droite ou de droite à gauche) de la sélection faite.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionOption Explicit Private ou As Integer '====>>> IMPORTANT Private Sub Form_Load() RichTextBox1.Text = "aaaaa34567fff" End Sub Private Sub RichTextBox1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) RichTextBox1.SelLength = 0 End Sub Private Sub RichTextBox1_Mouseup(Button As Integer, Shift As Integer, x As Single, y As Single) ou = RichTextBox1.SelStart End Sub Private Sub RichTextBox1_SelChange() Dim chaine As String, pos As Integer Static deja As Boolean If deja Then deja = False Exit Sub End If chaine = "34567" pos = InStr(RichTextBox1.Text, chaine) Select Case ou Case Is = 0 If RichTextBox1.SelLength >= pos Then deja = True RichTextBox1.SelLength = Len(Mid(RichTextBox1.Text, 1, pos + Len(chaine))) End If Case Is <= pos If RichTextBox1.SelLength + ou >pos Then RichTextBox1.SelLength Len(Mid(RichTextBox1.Text, ou, pos + Len(chaine) - ou - 1)) Case Else If ou >= pos And ou <= pos + Len(chaine) - 2 Then deja = True RichTextBox1.SelStart = pos - 1 deja = True RichTextBox1.SelLength = Abs(ou - pos) + Len(chaine) End If End Select End Sub
Public Class Form1 Private ou As Integer Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Debug.Print("Form1_Load") RichTextBox1.Text = "aaaaa34567fff" End Sub Private Sub RichTextBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles RichTextBox1.MouseDown Debug.Print("RichTextBox1_MouseDown") RichTextBox1.SelectionLength = 0 End Sub Private Sub RichTextBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles RichTextBox1.MouseUp Debug.Print("RichTextBox1_MouseUp") ou = RichTextBox1.SelectionStart End Sub Private Sub RichTextBox1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RichTextBox1.SelectionChanged Static NumPassage As Integer If NumPassage = Integer.MaxValue Then NumPassage = 0 Else NumPassage += 1 End If Debug.Print(NumPassage & " RichTextBox1_SelectionChanged") Dim chaine As String, pos As Integer Static deja As Boolean If deja Then deja = False Exit Sub End If chaine = "34567" pos = InStr(RichTextBox1.Text, chaine) Select Case ou Case Is = 0 If RichTextBox1.SelectionLength >= pos Then deja = True RichTextBox1.SelectionLength = Len(Mid(RichTextBox1.Text, 1, pos + Len(chaine))) End If Case Is <= pos If RichTextBox1.SelectionLength + ou >pos Then RichTextBox1.SelectionLength Len(Mid(RichTextBox1.Text, ou, pos + Len(chaine) - ou - 1)) Case Else If ou >= pos And ou <= pos + Len(chaine) - 2 Then deja = True RichTextBox1.SelectionStart = pos - 1 deja = True RichTextBox1.SelectionStart = System.Math.Abs(ou - pos) + Len(chaine) End If End Select End Sub End Class
Option Explicit Private Sub Form_Load() RichTextBox1.Text = "aaaaa34567fff" End Sub Private Sub RichTextBox1_SelChange() Dim PositionDebutSelection As Integer Dim PositionFinSelection As Integer Dim texte As String Static NoRecursif As Boolean If Not NoRecursif Then NoRecursif = True texte = "34567" 'Permet de détécter si le text a changer depuis l'appel précédant (évite le problème d'enchainement d'événement, SelectionChanged appeler av TextChanged) PositionDebutSelection = RichTextBox1.SelStart PositionFinSelection = RichTextBox1.SelStart + RichTextBox1.SelLength If InStr(RichTextBox1.Text, texte) Then Dim PositionDebut34567 As Integer Dim PositionFin34567 As Integer PositionDebut34567 = InStr(RichTextBox1.Text, texte) - 1 PositionFin34567 = PositionDebut34567 + Len(texte) If PositionDebutSelection > PositionDebut34567 And PositionDebutSelection < PositionFin34567 Then PositionDebutSelection = PositionDebut34567 End If If PositionFinSelection > PositionDebut34567 And PositionFinSelection < PositionFin34567 Then PositionFinSelection = PositionFin34567 End If End If If PositionDebutSelection <> RichTextBox1.SelStart Then RichTextBox1.SelStart = PositionDebutSelection End If If RichTextBox1.SelLength <> PositionFinSelection - PositionDebutSelection Then RichTextBox1.SelLength = PositionFinSelection - PositionDebutSelection End If NoRecursif = False End If End Sub
Moins visible, car l’événement "SelChange" sur "RichTextBox1" est exécuter uniquement quand la sourie est relâcher (alors qu'il est exécuter a chaque caractère sélectionner sous VB.NET).
Public Class Form1 Dim LastSel As Integer Dim A As String = "VEUILLEZ PARCOURRIR LE TEXTE: " Dim X As String = "CETTE LETTRE EXISTE" Dim b As String = " AUTREMENT NON" Dim ChangeCouleur As Boolean = False Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load RichTextBox1.Text = A & X & b End Sub Private Sub RichTextBox1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RichTextBox1.SelectionChanged If RichTextBox1.Text.Contains(X) = False Then Exit Sub If ChangeCouleur = True Then Exit Sub LastSel = RichTextBox1.SelectionStart Me.Text = RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, 1) If RichTextBox1.SelectionStart < RichTextBox1.Text.Length Then ChangeCouleur = True If X.Contains(RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, 1)) = True Then RichTextBox1.Find(X) RichTextBox1.SelectionColor = Color.Red RichTextBox1.SelectionLength = 0 RichTextBox1.SelectionStart = LastSel Else RichTextBox1.Find(X) RichTextBox1.SelectionColor = Color.Black RichTextBox1.SelectionLength = 0 RichTextBox1.SelectionStart = LastSel End If ChangeCouleur = False End If End Sub End Class
If X.Contains(RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, 1)) = True Then
RichTextBox1.SelectionLength = 0
If X.Contains(RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, 1)) = True Then
je souhaite que toute sélection qui inclurait un ou plusieurs
caractères de la chaîne
(et sans même, alors, pouvoir tester sous VB6 )