4D Write Pro et les images

Bonjour,

Petites réflexions sur la gestion des images par référence dans 4D Write Pro avec 4D v17.3.

  • Pour mettre une Image libre dans la page il faut commencer par insérer une expression puis Clic Droit Images…/Layer/Devant le texte ou Derrière le Texte et la OH !!! miracle l’image est libre (c’est d’une simplicité !).
    Une fois cette image libre dans la page il est impossible de l’aligner correctement et précisément vu que la palette ne renvoie aucune information de coordonnées ni les milliers de menus du Clic Droit.
    Impossible d’afficher ou de modifier sa référence. La référence a été transformée en image… C’est une blague…
    Nous avons des planches photos dans nos courriers, on va donc dire à nos clients de réaliser l’alignement des photos à l’œil et sans aucun repère… et en plus la référence étant transformée en image, le courrier pèsera un âne mort.

Bref c’est une vraie régression par rapport à l’ancêtre.

Bienvenue dans le futur

Pascal Aubert

Bonjour Pascal…

Vous trouverez en P.J. une base permettant de régler (via un dialogue) tous les attributs des images ancrées.

Le nombre d’attributs modifiables pour les images ancrées est assez important, libre à vous de la modifier pour ne garder que les paramètres que vous souhaitez régler et modifier.

(au passage, vous verez que pour les images ancrées, les URL sont bien gérées, elles ne sont pas -forcément- transformées en image.)

Les attributs gérés ici sont les suivants :

<code 4D>
$_attributes:=New collection
$_attributes.push(wk height)
$_attributes.push(wk width)
$_attributes.push(wk min height)
$_attributes.push(wk min width)
$_attributes.push(wk anchor horizontal align)
$_attributes.push(wk anchor vertical align)
$_attributes.push(wk anchor horizontal offset)
$_attributes.push(wk anchor vertical offset)
$_attributes.push(wk margin)
$_attributes.push(wk padding)
$_attributes.push(wk image url)
$_attributes.push(wk image alternate text)

$_attributes.push(wk anchor origin)
$_attributes.push(wk anchor page)
$_attributes.push(wk anchor layout)

</code 4D>

N.B. C’est une base de TEST et elle n’est pas destinée a être livrée telle quelle.
Les valeurs saisies doivent être au format CSS (“2.5cm” et non pas “2,5 cm” par exemple) et aucun contrôle ni reformatage ne sont effectués dans cet exemple.

[]31794630;“Your comment here…”[/]

https://forums.4d.com/4DBB_Main/x_User/4028/files/31794643.zip

Cordialement

Roland Lannuzel

Bonjour et merci.
Je vais regarder comment réaliser une interface dans notre logiciel mais cela va faire bizarre d’avoir la palette 4D Write Pro par défaut et pour les images une autre zone.

Cordialement

Pascal Aubert

: Pascal AUBERT

…/…
Bref c’est une vraie régression par rapport à l’ancêtre.
Bienvenue dans le futur
…/…

Write Pro est une vrai évolution.
Ok, les premiers pas sont chaotiques et malgré une première impression sympathique, la déception est rapide.
Lire la doc est bénéfique.

Write Pro est complètement paramétrable avec la création d’une barre d’outils/barre de menu spécifique au métier.
Les actions standards sont un vrai plus, l’intégration des commandes 4D une vrai souplesse qui laisse envisager des migrations de versions et des tests de non régression plus simples.

Ok le plan de migration est lourd, mais cela permet de proposer un interface moderne, avec des fonctionnalités métiers sans souci.

Et avec Roland on a un SAV réactif et performant.

[]31797037;“Une première toolBar”[/]

L’évolution “composant write Pro” est passée au stade goodies pour le moment, mais cette perspective est interessante.

Bonsoir,

Jolie barre personnalisée en 17R, compte tenu de la règle verticale mais nous ne comptons pas distribuer notre applicatif en version R (très mauvaise expérience avec la v16R5).
C’est clair que je me suis dis que je pourrais utiliser la palette standard mais en fait pas du tout.
Il va falloir en créer une.

Bonne fin de soirée

Pascal Aubert

: Pascal AUBERT

nous ne comptons pas distribuer notre applicatif en version R (très
mauvaise expérience avec la v16R5).
Une mauvaise expérience passée est toujours désagréable, pour autant je ne pense pas qu’il faille en faire une règle. Je n’ai qu’à me féliciter d’une pratique prudente (*) des R, depuis un bon moment.

(*) comprendre : je ne me jette pas sur la dernière qui vient de sortir tel l’aficionado de Steve sur le dernier iPhone

Bonjour,

J’ai une autre question sur 4D Write Pro et les images.

Dans nos courriers on a souvent un entête comprenant le logo ne notre client et un texte (voir copie écran).
Dans l’ancienne version on mettait une image ancrée dans la page et on positionnait le texte en fonction de l’image.

Comment le faire avec 4D Write Pro ?
Je veux que le logo reste une référence (champ d’une table ou variable image) car tous lers courriers sont archivés dans la base et si la référence est transformée en image (comme c’est le cas en mettant l’image devant ou derrière le texte) cela risque de peser très lourd rapidement.
Je n’ai pas trouvé comment faire un habillage du texte autour du logo (qui a été inséré dans le texte).

[]31869437;“Your comment here…”[/]
[]31869444;“Your comment here…”[/]

Pascal Aubert

Bonjour Pascal…

Bon, c’est faisable (en informatique, tout est faisable, c’est ça qui est bien :slight_smile:
Cela dit, tout n’est pas possible via l’interface (au moins à ce jour) et il vous faudra programmer un peu.

J’espère que la lecture de cette réponse vous aidera à comprendre ce que vous devez faire (une base exemple devrait aider aussi :slight_smile:

il y a en gros deux points à traiter
1°) la possibilité de définir une image ancrée (anchored picture) par une expression 4D
2°) la possibilité de définir la position de cette image dans le document lui-même ou bien dans les en-têtes et pieds avec plein d’autres sous-options possibles (1er entète, entêtes des pages paires, impaires, etc. idem pour les pieds…)

Le premier point est le plus important je pense en ce qui vous concerne.

Pour associer une expression 4D a une image ancrée, il faut effectuer le code suivant (quand une image ancrée est sélectionnée, c.à.d qu’elle a des poignées…ctrl-clic sur Win ,Cmd-clic sur mac)

ATTENTION : CECI N’EST POSSIBLE QU’À PARTIR DE LA V17R2

<code 4D>
$range:=WP Selection range([TEMPLATES]WP)
If ($range.type=2)
WP SET ATTRIBUTES($range;wk image expression;"[PEOPLE]Logo")

</code 4D>

Vous pouvez aussi récupérer l’image via (attention au [0] si il n’y a pas d’image statique dans le doc)

<code 4D>
$range:=WP Get elements([TEMPLATES]WP;wk type image anchored)[0]

</code 4D>

Le second point a plus ou moins déjà été traité dans ma précédente réponse.

Voici un exemple de code pour “caller” une image dans le coin supérieur gauche du header de la 1ere section.

<code 4D>
$range:=WP Selection range([TEMPLATES]WP)
If ($range.type=2)

WP SET ATTRIBUTES($range;wk anchor origin;wk header box)  //0
WP SET ATTRIBUTES($range;wk anchor page;wk anchor all)  // or 1 for 1st page...

$header:=WP Get header([TEMPLATES]WP;1)

WP SET ATTRIBUTES($range;wk anchor horizontal align;wk left)  //0
WP SET ATTRIBUTES($range;wk anchor horizontal offset;$header.marginLeft)  // based on header margins

WP SET ATTRIBUTES($range;wk anchor vertical align;wk top)
WP SET ATTRIBUTES($range;wk anchor vertical offset;$header.marginTop)  // based on header margins



WP SET ATTRIBUTES($range;wk height;"2.5cm")  // set image height and width (just to make sure it fits in header
WP SET ATTRIBUTES($range;wk width;"2.5cm")

WP SET ATTRIBUTES($range;wk anchor section;wk anchor all)

End if
</code 4D>

Le code pour le footer est sensiblement identique (voir base exemple)


La base exemple comporte deux tables : PEOPLE et TEMPLATES ainsi qu’un formulaire projet DEMO

-> Lancer ce formulaire en 1er et constater que ça fonctionne…
en passant d’un templates à l’autre
en passant d’une personne à l’autre

[]31873511;“Your comment here…”[/]

-> Ensuite aller dans les templates (il y en a deux)

Et regarder les scripts des boutons qui permettent d’associer une expression à une image ancrée (pour info, un HDI a traité ce sujet en particulier) et les autres qui permettent de position l’image en question dans le header ou le footer.

Voila, c’est pas “si” compliqué que ça même si ça l’est tout de même un peu…

(évolution possible de l’interface dans un futur à déterminer !)

https://forums.4d.com/4DBB_Main/x_User/4028/files/31873565.zip


À NOTER qu’il y aurait une AUTRE façon de faire, peut-être plus simple et plus “moderne” :

Elle consisterait à insérer une table d’une ligne et de deux colonnes dans l’entête.
La 1ere cellule contiendrait l’image et la seconde l’adresse complète…
Rendre les bordures invisible et définir la largeur des colonnes, c’est pas compliqué, mais c’est un autre sujet !


Cordialement

Roland Lannuzel

Bonjour et merci pour ces explications.
Ca m’embête un peu car il va falloir passer par un déploiement chez nos clients en v17R5.
J’ai bien compris qu’il va falloir un peu d’huile coude pour retrouver les fonctions de base de l’ancien 4D Write.
Effectivement j’avais imaginer 2 colonnes dans l’entête mais ce n’est pas possible mais je n’avais pas penser à une table à une ligne et 2 colonnes.
Je vais me pencher sur tout ça.
Merci

Pascal Aubert

Bonjour Pascal,

je viens de me rendre compte d’une chose (je m’en veux un peu de ne pas y avoir pensé plus tot) :

La commande “WP SET ATTRIBUTES($range;wk image expression;”[PEOPLE]Logo") - qui n’est accessible qu’à partir de la v17R2 - n’est pas forcément utile car -toujours à partir de la 17R2 - le fait de passer une image “inline” résultant d’une expression 4D ne perd pas son expression quand elle passe en arrière plan (ou en avant plan).

Autrement dit, le fait qu’elle soit transformée en image statique (comme vous le faisiez remarquer dans votre premier post) n’est plus vrai à partir de la v17R2.

Cordialement,

Roland Lannuzel

Bonjour Roland,

Effectivement j’ai fait des tests hier soir avec la 17R5 et j’ai pu constaté que les références étaient gardées.
J’ai pensé, à tort que la référence des images était perdue car je ne voyais pas mes images mais si je faisais un raffraichissement avec la commande ST CALCULER EXPRESSION je les voyaient, et j’ai même pu les mettre à jour avec d’autres images. Donc c’est parfait.

J’avais testé avant avec un tableau à une ligne et 2 colonnes dans l’entête et cela fonctionnait mais pas simple car il faudrait développer une interface de saisie de coordonnée du tableau en fonction du logo et pas sur que nos client comprennent quelque chose.

Je vais donc me contenter de développer une interface pour manipuler facilement les images détachées.

Merci de vos explications.

Cordialement

Pascal Aubert

Bonjour Pascal

Merci de votre retour.

En ce qui concerne l’interface concernant les images ancrées, nous sommes conscients du “manque”, j’espère que la base exemple que je vous ai fournie le comblera en attendant !

Cordialement

Roland Lannuzel

Bonjour Roland,

Oui la base exemple me permet de voir comment cela fonctionne.

Ne voulant pas créer des versions 17.3 32-bit et 17R5 64-bit pour nos clients, je me suis lancé hier dans l’ajout d’un tableau dans l’entête en 17.3 avec un dialogue d’interface me permettant de choisir le Nb de colonnes, le Nb de ligne, la largeur de chaque colonne, l’aliqnement du tableau et des cellules. Bref un truc sympa, mais impossible de créer un tableau dans l’entête en 17.3.
Le même code fonctionne très bien en 17R5.
Donc pour le moment on va faire très light.

Cordialement

Pascal Aubert

: Pascal AUBERT

(…)mais impossible de créer un tableau dans l’entête en 17.3.
Le même code fonctionne très bien en 17R5.

(re)bonjour Pascal

Si si, on peut créer des tableaux dans les en-têtes en V17.x !
La 17.x est simplement moins permissive que la v17 R5 et on doit obligatoirement passer par un range à la commande, on ne peut pas utiliser directement par la référence de l’entête.

(beaucoup de commandes ont été simplifiées à partir de la v17R5)

<code 4D>
$header:=WP Get header(WParea;1)
If ($header#Null)

$version:=Application version
If ($version>="1750")  // 17R5
	$table:=WP Insert table($header;wk replace)
Else 
	$range:=WP Text range($header;wk start text;wk end text) // create range first
	$table:=WP Insert table($range;wk replace)
End if 

$row:=WP Table append row($table;"alpha";Random)

Else
ALERT(“No header”)
End if
</code 4D>

Roland

Merci Roland.

Je vais essayer ça.

Pascal Aubert

Bonjour Roland,

Merci pour les infos.
J’ai pu remettre mon interface en route qui me permet de créer des tableaux (avec différents choix, alignement, point d’insertion, filet, alignement du texte dans les colonnes, largeur des colonnes) dans les différentes zones du courrier.
[]31915027;“Your comment here…”[/]
Je vais continuer à développer les choses manquantes dans l’interface comme le positionnement des images dans la page et non dans le texte.

Cordialement

Pascal Aubert

Bonjour Rolland,

J’ai ajouté des paramètres dans mon dialogue pour créer des tableaux et cela fonctionne bien.

J’ai juste un problème, je ne sais comment savoir s’il existe déjà un tableau dans mon entête.
J’ai essayé différentes commandes comme mais je ne m’en sort pas.

Merci de votre aide

Cordialement

Pascal Aubert

bonjour Pascal

: Pascal AUBERT

J’ai juste un problème, je ne sais comment savoir s’il existe déjà un
tableau dans mon entête.

ça c’est facile…(vous avez peut-être trouvé depuis)

La réponse c’est avec “WP Get elements”

Voila le bout de code

<code 4D>
$header:=WP Get header(WParea;1)
If ($header=Null)
ALERT(“no header”)
Else
$count:=WP Get elements($header;wk type table).length
If ($count=0)
ALERT(“no table in header”)
Else
ALERT(String($count)+" table(s) in the header.")
End if
End if
</code 4D>

Bonne journée

Roland