uzullaの日記

本家:about等:Twitter
 | 

2008-02-04

mx.managers.PopUpManager.createPupUpをつかったんだけど

| 19:55

あるアプリで、モーダルなダイアログウインドウを作ろうとした。

普通のAlert.show()みたいにする為、

A:mx:Panelから継承したカスタムコントロール(ダイアログ画面)

B:Canvas(縦横100%、色を塗って、下の呼び出し元をクリックできないように)

C:呼び出し元

みたいな事をやった。

AとBと同時にvisible=trueすると呼び出し元が隠れるのね。

Aの中にボタンがあって

this.parent["myFunction"](arg1, arg2)

みたいな感じCのメソッドをで呼び出したりして、これはうまいこと動いていた。

でもまーモーダルにさせる為にカッコワルイ事やってるのはなんともいえなかった。


で、最近本を読んで

PopUpManagerを知った。Bを作らなくて良いし、そもそもAもCに宣言しなくて良いというとても便利な代物だった。

呼び出し元はこう書くだけ。

base.mxml
--
import mx.managers.PopUpManager;
private function showSelecter():void{
	PopUpManager.createPopUp(this, popUp, true);
	//popUpは好きなmxml
}

閉じるときは、呼び出された先のpopUp.mxmlに書けば良い

import mx.managers.PopUpManager;
private function hideSelectVote():void{
	//this.visible = false;
	PopUpManager.removePopUp(this);
}

簡単ですね。



ここまでは簡単だったのだけれど、一個問題が発生した。呼び出し元の関数を呼べなくなった。

this.parent["myFunction"](arg1, arg2)

って書いても動かない。

FlexFireBugみたいな、オブジェクトインスペクタがぱっとみつからなかったので、さんざんごちゃごちゃやってみたが、なにがなにやら解らない。

FlexBuilderのデバッグに存在をみつけて、やっと色々見てみたが、やっぱりよくわからない。

さんざん迷ってごちゃごちゃやって、こういう風に書いたら動いた。

var tmp:Application = this.parent["application"] as Application;
tmp["myFunction"](arg1, arg2 );

いや、こんなカッコワルイ書き方はあり得ないと思うのでもっとスマートなやり方があるんだと思う。

でも

this.parent.application

ってかいたらFlexBuilderが真っ赤になって怒るんだよな(そんなものはないと言われる)。

application()をID指定(?)で呼び出して、Application型としてasで指定までしなければうごかなかった

えー、正しくはこんな書き方じゃないでしょ…。


しかし、私には正しい書き方が解らないのです…。(下に追記有り


というかね

this.parent["myFunction"](arg1, arg2)

this.parent["application"]()

も実際の所同じだよね。


そもそもthis.parent["myFunction"](arg1, arg2)って書き方がどうなの?って話だよ。

ただ親のmx:Scriptで書いてあるスクリプトを呼び出したいだけなのに。

this.parent.myFunction(arg1, arg2)じゃあダメなの?(FlexBuilderはダメだとおっしゃる)。

これが動けば素直にthis.parent.Application.myFunction(arg1, arg2)が動くと思うのに。


ただ、FlexBuilerのオブジェクトインスペクタでも関数は存在が見えないし、そういう物なのかもしれないが…。


関数は別扱い、特別なんだよ!って思っても

親から子をたたくには

child_id.myFunction( arg )

で動くんだよね(苦笑)


追記

secondlifeさんに教えてもらった、型指定が無く、コンパイラが判断出来ていなかった。

ParentClassName(this.parent).myFunction(arg1,arg2);

でばっちり出来る。myFunction部分のコード補完もうごいた!

超すっきり!(コード的にも俺的にもFB的にも)

ありがとうございました!

secondlifesecondlife2008/02/05 15:45親の型をコンパイラが解ってないからじゃないでしょうか。

Foo.mxml というのが parent のインスタンスのクラスなら
Foo(this.parent).myFunction(arg1, arg2)
のようにキャストすれば呼べると思いますよ。

uzullauzulla2008/02/05 16:04出来ました!ありがとうございます!
ちゃんとFBも認識して、関数名を補完までしてくれるようになりました。
一行で書けてすっきり大満足です!

 |