Problemas com PopUps

8 respostas
tukA

Olá, estou com esse problema a semanas, tentei muuuita coisa já e ainda estou empacado, mostrarei o código e vejam se um de vocês poderá me ajudar.

Meu Application “TestePopUp.mxml”

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
			   xmlns:s="library://ns.adobe.com/flex/spark" 
			   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
	
	<fx:Script>
		<![CDATA[		
			
			private var testePopUpController:TestePopUpController;		

		]]>
	</fx:Script>
	
	
	<s:initialize>
		<![CDATA[
			testePopUpController = new TestePopUpController(this);
		]]>
	</s:initialize>
	
	<mx:TabNavigator x="166" y="102" width="533" height="293" creationPolicy="all" id="tabNav">
		<s:NavigatorContent label="Tab 1" width="100%" height="100%">
			<s:Button x="269" y="96" label="Button" />
				
		</s:NavigatorContent>
		<s:NavigatorContent label="Tab 2" width="100%" height="100%">
			<mx:ModuleLoader x="10" y="10" width="511" height="239" id="modulo">
			</mx:ModuleLoader>
		</s:NavigatorContent>
	</mx:TabNavigator>
	

</s:Application>

Meu “Controller” do application: TestePopUpController.as

package
{
	import mx.controls.Alert;

	public class TestePopUpController
	{
		
		private var _testePopUp:TestePopUp;
		
		public function TestePopUpController(testePopUp:TestePopUp)
		{						
			this._testePopUp = testePopUp;
			this._testePopUp.tabNav.selectedIndex = 1;
			this.carregaModulo();
		}
		
		private function carregaModulo():void
		{
		//	_testePopUp.modulo.url = "ModuloQualquer.swf";		
			
			_testePopUp.modulo.loadModule("ModuloQualquer.swf");
		}
		
		
	}
}

Meu módulo que é carregado na segunda aba: “ModuloQualquer.mxml”

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009" 
		   xmlns:s="library://ns.adobe.com/flex/spark" 
		   xmlns:mx="library://ns.adobe.com/flex/mx" layout="absolute" width="511" height="239">
	
	<fx:Script>
		<![CDATA[
			private var moduloQualquerController:ModuloQualquerController;
		]]>
	</fx:Script>
	
	
	<mx:initialize>
		<![CDATA[
			moduloQualquerController = new ModuloQualquerController(this);
		]]>
	</mx:initialize>
	
	
	
	
	<s:Button label="Chama PopUp" x="149" y="261" id="abrePopUp" click="moduloQualquerController.abrePopUp(event);"/>
</mx:Module>

Meu Controller do módulo: “ModuloQualquerController.as

package
{
	import flash.display.DisplayObject;
	import flash.events.MouseEvent;
	
	import flashx.textLayout.elements.GlobalSettings;
	
	import mx.controls.Alert;
	import mx.core.Application;
	import mx.events.CloseEvent;
	import mx.managers.PopUpManager;
	
	import spark.components.Application;
	import spark.components.TitleWindow;

	public class ModuloQualquerController
	{					
		import mx.managers.PopUpManager;
		import spark.components.TitleWindow;
		
		private var _moduloQualquer:ModuloQualquer;
		private var titleWindow:TitleWindow;
		
		public function ModuloQualquerController(moduloQualquer:ModuloQualquer)
		{
			this._moduloQualquer = moduloQualquer;				
		}
		
				
		public function abrePopUp(event:MouseEvent):void 
		{
			titleWindow = PopUpManager.createPopUp(DisplayObject(_moduloQualquer.systemManager),TitleWindow, true, null) as TitleWindow;
			titleWindow.title ="Title Window";
			titleWindow.width = 136;
			titleWindow.addEventListener(CloseEvent.CLOSE, closeMe, false, 0, true);
		}
		
		private function closeMe(e:CloseEvent):void 
		{
			PopUpManager.removePopUp(titleWindow);
			
			
		}
			
		
	}
}

O Componente “Teste.mxml” só para ele ter o que mostrar no PopUp

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
		 xmlns:s="library://ns.adobe.com/flex/spark" 
		 xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
	<s:Button x="165" y="269" label="Button"/>
</s:Group>

O que acontece é o seguinte:
Quando eu clico no botão que carregará o popup, ele lança o erro como se a referencia do objeto fosse nula, eu acredito que ele esteja reclamando da minha referencia ao módulo, que no caso é o parent da titleWindow = PopUpManager.createPopUp(_moduloQualquer, Teste, true) as TitleWindow; , porém eu verifiquei e a referencia não é nula.

Alguém?

8 Respostas

aluisiodsv

Dicas.
Coloque o stack trace do erro pra dar uma olhada.
Faça um debug, veja certinho onde lança a excessão e o pq.

tukA

Já debuguei e, creio que pela falta de familiaridade com a linguagem, não identifiquei o problema.

o erro é o seguinte:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
	at mx.managers::PopUpManagerImpl/http://www.adobe.com/2006/flex/mx/internal::createModalWindow()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:682]
	at mx.managers::PopUpManagerImpl/addPopUp()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:397]
	at mx.managers::PopUpManagerImpl/createPopUp()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:236]
	at mx.managers::PopUpManager$/createPopUp()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\PopUpManager.as:139]
	at ModuloQualquerController/abrePopUp()[C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\src\ModuloQualquerController.as:31]
	at ModuloQualquer/__abrePopUp_click()[C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\src\ModuloQualquer.mxml:23]
aluisiodsv

O objeto q está tentando acessar o método ou a propriedade está nulo.

Coloque o stacktrace inteiro, do começo ao fim. Assim dá pra ver a causa e tudo mais.

aluisiodsv
private function closeMe(e:CloseEvent):void {
    PopUpManager.removePopUp(titleWindow);
    titleWindow.removeEventListener(CloseEvent.CLOSE, closeMe);
}

Não manjo muito de flex, mas está certo isto ?

O médoto se chama closeMe e o último parâmetro passado no método removeEventListener tbm se chama closeMe

tukA

Realmente aquilo estava ali por engano, eu já removi, e também atualizei o código, trocando o parent do popup, assim como vi em um exemplo em um site gringo. O erro agora é diferente:

[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\TestePopUp.swf\[[DYNAMIC]]\1 - 370,463 bytes after decompression
[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\TestePopUp.swf - 173,422 bytes after decompression
[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\TestePopUp.swf\[[DYNAMIC]]\2 - 2,292,131 bytes after decompression
[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\TestePopUp.swf\[[DYNAMIC]]\3 - 648,239 bytes after decompression
[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\TestePopUp.swf\[[DYNAMIC]]\4 - 441,686 bytes after decompression
[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\TestePopUp.swf\[[DYNAMIC]]\5 - 1,429,050 bytes after decompression
[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\TestePopUp.swf\[[DYNAMIC]]\6 - 323,414 bytes after decompression
[SWF] C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\bin-debug\ModuloQualquer.swf - 143,007 bytes after decompression
ArgumentError: Undefined state 'inactive'.
	at mx.core::UIComponent/getState()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9908]
	at mx.core::UIComponent/findCommonBaseState()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9928]
	at mx.core::UIComponent/commitCurrentState()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9750]
	at mx.core::UIComponent/commitProperties()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:7857]
	at spark.components.supportClasses::GroupBase/commitProperties()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\components\supportClasses\GroupBase.as:1058]
	at spark.components::Group/commitProperties()[E:\dev\4.0.0\frameworks\projects\spark\src\spark\components\Group.as:743]
	at mx.core::UIComponent/validateProperties()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:7772]
	at mx.managers::LayoutManager/validateClient()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:863]
	at mx.managers::PopUpManagerImpl/addPopUp()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:383]
	at mx.managers::PopUpManagerImpl/createPopUp()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:236]
	at mx.managers::PopUpManager$/createPopUp()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\PopUpManager.as:139]
	at ModuloQualquerController/abrePopUp()[C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\src\ModuloQualquerController.as:32]
	at ModuloQualquer/__abrePopUp_click()[C:\Users\DIEGO\Adobe Flash Builder 4\TestePopUp\src\ModuloQualquer.mxml:23]
aluisiodsv

Ele está pegando o state ‘inactive’, porém ele não existe.

Se for um state customizado.
Será q tem alguma coisa a ver com isto ? Não vi nada disto em seu código

<mx:states>

&lt;mx:State name="teste"&gt;        

    ...
        
 &lt;/mx:State&gt;

</mx:states>

Senão, pode ser q o estado inactive não existe no componente q vc está usando. Talvez seja necessário usar outro state.

Desculpa cara, é o q eu imagino ser. Mas na vdd eu não manjo muito de flex.

tukA

Resolvido:

Li que o parent do addPopUp() não pode ser um módulo, então utilizei uma referencia ao application mesmo e funcionou.

Caso exista sim a possibilidade da utilização de um módulo como parent, me informem.

Obrigado aluisiodsv por sua atenção.

aluisiodsv

Opa, tranquilo.

Tentei ajudar no q pude.

Criado 12 de agosto de 2010
Ultima resposta 12 de ago. de 2010
Respostas 8
Participantes 2