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 :

Creer dynamiquement des objets [Débutant]


Sujet :

Interfaces Graphiques

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Creer dynamiquement des objets
    B'jour,

    J'aimerais créer plusieurs objets (ici Edit_Text) en fonction d'un nombre entré par l'utilisateur. Exemple: si on entre 3 dans un Edit, il nous génère 3 Edit_Text. Je veux juste créer une interface dynamique.

    Voilà tout ce que j'ai pu coder (c'est à pourtant l'air si simple..), mais après la création de l'objet il se bloque : le test 1 est ok, l'objet est créer, mais le test n°2 ne s'effectue pas. Je trouve pas de cas similaires alors j'aimerais savoir si c'est possible à faire et pourquoi ce code peut bien bugger ?!
    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
    <div style="margin-left:40px">%l'Edit_Text où on entre le nombre de futur Edit_Text qu'on veut
    function degre_Callback(hObject, eventdata, handles)
     
    degre = get(hObject,'String');
     
    for i = 0:1: degre
     
        %test n°1 sur un label pour vérifiier l'incrémentation de la boucle
        ObjSelect = findobj(gcf,'Tag','test');
        set(ObjSelect,'String',i);
     
        % Création de l'objet Uicontrol Edit_Text
        handles(i)=uicontrol('style','edit',...
        'units','normalized',...
        'position',[(0.09+i) 0.72 0.03 0.035],...
        'string',num2str(i),...
        'tag',num2str(i));
     
        %test n°2 pour controler que la bonne création de l'objet
        ObjSelect = findobj(gcf,'Tag','test');
        set(ObjSelect,'String','Objet(s)Creer');
     
    end</div>
    En erreur il me dit cela :
    ??? Assignment between unlike types is not allowed.

    Error in ==> Polyno>degre_Callback at 49
    handles(i)=uicontrol('style','edit',...

    Error in ==> gui_mainfcn at 95
    feval(varargin{:});

    Error in ==> Polyno at 17
    gui_mainfcn(gui_State, varargin{:});

    ??? Error using ==> Polyno('degre_Callback',gcbo,[],guidata(gcbo))
    Assignment between unlike types is not allowed.

    ??? Error while evaluating uicontrol Callback
    Si ça peut aider....

    Merci d'avance,

  2. #2
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Points : 1 256
    Points
    1 256
    Par défaut
    Salut,

    J'ai deux questions :


    handles
    est bien initiée ?

    tu fait handles(0) pour i =0 ?

    ++

  3. #3
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Première chose : chez MATLAB les indices commencent à 1 jamais à 0.
    Etonnant d'ailleurs que tu n'aies pas eu plutôt ce message d'erreur :Index into matrix is negative or zero.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci ^_^

    En effet les indices commencent à 1 pas à 0, j'ai juste modifier ma boucle c'est parfait.
    Et sinon le bug vient bien de l'initialisation du handles (parce que ça s'initialise en fait je me suis toujours arrêter sur la définition d'objet courant ). Lorsque je remplace par exemple : par ça me créer 51 nouveau Edit (serait-ce un maximum ?!) en respectant le déplacement les bon tags et tout.
    Donc je n'est plus qu'à me renseigner là dessus ça aide vraiment de savoir par où chercher, merci beaucoup, problème résolu j'éditerais quand j'aurais la solution

  5. #5
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Citation Envoyé par Uragiru Voir le message
    Lorsque je remplace par exemple : par ça me créer 51 nouveau Edit (serait-ce un maximum ?!)
    Je ne comprends pas ta question entre parenthèses.
    Tu as essayer avec degre > 51 et ça s'arrête quand même à 51, c'est ça ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Non, non en degré j'avais rentré 3 mais qu'importe le degré que je rentre il me fais toujours 51 Edit_Text, alors je me demandais pourquoi il s'arrêtait toujours à ce nombre, si il n'y avais pas une limite d'objets possible à insérer

  7. #7
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    Citation Envoyé par Uragiru Voir le message
    Non, non en degré j'avais rentré 3 mais qu'importe le degré que je rentre il me fais toujours 51 Edit_Text, alors je me demandais pourquoi il s'arrêtait toujours à ce nombre, si il n'y avais pas une limite d'objets possible à insérer
    A ma connaissance non. C'est pour ça que c'est bizarre. Mais si pour l'instant ça te convient comme ça, on cherchera éventuellement plus tard

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Réussi ! Pfiou... je met le code tout commenter ^_^ Quand on entre un nombre ça génère le nombre d'EDIT qu'on souhaite, et dès qu'on retape un nouveau nombre ça supprime les anciens EDIT avant d'en recréer le nombre désiré (avec un champs supplémentaire "Cste" dont j'avais besoin)

    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
    54
    55
    56
    57
    58
    %Edit dans lequel on entre son degré du polynôme
    function degre_Callback(hObject, eventdata, handles)
     
    %se sert du degre poly enregistre dans label pour effacer objets
    ObjSelect = findobj(gcf,'Tag','RappelDeg');
    AncienDeg = str2num(get(ObjSelect,'String'));
     
    %Si ce n'était pas un degré 0 on supprime les Edit qui avaient été générés
    if AncienDeg ~= 0
     
        %supprime un à un les Edit créer la dernière fois
        for a = 1:1:9 %9 parce que j'ai limité l'Edit à un caractère mais devrait être AncienDeg ce qui ne marche pas...
        ObjSelect = findobj(gcf,'Tag',num2str(a));
        delete(ObjSelect);
        end
     
        %Efface aussi le label de la Cste
        ObjSelect = findobj(gcf,'Tag','100');
        delete(ObjSelect);
     
        %test étapes bien effectuée sort bien de la condition
        %ObjSelect = findobj(gcf,'Tag','test');
        %set(ObjSelect,'String','Suppression effectuée');
     
    end
     
    %récupère le nombre d'Edit qu'on souhaite concevoir
    degre = str2num(get(hObject,'String'));
     
    if degre == 0
        % Edit de la Cste si choisi degré 0 (condition qui rentrait pas à cause
        % de la boucle car handles(0) n'existe pas)
        handles.cstEdit(1)=uicontrol('style','edit',...
        'units','normalized',...
        'position',[0.09 0.72 0.05 0.035],...
        'string','Cste',...
        'tag','100');
    else
        for i = 1:1:degre
            % Création du nombre d'Edit_Text qu'on souhaitait
            handles.newEdit(i)=uicontrol('style','edit',...
            'units','normalized',...
            'position',[(0.09+0.04*i) 0.72 0.03 0.035],...
            'string',num2str(i),...
            'tag',num2str(i));
        end
        % Edit de la Cste en plus du nombre de degré
        handles.cstEdit(1)=uicontrol('style','edit',...
        'units','normalized',...
        'position',[(0.09+0.04*(degre+1)) 0.72 0.05 0.035],... %(0.09+0.04*(degre+1) pour placer le dernier Label à la suite des autres
        'string','Cste',...
        'tag','100');
    end
     
    %mémorise le degre du poly dans un label -_^ pas trouvé d'autres moyen de
    %récupérer cette donnée
    ObjSelect = findobj(gcf,'Tag','RappelDeg');
    set(ObjSelect,'String',num2str(degre));

  9. #9
    Expert éminent sénior
    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
    Points : 14 828
    Points
    14 828
    Par défaut
    C'est bien

    Alors quelques idées :
    Au lieu d'utiliser la propriété String pour stocker ton ancien degré, tu peux utiliser la propriété UserData d'un objet (celui que tu appelles Label par exemple ou même celui avec le Tag 100)
    Tu peux aussi utiliser la structure handles qu'il ne faut pas oublier de mettre à jour avec guidata.

    Si ton objet de type Edit avec le Tag 100 doit toujours exister pourquoi le supprimer pour le recréer à chaque fois ?
    => Tu peux le créer à l'ouverture de la fenêtre avec la propriété Visible à Off et dans le callback changer ses propriétés suivant la valeur de degré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ~degre %pareil que degre==0
       position = [0.09 0.72 0.05 0.035];
    else
       position  = [(0.09+0.04*(degre+1)) 0.72 0.05 0.035];
    end
    set(findobj(gcf,'Tag','100'),...
    'Visible','on',...
    'Position',position);
    Pour info il y a sur ce site des tutoriels sur la création des interfaces graphiques :Interfaces Graphiques (GUI)

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

Discussions similaires

  1. Créer dynamiquement des objets Java
    Par choko83 dans le forum Débuter avec Java
    Réponses: 15
    Dernier message: 02/05/2008, 14h53
  2. Réponses: 1
    Dernier message: 17/04/2007, 14h43
  3. Créer une GUI et insérer dynamiquement des objets
    Par nix74 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 25/11/2006, 09h04
  4. [RCP]Creer dynamiquement des perspectives
    Par remax_ren dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 26/05/2006, 16h09
  5. [VBA-E] Est il possible de creer dynamiquement des controles en VBA
    Par bbkenny dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 13/08/2004, 20h04

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