ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   超ビギナー
     アプリケーション全体に対するユーザー操作を無効にしたい
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
takayama
投稿日時: 2009-1-22 20:36
常連さん
登録日: 2007-5-14
居住地:
投稿: 33
アプリケーション全体に対するユーザー操作を無効にしたい
お世話になります。

Flexアプリケーション全体に対するユーザ操作を無効にしたいのですが、
 Application.application.enabled=false;
としただけでは、PopUpManagerでポップアップ表示させた
ウィンドウが使用不可の状態にならず困っています。

以下が現象の発生するソースです。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
	creationComplete="onCreate()">
	
	<mx:Script>
		<![CDATA[
			import mx.controls.TextInput;
			import mx.managers.PopUpManager;
			import mx.containers.Panel;
			
			private function onCreate():void
			{
				
				//Panelをポップアップする
				var win:Panel=new Panel();
				win.width=400;
				win.height=400;
				win.layout="absolute";
				
				var txt:TextInput=new TextInput();
				txt.width=100;
				txt.x=100;
				txt.y=100;
				win.addChild(txt);
				
				PopUpManager.addPopUp(win,this);
				
				
				//Applicationをenable=falseにする
				Application.application.enabled=false;
				
			}
			
			
		]]>
	</mx:Script>
	<mx:TextInput x="426" y="10"/>
	<mx:Button x="426" y="40" label="ボタン"/>
	
</mx:Application>


複数のウィンドウをポップアップさせる可能性があるのですが、
どなたかポップアップウィンドウも含めて一発で使用不可状態にする方法を
ご存知の方はいらっしゃいませんでしょうか?

あるいは、ポップアップ中のウィンドウを配列等で取得できれば、
Application.application.enabled=false;にした後に、
1つずつenabled=falseにすればよいかとも思うのですが
ポップアップウィンドウのリストを取得する方法も分かりません。。。

どなたか教えて頂けますでしょうか?
よろしくお願い致します。



dsh
投稿日時: 2009-1-23 12:41
ご主人様
登録日: 2006-3-29
居住地: 東京
投稿: 296
Re: アプリケーション全体に対するユーザー操作を無効にしたい
こんにちは、

引用:
アプリケーション全体に対するユーザー操作を無効にしたい


PopUpManager.createPopUpで、空のUIComponent(か、カスタムのサブクラス)を指定して、背景にある他のものをブロックしてしまえばいいのではと思います。

最後に作成したポップアップが、すべてのウインドウの中で一番上に来ますので。


----------------
http://shield.jp/blog/
Twitter: @dseg

takayama
投稿日時: 2009-1-23 14:14
常連さん
登録日: 2007-5-14
居住地:
投稿: 33
Re: アプリケーション全体に対するユーザー操作を無効にしたい
返信ありがとうございます。

実は今回の質問をする前に、透明のCanvasをモーダルでポップアップさせて、
背景にあるもの全てをブロックする方法をやってみたのですが
状況によってSystemManagerがエラーを起こしてしまうのです。

以下のようなスタックが出てしまいます。

at mx.managers::SystemManager/updateLastActiveForm()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:5087] 
at mx.managers::SystemManager/activateForm()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:2352] 
at mx.managers::SystemManager/activate()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:2307] 
at mx.managers::FocusManager/creationCompleteHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\FocusManager.as:1592] 
at flash.events::EventDispatcher/dispatchEventFunction() 
at flash.events::EventDispatcher/dispatchEvent() 
at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298] 
at mx.core::UIComponent/set initialized()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:1169] 
at mx.managers::LayoutManager/doPhasedInstantiation()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:718] 
at Function/http://adobe.com/AS3/2006/builtin::apply() 
at mx.core::UIComponent/callLaterDispatcher2()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8628] 
at mx.core::UIComponent/callLaterDispatcher()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8568] 



本当はこのようなエラーになる状況を再現するサンプルを作って
ご質問しようと思ったのですが、なかなか現象を切り出せず
他の方法を検討しようと思い今回の質問をした次第です。

説明不足で申し訳ございません。


私としては、PopUpManager.createPopUpで表示した
ポップアップウィンドウのリストを取得する方法があれば
何とかなるかなと思っているのですが。。。

ご存知ないでしょうか?

dsh
投稿日時: 2009-1-23 14:28
ご主人様
登録日: 2006-3-29
居住地: 東京
投稿: 296
Re: アプリケーション全体に対するユーザー操作を無効にしたい
こんにちは、

引用:
私としては、PopUpManager.createPopUpで表示した
ポップアップウィンドウのリストを取得する方法があれば
何とかなるかなと思っているのですが。。。

たぶんデフォルトではないと思います。
自分で配列にポップアップの参照を記録していけば良いのではないでしょうか。

以下、
画面の一番上にポップアップをだす簡単なサンプルです。

Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:Script>
		<![CDATA[
			import mx.managers.PopUpManager;
			import mx.controls.Alert;

			private function lockWholeApp():void {
				PopUpManager.createPopUp(Application.application as DisplayObject, OverlayPlane, true);
			}
		]]>
	</mx:Script>

	<mx:Button label="show modal alert">
		<mx:click>
			<![CDATA[
				Alert.show("!");
				callLater(lockWholeApp);
			]]>
		</mx:click>
	</mx:Button>

</mx:Application>


OverlayPlane.as
package {

import flash.events.IEventDispatcher;
import flash.events.MouseEvent;

import mx.controls.Button;
import mx.core.UIComponent;
import mx.managers.PopUpManager;

public class OverlayPlane extends UIComponent {

	public function OverlayPlane() {
		super();
		
		addEventListener(MouseEvent.CLICK, clickHandler);
		var b:Button = new Button();
		b.label = "close";
		b.width = 100;
		b.height = 30;
		addChild(b);
	}

	private function clickHandler(e:MouseEvent):void {
		IEventDispatcher(e.currentTarget).removeEventListener(e.type, arguments.callee);
		trace('clicked');
		if (this.isPopUp) {
			PopUpManager.removePopUp(this);
		}
	}		
}

}


----------------
http://shield.jp/blog/
Twitter: @dseg

takayama
投稿日時: 2009-1-23 17:51
常連さん
登録日: 2007-5-14
居住地:
投稿: 33
Re: アプリケーション全体に対するユーザー操作を無効にしたい
ご返信ありがとうございます。

これまでCanvasを上にポップアップさせて操作不可にしていたところを、
dshさんのように空のUIComponentに変えたところ、
SystemManagerのエラーが表示されなくなりました!

CanvasもUIComponentを継承しているはずなのに、
動きが違うのは何故なのか全く分かりませんが。。。

とりあえず、この方法で様子を見たいと思います。
ありがとうございました。
fujita
投稿日時: 2009-1-26 13:13
ご主人様
登録日: 2006-7-11
居住地: 日本一暑いところの近く。
投稿: 128
Re: アプリケーション全体に対するユーザー操作を無効にしたい
こんにちは。

私の場合はポップアップしたウィンドウのenabledプロパティとApplicationのenabledをバインドしています。


var window:TitleWindow = TitleWindow(PopUpManager.createPopUp(this, TitleWindow);
BindingUtil.bindProperty(window, "enabled", Application.application, "enabled"); // ポップアップしたウィンドウのenabledプロパティにApplicationのenabledプロパティをバインド


これだとポップアップの数を管理する必要がなく、
また、Applicationのenabled操作のみで完結出来るので制御も楽になるかと思います。
takayama
投稿日時: 2009-1-26 18:13
常連さん
登録日: 2007-5-14
居住地:
投稿: 33
Re: アプリケーション全体に対するユーザー操作を無効にしたい
ご返信ありがとうございます。

enabledプロパティをバインドさせる方法は思いつきませんでした〜。

簡単で応用が効きそうな方法ですね!
参考にさせて頂きます。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を