Comunidad de diseño web y desarrollo en internet online

Evento cuando cambia una variable

Citar            
MensajeEscrito el 17 Jun 2008 07:44 pm
Hola amigos,

Este es mi primer mensaje en el foro a pesar de que visito la página hace mucho.
Mi pregunta:
Tengo una clase llamada "Calendario" dentro de la cual hay una protected var llamada "language", desde otras clases yo puedo modificar esta variable... no necesariamente presionando un botón, esta variable puede cambiar por una asignación directa (Calendario.language="English").
Necesito lanzar un evento cada vez que esta variable cambie su valor para entonces re-asignar los Array que tienen los nombres de los días de la semana en cada idioma.
Si pongo el dispatchEvent dentro de public function set language { ...... solo se ejecuta la primera vez cuando le doy valor a la variable, pero una vez dibujado el calendario si se cambia el idioma no me entero... por eso necesito agregar el evento cuando cambia la variable.
¿Alguien tiene un ejemplo en el que se emita un evento cuando cambia una variable?

Saludos y gracias!!!!!

Silverio

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 17 Jun 2008 09:26 pm
El setter se ejecuta cada vez que cambias el valor, dado que es protected, quizás otras asignaciones fallen. Asegúrate 8agregando un trace) que el setter se ejecute, luego revisa tu cadena de eventos

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Jun 2008 10:09 pm
Jorge,
Gracias por la respuesta, pero sigo con el mismo problema... te doy un poco más de detalles.

EN LA CLASE "Calendario":

Código :

...
protected var __language : String = "Spanish";
...
...
public function set language (l : String) : void {
     trace("se ejecutó el setter");
     __language = l;
}


DESDE LA CLASE "ChangeLanguage":

Código :

...
Locale.loadLanguageXML(actual_language, changedLanguage);
private function changedLanguage (success:Boolean):void {
     if (success) {
          var target = this.parent.getChildAt(7);
          trace(target);  // devuelve [Object SelectDate]
          var objeto = target.getChildAt(0); 
          trace(objeto); // devuelve [Object MovieClip] <- instancia de Calendario
          objeto.language = "Spanish";
          trace(objeto.language); // devuelve "Spanish"
     } else {
          // error cargando archivo XML de idiomas
     }
}

Como ves hay un trace dentro del setter que se está ejecutando solo una vez... en la MainMovie cuando:

Código :

var selector:Calendario = new Calendario();
selector.language = "Spanish";

Solo en este momento me llega el mensaje del Trace.

¿Qué estoy haciendo mal?
Saludos,

Silverio

editado por eldervaz

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 17 Jun 2008 10:24 pm
¿La clase ChangeLanguage está dentro del mismo paquete?
¿Estás ejecutando changedLanguage? Porque por lo que me cuentas, solo se ejecuta en el principal

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Jun 2008 10:47 pm
La estructura es más o menos así:
Stage
|--- Board (sprite)
|--- Menu (sprite)
|--- ChangeLanguage (sprite)
|--- btnChange (boton)
|--- SelectDate (sprite)
|--- Calendario (MovieClip)
Board, Menu, ChangeLanguage y SelectDate pertenecen al paquete "kiosk"
Calendario pertenece al paquete "utils"

Calendario se importa en SelectDate de esta manera:
import utils.*;

Cuando se presiona el botón "btnChange" se llama a la función que cambia la variable Calendario.language... eso es lo que no está funcionando... a pesar de que con un trace me aseguro de que el getChildAt(0) está apuntando al objeto corecto no me funciona el trace del setter.

Saludos.

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 17 Jun 2008 10:50 pm
Sorry, cuando se publicó el post me quitó todos los espacios al inicio de cada línea y me deformó la estructura...
Stage -> Board
Stage -> Menu
Stage -> ChangeLanguage -> btnChange
Stage -> SelectDate -> Calendario

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 17 Jun 2008 11:16 pm
Si la variable es protected, es solo accesible desde la clases que la heredan, con lo cual no funcionará

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Jun 2008 11:27 pm
En la clase ChangeLanguage hay un botón para cambiar el idioma, si le doy click se ejecuta una función... si dentro de esa función pongo trace(objeto.language); me devuelve "Spanish" o "English", lo que quiere decir que si está leyendo la variable... el problema es cuando quiero modificarlo.

?????????????

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 18 Jun 2008 12:28 am
Cambia

Código :

protected var __language : String = "Spanish";

por

Código :

public var __language : String = "Spanish";

A ver que pasa

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Jun 2008 01:28 am
Gracias Jorge por el tiempo que me has dedicado... pero ya hice el cambio y sigue sin funcionar.

Recapitulando:
Tengo una clase ubicada en otro paquete (paquete controls) que en su encabezado tiene:

Código :

package com.controls
{
   import flash.events.EventDispatcher;
   import flash.events.Event;
   import flash.display.MovieClip;
   import flash.text.TextField;
   import flash.text.TextFormat;
   
   public class Calendar extends flash.events.EventDispatcher
   {
      // Properties
      protected var __name : String = "Calendar";
      protected var __width : Number = 250;
      protected var __height : Number = 230;
      protected var __x : Number = 0;
      protected var __y : Number = 0;
      protected var __visible : Boolean = true;
      protected var __alpha : Number = 100;
      protected var __topLabel : String = "";
      public var __language : String = "Spanish";



En su constructor:

Código :

      // Constructor
      public function Calendar ()
      {
      }
      
      // Initialize Calendar
      public function init () : void
      {
         labelStyle = new TextFormat ("Verdana", 12, 0x000000, false);
         labelStyle.align = TextFormatAlign.CENTER;
         if (calendar)
                                                 ...
                                                 ...


y más abajo en la parte del setting:

Código :

      // language
      public function set language (l : String) : void
      {
         trace("paso por el setting!!!!!!");
         __language = l;
      }
      public function get language () : String
      {
         return __language;
      }


Por otro lado tengo tengo una Clase llamada SelectDate que importa la Clase Calendar:

Código :

package kiosk {
   
   import flash.display.*;
   import flash.events.*;
   import com.controls.Calendar;
   
   public class SelectDate extends Sprite {

      public function SelectDate() {
      
      }
      
      public function init():void {

         var selectorIda:Calendar = new Calendar();
         selectorIda.language = "English";
         selectorIda.x = 132;
         selectorIda.y = 198;
         selectorIda.addEventListener ("select", selectHandler);
         selectorIda.init ();

         function selectHandler(event:Event):void {
            trace("se selecciono una fecha");
         }
      }
   }
}


Hasta ahi no hay problemas... el Calendario se dibuja en pantalla y me llega el trace del setter.

Se crea una clase llamada ChangeLanguage (está en el Stage al mismo nivel que SelectDate), ahi se dibuja un botón que realiza el cambio de idioma, una vez que se cambian los textos en pantalla trata de cambiar el idioma del Calendario.

Código :

package kiosk {
   
   import flash.display.*;
   import flash.events.*;
   import fl.controls.*
   import com.controls.Calendar;
   
   public class ChangeLanguage extends Sprite {

      public function ChangeLanguage() {
      
      }
      
      public function init():void {
         
         var btn3:Button = new Button();
         btn3.name = "btn3";
         btn3.emphasized = true;
         btn3.setSize(100, 40);
         btn3.move(350, 480);
         btn3.addEventListener(MouseEvent.CLICK, buttonClick);
         this.addChild(btn3);
      }
      
      private function buttonClick (e:MouseEvent) {
         var button:Button = e.target as Button;
         w.ToWrite ("Presionado botón: " + button.label);
         switch (button.name) {
            case "btn1" : break;
            case "btn2" : break;
            case "btn3" : 
               // change label and modify global variable
               if (btn3.label == "English") {
                  var actual_language = "en";
                  btn3.label = "Español";
               } else {
                  var actual_language = "es";
                  btn3.label = "English";
               }
            
               // updating language
               Locale.loadLanguageXML(actual_language, completeChangedLanguage);
         }
      }
      
      private function completeChangedLanguage (success:Boolean):void {
         if (success) {
               var target = this.parent.getChildAt(7); 
               trace(target); // devuelve [Object SelectDate] 
               var objeto = target.getChildAt(0); 
               trace(objeto); // devuelve [Object MovieClip] <- instancia de Calendario 
               objeto.language = "Spanish"; 
               trace(objeto.language); // devuelve "Spanish"
            // ..............................

         } else {
            // error
         }
      }
   }
}


Y ahi está el problema, pues no recibo ningún trace desde la función language en la clase Calendar.

¿Alguna sugerencia?

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 18 Jun 2008 02:01 am
Pasa del setter y hazlo explícito como método

Código :

public function setLanguage (l : String) : void
      {
         trace("Cambio lenguaje!!!!!!");
         __language = l;
        dispatchEvent(........)
      }


Luego usa

objeto.setLanguage("Spanish");

Olvida lo de public var, puedes dejarla como protected. La llamada explícita o funciona o genera un error.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 18 Jun 2008 02:25 am
Ya hice los cambios y me da un error cuando le doy click al botón para cambio de idioma:

Código :

TypeError: Error #1006: setLanguage no es una función.
   at kiosk::MenuBooker/::completeChangedLanguage()
   at fl.lang::Locale$/::onXMLLoad()
   at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
   at flash.events::EventDispatcher/dispatchEvent()
   at flash.net::URLLoader/flash.net:URLLoader::onComplete()

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 18 Jun 2008 02:26 am
MenuBooker es la clase de ChangeLanguage, lo que yo le cambié el nombre a varias cosas para que fuera mas entendible

Por silve69

6 de clabLevel



Genero:Masculino  

msie7
Citar            
MensajeEscrito el 18 Jun 2008 09:43 am
Vaya, que raro que no encuentre una función pública. Por el stack en el error parece que has cargado la peli, y que estás usando el onComplete cuando en realidad deberías usar el callback init, que es cuando el código del primer frame de la película cargada está disponible.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.