Я пытаюсь реализовать функции сохранения / загрузки в пользовательском интерфейсе MATLAB (R2009a). Мой объект реализует функцию макета, которая генерирует пользовательский интерфейс для объекта. Я пытаюсь реализовать обратные вызовы для кнопок сохранения / загрузки. Кнопка сохранения работает и сохраняет объект в файл MAT, который можно загрузить позже.
Моя проблема заключается в реализации обратного вызова для кнопки загрузки. Кажется, я не могу загрузить данные из файла MAT и обновить свойства нового объекта. Будем очень благодарны за любые предложения о том, где я иду не так, как и за действиями, которые я могу предпринять.
Важный код - это мой файл определения класса. Конечно, мой фактический объект реализует гораздо больше свойств и методов, но вот скелет того, что у меня есть
classdef myObj<handle
properties
image % property holds a matlab image matrix
objCount % number of objects in image
end
properties(Transient=true)
parent
children
end
methods
function myObj
% empty constructor
end
function load_object(self)
% ask user for file
[fileName, pathToFile]=uigetfile('*.mat','Select .mat file');
tmp = load(fullfile(pathToFile,fileName);
if isfield(tmp,'obj')
self = tmp.obj;
end
end
LayoutFcn(self) % UI layout function
end
end
Макет пользовательского интерфейса определен в отдельном файле LayoutFcn.m , который в основном выглядит как
function LayoutFcn(self)
% create figure window and add various UI elements
...
% create load button
self.children(end+1) = uipushtool('Parent',hToolbar, ... % set parent to current toolbar
'CData',iconRead('open-document.png'), ... % read icon image from file
'Tag','uiLoad', ...
'ClickedCallback',@(hObj,event)loadingMyObject(self,hObj,event));
% create save button
self.children(end+1) = uipushtool('Parent',hToolbar, ... % set parent to current toolbar
'CData',iconRead('save-document.png'), ... % read icon image from file
'Tag','uiSave', ...
'ClickedCallback',@(hObj,event)savingMyObject(self,hObj,event));
...
end
function loadingMyObject(self,hObj,event)
self.load_object; % call load_object method defined above in class definition
end
function savingMyObject(self,hObj,event)
[fileName,pathName]=uiputfile('.mat','Save object to MAT file');
obj = self;
save(fullfile(pahtName,fileName),'obj')
end
Примечание: Я использую MATLAB R2009a.
Код не выдает никаких ошибок. То, как я написал код, родительский объект (представленный self ) не обновляется после вызова LOAD в методе load_object . ТАК, это имеет желаемый эффект:
>> var = myObj;
>> var.load_object;
Однако, если я использую обратный вызов loadingMyObject , определенный в LayoutFcn.m таким образом
>> var = myObjl
>> var.LayoutFcn
-> click Load button to call _loadingMyObject_
не влияет на свойства var . То есть var по-прежнему будет иметь значения свойств по умолчанию после нажатия кнопки «Загрузить».
При изменении методов загрузки для использования установить , как предложено gnovice , выдает следующую ошибку
* * ??? тысяча сорок-семь Ошибка при использовании ==> set
Преобразование в double из FujiCalibration невозможно.
хотя я установил / получил методы для каждого свойства; как в
method set.image(self,II)
% ... some data validation code ...
self.image = II
end
Использование цикла для установки каждого поля в соответствии с предложением Mr Fooz на самом деле не вариант, так как мой полный класс имеет открытую константу, которая выдает ошибку, когда они установлены.
Я ищу решение, которое позволило бы избежать необходимости вручную задавать код для каждого поля. Хотя на данный момент это кажется единственной возможностью.