Page 1 sur 1

Formater une phrase en plusieurs lignes

Posté : ven. 02 mars 2018 18:29
par walkson
Bonjour,
Je souhaite formater une phrase qui est d'une ligne (pas de retour de chariot) en plusieurs lignes pour pouvoir la lire dans un Tooltip()
J'ai essayé plusieurs méthodes dont la moins pire est celle-ci
#include <Array.au3>
$a = "Monsieur Louis DUPONT a souhaité que lui soit transféré sur son compte titres, la quote-part lui revenant dans les titres ; il lui a été transféré à ce titre pour une valeur de 4501,32€"

$regex = "([^" & Chr(32) & "]{1,50})+"
$rep = StringRegExp($a,$regex,3)
_ArrayDisplay($rep)
Local $convert, $y = 1
For $i = 0 To UBound($rep) - 1
   $convert &= $rep[$i] & " "
   If $y = 8 Then
      $convert = $convert  & @CRLF
      $y = 0
   EndIf
   $y += 1
Next
ToolTip($convert,150,400,"info",0,2)
MsgBox(0,"",$convert)
Dans le cas présent, il y a une ligne tous les 8 mots
Je pense qu'il y a moyen de faire plus simple mais je ne trouve pas :(
Merci de votre aide

Re: Formater une phrase en plusieurs lignes  

Posté : ven. 02 mars 2018 19:09
par orax

Code : Tout sélectionner

$a = "Monsieur Louis DUPONT a souhaité que lui soit transféré sur son compte titres, la quote-part lui revenant dans les titres ; il lui a été transféré à ce titre pour une valeur de 4501,32€"
$convert = _wrapByRegex(50, $a)
ToolTip($convert, 150, 400, "info", 0, 2)
MsgBox(0, "", $convert)

Func _wrapByRegex($n, $s)
	Return StringRegExpReplace($s, "(.{1," & $n & "})(\s|$)", "\1" & @CRLF)
	
	; ou comme ci-dessous pour garder l'espace avant le retour à la ligne
	;Return StringRegExpReplace($s, "(.{1," & $n & "})(\s|$)", "\1\2" & @CRLF)
EndFunc   ;==>_wrapByRegex
J'ai simplement copié un des codes en Javascript sur https://rosettacode.org/wiki/Word_wrap#Simple_regex

Re: Formater une phrase en plusieurs lignes

Posté : sam. 03 mars 2018 09:28
par mdanielm
@orax
C'est une solution rudimentaire qui brille par sa simplicité mais comme tu peux voir ci dessous, il faudrait mesurer les caractères.
Etudie le code suivant:
$a = "Monsieur Louis DUPONT a souhaité que lui soit transféré sur son compte titres, la quote-part lui revenant dans les titres; il lui a été transféré à ce titre pour une valeur de 4501,32€"
$convert = _wrapByRegex(60, $a)  ; J'ai mis 60 au lieu de 50
ToolTip($convert, 150, 400, "info", 0, 2)

;$convert = _wrapByRegex(60, $a)
$b = "Monsieur Louis DUPONT a souhaité que lui soit transféré sur" & @crlf & _
     "son compte titres, la quote-part lui revenant dans les titres;" & @crlf & _
    "il lui a été transféré à ce titre pour une valeur de 4501,32€"

MsgBox(0, "", $b)

Func _wrapByRegex($n, $s)
   Return StringRegExpReplace($s, "(.{1," & $n & "})(\s|$)", "\1" & @CRLF)

   ; ou comme ci-dessous pour garder l'espace avant le retour à la ligne
   ;Return StringRegExpReplace($s, "(.{1," & $n & "})(\s|$)", "\1\2" & @CRLF)
EndFunc   ;==>_wrapByRegex

Re: Formater une phrase en plusieurs lignes

Posté : sam. 03 mars 2018 13:37
par walkson
Bonjour,
Merci pour vos réponses
C'est une solution rudimentaire qui brille par sa simplicité
et c'est bien ce qu'il me plait :mrgreen:
Ce texte sera toujours court car il est un résumé du contenu d'un fichier. Il apparait au passage de la souris sur une listview avec d'autres infos
J'avais d'autres possibilités comme _StringSize() de Melba23 ou plus simplement
Global $Edit1 = GUICtrlCreateEdit("", 0, 0, 176, 100,BitOR($ES_MULTILINE,$WS_VSCROLL,$ES_READONLY))
GUICtrlSetData(-1, $a)
avec une GUI en $WS_POPUP (valable pour un texte long) mais je perdais en souplesse par rapport à un Tooltip()
La proposition d'Orax me convient parfaitement

Re: Formater une phrase en plusieurs lignes

Posté : sam. 03 mars 2018 19:59
par orax
mdanielm a écrit : sam. 03 mars 2018 09:28[...] il faudrait mesurer les caractères.
La largeur qu'occupe chaque caractère (la chasse) ? Le résultat me semble pourtant correct.

Code : Tout sélectionner

Monsieur Louis DUPONT a souhaité que lui soit transféré sur
son compte titres, la quote-part lui revenant dans les titres;
il lui a été transféré à ce titre pour une valeur de 4501,32€
Dans le texte suivant, la largeur d'une ligne fait, au maximum, 60 caractères.

Code : Tout sélectionner

Monsieur Louis DUPONT a souhaité que lui soit transféré sur
son compte titres, la quote-part lui revenant dans les
titres;
il lui a été transféré à ce titre pour une valeur de
4501,32€
J'admets que l'aspect n'est pas esthétique, mais c'est le résultat que j'attends.
Il y a quand même un problème avec l'expression régulière. Le code suivant n'affiche pas le résultat attendu, il y a deux retour à la ligne au lieu d'un seul. :?

Code : Tout sélectionner

$b = "Monsieur Louis DUPONT a souhaité que lui soit transféré sur" & @CRLF & _
		"son compte titres, la quote-part lui revenant dans les titres;" & @CRLF & _
		"il lui a été transféré à ce titre pour une valeur de 4501,32€"
$convert = _wrapByRegex(60, $b)
MsgBox(0, "", $convert)
Func _wrapByRegex($n, $s)
	Return StringRegExpReplace($s, "(.{1," & $n & "})(\s|$)", "\1" & @CRLF)
EndFunc   ;==>_wrapByRegex

Re: Formater une phrase en plusieurs lignes

Posté : sam. 03 mars 2018 23:19
par mikell
@orax
"(.{1," & $n & "})(\s+|$)"

Re: Formater une phrase en plusieurs lignes

Posté : dim. 04 mars 2018 00:09
par orax
Bien vu ! :mrgreen: