Comunidad de diseño web y desarrollo en internet online

Resultado en un campo de texto desde una clase.

Citar            
MensajeEscrito el 24 Ene 2010 12:57 pm
Hola.

A ver si alguien me ayuda porque con AS3 a veces me atasco en tonterias.

Pretendo subir una imagen al un servidor. Para ello é usado la clase FileReference siguiendo un ejemplo sacado de internet. En este ejemplo el código estaba dentro del .fla y el resultado de las funciones ("cargando", "error...", "imagen cargada", ...) los mostraba en un campo de texto colocado en el escenario.

Yo quiero hacer lo mismo pero colocando el código en una clase.

Mi pregunta es esta, usando esta clase:

Código ActionScript :

package clases{
   //Clases necesarias
   import flash.events.*;
   import flash.net.FileFilter;
   import flash.net.FileReference;
   import flash.net.URLRequest;

   public class subirImagen {
      private var uploadURL:URLRequest;
      private var archivo:FileReference;

      //Función llamada al pulsar examinar, se crea el filereference y se abre el navegador de archivos
      public function subirImagen():void {
         uploadURL = new URLRequest();
         uploadURL.url = "uploadFile.php";
         archivo = new FileReference();
         ponerListeners(archivo);
         archivo.browse(getTypes());
      }

      //Añado los listener al objeto filereference
      private function ponerListeners(dispatcher:IEventDispatcher) {
         dispatcher.addEventListener(Event.CANCEL, cancelHandler);
         dispatcher.addEventListener(Event.COMPLETE, completeHandler);
         dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
         dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
         dispatcher.addEventListener(Event.OPEN, openHandler);
         dispatcher.addEventListener(ProgressEvent.PROGRESS, progressHandler);
         dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
         dispatcher.addEventListener(Event.SELECT, selectHandler);
         dispatcher.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,uploadCompleteDataHandler);
      }

      //Con está función se generan los tipos de archivos que estarán disponibles para seleccionar desde el navegador
      private function getTypes():Array {
         var allTypes:Array = new Array(getImageTypeFilter(), getTextTypeFilter());
         return allTypes;
      }

      //Tipos de imágenes admitidos, tanto para pc como para mac
      private function getImageTypeFilter():FileFilter {
         return new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)","*.jpg;*.jpeg;*.gif;*.png");
      }

      //Tipos de archivos de texto admitidos, para pc y mac
      private function getTextTypeFilter():FileFilter {
         return new FileFilter("Text Files (*.txt, *.rtf)","*.txt;*.rtf");
      }


      //Se distribuye cuando se cancela la descarga desde el navegador de archivos. 
      private function cancelHandler(event:Event):void {

         trace("Subida cancelada.");
      }

      //Se distribuye cuando se finaliza la descarga o la carga
      private function completeHandler(event:Event):void {
         trace("Subida completada.");
      }

      //Se reciben datos del servidor tras completar la carga
      private function uploadCompleteDataHandler(event:Event):void {
         trace("Subida confirmada por el servidor.");
      }

      //Se produce cuando falla la carga y hay un código http de error. 
      //Por ejemplo si no se encuentra el PHP, se generará un error 404.
      private function httpStatusHandler(event:HTTPStatusEvent):void {
         trace("Se ha producido el siguiente error: " + event.status);
      }

      //Se produce cuando falla la carga o descarga
      private function ioErrorHandler(event:IOErrorEvent):void {
         trace(event.text);
      }

      //Se inicia la carga o descarga
      private function openHandler(event:Event):void {
         trace("Comienza la subida");
      }

      //Se distribuye periodicamente durante la carga o la descarga, mostrando el progreso de la misma. 
      private function progressHandler(event:ProgressEvent):void {
         var file:FileReference = FileReference(event.target);
         trace(event.bytesLoaded + " bytes de " + event.bytesTotal + " bytes subidos.");
      }

      //Se distribuye al intentar descargar o cargar un archivo de un servidor fuera del entorno de seguridad de la película
      private function securityErrorHandler(event:SecurityErrorEvent):void {
         trace("El servidor no permitió la carga del archivo.");
      }

      //Se distribuye al elegir el archivo para carga o descarga desde el navegador de archivos.
      function selectHandler(event:Event):void {
         //donde.text = "";
         var archivo:FileReference = FileReference(event.target);
         trace("Archivo elegido: " + archivo.name + "Tamaño = " + archivo.size + " bytes.");
         if (archivo.size > 2000000) {
            trace("No se pueden subir archivos de más de 2000 KB.");
         } else {
            archivo.upload(uploadURL);
         }
      }
   }
}


A la que llamo desde el .fla así:

Código ActionScript :

import clases.subirImagen;

function buscarImagen(event:MouseEvent) {
   var subir:subirImagen = new subirImagen();
}

examinar.addEventListener(MouseEvent.CLICK,buscarImagen);


¿Cómo hago para que lo que ahora mismo muestro en los "trace" se muestre en un campo de texto colocado en el escenario?

Por juanfher

74 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Ene 2010 06:48 pm
No he leído tu código, es demasiado extenso y pesado. Lo que yo haría es crear una función getter para obtener esos datos y ya. Para hacerlo bien el handler de eventos, tienes que tener en cuenta crear una variable interna que sea por ejemplo "error", alli puedes delinear que error ocurre y luego:

Código ActionScript :

public function get _error():String{
     return this.error;
}


Luego en tu pelicula la invocas para obtener los datos:

Código ActionScript :

trace(myUpload._error);


Saludos, Hernán . -

Por Hernán

BOFH

6148 de clabLevel

19 tutoriales
23 articulos

Genero:Masculino   REC Desarrollador de GAIA

Marketing & IT

firefox
Citar            
MensajeEscrito el 24 Ene 2010 10:32 pm
Nada.... debo ser tonto... a ver, tengo en el escenario un campo de texto al que le llamo "info", la clase la invoco asi:

Código :

import clases.subirImagen;
function buscarImagen(event:MouseEvent) {
var subir:subirImagen = new subirImagen();
}
examinar.addEventListener(MouseEvent.CLICK,buscarImagen);


Y funciona correctamente.

Pero cuando intento que, por ejemplo, al subir la foto ponga "Subida completada." en el campo de texto, no lo consigo.

Código ActionScript :

//Se distribuye cuando se finaliza la descarga o la carga 
private function completeHandler(event:Event):String{ 
var resultado:String = "Subida completada."
return resultado;
}


¿Como hago que en el campo de texto ponga el "resultado"?

Por juanfher

74 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Ene 2010 11:27 pm
tu clase sube la imagen al servidor , ineternamente el evento completo es dispachado y escuchado por tu clase , pero externamente no, es por eso que no puedes poner en un campo de texto cuando esta completado, ya que no puedes poner un campo de texto en tu clase por que no extiende de un displayObject , la solucion es que vuelvas hacer un dispach del evento complete por ejemplo:

Código ActionScript :

private function completeHandler(e:Event):void
{
   dispatchEvent(new Event(Event.COMPLETE));
}

//fuera de la clase

import clases.subirImagen;
function buscarImagen(event:MouseEvent)
{
   var subir:subirImagen = new subirImagen();
   subir.addEventListener(Event.COMPLETE, onComplete);

}
examinar.addEventListener(MouseEvent.CLICK,buscarImagen);

function onComplete(e:Event):void
{
   campoTexto.text = "Subida Completa";
}


Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 25 Ene 2010 05:12 am
... gracias igualmente pero si hago eso me da error: 1180: Llamada a un método dispatchEvent posiblemente no definido.

Por juanfher

74 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Ene 2010 04:30 pm
intenta extender tu clase de Event o EventDispatcher.


Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 25 Ene 2010 05:46 pm
Gracias jn_Flash.

Efectívamente, mi error estaba en que no extendía la clase. En vez de:

Código ActionScript :

public class subirImagen{
[...]
}

Tenía que hacer:

Código ActionScript :

public class subirImagen extends EventDispatcher{
[...]
}

Por juanfher

74 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Ene 2010 06:37 pm
Pero no le veo la utilidad... a lo mejor es que me estoy equivocando en el planteamiento.

Originalmente el código estába pensado para ir en un fotograma dentro del .fla. De esta menera funciona perfectamente y el campo de texto que hay en el escenario se rellena con el resultado de cada funcion:

Código ActionScript :

function openHandler(event:Event):void {
   campodetexto.text = "Comienza la subida";
}

y

Código ActionScript :

function progressHandler(event:ProgressEvent):void {
   var file:FileReference = FileReference(event.target);
   campodetexto.text = event.bytesLoaded + " bytes de " + event.bytesTotal + " bytes subidos.";
}

entre otras (como podeis ver arriba).
Mi intención era crear una clase con para reitilizarla más facilmente pensando que podría rellenar el campo de texto de manera similar.
El caso es que si tengo que hacer una función del estilo:

Código ActionScript :

function onComplete(e:Event):void {
   clipTexto.campoTexto.text = "listo";
}

para cada respuesta dentro del .fla, para eso es mejor no usar una clase y colocar el código como estaba originalmente, dentro de un fotograma del .fla.

¿Hay otra forma de que pueda usar la clase y que no necesite crear varias funciones para las respuestas? Algo del estilo:
En la clase:

Código ActionScript :

function progressHandler(event:ProgressEvent):String{
   var file:FileReference = FileReference(event.target);
   infoRespuesta = event.bytesLoaded + " bytes de " + event.bytesTotal + " bytes subidos.";
   return infoRespuesta;
}

y el el .fla:

Código ActionScript :

   campoTexto.text = infoRespuesta;

o directamente en la clase:

Código ActionScript :

function progressHandler(event:ProgressEvent):void{
   var file:FileReference = FileReference(event.target);
   campoTexto.text = event.bytesLoaded + " bytes de " + event.bytesTotal + " bytes subidos.";
}

Por juanfher

74 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Ene 2010 06:47 pm
no creo que eso no se puede yo he intentado y no he podido , y eso es por la gestion de eventos de Flash, para poder usar el campo del texto , tu clase debe estender de Sprite o MovieClip , para que puedas hacer un addChild.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 25 Ene 2010 11:23 pm
Ok, ya lo he solucionado... y era una tontería, al final no hizo falta nada de lo anterior.

A la clase que posteé había que añadirle:

Código ActionScript :

import flash.text.TextField;

declarar:

Código ActionScript :

private var campo:TextField;

y pasarle la variable:

Código ActionScript :

public function subirImagen(texto:TextField):void {
campo = texto;
...
}

finalmente en las funciones de respuesta declar los resultados

Código ActionScript :

campo.text = "loquesea";

y llamar a la clase desde el .fla indicandole como variable el nombre del campo de texto:

Código ActionScript :

var subir:subirImagen = new subirImagen(campoTexto);


Gracias a todos igualmente.

Por juanfher

74 de clabLevel



 

firefox
Citar            
MensajeEscrito el 25 Ene 2010 11:48 pm
buena solucion aun que yo me referia a poder detectar los eventos desde fuera , sin necesidad de volver a disparar sus eventos.

Jonathan.

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox

 

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