Существует еще одна возможность из-за объектно-ориентированной природы MATLAB . Вы можете определить свой собственный класс дескриптора и передать его на этапе инициализации каждому обратному вызову в качестве дополнительного аргумента:
classdef Data<handle
properties (Access=public)
Val;
end
end
function SimpleGui
data = Data();
hLoad = uicontrol('Style', 'push', 'String', 'Push me', ...
'Callback', {@callback data});
data.Val = 5;
end
function callback(hSource, event, data)
data.Val = data.Val+1;
disp(data.Val);
end
Еще один вариант:
Кроме того, что касается guidata
/ appdata
(как описано @Chris), его можно улучшить следующим образом:
Создание инкапсулирующего обратного вызова, который всегда получает и устанавливает guidata
:
function CallbackWrapper(hObj,evt,func)
data = guidata(hObj);
data = func(hObj,evt,data);
guidata(hObj,data);
end
Теперь ваши обратные вызовы должны быть определены следующим образом (обратите внимание на другую подпись):
function SimpleGui
hSave = uicontrol('Style', 'push', 'String', 'Push me', ...
'Callback', {@CallbackWrapper @myCallBack});
data.x = 1;
guidata(hSave,data);
end
function data = myCallBack(hObj,evt,data)
data.x = data.x + 1;
disp(data.x);
end