Vous êtes sur le site Web historique de la documentation de 4D. Les documentations sont progressivement déplacées vers developer.4d.com |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
Gestion programmée des objets de type List box
|
Evénement | Objet avec focus | Objet courant |
Sur clic | list box | colonne |
Sur double clic | list box | colonne |
Sur avant frappe clavier | colonne | colonne |
Sur après frappe clavier | colonne | colonne |
Sur après modification | colonne | colonne |
Sur gain focus | colonne ou list box (*) | colonne ou list box (*) |
Sur perte focus | colonne ou list box (*) | colonne ou list box (*) |
Sur déposer | list box source | list box (*) |
Sur glisser | list box source | list box (*) |
Sur début glisser | list box | list box (*) |
Sur début survol | list box (**) | list box (**) |
Sur survol | list box (**) | list box (**) |
Sur fin survol | list box (**) | list box (**) |
Sur données modifiées | colonne | colonne |
Sur nouvelle sélection | list box (**) | list box (**) |
Sur avant saisie | colonne | colonne |
Sur déplacement colonnee | list box | colonne |
Sur déplacement ligne | list box | list box |
Sur redimensionnement colonne | list box | colonne |
Sur ouverture corps | Nil | list box (**) |
Sur fermeture corps | Nil | list box (**) |
Sur clic entête | list box | en-tête |
Sur clic pied | list box | pied |
Sur après tri | list box | en-tête |
(*) Lorsque le focus est modifié à l'intérieur d'une list box, un pointeur vers la colonne est retourné. Lorsque le focus est modifié au niveau global du formulaire, un pointeur vers la list box est retourné. Dans le contexte d'une méthode objet de colonne, un pointeur vers la colonne est retourné.
(**) Non exécuté dans le contexte d'une méthode objet de colonne.
(1) Lorsqu'un pointeur vers la colonne est retourné, l'objet pointé dépend du type de la list box. Dans le cadre d'une list box de type tableau, OBJET Lire pointeur retourne un pointeur vers le tableau. Le mécanisme des pointeurs de 4D permet alors de connaître le numéro de l’élément de tableau modifié. Par exemple, en supposant que l’utilisateur a modifié la 5e ligne de la colonne col2 :
$Colonne:=OBJET Lire pointeur(Objet avec focus)
` $Colonne contient un pointeur vers col2
$Ligne:=$Colonne-> `$Ligne vaut 5
Dans le cadre d'une list box de type sélection, OBJET Lire pointeur retourne :
Il est possible d’utiliser la commande OBJET FIXER DEFILEMENT (thème “Objets (Formulaires)”) avec un objet de type list box. Cette commande permet de faire défiler les lignes de la list box afin d’afficher la première ligne sélectionnée ou une ligne spécifique.
La commande EDITER ELEMENT (thème “Gestion de la saisie”) permet de passer en mode édition une cellule d’un objet list box.
Lorsqu'elle est appliquée à une list box en mode sélection, la commande REDESSINER (thème "Interface utilisateur") provoque la mise à jour des données affichées dans la list box.
Note : La commande REDESSINER n'est pas prise en charge avec les list box de type entity selection.
La commande Numero de ligne affichee (thème “Sélections”) fonctionne dans le contexte de l'événement Sur affichage corps pour un objet list box.
Des événements formulaire spécifiques sont destinés à la gestion programmée des list box, concernant notamment le glisser-déposer et le tri. Pour plus d’informations, reportez-vous à la description de la commande Evenement formulaire code.
La gestion du glisser-déposer de données dans les list box est prise en charge par les commandes Position deposer et _o_PROPRIETES GLISSER DEPOSER. Ces commandes ont été spécialement adaptées pour les list box.
Attention de ne pas confondre le glisser-déposer avec le déplacement de lignes et de colonnes, pris en charge par les commandes LISTBOX NUMERO LIGNE DEPLACEE et LISTBOX NUMERO COLONNE DEPLACEE.
Pour qu’une cellule de list box soit saisissable, quel que soit son type (tableau et sélection), il est nécessaire que les deux conditions suivantes soient réunies :
Imaginons par exemple une list box contenant deux tableaux, de type date et texte. Le tableau date n’est pas saisissable. Le tableau texte est saisissable si la date n’est pas déjà passée.
Voici la méthode de la colonne tText :
Au cas ou
:(Evenement formulaire=Sur avant saisie) // une cellule prend le focus
LISTBOX LIRE POSITION CELLULE(*;"lb";$col;$row)
// identification de la cellule
Si(tDate{$row}<Date du jour) // si la date est antérieure à aujourd’hui
$0:=-1 // la cellule n’est PAS saisissable
Sinon
... // la cellule est saisissable
Fin de si
Fin de cas
Note : Depuis 4D v13, l’événement Sur avant saisie est retourné avant Sur gain focus.
A noter qu'avec les list box de type sélection et entity selection, afin de préserver la cohérence des données, tout enregistrement/entité modifié(e) est sauvegardé(e) dès qu'une cellule est validée, c'est-à-dire :
La séquence type d'événements générée lors de la saisie ou de la modification de données est la suivante :
Action | Type(s) de listbox | Séquence d'événements |
Une cellule passe en édition | Tous | Sur avant saisie |
Tous | Sur gain focus | |
La valeur est modifiée | Tous | Sur avant frappe clavier |
Tous | Sur après frappe clavier | |
Tous | Sur après modification | |
L'utilisateur valide et quitte la cellule | List box sélection/entity selection | Sauvegarde |
List box sélection d'enregistrements | Trigger Sur sauvegarde enregistrement (si défini) | |
List box sélection/entity selection | Sur données modifiées(*) | |
List box entity selection | L'entité est sauvegardée avec option automerge, verrouillage optimiste (voir entity.save( )). En cas de succès, l'entité est rechargée avec la version à jour. En cas d'échec, une erreur est générée. | |
Tous | Sur perte focus |
(*) Avec les list box de type entity selection, dans l'événement Sur données modifiées :
Note : La saisie de valeurs dans les list box de type collection comporte une limitation lorsque l'expression d'une colonne est évaluée à null. Dans ce cas, il n'est pas possible de supprimer ou de modifier la valeur null dans la cellule.
Par défaut, la list box gère automatiquement les tris standard des colonnes en cas de clic sur l’en-tête. Un tri standard est un tri alphanumérique des valeurs de la colonne, alternativement croissant / décroissant lors de clics multiples. Toutes les colonnes sont toujours automatiquement synchronisées.
Il est possible d’interdire le tri utilisateur standard en désélectionnant la propriété “Triable” pour la list box.
Le développeur peut mettre en place une gestion personnalisée des tris à l'aide de la commande LISTBOX TRIER COLONNES et/ou en combinant les événements formulaire Sur clic entête et Sur après tri (cf. commande Evenement formulaire code) et les commandes 4D de gestion des tableaux.
Note : La propriété “Triable” concerne uniquement le tri utilisateur standard, la commande LISTBOX TRIER COLONNES ne tient pas compte de cette propriété.
En outre, la valeur de la variable associée à l’en-tête d’une colonne permet de gérer une information supplémentaire : le tri courant de la colonne (lecture) et l’affichage de la flèche de tri.
Il est possible de fixer la valeur de la variable (par exemple Header2:=2) afin de “forcer” l’affichage de la flèche de tri. Le tri de la colonne lui-même n’est dans ce cas pas modifié, il appartient au développeur de le gérer.
Note : La commande OBJET FIXER FORMATAGE propose une prise en charge spécifique pour les icônes dans les en-têtes de list box, utile lorsque vous voulez travailler avec une icône de tri personnalisée.
La gestion des sélections s'effectue différemment selon que la list box de type tableau, sélection d'enregistrements, ou collection/entity selection.
TABLEAU BOOLEEN(tBListBox;10)
// tBListBox est le nom de la variable associée à la List box dans le formulaire
Si(tBListBox{1}=Vrai)
tBListBox{1}:=Faux
Sinon
tBListBox{1}:=Vrai
Fin de si
Si vous avez coché l'option Cacher surlignage sélection pour une list box, vous devrez gérer la visibilité des sélections dans la list box à l'aide des options d'interface disponibles. Pour plus d'informations sur ce point, veuillez vous reporter ci-dessous au paragraphe Personnaliser la représentation des sélections.
Note : Les spécificités de la gestion des sélections dans les list box en mode hiérarchique sont détaillées dans la section Gestion des List box hiérarchiques.
Il est possible d’imprimer des list box à compter de 4D v12. Deux modes d’impression sont proposés : le mode prévisualisation, permettant d’imprimer une list box comme un objet de formulaire et le mode avancé, permettant de contrôler l’impression de l’objet list box lui-même au sein du formulaire. A noter que l'apparence "Impression" est proposée pour les list box dans l'éditeur de formulaires.
L’impression d’une list box en mode prévisualisation consiste à imprimer directement la list box avec le formulaire qui la contient via les commandes d’impression standard ou la commande de menu Imprimer. La list box est imprimée dans l’état où elle se trouve dans le formulaire. Ce mode ne permet pas de contrôler précisément l’impression de l’objet ; en particulier, il ne permet pas d’imprimer toutes les lignes d’une list box contenant plus de lignes qu’elle ne peut en afficher.
Dans ce mode, l’impression des list box s’effectue par programmation, via la commande Imprimer objet (les formulaires projet et les formulaires table sont pris en charge). La commande LISTBOX LIRE INFORMATION IMPRESSION permet de contrôler l’impression de l’objet.
Dans ce mode :
Vous disposez de plusieurs possibilités pour définir des couleurs de fond, des couleurs de police et des styles de police dans les list box :
Des principes de priorité et d'héritage sont observés.
Lorsqu’une même propriété de style ou de couleur est définie à plusieurs niveaux, l’ordre de priorité suivant est appliqué :
priorité élevée | Cellule (si texte multistyle) |
Tableaux/Méthodes colonne | |
Tableaux/Méthodes list box | |
Propriétés de colonne | |
Propriétés de list box | |
priorité basse | Expression Meta Info (list box de type collection/entity selection) |
Par exemple, si vous définissez un style de caractères dans les propriétés de la list box et un autre via un tableau de styles pour la colonne, ce dernier sera pris en compte.
Soit une list box dont les lignes ont une couleur alternée gris/gris clair, définies dans les propriétés de la list box. Un tableau de couleur de fond a également été défini pour la list box afin de passer en orange clair les lignes dont au moins une valeur est négative :
<>_BgndColors{$i}:=0x00FFD0B0 // orange
<>_BgndColors{$i}:=lk hérité // valeur défaut
Vous souhaitez désormais afficher en fond orange foncé les cellule ayant une valeur négative. Pour cela, vous définissez un tableau de couleur de fond pour chaque colonne, par exemple <>_BgndColor_1, <>_BgndColor_2 et <>_BgndColor_3. Les valeurs de ces tableaux seront prioritaires sur celles définies dans les propriétés de la list box et celles du tableau global de couleur de fond :
<>_BgndColorsCol_3{2}:=0x00FF8000 // orange foncé
<>_BgndColorsCol_2{5}:=0x00FF8000
<>_BgndColorsCol_1{9}:=0x00FF8000
<>_BgndColorsCol_1{16}:=0x00FF8000
Vous pouvez obtenir le même résultat à l’aide des commandes LISTBOX FIXER STYLE LIGNE et LISTBOX FIXER COULEUR LIGNE. Elles ont pour avantage d’éviter de devoir prédéfinir les tableaux de style/couleur des colonnes : ils sont créés dynamiquement par les commandes.
Pour chaque attribut (style, couleur et couleur de fond), un héritage est mis en oeuvre lorsque la valeur par défaut est utilisée :
Ainsi, si vous souhaitez qu’un objet hérite de la valeur d’attribut du niveau supérieur, il vous suffit de passer la constante lk hérité (valeur par défaut) à la commande de définition ou directement dans l’élément de tableau de style/couleur correspondant.
Soit une list box contenant un style de caractère standard et des couleurs alternées :
Vous effectuez les modifications suivantes :
Pour restaurer l’apparence initiale de la list box, il suffit de :
Des propriétés d'interface "masquée", "désactivée" et "sélectionnable" sont configurables pour chaque ligne de list box de type tableau.
Ces fonctionnalités sont gérées via le tableau de propriétés Tableau de contrôle des lignes, que vous pouvez désigner à l'aide de la commande LISTBOX FIXER TABLEAU ou via la Liste des propriétés :
Le tableau de contrôle des lignes doit être de type Entier long et comporter le même nombre de lignes que la list box. Pour plus d'informations, reportez-vous à la section Propriétés spécifiques des List box.
Chaque élément du Tableau de contrôle des lignes définit le statut d'interface de la ligne correspondante dans la list box. Trois propriétés d'interface sont accessibles via les constantes du thème "List Box" :
Constante | Type | Valeur | Comment |
lk ligne désactivée | Entier long | 2 | La ligne correspondante est désactivée. Les textes et les contrôles tels que les cases à cocher sont grisés ou estompés. Les zones de texte ne sont plus saisissables. Par défaut : activée |
lk ligne masquée | Entier long | 1 | La ligne correspondante est masquée. Masquer des lignes affecte uniquement l’affichage de la list box. Les lignes masquées sont toujours présentes dans les tableaux et peuvent être manipulées par programmation. Les commandes du langage, notamment LISTBOX Lire nombre lignes ou LISTBOX LIRE POSITION CELLULE, ne tiennent pas compte de l’état masqué/affiché des lignes. Par exemple, dans une list box contenant 10 lignes et dont les 9 premières sont masquées, LISTBOX Lire nombre lignes retournera 10. Du point de vue de l’utilisateur, la présence de lignes masquées dans une list box n’est pas décelable visuellement. Seules les lignes visibles sont sélectionnables (par exemple via la commande Tout sélectionner). Par défaut : visible |
lk ligne non sélectionnable | Entier long | 4 | La ligne correspondante n'est pas sélectionnable (le surlignage n'est plus possible). Les zones de texte ne sont plus saisissables à moins que l'option "Saisie sur clic unique" soit active. Les contrôles tels que les cases à cocher et les pop ups restent toutefois fonctionnels. Ce paramétrage est ignoré si le mode de sélection de la list box est "Aucun". Par défaut : sélectionnable |
Pour modifier le statut d'une ligne, il vous suffit de passer la ou les constante(s) appropriée(s) dans l'élément correspondant. Par exemple, si vous souhaitez que la ligne n°10 ne soit pas sélectionnable, vous pouvez écrire :
aLControlArr{10}:=lk ligne non sélectionnable
Vous pouvez définir plusieurs propriétés d'interface en un seul appel :
aLControlArr{8}:=lk ligne non sélectionnable+lk ligne désactivée
A noter que la définition d'une propriété pour un élément écrase toutes les autres valeurs définies pour cet élément (si elles n'ont pas été réinitialisées). Par exemple :
aLControlArr{6}:=lk ligne désactivée+lk ligne non sélectionnable //la ligne 6 est désactivée et non sélectionnable
aLControlArr{6}:=lk ligne désactivée //la ligne 6 est toujours désactivée mais redevient sélectionnable
Si vous cochez l'option Cacher surlignage sélection (cf. section Thème Apparence), vous devez gérer la représentation visuelle des sélections dans la list box à l'aide des options d'interface disponibles. Comme les sélections elles-mêmes sont gérées par 4D, cela signifie que :
Vous pouvez alors définir par programmation des couleurs d'arrière-plan, des couleurs ou des styles de polices spécifiques permettant de visualiser l'apparence des lignes sélectionnées. Pour cela, vous pouvez utiliser des tableaux ou des expressions en fonction du type de list box affiché (cf. sections suivantes).
Note : Utilisez la constante lk hérité pour appliquer l'apparence courante de la list box (couleur d'arrière-plan, style de police, etc.). Pour plus d'informations sur le fonctionnement de la constante lk hérité, reportez-vous au paragraphe Héritage.
Pour déterminer quelles lignes sont sélectionnées, vous devez tester si elles sont incluses dans l'ensemble désigné par la propriété Ensemble surlignage de la list box :
Vous pouvez alors personnaliser l'apparence des lignes sélectionnées à l'aide des expressions suivantes, définies dans la Liste des propriétés :
Note : N'oubliez pas que les expressions sont automatiquement réévaluées à chaque fois que :
Les lignes de rupture ne peuvent pas être surlignées lorsque l'option Cacher surlignage sélection est cochée. Comme il n'est pas possible d'avoir des couleurs distinctes pour les en-têtes de même niveau, il n'y a aucun moyen de surligner une ligne de rupture spécifique par programmation.
Pour déterminer quelles lignes sont sélectionnées, vous devez parcourir le tableau booléen associé à la list box.
Vous pouvez alors personnaliser l'apparence des lignes sélectionnées à l'aide des tableaux suivants, définis dans la Liste des propriétés :
Notez que les tableaux de list box utilisés pour définir l'apparence des lignes sélectionnées doivent être recalculés dans l'événement formulaire Sur nouvelle sélection ; cependant, vous pouvez également modifier ces tableaux dans les événements formulaire suivants :
... en fonction du moment et de la manière dont vous souhaitez représenter visuellement le changement de focus des sélections.
Vous avez choisi de cacher le surlignage système et souhaitez représenter les sélections dans la list box à l'aide d'une couleur de fond verte, comme dans cet exemple :
Avec une list box de type tableau, vous devez ajouter mettre à jour le Tableau couleurs de fond par programmation :
Dans la méthode objet de la list box, vous pouvez écrire :
Au cas ou
:(Evenement formulaire=Sur nouvelle sélection)
$n:=Taille tableau(LB_Arrays)
TABLEAU ENTIER LONG(_ListboxBackground;$n) //couleur de fond des lignes
Boucle($i;1;$n)
Si(LB_Arrays{$i}=Vrai) // ligne sélectionnée
_ListboxBackground{$i}:=0x0080C080 // fond vert
Sinon // ligne non sélectionnée
_ListboxBackground{$i}:=lk hérité
Fin de si
Fin de boucle
Fin de cas
Avec une list box de type sélection, pour produire le même effet vous pouvez utiliser une méthode chargée de mettre à jour la propriété Expression couleur de fond basée sur l'ensemble désigné par la propriété Ensemble surlignage. Par exemple :
Dans la méthode UI_SetColor, vous pouvez écrire :
Si(Appartient a ensemble("$ListboxSet"))
$color:=0x0080C080 // fond vert
Sinon
$color:=lk hérité
Fin de si
$0:=$color
Attention : N'oubliez pas de cocher l'option Cacher surlignage sélection afin de désactiver le surlignage système (voir ci-dessus).
Il est possible de placer directement le résultat d’une requête SQL dans une list box de type tableau. Cette fonction offre un moyen rapide de visualiser le résultat des requêtes SQL. Seules les requêtes de type SELECT peuvent être utilisées. Ce mécanisme n’est pas utilisable avec une base SQL externe.
Les principes de mise en oeuvre sont les suivants :
Exemple
Nous voulons récupérer tous les champs de la table PERSONS et placer leur contenu dans la list box dont le nom de variable est vlistbox. Dans la méthode objet d’un bouton (par exemple), il suffit d’écrire :
Debut SQL
SELECT * FROM PERSONS INTO <<vlistbox>>
Fin SQL
Customize Highlight Color (4D blog)
Download HDI database
Tutoriaux sur les list box
Produit : 4D
Thème : List Box
Nom intl. : Managing List Box Objects
Modifié : 4D v15 R4
Modifié : 4D v16 R2
Modifié : 4D v17
4D - Langage ( 4D v20 R7)