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