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

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

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

プログラム GUI におけるデータ管理

データ管理機構の要約

大部分の GUI は、アプリケーションに固有のデータを作成または使用します。GUI コンポーネントは、互いにデータをやりとりする必要がある場合があります。そのために、役立つ基本的な仕組みがいくつかあります。

多くの GUI は単独の Figure ですが、ユーザー アプリケーションが 2 つ以上の Figure を必要とする場合には、複数の GUI を同時に機能させることができます。たとえば、GUI で使用されるパラメーターをいくつか表示して取得するために、GUI は複数のダイアログ ボックスを必要とします。ユーザー GUI は、同時にまたは連続して、同時に機能する個々のツールを複数含むことができます。ファイルまたはワークスペース変数でのやりとりを回避するために、以下の表で述べるメソッドのいずれかを使用できます。

データ共有方法動作利用
プロパティ/値の組入力引数として渡すことで、新たに呼び出された GUI または既存の GUI にデータを送ります。新規の GUI にデータを送ります
出力起動した GUI からデータを出力します。起動された GUI の handles 構造体を戻すなど、起動された GUI にデータを戻します
関数ハンドルまたはプライベート データ以下の 4 つのメソッドのいずれか 1 つで、関数ハンドルまたはデータを渡します。GUI 内または GUI 間で機能を表します
「入れ子関数」: すべての上位の関数の名前空間を共有します通常は、単一の GUI の Figure 内の、直接的または間接的に囲まれている関数で定義された変数へのアクセスと変更をします
UserData: この Figure またはコンポーネントのプロパティにデータを格納します。ハンドル参照により、他の GUI とやりとりします。GUI 内または GUI 間でのデータのやりとり。UserData は、構造体として渡される場合が多く、1 つの変数に制限されます
アプリケーション データ (getappdata / setappdata, ...):Figure またはコンポーネントに、名前の付いたデータを格納します。ハンドル参照により、他の GUI とやりとりします。GUI 内または GUI 間でのデータのやりとり。変数の数やタイプは、この API を利用してアプリケーション データとして格納できます
guidata: GUI の handles 構造体に、データを格納します。ハンドル参照により、他の GUI とやりとりします。GUI 内または GUI 間でのデータのやりとり: アプリケーション データを管理する簡単な方法。GUI データは、GUI の Figure に関連する構造体です。

以下の 3 つの節では、GUI 内に格納されたアプリケーション定義のデータを管理する方法を与える仕組みについて説明します。

  • 入れ子関数: より高いレベルで定義された変数を共有し、呼び出された関数が、上位か下位、または呼び出し側の兄弟である場合、互いに呼び出します。

  • UserData プロパティ: GUI コンポーネントに割り当て、その他のプロパティのように取り出す MATLAB ワークスペース変数。

  • アプリケーション データ: アプリケーションが、指定したオブジェクトに関連するデータを格納し取得するために利用します。GUI に対し、この特定のオブジェクトとは通常 GUI の Figure ですが、任意のコンポーネントでも可能です。データは、名前/値の組として保存されます。アプリケーション データを使うと、オブジェクトに対するユーザー定義のプロパティの作成が可能になります。

  • GUI データ: GUI データを管理するために関数 guidata を使用する。この関数は MATLAB® 構造体に GUI データとして 1 つの変数を格納できます。この構造体は GUIDE では "handles 構造体" と呼ばれます。handles 構造体を更新したり、取得したりするために関数を使用します。

GUI のコールバック間でデータを共有する例 において、簡単な作業 GUI に適用される 3 つの方法を比較できます。

入れ子関数

GUI コード ファイルに入れ子関数を配置すると、コールバック関数でデータを引数として渡さなくても、データを自由に共有できるようになります。

  1. ユーザー コードの初期化セグメントでは、コンポーネントの作成、変数の定義、データの生成をします。

  2. GUI コールバックとユーティリティ関数を初期化の下のレベルに入れ子します。

データとコンポーネント ハンドルは、より上のレベルで定義されているので、コールバックとユーティリティ関数はこれらへのアクセスを自動的にもちます。この手法を利用すると、UserData、アプリケーション データ、または多くのインスタンスの GUI データを格納する必要がなくなります。

    メモ:   入れ子関数の使用に適用する規則と制限は、「入れ子関数」を参照してください。

完成した例は、入れ子関数を使用したデータ共有を参照してください。

UserData プロパティ

メニューや Figure 自体を含む、すべての GUI コンポーネントは UserData プロパティをもちます。UserData プロパティの値として MATLAB ワークスペースの有効な値を割り当てることができますが、一度に存在できる値は 1 つに限られます。そのデータを取得するには、そのデータが格納されているコールバックがコンポーネントのハンドルを知っていなければなりません。適切なオブジェクトのハンドルを用いて getset を利用して、UserData にアクセスします。以下の例では、このパターンを説明します。

  1. エディット テキスト コンポーネントは、その UserData プロパティにユーザーが入力する文字列を格納します。

    function edittext1_callback(hObject,eventdata)
    mystring = get(hObject,'String');
    set(hObject,'UserData',mystring);
  2. プッシュ ボタンは、エディット テキスト コンポーネントの UserData プロパティから文字列を取得します。

    function pushbutton1_callback(hObject,eventdata)
    string = get(edittexthandle,'UserData');

たとえば、メニュー項目が [元に戻す] である場合、そのコードは、edittext1String をリセットして、その UserData に格納された値に戻すことができます。元に戻す操作を容易にするために、UserData は、スタックまたは循環バッファーとして扱われる、文字列のセル配列になることができます。

複数の変数を保存したい場合、UserData を構造体として指定します。ユーザーが定義する各フィールドは、異なる変数をもつことができます。

    メモ:   hObject (呼び出しているオブジェクトのハンドル) を使用するには、文字列や関数名ではなく、コンポーネントのコールバック プロパティを関数ハンドルとして指定しなければなりません。このように指定すると、コンポーネントのハンドルは hObject として各コールバックに自動的に渡されます。詳細は、関数の呼び出しでコールバックを指定を参照してください。

完成した例は、UserData を使用したデータ共有を参照してください。

アプリケーション データ

アプリケーション データは、ユーザー アプリケーションにとって重要なデータやユーザー アプリケーションで定義されるデータです。関数 setappdatagetappdata を用いて、Figure または GUI コンポーネント (ActiveX® コントロール以外) にアプリケーション データを追加します。アプリケーション データと UserData の主な違いは以下のとおりです。

  • アプリケーション データには複数のデータを割り当てることができますが、UserData に割り当てることができる値は 1 つに限られます。

  • コードは、(Tag を使用する場合のように) 名前で、アプリケーション データを参照しなければなりませんが、他のプロパティのように UserData にアクセスできます。

MATLAB の Handle Graphics® オブジェクトのみが、このプロパティを使用します。次の表は、アプリケーション データへのアクセスを提供する関数をまとめています。詳細は、各関数のリファレンス ページを参照してください。

アプリケーション データを管理するための関数

関数

目的

setappdata

オブジェクト (GUI の Figure または他の Handle Graphics オブジェクト) に対して、名前の付いたアプリケーション データを指定します。1 つのオブジェクトに対して名前付きのアプリケーション データの項目を複数指定することができます。ただし、各名前はそのオブジェクトに対して固有でなければならず、また、1 つの値のみ関連付けられます。通常は構造体と関連付けられます。

getappdata

名前付きのアプリケーション データを取得します。名前付きのアプリケーション データを取得するには、アプリケーション データが関連付けられた名前およびアプリケーション データが関連付けられたオブジェクトのハンドルを知っていなければなりません。ハンドルのみを指定すると、オブジェクトのアプリケーション データすべてが返されます。

isappdata

名前の付いたアプリケーション データが指定したオブジェクトに存在する場合は、真。

rmappdata

名前の付いたアプリケーション データを指定したオブジェクトから削除します。

アプリケーション データの作成

関数 setappdata を使用して、アプリケーション データを作成します。この例は、正規分布をした乱数からなる 35 x 35 行列を作成し、この行列を管理するために、Figure と関連するアプリケーション データ mydata を作成します。

matrices.rand_35 = randn(35);
setappdata(figurehandle,'mydata',matrices);

アプリケーション データ構造体へのフィールドの追加

アプリケーション データは、通常必要に応じて、フィールドの追加が可能な構造体として定義されます。この例では、前のトピックで作成されたアプリケーション データ構造体 mydata にフィールドを追加します。

  1. getappdata を使用して構造体を取得します。

    前のトピックの例から、アプリケーション データ構造体の名前は mydata です。これは、Figure と関連しています。

    matrices = getappdata(figurehandle,'mydata');
  2. 新しいフィールドを作成し、値を割り当てます。たとえば、

    matrices.randn_50 = randn(50);

    は、matrices 構造体にフィールド randn_50 を追加し、正規分布を示す乱数から構成される 50 x 50 行列に設定します。

  3. setappdata を使用してデータを保存します。この例は、setappdata を使用して、アプリケーション データ構造体 mydata として matrices 構造体を保存します。

    setappdata(figurehandle,'mydata',matrices);

コールバックは、このアプリケーション データを同じ方法で取得 (さらに変更) できますが、アクセスするために Figure ハンドルを知る必要があります。最上位レベルで、入れ子関数を使用したり、Figure を作成すると、Figure ハンドルには、より低階で入れ子になっているすべてのコールバックとユーティリティ関数がアクセスできます。入れ子関数の使用方法の詳細は、「入れ子関数」を参照してください。アプリケーション データの利用についての完成した例は、アプリケーション データを使用したデータ共有を参照してください。

GUI データ

大部分の GUI は、アプリケーションに固有のデータを作成または使用します。これらの仕組みは、アプリケーションが GUI に保存されたデータを保存、取得する方法を提供します。GUI データにより以下が可能になります。

  • コンポーネントのハンドルを用いると、Figure ハンドルを見つける必要なくコールバック ルーチン内からデータにアクセスできます。

  • ユーザーのソース コードの中で、データに対する ハードコードされた名前の作成や保持の必要はありません。

関数 guidata を使用して、GUI データを管理します。この関数は、1 つの変数を GUI データとして保存できます。GUI データは、以下の点でアプリケーション データとは異なります。

  • GUI データは 1 つの変数です。ただし、構造体として定義されると、ユーザーはフィールドの追加や削除を行うことができます。

  • アプリケーション データは多くの変数で構成できます。各変数は、別々の 1 つしかない名前で格納されます。

  • ユーザーは、関数 guidata を用いて GUI データにアクセスします。この関数は GUI データの格納と取得を行います。

  • GUI データを格納するために guidata を使用すると、既存の GUI データが上書きされます。

  • 関数 getappdatasetappdatarmappdata を使用することは、GUI データに影響しません。

GUI データは、常に、GUI の Figure と関連します。これは、GUI のすべてのコンポーネントのすべてのコールバックに対して利用できます。GUI データを保存、または、取得するときにコンポーネントのハンドルを指定すると、MATLAB はデータをコンポーネントの親の Figure と自動的に関連させます。

GUI データは、いつでも 1 変数のみしか含むことができません。GUI データの書き込みは、既存の GUI データを上書きします。このため、GUI データは、通常、必要に応じて GUI データにフィールドを追加することができる構造体として定義されます。

コンポーネントのハンドルを使用して、コールバック ルーチン内からデータにアクセスすることができ、Figure ハンドルを探す必要はありません。コンポーネントのコールバックプロパティを関数ハンドルとして指定する場合、コンポーネントのハンドルは各コールバックに、hObject として自動的に渡されます。詳細は、関数の呼び出しでコールバックを指定を参照してください。

GUI データ変数は 1 つに限られ、Figure と関連するので、ソース コード全体を通してデータに対するハードコードされた名前を作成したり保持する必要がありません。

    メモ:   GUIDE は GUI データを用いて GUI の handles 構造体を使用し、各コールバックに引数 (handles と呼ばれる) として含みます。プログラム GUI コールバックは GUI データを含みませんが、コールバック関数は、コンポーネントのハンドル (コールバックの最初の引数 hObject) から GUI データにアクセスできます。最初に GUIDE によって GUI を作成した場合は、「GUIDE で生成されたコード ファイルの GUI データの変更」を参照してください。

GUI データの作成と更新

  1. 構造体を作成し、構造体にフィールドを追加します。たとえば、次の例を考えてみましょう。

    mydata.iteration_counter = 0;
    mydata.number_errors = 0;
  2. GUI データとして構造体を保存します。MATLAB は、GUI データを Figure と関連させますが、ハンドルの取得や保存のために、Figure 内の任意のコンポーネントのハンドルを使用できます。

    guidata(figurehandle,mydata);
  3. コールバックからの GUI データを変更するには、構造体のコピーを取得し、適切なフィールドを更新し、GUI データを保存します。

    mydata = guidata(hObject);      % Get the GUI data.
    mydata.iteration_counter = mydata.iteration_counter +1;
    guidata(hObject,mydata);        % Save the GUI data.

      メモ:   hObject を使用するには、コンポーネントのコールバック プロパティを関数ハンドルとして指定しなければなりません。このように指定すると、コンポーネントのハンドルは hObject として各コールバックに自動的に渡されます。詳細は、関数の呼び出しでコールバックを指定を参照してください。

GUI データ構造体へのフィールドの追加

GUI データ構造体にフィールドを追加するには、次のようにします。

  1. 次のようなコマンドで構造体のコピーを取得します。hObject は、コールバックがトリガーされたコンポーネントのハンドルです。

    mydata = guidata(hObject)
  2. 新しいフィールドに値を割り当て、構造体にフィールドを追加します。たとえば、次の例を考えてみましょう。

    mydata.iteration_state = 0;

    は、構造体 mydata にフィールド iteration_state を追加し、そのフィールドを 0 に設定します。

  3. データを保存するには、次のコマンドを使用します。

    guidata(hObject,mydata)

    ここで、hObject は、コールバックがトリガーされるコンポーネントのハンドルです。MATLAB は、mydata 構造体の新しいコピーをコンポーネントの親の Figure と関連させます。

完成した例は、GUI データを使用したデータ共有を参照してください。

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