1

次のメソッドが定義されているクラス管理のGUIを作成しました

function h = make_figure(this)
    h = figure('CloseRequestFcn',@this.close_figure);
    this.openFigures(end+1) = h;
end

function close_figure(this, src, event)
    this.openFigures(this.openFigures == src) = [];
    delete(src);
end

GUIの存続期間中、上記の方法を使用して、多くの図が作成され、閉じられます。今、奇妙な部分...

MATLABの[現在のフォルダー]ウィンドウで(myfigure.fig)などのFigureファイルをダブルクリックしてから閉じようとすると(GUIがまだ動作している間に)close_figure、GUIのクラスのメソッドが実行されますh = figure('CloseRequestFcn',@this.close_figure);make_figure方法!!!これは最初の奇妙な部分です。2番目の奇妙な部分は、コードの意図しない部分が実行されても、コマンドthis.openFigures(this.openFigures == src) = [];が実際にはthis.openFigures変更されないままであり、実際にclose_figuredelete(src)それが望ましいことだけであるため、問題が発生しないことです。上記にもかかわらず、私のプログラムは動作します...上記が起こった後は奇妙です。

figureコマンドウィンドウを押して閉じても、すべて問題なく、close_figureメソッドが実行されないことに気づきました。この問題は、GUIのクラスによって作成された.figファイルを開いたときにのみ明らかになります。

何か案は?

4

2 に答える 2

0

あなたが説明したシナリオを試したところ、奇妙な動作は見られません。クラスのインスタンスを作成し、それを使用してFIGを作成し、「CurrentFolder」ファイルブラウザからFIGファイルを開いて閉じます。

これが私が使用したクラス定義です:

classdef MyFigureClass < handle
    properties
        openFigures = [];
    end

    methods
        function h = make_figure(obj)
            h = figure('CloseRequestFcn',@(src,evt) close_figure(obj,src,evt));
            obj.openFigures(end+1) = h;
        end

        function close_figure(obj, src, evt)
            obj.openFigures(obj.openFigures == src) = [];
            delete(src);
        end

    end
end

(Windows XP 32ビットのR2012aで​​テスト済み。)


編集

わかりました、私は問題が何であるかを知っていると思います。再現する手順は次のとおりです。まず、上記のクラスに次のメソッドを追加します。

function save_figure(obj, idx)
    saveas(obj.openFigures(idx), sprintf('fig%02d.fig',idx))
end

クラスラッパーを使用して、Figureを作成し、FIGファイルに保存します。

f = MyFigureClass();
f.make_figure()
f.save_figure(1)       %# creates fig01.fig

次に、ワークスペースをクリアclear allし、クラス定義ファイルMyFigureClass.mを他のフォルダー(パス上にないもの)に移動します。保存したフィギュアをロードしようとするhgload fig01.figと、エラーがスローされます。

Warning: Cannot load an object of class 'MyFigureClass':
Its class cannot be found. 
> In C:\Program Files\MATLAB\R2012a\toolbox\matlab\graphics\hgload.p>localLoadFile at 167
  In C:\Program Files\MATLAB\R2012a\toolbox\matlab\graphics\hgload.p>hgload at 59
  In openfig at 72
  In open at 159
  In uiopen at 196 

強制的に閉じるには、次のコマンドを発行する必要があります。

close all force

EDIT2

(コメントで述べられているように)1つの解決策は、保存する直前に、figurecloseコールバック関数をリセットすることです。save_figure上記の関数を変更した方法は次のとおりです。

function save_figure(obj, idx)
    %# backup callback function
    fcn = get(obj.openFigures(idx),'CloseRequestFcn');

    %# set default callback function
    set(obj.openFigures(idx),'CloseRequestFcn','closereq')

    %# save figure
    saveas(obj.openFigures(idx), sprintf('fig%02d.fig',idx))

    %# restore callback function
    set(obj.openFigures(idx),'CloseRequestFcn',fcn)
end
于 2012-06-02T21:55:36.827 に答える
0

ここには、他の人が直面する可能性のある関連する問題があることを指摘したいと思います。gui.figファイルをダブルクリックしてGUIを開かないでください。オープニング関数が呼び出されることはないため、これは望ましい動作ではありません。私たちの多くが実行しないコードがそこにある場合、別の副作用として、handles変数も適切に設定されません。

最初にGUIDEで開き、[実行]をクリックするか、gui.mファイルを直接実行する必要があります。これにより、目的の結果が得られ、GUIは意図したとおりに機能します。

于 2014-01-15T10:05:19.750 に答える