Форум 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=92556)

Annihilator 28.02.2007 15:54

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

dynamic class Tmb extends MovieClip {
private var newMenu:ContextMenu, menuItemDelete:ContextMenuItem, menuItemResize:ContextMenuItem;
function Tmb() {
super();
this.newMenu = new ContextMenu();
this.newMenu.hideBuiltInItems();
this.menuItemDelete = new ContextMenuItem("Delete object", removeit);
//this.menuItemDelete = new ContextMenuItem("Delete object", this.removeit); - так тоже метод не находится
this.menuItemResize = new ContextMenuItem("Resize object", resizeit);
this.newMenu.customItems.push(this.menuItemDelete);
this.newMenu.customItems.push(this.menuItemResize);
this.menu = this.newMenu;
}
function removeit(){
this.removeMovieclip();
}
function resizeit(){
this._xscale=this._yscale=200;
}

}


Mr. Fixit 28.02.2007 16:42

вот код, где box - инстанс имя объекта(МК).
Объясни зачем super ();

Код:

dynamic class Tmb extends MovieClip {
        private var newMenu:ContextMenu, menuItemDelete:ContextMenuItem, menuItemResize:ContextMenuItem;
        function Tmb () {
                //super ();
                newMenu = new ContextMenu ();
                newMenu.hideBuiltInItems ();
                menuItemDelete = new ContextMenuItem ("Delete object", remove);
                menuItemResize = new ContextMenuItem ("Resize object", resizE);
                newMenu.customItems.push (menuItemDelete);
                newMenu.customItems.push (menuItemResize);
                menu = newMenu;
        }
        function remove () {
                box.unloadMovie ();
        }
        function resizE () {
                box._xscale = box._yscale=200;
        }
}


Annihilator 28.02.2007 20:46

to Mr. Fixit :
super() нужно для создания мувиклипа этого класса,а не просто объекта.
Ты проверил свой код на работоспособность?
Цитата:

В отличие от обычных классов, свойства в конструкторе динамического класса должны предваряться указателем «this». Это связано с тем, что цепочка областей видимости кода соответствующего конструктора статична и включает следующие элементы: объект активации, основную временную шкалу, объект _global. Цепочка же областей видимости конструктора обычного класса динамична и образована объектом активации, создаваемым экземпляром класса и
объектом _global.
Убедиться, что приведенная особенность действительно имеет место, очень просто. Когда в цепочку областей видимости кода конструктора входит основная временная шкала, то, если не использовать this, свойства будут помешены на нее
Так что твой код создаст контекстное меню на _root-е, а не на мувиклипе. Кроме того, таких объектов создаётся много и в разных местах, с динамически формируемым именем (типа ["box_"+i]) поэтому внутри класса нужно использовать только указатель (this)

etc 28.02.2007 20:59

Цитата:

Сообщение от Annihilator
Так что твой код создаст контекстное меню на _root-е, а не на мувиклипе.

Неправда.

Mr. Fixit 28.02.2007 21:57

понятно. Но код функционирует.

Mr. Fixit 01.03.2007 01:43

и что надо добавить или изменить, что бы удалялся соответствующий объект?
Код:

dynamic class Tmb extends MovieClip {
        private var newMenu:ContextMenu, menuItemDelete:ContextMenuItem, menuItemResize:ContextMenuItem;
        function Tmb () {
                this.super ();
                this.newMenu = new ContextMenu ();
                this.newMenu.hideBuiltInItems ();
                this.menuItemDelete = new ContextMenuItem ("Delete object", remove);
                this.menuItemResize = new ContextMenuItem ("Resize object", resizE);
                this.newMenu.customItems.push (menuItemDelete);
                this.newMenu.customItems.push (menuItemResize);
                this.menu = this.newMenu;
        }
        function remove () {
                for (var i = 0; i<3; i += 1) {
                        _root['box'+i].unloadMovie ();
                }
        }
        function resizE () {
                for (var i = 0; i<3; i += 1) {
                        _root['box'+i]._xscale = this['box'+i]._yscale=200;
                }
        }
}


Annihilator 01.03.2007 12:55

Вобщем я понял: работает только если внутри метода прописан прямой путь к созданному клипу. Это плохо, потому что, как я уже сказал, они создаются в разных местах и с динамическим именем. Как выкрутится в такой ситуации?

etc 01.03.2007 12:58

Использовать Delegate.

Annihilator 01.03.2007 14:59

__etc - спасибо, Delegate - это то, что надо Работает из любого места :yahoo:


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

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