Para eliminar de la "DisplayList" un objecto, lo hacemos con removeChild. Así que, sí que "debería" funcionar. Conviene saber sí está o no en la displayList así que escribiríamos
Código ActionScript :
function botonOnClick(e:Event){
if (loader.parent){
removeChild(loader)
//para liberar memoria igualamos el contenido a null
loader.content=null;
}
....resto de código...
}
Claro, que tienes que cambiar los botones de la galería como indiqué antes para añadirlo al stage si es que no está añadido.
Vale, el error que te da será que no puede acceder a un objeto nulo o algo así. Eso es porque no has definido loader a nivel general.
Dos códigos
Código ActionScript :
//Primer caso, definimos loader FUERA de cualquier función
//se podrá eliminar con removeChild
var loader:Loader=new Loader()
bt1.addEventListener(MouseEvent.CLICK,anadirImagen)
function anadirImagen(e:Event){
loader.load(new URLRequest("imagen1.jpg"));
}
Código ActionScript :
//Segundo caso, definimos loader en la función anadirImagen
bt1.addEventListener(MouseEvent.CLICK,anadirImagen)
function anadirImagen(e:Event){
var loader:Loader=new Loader()
loader.load(new URLRequest("imagen1.jpg"));
}
Los dos códigos hacen lo mismo, lo que ocurre es que en el primer caso la variable "loader" que hace referencia al Loader es accesible desde cualquier función. en cambio la segunda es una variable "temporal" (por estar definida dentro de una función) Y sólo tiene valor DENTRO de la función. Así, en el primer caso podemos tener otro botón y escribir
Código ActionScript :
btEliminar.adEventListener(MouseEvent.CLICK,quitarImagen)
function quitarImagen(e:Event){
removeChild(loader) //<--al ser "accesible" desde cualquier función podemos eliminarlo simplemente
}
En el segundo caso NO podemos acceder al "loader". Pensemos que DENTRO de una función en AS (en general cualquier lenguaje "Visual") sólo tenemos acceso a:
1.-variables que le pasemos como argumentos
2.-variables generales definidas "a nivel de aplicación" (Vale, definidas fuera de cualquier función)
3.-objetos que estén en el stage (han de extender de DisplayObject, esto es nos vale un Sprite, una Shape, un Loader.... y haberse añadido con un addChild)
¡aja! debemos capturar nuestro loader
El único modo de "capturar objetos que estén en el stage" es mediante las instrucciones
getChildAt() y getChildByName()
getChildAt() Precisa saber el "index" donde se ha colocado
getChildByName Precisa saber la propiedad "name" del "DisplayObject".
Vale, tal y como lo tenemos en el segundo código no sabemos ni el "index" donde se ha colocado ni la propiedad "name". Así que cambiemos un poco el segundo código
Código ActionScript :
bt1.addEventListener(MouseEvent.CLICK,anadirImagen)
function anadirImagen(e:Event){
var loader:Loader=new Loader();
loader.name="miloader" //<---le damos valor a la propiedad "name"
loader.load(new URLRequest("imagen1.jpg"));
}
Así sí que podríamos tener nuestro segundo botón
Código ActionScript :
btEliminar.adEventListener(MouseEvent.CLICK,quitarImagen)
function quitarImagen(e:Event){
var mc:DisplayObject=getChildByName("miloader")
if (mc!=null){
removeChild(mc);
}
}
Varias cosas sobre el código
1.-getChildByName -así como getChildAt devuelve un objeto de tipo DisplayObject. Ese es el motivo por el que lo hemos igualado a una variable de tipo "DisplayObject"
2.-Antes de hacer el removeChild, comprobamos que efectivamente exista
En este caso nos vale que la variable sea del tipo DisplayObject porque sólo vamos a "removerlo". Si quisiéramos acceder a una propiedad del loader -por ejemplo a su propiedad "content", debemos igualarlo a una variable de tipo Loader, pero debemos hacer también una "conversión de cast". Esto es, le vamos a decir que lo que nos devuelva la función getChildByName lo "trate" como si fuera un objeto Loader
Código ActionScript :
function quitarImagen(e:Event){
var mcLoader:Loader=getChildByName("miloader") as Loader //<--sí ese "as Loader" es la "conversión de cast"
//así podemos escribir, por ejemplo
trace(mcLoader.contentLoaderInfo.bytesTotal)
if (mcLoader!=null){
removeChild(mcLoader);
}
}
puff, ya está.