A aplicação que estou desenvolvendo tem alguns módulos que por sua vez
permitem abrir múltiplas janelas.
Acontece que quando é preciso fazer um Alert, este aparece por baixo
dos popups (TitleWindow) de modo que o alert ficando invisivel parcial
ou totalmente.
O problema ocorre mesmo com Alerts modais. Procurei uma solução pra
isso e o consenso parece ser setar o child index do alert da seguinte
maneira:

var thisAlert:Alert = Alert.show(mensagem, titulo, Alert.OK);
thisAlert.parent.setChildIndex(thisAlert, thisAlert.parent.numChildren
- 1);

Esse é um codigo comum para fazer o "bringToFront" mas no meu caso nao
surtiu o efeito esperado, isto é, o Alert continuava aparecendo por
baixo do TitleWindow.
Essa questão já vinha incomodando a um certo tempo, mas hoje por
coincidencia estava olhando a classe do Chris Callendar (link abaixo)
para tratamento de ErrorTips quando encontrei a funcao bringToFront
dele. Adaptei o codigo para trabalhar com Alerts no lugar de ErrorTips
e finalmente consegui fazer os Alerts aparecerem por cima das
TitleWindows.
O codigo é esse a seguir:

//imports
import mx.controls.Alert;
import mx.core.FlexGlobals; //flex4

import flash.display.DisplayObject;
import mx.core.IChildList;
import mx.managers.SystemManager;

//popup
var thisAlert:Alert = Alert.show(mensagem, titulo, Alert.YES |
Alert.NO, FlexGlobals.topLevelApplication.systemManager);
bringToFront(thisAlert);

//inspirado na funcao da classe ErrorTipManager de Chris Callendar:
http://flexdevtips.blogspot.com/2009/08/always-showing-error-tips-validators.html
public static function bringToFront(dispObj:Alert) : void {
        var parent:IChildList = (dispObj.parent as IChildList);
        if (parent is SystemManager) {
                parent = (parent as SystemManager).rawChildren;
        }
        var index:int = parent.getChildIndex(dispObj as DisplayObject);
        var children:int = parent.numChildren;
        if (index < (children - 1)) {
                parent.setChildIndex(dispObj as DisplayObject, children - 1);
        }
}

O ponto chave é tratar o SystemManager como um parent diferenciado.
Dessa forma o child index é calculado corretamente e o efeito
bringToFront ocorre conforme esperado.
Usando uma subclasse de Alert para tratar os popups fica facil de
encapsular o comportamento de bringToFront em toda a aplicação.
Enfim, talvez haja uma maneira mais simples de fazer isso mas de toda
maneira, esse codigo foi util pra mim e talvez possa ajudar alguem.

PS: O codigo usa FlexGlobals.topLevelApplication (flex 4). Para o flex
3 deve-se usar Application.application.

--
Claudio Luiz Ferreira

-- 
Você recebeu esta mensagem porque está inscrito na lista "flexdev"
Para enviar uma mensagem, envie um e-mail para flexdev@googlegroups.com
Para sair da lista, envie um email em branco para 
flexdev-unsubscr...@googlegroups.com
Mais opções estão disponíveis em http://groups.google.com/group/flexdev

Responder a