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

Interfaces Graphiques Discussion :

Mise à jour des données de la fenêtre principale depuis des fenêtres secondaires


Sujet :

Interfaces Graphiques

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut Mise à jour des données de la fenêtre principale depuis des fenêtres secondaires
    Bonjour,


    J'ai un peu du mal à exposer le problème, je vais essayer d'être le plus clair possible. Je développe une une interface graphique homme machine vers un boitier d'acquisition / émission de son. J'ai pour le moment utilisé la technique GetAppData / SetAppData / FindObj, comme montrée dans le super tuto sur le développement efficace des GUI.

    Au début de mon main.m, j'ai les initialisations d'un certain nombre de structures (que je trouve plus pratiques pour regrouper thématiquement les variables : structure de paramètres d'acquisition, structure de paramètres d'émission,structure des données acquises...), que je stocke toutes dans l'objet root avec des setappdata(0,structure_machin), pour pouvoir y accéder dans toutes les fenêtres de mon programme, car j'en ai besoin dans un peu partout.

    Une fois toutes ces initialisations et stockages faits, je lance tout naturellement la fenêtre principale de l'interface graphique. Là, j'ai déjà besoin de certaines données pour faire des affichages, donc je récupère celles qui m'intéressent par avec des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    structure_machin = getappdata(0,'structure_machin)
    J'obtiens les données qui vont bien et donc la fenêtre principale qui va bien.

    Dans cette fenêtre principale, j'ai plein de boutons qui :
    - soit font des actions modifiant directement mes structures (dans les callbacks, j'appelle les structures avec getappdata, je les modifie et je réenregistre avec un setappdata en écrasant les précédentes valeurs)
    - soit qui ouvrent des fenêtres secondaires où on retrouve le même mécanisme (c'est récursif comme problème )



    Le problème : j'aimerais que la fenêtre principale se mette à jour en temps réel (ou presque) quand des modifications se font ailleurs. Même problèmes si des modifications se font directement sur la fenêtre principale.


    Exemple simple : la fenêtre principale affiche la visualisation en temps réel de ce qui arrive dans les micros, en affichant un certain nombre de vecteurs d'échantillons, un par voie d'acquisition. Dans une fenêtre secondaire d'options, je peux modifier le nombre de voies à utiliser. Ça serait bien que le nombre de voies affichées change...



    J'ai pensé à plusieurs choses, en lisant quelques trucs ici, mais j'ai rien trouvé de génial : redessiner complètement la fenêtre principale quand on ferme une fenêtre secondaire, le faire périodiquement mais si je le fais suffisamment souvent pour pas que ça soit invisible a l'œil nu l'application soit très ralentie,... L'idée serait de forcer à réévaluer au bon moment la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    structure_machin = getappdata(0,'structure_machin)
    mais je ne vois pas du tout comment.

    Après, peut-être que la technique GetAppData / SetAppData / FindObj n'est pas adaptée... Avec des variables globales, ça irait niquel, mais c'est moche... Clairement je pense que je gère mal les stockages / récupérations des données, alors n'hésitez pas à me botter les fesses si je fais n'importe quoi

    Bref, si vous avez des suggestions, je prend tout !!!

    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Une solution serait d'externaliser la fonction de rafraichissement de ton interface principale et de systématiquement appeler cette fonction (et uniquement elle pour faciliter les choses).

    Après dans cette fonction, tu pourras aisément charger les structures stockées dans le workspace root et pour modifier ton interface principale il te suffit de récupérer son handles avec FINDOBJ par exemple.
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    J'ai déjà une fonction dans un .m qui sert uniquement à la définition de la fenêtre principale. Je l'appelle en fait à la fin de mon main.m pour "lancer" l'interface graphique. Elle récupère les structures, trace la figure, les panels, les uicontrols, etc...

    Cette fonction pourrait faire office de fonction de rafraichissement, non ? Dans toutes mes fenêtres secondaires, je pourrais mettre un bouton "valider" donc le callback sauvegarde les changements sur les structures, retrace la fenêtre principale en utilisant la fonction ci-dessus, et fermer la fenêtre secondaire en cours. Ca me parait une solution honnête, mais est ce que c'est pas un peu lourd de "tout" retracer alors que certains trucs ne changent pas ? En même temps, c'est pas compliqué d'en faire une version raccourcie pour modifier que ce qui change.

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Personnellement je trouve ca quand même beaucoup plus propre d'avoir 2 fonctions spécifiques pour la création et le rafraichissement de la fenêtre.
    En règle général, je mets ces fonctions dans le même fichier mais dans ton cas, il serait intéressant de les séparer.

    En clair, un fichier ma_fenetre.m (associé au fichier ma_fenetre.fig) qui contient le code pour créer ta fenêtre ainsi que les Callback de tes objets. Et un autre fichier refresh_main.m qui contient la fonction de rafraichissement des données affichées dans l'interface ma_fenetre.
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Je vois le genre. Si je n'ai pas de fichier ma_fenetre.fig, c'est parce que je n'utilise pas Guide ?

    Merci pour les tuyaux, je vais tenter de mettre ça en place, si j'ai des problèmes je reviendrais ici

  6. #6
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Si je n'ai pas de fichier ma_fenetre.fig, c'est parce que je n'utilise pas Guide ?
    Oui autant pour moi mais ca change pas la méthode
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Re

    Je n'ai pas encore mis pris le temps de mettre mon histoire de rafraichissement en place, mais en voulant faire un truc semblable pour une autre application bien plus simple (un bouton qui lance un calcul, un champ de texte pour afficher le résultat), j'ai trouvé une fonction qui pourrait s'avérer utile : refresh. Son nom est tellement évident que ça m' paru naturellement de le chercher pour mettre un jour mon champ de texte. J'avais pas eu l'idée la dernière fois. Comme quoi notre cerveau progresse tous les jours


    Et en même temps que j'écris ces lignes, je trouve sa coupine refreshdata.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/02/2013, 09h20
  2. Réponses: 7
    Dernier message: 30/04/2012, 09h18
  3. [WD10] Base des données Access et changement du Source Des Données
    Par karim.net7 dans le forum WinDev
    Réponses: 3
    Dernier message: 24/05/2011, 17h48
  4. Réponses: 2
    Dernier message: 21/10/2005, 17h02
  5. [CR] mise en forme d'un champs texte en fonction des données
    Par niPrM dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 29/06/2004, 11h57

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