Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   можно ли удалить контейнер таким образом? (http://www.flasher.ru/forum/showthread.php?t=188429)

mheha 03.12.2012 02:07

можно ли удалить контейнер таким образом?
 
создается и заполняется контейнер так:
Код AS3:

function textLoaded(e:Event):void
{
        xml = XML(urlLoader.data);
        xmlList = xml.image;
        initGallery();
}
function initGallery():void
{
        var numOfItems:Number = xmlList.length();
        var counter:Number = 0;
        for (var i:int = 0; i<numOfItems; i++)
        {
                var container:MovieClip = new MovieClip();
                var item:Loader = new Loader();
                item.x = (55 + 5) * i;
                container.big = (xmlList[counter].imgURL);
                container.mouseChildren = false;
                item.load(new URLRequest(xmlList[counter].imgSmallURL));
                container.addChild(item);
                container.addEventListener(MouseEvent.CLICK, showBig);
                addChild(container);
                counter++;
        }
}

а удаляться должен так:
Код AS3:

function hideGallery(e:MouseEvent):void
{
        removeChild(container);
}

управляется двумя слушателями:
Код AS3:

btn_show.addEventListener(MouseEvent.CLICK, showGallery);
btn_hide.addEventListener(MouseEvent.CLICK, hideGallery);

они вызывают функции:
Код AS3:

function showGallery(e:MouseEvent):void
{
        urlLoader.addEventListener(Event.COMPLETE,textLoaded);
        urlLoader.load(new URLRequest("xml/bassein.xml"));
}

и соответственно:
Код AS3:

function hideGallery(e:MouseEvent):void
{
        removeChild(container);
}

при компиляции получаю ошибку:
1120: Обращение несуществующего свойства container.

Ленок 03.12.2012 02:19

Код AS3:

item.parent.parent.removeChild(item.parent)


mheha 03.12.2012 02:34

Цитата:

Сообщение от Ленок (Сообщение 1107479)
Код AS3:

item.parent.parent.removeChild(item.parent)


ошибка изменилась на: 1120: Обращение несуществующего свойства item.

Wolsh 03.12.2012 02:43

Ничего не понял. Создается сотня мувиклипов (зачем мувиклипов?) контейнеров, ссылки на которые нигде не сохраняются, а потом, при нажатии одной кнопки Вы требуете удалить какой-то контейнер. Какой?

mheha 03.12.2012 02:48

Цитата:

Сообщение от Wolsh (Сообщение 1107481)
Ничего не понял. Создается сотня мувиклипов (зачем мувиклипов?) контейнеров, ссылки на которые нигде не сохраняются, а потом, при нажатии одной кнопки Вы требуете удалить какой-то контейнер. Какой?

создаются кнопки из xml (item) и помещаются внутрь контейнера (container), и он добавляется на сцену, кнопки показывают нужную картинку из галереи, я предположил что для того чтобы закрыть галерею полностью нужно просто удалить контейнер со сцены, в котором создаются кнопки (item)

Wolsh 03.12.2012 02:54

Вы не ответили на вопрос.
Код AS3:

btn_hide.addEventListener(MouseEvent.CLICK, hideGallery);

Есть некая одна кнопка btn_hide, при нажатии на которую выполняется хендлер
Код AS3:

function hideGallery(e:MouseEvent):void
{
        removeChild(container);
}

Что именно Вы имели в виду здесь под "container"? Какой из множества?
Другими словами, знает ли кнопка, или ее обработчик, какой именно контейнер имеется в виду? (речь сейчас не о коде, не о значении переменной container, а просто о логике).
Эта кнопка — одна на всю галерею из множества контейнеров? Или она сама находится в контейнере? Вы скрыли наиболее важную информацию.

mheha 03.12.2012 03:03

Цитата:

Сообщение от Wolsh (Сообщение 1107486)
Вы не ответили на вопрос.
Код AS3:

btn_hide.addEventListener(MouseEvent.CLICK, hideGallery);

Есть некая одна кнопка btn_hide, при нажатии на которую выполняется хендлер
Код AS3:

function hideGallery(e:MouseEvent):void
{
        removeChild(container);
}

Что именно Вы имели в виду здесь под "container"? Какой из множества?
Другими словами, знает ли кнопка, или ее обработчик, какой именно контейнер имеется в виду? (речь сейчас не о коде, не о значении переменной container, а просто о логике).
Эта кнопка — одна на всю галерею из множества контейнеров? Или она сама находится в контейнере? Вы скрыли наиболее важную информацию.

я наверное неправильно понял как это работает. Не будете ли Вы так любезны указать в чем моя ошибка и в каком направлении двигаться к решению задачи?
код целиком:
Код AS3:

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.events.Event;
import flash.display.MovieClip;
import flash.ui.Mouse;
 
btn_show.addEventListener(MouseEvent.CLICK, showGallery);
btn_show2.addEventListener(MouseEvent.CLICK, showGallery2);
btn_hide.addEventListener(MouseEvent.CLICK, hideGallery);
 
var urlLoader:URLLoader = new URLLoader();
var xml:XML;
var xmlList:XMLList;
var loaderBig:Loader = new Loader  ;
var imgShowBig:Boolean = false;
 
//скрывает галлерею
function hideGallery(e:MouseEvent):void
{
        removeChild(container);
}
 
//показывает 1-ю галлерею
function showGallery(e:MouseEvent):void
{
        urlLoader.addEventListener(Event.COMPLETE,textLoaded);
        urlLoader.load(new URLRequest("xml/bassein.xml"));
        if (imgShowBig == true)
        {
                removeChild(loaderBig);
                imgShowBig = false;
        }
}
//показывает 2-ю галлерею;
function showGallery2(e:MouseEvent):void
{
        urlLoader.addEventListener(Event.COMPLETE,textLoaded);
        urlLoader.load(new URLRequest("xml/sanuzel.xml"));
        if (imgShowBig == true)
        {
                removeChild(loaderBig);
                imgShowBig = false;
        }
}
loaderBig.addEventListener(MouseEvent.CLICK, hideBigLoader);
function textLoaded(e:Event):void
{
        xml = XML(urlLoader.data);
        xmlList = xml.image;
        initGallery();
}
function initGallery():void
{
        var numOfItems:Number = xmlList.length();
        var counter:Number = 0;
        for (var i:int = 0; i<numOfItems; i++)
        {
                var container:MovieClip = new MovieClip();
                var item:Loader = new Loader();
                item.x = (55 + 5) * i;
                container.big = (xmlList[counter].imgURL);
                container.mouseChildren = false;
                item.load(new URLRequest(xmlList[counter].imgSmallURL));
                container.addChild(item);
                container.addEventListener(MouseEvent.CLICK, showBig);
                addChild(container);
                counter++;
        }
}
function showBig(e:MouseEvent):void
{
        loaderBig.load(new URLRequest(e.target.big));
        loaderBig.y = 55;
        loaderBig.x = 27;
        addChild(loaderBig);
        imgShowBig = true;
}
function hideBigLoader(e:MouseEvent):void
{
        if (imgShowBig == true)
        {
                removeChild(loaderBig);
                imgShowBig = false;
        }
}


Prokter 03.12.2012 03:31

Попробуйте при создании контейнеров записать их в один вектор или массив
Код AS1/AS2:

private var _containerArray:Array;
.....
_containerArray.push(container);

а потом по очереди их уничтожить:
Код AS1/AS2:

                private function hideGallery(e:MouseEvent):void 
                {
                        for (var i:int = 0; i<numOfItems; i++) {
                                var container:MovieClip = new MovieClip();
                                container = _containerArray[i] as MovieClip;
                                removeChild(container );
                                container = null;
 
                        }
}

Как-то так.

Wolsh 03.12.2012 03:33

Цитата:

Не будете ли Вы так любезны указать в чем моя ошибка
Если бы мог — сказал бы сразу. Я просто не могу понять, чего Вы хотите. Но объяснять Вы точно не хотите. Почему Вы думаете, что я что-то пойму из неработающего кода? Мне абсолютно непонятна взаимосвязь кнопки и контейнеров. Вообще никак не понятно, какой контейнер должен удаляться.
Сколько раз я спросил об этом?

И, как модератор, хочу попросить — не надо каждый раз цитировать целиком предыдущее сообщение. Оно здесь и никуда не делось. Цитируйте какой-то фрагмент, если это действительно требуется, или если между сообщением, на которое Вы отвечаете и Вашим ответом уже настрогали несколько сообщений.

Добавлено через 7 минут
Prokter, а зачем создавать новый экземпляр мувиклипа там, где задача была и от старого то избавиться?
Если надо удалить ВСЕ контейнеры, то я бы просто совал все эти лоадеры в один общий контейнер и при необходимости даже его не удалял, а просто очищал с помощью removeChildren(). Поскольку никаких ссылок на лоадеры нет, мусорщик их соберет, как проснется.

mheha 03.12.2012 03:53

спасибо за подсказку, попробую, насчет замечания - учту.
суть в следующем: создается галерея с миниатюрами, по клику на миниатюру открывается полная картинка. Чтобы перейти от галереи к другому разделу сайта нужно эту галерею как-то скрыть или удалить. Кнопка - пункт меню сайта.
Цитата:

Сообщение от Wolsh (Сообщение 1107490)
Если надо удалить ВСЕ контейнеры, то я бы просто совал все эти лоадеры в один общий контейнер и при необходимости даже его не удалял, а просто очищал с помощью removeChildren(). Поскольку никаких ссылок на лоадеры нет, мусорщик их соберет, как проснется.

а подробнее можете пояснить как сунуть все лоадеры в общий контейнер и потом очистить его?


Часовой пояс GMT +4, время: 00:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.