LIMITER LE NOMBRE DE LIGNES DANS UN TEXTBOX

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 30 janv. 2008 à 15:18
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 31 janv. 2008 à 11:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45562-limiter-le-nombre-de-lignes-dans-un-textbox

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 janv. 2008 à 11:26
En résumé, cette source est donc inutilisable dans un prog à distribuer. Il faut toujours tester ses codes avant de les publier en n'oubliant jamais qu'avec l'utilisateur le pire est toujours certain.

Ceci reste malgré tout faisable mais pas en modifiant la sélection ni toute autre méthode qui provoque en event EN_CHANGE.
Par WM_SETTEXT est une possibilité, Modifier le texte direct dans le buffer du textbox (EM_GETHANDLE) en est une autre.
DuAel Messages postés 2 Date d'inscription mardi 29 janvier 2002 Statut Membre Dernière intervention 31 janvier 2008
31 janv. 2008 à 00:09
Il n'y a pas forcément 4 retours chariots, c'est ailleurs pour ça que je fais appel à l'API. Pense au wordwarp, la textbox fait des retours à la ligne automatiques.

D'autre part je ne supprime pas ce qui dépasse la 4ème ligne, mais je supprime tous les caractères en trop de la dernière frappe de l'utilisateur. Ce qui fait que si tu insères du texte au milieu du texte déjà existant, et que ça te fait dépasser 4 lignes, ce sont tes derniers caractères insérés qui seront supprimés, et non pas la fin du texte.

Brunews, tu as raison, texte trop grand + récursion = dépassement de pile. Note que pour un "petit" copié collé ou pour une frappe classique, il n'y a pas ce problème.
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
30 janv. 2008 à 18:34
Par ailleurs, je trouve un peu dommage de supprimer purement et simplement tout ce qui depasse la 4eme ligne.

Pourquoi ne pas supprimer que les retour chariots en trop.

Voici une suggestion qui corrige également le problème d'espace pile :

Private Sub Textbox1_Change()
Dim i As Integer
Dim i2 As Integer
If (SendMessageLong(Textbox1.hWnd, EM_NOMBRELIGNE, 0&, 0&) > 4) Then
'On passe les 4 premiers retour chariots
For i = 1 To 3
i2 = InStr(i2 + 1, Textbox1.Text, vbCrLf)
Next i
If i2 > 0 Then
'On remplace les retours chariots suivants par un caractere au choix
'Ici vbNullString pour supprimer sans remplacer
Textbox1.Text = Left(Textbox1.Text, i2) & Replace(Mid(Textbox1.Text, i2 + 1), vbCrLf, vbNullString)
End If
End If
End Sub
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2008 à 18:11
'Espace de pile doit venir du fait que le code est réentrant (récursion infinie.
Surement du au Text1_Change() qui se rappelle en boucle.
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
30 janv. 2008 à 18:06
Désolé d'insister mais il y a bien un problème avec le COPIER/COLLER avec en prime une erreur 'Espace de pile insuffisant' lorsque le text collé est trop long. Une dixaine de ligne suffit. Test simplement avec le code ci-dessus.

Sinon pour la simplification de Textbox1_KeyPress, bien vu, je sais pas pourquoi je me suis pris la tête avec une variable supplementaire.

++
DuAel Messages postés 2 Date d'inscription mardi 29 janvier 2002 Statut Membre Dernière intervention 31 janvier 2008
30 janv. 2008 à 16:23
Pas de problème avec le copié/collé, les tests se font de manière récursive.

J'ai rajouté une sub pour le problème que tu as mentionné bouv.

Brunews, le Wordwrap est actif de toute façon sur une textbox en VB6. Et oui effectivement, EM_GETLINECOUNT varie en fonction de la taille de la textbox, comme de la police de caractère d'ailleurs.
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
30 janv. 2008 à 15:30
2 petits problèmes :
1°- Le retour à la ligne est remplacé par un caractère spécial.
2°- On peut passer outre cette limitation avec un simple COPIER/COLLER

Le premier problème peut être résolu ainsi :

Dim bReturn As Boolean

Private Sub Text1_Change()
If (SendMessageLong(Text1.hWnd, EM_NOMBRELIGNE, 0&, 0&) = 4) Then
bReturn = True
Else
bReturn = False
End If
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
If bReturn And (KeyAscii 10 Or KeyAscii 13) Then
KeyAscii = 0
End If
End Sub

Pour le deuxième problème c'est un peu plus complexe, il faut sous-classer le controle, récupérer l'evenement COLLER et supprimer à la volée tous les retours à la ligne en trop.

++
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2008 à 15:18
Tu as essayé avec le wordwrap actif sur le textbox ?
Si c'est le cas, le retour de EM_GETLINECOUNT varie selon qu'on redimensionne le textbox (sa fenêtre mère).
Point crucial qu'il convient d'indiquer.
Rejoignez-nous