Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LIMITER LE NOMBRE DE LIGNES DANS UN TEXTBOX


Information sur la source

Catégorie :Formulaire Classé sous : limiter, ligne, textbox, selstart, api Niveau : Débutant Date de création : 30/01/2008 Date de mise à jour : 30/01/2008 16:19:58 Vu : 4 840

Note :
Aucune note

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


Description

J'utilise une API pour compter le nombre de lignes.
Il y a plusieurs problématiques :
Si une lettre est ajoutée, le code ne s'execute qu'après l'ajout. Mais on ne peut pas supprimer la dernière lettre du texte car l'utilisateur n'était pas forcément à cette position.
Il faut donc jouer avec SelStart.
 

Source

  • ' Appel à l'API et déclarations
  • 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 Const EM_NOMBRELIGNE = &HBA
  • ' Si l'ajout de texte fait dépasser les 4 lignes, on supprime les caractères en trop.
  • Private Sub Textbox1_Change()
  • If (SendMessageLong(Textbox1.hWnd, EM_NOMBRELIGNE, 0&, 0&) > 4) Then
  • If Textbox1.SelStart > 0 Then
  • Textbox1.SelStart = Textbox1.SelStart - 1
  • Textbox1.SelLength = 1
  • Textbox1.SelText = ""
  • End If
  • End If
  • End Sub
  • ' Si l'utilisateur fait un retour chariot alors qu'il y a 4 lignes, un caractère spécial apparait, ce code l'évite.
  • Private Sub Textbox1_KeyPress(KeyAscii As Integer)
  • If (SendMessageLong(Textbox1.hwnd, EM_NOMBRELIGNE, 0&, 0&) = 4) And (KeyAscii = 10 Or KeyAscii = 13) Then
  • KeyAscii = 0
  • End If
  • End Sub
' Appel à l'API et déclarations
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 Const EM_NOMBRELIGNE = &HBA

' Si l'ajout de texte fait dépasser les 4 lignes, on supprime les caractères en trop.
Private Sub Textbox1_Change()
    If (SendMessageLong(Textbox1.hWnd, EM_NOMBRELIGNE, 0&, 0&) > 4) Then
        If Textbox1.SelStart > 0 Then
            Textbox1.SelStart = Textbox1.SelStart - 1
            Textbox1.SelLength = 1
            Textbox1.SelText = ""
        End If
    End If
End Sub

' Si l'utilisateur fait un retour chariot alors qu'il y a 4 lignes, un caractère spécial apparait, ce code l'évite.
Private Sub Textbox1_KeyPress(KeyAscii As Integer)
    If (SendMessageLong(Textbox1.hwnd, EM_NOMBRELIGNE, 0&, 0&) = 4) And (KeyAscii = 10 Or KeyAscii = 13) Then
        KeyAscii = 0
    End If
End Sub

Historique

30 janvier 2008 16:19:58 :
Ajout d'une sub pour éviter le caractère spécial du retour chariot.

Commentaires et avis

signaler à un administrateur
Commentaire de BruNews le 30/01/2008 15:18:50 administrateur CS

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.

signaler à un administrateur
Commentaire de bouv le 30/01/2008 15:30:29

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.

++

signaler à un administrateur
Commentaire de DuAel le 30/01/2008 16:23:04

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.

signaler à un administrateur
Commentaire de bouv le 30/01/2008 18:06:30

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.

++

signaler à un administrateur
Commentaire de BruNews le 30/01/2008 18:11:30 administrateur CS

'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.

signaler à un administrateur
Commentaire de bouv le 30/01/2008 18:34:44

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

signaler à un administrateur
Commentaire de DuAel le 31/01/2008 00:09:14

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.

signaler à un administrateur
Commentaire de BruNews le 31/01/2008 11:26:52 administrateur CS

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.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Créer des masques [ par Thibault ] A partir d'un fichier texte Ascii disposé précisément de cette manière :**************************************# Ligne de texte 1 <- 1 textB [8D] RETOUR A LA LIGNE DANS UNE TEXTBOX MULTILINE [ par superbilldick ] Comment faire un retour a la ligne dans une textbox multiligne ?j'essayé de faireTxtMachin = "blablablabla" & Chr(13) & "blablablabla"mais au lieu de Transférer une listview dans une textbox HEEEEELP !!!! [ par Phil ] Je craque !! voilà plusieurs jours que je cherche comment ouvrir une listview dans un fichier *.txt, en fait j'ai trouvé un module qui le fait mais ma Lire un TEXTBOX [ par pedro ] Salut à tous.Comment lire dans un TEXTBOX ligne par ligne. J'aimerais que le programme lise chaque ligne et qu'il me le mette dans un tableau.(Tab[i]) lineinput limiter à 697 caractères ?????? [ par L@tex ] Lorsque je veux prendre la première ligne d'un fichier texte dans une variable de type string, la longueur de caractère dans la variable "temp" est se limiter la longueur d'une ligne d'RTF [ par NoNo ] Est-ce que l'api SendMessage par exemple permettrait de donner une longueur maxi pour les lignes d'RTF ?Si oui, comment ?Merci supprimer une ligne précise d'un textbox [ par alfonce ] Salut!Je cherche comment supprimer la ligne 5 d'un textbox multiline. Pourriez vous m'envoyer la commande complète, je ne suis pas vraiment connaissan AU SECOURS !!!!!!!!!!!! Comment insérer un caractèrede saut de ligne dans un textbox [ par PLUTONIUM ] ARGHHHHHHHComment faire en sorte que mon textbox saute un ligne en cliquant sur un bouton par exemple, ou dans une boucle ??Merci d'avance@+ Retour à la ligne dans un textbox [ par eltaris ] J'ai ma textbox avec l'option multiligne à Vrai.Je vais lire des phrases dans un fichier que je recopie dans ma textbox, et quand je rajoutes chr(10) problème de ligne dans un textbox [ par queue ] J'aimerais savoir comment faire pour enlever la dernière ligne d'un textbox si celle-ci est vide.. merci (une demarche complete s'il vous plait je sui


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.