Rechercher un texte dans un doc Write Pro

Bonjour.

Dans un objet Write Pro, je voudrais rechercher un texte ou une variable et la mettre en rouge avant de l’imprimer.
Je ne trouve pas comment faire pour rechercher le texte par exemple “toto” ou une variable “MaVariable”.

Pour le mettre en rouge je pense que
“WP FIXER ATTRIBUTS($Objet_Cible;wk text color;$Couleur_RVB)”
devrait faire l’affaire.

Merci par avance de vos idées

C_TEXT($text)
C_OBJECT($range;$link)
C_LONGINT($i;$n;$p)

$text:=WP Get text(WParea1;wk expressions as value)

$p:=0
Repeat 
	$p:=Position(Form.target;$text;$p+1)
	If ($p>0)
		$range:=WP Text range(WParea1;$p;$p+Length(Form.target))
		$link:=New object("url";Form.url)
		WP SET LINK($range;$link)
		
		WP SET ATTRIBUTES($range;wk text color;"#0040A0")
		WP SET ATTRIBUTES($range;wk font bold;wk true)
		
	End if 
Until ($p<=0)

Vous pouvez télécharger l’exemple sur:

https://blog.4d.com/links-in-4d-write-pro-documents/

Bonjour et merci beaucoup pour ton aide.

Cela fonctionne mais cela met en rouge une zone qui n’est pas la bonne.
Je n’ai pas utilisé le

		$link:=New object("url";Form.url)
		WP SET LINK($range;$link)

car cela plante sur le WP SET LINK et que je vois pas trop l’intérêt de transformer mon texte en lien.

ci-dessous mon code :

$Texte_Doc_Write:=WP Lire texte($Doc_Write_Pro;wk expressions as source)
$Pos:=0
Repeter 			        $Pos:=Position($Text_à_modifier;$Texte_Doc_Write;$Pos+1)
   Si ($Pos>0)
   	$Plage_Texte:=WP Plage texte($Doc_Write_Pro;$Pos;$Pos+Longueur($Text_à_modifier))
   			  //$link:=Créer objet("url";Form.url)
   			  //WP FIXER LIEN($Plage_Texte;$link)
   			WP FIXER ATTRIBUTS($Plage_Texte;wk text color;<>C_Couleur_RVB_Rouge)
   			WP FIXER ATTRIBUTS($Plage_Texte;wk font bold;wk true)
   		Fin de si 
   	Jusque ($Pos<=0)
   Fin de boucle 

J’ai essayé avec “wk expressions as source” et le nom des variables
et également avec “wk expressions as value” et le texte de mes variables
et j’ai le même problème il me met en rouge une zone qui ne correspond pas.

Si tu as une idée elle sera la bienvenue.

Bonne fin de WE.

C_TEXT($text)
C_OBJECT($range;$link)
C_LONGINT($i;$n;$p)

$text:=WP Get text(WParea1;wk expressions as value)

C_TEXT($Variable)

$Variable:="4D"

$p:=Position($Variable;$text;1)

$range:=WP Text range(WParea1;$p;$p+Length($Variable))

WP SET ATTRIBUTES($range;wk text color;"#f20b0b")
WP SET ATTRIBUTES($range;wk font bold;wk true)

Position

Pour modifier ce fonctionnement, passez l’astérisque * en dernier paramètre. Dans ce cas, les comparaisons sont effectuées sur la base des codes des caractères. Vous devez donc passer le paramètre * :

  • si vous souhaitez tenir compte des caractères spéciaux, utilisés par exemple comme délimiteurs ( Caractere (1)…),
  • si l’évaluation des caractères doit tenir compte de la casse et des accents (a#A, a#à…).
    A noter que dans ce mode, l’évaluation ne gère pas les variations d’écriture des mots.

https://doc.4d.com/4Dv18R2/4D/18-R2/Position.301-4803573.fr.html

Bonsoir, suite de mes recherches :

Si je fait un doc avec
image
et que modifie bbb et ddd en rouge cela fonctionne :
image
Maintenant si je met une variable vTest
image
et que je fait la même modification en mettant bbb dans vTest j’obtient cela
image

Cela sent le Bug, mais il faut peut-être rechercher de manière différente quand il y a des expressions dans le doc Write ?

Si vous avez une idée, elle sera la bienvenue, sinon j’appelle 4D demain pour voir.

En tout cas merci pour votre aide.

C_TEXT($Variable)

$Variable:=VTest

$p:=Position($Variable;$text;1)

Bonjour

le problème vient du fait que les expressions ne doivent être renvoyées NI comme valeurs NI comme références mais comme “espace”.

D’une manière générale une expression est considérée comme un seul caractère. De cette façon les indices seront conservés et il n’y aura plus de décalages.

Dans ce cas particulier, c’est l’expression évaluée que vous devez mettre en rouge. Je n’ai pas testé ce cas, mais créez un range d’un seul caractère et ça devrait fonctionner.

Si vous avez de multiples occurences à remplacer, je vous conseille de commencer par la FIN du texte pour les mêmes raisons… en effet si vous remplacer un mot par un autre qui est soit plus court soit plus long, vous aurez à nouveau des décalages, mais liés à un pb d’algo cette fois. En commençant par la fin, vous n’aurez pas de soucis.

Roland Lannuzel

(re)bonjour Christian.

La façon la plus simple c’est de chercher les formules…

voici un exemple simple pour mettre toutes les formules en rouge

$_formulas:= WP Get formulas ([docs]wp)
For each ($formula;$_formulas)
WP SET ATTRIBUTES ($formula.range;wk text color;"red")
End for each

Voici un autre exemple ou on met du rouge si c’est une date passée ou un nombre négatif (sinon en vert), et du bleu si c’est du texte…

$_formulas:=WP Get formulas([docs]wp)
For each ($formula;$_formulas)
	$variant:=$formula.formula.call()
	$type:=Value type($variant)
	Case of 
		: ($type=Is date)
			If ($variant<Current date)
				WP SET ATTRIBUTES($formula.range;wk text color;"red")
			Else 
				WP SET ATTRIBUTES($formula.range;wk text color;"green")
			End if 
		: ($type=Is real)
			If ($variant<0)
				WP SET ATTRIBUTES($formula.range;wk text color;"red")
			Else 
				WP SET ATTRIBUTES($formula.range;wk text color;"green")
			End if 
		: ($type=Is text)
			WP SET ATTRIBUTES($formula.range;wk text color;"blue")
	End case 
End for each

En espérant que ça puisse vous aider et vous inspirer…

Cordialement

Roland Lannuzel

1 Like

Bonsoir Roland et un grand merci pour ta réponse.

Alors effectivement cela fonctionne mais, car il y a un mais cela ne fonctionne qu’avec une 18R2 !
Donc pas en production malheureusement.

J’ai attendu 4 ans pour passer de ma V15 à la V18 à cause justement de Write Pro, mais j’aurais du attendre encore un peu :joy:

Bon, je vais essayer de le faire en prenant les caractère un par un tant pis.

Bonne soirée.

Bonjour,

je comprends…

Avec les versions plus anciennes, vous pouvez utiliser la commande “ST Get expression” en bouclant caractère par caractère (ca va très vite) et en relevant les indices des “caractères” qui sont des expressions dans un tableau.

Ce tableau pourra vous servir pour créer des ranges (plages) correspondants aux expressions pour les mettre en couleur.

Roland Lannuzel