A ver si soy capaz de explicame y algún alma caritativa puede ayudarme.
El caso es que estoy haciendo un programa que tiene 3 clases(entre muchas otras): USUARIO, CONTROLADOR_USUARIO y CONTROLADOR_VISTA.
La idea es que la clase USURAIO sea un contenedor de datos, donde entre otras cosas figuran los atributos: Nombre, Apellido1 y Apellido2.
Por otro lado, la clase CONTROLADOR_VISTA hace una llamada a un método de la clase CONTROLADOR_USUARIO, que debe cargar los datos de un fichero de texto en un objeto de la clase USUARIO.
La clase CONTROLADOR_USUARIO utiliza el método que antes mencioné con una llamada a un evento dentro que asigna cada valor del fichero de texto al argumento correspondiente del objeto de la clase USUARIO.
Ahora es donde viene el problema. La llamada al evento se ejecuta después de que el código de la clase CONTROLADOR_VISTA continúe, por lo que los datos que veo al hacer un trace("nombre " + "apellido1 "+ "apellido2") son los que había en el objeto de la clase USUARIO antes de la supuesta carga de fichero.
Vamos, en otras palabras, que se ejecuta antes el código posterior que la llamada al evento donde se cargan los datos del fichero.
No soy capaz de resolver el entuerto, asi que agradezco cualquier ayuda.
Os dejo el código para ayudar a entenderlo mejor.
Case Usuario:
Código actionscript:
Ver original
public class Usuario // Esta clase es un contenedor de datos de usuario. { // Atributos privados de usuario. No queremos que nadie acceda a ellos directamente. private var nombre:String; private var apellido1:String; private var apellido2:String; // Método de creación de la clase Usuario. public function Usuario() { this.nombre = null; this.apellido1 = null; this.apellido2 = null; } public function set_nombre(n:String){ // modifica el nombre del usuario this.nombre=n; } public function set_apellido_1(a1:String){ // modifica el apellido 1 del usuario this.apellido1=a1; } public function set_apellido_2(a2:String){ // modifica el apellido 2 del usuario this.apellido2=a2; } public function get_nombre():String{ // modifica el nombre del usuario return this.nombre; } public function get_apellido_1():String{ // modifica el apellido 1 del usuario return this.apellido1; } public function get_apellido_2():String{ // modifica el apellido 2 del usuario return this.apellido2; } }
Extracto de la Clase CONTROLADOR_USUARIO:
Código actionscript:
Ver original
.............. private var user:USUARIO = new USUARIO(); .............. public function cagarDatosFicheroUsuario(nombreFich:String) // Método que carga en un fichero de texto todos los nombres de ficheros de usuario que existen. { // Abrimos y leemos el fichero nombreFich para cargarlo en el usuario user. var envio:URLRequest = new URLRequest("ficheros/usuarios/" + nombreFich); var recibo:URLLoader = new URLLoader(); recibo.addEventListener(Event.COMPLETE, cargaDesdeFichero); recibo.load(envio); function cargaDesdeFichero(event:Event):void // Procedimiento que recoge la información desde el fichero de texto. { var variables:URLVariables = new URLVariables(event.target.data); variables.dataFormat = URLLoaderDataFormat.VARIABLES; user.set_nombre(variables.nombre); user.set_apellido_1(variables.apellido1); user.set_apellido_2(variables.apellido2); user.set_rol(variables.rol); user.set_curso(variables.curso); user.set_suma(variables.suma); user.set_contador(variables.contador); user.set_f_alta(variables.fecha_alta); user.set_f_baja(variables.fecha_baja); } } public function concatenacion ():String // Devuuelve una cadena de texto concatenando nombre, apellido1, apellido2 y ".txt" del objeto user. { var cadena:String = user.get_nombre() + user.get_apellido_1() + user.get_apellido_2() + ".txt"; return cadena; }
Extracto de la Clase CONTROLADOR_VISTA:
Código actionscript:
Ver original
......... private var cu:ControladorUsuario = new ControladorUsuario(); ......... private function IdentificacionUsuario(event:MouseEvent):void // Método que elimina la pantalla de login y abre la de menú principal para un usuario identificado. // Si el usuario no es correcto se genera un mensaje de error. { // Recogemos los datos introducidos por el usuario en la pantalla de login. var nombreInput:String = l.getDatosIntroducidos(); // Pasamos a minúsculas los datos introducidos por el usuario. nombreInput = nombreInput.toLowerCase(); // Cargamos los datos del usuario desde el fichero dado. cu.cagarDatosFicheroUsuario(nombreInput); // AQUÍ HAY UN PROBLEMA QUE SE DEBE RESOLVER. LA FUNCIÓN "CARGARDATOSFICHEROUSUARIO" LLAMA A OTRA FUNCIÓN POR EVENTO QUE METE LOS DATOS // EN EL OBJETO USUARIO. SIN EMBARGO, ESTA FUNCIÓN DE EVENTO SE EJECUTA DESPUÉS DEL MÉTODO "CONCATENAVALORESUSUARIO" QUE VIENE AQUÍ DEBAJO, POR LO QUE // CONCATENA LOS VALORES VIEJOS DEL OBJETO USUARIO CON "CONCATENAVALORESUSUARIO" Y NO LOS NUEVOS, PUES ESTOS SE LE ASIGNAN JUSTO DESPUÉS. // Obtenemos una cadena con los datos del usuario del fichero de texto cargado. var nombrefich:String = cu.concatenaValoresUsuario(); trace(nombrefich); if (nombreInput == nombrefich) { this.removeChild(l); mppal = createMenuPpal(); if (cu.getRolUsuario() == "p") { // Un profesor puede ver la opción de administración. mppal.setVisibilidad(true); } else { // Un usuario que no sea profesor no debe ber la opción de administración. mppal.setVisibilidad(false); } this.addChild(mppal); } else { this.errorbox.setMensaje("Los datos introducidos son erróneos"); } }