Main Content

App Designer での複数のウィンドウをもつアプリの作成

複数ウィンドウのアプリは、データを共有する 2 つ以上のアプリで構成されます。アプリ間でデータを共有する方法は、設計によって異なります。一般的な設計の 1 つは、2 つのアプリ (メインのアプリと 1 つのダイアログ ボックス) を使用するものです。通常、メインのアプリにはダイアログ ボックスを開くボタンがあります。ユーザーがダイアログ ボックスを閉じると、ダイアログ ボックスによってユーザーの選択内容がメイン ウィンドウに送信され、計算の実行および UI の更新が行われます。

A main app window and a dialog box window with a double-sided arrow between the two

これらのアプリは、異なるタイミングに異なる方法で情報を共有します。

  • ダイアログ ボックスが開かれると、メインのアプリは入力引数を使用してダイアログ ボックスのアプリを呼び出すことによって、ダイアログ ボックスに情報を渡します。

  • ダイアログ ボックス アプリでユーザーが [OK] ボタンをクリックすると、入力引数を使用してメイン アプリのパブリック関数を呼び出すことによって、ダイアログ ボックスからメイン アプリに情報が返されます。

プロセスの概要

前のセクションで説明したアプリを作成するには、2 つの別個のアプリ (メイン アプリとダイアログ ボックス アプリ) を作成しなければなりません。次に、以下の高いレベルのタスクを実行します。各タスクには複数の手順が含まれます。

  • ダイアログ ボックスへの情報の送信 — 入力引数を受け入れるダイアログ ボックス アプリに StartupFcn コールバックを記述します。入力引数の 1 つがメイン アプリ オブジェクトでなければなりません。次に、メイン アプリで、入力引数を使用してダイアログ ボックス アプリを呼び出します。

  • メイン アプリへの情報の返送 — ダイアログ ボックスのユーザーの選択に基づいて UI を更新するメイン アプリにパブリック関数を記述します。パブリック関数であるため、ダイアログ ボックス アプリで呼び出して値を渡すことができます。

  • ウィンドウを閉じるときの管理 — Windows が終了したときに保守タスクを実行する両方のアプリに CloseRequest コールバックを記述します。

このプロセスのすべてのステップの実装を確認するには、ダイアログ ボックスを開くプロット アプリを参照してください。

アプリを Web アプリとして展開する場合 (MATLAB® Compiler™ が必要)、複数のアプリ ウィンドウを作成することはサポートされません。代わりに、複数のタブをもつ単一ウィンドウのアプリを作成することを検討してください。詳細については、Web アプリの制限とサポートされていない機能 (MATLAB Compiler)を参照してください。

ダイアログ ボックスへの情報の送信

メイン アプリからダイアログ ボックス アプリに値を渡すには、次の手順を実行します。

  1. ダイアログ ボックス アプリで、コールバック関数 StartupFcn の入力引数を定義します。[コード ビュー][エディター] タブで、[アプリの入力引数] をクリックします。[アプリの詳細] ダイアログ ボックスで、入力引数の変数名のコンマ区切りのリストを入力します。以下の入力を指定します。

    • メイン アプリ — メイン アプリの関数とプロパティをダイアログ ボックス アプリのコード内から参照できるように、メイン アプリ オブジェクトをダイアログ ボックス アプリに渡します。

    • 追加のデータ — ダイアログ ボックス アプリからアクセスする必要がある、メイン アプリで定義された追加データを渡します。

    [OK] をクリックします。

    App Input Arguments dialog box. An edit field for specifying input arguments to the startupFcn callback contains the variable names "caller", "sz", and "c".

  2. ダイアログ ボックス アプリで、メイン アプリ オブジェクトを保存するコードを追加します。

    1. 最初に、メイン アプリを保存するプロパティを定義します。[コード ビュー][エディター] タブで、[プロパティ][プライベート プロパティ] を選択します。次に、properties ブロックのプロパティ名を CallingApp に変更します。

      properties (Access = private)
          CallingApp % Main app
      end

    2. その後、コールバック関数 CallingApp で、StartupFcn プロパティにメイン アプリ オブジェクトを保存するコードを追加します。

      function StartupFcn(app,caller,sz,c)
          % Store main app object
          app.CallingApp = caller;
      
          % Process sz and c inputs
          % ...
      end

      StartupFcn コールバックの完全にコード化された例については、ダイアログ ボックスを開くプロット アプリを参照してください。

  3. メイン アプリで、コールバック内からダイアログ ボックス アプリを呼び出してダイアログ ボックスを作成します。

    1. 最初に、ダイアログ ボックス アプリを保存するプロパティを定義します。メイン アプリで、[コード ビュー][エディター] タブで、[プロパティ][プライベート プロパティ] を選択します。次に、properties ブロックで、プロパティ名を DialogApp に変更します。

      properties (Access = private)
          DialogApp % Dialog box app
      end

    2. その後、[Options] ボタンのコールバック関数を追加します。このコールバックは、ユーザーが複数のダイアログ ボックスを開かないように [Options] ボタンを無効にします。次に、ダイアログ ボックスに渡す値を取得し、入力引数と出力引数を持つダイアログ ボックス アプリを呼び出します。出力引数は、ダイアログ ボックスの app オブジェクトです。

      function OptionsButtonPushed(app,event) 
          % Disable Plot Options button while dialog is open
          app.OptionsButton.Enable = "off";
      
          % Get sample size and colormap
          % ...
          
          % Call dialog box with input values
          app.DialogApp = DialogAppExample(app,szvalue,cvalue);
      end

      コールバックの完全にコード化された例については、ダイアログ ボックスを開くプロット アプリを参照してください。

メイン アプリへの情報の返送

次の手順を実行して、ユーザーの選択内容をダイアログ ボックス アプリからメイン アプリに返します。

  1. メイン アプリで、UI を更新するパブリック関数を作成します。[コード ビュー] でメイン アプリを開いた状態で、[エディター] タブで [関数][パブリック関数] を選択します。

    既定の関数名を目的の名前に変更し、ダイアログ ボックスからメイン アプリに渡す各オプションの入力引数を追加します。メイン アプリ オブジェクトを表す app 引数は 1 つ目の引数でなければならないため、追加の引数はこの引数に続けて指定します。次に、入力を処理する関数にコードを追加して、メイン アプリを更新します。

    function updateplot(app,sz,c) 
        % Process sz and c 
        ...
    end

    パブリック関数の完全にコード化された例については、ダイアログ ボックスを開くプロット アプリを参照してください。

  2. ダイアログ ボックス アプリで、コールバック内からパブリック関数を呼び出します。[コード ビュー] でダイアログ ボックス アプリを開いた状態で、[OK] ボタンのコールバック関数を追加します。

    このコールバックで、メイン アプリ コードで定義したパブリック関数を呼び出します。CallingApp プロパティに保存されているメイン アプリ オブジェクトを、最初の引数として渡します。次に、UI を更新するためにメイン アプリに必要な追加のデータを渡します。最後に、ダイアログ ボックスを閉じるために、関数 delete を呼び出します。

    function ButtonPushed(app,event)
       % Call main app's public function
       updateplot(app.CallingApp,app.EditField.Value,app.DropDown.Value);
    
       % Delete the dialog box  
       delete(app)                  
    end

ウィンドウを閉じるときの管理

どちらのアプリでも、ユーザーが閉じるときに特定のタスクを実行しなければなりません。ダイアログ ボックスを閉じる前に、メイン アプリの [Options] ボタンを再度有効にしなければなりません。メイン アプリが閉じる前に、ダイアログ ボックスが閉じていることを確認しなければなりません。

  1. [コード ビュー] でダイアログ ボックス アプリを開いた状態で、[コンポーネント ブラウザー]app.UIFigure オブジェクトを右クリックし、[コールバック][CloseRequestFcn コールバックの追加] を選択します。次に、メイン アプリのボタンを再度有効にしてダイアログ ボックス アプリを閉じるコードを追加します。

    function DialogAppCloseRequest(app,event)
       % Enable the Plot Options button in main app
       app.CallingApp.OptionsButton.Enable = "on";
                
       % Delete the dialog box 
       delete(app)             
    end

  2. [コード ビュー] でメイン アプリを開いた状態で、[コンポーネント ブラウザー]app.UIFigure オブジェクトを右クリックし、[コールバック][CloseRequestFcn コールバックの追加] を選択します。次に、両方のアプリを閉じるコードを追加します。

    function MainAppCloseRequest(app,event)
       % Delete both apps
       delete(app.DialogApp)
       delete(app)              
    end

例: ダイアログ ボックスを開くプロット アプリ

このアプリは、ダイアログ ボックスでオプションを選択するためのボタンをもつメインのプロット アプリで構成されています。[Options] ボタンを押すと、入力引数を使用してダイアログ ボックスのアプリが呼び出されます。ダイアログ ボックスで、メインのアプリのパブリック関数を呼び出すことによって、[OK] ボタンのコールバックがユーザーの選択内容をメイン アプリに送信します。

関連するトピック