begin process at 2012 02 16 21:56:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Formulaire

 > LIMITER LE NOMBRE DE LIGNES DANS UN TEXTBOX

LIMITER LE NOMBRE DE LIGNES DANS UN TEXTBOX


 Information sur la source

Note :
Aucune note
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 :6 811

Auteur : DuAel

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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.

 Sources de la même categorie

Source avec Zip GEST COTISATION - ASSOCIATION par MOHA555
Source avec Zip HSCROLLBAR POUR L'ARRIÈRE PLAN par 320C
Source avec Zip Source avec une capture Source .NET (Dotnet) METTRE VOTRE FORM VB.NET EN PLEINE ÉCRAN par Gabilach
RECHERCHE DANS UNE LISTE À PARTIR D'UN CHAMP TEXTE par jmeunier
Source avec Zip GESTION DES COMSOMMABLE par gboraud

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CLASSE DE DESSIN (API) PLUS RAPIDE QUE VB par Stephane
Source .NET (Dotnet) LIMITER LA SAISIE À CERTAINS CARACTÈRES/TOUCHES DANS UN TEXT... par hvb
AFFICHER UN FICHIER TEXTE LIGNE PAR LIGNE DANS UNE TEXTBOX par xxonyxxx
TEXTBOX SAVOIR A QUELLE LIGNE ON EST RENDU par max12
RECHERCHER ET SÉLECTIONNER UN TEXTE DANS UNE TEXTBOX par JCLK

Commentaires et avis

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.

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.

++

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.

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.

++

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.

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

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.

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

Limiter nombre de caractéres sur une ligne dans un textbox [ par lokomass ] Bonjour, Je cherche à revenir à la ligne tous les X caractères dans ma textbox afin de ne pas avoir un ascensceur infini vers la droite quand je met textbox vers listview en VB6 [ par FOUNI ] Bonjour les pros Voilà ma question je récupère un texte situé dans le presse papier windows et je le place dans un textbox pour info si l on place Ajout au debut de ligne TextBox ou txt [ par didine13 ] Bonjour, j'ai besoin de vous. je cherche a ajouter le caractere # au debut et a la fin de toutes les lignes d'un textbox ou RichTextBox ou sinon un souci d'affichage de champ dans textbox [ par zapad ] bonsoirj ai un souci dont je ne trouve pas l'issue dans les topicsJ'essaie de remplir une textbox ligne par ligne avec les données d'un tableauJe n ar afficher le contenu datagridView dans textbox c'est on a cliquer sur une ligne de la grille [ par elmeksaoui1 ] Bonjour: je veux savoir comment ,si je clique sur une ligne dans DatagridView ,et il m'affiche le contenu dans les zone de text s il vous plait cé urg lire ligne paire fichier texte pour le faire afficher dans textbox [ par doum2009 ] Bonjour je cherche a faire afficher dans un textbox les lignes paires d'un fichier txt. es ce que quelqu'un peut m'aider svp?mercidoum2009 Limiter nombre de charactere saisie textbox via bouton [ par olobo ] Bonjour!Voila j'ai un petit soucis j'aimerais limiter la saisie dans une TextBox a 4 charatère la commande est donc  TxtBox.MaxLength = 4 Cependant ce Récupérer un partie d'une ligne et la mettre dans une textbox [ par utopiafr ] Bonjour,J'ai une variable LineToCopy qui représente une ligne égale à :1abcd 2abcd 3abcd1abcd peut changer2abcd peut changer3abcd constant Je voudrais rechercher dans un textbox et récupérer le numéro de la ligne [ par dsigmoun ] Bonjour à tous,Comment peut-on rechercher dans un textbox un élément (par exemple "toto") et récupérer le numéro de ligne de l'élément "toto" ?Merci p vba textbox copie valeur dans cellule avec ligne variable [ par dusmy ] Bonjour à tous,Dans un UserForm, j'utilise un TextBox et je voudrais récupérer la valeur que l'on saisie dans le TextBox afin de le copier dans une ce


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 7,628 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales