(POO) destructeur de listener dans une classdef veut un "string as argument"
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):
Citation:
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)
Citation:
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)
Citation:
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:
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:
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:
1 2 3
| for i=1:k
el{i}=addlistener(...);
end |
ensuite, je fais un delete en boucle:
Code:
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