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 :

Problème avec guidata


Sujet :

Interfaces Graphiques

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 38
    Points
    38
    Par défaut Problème avec guidata
    Bonjour,

    J'ai réalisé une gui à l'aide de guide et après avoir lu ceci :
    http://briot-jerome.developpez.com/m...s/guiefficace/

    j'ai décidé d'utiliser des guidatas.

    J'ai donc ajouté dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function guidetest_OpeningFcn(hObject, eventdata, handles, varargin)
    ceci pour y ajouter une variable tmax
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    handles.tmax = 10;
    guidata(hObject, handles);

    Dans la callback de mon boutton load
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function loadbutton_Callback(hObject, eventdata, handles)
    j'arrive à modifier cette variable en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    handles.tmax = 15;
    guidata(gcbf,handles);
    voir même en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    handles.tmax = 15;
    guidata(hObject,handles);
    J'arrive bien à récupérer la valeur 15 lorsque j'arrive dans une autre callback. Jusqu'ici tout va bien. J'ai voulu faire appel à une fonction à l'intérieur de la callback de mon bouton load pour modifier ma valeur tmax :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function savetmax(max,handles)
    handles.tmax = max;
    guidata(gcbf,handles);
    handles.tmax 
     
    function LoadMenuItem_Callback(hObject, eventdata, handles)
    savetmax(15,handles);
    handles.tmax
    Et la rien a faire, il m'affiche 10 et non 15 à la fin de ma callback (et bien la valeur 15 à la fin de ma fonction save). Je pense que ceci vient du 1er argument que je passe à guidata mais je ne vois vraiment pas quoi mettre, j'ai essayé de passer hObject en paramètre mais ça ne fonctionne pas non plus

    Merci de votre aide

  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
    Bonjour,

    C'est un peu déroutant en effet mais le comportement est logique au final (par contre ca va être dur à expliquer...)

    En gros dans ta fonction LoadMenuItem_Callback, la structure handles n'est chargée qu'au lancement de la fonction, à ce moment tmax vaut 10.

    Lorsque tu appelles ta fonction savetmax, tu modifies la structure handles sauvegardée dans ta figure mais à aucun moment la structure de la fonction LoadMenuItem_Callback donc à ce moment là, tu as 2 structures handles avec des valeurs différentes, l'une stockée dans l'interface avec tmax=15 et l'autre dans le workspace de ta fonction LoadMenuItem_Callback avec tmax=10.

    Pour corriger ca, deux solutions:
    - Rajouter la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    handles = guidata(gcbf)
    dans ta fonction LoadMenuItem_Callback, c'est un peu lourd à mon goût...
    - Utiliser directement GUIDATA dans les fonctions où tu modifies les valeurs stockées dans la structure handles (c'est la solution qui a ma préférence)

    J'espère avoir été clair

    Bon courage,
    Duf

    P.S: Sinon pour stocker les données, tu peux aussi utiliser SETAPPDATA/GETAPPDATA
    Simulink & Embedded Coder

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

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par duf42 Voir le message
    - Utiliser directement GUIDATA dans les fonctions où tu modifies les valeurs stockées dans la structure handles (c'est la solution qui a ma préférence)
    Je ne vois pas bien ce que tu veux dire. Est-ce faire un guidata dans la callback ? Mais dans ces cas là il faut passer quoi comme arguments ?

  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
    En fait ca consiste à ne pas utiliser ta fonction savetmax et à modifier ta fonction LoadMenuItem_Callback de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function LoadMenuItem_Callback(hObject, eventdata, handles)
    handles.tmax=15;
    guidata(gcbf, handles);
    Simulink & Embedded Coder

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

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 38
    Points
    38
    Par défaut
    Erf, ça revient à faire ce que j'avais fait au début mais j'y tiens à ma fonction savetmax !

    Du coup je me suis rabattu sur les SETAPPDATA/GETAPPDATA et ça marche très bien avec.

    Merci

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

Discussions similaires

  1. Problème de sauvegarde de données avec Guidata
    Par cedji dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 26/07/2013, 09h31
  2. Problème avec GUIDATA GUIHANDLES
    Par soeursourire dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 23/10/2007, 15h53
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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