Compter le nombre de lignes d'un TextArea?

il y a un décalage de 2 lignes je ne sais pas pourquoi et je ne vois pas la solution et surtout la cause…

Faite quelques tests et voyez le comportement bizarre…

Soit c’est moi qui me suis trompé quelque part ou alors c’est un bug ?

ps : merci pour votre aide :wink:

je vous met un projet exemple en lien :

Je ne vois pas de bug dans votre exemple.
Xojo m’indique 6 lignes avec le texte par défaut et une ligne si je remplace le texte par un seul caractère, ce qui est correct.
Vous êtes au courant que le nombre de lignes affichées n’est pas forcément le nombre de retours à la ligne, n’est-ce-pas? (par exemple, si votre fenêtre fait 50 pixels de large, “Ceci est un texte sans retour à la ligne mais long quand même” sera affiché en plusieurs lignes).

Bonjour,

faite le teste :

tapez “test”

en suite validé

validé

validé

tapez un caracter

tapez un caracter

tapez un caracter

et tout cela en surveillant bien le compteur de lignes

Le bug est ailleurs, dans votre code.
TextArea1.text.Length ne compte pas les accents (et autres caractères spéciaux) comme vous le pensez.
Utilisez TextArea1.text.Bytes à la place.

j’ai fait le changement et j’obtient le même résultat…

faite le test vous même avec le projet exemple que j’ai fourni en y apportant la correction…

Je ne vois pas de problème.
Une ligne vide est une ligne.
Si vous ne voulez pas les compter il faut ajouter un test supplémentaire pour les déduire.

En refaisant le test comme tu l’expliques “test” + validé 3x puis des caractères, il y a effectivement un comportement bizarre : Le nombre de ligne augmente quand on tape les caractères alors qu’à ce moment là le nombre de lignes n’augmente pas…

C’est ce que j’ai fait. Le seul décalage que j’obtiens, et, je suis d’accord avec vous sur le fait que c’est un bug, est que le comptage est correct à partir du deuxième caractère d’une ligne. Avec “Bytes”:

“Test de texte
Deuxième ligne
A|”
(| est le curseur)

J’obtiens 2, qui est faux.

“Test de texte
Deuxième ligne
As|”
J’obtiens 3.
Même en ajoutant 1 au paramètre pour LineNumber, je n’obtiens jamais 3 pour le premier exemple.

Mais avec “Length” au lieu de “Bytes”, c’est pire:
“Test de texte
Deuxième ligne
A|”
=2

“Test de texte
Deuxième ligne
As|”
=2

“Test de texte
Deuxième ligne
Asd|”
=3
Chaque accent va décaler le caractère nécessaire pour que le résultat soit correct.

Et le bug est bien répertorié: <https://xojo.com/issue/43874>

ça date de : May 15, 2016 - 4:46am UTC

pas de correction depuis ?

Oh, vous savez, il y a des bugs qui datent de plus longtemps et n’ont toujours pas été résolus… Ce n’est pas rare dans Xojo.

ok, bon j’ai fait un rapport de bug, faut pas déconner 5 ans et toujours pas résolu ce bug ?, c’est surement un oubli…

<https://xojo.com/issue/66874>

Bonne tentative.
Ils vont probablement le fermer en prétextant que c’est un rapport dupliqué :wink:
Rappel: ne vous battez pas contre un moulin à vent :wink:

pour l’instant j’ai signalé deux fois un bug, et les deux tickets ce sont soldé par une correction de bug et mis en fixé et vérifié… la version de Xojo actuel a bien été corrigé… j’espère que ça ce passera de la même manière pour ce bug, car j’ai vraiment besoin que ce soit corrigé… je ne vois pas trop comment je pourrait contourner ce bug vous avez une idée ?

Vous pourriez ajouter 1 au comptage des lignes si la dernière ligne ne contient qu’un seul caractère.
Ceci semble fonctionner, dans mes tests non exhaustifs:

Var Txt As String=TextArea1.Text 'Éviter de répéter le même appel
Var Char As String=Txt.Middle(Txt.Bytes-2,1) 'Avant-dernier caractère

Label5.text = "Nb Ligne(s):" + str(TextArea1.LineNumber(Txt.Bytes) + 1+if(Char=EndOfLine,1,0))

Dites-moi si un cas spécifique ne fonctionne pas.

bon c’est plus logique que la normal… mais c’est dommage qu’il ne compte pas une ligne de plus quand on fait un retour a la fin du texte sans pour autant y taper un caractère…

mais bon merci ça dépanne bien…

juste une chose la ou est placé le “if” ça je ne connaissait pas et d’ailleurs j’arrive pas trop à comprendre comment ça marche, si vous avez le temps une petite explication sera la bienvenue :wink:

Est-ce que votre texte est toujours simple (1 seule police, taille, etc) ou peut-il avoir plusieurs StyleRun ?

je vais opter pour du texte brut, sans style… enfin ce sera du courrier même taille même police, etc

retour a la fin du texte

On peut appeler cela “caractère de fin de ligne”.
Et cela prends tout son sens: il n’y a pas de ligne après ce caractère.

Fin de ligne

évidemment, si vous appelez cela “validé”, ça n’a pas de sens… :grinning:

je fait deux retours, et au troisième il compte une ligne…

sur cette troisième je tape un caractère il compte une ligne de plus

je tape un deuxième caractère il compte encore une ligne de plus

je tape de nouveau un troisième caractère et ce toujours sur la même ligne et là il n’en compte pas une de plus, mais il y a bien le nombre de ligne exacte…

faut bien avoué que c’est un comportement bizarre, non ?