GUIDATA does not trasfer data in GUIDE with subfunctions.
Afficher commentaires plus anciens
I have a simple GUIDE with 2 pushbuttons. Button #1 plots a sine graph and button #2 adds a "draggable" vertical line to the graph. Idea is based on the link bellow [1]
I'm using guidata to transfer data between subfunctions and callbacks in the `GUIDE`. But one of the shared variables (mousedown) does not transmit between the callbacks. What causes the loss of data transfer between the subfunctions in GUIDE?
Here are the callbacks with their subfunctions (the entire code is attached):
% ######### Callbacl 1: Graph SIN function
function pushbutton_plot_Callback(hObject, eventdata, handles)
clc;
open_figs_h = get(0,'children');
close(open_figs_h(2:end));
x = -pi:0.01:pi;
y = sin(x);
fig_h = figure('units','normalized','outerposition',[0.2 0.2 .5 .5],'WindowButtonMotionFcn', @MouseMove, 'WindowButtonUpFcn', @MouseUp );
axis_h = axes('parent',fig_h,'position',[0.1 0.1 .8 .8]);
line('parent',axis_h,'xdata',x,'ydata',y);
handles.axis_h = axis_h;
guidata(hObject,handles);
% MouseUp and MouseMove subfunctions in callback 1
function MouseUp(h,event) %#ok<*INUSD>
mousedown = false;
end
function MouseMove(h,event)
if isfield(handles,mousedown)
mousedown = handles.mousedown;
else
mousedown = false;
end
if mousedown
cp = get ( axis_h, 'CurrentPoint' );
vertline_h = handles.vertline_h;
set ( vertline_h, 'XData', [cp(1,1) cp(1,1)] );
end
end
end
%######### Callbacl 2: Graph movables vertical line
function pushbutton_vertline_Callback(h, eventdata,handles)
axis_h = handles.axis_h;
vertline_h = line('parent',axis_h,'xdata',[1 1],'ydata',[-1 1], 'ButtonDownFcn', @mouseDown );
handles.vertline_h = vertline_h;
guidata(h,handles)
% MouseMove subfunction in callback 2
function mouseDown(hObject,event)
mousedown = true;
handles.mousedown = mousedown;
guidata(hObject,handles)
end
end
Réponse acceptée
Plus de réponses (1)
Walter Roberson
le 28 Oct 2016
0 votes
In order for a variable to be shared it must be initialized in the containing routine before the declaration of the subfunctions that share it. It then becomes shared only with the containing and contained routines.
You are not using the mousedown variable in a shared way. Even if you had initialized it before the subfunctions, in the second subfunction you test whether handles has a field with that name and if so then you grab that value and if not then you force the variable to false. Any shared value would be overwritten. No other routines read the shared value so that is not for the benefit of some other routine.
Consider too that you do not delete out of handles when you poll in the nested function so the next time through you would pull from the handles again. You have no code that sets the handles version to false or removes it, so once set the handles version is going to remain true.
1 commentaire
Alborz Sakhaei
le 29 Oct 2016
Catégories
En savoir plus sur Modeling dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!