Flex/As3 – Truques e Dicas #11 – Mass PopUpRemover

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 […]

  • Gabriela March 12, 2010

    “Bom, é quase uma inutilidade”
    Tá brincando, né? Quantas vezes eu já vi essa pergunta? Vai ajudar um montão de almas!
    []´s

  • Rodrigo March 15, 2010

    Adorei a “meia transparente”. Tem para pé tamanho 42?

  • Julio Cesar April 23, 2010

    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. ;)

  • Mário Santos April 23, 2010

    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.

  • Jonas Detoni May 14, 2010

    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

Leave a Comment

Post