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

Utilisateur anonyme
20 janv. 2012 à 00:46
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


A ce moment même j'en suis incapable, (c'est pas faute de ne pas avoir essayé).
Parce que tu commences toujours avec le selection.start et puis le selection.lenght.

Mais je ne dis pas que c'est impossible...


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:50
Ce n'est pas une question d'argent ! (j'ai même tous les disques nécessaires, que m'a laissés mon beau-fils)
Je n'ai tout simplement pas envie de recommencer à dépenser mon temps pour être à nouveau pigeon (et cela va venir, je le sais déjà depuis au moins 3 ans).
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...

pas pour ce que pollack cherche à faire. Et même pas, si j'ai bien deviné, avec une seconde RTB.

____________________
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:53
Mais je ne dis pas que c'est impossible...

Ce ne pourra l'être (déjà dit) qu'en agissant "dans les coulisses" 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 à 01:12
Bon ....

Je vais m'offrir les fameux carambars à moi-même

Mon chat vient de me souffler la feinte ===>> envoyer par sendkeys (ou autre) le nombre nécessaire de flêches gauches ===>> cela déclenche le Keyup et la dll croit que les touches ont été frappées ===>> et tout marche alors

Bon ...
Je mets ce code demain matin (que dis-je ? Ce matin car il est ici déjà 1 h 15) pour Pollack.
______________
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

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

Posez votre question
Utilisateur anonyme
20 janv. 2012 à 01:15
Re,
"dans les coulisses" pour tromper la dll

J'en suis pas arrivé la...

dépenser mon temps pour être à nouveau pigeon (et cela va venir, je le sais déjà depuis au moins 3 ans).

Mais il n'y a pas de crainte d'être un pigeon, d'ailleurs nous en sommes toujours quelque-part...

Je récapitule grossièrement mon parcours:
- Visual basic en 87 (ZX-Spectrum 32 ou 64 bits de mémoire)
- QBasic 1997 (je crois)
- VB4 (même date)
- VB6 vers 1999
- vb.net 2005 (je crois vers 2004)
- vb.net 2008 (je crois vers 2007)
- vb.net 2010 (en 2009)
Et tu crois que j'ai pas été un pigeon au moins sept fois?
Et puis tu as la bonne logique de VB6, et puis nous sommes la aussi...

Alors Pollack... j'avoue qu'il n'est pas facile à suivre dans ses explications, surtout qu'il fait deux pages pour expliquer son problème qui pourrait se décrire en 5/6 lignes.

Pardon Pollack, je trouve très bien d'essayer de bien expliquer mais quand ça devient trop long, on "zappe" des parties (moi comme preuve).

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 à 08:11
Bonjour, Pollack,

Je me suis couché tôt ce matin, pour me réveiller tôt ce ... matin
Cela n'a pas vraiment fait suffisamment de sommeil et j'ai les yeux qui jouent à "belbetche"

Je "franchis maintenant la barrière" (en sélection) dans les deux sens, tant en mode clavier qu'avec la souris.
Je te livre le code tel qu'il est pour l'instant. Il a probablement besoin d'être nettoyé (je ne serais pas étonné d'avoir laissé traîné une ou deux variables inutiles), voire affiné, mais LE PRINCIPE FONDAMENTAL EST MAINTENANT LA.

A toi, maintenant, de faire nettoyage et affinage . Tu es encore en bon état, ce qui n'est pas mon cas ce matin

Sur un projet nouveau (de sorte à ne pas risquer de mélanger à un autre code) :

Option Explicit
Private Type POINTAPI
    X As Long
    Y As Long
End Type
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private mode As Byte
Private chaine As String, longueur As Integer

Private Sub Form_Load()
  chaine = "34567"
  RichTextBox1.Text = "aaaaa34567fffccc"
  longueur = calculelongueur()
End Sub

Private Sub RichTextBox1_KeyUp(KeyCode As Integer, Shift As Integer)
  mode = 0
  avancons RichTextBox1, "34567", Shift
End Sub
Private Sub RichTextBox1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = 1 Then
     mode = 1
     avancons RichTextBox1, chaine, 1
  End If
End Sub


Private Sub avancons(RTB As RichTextBox, chaine As String, maj As Integer)
  Dim toto As String
  Static ou As Integer, pos As Integer
  If ou 0 Then ou RTB.SelStart: pos = InStr(RTB.Text, chaine)
  If maj = 1 Then
    Label1.Caption = RTB.SelText & vbCrLf & RTB.SelStart
    Select Case RTB.SelStart - ou
      Case 0
        Dim ou1 As Integer
        ou1 = RTB.SelStart + RTB.SelLength
        If ou1 >= pos And ou1 < pos + Len(chaine) Then
          RTB.SelLength = RTB.SelLength + Len(chaine) - (ou1 - pos) - 1
        End If
     Case Else
       On Error Resume Next
       toto = Mid(RTB.Text, RTB.SelStart - Len(chaine) + 2, Len(chaine))
       On Error GoTo 0
       If toto = chaine Then
         Select Case mode
           Case 0
             Dim i As Integer
             For i = 1 To Len(chaine) - 1
               SendKeys "{LEFT}"
             Next
           Case 1
             Dim pa As POINTAPI
             GetCursorPos pa
             SetCursorPos pa.X - longueur, pa.Y
         End Select
       End If
     End Select
     ou = RTB.SelStart
  Else
    ou = 0
  End If
End Sub

Private Function calculelongueur() As Integer
  With Me.Font
   .Name = RichTextBox1.Font.Name
   .Size = RichTextBox1.Font.Size
   .Bold = RichTextBox1.Font.Bold
  End With
  calculelongueur = TextWidth(Mid(chaine, 2))
End Function


PS : si tu ne veux pas y laisser ta vue, fais comme moi, donne un taille de police élevée à ta RTB. Tu y verras moins mal lors des essais.




____________________
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
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
20 janv. 2012 à 10:14
Oulala il vas me falloir un peut de temps pour analyser toutes ces réponses
Encore une fois merci pour votre intérêt

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
20 janv. 2012 à 10:41
acive (jeudi 19 janvier 2012 à 18:45:06) :
L'idée d'utiliser KeyUp & MouseUp pour se prémunir des changement de sélection (et donc de changement de position du curseur) durant la sélection est pas mal (même si du coup a l'affiche c'est moins sympa). Par contre si je fait une séléction en deux temps (soit je sélection une partie du texte, m’aperçois que j'ai oublier de sélectionner et truc et veux reprendre la sélection où j'en étais, le problème se pose toujours.... Heeee je ne sait pas si je suis vraiment compréhensible )
En tous cas pas mal on se rapproche

ucfoutu (vendredi 20 janvier 2012 à 00:13:03)
Je vais peut être gagner les carambars j'ai peut être trouvé une solution hier (voir fin du message)

ucfoutu (vendredi 20 janvier 2012 à 01:12:56)
Bà voila j'ai u la même idée (ralalala c'est que j'aime ça les carambars moi aussi )

ucfoutu (vendredi 20 janvier 2012 à 01:12:56)
Je test ton code (mais l'idée fondamentale est là donc je ne m'attend pas a de mauvaises surprise)
BRAVO

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
20 janv. 2012 à 10:48
J’adapte (et met a ma sauce) ton code et le posterais ici

Encore BRAVO et surtout merci beaucoup beaucoup beaucoup tu auras passé énormément de temps sur mon problème (si tout le monde étais comme toi, prés a investir de son temps pour aider un inconnu, je pense le monde irais biennnn mieux)

Merci aussi à toi active pour toute ta bonne volonté et aussi du temps passé

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
20 janv. 2012 à 12:41
Bon bà, grosomodo (voir *), ça fonctionne et je pense que je vais garder le code comme ça

Mon code (en VB6):
Option Explicit

Private Const texte As String = "34567"

'-----------------------------
'Gestion de la sourie
Private Const C_MouseEventF_LeftUp = &H4
Private Const C_MouseEventF_LeftDown = &H2
Private Const C_MouseEventF_Absolute = &H8000
Private Const Key_LMouseButton = 1
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function GetKeyboardState Lib "user32" (kbArray As KeyboardBytes) As Long

Private Type KeyboardBytes
     kbByte(0 To 255) As Byte
End Type
Public Sub MouseRelacheGauche()
    mouse_event C_MouseEventF_LeftUp Or C_MouseEventF_Absolute, 0, 0, 0, 0
End Sub
Public Sub MouseAppuisGauche()
    mouse_event C_MouseEventF_LeftDown Or C_MouseEventF_Absolute, 0, 0, 0, 0
End Sub
Public Function ToucheEnfoncée(ByVal touche As Integer) As Boolean
    Dim KeyS As KeyboardBytes
    GetKeyboardState KeyS
    If KeyS.kbByte(touche) 128 Or KeyS.kbByte(touche) 129 Then
        ToucheEnfoncée = True
    Else
        ToucheEnfoncée = False
    End If
End Function
'-----------------------------


Private Sub Form_Load()
  RichTextBox1.text = "aaaaa34567fff"
End Sub

Private Sub RichTextBox1_SelChange()
    Dim PositionDebutSelection As Integer
    Dim PositionFinSelection As Integer
    Dim PositionAMettreAJour As Boolean
    Static DebutSelection As Integer
    Static NouvelleSelection As Boolean
    Static SelectionDroiteGauche As Boolean
    Static NoRecursif As Boolean
    Debug.Print "- RichTextBox1_SelChange " & RichTextBox1.SelStart & " | " & RichTextBox1.SelLength
    If Not NoRecursif Then
        NoRecursif = True
        
        If RichTextBox1.SelLength = 0 Then
            SelectionDroiteGauche = False
            NouvelleSelection = True
            DebutSelection = RichTextBox1.SelStart
        ElseIf NouvelleSelection = True Then
            NouvelleSelection = False
            SelectionDroiteGauche = CBool(DebutSelection > RichTextBox1.SelStart)
        End If
            
        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
                PositionAMettreAJour = True
            End If
            If PositionFinSelection > PositionDebut34567 And PositionFinSelection < PositionFin34567 Then
                PositionFinSelection = PositionFin34567
                PositionAMettreAJour = True
            End If
        End If
        If PositionAMettreAJour Then
            If SelectionDroiteGauche Then
                SelectionDeDroiteAGauche RichTextBox1, PositionDebutSelection, PositionFinSelection
            Else
                RichTextBox1.SelStart = PositionDebutSelection
                RichTextBox1.SelLength = PositionFinSelection - PositionDebutSelection
            End If
        End If
        NoRecursif = False
    End If
        
End Sub
Private Sub SelectionDeDroiteAGauche(ByRef RichTextBoxUtiliser As RichTextBox, ByVal PositionGauche As Integer, ByVal PostionDroite As Integer)
    Dim SourieGaucheAppuie As Boolean
    SourieGaucheAppuie = False
    If ToucheEnfoncée(Key_LMouseButton) Then
        MouseRelacheGauche
        DoEvents
        SourieGaucheAppuie = True
    End If
    
    RichTextBoxUtiliser.SelStart = PostionDroite
    RichTextBoxUtiliser.SelLength =  0
    SendKeys "+{LEFT " & PostionDroite - PositionGauche & "}", True
    If SourieGaucheAppuie Then
        MouseAppuisGauche
        'DoEvents
    End If
End Sub


* :
Seul petite nuance qui est mal gérée :
-E1 : Placer le curseur a droite de 34567
-E2 : Appuyer sur Shift
-E3 : Appuyer sur le bouton gauche de la sourie
-E4 : Déplacer le pointeur sur la chaine (sans relâcher ni Shift ni le clique gauche)
Instabilité :
Si on relâche la sourie et/ou le Shift alors que le pointeur est contenu dans 34567 suivant la 1ere "touche" relacher le comportement est différent.
Si on clique dans 34567 au lieu des étapes E3 et E4

Variante de ce problème :
* Ne pas mettre en commentaire le 2eme "DoEvents" de la fonction "SelectionDeDroiteAGauche".
Les sélection de droite a gauche ne fonctionne plus.
* Mettre en commentaire l'appel à "MouseAppuisGauche" :
La sourie est relâcher par programme donc on ne peut pas sélectionner plus loin que 34567.

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
20 janv. 2012 à 13:10
Bien
Mais pour les carambars : trop tard ===>> c'est mon chat qui les a eus et je ne sais même plus où ils sont passés car cette dation a été suivie par une véritable effervescence dans le quartier, effervescence caractérisée par une série de trocs successifs invraisemblables entre un chien, un chat, deux enfants (chacun étant en possession au départ d'un objet dont il ne savait trop que faire). Ils ont (les carambars) depuis totalement disparu. Je me suis laissé dire qu'ils avaient "atterri" dans l'escarcelle d'une fillette mais que, la mère de cette dernière étant préoccupée par des problèmes dentaires et de surpoids de sa fille, les avaient confisqués. Pour en faire quoi ? 3 hypothèses :
- elle les a jetés à la poubelle
ou
- elle les a tous mangés elle-même (elle est connue pour sa gourmandise)
ou
- elle les a mis dans un flacon en vue de la prochaine célébration de la fête de Halloween

Si tu as un peu de "bol", c'est la 3ème hypothèse qui est la bonne et tu auras une chance d'en avoir un ou deux (de carambars) en sonnant chez elle le 31 octobre prochain. Contacte-moi au besoin la veille et je te "refilerai" son adresse, pour y tenter ta chance.



____________________
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
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
20 janv. 2012 à 13:56
Excellant


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
Utilisateur anonyme
21 janv. 2012 à 01:35
Excellant ==>> NON!...
Excellent!...

Oui UC est en forme en ce moment...



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
21 janv. 2012 à 05:10
Non, pas vraiment.
La preuve ?
Dans mon code (montré plus haut) j'ai oublié (fatigue) de signaler un point très important : mettre le scalemode du Form en pixels (ce que j'avais fait depuis l'IDE) ===>>

Private Sub Form_Load()
  Me.ScaleMode = vbPixels ' <<<<<<<<<<<<================ ici
  chaine = "34567"
  RichTextBox1.Text = "aaaaa34567fffccc"
  longueur = calculelongueur()
End Sub

c'est très important pour la modification de la position du curseur lorsqu'on sélectionne à la souris de gauche à droite.
En pixels ===>> s'arrête pile poil là où il convient -comme au clavier)

Si en twips ===>> continue bien évidemment plus loin !

METRRE EN PIXELS, s'il vous plait.


____________________
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
21 janv. 2012 à 05:17
ou bien sur (plus orthodoxe) :
laisser le scalemode tel quel et ajouter une ligne à la fonction calculelongueur, ainsi :

Private Function calculelongueur() As Integer
  With Me.Font
   .Name = RichTextBox1.Font.Name
   .Size = RichTextBox1.Font.Size
   .Bold = RichTextBox1.Font.Bold
  End With
  calculelongueur = TextWidth(Mid(chaine, 2))
  calculelongueur = ScaleX(calculelongueur, Me.ScaleMode, vbPixels) ' <<<<======= ICI
End Function

____________________
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
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
23 janv. 2012 à 11:14
En effet avec cette modification ce code fonctionne mieux

Mais, on vas me dire pointilleux (voir carrément chiant), surtout que je ne modifierais sans doute plus mon code actuel (BEAUCOUP trop de temps investi sur un point qui avais au départ un délais de développement d'environ 20 minutes). Mais il reste des petits points perfectible dans ton code (qui est déjà très bien je ne veux pas le dénigrer).

Rappel de l’énoncer (pour éviter a d'autre de lire toute la discutions pour comprendre l'objectif)
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.

Or si on commence la sélection depuis le milieu de la chaine ça ne fonctionne pas (que ça soit avec la sourie, le clavier, ou les deux)
Dans ce ces exemples :
A = "aaaaa"
X = "34567"
B = "fffccc"
Par exemple, au clavier :
-> Placer le curseur d'écriture entre les caractères "4" et "5"
-> Enfoncer la touche shift
-> Taper sur la flèche de droite (ou de gauche)
-> Relâcher la touche shift
* Le code sélectionne "567" (ou "4567" et "retourne" la sélection, soit, la sélection par code est faite de gauche a droite alors que la sélection faite par l'utilisateur étais de droite a gauche)

Autre exemple à la sourie :
-> Placer le curseur de la sourie entre les caractères "4" et "5"
-> Enfoncer le clique gauche
-> Déplacer le curseur vers la gauche d'un caractère, soit le placer entre les caractères "3" et "4" (ou entre "5" et "6")
-> Relâcher le clique gauche
* Le code sélectionne "4567" et "retourne" la sélection (ou "567")

Dernier exemple clavier + sourie :
-> Placer le curseur d'écriture entre les caractères "4" et "5"
-> Enfoncer la touche shift
-> Cliquer entre les caractères "3" et "4" (ou entre "5" et "6")
-> Relâcher la touche shift
* Le code n’étend pas la sélection. Donc seul le caractère "4" est sélectionné (ou le caractère "5")

Je pense que tous ces points peuvent être régler avec un code dans ce style dans l'événement "SelChange"
- Sauvegarder la position du curseur "SelStart" dans une variable static, appelée ici "OldSelStart". (Ce qui paramétras ensuite de savoir si la sélection est faite de droite a gauche ou l'inverse.)
- Si, "SelStart" est égale à "OldSelStart - 1" alors le curseur se déplace de droite à gauche
- Si non si, "SelStart" est égale à "OldSelStart + 1" le curseur se déplace de gauche a droite.
- Si non, le curseur à été déplacer a la sourie
-- Si la longueur de la sélection est supérieur ou égale à 1
--- Si SelStart < OldSelStart : Séléction de droite à gauche
--- Si SelStart > OldSelStart : Sélection de gauche à droite
-- Si non (longueur de sélection = 0) par défaut : Sélection de gauche a droite

Arrivé ici on sait si la sélection se fait de droite à gauche ou de gauche à droite (ou si aucune sélection est faite et donc gauche à droite).
Reste a placer le curseur d'écriture au début ou a la fin de X (évidement si il est contenu dans la chaine X) et à sélectionner X (les fonctions que tu à déjà crées seront parfaite)

Pufffffffff quel galère juste pour sélectionner du texte

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
23 janv. 2012 à 11:25
Non, si tu touches à selstart, tu ne pourras jamais plus "reprendre".
Je t'avais dit plus haut qu'il te restait à affiner (je pensais précisément à ce point-là).
Tu veux que je le fasse en VB6 ? (je crois pouvoir).

____________________
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
23 janv. 2012 à 11:40
Mes cogitations du moment me donnent déjà à penser que j'y parviendrai sans trop de difficulté en ce qui concerne une sélection à l'aide de la souris. Je peux me tromper ou tomber sur un "os" non prévu, mais je crois que l'idée est bonne et à exploiter.


____________________
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
23 janv. 2012 à 11:44
Je continue de cogiter : ===>> Va être plus dur, mais sans "désespoir", à l'aide du clavier

Je maintiens : ne surtout pas toucher au Selstart à l'insu de la Dll qui gère en coulisses (sinon : sans reprise possible).


____________________
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
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
23 janv. 2012 à 11:48
Étant donner que je ne peut plus me permettre d'investir de temps sur ce point (mon projet prend trop de retard, on vas me taper sur les doigts), ça me rendrais service que tu le fasse (et sans doute que ça rendras service a d'autre à l'avenir).
Mais même si je garde ces "bugs" ce n'est pas la fin du monde. Je peut imaginer documenter ce bug (au moins pour la version 1 de mon application).

Non, si tu touches à selstart, tu ne pourras jamais plus "reprendre".

Oui mais si on ne touche pas a selstart comment sélectionner X en entier, alors que le curseur est contenu dans X

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
Rejoignez-nous