Longuer de lignes

3edbill69 Messages postés 12 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 26 septembre 2006 - 19 juin 2005 à 02:15
3edbill69 Messages postés 12 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 26 septembre 2006 - 20 juin 2005 à 21:44
Bonjour,



J'essaie de faire un prog qui me permettrait de formatter un texte en lui donnant une longueur de ligne limite.



J'ai fait quelques recherches pour trouver les différents paramètres
nécessaires pour connaître la longueur des lignes et leur manipulation
mais je n'arrive pas a poursuivre mon projet car a un moment donné sa
crash sans prevenir : quand je passe a ligne suivante.



Pour la premiere ligne je peux arriver a couper la ligne pour qu'elle
soit d'une longueur de 84 caractères ou plus mais le moment venu de
compter la longueur de la deuxième ligne vb gèle et me previens que je
vais perdre toutes mes données et je dois le fermer sans sauvegarde.



Voici le code pour une ligne (qui marche):



Private Const EM_LINEINDEX = &HBB

Private Const EM_GETLINE = &HC4

Private Declare Function SendMessageLong Lib "user32" Alias
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As
Long, ByVal lParam As Long) As Long

Private Sub cmd1_Click()

Dim lngNbLignes As Long, i As Long, k As Long

Dim lngIndexCar As Long, intLongueur As Integer

Dim strLigne As String



'nombre de lignes

lngNbLignes = SendMessageLong(rtbun.hwnd, EM_GETLINECOUNT, 0, 0)

k = 1

lngIndexCar = SendMessageLong(rtbun.hwnd, k - 1, 0, 0)

intLongueur = SendMessageLong(rtbun.hwnd, EM_LINELENGTH, lngIndexCar, 0)

If intLongueur > 84 Then

For i = intLongueur To 0 Step -1

If Mid(rtbun.Text, i, 1) = Chr(32) Then

rtbun.SelStart = i

rtbun.SelText = vbCrLf


rtbun.SelStart = SendMessageLong(rtbun.hwnd, EM_LINEINDEX, k + 1, 0)

rtbun.SetFocus

SendKeys Chr(3)

SendKeys Chr(8)

SendKeys Chr(32)

Exit For

End If

Next i

End If
End Sub



Maintenant ce que je pensais faire pour un nombre variable de lignes (qui crash):



For k = 1 To lngNbLignes - 1

lngIndexCar = SendMessageLong(rtbun.hwnd, k - 1, 0, 0)

intLongueur = SendMessageLong(rtbun.hwnd, EM_LINELENGTH, lngIndexCar, 0)

If intLongueur > 84 Then

For i = intLongueur To 0 Step -1

If Mid(rtbun.Text, i, 1) = Chr(32) Then

rtbun.SelStart = i

rtbun.SelText = vbCrLf


rtbun.SelStart = SendMessageLong(rtbun.hwnd, EM_LINEINDEX, k + 1, 0)

rtbun.SetFocus

SendKeys Chr(3)

SendKeys Chr(8)

SendKeys Chr(32)

Exit For

End If

Next i

End If

Next k



Si vous connaissez la réponse merci de bien vouloir me la communiquez.


One step away from ...

7 réponses

cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
19 juin 2005 à 03:07
Si j,ai bien compris, c'est ça que tu veux. Désoler je l'ai coder ici, donc s,il y a un petit bug, genre une paranthèse qui manque, c'est normal

public function couper(texte as string, longueur as integer) as string()
redim couper(int(len(texte)/longueur) + iif(len(texte) mod longueur = 0,0,1)))
for i as integer = 0 to ubound(couper) - 1
couper(i) = mid(i * longueur,longueur)
next i
couper(ubound(couper)) = mid(ubound(couper) * longueur))
end function


-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------
0
3edbill69 Messages postés 12 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 26 septembre 2006
19 juin 2005 à 08:25
ok, j'ai pas encore testé ça parce que je veux prendre le temps de tout piger:

ce que tu me propose, c'est de mettre chaque ligne coupée dans un tableau de chaîne de caractères n'est-ce pas?



Si oui, alors non, ce n'est pas ce que je veux car un texte peut
commencer par un simple titre de moins de x caractères voulus, ce qui
veux dire que je dois absolument conserver le texte dans le rtbox ou
txtbox, que je ne peux pas tout simplement calculer x caractères.



A quoi sert ubound içi (je ne connais pas cette fonction)?



ps:en fait mon problem c'est que vb semble être incapable de calculer
la longueur des lignes 2,3.... lorsque j'ai déjà modifié la première.


One step away from ...
0
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
19 juin 2005 à 16:45
ubound sert a savoir la grandeur du tableau

bon 2e essai

public function compteurLigne(texte) as integer
return ubound(split(texte,vbcr)) + 1
end function


-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------
0
3edbill69 Messages postés 12 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 26 septembre 2006
20 juin 2005 à 05:19
Ok, en supposant qu'il faille utiliser ABOSULEMENT UN TABLEAU, peut
juste me dire ce que je devrais faire avec return
ubound(split(texte,vbcr)) +1 ?

Surement que tu en connais beaucoup plus sur le rayon car moi la je ne vois pas ou tu veux en venir.



Desolez de te faire perdre tant de temps.

Si tu pouvais jeter un coup d'oeil au projet
Entre le texte :



Hhghfodhgidlfhiiofd;hogu9pdfihub90gfyjhiftughjikfjiouhikflu9gjyhpogubdkhigyidogk djpg

Hhghfodhgidlfhiiofd;hogu9pdfihub90gfyjhiftughjikfjiouhikflu9gjyhpogubdkhigyidogkdjpg



et clique sur le bouton: tu verras le resultat recherché.

Un ben je voudrais juste savoir si il y a un moyen de repeter cette procédure sans provoquer un arrêt du programme.



Merci d'avoir pris le temps de lire ce message.
One step away from ...
0

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

Posez votre question
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
20 juin 2005 à 06:10
le split permet de convertir un chaine de caractère en tableau dépendant un certain caractères. ce cas ci, le vbcr ou vbcrlf qui est le saut de ligne


une fois le tableau tu regarde le nombre de ligne et tu ajoute 1, puisqu'un tableau débute à 0 et tu veux avoir ligne 1


puis tu retourne le résultat


-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
20 juin 2005 à 18:11
c'est ce message qui fait planter:

<strike> lngIndexCar = SendMessageLong(rtbun.hwnd, k - 1, 0, 0)

</strike>lngIndexCar = SendMessageLong(Rtbun.hwnd, EM_LINEINDEX, k, 0)


d'autre part comme le nombre de lignes change, il faut commencer par la fin:

For k = lngNbLignes - 1 To 0 Step -1



et le nombre à parcourir sur une ligne n'est pas bon:

For i = (lngIndexCar + intLongueur) To (lngIndexCar + 1) Step -1


Daniel
0
3edbill69 Messages postés 12 Date d'inscription lundi 16 août 2004 Statut Membre Dernière intervention 26 septembre 2006
20 juin 2005 à 21:44
Merci j'étais sur que ce ne devais qu'une bourde conne de ma part.

Après quelque modif ça a marché.



Merci de votre aide.

One step away from ...
0
Rejoignez-nous