Archive for 2009/6/29
DataGridでテーブルの結果をデータとして表示したいときに、
stmt.text = "SELECT * FROM ......"; stmt.execute(); var result:SQLResult = stmt.getResult(); datagrid.dataProvider = new ArrayCollection(result.data);
のようにして、データを取得してArrayCollectionとして設定すればいい。
しかし、これではデータが大きかろうが、小さかろうがデータをすべて事前に作成する必要がある。
もし、これが20行しか表示されずに、そのままそのページを閉じられたとしてもだ。
これは何とも非効率だ。
そこで、必要なデータを、必要な時に作成するようにしたいと思っていろいろと調べていたが、
一番よいやり方は、DataProviderに設定できるICollectionViewのインターフェースをもったクラスを自作するのが一番だろうということになり、このクラスを自作することにした。
まだ、完全にはできていないものの、このクラスを自作しながらレポートしていく。
必要なサンプルクラスをさがす
dataProviderに設定するにはICollecitonViewのインターフェースをもったクラスだから、
この必要メソッドを作成していけば、いいわけだが、やみくもに作ってもしょうがない。
そこで、既存の実装でよいサンプルを探す。
やはり、このサンプルとして一番いいのは、ArrayCollecitonだろう。
データ自体がArrayなので、内容も把握しやすい。
そこでArrayCollecitonというクラスを見てみると、ほんの150行程度で実装が終わっている。
ようはやっていることは
(今回関係ある部分のみしか記述していません)
public class ArrayCollection extends ListCollectionView{
public function set source(s:Array):void{
list = new ArrayList(s);
}
}
というように、listプロパティに、IListの実装としてArrayListを設定しているListCollectionViewということがいえる。
したがって、今回自作するクラスもこのような形として実装すればなんとかなりそうだ。
実装するクラス
前述の通り、今回実装するクラスは
- TableCollecitonView
- TableList
とする。
ちょうど、TableCollecitonViewがArrayCollectionを参考にし、TableListがArrayListを参考に実装すればよいというわけだ。
では、これらの実装を次回からしていくことにする。
参考までに、ArrayListというクラス、publicなクラスだが、@privateとなっていてドキュメントからは表示されないようになっている。
Flexにはnamespaceというキーワードがある。
これは簡単にいえば、メソッドやプロパティのアクセス制御のためだと言ってしまってもいい。
どのようなときに使うかといえば、簡単に言ってしまえば内部事情を分かっている人だけに公開したいメソッドやプロパティを作りたい。
というときだろう。逆にいえば、外部に対しては見せたくないが、いろいろなパッケージで自由に使いたいときだろう。
たとえば、mx_internal。
flex framework を作っているAdobe向けの名前空間。flexのコンポーネントを改良しようかなと思うと必ずこのキーワードのあいます。
使い方は以下のようなたとえば、私の場合にはファイル(/com/coltware/fxmail_internal.as)を作成し、
package com.coltware
{
public namespace fxmail_internal = "http://www.coltware.com/2009/fxmail/internal";
}
次に、この名前空間に関数を定義するには
fxmail_internal function parseEnd():void{
}
のように、頭につければよい。publicや、protectedとかは一緒に使えません。
そして、使い方(その関数の呼び方)。
これはいろいろありますが、
import com.coltware.fxmail_internal; use namespace fxmail_internal;
と宣言してしまえば、使えます。後はふつうnamespaceを使っていない時と同様です。
今まで、どうせ自分ひとりのソースだからpublicでいいやとおもっていましたが、asdocでpublicは表示されるのはおかしいから変えようかなと思い、namespaceを使いましたが・・
ドキュメントは@privateと書けば出ませんでした・・・

