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 :

Fermer toutes les sous-fenêtres d'un GUI à la fermeture du GUI


Sujet :

Interfaces Graphiques

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 97
    Points : 87
    Points
    87
    Par défaut Fermer toutes les sous-fenêtres d'un GUI à la fermeture du GUI
    Bonjour à tous,

    Je dispose d'une interface principale qui permet d'ouvrir une seconde interface, plus petite, dans une fenêtre séparée. Je souhaiterais qu'à la fermeture de ma fenêtre principale, la seconde interface se ferme également de manière automatique. Réaliser ceci à l'aide d'un pushbutton me semble assez simple. Le problème étant que je souhaiterais fermer ma fenêtre à partir de la croix et non d'un bouton de l'interface.

    De ce que j'ai trouvé, il est possible d'utiliser la propriété CloseRequestFcn de la figure mais je n'ai pour le moment pas trouvé d'exemple concret et compréhensible. Une idée ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Adjen Voir le message
    De ce que j'ai trouvé, il est possible d'utiliser la propriété CloseRequestFcn de la figure
    En effet c'est bien cette propriété qu'il faut utiliser.

    Il suffit, comme pour les propriétés Callback, de lui associer une fonction qui se charge de fermer la deuxième.
    Si tu as gardé son handle, un il suffit d'un simple close(handleFigure2).
    Sinon, tu peux utiliser la fonction findobj afin de le retrouver à l'aide d'une valeur particulière, par exemple un Tag personnalisé, puis appliquer de même close au handle retourné.

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 97
    Points : 87
    Points
    87
    Par défaut
    Merci Jerome pour ta réponse rapide.

    Ma figure principale (figUCD) est définie comme ceci, avec association de la fonction qui est censée fermer la deuxième fenêtre (figCalc) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    figUCD = figure('units','pixels',...
        'position',[xpos ypos sz(1) sz(2)],...
        'menubar','none',...
        'name','Utilitaire Calculs Delais',...
        'numbertitle','off',...
        'resize','on',...
        'color',[0.941 0.941 0.941]);
     
    set(figUCD,'CloseRequestFcn',@CloseMain);
    La fonction est définie comme ceci (figCalc est enregistré au préalable via setappdata) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function CloseMain(obj,event)
     
    % On definit figUCD comme l objet parent %
    figUCD = get(obj,'parent');
     
    % Recuperation de figCalc %
    figCalc = getappdata(0,'figCalc');
     
    close(figCalc);
    close(figUCD);
     
    end
    Le message d'erreur est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Error using close (line 132)
    Invalid figure handle.
     
    Error in UCD>CloseMain (line 893)
    close(figUCD)
     
    Error while evaluating figure CloseRequestFcn
    Chose amusante, retirer close(figUCD) me permet en cliquant sur la croix de l'interface principale (figUCD donc) de fermer figCalc mais plus moyen de fermer figUCD...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function CloseMain(obj,event)
    obj est ici le handle de la figure elle-même, donc figUCD = get(obj,'parent'); va te retourner l'objet root (cf. tutoriel Présentation des objets graphiques).
    Et la fonction close ne s'applique que sur un objet Figure.
    Attention par contre de ne pas appeler close(obj) : car elle implique l'appel CloseRequestFcn derrière et tu auras un bel appel récursif infini.

    Citation Envoyé par Adjen
    Chose amusante, retirer close(figUCD) me permet en cliquant sur la croix de l'interface principale (figUCD donc) de fermer figCalc mais plus moyen de fermer figUCD...
    Chose "normale" je dirais
    Il te manque ceci
    qui va réellement détruire ta figure.
    Tu pourras voir une exemple typique de fonction associée à la propriété CloseRequestFcn dans le sujet de FAQ Comment utiliser une fonction callback ?

    La fonctions associée à CloseRequestFcn est exécutée suite à l'une des deux actions :
    • appui sur la croix rouge
    • appel à la fonction close

    le comportement de la fonction closereq associée par défaut à la propriété est de simplement appeler delete.
    Si tu utilises ta propre fonction, c'est à toi d'appeler delete selon tes conditions pour finalement détruire ou non ta figure.
    Dernière modification par Invité ; 14/11/2014 à 18h45.

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 97
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    obj est ici le handle de la figure elle-même, donc figUCD = get(obj,'parent'); va te retourner l'objet root (cf. tutoriel Présentation des objets graphiques).
    Et la fonction close ne s'applique que sur un objet Figure.
    Si j'ai bien compris, obj est le handle de la figure parce que la propriété CloseRequestFcn, à laquelle ma fonction CloseMain est rattachée, ne peut s'appliquer qu'à un objet de type Figure ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    Le premier paramètre des fonctions callback est toujours l'objet à l'origine de l'évènement, possédant la propriété à laquelle on a associé la fonction.
    Ici il s'agit de ta figure.
    Et oui, seuls les objets Figure possèdent cette propriété CloseRequestFcn.

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 97
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Le premier paramètre des fonctions callback est toujours l'objet à l'origine de l'évènement, possédant la propriété à laquelle on a associé la fonction.
    Ceci vient mettre fin à des questions que je me pose depuis un bout de temps maintenant, merci beaucoup Jerôme !

    J'ai rajouté un try/catch dans la fonction si jamais la sous-fenêtre est déjà fermée au moment de la fermeture de la principale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function CloseMain(obj,event)
     
    % Recuperation de figCalc %
    figCalc = getappdata(0,'figCalc');
     
    try
        close(figCalc);
    catch Err
        clear Err
    end
     
    delete(obj)
     
    end
    Merci beaucoup !

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tu peux utiliser la fonction ishandle pour vérifier que figCalc est toujours le handle d'un objet Figure existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    figCalc = getappdata(0,'figCalc');
     
    if ishandle(figCalc)
        close(figCalc)
    end

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2012
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 97
    Points : 87
    Points
    87
    Par défaut
    Ca fait un peu plus propre en effet, merci !

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

Discussions similaires

  1. [Débutant] Fermer toutes les fenêtres sauf la principale
    Par Taiby dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 19/07/2013, 18h08
  2. [Toutes versions] Fermer toutes les fenêtres VBA
    Par loufab dans le forum Contribuez
    Réponses: 0
    Dernier message: 23/02/2010, 23h52
  3. Fermer toutes les fenêtres filles ayant pour origine une même session
    Par [DreaMs] dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 10/04/2009, 23h01
  4. [JFrame] Désiconifier toutes les autres fenêtres en même temps
    Par stoukou dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 07/10/2005, 13h01
  5. [VB6] Quitter l'appli et fermer toutes les feuilles...
    Par The Bob dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 22h06

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