IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Système multivue, faire des onglets refermables


Sujet :

WinDev

  1. #1
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut Système multivue, faire des onglets refermables
    Bonjour à tous,

    actuellement le menu latéral de mon appli ne permet de lancer qu'une fenêtre dans le cadre principal.

    je souhaite ajouter un système d'onglets (limité à 10) dans lesquels vont se charger mes différentes fenêtres

    mon problème est que je voudrais pouvoir fermer un onglet au fur et à mesure que l'utilisateur en a terminé avec l'utilisation d'un module/fenêtre

    pour cela il faudrait que je puisse afficher dans la tête d'onglet une petite croix qui, sur clic, ferme l'onglet en question.

    Exactement comme un navigateur en fait !

    Comment puis-je parvenir à mes fins avec les outils dont je dispose ?

    Merci à vous
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    R&B
    R&B est déconnecté
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2005
    Messages : 571
    Points : 1 263
    Points
    1 263
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ONG_Onglet[<indice de l'onglet]..Visible=Faux

  3. #3
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    oui ça je sais rendre un onglet invisible, ce qui me manque c'est de pouvoir placer une croix sur chaque onglet, sans la placer de façon artisanale par superposition.
    mais je crois que je n'aurai pas trop le choix

    par contre là ce qui me fait soucis, c'est quand je vais fermer un onglet, en fait je vais le rendre invisible. et si je ferme un onglet intercalé entre deux autres, je veux que le prochain onglet qui viendra "s'ajouter" apparaisse à la droite des 2 restés ouverts, et pas qu'il "réapparaisse" entre les 2, ce n'est pas naturel. Je dois pouvoir tout décaler, mais pas seulement les noms d'onglets, également les fenêtres internes contenues dans les onglets.

    Je m'explique :

    imaginons que j'ai actuellement 3 onglets (volets V1, V2, V3) qui contiennent chacun une fenêtre interne (FI_V1, FI_V2, FI_V3), chaque fenêtre interne contenant une fenêtre de mon ihm (via l'instruction changeFenetreSource, cela peut être FI_ARTICLES, FI_CLIENTS, FI_STOCKS, etc...)

    si je ferme le 2ème onglet, je dois transférer le contenu du 3ème onglet dans le 2ème, et rendre le 3ème onglet invisible, lequel réapparaitra à nouveau quand je voudrai afficher une 3ème fenêtre dans mon système d'onglets.

    tout ceci afin que les onglets aient l'impression de s'accumuler par la droite, au fur et à mesure des chargements de fenêtre, et des fermetures.

    À MOINS QUE :

    je puisse seulement changer l'ordre d'affichage des volets, auquel cas j'ai juste à décaler à gauche tous les volets se trouvant à droite de celui que je ferme
    un algo de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    j = indice du volet à fermer
    pour i de j à nombre_de_volets
        mon_objet_onglets[i] = mon_objet_onglets[i+1] 
    fin
    Est-ce faisable ?


    Merci pour vos idées.

    bob
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  4. #4
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bien évidemment, le système de décalage ne fonctionne pas

    Peut-on affecter dynamiquement une fenêtre interne pour qu'elle récupère le contenu d'une autre ?

    Exemple, j'ai à l'avance 10 fenêtre internes FI_V1, ...., FI_V10 qui vont se voir changer leur source au fur et à mesure de l'utilisation de l'appli

    Voici mon code, mais ça ne fonctionne pas :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    PROCEDURE fermeOnglet(indice est un entier)
     
            // on décale tout à gauche
    	POUR i = indice _A_ 9 
    		 ChangeFenêtreSource({"FEN_START.FI_V"+i,indChamp},{"FEN_START.FI_V"+(i+1),indChamp})
    		 Trace(i + "<-" + (i+1))
     
    	FIN
     
            // rend invisible tous les onglets supérieurs à nbOngletsVisibles (variable globale, à cet instant encore égale au nombre d'onglets visibles avant qu'on en ferme un)
            POUR i = nbOngletsVisibles _A_ 10 
    		 FEN_START.ONG_onglets[i]..Visible = faux		 
    	FIN
     
            nbOngletsVisibles--  // variable globale
     
     
    FIN
    Personne n'a jamais fait ça dans son ihm ? Un système d'onglets fermables, style navigateur ?

    Merci
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Si les onglets ne permettent pas de le faire, tu peux "simuler" le fonctionnement que tu désires avec les plans.
    Tu mets une zone répétée qui "simule" les volets d'onglet, et des champs fenêtre interne que tu associes à des plans.
    Pour ajouter un "volet":
    1. Ajout de l'éléments dans la zone répétée
    2. Clonage du champ Fenêtre Interne "source", et association du champ à un plan supplémentaire.
    3. Affectation de la Fenêtre Interne au champ nouvellement créé
    4. Changement de plan de la fenêtre

    Le changement d'onglet devient alors un changement de plan de la fenêtre mère.

    Ainsi tu peux trier les "onglets" à ta guise, proposer un bouton de fermeture dans le "volet"...

    Tatayo.

  6. #6
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bonjour et merci pour ton aide.

    Je me permets de te demander quelques précisions, ca je sens bien que ta piste peut convenir, mais :
    - concernant la zone répétée, est-ce que je ne peux pas garder mon système d'onglets (juste la partie haute = mes 10 onglets créés d'avance) pour commander l'affichage des plans, et en cas de fermeture je décalerai les libellés vers la gauche en conséquence ?
    - comment on créer un plan par programmation ? et comment on le supprime ? Parce que j'ai l'impression que ce plan, c'est juste une propriété de la fenêtre interne pour mettre des champs sur différentes couches


    Donc je partirais avec zéro plans, mais à chaque chargement d'un nouveau "volet", j'ai besoin de faire :
    - rendre visible un nouvel onglet par la droite (ça me donne sa position i) et lui donner le libellé adéquat
    - créer un ième plan à ma fenêtre interne principale
    - cloner le champs fenêtre interne "source", changer la source de la fenêtre clonée (avec le contenu adéquat), et l'affecter au plan i

    Et en cas de fermeture du "volet" i:
    - décaler les libellés des onglets vers la gauche (pour les onglets à droite de celui fermé s'il y en a)
    - rendre invisible l'onglet le plus à droite, resté visible (puisque tout a été décalé d'un cran à gauche)
    - supprimer le plan i

    Peux-tu m'apporter encore un peu d'aide sur ces points ?
    Je te remercie, j'ai l'impression que ça va me débloquer.

    Cordialement.

    Ci-dessous un essai qui ne fonctionne pas (pour l'ajout), la création semble bien se passer, mais je ne vois pas le contenu de mes fenêtre clonées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SI nbVoletsVisibles < 5 ALORS
     
    	nbVoletsVisibles ++
    	i est un entier = nbVoletsVisibles
     
    	// paramètre le nouvel onglet (libellé, image croix de fermeture, rend visible et actif)
    	ONG_onglet_principal[i]..Libellé = Complète(" " + titre, 21)
    	{"FEN_START.IMG_ferme_V" + i,indChamp}..Visible = Vrai
    	ONG_onglet_principal[i]..Visible = Vrai
    	ONG_onglet_principal = i
     
    	// et crée un nouvelle FI qu'on charge et affecte à un plan (j'ai mis +10 pour être certain qu'il soit suffisamment haut pour dépasser les plans existants déjà à l'initialisation de l'appli)
    	ChampClone("FI_A_CLONER","FI_A_CLONER"+i)
    	{"FI_A_CLONER"+i,indChamp}..Plan = 10 + i
    	{"FI_A_CLONER"+i,indChamp}..Visible = Vrai
    	ChangeFenêtreSource({"FI_A_CLONER"+i,indChamp},menu)  // menu est le nom de la fenêtre interne qui doit se charger dans la fenêtre clonée
     
    	FenEtat({"FI_A_CLONER"+i,indChamp},DessusTout)  // pas nécessaire, c'était pour passer ma fenêtre clonée au premier plan, mais non rien n'y fait
     
    SINON
    	Erreur("5 onglets maxi par interface")
    FIN
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    J'étais parti sur une zone répétée pour palier à l'absence de croix pour fermer un onglet. Mais on peut utiliser ce qu'on veut: onglet, table horizontale...
    L'avantage d'une zone répétée est que l'ajout et la suppression d'un élément se font très simplement, aucun décalage à prévoir. Et on peut mettre ce qu'on veut dans une zone répétée: boutons, libellés...
    Pour les plans, il me semble qu'il n'est pas nécessaire de les créer ni de les supprimer. Ce n'est qu'une propriété des champs, seuls ceux du plan actif sont visibles.

    Dans ton exemple, il manque le changement de plan de la fenêtre principale.

    Tatayo.

  8. #8
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    ok

    finalement j'ai fait une petite fonction montreOnglet() qui va parcourir les N fenêtres internes correspondant aux N onglets, et rendre visible la bonne fenêtre interne et invisible les autres. Comme je limite à 5 onglets ça va vite.

    sachant qu'au cours d'une exécution de mon appli, je vais peut-être charger 4 volets, puis en fermer 2, en rouvrir 3, fermer les 5, rouvrir 3, etc.... tant et si bien que j'aurai peut-être cloné une cinquantaine de fois (voire bien plus) ma fenêtre interne "source", même si à un instant t je n'aurais jamais plus de 5 volets ouverts en même temps.

    pour faire simple j'ai introduit un compteur de fenêtres instanciées, qui s'incrémente à chaque clonage, et c'est cet indice de fenêtre que j'associe à un onglet donné


    j'ai gardé la partie haute du champs onglets/volets pour ne pouvoir utiliser que les onglets, et je positionne des petites croix par superposition sur mes onglets, via une équation qui tient compte de la largeur de mon interface. je recalcule la position des petites croix quand l'ihm subit un redimensionnement, on voit légèrement que c'est "artisanal" parce qu'il y a une nano seconde de temps de réaction entre le redimensionnement de mon interface générale et le repositionnement des petites croix sur les onglets, mais bon c'est plus qu'acceptable.

    Je comprends quand même pas trop qu'un champs navigateur ne soit pas toujours livré avec WinDev. J'ai lu que dans la v18 mais plus sérieusement dans la v19, a été introduit la possibilité de pouvoir attribuer une liste de fenêtres à une même fenêtre interne, et de pouvoir passer de l'une à l'autre, supprimer, insérer, relativement aisément, avec les fonctions FIListeAjoute, FIListeInsère, FIListeAffiche, etc.... à la base créées pour faire du balayage en tactile.
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  9. #9
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    je considère le sujet à moitié résolu, car je me pose maintenant la question de savoir si je dois lancer chaque volet (fenêtre interne) dans un thread séparé, histoire qu'un traitement long dans une fenêtre ne paralyse pas mon ihm e m'empêche d'accéder à une autre onglet.

    Savez-vous comment je peux gérer ça ?

    Merci
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  10. #10
    Membre chevronné Avatar de laurent30s
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 881
    Points : 1 771
    Points
    1 771
    Par défaut
    Citation Envoyé par bvadam Voir le message
    je souhaite ajouter un système d'onglets (limité à 10) dans lesquels vont se charger mes différentes fenêtres
    mon problème est que je voudrais pouvoir fermer un onglet au fur et à mesure que l'utilisateur en a terminé avec l'utilisation d'un module/fenêtre
    pour cela il faudrait que je puisse afficher dans la tête d'onglet une petite croix qui, sur clic, ferme l'onglet en question.
    Exactement comme un navigateur en fait !
    Comment puis-je parvenir à mes fins avec les outils dont je dispose ?
    y-a longtemps j'avais eu à faire ça...
    la solution que j'avais trouvé ressemble à celle que te propose tatayo.

    alors voila comment j'avais procédé

    une table horizontale avec une colonne conteneur dans laquelle j'avais placé
    - une image de fond d'onglet
    - un champ image pour afficher une icône
    - un champ libellé pour le titre de l'onglet
    - un champ bouton pour la croix pour supprimer l'onglet

    Changer de plan suivant l'onglet sélectionné

    J'avais ajouté des boutons
    - scroll droite des onglets
    - scroll gauche des onglets
    - ajout d'onglet

    on pouvait déplacer un onglet par drag and drop

    etc... très semblable à Firefox...
    Bon dev
    Laurent

    - C’est génial.
    - Non c’est bizarre.
    - Justement quand c’est simple y’a des milliers de réponses et quand c’est bizarre y’en a aucune.

Discussions similaires

  1. Comment faire des onglets ?
    Par 7awela dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 22/02/2007, 01h30
  2. [VB.Net] Faire des onglets avec Webmatrix
    Par ellyne dans le forum ASP.NET
    Réponses: 2
    Dernier message: 16/01/2006, 12h03
  3. Petit logiciel graphique pour faire des Onglets
    Par javaSudOuest dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 18/10/2005, 14h39
  4. Faire des onglets
    Par javaSudOuest dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 03/10/2005, 15h53
  5. Faire des onglet en HTML (ou javascript ou autre..)
    Par pierrot10 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 20/09/2005, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo