ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Figure クローズ リクエスト関数

はじめに

MATLAB® では、以下の場合に、Figure の CloseRequestFcn で定義されたコールバック ルーチンが実行されます。

  • Figureに対して、close コマンドを実行した場合

  • 可視 Figure が存在しているときに、MATLAB を終了した場合、(Figure の Visible プロパティを off に設定した状態で MATLAB を終了すると、MATLAB はそのクローズ リクエスト関数を実行しません。Figure が削除されるだけです) 。

  • close box または close menu 項目を使って、ウィンドウ システムから Figure を閉じた場合

クローズ リクエスト関数によって、Figure の終了または MATLAB セッションの終了を妨げたり遅らせたりすることができます。これは、次のような動作を実行するのに役立ちます。

  • ユーザーが動作を確認することを要求するダイアログ ボックスを表示する

  • 閉じる前にデータを保存する

  • MATLAB で構築したグラフィカル ユーザー インターフェイスの意図しないコマンド ラインからの削除を避ける

CloseRequestFcn に対する既定のコールバック ルーチンは、closereq という関数です。それには、次のステートメントが含まれています。

if isempty(gcbf)
   if length(dbstack) == 1
      warning('MATLAB:closereq',...
      'Calling closereq from the command line is now obsolete,...
          use close instead');
   end
   close force
else
   delete(gcbf);
end

このコールバックは、HandleVisibility に従うため、Figure ハンドルを指定せずに close コマンドを使用しても、Figure を削除しません。以下に例を示します。

h = figure('HandleVisibility','off')
close     % figure does not close
close all % figure does not close
close(h)  % figure closes

MATLAB 環境の終了

MATLAB を終了すると、現在の Figure の CloseRequestFcn が呼び出され、Figure を削除すると、Root の子オブジェクトのリスト (すなわち、Root の Children プロパティ) の次の Figure が現在の Figure となり、その CloseRequestFcn が次に実行されます。gcbf を使用すると、ユーザーが記述したクローズ リクエスト関数から Figure ハンドルを指定することができます。

Figure を削除しないように、Figure の CloseRequestFcn を変更すると、その Figure に対して close コマンドを発行しても Figure は削除されません。さらに MATLAB を終了しようとしても、MATLAB が Figure を削除しないため、その終了は中止されます。

クローズ リクエスト関数でのエラー

CloseRequestFcn の実行時にエラーが発生すると、MATLAB は閉じる動作を中止します。quit または exit コマンドの実行後に Figure の CloseRequestFcn でエラーが発生した場合、MATLAB は操作を中止し、必要なアクションが実行できるようにします。

CloseRequestFcn コールバックのエラーに関らず無条件に MATLAB を終了するには、quit force を使用します。

クローズ リクエスト関数の書き換え

delete コマンドは、その CloseRequestFcn の値に関係なく、指定した Figure を常に削除します。たとえば、次のステートメントを考えます。

delete(get(0,'Children'))

は、ハンドルが隠されていない (すなわち、Figure の HandleVisibility プロパティが off に設定されていない) すべての Figure を削除します。ハンドルが隠されているかどうかに関係なく、すべての Figure を削除するには、Rootの ShowHiddenHandles プロパティを on に設定できます。その場合、Root の Children プロパティは、すべての Figure のハンドルを含みます。たとえば、ステートメント

set(0,'ShowHiddenHandles','yes')
delete(get(0,'Children'))

は、すべての Figure を無条件に削除します。

CloseRequestFcn の再定義

CloseRequestFcn は、関数ハンドルとして定義する必要があります。たとえば、次の例を考えてみましょう。

set(gcf,'CloseRequestFcn',@my_closefcn)

ここで、@my_closefcn は、関数 my_closefcn を参照する関数ハンドルです。

クローズ リクエスト関数が関数 delete または関数 close を呼び出さない限り、MATLAB により Figure が閉じられることはありません(非破壊的なクローズ リクエスト関数を使用してウィンドウを作成した場合は、コマンド ラインから関数 delete(figure_handle) を随時呼び出すことができます)。

クローズ リクエスト関数が便利な用途の 1 つとして、閉じる操作を確認するためにユーザーにダイアログ ボックスを表示することができます。次の関数は、この方法を示しています。

function my_closereq(src,evnt)
% User-defined close request function 
% to display a question dialog box 
   selection = questdlg('Close This Figure?',...
      'Close Request Function',...
      'Yes','No','Yes'); 
   switch selection, 
      case 'Yes',
         delete(gcf)
      case 'No'
      return 
   end
end

CloseRequestFcn を使用して、Figure を作成します。

figure('CloseRequestFcn',@my_closereq)

この関数を既定のクローズ リクエスト関数にするには、既定値をルート レベルで設定します。

set(0,'DefaultFigureCloseRequestFcn',@my_closereq)

MATLAB では、この後に作成するすべての Figure の CloseRequestFcn で、この設定が使用されるようになります。

この情報は役に立ちましたか?