4D-jp 4D Japan Technical Support Team

ポップアップメニューのデータ型

2019-02-12

ポップアップメニュー/ドロップダウンリストは,いろいろなタイプのデータソース(変数)にバインドできるユニークなフォームオブジェクトです。具体的には,プロパティとデータソースの組み合わせにより,下記4タイプの設定ができます。

  • ARRAY TEXT(デフォルト値)
  • ARRAY TEXT(配列)
  • C_LONGINT(リスト項目の参照番号)
  • C_TEXT(リスト項目の値)

大概のフォームオブジェクトは,バインドできるデータソース(変数)のタイプが決まっているので,変数タイプのプロパティがどうであれ,コンパイラーは正しい型を特定することができます。しかし,テキスト入力(フィールドまたは変数)・タブコントロール・リストボックス・ポップアップメニュー・コンボボックスについては,複数の変数タイプにバインドすることができるため,静的な変数をバインドするのであれば,コンパイラーメソッドでその型を指定する必要があることに留意してください。

プロパティリストの「変数タイプ」について

フォームイベントを発生させるフォームオブジェクト(アクティブオブジェクト)のプロパティリストには「変数タイプ」という項目が表示されます。このプロパティは,ダイナミック変数(静的な変数名がなく,スコープがフォームに対してローカルな変数)の型指定に使用されます。一方,プロセス変数などの静的な変数の型を指定する働きはありません。

変数に名前が与えられている場合,「変数タイプ」は実際には変数の型を指定しません。プロパティリストのオプション表示を更新するだけです (ピクチャー変数を除く)。名前付き変数の型を指定するには,コンパイラーテーマのコマンドを使用しなければなりません。— ランゲージリファレンス > プログラミング言語の構成要素 > 変数

プロセス変数やインタープロセス変数などの静的な変数をフォームオブジェクトにバインドするスタイルは,互換性のために残されている古典的なコーディングに属するものです。現在でも,試作品(プロトタイプ)のようなコンセプト実証を手速く制作する場合には,このスタイルが有効ですが,本格的な開発には,ダイナミック変数Formオブジェクトのプロパティを使用することが推奨されています。

コンパイラーメソッドは,コンパイラーに自動生成させることができます。「型宣言を生成」ボタンをクリックすると,コンパイラーはすべてのメソッドを解析し,代入文・引数・コンパイラコマンドなどに基づき,変数の型を推定しようとします。コンパイラーメソッドで型が宣言されている静的な変数は,メソッドエディター上でマウスポインターを重ねるとタイプ名が表示され,タイプアヘッドの候補リストに表示されます。

デフォルト値

もっとも手軽なのは,ポップアップメニューのプロパティリストにデフォルト値を書き込む,という方法です。デフォルト値は,フォームがロードされると,オブジェクトのデータソース(変数)にテキスト配列としてコピーされます。したがって,変数はARRAY TEXTで宣言されていることが暗黙的に求められています。

配列の値はデフォルト値ですでに定義されているため,コードにはIf (myMenuArray=1)のような比較演算,あるいはmyMenuArray:=1のような代入文しか記述されていないかもしれません,その場合,コンパイラーは,myMenuArrayが数値型である,という誤った判定をすることでしょう。数値型は,ポップアップメニューのデータソースとして有効なタイプだからです。一方,ARRAY TEXT(myMenuArray;3)のように配列のサイズを指定した場合,ポップアップメニューの項目数がデフォルト値の行数と食い違ってしまうかもしれません。

ポップアップメニューのデータソースにデフォルト値を使用する場合,コンパイラーに対して「ヒント」を与えるような形で,下記のように実行されないコードを記述することが勧められています。

If (False)
 ARRAY TEXT(myMenuArray;0)
End if

配列

既定の配列を「デフォルト値」に書き込む代わりに,コードで構築したARRAY TEXTをポップアップメニューにバインドすることもできます。配列の名前は,プロパティリストに書き込むこともできますし,OBJECT SET DATA SOURCEでバインドすることもできます。

変数名を「無名」とした場合,つまり,ダイナミック変数を使用する場合,リストが関連づけられていないポップアップメニューのデータソースはテキスト配列となります。ポップアップメニューはコレクション型をサポートしていないため,Formオブジェクトのプロパティをこのスタイルでバインドすることはできません。後述するリスト項目を使用する必要があります。

リスト項目の参照番号

配列の代わりにリストをポップアップメニューにバインドすることができます。リストは,ツールボックスに登録されたものをプロパティリストの「選択リスト」に入力することもできますし,OBJECT SET LIST BY REFERENCEあるいはOBJECT SET LIST BY NAMEでバインドすることもできます。後者は,プロパティリストでリスト名を指定するのとあまり変わりませんが,前者はNew listで構築したリストを扱うことができ,より柔軟かつ強力です。

リストは,ツールボックスに登録されたもの,あるいはコードで構築されたもの,どちらであっても,重複しない一意の参照番号が割り振られていることが前提となっています。とはいえ,4Dのランタイムは参照番号の一意性をチェックすることはしないので,有効な参照番号を各項目にきちんと設定することは,デベロッパーの責任となっています。リスト項目の参照番号でポップアップメニューを管理するスタイルは,項目の表示テキストに関係なく,参照番号を絶対的な値として用いる場面において有効です。たとえば,表示テキストの言語を切り替えられるようなアプリケーションで使用されることが想定されています。参照番号は数値型です。したがって,変数はC_LONGINTで宣言されていることが暗黙的に求められています。配列ではないので,Formオブジェクトのプロパティをバインドすることもできます。

リスト項目の値

参照番号の代わりに,リスト項目の値そのものをポップアップメニューにバインドすることもできます。配列やリスト項目の参照番号のように,選択された位置や番号から項目を参照する必要がなく,選択された項目がそのまま変数にセットされるので,慣れてしまえば,もっとも自然で簡単な方法です。リストの値はテキスト型です。したがって,変数はC_TEXTで宣言されていることが暗黙的に求められています。配列ではないので,Formオブジェクトのプロパティをバインドすることもできます。

注記: ポップアップメニューのデータソースは,OBJECT SET DATA SOURCE OBJECT SET LIST BY REFERENCE OBJECT SET LIST BY NAMEで自由に切り替えることができます。しかし,「関連付け」の「リスト項目の参照番号・リスト項目の値」は,プロパティリストで決定する必要があり,フォーム実行中に変更することはできません。また,これらのプロパティは,「選択リスト」が設定されていないとアクセスできないため,配列ではなく,リストをデータソースに使用するのであれば,たとえツールボックスのリストではなく,New listを使用するつもりであっても,プロパティリストの上ではツールボックスのリストをどれか指定する必要があります。とはいえ,デフォルトは「リスト項目の値(つまりテキスト)」なので,「リスト項目の参照番号(つまり数値)」を使用するのでなければ,「なし」のままでも問題ないでしょう。


リンク