2013-02-28 4 views
0

Это основной вопрос, но мне сложно с ним справиться.MATLAB uicontrol callback function handle output

В принципе, у меня есть функция обратного вызова, назначенная для выбора во всплывающем меню в графическом интерфейсе. Код выглядит следующим образом:

uicontrol(mainfigure, 'Style', 'popup',... 
    'String', 'A|B|C',... 
    'Position',[850 190 200 30],... 
    'Callback', @blockset); 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

function [block] = blockset(hObj,evnt) %#ok<INUSD> 

blockval = get(hObj,'Value'); 

if blockval == 1 
    block = 'A'; 
elseif blockval == 2 
    block = 'B'; 
elseif blockval == 3 
    block = 'C'; 
end 

end 

Как вы можете видеть, это просто присвоение значения строкового различных вариантов в раскрывающемся меню. Я хочу использовать эти строки в качестве входных значений в другую функцию в сценарии (который также встроенный в UIControl обратного вызова):

uicontrol(mainscreen, 'Style', 'pushbutton',... 
    'Position',[855 300 150 50],... 
    'String', 'START',... 
    'FontSize',10,'FontWeight','bold',... 
    'BackgroundColor', [.9 .9 .9],... 
    'CallBack', {@START_Callback, block}); 

код как есть не работает. Но я не могу понять, как определить выходные данные для обратного вызова uicontrol. Я уже определил «блок» как выход для функции набора, так как я могу получить START_Callback, чтобы распознать его как вход? Каждый раз, когда я пытаюсь, он просто говорит мне, что «block» - неопределенная функция или переменная.

Есть ли что-то, что мне нужно сделать с помощью строки кода «Обратный звонок», @blockset », чтобы узнать, как это узнать из функции?

EDIT: Некоторые беглые поисковые запросы в Интернете показывают, что я, вероятно, должен использовать что-то вроде setappdata/getappdata или другой метод обходного пути. Однако я не совсем понимаю документацию по этим вопросам. Как использовать их в этой ситуации?

ответ

2

переменная блок должна была бы существовать в рабочем пространстве, когда вы делаете

uicontrol(mainscreen, 'Style', 'pushbutton',... 
    'Position',[855 300 150 50],... 
    'String', 'START',... 
    'FontSize',10,'FontWeight','bold',... 
    'BackgroundColor', [.9 .9 .9],... 
    'CallBack', {@START_Callback, block}); 

Но это возвращаемое значение из всплывающего меню вашего обратного вызова, так что вы не можете сделать это, следовательно, вашу ошибку Matlab.

Чтобы использовать setappdata и getappdata, вам нужно будет сохранить функцию «block» функции обратного вызова функции «some», которая будет видна как функции обратного вызова, так и если вы хотите быть ленивой до корневой фигуры. , например.

function [block] = blockset(hObj,evnt) %#ok<INUSD> 
    blockval = get(hObj,'Value'); 

    if blockval == 1 
     block = 'A'; 
    elseif blockval == 2 
     block = 'B'; 
    elseif blockval == 3 
     block = 'C'; 
    end 

    setappdata(0, 'block', block); 
end 

Это будет хранить переменный блок в корневой фигуру (то есть, главное окно MATLAB, обозначаемое 0), что на самом деле это не очень хорошая вещь, чтобы сделать, как все может изменить его. Вместо этого вы должны попытаться сохранить его на каком-нибудь графическом объекте, который будет отображаться для обоих обратных вызовов, например, для вашего графического интерфейса. Тем не менее, в вашем вопросе недостаточно информации о том, что я могу сделать вывод о том, что вы можете использовать, поэтому я использую корневую фигуру для иллюстративных целей.

Если вы установили свойства тега ваших объектов графического интерфейса, вы можете найти их ручки на основе этого, например. используя h = findobj('Tag','my_tag'), вы получите дескриптор графического объекта с тегом 'my_tag', который вы можете установить appdata для setappdata(h, 'var_name', var);. Я бы рекомендовал использовать это вместо элемента корневой фигуры, так как с корневой фигурой у вас нет инкапсуляции.

С учетом сказанного, то в вашей START_Callback функции, вместо того, чтобы block в качестве входного параметра, нужно использовать block = getappdata(0, 'block');, чтобы получить переменную блока в корневой фигуры, который вы установили в функции обратного вызова blockset. Так что ваша декларация кнопочный станет

uicontrol(mainscreen, 'Style', 'pushbutton',... 
    'Position',[855 300 150 50],... 
    'String', 'START',... 
    'FontSize',10,'FontWeight','bold',... 
    'BackgroundColor', [.9 .9 .9],... 
    'CallBack', @START_Callback); 

и внутри START_Callback:

function START_Callback(hObj,evnt) 
    block = getappdata(0, 'block'); 
    %... other stuff 
end