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 :

[W27] Rafraichir le contenu de widgets placés sur un tableau de bord


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut [W27] Rafraichir le contenu de widgets placés sur un tableau de bord
    Bonjour à tous,

    J'ai une fenêtre interne affichée plusieurs fois (cf image ci-dessous). Ces fenêtre sont remplies par programmation. Pour cela, j'ai créé une procédure locale AfficheMaTableLecons() à ma fenêtre interne qui remplit mon champ table.
    Lorsque je modifier une valeur dans un champ, je demande à l'utilisateur s'il faut le modifier pour chaque fenêtre. Le cas échéant, je souhaite ensuite réafficher les fenêtres avec les nouvelles valeurs.

    Nom : 2022-11-24_13-22-40.png
Affichages : 83
Taille : 75,2 Ko

    La solution la moins élégante consisterait à supprimer les fenêtre est les réafficher. Mais j'aimerais essayer de régénérer l'affichage de chaque Fenêtre interne. A l'intérieur de l'événement "Demande de mise à jour de l'affichage de FI_MaFenetre", j'ai simplement insérer le code

    Je souhaite maintenant déclencher l'événement et c'est là que je bloque ...

    j'ai tenté de connaitre le nombre de widgets disposé sur mon champ tableau de bord
    puis (j'ai essayé plusieurs syntaxes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    nBwidgets est un entier
    nIndice est un entier
    nBwidgets = FEN_CreationNouvelleAnnee.TDB_DetailCoursEffectifs.Occurrence(toTotal)
     
    POUR nIndice = 1 À nBwidgets
    //	FEN_CreationNouvelleAnnee.TDB_DetailCoursEffectifs[nIndice].ExécuteTraitement(AfficheMaTableLecons(),trtProcédure)
    //	FEN_CreationNouvelleAnnee.TDB_DetailCoursEffectifs.ExécuteTraitement()
    //	FEN_CreationNouvelleAnnee.TDB_DetailCoursEffectifs(inndice).affiche()
    	ExécuteTraitement(FEN_CreationNouvelleAnnee.TDB_DetailCoursEffectifs(nindice).AfficheMaTableLecons,trtProcédure)
    FIN
    mais rien de valide pour l'instant...
    si quelqu'un à une idée, je suis preneur
    Merci d'avance

  2. #2
    Membre confirmé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2013
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : février 2013
    Messages : 240
    Points : 642
    Points
    642
    Par défaut
    Je n'ai pas réussi à appeler l'événement de mise à jour de l'affichage (j'ai essayé avec un PostMessage(Handle(MaFenêtre), WM_SIZE, 0, 0) sans succès)
    Donc j'ai créé un autre événement, propre à l'application.

    Le bouton pour réafficher l'affichage contient ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PostMessage(Handle(MaFenêtre), 1500, 0, 0)
    Sur les fenêtres internes, j'ai ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Evénement("testaff", "*.*", 1500)
     
    PROCÉDURE testaff()
     
    Trace("hop", MoiMême..Nom)
    MaFenêtreInterne..CouleurFond	= VertPastel
    Que le bouton soit placé sur la fenêtre mère ou les fenêtres filles, cela semble fonctionner.
    Le 1500 est une valeur arbitraire. Windev conseille dans l'aide de la fonction "événement" d'utiliser une valeur comprise entre "WM_USER + 1300" à "WM_USER + 1400" où WM_USER = 1024).

    J'utilise PostMessage mais cela dirait aussi fonctionner avec SendMessage (mais SendMessage est bloquant tant que le message n'est pas traité donc cela pourrait être problèmatique)

  3. #3
    Expert confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    juin 2017
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : juin 2017
    Messages : 2 308
    Points : 4 152
    Points
    4 152
    Par défaut
    Bonjour,
    Pourquoi ne pas tout simplement utiliser TDBAffiche ?
    La 2° syntaxe te permet même de ne raffraichir qu'une classe (e.g. via un clic droit)
    Il y a peut être plus simple, mais ça tourne

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Merci à vous deux, je vais tenter vos différentes options et mettre le(s) résultats.

    La problématique que j'avais était d'atteindre une fenêtre interne en particulier. Je n'avais, me semble-t-il, pas d'autre option que de travailler avec son indice.. je vous redis.
    Merci à tous

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet
    Inscrit en
    mars 2017
    Messages
    278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mars 2017
    Messages : 278
    Points : 648
    Points
    648
    Par défaut
    Comme le disait @Voroltinquo, TDBAffiche() avec les codes adéquats placés dans les évènements "Rafraichissement du Widget" de chaque fenêtre interne devraient bien aller.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par kunnskap Voir le message
    Comme le disait @Voroltinquo, TDBAffiche() avec les codes adéquats placés dans les évènements "Rafraichissement du Widget" de chaque fenêtre interne devraient bien aller.
    Ok merci mais la problématique que j''ai est : comment déclencher depuis "l'extérieur' le rafraichissement des différents Widgets

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    3 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 3 729
    Points : 8 635
    Points
    8 635
    Par défaut
    Je viens de tester ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    j, i est un entier 
    i = TDBOccurrence(TableauDeBord1,toAffichée)
    ch est une chaîne 
    POUR j = 1 À i
    	ch = TableauDeBord1[j]..Nom
            trace ( ch) 
    	ExécuteTraitement(ch, trtInit)
    FIN
    Ceci exécute la procédure Init de chaque widget (= la portion de code qu'il y a sous la bannière 'fin d'initialisation de fi_xxxxx')
    Je n'ai pas trouvé comment pointer la portion de code sous 'demande de mise à jour de l'affichage de fi_xxxxx'.

    Variante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    j, i est un entier 
    i = TDBOccurrence(TableauDeBord1,toAffichée)
    ch est une chaîne 
    Info(i)
    POUR j = 1 À i
    	ch = TableauDeBord1[j]..Nom
    	ExécuteTraitement(ch, trtInit)
    	ch = ch + ".FF_TEST"
    	QUAND EXCEPTION DANS 
    		ExécuteTraitement(ch , trtProcédure)
    	FAIRE
    		trace (  ch+ " inexistant")
    	FIN
    FIN
    Si la procédure FF_TEST existe dans le widget , elle est exécutée, sinon on a juste le message d'info pour dire qu'elle n'existe pas.

    Ici, je boucle sur tous les Widgets, mais évidemment, on n'est pas obligé.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Wow !

    ça l'air génial, je vais tester tout ça, merci beaucoup

    je butais sur cette syntaxe que je n'arrivais pas à trouver ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ch = TableauDeBord1[j]..Nom

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    J'ai donc testé la solution de tbc92 (que je remercie encore) , à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    j, i est un entier 
    i = TDBOccurrence(TableauDeBord1,toAffichée)
    ch est une chaîne 
    POUR j = 1 À i
    	ch = TableauDeBord1[j]..Nom
            trace ( ch) 
    	ExécuteTraitement(ch, trtInit)
    FIN
    Mais cela ne fonctionne pas chez moi.. enfin cela fonctionne mais seulement pour le premier Widget.
    Sachant que mes widgets sont tous basés sur une Fenêtre interne, la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ch = TableauDeBord1[j]..Nom
    me donne toujours la même valeur, à savoir le nom de ma fenêtre interne de base
    L'exécution du traitement se déroule bien ensuite, mais uniquement sur le premier widget qui porte ce nom... donc toujours le premier widget.

    j'ai donc essayé de stipuler l'indice du Widget pour l'exécution du traitement mais cela me génère une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExécuteTraitement(FEN_CreationNouvelleAnnee.TableauDeBord[nIndice],trtInit)

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    3 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2013
    Messages : 3 729
    Points : 8 635
    Points
    8 635
    Par défaut
    ... erreur.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Finalement, j'ai repris la solution de Voroltinquo et cela fonctionne.

    j'ai donc un parcours des widgets par leur indice selon la proposition de tbc92 et pour chacun, j'exécute la commande TDBAffiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nBwidgets = FEN_CreationNouvelleAnnee.TDB_DetailCoursEffectifs.Occurrence(toTotal)
     
    POUR nIndice = 1 À nBwidgets
    	TDBAffiche(FEN_CreationNouvelleAnnee.TDB_DetailCoursEffectifs,nIndice)
    FIN
    Dans ma fenêtre interne, sous l'événement 'Rafraichissement du widget FI_MaFenetreInterne j'ai simplement un appel à une procédure

    et dans cette procédure, je vide mon champ table et je le reconstruit (pour rappel, ce dernier est rempli par programmation)

    Merci à tous pour votre aide et votre temps

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    ... erreur.
    Merci pour ta grande analyse que j'ai reçue ..

    En fait je n'ai pas de champs fenêtre interne mais un tableau de bord sur lequel sont ajoutées mes fenêtre internes (la quantité est variable) ...

    Merci encore pour ton temps

  13. #13
    Expert confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    juin 2017
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : juin 2017
    Messages : 2 308
    Points : 4 152
    Points
    4 152
    Par défaut
    Tu peux même éviter la boucle en écrivant tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TDBAffiche(TDB_DetailCoursEffectifs)
    Remarque
    Il est inutile de préfixer les champs quand il n'y a pas d'ambigüité possible.
    Il y a peut être plus simple, mais ça tourne

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    Tu peux même éviter la boucle en écrivant tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TDBAffiche(TDB_DetailCoursEffectifs)
    Remarque
    Il est inutile de préfixer les champs quand il n'y a pas d'ambigüité possible.
    .. donc sans préciser de widget, cela signifie-t-il que tous seront concernés par défaut ?

  15. #15
    Expert confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    juin 2017
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : juin 2017
    Messages : 2 308
    Points : 4 152
    Points
    4 152
    Par défaut
    C'est cela. Quelle que soit la syntaxe, le 2° paramètre est optionnel et, je cite :
    Si ce paramètre n'est pas précisé, toutes les fenêtres internes/pages internes manipulées par le champ Tableau de bord seront mises à jour.
    Il y a peut être plus simple, mais ça tourne

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2009
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : décembre 2009
    Messages : 108
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    C'est cela. Quelle que soit la syntaxe, le 2° paramètre est optionnel et, je cite :
    Ok, super, merci pour ta précieuse aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/06/2006, 12h44

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