1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : février 2016
    Messages : 1
    Points : 1
    Points
    1

    Par défaut Problème avec utilisation de la fonction "getcallbackobject"

    Bonjour à toutes et à tous,

    Je suis actuellement en train de développer un script sur scilab me permettant de faire des traitements sur un certain type de courbes.
    Afin de rendre le programme plus simple à utiliser j'ai souhaité rajouter une interface graphique.

    Et c'est la où commence mes ennuis. J'ai bien crée mon interface graphique, le seul souci c'est qu'au moment ou je clique sur mon bouton qui me permet de charger mon fichier Excel (fait donc appelle à la fonction "chgmt_fichier(handles)"), j'ai cette erreur!!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    at line       7 of function chgmt_fichier called by :  
    en %oldgcbo = gcbo; end;gcbo = getcallbackobject(351);chgmt_fichier(handles);if exists("%oldgcbo") then gcbo = %oldgcbo; else clear gcbo; end
    while executing a callback
    Je me suis un peu documenter sur la fonction "getcallbackobject" mais je dois avouer que j'ai pas bien compris la manière dont je devais l'intégrer dans mon code.
    Quelqu'un pourrait il m'aider à solutionner mon pb svp?

    Voici mon code :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
     
    clear all
    clc
     
    // param global de la fenêtre 
    global margin_x margin_y ; 
    global frame_w frame_h plot_w plot_h; 
     
    Moyenne_Monte = 0;
    Tps_phase_Monte = 0;
    Moyenne_Descente = 0;
    Tps_phase_Descente = 0;
     
     
    // init des params fenêtre
    frame_w = 300; frame_h = 550; // width et height du cadre
     
    margin_x = 15; margin_y = 15; // Marges Horizontale et verticale pour les elements
    defaultfont = "arial"; // police par defaut 
     
    app = scf(100001); // Creation de ma fenêtre avec id=100001 
     
     
    // Background et nom fenêtre
    app.background = -2; 
    app.figure_position =[150 40]; 
    app.figure_name = gettext("Prog test"); 
     
     
    // Suppression barre de menu Scilab
    delmenu(app.figure_id,gettext("&File")); 
    delmenu(app.figure_id,gettext("&Tools")); 
    delmenu(app.figure_id,gettext("&Edit")); 
    delmenu(app.figure_id,gettext("&?")); 
    toolbar(app.figure_id,"off"); 
     
    // nouveau menu
    h1 =uimenu("parent",app, "label",gettext("Charger")); //, "callback","chgmt_fichier" 
    h2 =uimenu("parent",app, "label",gettext("Fermer"));//, "callback", "fermer_appli()"
    h3 =uimenu("parent",app, "label",gettext("Calculer"));//, "callback", "Calcul()"
    h4 =uimenu("parent",app, "label",gettext("A propos"));//, "callback","Apropos()"
     
     
    handles.dummy = 0;
    handles.Charger = uicontrol('parent',app,'Style','pushbutton','Units','normalized','Position',[0.7 0.65 0.2 0.1],'String','Charger','Callback','chgmt_fichier(handles)');
     
    handles.Calculer = uicontrol('parent',app,'Style','pushbutton','Units','normalized','Position',[0.7 0.50 0.2 0.1],'String','Calculer','Callback','Calculer');
     
    handles.Fermer = uicontrol('parent',app,'Style','pushbutton','Units','normalized','Position',[0.7 0.35 0.2 0.1],'String','Fermer','Callback','fermer_appli');
     
    handles.A_propos = uicontrol('parent',app,'Style','pushbutton','Units','normalized','Position',[0.7 0.20 0.2 0.1],'String','A propos','Callback','Apropos');
     
     
    sleep(500); 
     
    // creation du cadre [Paramettres recherchés]
    cadre1 =uicontrol("parent",app, "relief","groove","style","frame", "units","pixels", "position",[margin_x margin_y frame_w frame_h-115], "horizontalalignment","center", "background",[1 1 1], "tag","frame_control"); 
     
    // titre du cadre 1
    titre_cadre1 =uicontrol("parent",app, "style","text","string","Paramettres Montée", "units","pixels","position",[20+margin_x margin_y+frame_h-160 frame_w-60 20], "fontname",defaultfont, "fontunits","points","fontsize",16, "horizontalalignment","center","background",[1 1 1], "tag", "title_frame_control"); 
     
     
    // titre du cadre 2
    titre_cadre2 =uicontrol("parent",app, "style","text","string","Paramettres Descente", "units","pixels","position",[20+margin_x margin_y+frame_h-360 frame_w-60 20], "fontname",defaultfont, "fontunits","points","fontsize",16, "horizontalalignment","center","background",[1 1 1], "tag", "title_frame_control"); 
     
     
    // Ajout des paramètres 
    guih1 = frame_w-150; 
    guih1o =240; 
     
    // Ordonnancement de la liste des labels
    params1 =["Intensité moyenne (A)", "Temps phase (s)", "Intensité max (A)", "intensité min (A)"]; 
    // Ordonnancement de la liste des valeurs
    valeurs1 =[Moyenne_Monte, Tps_phase_Monte, 000, 000]; 
     
    // Positionnement des éléments
    l1 =20; l2 =120; l3 =160; 
     
    for k=1:size(params1,2)
        uicontrol("parent",app, "style","text","string",params1(k), "position",[l1,guih1-k*20+guih1o,l2,20], "horizontalalignment","left", "fontsize",14, "background",[1 1 1]);
     
        guientry1(k)=uicontrol("parent",app, "style","edit", "string",string(valeurs1(k)), "position",[l3,guih1-k*20+guih1o,150,20], "horizontalalignment","left", "fontsize",14, "background",[.9 .9 .9], "tag",params1(k));
     
    end
     
    guih2 =100; 
    guih2o =80; 
     
    params2 =["Intensité moyenne (A)", "Temps phase (s)", "Intensité max (A)", "intensité min (A)"]; 
    valeurs2 =[Moyenne_Descente, Tps_phase_Descente, 000, 000]; 
    l1 =20; l2 =120; l3 =160; 
    for k=1:size(params2,2)
        uicontrol("parent",app, "style","text", "string",params2(k), "position",[l1,guih2-k*20+guih2o,l2,20], "horizontalalignment","left", "fontsize",14, "background",[1 1 1]); 
     
        guientry2(k) = uicontrol("parent",app, "style","edit", "string",string(valeurs2(k)), "position",[l3,guih2-k*20+guih2o,150,20], "horizontalalignment","left", "fontsize",14, "background",[.9 .9 .9], "tag",params2(k)); 
     
    end
     
     
     
     
    function Apropos()
        msg =msprintf(gettext("bla bla bla")); 
        messagebox(msg, gettext("A propos"), "info", "modal");
     
    endfunction
     
     
    function fermer_appli()
        msg = gettext("Voulz vous vraiment quiter?");
        rep = messagebox(msg, gettext("Fermer application"), "question", [gettext("Oui") gettext("Non")], "modal");
        if rep==1 then
          close(app);
          exit;
        end
    endfunction
     
     
     
    function chgmt_fichier(handles)
     
        global taille data tps;
        fichierExcel = uigetfile(["*.xls"]) // chargement du fichier excel 
     
        feuilExcel = fichierExcel(1) // recuperation de la première feuille dans le fichier excel
        Noms = feuilExcel.text   // recuperation des champs comportant des caractères 
        ValeurNum = feuilExcel.value // recuprationsde champs comportant des valeurs numériques
     
        // chargement des données présentes dans les deux premières colones 
     
        PremiereCol_temps = ValeurNum(:,1)
        DeuxiemeCol_Mes_capteur = ValeurNum(:,2)
        taille = length(DeuxiemeCol_Mes_capteur)
        data = DeuxiemeCol_Mes_capteur
        tps = PremiereCol_temps
     
    endfunction
    Je vous met également un image de mon appli.
    Nom : img_fen.PNG
Affichages : 32
Taille : 19,9 Ko

    Merci d'avance pour vos réponses.
    #Synap's

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    avril 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : avril 2015
    Messages : 27
    Points : 26
    Points
    26

    Par défaut

    Bonjour,
    Le 'callback object' est l'objet appelant le callback. Quand tu clique sur 'charger', le callback object est donc handles.Charger

    Donc par exemple, si tu écrit en ligne 46 :

    handles.Calculer = uicontrol('parent',app,'Style','pushbutton','Units','normalized','Position',[0.7 0.50 0.2 0.1],'String','Calculer','Callback','gcbo.string=''test'' ');

    En cliquant sur 'calculer', tu changera le texte du bouton calculer, qui deviendra 'test' --> gcbo.string à été compris comme handles.Charger.string
    (( Nb : gcbo = getcallbaclobject
    Nb2: on notera les doubles guillemets entourant le 'test' . C'est pour qu'il soit interprété comme un caractère guillemet simple, et pas comme la fin du callback. Vu que le callback est un string, pas du code, c'est parfois très ch**nt... Donc utiliser une fonction est généralement plus pratique.
    ))

    L'intérêt principal des gcbo viens d'un autre attribut des uicontrol, le userdata
    Le Userdata permet de stocker une variable à l'intérieur d'un uicontrol. Par exemple (à mettre ligne 47+):
    a=5;
    set(handles.Calculer,'Userdata',a);
    set(handles.Calculer,'Callback','disp(gcbo.userdata); gcbo.userdata = gcbo.userdata+1');


    Tous ça pour revenir à ton erreur : j'ai aucune idée de ce qu'elle signifie. Mais très certainement, tu fait appel à une variable qui n'existe plus au moment où l'on clique sur le bouton (c'est très fréquent, avec les interfaces graphiques).
    La solution que j'utilise, même si elle est lourde et peut pratique, et de toujours mettre les arguments des fonction appelées dans les userdata : Par ex ligne 44 :

    handles.Charger = uicontrol('parent',app,'Style','pushbutton','Units','normalized','Position',[0.7 0.65 0.2 0.1],'String','Charger','Userdata','handles','Callback','chgmt_fichier(gcbo.userdata)');

    Voilà, j'espère que j'ai été clair et que cela pourra t'aider

Discussions similaires

  1. [XL-2003] Problème avec utilisation d'une fonction dans les formules
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/05/2009, 10h43
  2. Problème avec la signature des fonctions dll
    Par mdefo dans le forum MATLAB
    Réponses: 1
    Dernier message: 20/09/2006, 14h23
  3. [PL SQL] Problème avec 'case' dans une fonction
    Par divail dans le forum Oracle
    Réponses: 14
    Dernier message: 13/03/2006, 15h50

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