1

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は、[ロード]ボタンをクリックした後もデフォルトのプロパティ値を保持します。

  1. gnoviceによって提案されたようにsetを使用するようにロード方法を変更すると、次のエラーがスローされます

    ??? ==>を使用した場合のエラーFujiCalibrationからdoubleに変換を設定することはできません。

    プロパティごとにメソッドを設定/取得しましたが、のように

    method set.image(self,II)
       % ... some data validation code ...
       self.image = II
    end
    
  2. Fooz氏が提案したようにループを使用して各フィールドを設定することは、実際にはオプションではありません。私のフルクラスには、設定時にエラーをスローするパブリック定数があるためです。

各フィールドを個別に設定するコードを手作業で処理する必要がないソリューションを探しています。この時点でそれが唯一の可能性のようですが。

4

3 に答える 3