Présentation Ouverture d'un volet d'onglet dynamique Ouvrir un volet d'onglet via le bouton "+" Ouvrir un volet d'onglet via la fonction OngletOuvre Astuce : Proposer un volet "Menu" permettant à l'utilisateur de choisir le type de volet à créer Manipuler un volet d'onglet dynamique Changer le volet d'onglet dynamique actif Connaître le libellé du volet d'onglet dynamique actif Récupérer le nom de la fenêtre interne affichée dans un volet Accéder au contenu de la fenêtre interne affichée dans un volet Propriétés spécifiques aux champs Onglet
Manipuler un onglet dynamique par programmation
WINDEV permet de manipuler les champs Onglet dynamique par programmation grâce aux
fonctions OngletXXX et à diverses propriétés du WLangage. Il est également possible d'utiliser directement la variable du champ Onglet dans le code.
Attention : Les volets d'onglet statiques et les volets d'onglet dynamiques ne sont pas identifiés de la même manière :
les volets d'onglet statiques sont identifiés par le numéro du volet actif. les volets d'onglet dynamiques sont identifiés par l'alias du volet actif. Remarque : Lorsque la fenêtre interne manipulée dans l'onglet dynamique utilise des fichiers de données HFSQL, il est important que la fenêtre interne utilise un contexte HFSQL indépendant.
Ouverture d'un volet d'onglet dynamique
Il est possible d'ouvrir un volet d'onglet dynamique de différentes façons :
via le bouton "+" du champ Onglet. Dans ce cas, les options précisées dans la fenêtre de description du champ Onglet sont prises en compte. par programmation, via la fonction OngletOuvre . Ouvrir un volet d'onglet via le bouton "+"
Pour ouvrir un volet d'onglet via le bouton "+" présent dans le champ Onglet :
Dans la fenêtre de description du champ Onglet, onglet "Détail", cochez l'option "Avec bouton "Nouveau" (+)" et indiquez la "Fenêtre interne sur bouton Nouveau (+)" et le "Libellé par défaut du nouveau volet". La fenêtre interne ouverte par le bouton "+" peut être : une fenêtre interne spécifique (par exemple ajout d'une fiche client). Lorsque l'utilisateur cliquera sur le bouton "+", les volets d'onglet créés seront identiques, basés sur la même fenêtre interne. Remarque : Si la fenêtre interne attend des paramètres, il est nécessaire d'ouvrir le volet d'onglet par programmation avec la fonction OngletOuvre . aucune fenêtre interne . Dans ce cas, il est nécessaire de préciser par programmation la fenêtre interne à ouvrir. Pour cela, il suffit d'utiliser la fonction OngletOuvre dans l'événement "Création d'un volet" du champ Onglet (voir le paragraphe Ouvrir un volet d'onglet via la fonction OngletOuvre ). Remarque : Le bouton "+" de l'onglet dynamique appelle automatiquement l'événement "Création d'un volet" du champ Onglet. Si cet événement utilise la fonction
OngletOuvre , cet événement sera prioritaire sur la fenêtre interne spécifiée dans l'interface.
Ouvrir un volet d'onglet via la fonction OngletOuvre
Pour ouvrir un volet d'onglet, il est également possible d'utiliser la fonction
OngletOuvre .
Cette fonction peut par exemple :
être utilisée dans un bouton pour ouvrir un volet d'onglet supplémentaire dans un champ Onglet. être utilisé dans l'événement "Création d'un volet" du champ Onglet. Connaître l'alias du volet d'onglet. Cet alias permet de manipuler le volet d'onglet par programmation. Cet alias peut également être connu par la propriété Valeur ou par la propriété Alias . Spécifier le libellé du volet d'onglet. Spécifier la fenêtre interne à ouvrir. Passer des paramètres à la fenêtre interne à ouvrir. Exemple :
Alias_Onglet est une chaîne
Alias_Onglet = OngletOuvre ( ONG_Menu , "Client " + Client . IDClient , FI_FicheClient , Client . IDClient )
ONG_Menu [ Alias_Onglet ] . Image = "NvClient.png"
Astuce : Proposer un volet "Menu" permettant à l'utilisateur de choisir le type de volet à créer
Certaines interfaces peuvent proposer à l'utilisateur, lors du clic sur le bouton "+", un menu lui permettant de choisir le type d'information à afficher.
Pour réaliser ce type d'interface :
Créez une fenêtre interne "Menu". Cette fenêtre interne contient les options permettant de choisir les données à afficher dans le nouveau volet d'onglet. Par exemple, cette fenêtre peut proposer à l'utilisateur d'afficher une fiche client, une facture ou la liste des commandes. Dans la fenêtre de description du champ Onglet, affichez l'onglet "Détail". Pour l'option "Fenêtre interne sur bouton Nouveau (+)", sélectionnez la fenêtre interne "Menu". Validez. Dans ce cas :
L'utilisateur clique sur "+" pour ajouter un volet d'onglet. Un nouveau volet d'onglet s'affiche, contenant le menu (fenêtre interne créée précédemment). L'utilisateur choisit dans le menu le type de volet d'onglet à afficher. Le volet d'onglet en cours (celui qui affiche le menu) est remplacé par le volet choisi. Pour réaliser ce type d'interface, quelques adaptations sont nécessaires :
Dans le code de clic du bouton permettant de choisir le type de volet, il suffit d'utiliser la fonction ChangeFenêtreSource en utilisant la syntaxe : ChangeFenêtreSource(<Fenêtre interne de choix>, <Fenêtre interne de remplacement>)
Par exemple :
ChangeFenêtreSource ( FI_Choix , FI_Fiche )
Pour manipuler l'onglet ajouté, il suffit d'utiliser la syntaxe : <Fenêtre>.<Champ Onglet>[<Fenêtre>.<Champ Onglet>]
Par exemple, pour modifier le libellé de l'onglet ouvert : FEN_DYNMAIN . ONG_MDI [ FEN_DYNMAIN . ONG_MDI ] . Libellé = "Fiche de " + HeureSys ( )
Manipuler un volet d'onglet dynamique
Pour manipuler un volet d'onglet dynamique, utilisez la syntaxe suivante :
ChampOnglet[AliasDuVoletOnglet].NomPropriété = ValeurPropriété
Par exemple :
ONG_MonOnglet [ ONG_MonOnglet ] . Etat = Grisé
Remarques :
La fonction VoletDuChamp permet de connaître le nom du volet dynamique (l'alias) affichant un champ spécifique.
MonVolet est un Champ
MonVolet < - VoletDuChamp ( MoiMême )
MonVolet . Libellé = MonVolet . Libellé + " (Modifié)"
La fonction OngletEtat permet de connaître l'état d'un volet d'onglet dynamique : actif, flottant, inexistant. Il est possible de connaître les alias des volets dynamiques ouverts avec la fonction EnumèreChamp utilisée sur le champ Onglet :
i est un entier = 1
ResChamp est une chaîne
ResChamp = EnumèreChamp ( ONG_MonOnglet , i )
TANTQUE ResChamp < > ""
i + +
Trace ( ResChamp )
ResChamp = EnumèreChamp ( ONG_MonOnglet , i )
FIN
Manipuler un groupe de champs dans un volet dynamique (détachable) Changement de comportement :
Avant la version 2025 Update 2, la manipulation d'un groupe de champs depuis une fenêtre interne d'un onglet affectait également tous les groupes de champs de même nom présents dans la fenêtre affichant l'onglet, ou dans les autres onglets dynamiques. A partir de la version 2025 Update 2, la manipulation d'un groupe de champs depuis la fenêtre interne d'un onglet affecte uniquement la fenêtre interne en cours. Si d'autres groupes de champs de même nom sont présents dans la fenêtre principale, ces groupes de champs ne seront pas modifiés. Exemple : La fenêtre FEN_Principale contient le groupe de champs GRP_Boutons et la fenêtre interne utilisée dans le volet dynamique FI_Visu contient également un groupe de champs GRP_Boutons. Le groupe de champs GRP_Boutons est rendu invisible dans le code de la fenêtre interne FI_Visu.
Avant la version 2025 Update 2, le groupe de champs de la fenêtre et celui de la fenêtre interne sont rendus invisibles. A partir de la version 2025 Update 2, seul le groupe de champs de la fenêtre interne est rendu invisible. Changer le volet d'onglet dynamique actif
Par défaut, le dernier volet d'onglet dynamique créé est activé. Il est possible de changer l'onglet en cours par programmation.
Pour activer un volet d'onglet dynamique :
Affectez le champ Onglet avec l'alias du volet d'onglet dynamique à activer : Nom du champ Onglet = AliasDuVoletOnglet
Utilisez la propriété Valeur . Rappel : Pour activer un volet d'onglet statique, il suffit d'indiquer le numéro du volet à activer.
Nom du champ Onglet = Numéro volet
Connaître le libellé du volet d'onglet dynamique actif
Pour récupérer le libellé de l'onglet actif, il suffit d'utiliser la propriété
Libellé sur le volet d'onglet (identifié par son alias).
Par exemple :
AliasOnglet1 est une chaîne = OngletOuvre ( ONG_Test , "Mon onglet 1" , "FI_FenêtreInterne" )
Trace ( ONG_Test [ AliasOnglet1 ] . Libellé )
La propriété
Libellé permet également de modifier le libellé du volet d'onglet.
Récupérer le nom de la fenêtre interne affichée dans un volet
Pour récupérer le nom de la fenêtre interne affichée dans un volet dynamique, il est possible d'utiliser le code suivant :
oFenInterne est un Champ < - ONG_Test [ AliasVolet1 ]
sNomFenêtreInterne est une chaîne
sNomFenêtreInterne = EnumèreChamp ( oFenInterne , 1 , parOrdreDeCréation )
Accéder au contenu de la fenêtre interne affichée dans un volet
Pour accéder à la valeur d'un champ ou d'une variable de la fenêtre interne affichée dans un volet dynamique, il est possible d'utiliser les
opérateurs d'indirection :
Info ( { AliasVolet1 + ".NomChamp" , indChamp } )
Info ( { AliasVolet1 + ".NomVariable" , indVariable } )
ExécuteTraitement ( AliasVolet1 + ".pNomProcédure" , trtProcédure )
MaProcédure est une procédure = gsAlias_Onglet + ".pNomProcédure"
MaProcédure ( )
L'utilisation de procédures locales à la fenêtre pour manipuler ses champs doit être préférée à l'accès direct aux champs et variables par indirection. Cela permet de garder la fenêtre interne autonome et facilite la maintenance.
Propriétés spécifiques aux champs Onglet
Les propriétés suivantes sont spécifiques à la gestion des caractéristiques d'un champ Onglet dynamique par programmation.
AvecBoutonFermeture La propriété AvecBoutonFermeture permet de : Savoir si tous les volets d'un onglet dynamique possèdent une croix de fermeture. Configurer tous les volets d'un onglet dynamique pour afficher une croix de fermeture. AvecBoutonNouveau La propriété AvecBoutonNouveau permet de : Savoir si un champ Onglet dynamique propose une croix d'ajout. Configurer un champ Onglet dynamique pour proposer ou non une croix d'ajout. Détaché La propriété Détaché permet de savoir si un volet d'un champ Onglet ou d'un champ Ruban est détaché. FenêtreSiNouveau La propriété FenêtreSiNouveau permet de connaître et de modifier le nom de la fenêtre interne à ouvrir si l'utilisateur final ouvre un nouveau volet dans un champ Onglet dynamique. LibelléSiNouveau La propriété LibelléSiNouveau permet de connaître et de modifier le libellé du nouveau volet ouvert par l'utilisateur final dans un champ Onglet dynamique. MémoriserLaConfiguration La propriété MémoriserLaConfiguration permet de : Savoir si la configuration des volets d'un champ Onglet dynamique ou d'un champ Ruban est automatiquement sauvée et restaurée. Modifier la configuration des volets d'un champ Onglet dynamique ou d'un champ Ruban pour qu'elle soit automatiquement sauvée et restaurée ou non. OngletDynamique La propriété OngletDynamique permet de :Connaître le type d'un champ Onglet (onglet statique ou onglet dynamique). Modifier le type d'un champ Onglet (onglet statique ou onglet dynamique). VoletDétachable La propriété VoletDétachable permet de : Savoir si les volets d'un champ Onglet dynamique ou d'un champ Ruban peuvent être sortis de la fenêtre par l'utilisateur final. Autoriser ou non les volets d'un champ Onglet dynamique ou d'un champ Ruban à être sortis de la fenêtre par l'utilisateur final.
Liste des exemples associés :
Exemples didactiques (WINDEV) : WD Multi-Fenetrage
[ + ] Cet exemple permet de comprendre les bases de la gestion du Multi-fenêtrage et des onglets dynamiques avec WINDEV.
Cet exemple présente une interface simple de gestion de fiches client sous deux formes :
- multi fenêtrée avec une interface MDI,
- multi onglets avec un champ onglet dynamique.