Platform: All
Version: MX Professional 2004
1. 現象
2. 原因
3. 対処法
[1][スキーマ]の定義
[2][バインディング]の設定
4. 補足
[A][バインディング]の個別設定
[B]mx.data.typesパッケージのクラスで型指定 − ActionScript 2.0修得者向け対処方
1. 現象
Flash MX Professional 2004のDataSetクラスには、データセット(collection)の現行のビュー内で指定したフィールド値を検索するメソッドとして、DataSet.find()やDataSet.findFirst()、DataSet.findLast()があります。これらのメソッドは、いずれも指定したフィールド値の項目が存在すればtrue、存在しなければfalseを返します。
ところがいずれのメソッドも、指定したフィールド値が存在するにもかかわらず、つねにfalseを返します。つぎのスクリプトは、DataSet.find()メソッドを使用したサンプルです(スクリプト001)。スクリプトを記述したタイムラインには、DataSetインスタンスmyDataSetが配置されているものとします。
スクリプト001■DataSet.find()メソッドのテスト
// フレームアクション
// DataSet.find()メソッドのテスト
import mx.data.components.DataSet;
var myDataSet:DataSet;
var recData:Array = [{id:0, firstName:"Mick", lastName:"Jones"},
{id:1, firstName:"Joe", lastName:"Strummer"},
{id:2, firstName:"Paul", lastName:"Simonon"}];
myDataSet.items = recData;
myDataSet.addSort("firstName", ["firstName"]);
var bResult:Boolean = myDataSet.find(["Paul"]);
trace(bResult); // 出力: false
|
2. 原因
DataSet.find()、DataSet.findFirst()、DataSet.findLast()を使用するには、検索対象のフィールドが予め[スキーマ]に定義されていなければなりません。その旨の記載がないのは、ドキュメントパグだと考えられます。
3. 対処法
メソッドを使用するには、[コンポーネントインスペクタ]で検索対象のフィールドを[スキーマ]に定義し、[バインディング]を設定します。検索対象フィールドが複数あるときは、それらを同様に定義します。
[1][スキーマ]の定義
まず、[コンポーネントインスペクタ]の[スキーマ]タブで、[+](コンポーネントプロパティの追加)ボタンをクリックして、プロパティを追加します。[field name]フィールドに検索対象フィールド名を入力し、[data type]からフィールドのデータタイプを選択します(図001)。
図001■[コンポーネントインスペクタ]の[スキーマ]タブで検索対象フィールドを定義
[2][バインディング]の設定
つぎに、[スキーマ]に定義したプロパティを、DataSetインスタンスに[バインディング]します。[バインディング]は、(a)個別に設定する方法と、(b)DataBindingClassコンポーネントを利用する方法があります。ここでは後者によることとし、前者の方法は後述「4. 補足」に「[バインディング]の個別設定」として補足します。
DataBindingClassesコンポーネントは、[ウィンドウ]メニューから[その他のパネル] > [サンプルライブラリ] > [クラス]で表示される[ライブラリ]に格納されています。このDataBindingClassesコンポーネントのインスタンスを、DataSetインスタンスと同じステージ上にドラッグ&ドロップします(図002)。
図002■DataBindingClassesインスタンスをステージにドロップ
これで、[スキーマ]の定義と[バインディング]の設定は完了です。先にテストしたスクリプト001に、検索結果を出力する処理を追加しました(スクリプト002)。今度は、検索フィールドに指定した値に合致したデータが、[出力]されます。
スクリプト002■DataSet.find()メソッドのテスト2
// フレームアクション
// DataSet.find()メソッドのテスト2
import mx.data.components.DataSet;
var myDataSet:DataSet;
var recData:Array = [{id:0, firstName:new String("Mick"), lastName:"Jones"},
{id:1, firstName:new String("Joe"), lastName:"Strummer"},
{id:2, firstName:new String("Paul"), lastName:"Simonon"}];
myDataSet.items = recData;
myDataSet.addSort("firstName", ["firstName"]);
if (myDataSet.find(["Paul"])) {
var oItem:Object = myDataSet.currentItem;
trace([oItem.id, oItem.firstName, oItem.lastName]);
}
// [出力]ウィンドウの表示
2,Paul,Simonon
|
4. 補足
[A][バインディング]の個別設定
「2. 対処法」の「[2][バインディング]の設定」で、DataBindingClassesを使わず、[コンポーネントインスペクタ]で個別に設定する方法を簡単にご説明します(「[1][スキーマ]の設定」は、済んでいるものとします)。
まず、[コンポーネントインスペクタ]の[バインディング]タブで[+](バインディングの追加)ボタンをクリックし、表示された[バインディングの追加]ダイアログボックスで[スキーマ]に定義したプロパティを選択して、[OK]ボタンをクリックします(図003)。他にも検索対象フィールドがあれば、同様に[バインディング]を追加します。
図003■[コンポーネントインスペクタ]の[バインディング]タブでプロパティを追加
つぎに、[コンポーネントインスペクタ]の[バインディング]に追加されたプロパティが選択された状態で、[bound to]フィールドを2回クリックします(図004)。
図004■[コンポーネントインスペクタ]の[バインディング]でプロパティの[bound to]フィールドを2回クリック
[バインド]ダイアログボックスの[コンポーネントのパス]でDataSetインスタンスを選択し、[スキーマの場所]から追加されたプロパティを選択して、[OK]ボタンをクリックします(図005)。他にも検索対象フィールドがあれば、同様に[bound to]を設定します。
図005■[バインド]ダイアログボックスで[コンポーネントのパス]と[スキーマの場所]を設定
これで、[バインディング]の設定ができました。
図006■[バインディング]の[bound to]フィールドに設定されたコンポーネントとスキーマ
[B]mx.data.typesパッケージのクラスで型指定 − ActionScript 2.0修得者向け対処法
ActionScript 2.0のクラス定義について理解をされている中・上級者向けに、別の対処法をご紹介します。
DataSetの検索メソッドを使用するためには、mx.data.typesパッケージのデータ型を定義するクラスで、必要な型指定が何らかの変数に対して宣言されていれば、スキーマの設定は必要ありません。データ型を定義するクラスのうち必要とされるのは、検索対象フィールドがストリングであればStr、数値はNum、またブール(論理)値がBoolです。型宣言を行う変数は、任意のダミーで構いません。
以下のフレームアクション(スクリプト002)では、検索対象フィールドをふたつ設定しました。ひとつは数値でもうひとつがストリングです。ブール値は指定していません。スクリプトを実行すると、[出力]パネルにはつぎの結果が表示されます。
// [出力]パネルの表示
3,Paul,McCartney
スクリプト003■DataSet.find()メソッドのテスト3
// フレームアクション
// DataSet.find()メソッドのテスト3
import mx.data.components.DataSet;
// ダミー変数をデータ型指定
var temp:mx.data.types.Str;
var temp:mx.data.types.Num;
// var temp:mx.data.types.Bool; // 検索対象フィールドにブール値はない
var myDataSet:DataSet;
var recData:Array = [{id:0, firstName:"Mick", lastName:"Jones"},
{id:1, firstName:"Joe", lastName:"Strummer"},
{id:2, firstName:"Paul", lastName:"Simonon"},
{id:3, firstName:"Paul", lastName:"McCartney"}];
myDataSet.items = recData;
myDataSet.addSort("id_and_firstName", ["id", "firstName"]);
if (myDataSet.find([3, "Paul"])) {
var oItem:Object = myDataSet.currentItem;
trace([oItem.id, oItem.firstName, oItem.lastName]);
}
|
_____