Séléction de droite a gauche

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 18 janv. 2012 à 15:52
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 5 avril 2012 à 12:02
Bonjour,

Dans un RichTextBox, je veux que certains "mots" soient complétement sélectionné ou pas du tout, je m’explique.

Par exemple dans la chaine :
"123456789"
je veux que soit 34567 soit totalement sélectionner soit pas du tout.
Pour ça :
- Je test SelectionStart
Si il est contenu dans 34567, je sauvegarde la future position en 3 (soit valeur 2, sauvegarder pour ne pas perdre ma sélection courante pour le test suivant).
- Je test SelectionStart + SelectionLength (soit la position de la fin de la sélection)
Si la valeur est contenu dans 34567, je sauvegarde la fin de la sélection en 7 (valeur 6)
- Enfin je met a jour SelectionStart et SelectionLength en fonction des valeurs trouver dans mes test précédant.

Donc si je sélectionne 123 ma sélection est "étendu" jusqu'à 7. (résultat 123456789) parfait c'est ce que je veux faire.

Par contre, si je fait ma sélection de droite a gauche, vue que SelectionStart est toujours le caractère le plus a gauche de ma sélection (et non pas le début "réel" de la sélection). Alors mon curseur se retrouve a gauche de ma sélection (il doit rester a droite, vue que je fait une sélection de droite a gauche).

Ce n'a pas l'aire d'être grand choses, mais ça me fait bien ch____ car dans le cas où je sélectionne 789. Alors ma sélection s’étend bien jusqu'à 3 (soit 123456789) mais si je veux continuer de sélectionner jusqu'à 2 alors je me retrouve a sélectionner 2 tout seul (soit 123456789) vue que mon curseur n'est plus a droite du 9 mais qu'il c'est fait déplacer entre le 2 et le 3 au moment où j'ai étendu ma sélection)

J'ai regardé par mal de choses sur le RichTextBox mais je ne trouve pas comment faire pour placer (ou tester si) le curseur est a droite ou a gauche de la sélection.

Quelqu'un aurait-il une solution a ce problème svp ?

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo

94 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2012 à 17:17
Non, Pollack !
Pour moi, travailler dans le tunnel veut dire sans VB.Net, uniquement par imagination et raisonnement sur cette imagination. C'est dur

Sous VB6 (et là non dans un tunnel, donc) , je viens de me casser les dents à plusieurs reprises en essayant de modifier TON code.
Mal au crâne, maintenant. Et je sais maintenant que pas possible sous VB6 et devine pourquoi.
Je vais donc tenter après dîner le travail de réflexion sous VB.Net, sur la base que tu m'as signalée, à savoir que le SelChange y intervient, contrairement à VB6, en cours même de sélection à la souris (avant son relâcher).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
19 janv. 2012 à 17:21
Alors,
X.Contains(RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, RichTextBox1.SelectionLength)) = True Then

Veux dire: si la chaîne sélectionnée est présente dans ta variable X est égal à vrai, then...

C'est modifié ça fonctionne déjà dans la sélection vers la droite:
Public Class Form1
    Dim LastSel As Integer
    Dim Longueur As Integer
    Dim A As String = "LE TEXTE CET ENIGME "
    Dim X As String = "CETTE CHAINE 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
        Longueur = RichTextBox1.SelectionLength
        Me.Text = RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, RichTextBox1.SelectionLength)

        If RichTextBox1.SelectionStart < RichTextBox1.Text.Length Then
            ChangeCouleur = True
            If RichTextBox1.SelectionLength > 0 And X.Contains(RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, RichTextBox1.SelectionLength)) = True Then
                RichTextBox1.Find(X)
                RichTextBox1.SelectionColor = Color.Red
                RichTextBox1.SelectionLength = Longueur
                RichTextBox1.SelectionStart = LastSel
            Else
                RichTextBox1.Find(X)
                RichTextBox1.SelectionColor = Color.Black
                RichTextBox1.SelectionLength = Longueur
                RichTextBox1.SelectionStart = LastSel
            End If
            ChangeCouleur = False
        End If
    End Sub
End Class

Je regarde pour la gauche.



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
19 janv. 2012 à 17:33
Je te propose d'utiliser uniquement VB6 je m’arrangerais pour faire la transition vers VB.NET

Par contre le code VB6 (le dernier) que j'ai poster ne fonctionne pas (enfin mal) contrairement a ce que tu disais
Le problème est dans les sélection faite de droite a gauche.

Voir ici :
http://www.youtube.com/watch?v=SoDqguXmp6Y&feature=youtu.be

Le code VB6 exécuté (le même que précédemment mais avec des "debug.print" en plus)
Option Explicit

Private Sub Form_Load()
  Debug.Print "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
        Debug.Print "RichTextBox1_SelChange + NoRecursif"
        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
            Debug.Print "RichTextBox1.SelStart = " & PositionDebutSelection
            RichTextBox1.SelStart = PositionDebutSelection
        End If
        If RichTextBox1.SelLength <> PositionFinSelection - PositionDebutSelection Then
            Debug.Print "RichTextBox1.SelLength = " & PositionFinSelection - PositionDebutSelection
            RichTextBox1.SelLength = PositionFinSelection - PositionDebutSelection
        End If
        NoRecursif = False
    End If
        
End Sub


Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
19 janv. 2012 à 17:35
active, nous on continu en VB.NET


Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 janv. 2012 à 17:58
Bonjour à tous

je ne sais si il y a un rapport
il y a bien des langues qu'on écrit de droite
à gauche donc on veut selectionner de droite à
gauche
c'est le meme problème non
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
19 janv. 2012 à 18:00
Aucune idée ??? possible mais dans ce cas le problème risque de se poser avec les sélection de gauche a droite.
Non ?

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2012 à 18:10
Attends ce soir, Polack (après dîner je tente sur une autre base de réflexion)
Mon chat vient en ronronnant de me donner des idées pas c**s du tout.
A voir si applicables ... A suivre


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
19 janv. 2012 à 18:45
Re:
Teste ça devrait fonctionner...

Public Class Form1
    Dim LastSel As Integer
    Dim Longueur As Integer
    Dim A As String = "sélectionnez du texte "
    Dim X As String = "<cette sélection existe>"
    Dim b As String = " sinon l'existance est nulle"
    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_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyUp
        If e.KeyCode = Keys.ShiftKey Then
            Dim SelText As String = RichTextBox1.SelectedText
            ChangeCouleur = True
            If X.Contains(SelText) = True Then
                RichTextBox1.Find(X)
                RichTextBox1.SelectionColor = Color.Red
            Else
                RichTextBox1.Find(X)
                RichTextBox1.SelectionColor = Color.Black
            End If
            RichTextBox1.SelectionLength = Longueur
            RichTextBox1.SelectionStart = LastSel
            ChangeCouleur = False
        End If
    End Sub

    Private Sub RichTextBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles RichTextBox1.MouseUp
        Dim SelText As String = RichTextBox1.SelectedText
        ChangeCouleur = True
        If SelText.Length 0 Or X.Contains(SelText) False Then
            RichTextBox1.Find(X)
            RichTextBox1.SelectionColor = Color.Black
        Else
            RichTextBox1.Find(X)
            RichTextBox1.SelectionColor = Color.Red
        End If
        RichTextBox1.SelectionLength = Longueur
        RichTextBox1.SelectionStart = LastSel
        ChangeCouleur = False
    End Sub

    Private Sub RichTextBox1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RichTextBox1.SelectionChanged
        If ChangeCouleur = True Then Exit Sub
        LastSel = RichTextBox1.SelectionStart
        Longueur = RichTextBox1.SelectionLength
        Me.Text = RichTextBox1.Text.ToCharArray(RichTextBox1.SelectionStart, RichTextBox1.SelectionLength)
    End Sub

End Class





Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 janv. 2012 à 18:55
Bonsoir Ucfoutu

attention que ton chat ne dévore pas la souris
0
Utilisateur anonyme
19 janv. 2012 à 20:03
En VB6 (si ça peut vous servir)...
Avec souris, clavier et sans chats

Dim LastSel, Longueur As Integer
Dim A As String
Dim TxtX As String
Dim B As String
Dim ChangeCouleur As Boolean

Private Sub Form_Load()
ChangeCouleur = False
A = "sélectionnez du texte "
TxtX = "<cette sélection existe>"
B = " sinon l'existance est nulle"
RichTextBox1.Text = A & TxtX & B
End Sub

Private Sub ColorText()
   Dim SelectedText As String
   SelectedText = RichTextBox1.SelText
   ChangeCouleur = True
   RichTextBox1.SelStart = InStr(1, RichTextBox1.Text, TxtX)
   RichTextBox1.SelLength = Len(TxtX)
   If Len(SelectedText) 0 Or InStr(1, TxtX, SelectedText) 0 Then
      RichTextBox1.SelColor = vbBlack
   Else
      RichTextBox1.SelColor = vbRed
   End If
   RichTextBox1.SelStart = LastSel
   RichTextBox1.SelLength = Longueur
   ChangeCouleur = False
End Sub

Private Sub RichTextBox1_KeyUp(KeyCode As Integer, Shift As Integer)
If KeyCode = 16 Then ColorText
End Sub

Private Sub RichTextBox1_MouseUp(Button As Integer, Shift As Integer, X As Single, y As Single)
LastSel = RichTextBox1.SelStart
Longueur = RichTextBox1.SelLength
ColorText
End Sub

Private Sub RichTextBox1_SelChange()
If ChangeCouleur = True Then Exit Sub
LastSel = RichTextBox1.SelStart
Longueur = RichTextBox1.SelLength
Me.Caption = RichTextBox1.SelText
End Sub





Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2012 à 20:36
Heu...
Je ne suis pas certain, acive, que tu aies bien compris ce que mon bouffeur de souris a compris, à savoir le résultat attendu.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
19 janv. 2012 à 20:46
Salut Jacques,
Eh ben... visiblement non...
Ca doit être à cause du roman des explications, pourtant des bouffeurs de souris j'en ai 5 ici...
Mais ce sont des feignants (ça doit être du au climat)

Bon j'attends de voir vos résultats alors...





Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 janv. 2012 à 21:08
dur dur, dans mon tunnel.
Sans rien pouvoir vérifier (juste l'algo) :
- pas de problème de gauche à droite
- pas de problème de droite à gauche tant que le "texte" ne se rajoute pas à la sélection

- mais sacré bo**el pour passer le relais à gauche sans perdre la sélection en cours ! Huge problem !
[Style télégramme]
A nouveau mal au crâne . Reprends demain !
télégramme
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2012 à 00:13
Je ne m'en sors pas, mais connais (par déductions et manoeuvres) maintenant les obstacles fondamentaux :
1) que ce soit à la souris ou au clavier
- la sélection de gauche à droite ne modifie pas le selstart
- la sélection de droite à gauche modifie le selstart (le décroit de 1 par 1)
2) quand on arrive à la chaîne (que tu apppelles texte) :
- si on arrive de gauche ==>> seul le sellength est modifié, sans toucher au selstart et on peut donc continuer sans problème
- si on arrive de droite ===>> augmentation du sellength, mais il nous faut également déplacer le selstart (augmentation non gérée par la dll de la RTB, mais par notre code)

or, la simple modification de la valeur du selstart fait perdre le seltext par la dll, qui considère qu'une nouvelle sélection a démarré.

Toutes nos manoeuvres tombent donc à l'eau, quelles que puissent être les astuces "malicieuses" tentées, sauf à parvenir à envoyer à la RTB (fonction sendmessage de l'Api de Windows et/ou sous-classement) des messages autres.
C'est cher payer (très cher).

Voilà ! j'offre 10 lots de carambars à qui parviendrait à le faire sans l'utilisation évoquée de l'API de Windows.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
20 janv. 2012 à 00:17
Re:

Ucfoutu:
Aucun rapport avec le sujet, et ce n'est même pas mes affaires, mais ça te dirait pas un jour de tester VB studio 2010?

Je sens que tu vas t'éclater, vu ta façon de fonctionner. (pas vb 2005 ou 2008, uniquement 2010)


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2012 à 00:20
Ma réponse est et sera toujours NIET, Acive.
Je ne serai plus jamais la victime de "MicroTonTon" (suis furieux de ce qu'il a fait).


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
20 janv. 2012 à 00:22
Re:

- la sélection de gauche à droite ne modifie pas le selstart
- la sélection de droite à gauche modifie le selstart (le décroit de 1 par 1)


Oui, j'y suis passé aussi, c'est pourquoi je suis passé uniquement par le mouseup et le shift.keyup, si vous regardez un peu mon code.
Sinon j'ai essayé dans tous les sens autrement...

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2012 à 00:30
Tu peux tenter tout ce que tu veux ===>> impossible du fait que le selstart devra être modifié par le code, sans que la dll ne gère cette modif.

Pour ton info : je suis allé jusqu'à oublier complètement le selChange. Je n'ai même pas utilisé le mouseup (pas nécessaire). ===>> Keyup et MouseMove m'ont tout permis, sauf lorsque, se déplaçant de droite à gauche, on arrive à la nécessité d'étendre la sélection vers la gauche et donc de modifier le selstart.
Mais ces manoeuvres et un espion m'ont par contre permis de découvrir tout ce qui se passait dans les coulisses (la dll de la RTB). Et c'est bien pour cette raison que je prends le risque d'offrir tous ces carambars à celui qui y parviendrait sans utilisation de l'API de Windows pour tromper la dll.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 janv. 2012 à 00:36
Tu vas peut-être mieux comprendre avec cette petite expérience :

Tente simplement par code :
1) par un bouton de commande : de sélectionner du texte (celui que tu veux)
2) par un autre bouton de commande : reprendre et continuer cette sélection en allant vers sa gauche


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Utilisateur anonyme
20 janv. 2012 à 00:41
Tu as une Xème solution, c'est de passer par le format texte Rtf, mais bon la comme ça j'ai pas trop cherché en .net mais en vb6 ça m'a semblé logique...


Ma réponse est et sera toujours NIET, Acive.
Je ne serai plus jamais la victime de "MicroTonTon" (suis furieux de ce qu'il a fait)


Je ne connais pas vos antécédents, mais tu as la version gratuite qui fonctionne aussi bien (d'après les forumeurs de ce site).

Moi j'ai la version ultimate et une fois que je suis tombé dedans je me suis éclaté, contrairement aux versions 2008 et surtout pas la 2005 (toutes les versions avec lesquelles j'ai programmé).

Un exemple:
Moi aussi j'ai eu des problèmes avec des erreurs faites par des services des impôts, et pourtant je récidive, je suis toujours abonné chez eux


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous