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):
(ça, c'est le disp que j'ai inclus dans la classe window0)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 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)justqu ici, tout va bien
(ç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"Warning: The following error was caught while executing 'mainWin' class destructor:
Argument must contain a string.
Voici le code de mes deux classes.
(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
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
Dans la doc, il est écrit que pour supprimer un listener, il suffit d'écrire:
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
delete(el), où el a été déclaré comme: el=addlistener(...);Or, ici, c'est ainsi que je les ai déclaré:
ensuite, je fais un delete en boucle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 for i=1:k el{i}=addlistener(...); 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?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 for i=1:k delete(el{i}); end
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
Partager