Aller a la ligne sans couper mots [Résolu]

aiko74 22 Messages postés mercredi 16 février 2005Date d'inscription 17 novembre 2005 Dernière intervention - 13 nov. 2005 à 20:00 - Dernière réponse : Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention
- 18 nov. 2005 à 23:02
[vb6]
Bonjour,
Je voudrais traiter le texte entré dans un textbox qui sera ensuite envoyer dans un document. Chaque ligne ne dois pas depassé 73 caracteres.J'aimerais eviter de couper les mots en deux donc mettre un saut de ligne au dernier espace avant le 73ème caractere de chaque lignes.
Je ne sais pas trop qoa utiliser ... selectionner les 73 premier avec Mid puis chercher le dernier espace avec InstrRev et fire plein de boucles . Peut etre y a t'il un moyen plus simple...
Merci
Afficher la suite 

8 réponses

Meilleure réponse
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 14 nov. 2005 à 02:37
3
Merci
Salut
Non, c'est bien ça : Chercher l'espace (avec InstrRev) qui apparait avant le 73ème caractère de ta chaine. Il n'y a guère mieux.

Autre chose : si le texte a une police proportionnelle (genre Arial), la largeur d'un texte ne dépend plus du comptage des caractères. Il faut résonner en Twips (unité de taille) des caractères.
Indices :
Me.TextLength("Codes-Sources") renvoie la longueur en twips de ce texte --> A comparer à ton TextBox.Width
Me = la Form en cours, mais fonctionne aussi avec une PictureBox.
Pour faire de bons calculs, il faut avoir mis les bons paramètres dans Me (ou PictureBox).Font ...

Mais pour la césure (coupure) de mots, il faudra de toute façon écrire la première partie (que tu prennes 73 caractères ou que tu calcules le texte à prendre en compte en fonction de sa longueur graphique)

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)

Merci cs_Jack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 15 nov. 2005 à 02:30
3
Merci
Option Explicit



Dim Lmax As Long



Private Sub Form_Load()

Text1 = "Bonjour," & vbCrLf

Text1 = Text1 & "Je voudrais traiter le texte
entré dans un textbox qui sera ensuite envoyer dans un document. Chaque
ligne ne dois pas depassé 73 caracteres. J'aimerais eviter de couper
les mots en deux donc mettre un saut de ligne au dernier espace avant
le 73ème caractere de chaque lignes. Je ne sais pas trop quoi utiliser
..." & vbCrLf

Text1 = Text1 & vbCrLf

Text1 = Text1 & "selectionner les 73 premiers
avec Mid puis chercher le dernier espace avec InstrRev et faire plein
de boucles. Peut etre y a t'il un moyen plus simple..."

Lmax = 73

End Sub



Private Sub Command1_Click()

Dim c As String

Dim s As String

Dim i As Integer

Dim j As Integer

Dim k1 As Integer

Dim k2 As Integer

Dim Lg As Long



c = Chr$(184)

s = Replace(Text1.Text, vbCrLf, c) & " "

Text1.Text = ""

Lg = Len(s)

j = 1



While j < Lg

k1 = InStr(j, s, c)

If k1 0 Then k1 Lg + 1



For i = j To k1

k2 = InStr(i, s, " ")

If k2 = 0 Then Exit For

If k2 > k1 Then k2 = k1

If k2 - j > Lmax Then Exit For

i = k2

DoEvents

Next



If i > k1 Then

i = k1 + 1

End If

If i = j Then

' MsgBox "désolé pour la troncation obligatoire"

i = j + Lmax + 1

End If



Text1.Text = Text1.Text & Mid$(s, j, i - 1 - j) & vbCrLf

j = i



Wend



End Sub


Daniel

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Meilleure réponse
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 16 nov. 2005 à 12:52
3
Merci
ha bon c'est possible j'ai pas tout testé.

je te donne l'autre méthode, , plus originaleplus fiable.

TextBox1 a une ScrollBar vertical et un BorderStyle à 1.

TextBox2 ne sert qu'à récupérer le résultat, doit être suffisamment
large pour recevoir les lignes, mais pas obligatoire ça peut être
directement une String.





Option Explicit



Dim Lmax As Long



Private Sub Form_Load()

' exemple de Texte

Text1 = "Bonjour," & vbCrLf

Text1 = Text1 & "Je voudrais traiter le texte entré dans un textbox qui sera ensuite envoyer "

Text1 = Text1 & "dans un document. Chaque ligne ne dois pas depassé 73 caracteres. J'aimerais "

Text1 = Text1 & "eviter de couper les mots en deux donc mettre un saut de ligne au dernier "

Text1 = Text1 & "espace avant le 73ème caractere de chaque lignes. Je ne sais pas trop quoi "

Text1 = Text1 & "utiliser ..." & vbCrLf

Text1 = Text1 & vbCrLf

Text1 = Text1 & "selectionner les 73 premiers avec Mid puis chercher le dernier espace avec "

Text1 = Text1 & "InstrRev et faire plein de boucles. Peut etre y a t'il un moyen plus simple..."

Lmax = 73

End Sub



Private Sub Command1_Click()

Dim s As String

Dim i As Integer

Dim j As Integer

Dim Lg As Integer



' c'est Vb qui fait tout le travail

' donc plus d'erreur de découpage



' mettre les mesures en pixels

Me.ScaleMode = 3

' la longueur dépend de la police utilisée

Text1.Font = "Courier New"

Text1.FontSize = 8

Me.Font = "Courier New"

Me.FontSize = 8

' il faut ajouter 17 pour la Scrollbar Vertical et 4 pour les bordures

Lg = Me.TextWidth(String$(Lmax, "A")) + 17 + 4

' ajouter une fin de ligne à la textBox si n'existe pas

' pour permettre de sélectionner la dernière ligne

If Right$(Text1.Text, 2) <> vbCrLf Then Text1.Text = Text1.Text & vbCrLf



' adapter la taille des TextBox

Text1.Width = Lg

Text2.Width = Lg + 10



Lg = Len(Text1.Text)

Text1.SelStart = 0

Text1.SelLength = 0

Text1.SetFocus

Text2.Text = ""

j = 0



While j < Lg

i = j + 1

SendKeys ("+{DOWN}")

DoEvents

j = Text1.SelLength

If j > i Then

s = Mid$(Text1.Text, i, j + 1 - i)

If Right$(s, 2) <> vbCrLf Then s = s & vbCrLf

Text2.Text = Text2.Text & s

End If

Wend



Text1.SelStart = 0

Text1.SelLength = 0

End Sub


Daniel

Merci Gobillot 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

aiko74 22 Messages postés mercredi 16 février 2005Date d'inscription 17 novembre 2005 Dernière intervention - 14 nov. 2005 à 22:32
0
Merci
Merci.
Les lignes vides poses problemes

Private Sub Command1_Click()
Dim ouaf As Integer
Dim blu As String
Dim hihi As String
degus = 0
ouaf = 1
Loop1:
degus = degus + 1
blu = Mid(Text1, ouaf, 73)
hihi = Mid(blu, InStrRev(blu, Chr(32)) + 1)
bah = 73 - Len(hihi)
Text2 = Text2 + Mid(blu, 1, bah) + vbCrLf
ouaf = ouaf + (73 - Len(hihi))
If degus = 8 Then GoTo end1
GoTo Loop1
end1:
End Sub
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 15 nov. 2005 à 23:00
0
Merci
comme tu as surement remarqué, la TextBox fait exactement ce que tu
demandes, et de façon naturelle, elle coupe ses lignes soit à un
espace, soit à une fin de ligne, et s'il n'y a rien il y a "troncation
obligatoire".

il suffirait d'adapter la taille de la TextBox, et d'aller rechercher
les Lignes comme elles sont en ajoutant une fin de ligne où il n'y en a
pas.



si ça t'intéresse, j'ai le code.

Daniel
aiko74 22 Messages postés mercredi 16 février 2005Date d'inscription 17 novembre 2005 Dernière intervention - 16 nov. 2005 à 10:32
0
Merci
Merci, ca marche très bien a part que ca saute une ligne parfois alors qu'il y à encore la place de mettre le mot suivant
aiko74 22 Messages postés mercredi 16 février 2005Date d'inscription 17 novembre 2005 Dernière intervention - 17 nov. 2005 à 03:24
0
Merci
wow quelle excellente idée que voilà marche super comme celà c'est parfait
Merci boucou
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 18 nov. 2005 à 23:02
0
Merci
il est possible de faire la même chose avec un seul TextBox.

il y a un peu plus de SenKeys.

à l'exécution, c'est pas très spectaculaire, il se passe rien.

et pourtant le résultat est bien dans Text1.Text





Private Sub Command1_Click()

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim Lg As Integer



Me.ScaleMode = 3

Text1.Font = "Courier New"

Text1.FontSize = 8

Me.Font = "Courier New"

Me.FontSize = 8

Lg = Me.TextWidth(String$(Lmax, "A")) + 17 + 4

If Right$(Text1.Text, 2) <> vbCrLf Then Text1.Text = Text1.Text & vbCrLf



Text1.Width = Lg



Lg = Len(Text1.Text)

Text1.SelStart = 0

Text1.SetFocus

j = 0



While j < Lg

i = j + 1

SendKeys ("{DOWN}"): DoEvents

j = Text1.SelStart

SendKeys ("{LEFT}"): DoEvents

k = Text1.SelStart

If j - k = 1 Then

SendKeys ("{END}"): DoEvents

Text1.SelText = vbCrLf

Lg = Lg + 2

Else

SendKeys ("{HOME}{DOWN}"): DoEvents

End If

Wend



End Sub


Daniel

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.