Comunidad de diseño web y desarrollo en internet online

Clase:Acceder a propiedad de una var de clase. Problema.

Citar            
MensajeEscrito el 03 Ago 2010 08:46 pm
Hola amigos estoy creando una clase y me he encontrado con el siguiente problema. La intencion es que el Timer se repita, tantas veces como letras tenga el texto de la clase q estoy desarrollando, bueno hay dos textos diferentes si estacima en puntero o no. Por eso no se lo indico con la propiedad text directamente.

Código ActionScript :

package
{
public class Clasecualquiera extends TextField
{
public var texto:String="";
public var texto2:String="";
public var tempo:Timer;
public var tempo2:Timer;

public function Clasecualquiera()
{
tempo = new Timer(100,texto.length);
tempo2 = new Timer(100,texto2.length);


.... y la cosa continua claro pero aqui esta el meollo del problema, no puedo acceder a la propiedad length, de la propiedad texto (valga la redundancia) .

Por Luis Borja

17 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Ago 2010 09:25 pm
BuenAS:

Si la tipificas como Clasecualquiera, seguro que no tienes problema en acceder a la propiedad texto, y a su longitud:

Código :

var miCampoTexto:Clasecualquiera = new Clasecualquiera();

trace(miCampoTexto.texto.length); 
//debería mostrar 0, ya que texto es la cadena vacía


Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 03 Ago 2010 10:08 pm
Buenas. Quiero acceder dentro de la clase, no fuera, es decir que lea la propiedad texto (no text ojo),para el Timer que hay dentro de la clase.
O no me he enterado bien o lo que tu haces es llamarlo desde fuera.

Por Luis Borja

17 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Ago 2010 10:11 pm
Tal y como esta ahora el Timer se repite indefinidamente , no el numero de letras que tiene el texto,ahora es cadena vacia pero al instancias si añades un valor de cadena deberia repetirse el length de esa cadena, Pues no lo hac

Por Luis Borja

17 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Ago 2010 10:18 pm
BuenAS:

Dentro de la clase Clasecualquiera, es automático; en cualquier pto. puedes escribir, por ejemplo:

trace(texto.length);

y debe mostrar 0 (cero), ya que texto, según tu código tiene valor "";

Una clase puede acceder a todas sus propiedades públicas (protegidas y privadas, también, lógicamente).

Creía que el problema venía de que como la clase extiende de TextField, lo mismo estabas tipificándola como TextField, y con esta forma de hacerlo sí que NO puedes acceder a la propiedad "texto"; o sea si hicieras:

trace(TextField(miCampoTexto).texto.lenght);

se emitiría un error diciendo que TextField no tiene la propiedad texto.

Un saludo.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 03 Ago 2010 10:21 pm
BuenAS:

Creo que ya he localizado el problema: Lanza el Timer DESPUÉS de dar valor al campo texto. Si lo haces en el constructor, la variable texto="" y por tanto su longitud es cero. Un Timer que como segundo parámetro le pases 0 (o ningún valor, ya que el valor por defecto es cero), hace que se repita indefinidamente.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 03 Ago 2010 10:59 pm
Hay esta el tema. Despues dices ¿donde?. El valor sera dado al instanciar ,de esta forma

Código ActionScript :

import ClaseCualquiera;
var textoEspecial:ClaseCualquiera = new ClaseCualquiera);
textoEspecial.texto ="ABCDEFG";
addChild(textoEspecial);



Y ya te digo no se donde colocar el Timer, porque como tu dices lee el valor vacio.

Por Luis Borja

17 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Ago 2010 11:32 pm
BuenAS:

Pues es el sitio ideal para hacer un getter/setter :) Cambia la propiedad texto por:

Código :

private var _texto:String;      
public function get texto():String
{
   return this._texto;
}

public function set texto(value:String):void
{
   this._texto = value;
   tempo = new Timer(100, value.length);
}


No sé cómo lo tienes planteado, pero si vas a asignar varias veces:

textoEspecial.texto = "Una cadena de texto";

acuerdate de comprobar que el Timer ha acabado, o de no ser así, pararlo antes para que no se solape con el nuevo.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 03 Ago 2010 11:35 pm
..ah, se me ha pasado, aunque parece evidente: elimina los Timer del constructor.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 04 Ago 2010 12:07 am
he añadido los getters/setters y me da un error: No se puede acceder a una propiedad o a un metodo de una referencia a un objeto nulo :shock:

Por Luis Borja

17 de clabLevel



 

msie
Citar            
MensajeEscrito el 04 Ago 2010 12:17 am
Amigo,lo que he echo es algo muy parecido a los textos que ves en http://www.pho-ku.com/ debajo de "Sign Up", solo q en mi caso aparecen las letras una a una ( con el Timer) y en cada letra un sonido (el mismo claro),bueno el tema es que se repite indefinidamente si lo dejo OnOver o InOut, por lo que ya sabes, no lee el length del texto ya que le doy el valor al instanciarlo. La solucion no se si es el getter/setter ,pero si es asi me ha dado el error que te comente. Todo funciona corrextamente, incluso si quitase los sonidos o hacerlo como el la web que solo suene una vez no se notaria la diferencia,pero claro yo quiero redondear el tema. Si te interesa el codigo podria pasartelo, pero no pegarlo aqui todo no quiero que lo copypasteen, aunque no es un codigo muy avanzado me esta costando estos primeros pasos.
Gracias.

Por Luis Borja

17 de clabLevel



 

msie
Citar            
MensajeEscrito el 04 Ago 2010 06:36 am
BuenAS:

Echa un vistazo a:

Archivo Fla CS5

Ejemplo swf

Se trata de Flash CS5, si no puedes abrirlo, el botón es la clase BotonTextoRollOver.as

He utilizado Tweener para animar el texto, está en la carpeta "libs". Y está hecho en plan rápido, si haces rápidamente rollOver/rollOut parpadea algo; sería conveniente detener el tween si se produce otro antes de que acabe.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 04 Ago 2010 11:36 am
Dios odio cuando abres Flash y lo que ayer funcionaba ahora no lo hace..Mira esta es mi clase, al instanciar le das los valores de texto y texto 2. Ayer funcionaba a la perfeccion excepto q el timer no paraba, ahora al abrirlo tampoco se kita el primer texto al hacer OVer, no se, algo muy raro, creo que es un bug (lo que me faltaba).

Código ActionScript :

package  {
   import flash.text.TextField;
   import flash.utils.Timer;
   import flash.events.MouseEvent;
   import flash.events.TimerEvent;
   import flash.media.Sound;
   import flash.net.URLRequest;
   
   public class TextRepublic extends TextField
   {
      
      public var texto:String="";
      public var texto2:String="";
      
      public var sonido:Sound = new Sound();
      public var sonido2:Sound= new Sound();
      public var contador:int=-1;
      
      public var tempo:Timer;
      public var tempo2:Timer;
   
   
      
      public function TextRepublic()
      {
         this.tempo = new Timer(120,10);
         this.tempo2 = new Timer(120,10);
         this.sonido.load(new URLRequest("soni1.mp3"));
         this.addEventListener(MouseEvent.ROLL_OVER, onOver);
         this.addEventListener(MouseEvent.ROLL_OUT, onOut);
         this.tempo2.addEventListener(TimerEvent.TIMER, funciontempo2);
         this.tempo2.start();
         // constructor code
      }
      
   
      public function onOver (event:MouseEvent):void
      {
         
      this.text = "";
      this.contador = -1;
      this.tempo2.removeEventListener(TimerEvent.TIMER, funciontempo2);
      this.tempo.addEventListener(TimerEvent.TIMER, funciontempo1);
      
      this.tempo.reset();
      this.tempo.start();
      
      }
      public function onOut (event:MouseEvent):void
      {   
      this.text = "";
      this.contador = -1;
      this.tempo.removeEventListener(TimerEvent.TIMER, funciontempo1);
      this.tempo2.addEventListener(TimerEvent.TIMER, funciontempo2);
      
      this.tempo2.reset();
      this.tempo2.start();
      }
      public function funciontempo1 (event:TimerEvent):void
      {      
      
      this.contador+=1;
      this.appendText(texto.charAt(contador));
      this.sonido.play();
      
      }
      public function funciontempo2 (event:TimerEvent):void
      {      
      
      this.contador+=1;
      this.appendText(texto2.charAt(contador));
      
      }

    }
}
   


Por Luis Borja

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Ago 2010 11:39 am
Por cierto en la carpeta raiz mete un mp3 , en este caso de nombre "soni1.mp3" para ver la prueba de q el timer se repite indefinidamente.
Por otra parte en el codigo que tu me muestras, al meter los valores de texto como parametros, no obligas a que sea el mismo para todas las instancias, el proposito es por supuesto a cada instancia textos distintos.

Por Luis Borja

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Ago 2010 12:02 pm
...pues pasa el mismo texto a cada botón, o distinto texto a cada boton, o uno sí y el otro no, o viceversa.... La verdad que no acabo de pillar el asunto :)

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 04 Ago 2010 02:19 pm
Buah que locura, en el fla que tengo para probar la clase meti un fotograma vacio despues del que tiene el codigo si darme cuenta dandole a algun boton en eso que pruebas y pruebas el codigo. He estado como dos horas para verlo porque no tenia sentido....
Solucionado el "bug" accidental, sehuire intentado el el Timer se adapte al legnth de mis textos.... ya te contare ..

Por Luis Borja

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Ago 2010 02:24 pm
El unico problema que tengo es ese, si le pongo un numero como por ejemplo 15 (suponemos que ningun texto supere los 15), el Timer se repetiria 15 veces y las letras aparecerian una a una, el sonido deberia ser uno solo entonces, ya que no leemos el length de texto, pondria el sonido en la funcion OnOver, en vez de la del Temporizador, y todo quedaria como en la web que te dije, pero claro aqui se trata de seguir aprendiendo y de sacarle punta al asunto, esto que tengo es perfectamente valido, pero no perfecto.

Por Luis Borja

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Ago 2010 02:27 pm
Ahora me pregunto si cuando probre los getter setters estaba ese fotograma que me jodio todo. :shock:
Rebobinado in process...

Por Luis Borja

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Ago 2010 02:48 pm
Nada, con los getters setter el problema que te dije y da igual donde coloque los Timers..

Por Luis Borja

17 de clabLevel



 

chrome
Citar            
MensajeEscrito el 09 Ago 2010 06:33 pm
Nadie sabe nada al respecto?

Por Luis Borja

17 de clabLevel



 

msie
Citar            
MensajeEscrito el 09 Ago 2010 07:55 pm
Tip: resume problema e inicia nuevo hilo, leerse todo esto da muuuucha ....

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.