Vous êtes sur le site Web historique de la documentation de 4D. Les documentations sont progressivement déplacées vers developer.4d.com

Accueil

 
4D v20.2
List box hiérarchiques

List box hiérarchiques  


 

 

4D vous permet de définir et d’utiliser des list box hiérarchiques. Une list box hiérarchique est une list box dans laquelle le contenu de la première colonne apparaît sous forme hiérarchique. Ce type de représentation est adapté à la présentation d’informations comportant des valeurs répétées et/ou hiérarchiquement dépendantes (pays/région/ville...).

Seules les list box de type tableau peuvent être hiérarchiques. 

Les list box hiérarchiques constituent un mode de représentation particulier des données, mais ne modifient pas la structure de ces données (les tableaux). Les list box hiérarchiques sont gérées exactement de la même manière que les list box non hiérarchiques.

Pour définir une list box hiérarchique, vous disposez de trois possibilités :

  • configurer manuellement les éléments hiérarchiques via la liste des propriétés dans l’éditeur de formulaires.
  • générer visuellement la hiérarchie à l’aide du pop up menu de gestion des list box, dans l’éditeur de formulaires.
  • utiliser les commandes LISTBOX FIXER HIERARCHIE et LISTBOX LIRE HIERARCHIE. Ces commandes sont décrites dans le manuel Langage de 4D.

Cette section présente les principes de création et d'utilisation des list box hiérarchiques dans l'éditeur de formulaires de 4D et en exécution, ainsi que leur gestion programmée (sélections, ruptures, utilisation des événements formulaire Sur déployer et Sur contracter...).

Vous pouvez activer et configurer le mode hiérarchique à l'aide du thème "Hiérarchie" de la Liste des propriétés. Pour plus d'informations, reportez-vous à la section Propriétés spécifiques des List box.

Le menu contexuel de l’éditeur de formulaires propose les commandes Créer hiérarchie et Annuler hiérarchie lorsque vous cliquez sur un objet list box.

Lorsque vous sélectionnez au moins une colonne en plus de la première dans un objet list box (de type tableau) dans l’éditeur de formulaires, la commande Créer hiérarchie est disponible dans le menu contextuel :

Lorsque vous choisissez cette commande, les actions suivantes sont effectuées :

  • l’option "List box hiérarchique" est cochée pour l’objet dans la Liste des propriétés.
  • Les variables des colonnes sont utilisées pour définir la hiérarchie. Elles remplacent les variables éventuellement déjà définies.
  • Les colonnes sélectionnées n’apparaissent plus dans la list box (à l’exception du titre de la première).

Exemple : soit une list box dont les premières colonnes contiennent Pays, Région, Ville et Population. Lorsque Pays, Région et Ville sont sélectionnées (cf. illustration ci-dessus), si vous choisissez Créer hiérarchie dans le menu contextuel, une hiérarchie à trois niveaux est créée dans la première colonne, les colonnes 2 et 3 sont supprimées et la colonne Population la deuxième :

Lorsque la première colonne est sélectionnée et déjà définie comme hiérarchique, vous pouvez utiliser la commande Annuler hiérarchie. Lorsque vous choisissez cette commande, les actions suivantes sont effectuées :

  • l’option "List box hiérarchique" est désélectionnée pour l’objet,
  • les niveaux hiérarchiques 2 à n sont supprimés et transformés en colonnes ajoutées dans la list box.

A la première ouverture d’un formulaire contenant une list box hiérarchique, par défaut toutes les lignes sont déployées. 

Une ligne de rupture et un "noeud" hiérarchique sont automatiquement ajoutés dans la list box lorsque des valeurs sont répétées dans les tableaux. Par exemple, imaginons une list box contenant quatre tableaux définissant des villes, chaque ville étant caractérisée par un pays, une région, un nom et un nombre d’habitants : 

Si cette list box est affichée sous forme hiérarchique (les trois premiers tableaux étant inclus dans la hiérarchie), vous obtenez :

Les tableaux ne sont pas triés avant la construction de la hiérarchie. Si par exemple un tableau contient les données AAABBAACC, la hiérarchie obtenue sera :
    >    A
    >    B
    >    A
    >    C

Pour déployer ou contracter un "noeud" hiérarchique, cliquez dessus. Si vous effectuez Alt+clic (Windows) ou Option+clic (macOS) sur le noeud, tous ses sous-éléments seront déployés ou contractés. Ces opérations peuvent également être effectuées par programmation à l'aide des commandes LISTBOX DEPLOYER et LISTBOX CONTRACTER.

Lorsque des valeurs de type date ou heure sont incluses dans une list box hiérarchique, elles sont affichées dans un format normalisé :

  • les dates sont affichées au format système court (par exemple, pour le 30 mai 2009, "05/30/09" sur un système américain et "30/05/09" sur un système européen).
  • les heures sont également affichées au format système court ("12:15:30" ou "12:15" en fonction des paramètres système).

Dans une list box en mode hiérarchique, un tri standard (effectué suite à un clic dans un en-tête de colonne de la list box) est toujours construit de la manière suivante :

  • En premier lieu, tous les niveaux de la colonne hiérarchique (première colonne) sont automatiquement triés par ordre croissant.
  • Le tri est ensuite effectué par ordre croissant ou décroissant (suivant l’action utilisateur) sur les valeurs de la colonne où le clic a eu lieu.
  • Toutes les colonnes sont synchronisées.   
  • Lors des tris ultérieurs des colonnes non hiérarchiques de la list box, seul le dernier niveau de la première colonne est trié. Il est possible de modifier le tri de cette colonne en cliquant sur son en-tête.

Soit par exemple la list box suivante, dans laquelle aucun tri spécifique n’est défini :

Si vous cliquez sur l’en-tête "Population" afin de trier les populations par ordre croissant (ou alternativement décroissant), les données apparaissent ainsi :

Comme pour toutes les list box, vous pouvez désactiver le mécanisme de tri standard en désélectionnant la propriété "Triable" pour la list box et gérer le tri par programmation.

Une list box hiérarchique affiche un nombre variable de lignes à l’écran en fonction de l’état déployé/contracté des noeuds hiérachiques. Cela ne signifie pas pour autant que le nombre de lignes des tableaux varie. Seul l’affichage est modifié, pas les données.

Il est important de comprendre ce principe car la gestion programmée des list box hiérarchiques se base toujours sur les données des tableaux, pas sur les données affichées. En particulier, les lignes de rupture ajoutées automatiquement ne sont pas prises en compte dans les tableaux d’options d’affichage (cf. ci-dessous le paragraphe Gestion des lignes de rupture).

Examinons par exemple les tableaux suivants :

Si ces tableaux sont représentés hiérarchiquement, la ligne "Quimper" ne sera pas affichée sur la deuxième ligne mais sur la quatrième, à cause des deux lignes de rupture ajoutées :

Quelle que soit la manière dont les données sont affichées dans la list box (hiérarchique ou non-hiérarchique), si vous souhaitez passer la ligne contenant "Quimper" en gras, vous devrez utiliser l’instruction TabStyle{2} = Gras. Seule la position de la ligne dans les tableaux est prise en compte. 

Ce principe est mis en oeuvre pour les tableaux internes permettant de gérer :

  • les couleurs
  • les couleurs de fond
  • les styles
  • les lignes masquées
  • les sélections

Par exemple, si vous voulez sélectionner la ligne contenant Rennes, vous devez passer :

 ->MaListbox{3}:=Vrai

Représentation non hiérarchique :

Représentation hiérarchique :

Note : Si une ou plusieurs lignes sont masquées du fait que leurs parents ont été contractés, elles ne sont plus sélectionnées. Seules les lignes visibles (directement ou suite à un défilement) sont sélectionnables. Autrement dit, les lignes ne peuvent pas être à la fois sélectionnées et cachées. 

Tout comme pour les sélections, la commande LISTBOX LIRE POSITION CELLULE retournera les mêmes valeurs pour une list box hiérarchique et une list box non hiérarchique. Cela signifie que dans les deux exemples ci-dessous, LISTBOX LIRE POSITION CELLULE retournera la même position : (3;2)

Représentation non hiérarchique :

Représentation hiérarchique :

Lorsque toutes les lignes d’une sous-hiérarchie sont masquées, la ligne de rupture est automatiquement masquée. Dans l’exemple ci-dessus, si les lignes 1 à 3 sont masquées, la ligne de rupture "Bretagne" n’apparaîtra pas.

Si l’utilisateur sélectionne une ligne de rupture, LISTBOX LIRE POSITION CELLULE retourne la première occurrence de la ligne dans le tableau correspondant. Dans le cas suivant : 

... LISTBOX LIRE POSITION CELLULE retourne (2;4). Pour sélectionner une ligne de rupture par programmation, vous devez utiliser la commande LISTBOX SELECTIONNER RUPTURE.

Les lignes de rupture ne sont pas prises en compte dans les tableaux internes permettant de gérer l’apparence graphique des list box (styles et couleurs). Il est toutefois possible de modifier ces caractéristiques pour les lignes de rupture via les commandes de gestion graphique des objets (thème Objets (Formulaires)). Il suffit pour cela d’exécuter ces commandes appropriées sur les tableaux constituant la hiérarchie. 

Soit par exemple la list box suivante (les noms des tableaux associés sont précisés entre parenthèses) : 

Représentation non hiérarchique :

Représentation hiérarchique :

En mode hiérarchique, les niveaux de rupture ne sont pas pris en compte par les tableaux de modification de style nommés tStyle et tCouleurs. Pour modifier la couleur ou le style des niveaux de rupture, vous devez exécuter les instructions suivantes :

 OBJET FIXER COULEURS RVB(T1;0x0000FF;0xB0B0B0)
 OBJET FIXER STYLE POLICE(T2;Gras)

Note : Dans ce contexte, seule la syntaxe utilisant la variable tableau peut fonctionner avec les commandes de propriété d’objet car les tableaux n’ont alors pas d’objet associé. 

Résultat :

Vous pouvez optimiser l’affichage et la gestion des list box hiérarchiques en tirant parti des événements formulaire Sur déployer et Sur contracter

Une list box hiérarchique est construite à partir du contenu des tableaux qui la constituent, elle ne peut donc être affichée que lorsque tous les tableaux sont chargés en mémoire. Ce principe peut rendre difficile la génération de list box hiérarchiques de grande taille basées sur des tableaux générés à partir des données (via la commande SELECTION VERS TABLEAU), pour des raisons de rapidité d’affichage et d’utilisation de la mémoire.

L'emploi des événements formulaire Sur déployer et Sur contracter permet de s’affranchir de ces contraintes : il est possible de n’afficher qu’une partie de la hiérarchie et d’effectuer le chargement et le déchargement des tableaux à la volée, en fonction des actions de l’utilisateur. 

Dans le contexte de ces événements, la commande LISTBOX LIRE POSITION CELLULE retourne la cellule sur laquelle l’utilisateur a cliqué afin de déployer ou de contracter une ligne. 

Dans ce cas, le remplissage et le vidage des tableaux doivent être effectués par le code. Les principes à mettre en oeuvre sont :

  • A l’affichage de la listbox, seul le premier tableau doit être rempli. Vous devez toutefois créer un second tableau avec des valeurs vides afin que la list box affiche les boutons déployer/contracter :
  • Lorsque l’utilisateur clique sur un bouton de déploiement, vous pouvez traiter l’événement Sur déployer. La commande LISTBOX LIRE POSITION CELLULE retourne la cellule concernée et vous permet de construire la hiérarchie adéquate : vous alimentez le premier tableau avec des valeurs répétées et le second avec les valeurs issues de la commande SELECTION VERS TABLEAU, et vous insérez dans la list box autant de lignes que nécessaire à l’aide de la commande LISTBOX INSERER LIGNES.
  • Lorsque l’utilisateur clique sur un bouton de contraction, vous pouvez traiter l’événement Sur contracter. La commande LISTBOX LIRE POSITION CELLULE retourne la cellule concernée : vous supprimez de la list box autant de lignes que nécessaire à l’aide de la commande LISTBOX SUPPRIMER LIGNES.

 
PROPRIÉTÉS 

Produit : 4D
Thème : List box
Nom intl. : Hierarchical list boxes

 
PAGE CONTENTS 
 
HISTORIQUE 

 
UTILISATION DE L'ARTICLE

4D - Mode Développement ( 4D v20)
4D - Mode Développement ( 4D v20.1)
4D - Mode Développement ( 4D v20.2)