Bonjour,

Toujours dans la même veine que le message précedent,

Je veux construire le "destructeur" de ma classe mainWin, laquelle contient entre autres des handles vers des objets window0. En effet, les instances internes de classes semblent conservées par MATLAB lorsque je commande un "delete(instance de mainWin)" pour modifier la classe. Donc le destructeur doit assurer la destruction des sous-objets. Mais j'obtiens l'erreur suivante (le texte en rouge):

the delete function of a window0 object was called
the delete function of a window0 object was called
the delete function of a window0 object was called
the delete function of a window0 object was called
the delete function of a window0 object was called
(ça, c'est le disp que j'ai inclus dans la classe window0)
justqu ici, tout va bien
(ça, c'est le disp dans la classe mainWin qui m'indique que les objets window0, dont les handles sont enregistrés dans le tableau "mainWinArray", ont été détruits sans gêne)
Warning: The following error was caught while executing 'mainWin' class destructor:
Argument must contain a string.
(ça, c'est le signal d'erreur que j'obtiens. D'accord, il n'y a pas écrit "error", mais le destructeur s'arrête quand même et le reste de la fonction "delete" n'est pas exécuté, comme j'ai pu le constater en suivant le débogueur pas à pas. Ainsi: la commande "delete(obj.lh)" interrompt le destructeur. lh est un tableau de "listener"

Voici le code de mes deux classes.

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
classdef mainWin < handle  
 properties 
       myfig
       mainWinArray
       activeWin
       lh
   end
    methods
        function obj=mainWin(varargin)
            obj.myfig=figure;
            for i=1:5
                a1=[0.8+i/60 0.8-i/60 0.9+i/100];
                fprintf('color: %f  -- %f -- %f \n',a1(1),a1(2),a1(3));
                obj.mainWinArray{i}=window0(obj.myfig,a1);
                obj.lh{i}=addlistener(obj.mainWinArray{i},'click_on_pushB',@obj.changeTheSet);
            end
            for i=2:5
                obj.activeWin=zeros(length(obj.mainWinArray),1);
                obj.activeWin(1)=true;
                set(obj.mainWinArray{i}.panel,'visible','off');
            end
            
        end
        function delete(obj)
           for i=1:length(obj.mainWinArray)
               delete(obj.lh{i});
               delete(obj.mainWinArray{i});
           end
           disp('justqu ici, tout va bien');  
         delete(obj.lh);         
  delete(obj.mainWinArray);
           delete(obj.activeWin);
           close(obj.myfig);
           delete(obj.myfig);

        end
        function changeTheSet(varargin)
            tmp0=find(obj.activeWin);
            set(obj.mainWinArray{tmp0}.panel,'visible','off');
            obj.activeWin=circshift(obj.ativeWin,[1 0]);
            tmp0=find(obj.activeWin);
            set(obj.mainWinArray{tmp0}.panel,'visible',true);
        end
    end
end
(classe window0:
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
classdef window0 < handle  
  properties
        panel
        eventbutton
    end
    methods
        function obj=window0(varargin)
            switch nargin
                case 0,
                    h=gcf;
                    col=[0.8 0.8 0.89];
                case 1,
                    h=varargin{1};
                    col=[0.8 0.8 0.89]
                case 2,
                    h=varargin{1};
                    col=varargin{2};
                    
            end
            obj.panel=uipanel(h,'units','normalized',...
                'Position',[0.1 0.1 0.8 0.8],...
                'BackGroundColor',col,...
                'Title','test panel for  object');
            obj.eventbutton=uicontrol('Parent',obj.panel,...
                'Style','Pushbutton',...
                'String','click here',...
                'Callback',@obj.returnFunction);  %returnFunction
        end
        function delete(obj)
            delete(obj.eventbutton);
            delete(obj.panel);
            disp('the delete function of a window0 object was called'); 
       end
        function returnFunction(obj,varargin)
            disp('is called');
%             a1=get(varargin{1});
            notify(obj,'click_on_pushB');
            disp('was notified');
        end
    end
    events
        click_on_pushB
    end
end
Dans la doc, il est écrit que pour supprimer un listener, il suffit d'écrire:
delete(el), où el a été déclaré comme: el=addlistener(...);Or, ici, c'est ainsi que je les ai déclaré:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
for i=1:k
    el{i}=addlistener(...);
end
ensuite, je fais un delete en boucle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
for i=1:k
    delete(el{i});
end
Quelqu'un peut-il m'indiquer la source de l'erreur, s'il vous plaît? C'est à dire, pourquoi la syntaxe du destructeur de mainWin semble refusée par MATLAB? et comment corriger cela?

Je ne sais pas si c'est important, mais en regardant les contenus des variables avec openvar pendant l'exécution du destructeur grâce au débuggeur, je constate que les tableaux de handles mainWinArray et ld, dans obj, contiennent toujours des: < 1 by 1 window0> (resp < 1by 1 listener>) dans chaque cellule, même si le contenu de ces window0 (resp listener) est nul quand je double-clique dessus dans la fenêtre openvar (ce qui est positif car la fonction delete vient théoriquement de les supprimer avec des delete). Mais je ne comprends pas bien pourquoi le contenu des cellules indique toujours des objets window0 (resp des listener).

Merci d'avance,
Oodbae

PS: vous faîtes du beau travail à developpez.com