Dans les premier, deuxième et troisième épisodes de cette série, nous avons démontré la puissance d’ORDA et la simplicité de la gestion des personnes liées à l’aide d’une seule table, hautement récursive.
L’épisode d’aujourd’hui se concentre sur l’interface utilisateur pour vous aider à créer de belles listes et grilles !
Télécharger Généalogie – Episode quatre
Boîtes de liste et texte stylisé
Les boîtes de liste basées sur des tableaux et des sélections permettent d’afficher des colonnes de texte stylisé. D’où la question suivante : « Puis-je faire la même chose avec des boîtes de liste basées sur des collections et des sélections d’entités ? ».
Comme vous l’avez sans doute deviné, la réponse est oui, mais vous ne savez peut-être pas comment faire !
Bien sûr, si les attributs de vos entités sont déjà stylisés, alors « This.myStyledAttribute » fera le travail sans aucune programmation (tant que la propriété « multi-style » de la colonne est cochée). Mais lorsque vous avez plusieurs attributs (nom, prénom, code postal, téléphone, etc.), votre objectif est plutôt…
d’afficher ceci… …plutôt que cela !
Magique ? pas vraiment, mais TOUJOURS facile
Dans les deux cas ci-dessus, nous avons une boîte de liste basée sur une sélection d’entités créée à l’aide de DS (voir épisodes précédents). Plutôt que d’afficher un seul attribut (ex : This.name) ou même une expression comme « This.Firstname+ » « +This.Lastname », l’expression de la colonne est une méthode 4D qui renvoie un texte complet.
Dans l’une, le texte eststylé. Dans l’autre, il ne l’est pas.
Texte simple (non stylé)
$text:= ""
$text: =$text+This.Title+" "+This.Firstname+" "+This.Lastname+Char(Carriage return)
=
$text:$text+This.Address+Char(Carriage return)
...
$text: =$text+ "email : "+This.email+Char(Carriage return)
$0
: =
$text
Texte stylé basé sur un modèle
L’astuce ici consiste à créer un modèle de texte stylé. Pour ce faire, il suffit d’utiliser une zone de texte stylé comme indiqué à gauche dans l’exemple ci-dessous.
La zone de droite est présentée pour vous rappeler que le texte stylé est basé sur des balises span. Vous devez éviter les balises span dans vos propres balises. La chaîne « [Lastname] » doit être récupérée à l’aide de la commande replace string. . Cela n’est pas possible avec [Lastname] ou [Lastname] (c’est-à-dire le premier caractère dans un style différent ou une couleur différente).
$text:=template
$text :=Replace string($text; "[title]" ;This.Title)
$text :=Replace string($text; "[firstname]" ;This.Firstname)
...
$text :=Replace string($text; "[cell]" ;This.Cell)
$text :=Replace string($text; "[email]" ;This.email)
$0: =
$text
Sélections d’entités vs Collections
» Quoi ? Pourquoi devrais-je les comparer ? Elles sont complètement différentes ! »
« Oui, vous avez raison. Mais attendez… »
Les boîtes de liste basées sur les sélections d’entités sont géniales. Elles peuvent contenir des milliers d’entités, les afficher très rapidement et joliment avec autant de colonnes que nécessaire. Elles peuvent afficher des données compactes (comme ci-dessus) ou des attributs séparés, etc.
La seule chose qu’ils ne peuvent pas faire est d’afficher des grilles (matrices) de données. Elles ne peuvent pas afficher un groupe de personnes de 1 à 100 dans une première colonne, puis continuer le groupe de 101 à 200 dans une deuxième colonne, etc. Pour être honnête, les boîtes de liste basées sur une collection ne peuvent pas faire cela non plus, mais il existe une façon agréable de le faire avec très peu de programmation.
Disons que notre objectif est d’afficher un groupe de personnes comme ceci :
La liste ci-dessus ne montre que 9 personnes, mais il y en a plus dans la sélection d’entités, disons qu’il y en a 28.
Un petit calcul
La première chose que nous devons faire est de trouver un moyen d’avoir un nombre unique de 0 à 28 pour chaque cellule. Soit de gauche à droite, ligne par ligne; de haut en bas, ou colonne par colonne.
Pour ce faire, il suffit d’appeler une fonction avec deux paramètres : le numéro de ligne et le numéro de colonne. Dans ce cas, le NumberOfColumns est 3 ($colNum de 0 à 2) et le NumberOfRows nécessaire est 10 ($rowNum de 0 à 9). Sachant cela, le calcul est facile :
Cas « A » : $rowNum+($colNum*NumberOfRows)
Cas « B » : ($rowNum*NombreDeColonnes ) + $colNum
La zone de liste elle-même affichera une collection remplie de chiffres de 0 à 9 qui représenteront les numéros de ligne. Maintenant, c’est encore plus simple : il n’est pas nécessaire d’envoyer le numéro de ligne à la fonction. Chaque fois que la fonction est appelée, le numéro de ligne est représenté par This.value ! Il suffit donc d’envoyer le numéro de colonne à la fonction pour qu’elle puisse calculer l’ID en fonction du numéro de ligne !
Et devinez quoi ? C’est tout ! Plutôt que de renvoyer le calcul de $i sous forme de longint, il suffit de renvoyer les informations dont vous avez besoin comme myEntity[$i].name sous forme de texte! (assurez-vous simplement que la valeur de $i est inférieure à myEntities.length)
Exemple de code pour le cas « A » :
Les expressions pour les colonnes seront
CalcID(« vertical » ;0) pour la 1ère colonne
CalcID(« vertical » ;1) pour la 2ème colonne
CalcID(« vertical » ;2) pour la 3ème colonne
(etc ; si plus de 3 colonnes)
Voyons maintenant à quoi ressemble la méthode CalcID!
C_TEXT($1)
C_LONGINT ($2)
C_LONGINT ($rowNum;$colNum)
$rownum :=This.value // This.value is the current value of the collection (0,1,2,3,...)
$colNum :=$2 // $2 is given by the expression
If ($1= "vertical")
$0 :=$rowNum+($colNum*numberOfRows) // numberOfRows is a previously calculated value (ex: 10)
Else
$0 :=($rowNum*numberOfCols)+$colNum // numberOfCols is a previously calculated value (ex: ")
End if
Une autre astuce…
Il n’est pas nécessaire de créer des fonctions individuelles pour chaque type de résultat dont vous avez besoin. Il suffit d’envoyer un paramètre qui déterminera ce dont vous avez besoin en retour et de faire en sorte que votre fonction renvoie un objet avec l’attribut demandé rempli !
Plutôt que de créer trois méthodes (getName, getPicture, getBirthday pour retourner un text, un picture et un date) et de les taper dans des expressions de colonnes…
getName(0) // getName returns a text
getPicture (0) // getPicture returns a picture
getBirthday (0) // getBirthday returns a date
… créer une seule méthode getAttributequi retournera un objet rempli selon le paramètre que vous avez envoyé.
Question : Donnez-moi le nom de la personne !
Réponse : Voici un objet avec un attribut nom contenant ce que vous avez demandé !
Voici un exemple de la méthode getAttribute :
C_TEXT($1)
C_OBJECT ($0)
C_OBJECT ($result)
$result :=New object()
Case of
: ($1= "nom" )
$result .name:=contact.name // name is requested: returned as attribute of $result
: ($1= "portrait" )
$result .portrait:=contact.portrait // portrait is requested: returned as attribute of $result
: ($1= "anniversaire" )
$result .birthday:=contact.birthday // birthday is requested: returned as attribute of $result
End case
$0:=$result
Une fois cette méthode écrite, vous pouvez l’appeler dans des expressions de colonnes :
getAttribute("name").name // getAttribute returns an object
getAttribute ("portrait").portrait // getAttribute returns an object
getAttribute("anniversaire").birthday // getAttribute returns an object
Amusez-vous bien et laissez libre cours à votre imagination !