MATLAB(R2009a)UIに保存/読み込み関数を実装しようとしています。私のオブジェクトは、オブジェクトのユーザーインターフェイスを生成するレイアウト関数を実装しています。保存/ロードボタンのコールバックを実装しようとしています。保存ボタンが機能し、後でロードできる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
UIレイアウトは、基本的に次のような別のファイル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
注: MATLABR2009aを使用しています。
コードはエラーをスローしません。私がコードを書いた方法では、親オブジェクト( selfで表される)は、メソッドload_objectでLOADを呼び出した後も更新されません。だから、これは望ましい効果があります:
>> var = myObj;
>> var.load_object;
ただし、LayoutFcn.mで定義されているloadingMyObjectコールバック をこのように使用すると
>> var = myObjl
>> var.LayoutFcn
-> click Load button to call _loadingMyObject_
varプロパティには影響しません。つまり、varは、[ロード]ボタンをクリックした後もデフォルトのプロパティ値を保持します。
gnoviceによって提案されたようにsetを使用するようにロード方法を変更すると、次のエラーがスローされます
??? ==>を使用した場合のエラーFujiCalibrationからdoubleに変換を設定することはできません。
プロパティごとにメソッドを設定/取得しましたが、のように
method set.image(self,II) % ... some data validation code ... self.image = II end
Fooz氏が提案したようにループを使用して各フィールドを設定することは、実際にはオプションではありません。私のフルクラスには、設定時にエラーをスローするパブリック定数があるためです。
各フィールドを個別に設定するコードを手作業で処理する必要がないソリューションを探しています。この時点でそれが唯一の可能性のようですが。