Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Удаление экземпляра класса (http://www.flasher.ru/forum/showthread.php?t=127533)

zelik 16.07.2009 01:24

Удаление экземпляра класса
 
Здравствуйте!

Проблема в следующем.

Есть класс, в котором создается множество текстовый полей, в соответствии с кол-вом букв строки-параметра strWord.

Код AS1/AS2:

class MyWords extends MovieClip {
        var strWord:String = null;
        function MyWords(str:String) {
                strWord = str;
        }
 
        function DrawWords() {
          var arr:Array = [];
          arr = strWord.split("");
          //...
          for (var i = 1; i<arr.length; i++) {
                _root.createTextField("pole_"+i,-i,dx,dy,10,16*koef);
          }
 
          //...
}

Через промежуток времени создаю экземпляр класса с различными строками
Код AS1/AS2:

var inter:Number;
var exam:MyWords;
var i:Number = 0;
var arr:Array = [];
arr[0] = "Hello world!!!";
arr[1] = "Hello world!!! Hello world!!! Hello world!!!";
arr[2] = "Hello world!!! Hello world!!!";
arr[3] = "Hello world!!! Hello world!!! Hello world!!!Hello world!!! Hello world!!!";
arr[4] = "Hello!";
 
inter = setInterval(this, "Print", 2000);
 
function Print() {
 
  exam = new MyWords(arr[i]);
 
  exam.DrawWords();
  i++;
  if (i==arr.length) {
        clearInterval(inter);
  }
}

Почему-то не происходит удаление предыдущих экземпляров (т.е. на экране остаются предыдущие экземпляры). Я думал, что команда new удаляет все, что было до того.

Подскажите, пожалуйста, в чем ошибка?

Спасибо!

dimarik 16.07.2009 01:45

Ошибка в том, что нельзя создавать экземпляры MovieClip оператором new.
А значит, Вы ручками должны удалить мусор, оставшийся в виде TetxField'ов, созданных методом DrawWords. Гы. Вы же их создаете в _root. Так какова лешева они должны бы были удалиться с помощью new? В общем, разговор турка с персом.

Juice_Green 16.07.2009 07:36

@zelik:
и зачем тут наследовываться от MovieClip, объясните уж будьте добры.
вы правда используете возможности базового класса?

zelik 16.07.2009 09:13

да собственно не использую.
раньше вы уже писали, что нет необходимости. А до того написали, как сделать, чтобы код работал.
Получается, что, единственное, почему наследую, т.к. код работает :)

Сейчас вот написал без наследования.
В классе обявил
Код AS1/AS2:

var container:MovieClip;

а затем

Код AS1/AS2:

for (var i = 1; i<arr.length; i++) {
                container.createTextField("pole_"+i,-i,dx,dy,10,16*koef);
          }

И каким образом теперь работать с классом? Т.е. если я пишу в клипе

Код AS1/AS2:

exam = new MyWords(arr[i]);
 
  exam.DrawWords();

то ничего не отображается?? Почему?
Чего-то не понимаю, пожалуйста, объясните.

Спасибо!

Juice_Green 16.07.2009 09:25

вы создаете TextField, а container у вас undefined, для начала создайте контейнер, например с помощью createEmptyMovieClip

zelik 16.07.2009 09:29

а создание контейнера делать от this или _root?

Добавлено через 5 минут
если делаю от _root, то получается тоже, что описано в 1-м посте...

Juice_Green 16.07.2009 09:49

все верно,
для удаления храните ссылки на созданные объекты, тогда и сможете удалять созданные уже мувики

zelik 16.07.2009 11:40

что значит хранить ссылки на объекты? где хранить?
Можно объяснить на примере
вот у меня есть свойтсво класса
Код AS1/AS2:

var container:MovieClip = _root.createEmptyMovieClip("container1", _root.getNextHighestDepth());

дальше в клипе container создается множество TextField.
Код AS1/AS2:

for (var i = 1; i<arr.length; i++) {
                container.createTextField("pole_"+i,-i,dx,dy,10,16*koef);
          }

так мне нужно хранить ссылки на все TextField или достаточно только на container, в котором они находятся? Удаление производить функцией внутри класса?
поясните, пожалуйста!

dimarik 16.07.2009 11:55

Храните в ассоциативном массиве.

Код AS1/AS2:

var storage:        Object = new Object();
var len:                Number = arr.length;
var name:                String;
var ref:                TextField;
var i:                        Number = 1;
 
for (; i < len; i++) {
        name = "pole_" + i;
        ref = container.createTextField(name, -i, dx, dy, 10, 16 * koef);
        storage[name] = ref;
}


Juice_Green 16.07.2009 12:00

1. создаем экземпляр
2. сохраняем ссылку в массив
3. когда надо удалить - пробегаем по циклу массив и delete массив[i]
4. в деструкторе класса реализуем удаление мувиклипа со сцены


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

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