4D WRITE, Programmation des styles et contrôle de saisie (suite

Transcription

4D WRITE, Programmation des styles et contrôle de saisie (suite
4D WRITE, Programmation des styles et contrôle de saisie (suite)
Par
Roland LANNUZEL, Marketing Technique 4D S.A.
Note technique 4D-200108-26-FR
Version 1
Date 1 Août 2001
Résumé
Cette NT montre comment contrôler de façon encore plus avancée une zone de saisie 4D Write afin de
pouvoir construire une Liste hiérarchique. Il est évident que l’opération inverse est également possible mais
cette fois, nous vous laissons le soin de le programmer ! Selon l’utilisation que vous aurez à faire cette NT,
vous aurez peut-être besoin de stocker vos listes à l’aide des commandes “Liste vers BLOB” et “BLOB vers
liste”. Ces commandes vous seront utiles si vous voulez utiliser vos listes vers des bases ne possédant pas
4D Write.
4D Notes techniques
Copyright © 1985-2003 4D SA - Tous droits réservés
Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible.
Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte.
L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs
utilisateurs que des tiers.
Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière
engager 4D SA. La fourniture d u logiciel décrit dans ce document est régie par u n octroi de licence dont les termes sont précisés par
ailleurs dans la licence électronique figurant sur le support d u Logiciel et de la Documentation afférente. Le logiciel et sa documentation
ne peuvent être utilisés, copiés o u reproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux
termes de cette licence.
Aucune partie de ce document ne peut être reproduite o u recopiée de quelque manière que ce soit, électronique o u mécanique, y compris
par photocopie, enregistrement, archivage o u tout autre procédé de stockage, de traitement et de récupération d'informations, pour
d'autres buts que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D
SA.
4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension ®, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des
marques enregistrées de 4D SA.
Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation.
Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées o u des noms commerciaux de
Apple Computer,Inc.
Mac2Win Software Copyright © 1990-2002 est un produit de Altura Software,Inc.
4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,Trumbull,CT,USA.
XTND Copyright 1992-2002 © 4D SA. Tous droits réservés.
1 / 10
XTND Technology Copyright 1989-2002 © Claris Corporation.. Tous droits réservés ACROBAT © Copyright 1987-2002, Secret
Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'Adobe Systems Inc.
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires
respectifs.
2 / 10
4D WRITE, Programmation des styles et contrôle de saisie (suite)
Cette note technique poursuit le travail commencé dans la note 2001_24 et y apportera un contrôle
supplémentaire et montrera comment, à partir d’un texte saisi de façon contrôlée, il est possible construire
une liste hiérarchique.
COPIER / COLLER
Afin de mieux contrôler la zone - et ce qui y est saisi - il semble évident de vouloir contrôler le fait que
l’utilisateur peut “coller” du texte. Dans cet exemple, nous avons choisi de faire simple et d’affecter au texte
collé, le style qui se trouvait au point d’insertion. Les styles éventuellement présents dans la partie à coller
seront donc perdus, mais le but est surtout de mettre en évidence le principe du contrôle.
La méthode “WR_OnCommand” est appelée systématiquement dès qu’une des commandes du menu
4D Write est appelée. Ces menus sont cachés, mais ils peuvent néanmoins être appelés via leur raccourcis
clavier.
Ce contrôle est mis en place par la fonction WR APPELER SUR COMMANDE
(zWR;"WR_OnCommand") appelée Sur chargement du formulaire de saisie.
Les lignes ci-dessous ont été rajoutées dans cette méthode et permettent donc de modifier le comportement
de la commande “Coller”. Lorsque cet ordre surviendra nous effectuerons les actions suivantes :
- Mémorisation de la position du curseur au moment ou l’action “coller” a été demandée (point d’insertion
ou texte sélectionné)
- Mémorisation du style à ce même endroit
- Action de coller (nous laissons la commande “normale” s’effectuer)
- Lecture de la nouvelle position du point d’insertion
- Sélection du texte collé
- Application du style
- Repositionnement du curseur après le texte collé.
Ces actions sont effectuées par les lignes de code suivantes :
: ($Command=wr cmd coller )
WR LIRE SELECTION ($WR;$MemoStart;$MemoEnd)
$MémoStyle:=WR_GetStyleSheetIndice ($WR)
WR
EXECUTER
COMMANDE ($WR;wr cmd coller ) `on execute la commande coller
WR LIRE SELECTION ($WR;$MemoStart2;$MemoEnd2)
WR FIXER SELECTION ($WR;$MemoStart;$MemoEnd2)
WR APPLIQUER FEUILLESTYLE ($WR;◊tWRstyleSheetNum{$MémoStyle})
WR
FIXER
SELECTION ($WR;$MemoEnd2;$MemoEnd2)
DU TEXTE À LA LISTE
3 / 10
Le texte formaté va maintenant être utilisé pour créer une liste hiérarchique 4D. Rappelons qu’une Liste
hiérarchique 4D est référencée par un entier long lors de sa création par la commande “nouvelle liste”. Ensuite
chaque élément de cette liste sera soit un élément simple, soit une liste (sous-liste) également référencée par
un nouvel entier long, etc.
Avant de lancer la construction de la liste proprement dite, nous allons vérifier l’enchaînement des styles
avec la méthode suivante. Si on parvenait, malgré les contrôles de saisie, à entrer un texte comportant des
styles anormaux, le ou les paragraphes incriminés seraient mis en rouge et une erreur serait renvoyée :
Méthode WR_Checktext
C_ENTIER
LONG($1)
$WR:=$1
WR MISE A JOUR ECRAN ($WR;0)
`on mémorise la sélection de l'utilisateur afin de pouvoir la lui rendre
`en fin de traitement si tout s'est bien passé
WR LIRE SELECTION ($WR;$MemoStart;$MemoEnd)
WR
WR
FIXER
FIXER
SELECTION ($WR;0;WR Compter ($WR;wr nb caractères ))
PROPRIETE TEXTE ($WR;wr couleur du texte ;wr noir )
$MémoStyle:=999999
$Error:=F a u x
WR FIXER SELECTION ($WR;0;0)
$ParagraphRead:=WR_SelectParagraph ($WR;"CURRENT";0)
$Style:=WR_GetStyleSheetIndice ($WR)
` le style de 2 paragraphes consécutifs ne peut augmenter
` que d'un niveau à la fois.
Tant que (($Error=F a u x) & ($ParagraphRead=1))
$ParagraphRead:=WR_SelectParagraph ($WR;"NEXT";0)
S i ($ParagraphRead>0)
$Style:=WR_GetStyleSheetIndice ($WR)
S i (($Style-$MémoStyle)>1)
$Error:=V r a i
Sinon
$MémoStyle:=$Style
Fin de si
Fin de si
Fin tant que
S i ($Error=F a u x)
WR FIXER SELECTION ($WR;$MemoStart;$MemoEnd)
$0:=0
Sinon
WR FIXER PROPRIETE TEXTE ($WR;wr couleur du texte ;wr rouge )
$0:=-1
Fin de si
4 / 10
WR MISE A JOUR ECRAN ($WR;1)
La construction de la liste est assez simple dans le principe : Chaque paragraphe du texte sera un élément de
la liste. Le fait que cet élément soit un élément simple, ou lui même une liste sera déterminé en fonction du
style du paragraphe suivant.
Si le style suivant est identique, il s’agit forcément d’un élément simple.
Si le style suivant est supérieur, on crée une nouvelle liste à partir du paragraphe courant et qui “contiendra”
les paragraphes suivants.
Si le style est inférieur (d’une ou plusieurs unités) alors, il faudra retrouver la liste à laquelle il appartient.
Tout cela est effectué dans la méthode “WR_BuildList (->◊HL)” qui reçoit en paramètre un pointeur sur la
liste à créer.
Cette méthode placera aussi des “mini-icones” provenant de la bibliothèque d’images. Ces icônes auront une
taille différente en fonction du type d’élément dans la liste (simple ou sous-liste).
Méthode WR_BuildList
`methode WR_BuildList
C _ P O I N T E U R($1) `faisons générique et passons un pointeur sur la référence de la liste
C _ P O I N T E U R($PtrList)
C_ENTIER LONG($List)
C_ENTIER
LONG($GreenIcon;$RedIcon;$MiniGreen;$MiniRed)
$GreenIcon:=1003 `voir la pict lib
$RedIcon:=1004
$MiniGreen:=1001
$MiniRed:=1002
$PtrList:=$1
$List:=$PtrList->
S i (Liste existante($List)) `toujours verifier si la liste existe avant de la supprimer
SUPPRIMER LISTE($List;*)
Fin de si
$List:=Nouvelle liste
$PtrList->: =$List `si la valeur a changé (ce qui est probable),
`on réaffecte la référence passée en paramètre.
` * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
`debut du traitement
TABLEAU
TABLEAU
ENTIER
ENTIER
LONG(◊tRefList;0)
LONG(◊tLvlList;0)
◊RefList:=0
◊NbList:=0
◊PKlist:=0
CHANGER PROPRIETES
LISTE($List;A la Windows )
5 / 10
` on gère une pile dans un tableau afin de mémoriser
` la référence de la liste pour chaque niveau
◊NbList:=◊NbList+1
INSERER LIGNES(◊tRefList;◊NbList;1)
INSERER LIGNES(◊tLvlList;◊NbList;1)
$CurrentList:=◊NbList `La liste devient la liste "en cours"
$Start:=0
$End:=WR
Compter (zWR;wr nb caractères )
` phase d'initialisation avec les informations concernant
` la 1ère ligne car à chaque passage dans la boucle, il faut
` connaître le style de la ligne traitée ainsi que de la ligne suivante.
S i ($End>1)
`on vide le buffer d'annulations
WR FIXER PROPRIETE ZONE (zWR;wr autoriser annulation ;0)
`on se positionne au tout début du texte
WR FIXER SELECTION (zWR;$Start;$Start)
`lecture des limites du paragraphe courant
WR LIRE PARAGRAPHES (zWR;$ParagStart;$ParagEnd)
`lecture du numero de style du paragraphe en cours
$CurLvl:=WR_GetStyleSheetIndice (zWR)
`on lit le texte sélectionné sans prendre les CR
S i ($ParagEnd<$End)
$CurText:=WR Lire texte (zWR;$ParagStart;$ParagEnd-1)
Sinon
$CurText:=WR Lire texte (zWR;$ParagStart;$ParagEnd)
Fin de si
`on enregistre la référence et le niveau de la liste dans 2 tableaux parallèles
◊tRefList{$CurrentList}: =$List
◊tLvlList{$CurrentList}: =$CurLvl
`initialisation des variables et flags
$Insert:=V r a i `une sous liste doit avoir au moins 1 élément
`on définit le prochain début de paragraphe
$Start:=$ParagEnd+1
$nbParagraphes:=WR
Compter (zWR;wr nb paragraphes )
B o u c l e ($i;1;$nbParagraphes)
`le paragraphe suivant devient le paragraphe courant
WR FIXER SELECTION (zWR;$Start;$Start)
◊PKlist:=◊PKlist+1
`lecture des limites du paragraphe courant
WR LIRE PARAGRAPHES (zWR;$ParagStart;$ParagEnd)
`on lit son style
$NextLvl:=WR_GetStyleSheetIndice (zWR)
`et on lit le texte sélectionné
S i ($ParagEnd<$End)
$NextText:=WR Lire texte (zWR;$ParagStart;$ParagEnd-1) `dont take the CR
Sinon
6 / 10
$NextText:=WR Lire texte (zWR;$ParagStart;$ParagEnd)
Fin de si
Au cas ou
: ($NextLvl<=$CurLvl) `le suivant est à un niveau identique ou inférieur
S i ($Insert)
`on insère le texte comme une ligne "simple"
AJOUTER A LISTE(◊tRefList{$CurrentList};$CurText;◊PKlist)
Sinon
`on remplace l'élément temporaire
CHANGER ELEMENT(◊tRefList{$CurrentList};-1;$CurText;◊PKlist)
$Insert:=V r a i
Fin de si
CHANGER PROPRIETES ELEMENT(◊tRefList{$CurrentList};◊PKlist;F a u x; 0 ;Utiliser réf image
+$MiniGreen)
`si le prochain élément a un niveau inférieur, on redescend dans le tableau
`afin de retrouver la référence de liste du niveau concerné
S i ($NextLvl<$CurLvl)
S i ($CurrentList>1)
Repeter
$CurrentList:=$CurrentList-1
J u s q u e (◊tLvlList{$CurrentList}<=$NextLvl) | ($CurrentList=1)
Fin de si
Fin de si
: ($NextLvl>$CurLvl) `le suivant est a un niveau supérieur
`=> l'element courant est une sous-liste
◊NbList:=◊NbList+1
INSERER LIGNES(◊tRefList;◊NbList;1)
INSERER LIGNES(◊tLvlList;◊NbList;1)
`INSERER LIGNES(◊tFirstLibList;◊NbList;1)
$NextList:=◊NbList `la nouvelle liste devient la liste de référence
◊tRefList{$NextList}:=Nouvelle liste
◊tLvlList{$NextList}: =$NextLvl
`pour ne pas laisser la sous-liste vide, on y insère temporairement un élément
AJOUTER A LISTE(◊tRefList{$NextList};"tests";-1)
S i ($Insert)
AJOUTER A LISTE(◊tRefList{$CurrentList};$CurText;◊PKlist;◊tRefList{$NextList};F a u x)
Sinon
CHANGER ELEMENT(◊tRefList{$CurrentList};-1;$CurText;◊PKlist;◊tRefList{$NextList};F a u x)
Fin de si
CHANGER PROPRIETES ELEMENT(◊tRefList{$CurrentList};◊PKlist;F a u x; 0 ;Utiliser réf image
+$GreenIcon)
`au prochain passage on insérera
$Insert:=F a u x
`Enfin, la prochaine liste devient la liste courrante
$CurrentList:=$NextList
Fin de cas
$CurText:=$NextText
7 / 10
`le niveau suivant devient le niveau courant
$CurLvl:=$NextLvl
`on se positionne au début du paragraphe suivant
$Start:=$ParagEnd+1 `next selection
Fin de boucle
Fin de si
TABLEAU
TABLEAU
ENTIER
ENTIER
LONG(◊tRefList;0)
LONG(◊tLvlList;0)
Voici un autre exemple de script permettant de modifier la couleur des icônes en maintenant la touche
“commande” (Mac) ou “contrôle” (PC) enfoncée.
`Script de ◊HL
C_ENTIER
C_ENTIER
LONG($Style;$Icon)
LONG($GreenIcon;$RedIcon;$MiniGreen;$MiniRed)
$GreenIcon:=1003
$RedIcon:=1004
$MiniGreen:=1001
$MiniRed:=1002
S i (Macintosh commande enfoncee) | (Windows
$Elem:=Element selectionne(◊HL)
$i:=$Elem
$n:=$Elem
$SubList:=0
Ctrl
enfoncee)
`info INITIALES avant de faire quoi que ce soit…
INFORMATION ELEMENT(◊HL;$i;$RefElem;$Text;$SubList;$Open)
$MemoRef:=$RefElem
$MemoSubList:=$SubList
S i ($SubList#0) `1ère condition, impérative : ce doit être une sous-liste
CHANGER
ELEMENT(◊HL;$RefElem;$Text;$RefElem;$SubList;F a u x) `on la ferme
`Checked or not checked ?
LIRE PROPRIETES ELEMENT(◊HL;$RefElem;$Saisie;$Style;$Icon)
S i ($Icon=(Utiliser réf image +$GreenIcon)) | ($Icon=(Utiliser réf image +$MiniGreen))
$LargeIcon:=Utiliser réf image +$RedIcon
$MiniIcon:=Utiliser réf image +$MiniRed
Sinon
$LargeIcon:=Utiliser réf image +$GreenIcon
$MiniIcon:=Utiliser réf image +$MiniGreen
Fin de si
`info sur les éléments suivants de la liste (et des sous-listes éventuelles !)
Repeter
`$i:=$i+1 `on prend le 1er/suivant element dans la liste
INFORMATION ELEMENT(◊HL;$i;$RefElem;$Text;$SubList;$Open)
S i ($SubList#0) `si c'est une sous-liste
S i ($Open=F a u x)
8 / 10
CHANGER ELEMENT(◊HL;$RefElem;$Text;$RefElem;$SubList;V r a i)
REDESSINER LISTE(◊HL)
`on ajoute à $n le nb d'élément de la liste nouvellement déployée…
$n:=$n+Nombre elements($SubList) Fin de si
CHANGER PROPRIETES ELEMENT(◊HL;$RefElem;F a u x;0;$LargeIcon)
Sinon
CHANGER PROPRIETES ELEMENT(◊HL;$RefElem;F a u x;0;$MiniIcon)
Fin de si
$i:=$i+1 `on prend le 1er/suivant element dans la liste
J u s q u e ($i>$n) `on est au dernier et le dernier n'est PAS une sous liste.
SELECTIONNER ELEMENT PAR REFERENCE(◊HL;$MemoRef)
$n:=Position element liste(◊HL;$MemoRef)
INFORMATION ELEMENT(◊HL;$n;$MemoRef;$Text;$SubList)
CHANGER ELEMENT(◊HL;$MemoRef;$Text;$MemoRef;$SubList;F a u x) `on la ferme
REDESSINER LISTE(◊HL)
Fin de si
Fin de si
Conclusion
Pour terminer, voici un “truc” pour colorier des puces dans une zone 4D Write (Les puces étant noires par
défaut). Cette astuce est assez facilement utilisable pour des textes imprimés ou bien pour des zones non
saisissables mais posera des problèmes sur des textes libres à moins de mettre en place un contrôle de saisie
très sophistiqué. Le “secret” est le suivant : “Une puce prend la couleur du texte qui la suit”. Il suffit donc
pour réaliser cet effet d’insérer une (*) espace en début de chaque paragraphe et de fixer la couleur de cette
dernière à l’aide des commandes :
WR
Lire
WR
FIXER
propriete
texte (Zone;wr couleur du texte )
PROPRIETE
TEXTE Zone;wr couleur du texte;Couleur)
Pour obtenir l’effet suivant :
9 / 10
(*) Lorsque l’on parle de typographie, le terme “espace” est féminin.
10 / 10

Documents pareils