Archive for 6月, 2009
Flex Builderでasdocを使おうかなとヘルプを調べたらない。。。
もしかして、コマンドからやれというのか??
このあたりはFlex Builder3 は不親切だ。(次のバージョンならあらかじめ用意されているのかな?)
さて、気を取り直してインストール方法は、
- ヘルプから「ソフトウェア更新」を選ぶ
- 「検索およびインストール」を選ぶ
すると、ウィザードが表示されるので - 「インストールする新規フィーチャーを検索」をチェックし、[次へ]ボタンを押す
- 検索に含めるサイト(一覧)から
「The Eclipse Project Updates」にチェックし、[終了]を押す。
すると、更新サイトのミラーリングが表示されるので、適当に選択してください。 - するとまた、一覧が表示されるので
「The Eclipse Project Updates」
→ Eclise 3.3.2 ( バージョンは同じなのかはわかりません)
→ Eclipse Java Developmnet Tools 3.3.2.r33x (上から3番目くらい)
にチェックし、次へを押す - インストールライセンスが表示されるので、左下の「同意します」にチェックし、
[次へ]ボタンを押す。 - で[終了]ボタンを再度押す。 いろいろあるが後は流れに沿っていけばOK
- 再起動してください。というニュアンスのメッセージがでるので、そこで再起動。
再起動したら、「ウィンドウ」「他のビュー」でAntがあれば成功です。
これで、やっとAntのタスクが書けます。。。。
あれ?ほかにもなんかインストールされているのがばればれですね。
やっと、POP3からメールを取得するライブラリがなんとか動くようなレベルになりました。
本当は、flexに依存せずに作成しようかなとおもっていたのですが、結局、AIRでないとSocket関連はできないので、依存はあまり気にしませんでした。
実際Socketを使ってやるよりも、もう少し上位概念で扱う事ができるようにして、
処理がメール1通の単位でできるようになっています。
この辺りは面倒なので、楽にはなっているのではないでしょうか?
簡単な説明と、ライブラリファイル(swc)はこちらから。
(または、上のメニュー[Adobe Flex] からflex:fxmailです。)
まだまだな感じですが、今後もバージョンアップしてメール配信もできるようにしていきます。
イベントを登録しても、同じようなイベントで順番を制御したい場合がある。
私は、マウスによってアイテムがクリックされた場合に、場所と、どのアイテムがクリックされたかが知りたかった。
しかも、場所を特定してから、アイテムを特定してというようにしたい。
このような場合には、
target.addEventListener(EventType.eventName,function,false,[プライオリティ]);
のようにして、順番を制御できるのです。
ちなみに、プライオリティは数値で、大きいほど先に実行されます。
試しに、下記のFlashで何かアイテムをクリックしてみてください。
ちなみに、ソースは
private function createEnd():void{
tree.addEventListener(ListEvent.ITEM_CLICK,event1,false,1,true);
tree.addEventListener(MouseEvent.CLICK,event2,false,2,true);
tree.addEventListener(MouseEvent.CLICK,event0,false,0,true);
}
private function event0(e:Object):void{
output.text += "event 0 - " + getQualifiedClassName(e) + "\n";
}
private function event1(e:Object):void{
output.text += "event 1 - " + getQualifiedClassName(e) + "\n";
}
private function event2(e:Object):void{
output.text += "event 2 - " + getQualifiedClassName(e) + "\n";
}
のようになっていまして、アイテムをクリックすると、ListEvent.ITEM_CLICKとMouseEvent.CLICKが2つ登録してある処理が流れます。
もちろん結果は、event2,event1,event0 の順番で処理がされますが・・・・・
flexで、SpriteオブジェクトをCanvasにaddChildしようとすると、
TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::Sprite@59f3421 to mx.core.IUIComponent. at mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::addingChild() at mx.core::Container/addChildAt() at mx.core::Container/addChild()
さて、ここでSpriteをaddChildする方法は、いろいろなblogで紹介されているようで結構多くの人が躓くポイントのようだ。
var uicomp:UIComponent = new UIComponent(); uicomp.addChild(sprite);
のようにすれば、いいわけだが、これを機にContainerのソースを見てみることにした。
確かに、マニュアルを見ると、
メモ:メソッドに対する child パラメータは DisplayObject 型として指定されますが、このパラメータがコンテナの子として追加されるためには、IUIComponent インターフェイスを実装する必要があります。 Flex コンポーネントはすべてこのインターフェイスを実装しています。
のように記述されている。
ここで、ContainerとUIComponentnのaddChildについてちょっと見てみることにした。
ContainerクラスのソースのaddChildを見てみると、UIComponentのaddChildから書き換えられている。
addingChildという部分でエラーが出ているので、その部分のContainerを見てみると、
/**
* @private
*/
override mx_internal function addingChild(child:DisplayObject):void
{
// Throw an RTE if child is not an IUIComponent.
var uiChild:IUIComponent = IUIComponent(child);
のように書かれているので、意図的にエラーにしているようだ。
直接は関係がないが、もうちょっとDeepに見ていくと、ContainerのaddChild(実際にはaddChildAt)では、
if (contentPane)
contentPane.addChildAt(child, index);
else
$addChildAt(child, _firstChildIndex + index);
のように、条件によりcontentPaneというFlexSpriteオブジェクトの下に追加されるようだ。
これが、さらにcontentPaneというオブジェクトを追っていくと、いろいろとやっている。
んー、Containerオブジェクトの子供はすべてcontentPaneで管理するのではなく、スクロールバーが表示されるときには、このオブジェクトで管理しているようだが、何か理由があるのであろうか・・・
ただ、Flexにはこのような、親のメソッドを書き換えている部分で引数の条件が変わってきてしまっているというものが結構ありそうな気がする。マニュアルを見ればルールはわかるが、オブジェクトの関係がわからないので、これからも、ソースとは仲良く付き合う必要がありそうだ・・・・
flexではテキストフィールドに入力文字の制限ができます。
以下のような感じです。
この辺りは、HTMLと同じと思っていた人には「へー、そんなこともできるんだー」と思うのではないでしょうか?
私はそう思いました。
さて、この制限を使います。
<mx:TextInput restrict="0-9" />
これで数字しか入力できません。
同じように、
restrict="A-Z"
で、大文字のA-Zまでです。ちなみに、自動的に大文字になるようです。
このように数値や、アルファベットなどはこれで簡単に制御ができます。
さて、今度は、よくある「カナ」の入力を制限してみましょう。
日本語のカナは\u30F1から\u30FAまでだからと・・・・
<mx:TextInput restrict="\u30A1-\u30FA" />
あれ、効かない????
なぜー、とちょっとはまってしまいました。
いやー、\を使ったエスケープ型の文字列としてではなく、たんなる\として扱われてしまうのです。
理屈ではわかるのですが、流れでつい、それでも問題ないと思ってしまいます。
したがって、これはActionScriptでは、
restrict = "\\u30A1-\\u30FA";
と書いているのと等しくなっているのです。
したがって、エスケープシーケンス(\)をつかって書きたい時は、
<mx:Script>
<![CDATA[
[Bindalbe]
private var hanKana:String = "\u30A1-\u30FA";
]]>
</mx:Script>
<mx:TextInput restrict="{hanKana}" />
として記述しなくれてはいけないのですね。面倒です。
どうせ、日本語ではこの辺りの入力制限での処理はそんなにかわらないので、共通ファイルとして作成してインクルードして利用したほうがいいのかもしれませんね。
まあ、どうせソースはUTF-8で書かれているのでしょうから直接書いてしまってもいいのでしょうが、
どうしても、その他の言語の文化がそれを阻害します。。。。。


