Просмотр полной версии : задание контекстного меню в конструкторе класса
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)
Так что твой код создаст контекстное меню на _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
Вобщем я понял: работает только если внутри метода прописан прямой путь к созданному клипу. Это плохо, потому что, как я уже сказал, они создаются в разных местах и с динамическим именем. Как выкрутится в такой ситуации?
Annihilator
01.03.2007, 14:59
__etc - спасибо, Delegate - это то, что надо Работает из любого места :yahoo:
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.