Flex/As3 – Truques e Dicas #11 – Mass PopUpRemover
Vou passar esta dica que apesar de não ser 100% fiavel no meu projecto funcionou a 100% e durante a versão beta de 3 meses, os quais foram necessários para rever, corrigir e distribuir a versão final.
O meu problema inicial foi ter uma forma de remover todos os meus PopUps abertos na aplicação, o que inicialmente parecia bem simples acabou por se tornar numa curiosa pesquisa. O meu projeto permitiria utilizador fazer um “lock” à aplicação para apresentar de novo o painel de login… mas como a aplicação pode ser usada por varios empregos e como a janela “overlay” do login era meia transparente um utilizador terceiro poderia ver dados de telas deixadas abertas pelo empregado anterior.
A solução passava por arranjar uma forma de remover todos os meus popup’s sem necessidade de existir um controlador para “gerir” as janelas abertas.
Se usar o tipico ciclo para percorrer e remover todos os childs da aplicação ele iria acabar por remover também a minha tela de login, os menus, a control bar… enfim… muita coisa que eu não queria ver desaparecer…
Foi então que parti à pesquisa de uma solução e eis a dica, a class SystemManager. Todos os popups sao carregados como childs desta class, eis que tinha descoberto o meu necessário manager e container dos pops. Esta class também contem outros elementos, mas entao como saber quais deles são PopUp’s ??? Simples, se não for um PopUp nao pode ser removido pelo PopUpManager certo? então basta tentar remover child a child com o PopUpManager e interceptar os erros que vão ocorrer ao remover um child “nao-popup”.
Segue a dica:
[coolcode language=actionscript]import mx.managers.PopUpManager;
import mx.managers.PopUpManagerChildList;
private function closeAll():void{
var pops:int=systemManager.numChildren;
while(pops > 1){
try {
PopUpManager.removePopUp((systemManager.getChildAt(1) as IFlexDisplayObject));
pops=systemManager.numChildren;
}
catch(e:Error) {
trace(“Error: “+e.message);
pops=0;
}
finally {
trace(‘Removed ‘+systemManager.getChildAt(1).name)
}
}
}
[/coolcode]É claro que na minha aplicação final isto não pode ser solução… a solução final passou por criar um simples manager (um simples array resolve) que gere todos os PopUp’s abertos, mas fica a dica.
Bom, é quase uma inutilidade! :=)
6 comments
add yours[…] parti à pesquisa de uma solução e eis a dica, a class SystemManager. (…)Leia o resto de Flex/As3 – Truques e Dicas #11 – Mass PopUpRemover (150 […]
“Bom, é quase uma inutilidade”
Tá brincando, né? Quantas vezes eu já vi essa pergunta? Vai ajudar um montão de almas!
[]´s
Adorei a “meia transparente”. Tem para pé tamanho 42?
Uma outra forma para apresentar a tela de login, sem um outro utilizador ver as popups e sem remover as popups é:
Quando for exibir a popup do login fazer o seguinte:
Application.application.setStyle(“modalTransparency”, 1);
PopUpManager.addPopUp(login, Application.application as DisplayObject, true);
Onde na primeira linha, estamos setando a transparência do “modal” para 1, ou seja, sem transparência nenhuma.
Oi Julio,
Sim essa seria uma solução para quem nao quer remover as telas, mas no meu caso era extremamente importante remover as telas existentes porque ao voltar a fazer login, esse utilizador poderia não ter permissões para ver essa tela…
Mas bom, a minha solução e a que aconselho a todos é criarem uma class controladora de todos os popup’s abertos e mante-la atualizado com o removePopUp ou createPopUp, desta forma saberemos exatamente quais os popup’s abertos.
Abraço.
Estava precisando de fazer isso na minha aplicaçao tbm Mário, muito boa sua dica. Implementei ela na aplicação e funcionou corretamente.
Muito obrigado
Abraço