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 :

Visibilite des variables


Sujet :

Interfaces Graphiques

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut Visibilite des variables
    Salut

    J'ai un problème de sauvegarde de variables modifiées et/ou créées dans une fonction appellee par PBcallback
    J'ai utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    guidata(handles.figure1, handles);
    guidata(gcf, handles);
    guidata(gcbf, handles);
    Pourtant, au prochain appuis sur le bouton, les variables ne sont pas modifiées

    résultat ;
    debut de pbcallback : connection Status : 0
    Save handles to guidata
    Fin de pbcallback : connection Status : 1
    debut de pbcallback : connection Status : 0
    Save handles to guidata
    Fin de pbcallback : connection Status : 1
    debut de pbcallback : connection Status : 0
    Save handles to guidata
    Fin de pbcallback : connection Status : 1
    debut de pbcallback : connection Status : 0
    Save handles to guidata
    Fin de pbcallback : connection Status : 1
    une petite idee ?
    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Pourquoi as-tu commenté cette ligne au début du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %handles=guidata(gcbf);
    C'est elle qui va normalement récupérer la dernière mise à jour de handles...

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Je pense que handles est déjà connu dans la fonction, car c'est un des paramètres passés lors de l'appel a fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function getinfoPB_Callback(hObject, eventdata, handles)
    J'avais mis handles=guidata(gcbf); pour essayer de debuggé. A ce moment là, je ne passais plus handles en parametre de la fonction. j'ai dû essayer plusieurs gc (gcf,gcbf,gcbo.....) ca a dû être commenté au dernier essai.

    De même, je fais des appels a GUIDATA plusieurs fois dans la fonction, c'est du debug. A aucun moment je n'ai vu handles.botpartnership(1).ConnectionStatus s'incrementé , quelque soit le moment ou je sauvais handles

    Tout ce qu'il faut regarder dans le fichier que j'ai mis en annexe c'est le case(0)

    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
    disp(sprintf(' debut de pbcallback : connection Status : %i',handles.botpartnership(1).ConnectionStatus));
     
    switch(handles.botpartnership(1).ConnectionStatus)
        case(0)
            handles.botpartnership(1).ConnectionStatus =1;
            guidata(handles.figure1, handles);
    ....
     
    end
     
    disp('Save handles to guidata');
    %guidata(handles.figure1, handles);
    guidata(gcf, handles);
    disp(sprintf('Fin de pbcallback : connection Status : %i',handles.botpartnership(1).ConnectionStatus));
    %System1redraw(0, 0 , handles);
    return
    Le reste n'est pas important. Les sorties écran sont données dans le premier message, après plusieurs appuis sur le bouton.

    Un détail : la fonction function getinfoPB_Callback(hObject, eventdata, handles) est dans un .m séparé. Mais je ne pense pas que ça pose problème...

    Est-ce que tu veux dire que le handles que je reçois en début de fonction n'est pas a jour ? Ca voudrais dire que récupérer "handles" en paramètre est inutile, si il n’est pas a jour... Dans ce cas là, a quel moment ce "handles" passé en parametre serait il figé ( aka le "handles" que je reçois en paramètre corresponds a quelle "étape" du programme) ?
    Je ne comprends pas bien ta remarque. Mais stp poursuit, toutes les rmq sont bonnes a prendre... merci pour ta reponse

  4. #4
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par piter_pam Voir le message
    Est-ce que tu veux dire que le handles que je reçois en début de fonction n'est pas a jour ?
    C'est ce que je veux dire. La variable handles reçue est celle de ta fonction d'appel.
    J'avoue que tout ceci est un peu obscur.
    Donc en général je préfère être sure de bien récupérer l'info la plus à jour.
    Tu as donc essayé en dé-commentant cette ligne ?

    Sinon pour le debug je te conseille fortement d'utiliser le Debugger intégré à l'éditeur de MATLAB, il est très bien et te permet de connaitre tes variables à chaque step.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Par défaut
    Merci Caro,

    Pour essayer de trouver le problème, j'ai crée deux boutons plus et moins comme dans l'exemple du tuto. les deux callback sont dans des fichiers sépares.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    % --- Executes on button press in moins.
    function moins_Callback(hObject, eventdata)
    % hObject    handle to moins (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    handles = guidata(gcbf);
    if(~isfield(handles,'toto'))
        handles.toto = 0;
    end
    handles.toto = handles.toto-1;
    disp(sprintf('Handles.toto = %i', handles.toto));
    handles
    gcbf
    guidata(gcbf, handles);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    % --- Executes on button press in plus.
    function plus_Callback(hObject, eventdata)
    % hObject    handle to plus (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    handles=guidata(gcbf);
    if(~isfield(handles,'toto'))
        handles.toto = 0;
    end
    handles.toto = handles.toto+1;
    disp(sprintf('Handles.toto = %i', handles.toto));
    guidata(gcbf, handles);
    les deux même fonctions, appelles depuis deux GUI differants ne donnes pas le même résultat:

    J'ai legerement modifie le gui recupere sur le tuto. ca fonctionne bien:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     function gui_guidata_guihandles
     
    % Création de l'objet Figure
    figure('units','pixels',...
        'position',[250 250 500 500],...
        'color',[0.925 0.913 0.687],...
        'numbertitle','off',...
        'name','[GUI] Utilisation de GUIDATA',...
        'menubar','none',...
        'tag','interface');
     
    % Création de l'objet Uicontrol Pushbutton -
    uicontrol('style','pushbutton',...
        'units','normalized',...
        'position',[0.1 0.1 0.1 0.05],...
        'string','-',...    
        'callback',@moins_Callback,...
        'tag','bouton_retrancher');
     
    % Création de l'objet Uicontrol Pushbutton +
    uicontrol('style','pushbutton',...
        'units','normalized',...
        'position',[0.3 0.1 0.1 0.05],...
        'string','+',...    
        'callback',@plus_Callback,...
        'tag','bouton_ajouter');
     
    % Création de l'objet Uicontrol Text résultat
    uicontrol('style','text',...
        'units','normalized',...
        'position',[0.1 0.2 0.3 0.05],...
        'string','0',...
        'tag','resultat');
     
    % Génération de la structure contenant les identifiants des objects graphiques dont la 
    % propriété Tag a été utilisée.
     
    handles=guihandles(gcf);
     
    % D'après les Tag utilisés pour les objets graphiques crées précédemment, la structure data 
    % contient les champs suivant :
    %   data.interface
    %   data.resultat
    %   data.bouton_ajouter
    %   data.bouton_retrancher
    %
     
    % Initialisation de la variable représentant la valeur courante du compteur nCompteur à 0
    % Note : nCompteur est ici un champ de la structure data
    handles.toto=2;
     
    % Enregistrement de data dans les données d'application de l'objet Figure
    guidata(gcf,handles)
    plusieurs appuis successif sur - permettent de diminuer la valeur de handles.toto

    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
    23
    24
    25
    26
    27
    28
    29
    Handles.toto = 1
     
    handles = 
     
                interface: 1
                 resultat: 20.0021
           bouton_ajouter: 19.0021
        bouton_retrancher: 18.0027
                     toto: 1
     
     
    ans =
     
         1
     
    Handles.toto = 0
     
    handles = 
     
                interface: 1
                 resultat: 20.0021
           bouton_ajouter: 19.0021
        bouton_retrancher: 18.0027
                     toto: 0
     
     
    ans =
     
         1

    alors que lorsque ces fonctions sont appelles par mon gui (cree avec guide d'ailleurs...),

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Handles.toto = 1
    
    handles = 
    
                      figure1: 219.0016
                        moins: 267.0012
                         plus: 266.0012
    [.......]
                         toto: 1
                      handler: [1x1 struct]
    
    
    ans =
    
      219.0016
    
    Handles.toto = 1
    
    handles = 
    
                      figure1: 219.0016
                        moins: 267.0012
                         plus: 266.0012
               [.......]
                         toto: 1
                      handler: [1x1 struct]
    
    
    ans =
    
      219.0016
    
    Handles.toto = 1
    
    handles = 
    
                      figure1: 219.0016
                        moins: 267.0012
                         plus: 266.0012
       [.......]
                         toto: 1
                      handler: [1x1 struct]
    
    
    ans =
    
      219.0016

    la variable handles.toto n'évolue pas. elle reste egale a + ou - 1 sa valeur d'initialisation (2, comme dans le gui du tuto)

    quand j'exécute les fonctions a partir de mon gui, handles.toto est bien connus, sinon l'affichage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    disp(sprintf('Handles.toto = %i', handles.toto));
    donnerait +1 ou -1,a cause des lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(~isfield(handles,'toto'))
        handles.toto = 0;
    end
    je ne pense pas non plus que pose problème puisque on voit qu'il est égale a la valeur de handles.figure1.

    Pourtant,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    guidata(gcbf, handles);
    sauve les valeurs quand j'exécute les fonctions a partie du gui du tuto, pas quand je l exécute a partir de mon gui.

    Pourquoi ?

  6. #6
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par piter_pam Voir le message
    Pourtant,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    guidata(gcbf, handles);
    sauve les valeurs quand j'exécute les fonctions a partie du gui du tuto, pas quand je l exécute a partir de mon gui.

    Pourquoi ?
    J'avoue que je suis perplexe et ne vois plus trop comment t'aider...
    Tu dis que tu mets ces fonctions en fonctions séparées, est-ce que cela change quelque chose quand tu les mets en sous-fonctions ?

Discussions similaires

  1. visibilité des variables d'un constructeur
    Par med_anis_dk dans le forum Langage
    Réponses: 4
    Dernier message: 06/05/2007, 21h07
  2. Réponses: 6
    Dernier message: 06/04/2007, 14h10
  3. Visibilité des variables
    Par Akhan dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/01/2007, 23h22
  4. problème de visibilité des variables dans un include
    Par d1g-2-d1g dans le forum Langage
    Réponses: 6
    Dernier message: 28/11/2005, 09h35
  5. [EasyPHP] problème de visibilité des variable dans les includes
    Par d1g-2-d1g dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 23/10/2005, 01h55

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