Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Word Wrap

21 réponses
Avatar
Cédric
Bonjour,

J'ai un programme dans lequel j'ai inséré une richtextbox.
Arrivé à la fin d'un ligne, comme je n'ai pas mis de barre horizontale, le
mot revient à la ligne, et c'est ce que je veux.
En revanche si un mot n'est pas fini il est mis entièrement à la ligne. Je
voudrai modifier le word wrap pour que le mot se coupe automatiquement et
que uniquement l'autre moitié revienne à la ligne.

Aidez moi svp !!!!! Merci beaucoup

10 réponses

1 2 3
Avatar
Cédric
> Option Explicit

Private Sub Text1_Change()

'text1 doit avoir une font à largeur fixe
'multiligne = true

Dim i As Integer, tblLignes() As String, sText As String
Dim sOut As String, lNbLargeurChar As Long

'Dim lPos As Long
'lPos = Text1.SelStart

Set Me.Font = Text1.Font
sText = Text1.Text
sText = Replace(sText, "-" & vbCrLf, "", , , vbTextCompare)
sText = Replace(sText, vbCrLf, " ", , , vbTextCompare)

'attention aux scrollbars, test réalisé sans
'il faudra faire des ajustement en conséquence
'de plus si le textbox à une taille fixe, cette
'valeur pourra être fixée définitivement, elle
'représente le nombre de caractère sur une ligne
'lNbLargeurChar = 51
lNbLargeurChar = Text1.Width / Me.TextWidth(" ") - 1

For i = 1 To Len(sText) Step lNbLargeurChar - 1
If i + lNbLargeurChar - 1 >= Len(sText) Then
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1)
Else
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1) & "-" & vbCrLf
End If
Next

Text1.Text = sOut

'Text1.SelStart = lPos

sOut = "": sText = ""
End Sub



J'ai essayé, mais le problème c'est que le texte s'écrit à l'envers, exemple
je tape azerty, il s'écrit ytreza ;-)
De plus, ça ne coupe toujours pas. Par contre le tiret se met correctement
Avatar
Cédric
J'avais une idée, c'était de stocker tout le texte entré dans une chaine, et
de la découper à chaque instant en paquet de 40 en prenant les 40 premiers
caractères à gauche à chaque fois. Mais à mon avis c'est vite limité en
taille, non? Et puis il doit y avoir beaucoup mieux je pense
Avatar
ng
Salut,

J'ai essayé, mais le problème c'est que le texte s'écrit à l'envers,
exemple je tape azerty, il s'écrit ytreza ;-)



C'est parce que le SelStart se remet à 0 à chauqe changement, décommente les
lignes le concernant.

De plus, ça ne coupe toujours pas. Par contre le tiret se met
correctement



Si ! ??

J'ai ceci par exemple :

salut ceci e-
st un test d-
e découpage !

ca semble fo-
nctionner co-
rrectement n-
on ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Cédric a écrit :

Option Explicit

Private Sub Text1_Change()

'text1 doit avoir une font à largeur fixe
'multiligne = true

Dim i As Integer, tblLignes() As String, sText As String
Dim sOut As String, lNbLargeurChar As Long

'Dim lPos As Long
'lPos = Text1.SelStart

Set Me.Font = Text1.Font
sText = Text1.Text
sText = Replace(sText, "-" & vbCrLf, "", , , vbTextCompare)
sText = Replace(sText, vbCrLf, " ", , , vbTextCompare)

'attention aux scrollbars, test réalisé sans
'il faudra faire des ajustement en conséquence
'de plus si le textbox à une taille fixe, cette
'valeur pourra être fixée définitivement, elle
'représente le nombre de caractère sur une ligne
'lNbLargeurChar = 51
lNbLargeurChar = Text1.Width / Me.TextWidth(" ") - 1

For i = 1 To Len(sText) Step lNbLargeurChar - 1
If i + lNbLargeurChar - 1 >= Len(sText) Then
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1)
Else
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1) & "-" &
vbCrLf End If
Next

Text1.Text = sOut

'Text1.SelStart = lPos

sOut = "": sText = ""
End Sub



J'ai essayé, mais le problème c'est que le texte s'écrit à l'envers,
exemple je tape azerty, il s'écrit ytreza ;-)
De plus, ça ne coupe toujours pas. Par contre le tiret se met
correctement


Avatar
Cédric
Oui merci, avec ca, la première ligne est parfaite, mais ça marche plus à
partir de la deuxième: ca se remet à écrire à l'envers, de plus le tiret est
présent un carctère sur 2. Il doit y avoir un problème dans le compteur

Je vous met le code:

Option Explicit

Private Sub Text1_Change()

Dim i As Integer, tblLignes() As String, sText As String
Dim sOut As String, lNbLargeurChar As Long

Dim lPos As Long
lPos = Text1.SelStart

Set Me.Font = Text1.Font
sText = Text1.Text
sText = Replace(sText, "-" & vbCrLf, "", , , vbTextCompare)
sText = Replace(sText, vbCrLf, " ", , , vbTextCompare)

lNbLargeurChar = 10

For i = 1 To Len(sText) Step lNbLargeurChar - 1
If i + lNbLargeurChar - 1 >= Len(sText) Then
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1)
Else
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1) & "-" & vbCrLf
End If
Next

Text1.Text = sOut

Text1.SelStart = lPos

sOut = "": sText = ""
End Sub
Avatar
ng
As-tu correctement configuré ton textbox ?

Ca marche très bien chez moi!

Sinon quant est-il de la solution de francois ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Cédric a écrit :

Oui merci, avec ca, la première ligne est parfaite, mais ça marche
plus à partir de la deuxième: ca se remet à écrire à l'envers, de
plus le tiret est présent un carctère sur 2. Il doit y avoir un
problème dans le compteur

Je vous met le code:

Option Explicit

Private Sub Text1_Change()

Dim i As Integer, tblLignes() As String, sText As String
Dim sOut As String, lNbLargeurChar As Long

Dim lPos As Long
lPos = Text1.SelStart

Set Me.Font = Text1.Font
sText = Text1.Text
sText = Replace(sText, "-" & vbCrLf, "", , , vbTextCompare)
sText = Replace(sText, vbCrLf, " ", , , vbTextCompare)

lNbLargeurChar = 10

For i = 1 To Len(sText) Step lNbLargeurChar - 1
If i + lNbLargeurChar - 1 >= Len(sText) Then
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1)
Else
sOut = sOut & Mid$(sText, i, lNbLargeurChar - 1) & "-" &
vbCrLf End If
Next

Text1.Text = sOut

Text1.SelStart = lPos

sOut = "": sText = ""
End Sub


Avatar
Cédric
> As-tu correctement configuré ton textbox ?


Jusqu'à présent j'avais essayé avec une richtextbox. Avec une textbox, il y
a moins de problème, cela marche et sur plusieurs lignes, mais quand je
tape, du texte se rajoute progressivement à droite de mon curseur. Quant à
la confiuration, je pense que c'est bon, cad configuration de défaut +
multine=true + police a empatement fixe

Ca marche très bien chez moi!


snif ;-)

Sinon quant est-il de la solution de francois ?


J'ai fait exactement comment écrit, il n'y a aucun probleme à la
compilation, mais ca ne marche pas. Je ne comprend pas du tout le code de
Francois, peut être qu'il faut indiquer quelque part l'endroit où je veux
couper.


Pourriez vous me commenter vos sources? je pourrai peut etre plus réflechir
avant de vous reposer des questions
Avatar
François Picalausa
Hello,

Attention tout d'abord que cette source ne fonctione que sous NT4+/95+
Attention aussi que j'ai fait une erreur dans la source:
le nom du contrôle n'est pas richtext1 mais bien RichTextBox1
(Vu que mes Options Explicit ont sauté, il n'y a pas d'erreur générée)

Donc, commençons par le début:
Option Explicit

'WM_USER: message privés pour l'utilisation avec des classes de fenêtres
privées.
Private Const WM_USER As Long = &H400
'Généralement WM_USER est utilisé sous la forme WM_USER + X où X est une
valeur entière
'Cette déclaration a été récupérée dans Richedit.h
Private Const EM_SETWORDBREAKPROCEX As Long = WM_USER + 81

'Un SendMessage classique, si ce n'est que le dernier
'paramètre a été redéfinit comme byval as long pour passer une adresse de
procédure
Private Declare Function SendMessage _
Lib "user32" _
Alias "SendMessageA" _
( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long _
) _
As Long

Private Sub Form_Load()
'On envoie un message EM_SETWORDBREAKPROCEX au richtextbox
'Avec l'adresse de la procédure de découpage, procédure qui doit
absolument se trouver
'dans un module standard, à cause de l'opérateur AddressOf
SendMessage RichTextBox1.hwnd, _
EM_SETWORDBREAKPROCEX, _
0, _
AddressOf EditWordBreakProcEx
End Sub

'Dans un module standard:
Option Explicit

Function EditWordBreakProcEx( _
ByVal pchText As Long, _
ByVal cchText As Long, _
ByVal bCharSet As Byte, _
ByVal code As Long _
) _
As Long

'Attention: on est sencé tenir compte de la valeur de code:
'WB_CLASSIFY : Returns the character class and word-break
' flags of the character at the specified
position.
'WB_ISDELIMITER : Returns TRUE if the character at
' the specified position is a
delimiter
' or FALSE if the character is not.
'All other values : Returns the character index of the word break.

'=> ici, on fait comme si on était dans le cas All other values : on
spécifie
' de couper à la position actuelle (0)

EditWordBreakProcEx = 0 'coupez!

End Function

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Cédric" a écrit dans le message de
news:40779a3c$0$17499$
Sinon quant est-il de la solution de francois ?


J'ai fait exactement comment écrit, il n'y a aucun probleme à la
compilation, mais ca ne marche pas. Je ne comprend pas du tout le
code de Francois, peut être qu'il faut indiquer quelque part
l'endroit où je veux couper.


Pourriez vous me commenter vos sources? je pourrai peut etre plus
réflechir avant de vous reposer des questions


Avatar
Cédric
Merci 1000 fois, je vais travailler tout ca

Attention tout d'abord que cette source ne fonctione que sous NT4+/95+


Je suis sous XP, y a t-il quelque chose à changer?
Avatar
Cédric
Merci pour les commentaires, en plus, maintenant ça marche parfaitement! A
bientot
Avatar
François Picalausa
Hello

XP c'est NT5.1
C'est supérieur à NT4, donc c'est OK :-)

--
François Picalausa (MVP VB)
http://faq.vb.free.fr --- http://msdn.microsoft.com
http://apisvb.europe.webmatrixhosting.net

"Cédric" a écrit dans le message de
news:4077a3ae$0$500$
Merci 1000 fois, je vais travailler tout ca

Attention tout d'abord que cette source ne fonctione que sous
NT4+/95+


Je suis sous XP, y a t-il quelque chose à changer?


1 2 3