wtorek, 25 maja 2010

Flex: Rozszerzenie klasy Alert jako oddzielny komponent

Flex nie umożliwia zwracania wartości przy używaniu klasy Alert, szczególnie gdy chcemy obsłużyć odpowiedź na pytania Tak/Nie. Standardowo odpowiedzi wyboru obsługuje się przez zdarzenie CloseEvent. Jest to dość uciążliwe jeżeli w aplikacji mamy kilkadziesiąt pytań o wykonanie jakiejś czynności. Poniżej prezentuje komponent rozszerzający klasę Alert, dodatkowo dodajemy własne ikony do różnych typów alertów.
Poddany przykład poniżej przenosi obsługę zdarzenia na funkcję zewnętrzna np. z poziomu głównej aplikacji.
Oto główna paczka z komponentem rozszerzonym Alert;
 package myComponent
{
    import mx.controls.Alert;
    import mx.core.Application;
    import mx.events.CloseEvent;

    public class alert extends Alert
    {
        yesLabel = "Tak";
        noLabel = "Nie";
        cancelLabel = "Anuluj";
               
        [Bindable]
        [Embed(source="icons/dialog-information.png")]
        private static var IconInfo:Class;
       
        [Bindable]
        [Embed(source="icons/dialog-question.png")]
        private static var IconQuestion:Class;
       
        [Bindable]
        [Embed(source="icons/dialog-error.png")]
        private static var IconError:Class;
       
        [Bindable]
        [Embed(source="icons/dialog-warning.png")]
        private static var IconWarning:Class;
       
        private static var ParentApp:* = Application.application;       
        private static var idFun: uint = 0;
        private static var bQuestion: Boolean = false;
       
        public function alert()
        {
            super();       
        }       

        public static function warning(Msg : String) : void {                       
            show(Msg,"Ostrzeżenie",mx.controls.Alert.OK,null,closeHandle,IconWarning);
        }
       
        public static function error(Msg : String) : void {
            show(Msg,"Błąd",mx.controls.Alert.OK,null,closeHandle,IconError);                   
        }
       
        private static function closeHandle(event:CloseEvent):void{           
            switch (event.detail) {
                case Alert.OK: break;
                case Alert.YES: if (bQuestion) ParentApp.AlertQuestionFun(idFun); break;
            }           
        }
           
        public static function info(Msg : String) : void {           
            show(Msg,"Informacja",mx.controls.Alert.OK, null , closeHandle, IconInfo);
        }
       
        public static function question(Msg : String, funId : uint) : void {
            idFun = funId;   
            bQuestion = true;       
            show(Msg,"Pytanie",mx.controls.Alert.YES | mx.controls.Alert.NO, null, closeHandle, IconQuestion);           
        }       
    }
}

Do głównej aplikacji importujesz rozszerzoną i dodajesz funkcję obsługi
<mx:Script>
        <![CDATA[
            import myComponent.alert;
            public function AlertQuestionFun(fun : int) : void {
                switch (fun) { 
                    case 1: {Alert.show("Test - wykonanie funkcji obsługi nr 1");} break;
                    case 2: {Alert.show("Test - wykonanie funkcji obsługi nr 2");} break;
                }
            }
 ]]>
    </mx:Script> 

I używasz rozszerzonej klasy w ten sposób:
alert.info("Ważne informacje dotyczące wykonywanych operacji");
- dla wyświetlenia informacji
alert.warning("Uwaga! Nie można wykonać tej czynności");
 
- dla wyświetlenia ostrzeżenia
alert.error("Kopiowanie danych nie powiodło się!");
 
- dla wyświetlenia błędu wykonania

alert.question("Czy napewno chcesz to zrobic?", 1);
 
- dla wyświetlenia pytania o wykonanie czynności.
Zwróć uwagę, że w ostatnim przykładzie przekazujesz nr funkcji do wykonania (1) w przypadku akceptowanie czynności

Brak komentarzy:

Prześlij komentarz