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 confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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 : 1205
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 chevronné
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    258
    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 : 258
    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é
    Avatar de Voroltinquo
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2017
    Messages
    3 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2017
    Messages : 3 032
    Billets dans le blog
    1
    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)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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 émérite
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    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 : 356
    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 confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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
    4 261
    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 : 4 261
    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é.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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 confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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
    4 261
    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 : 4 261
    Par défaut
    ... erreur.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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 confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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é
    Avatar de Voroltinquo
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2017
    Messages
    3 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2017
    Messages : 3 032
    Billets dans le blog
    1
    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.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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é
    Avatar de Voroltinquo
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2017
    Messages
    3 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2017
    Messages : 3 032
    Billets dans le blog
    1
    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.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 183
    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, 11h44

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