PDA

Просмотр полной версии : не обрабатываются события после loadClip


markoffko
28.10.2008, 11:19
Всем привет) Помогите новичку, плиз. Вот есть такой код. По сценарию он грузит jpg и после полной его загрузки реагирует на события мыши. Но события не обрабатываются. Зато, если не грузить в него ничего, события обрабатываются нормально.
import mx.utils.Delegate
class Item extends MovieClip {
function Item() {
}
function loadThumb(path:String, target:Object) {
var mcListener:Object = new Object();
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcListener.onLoadInit = mx.utils.Delegate.create(this, init)
mcLoader.addListener(mcListener);
mcLoader.loadClip(path, target);
}
function init() {
onRollOver = mx.utils.Delegate.create(this, over);
onRollOut = mx.utils.Delegate.create(this, out);
onRelease = mx.utils.Delegate.create(this, rls);
}
function over() {
trace("1")
}
function out() {
trace("2")
}
function rls() {
trace("3")
}
}
Подскажите, в чем ошибка?

Wolsh
28.10.2008, 12:42
Потому что такая запись неверна
mcListener.onLoadInit = mx.utils.Delegate.create(this, init)
Вы присваиваете обработчику РЕЗУЛЬТАТ выполнения правого выражения, т.е. оно будет выполнено еще до наступления события LoadInit.

etc
28.10.2008, 12:45
Ну вот скажите, зачем вы делаете mcListener, чтобы потом сделать редирект на собственные же функции, а?

Wolsh
28.10.2008, 13:04
Не пугайтесь, markoffko, вопрос __etc в каком-то смысле риторический, поскольку все знают на него ответ)))) - "так написано в хелпе". Надо, однако, понимать, что в хелпе дается обобщенный пример синтаксиса. В данном же случае, конечно, надо использовать в качестве листенера сам экземпляр Item, т.е. this. Тогда круговорот делегатов резко сократится а в коде появится логика)

chefil
06.11.2008, 11:08
попробовал этот класс, в качестве листенера использовал экземпляр Item.
Может не разобрался с делагатами, но компилятор не смог найти свойство onLoadInit

Wolsh
06.11.2008, 12:12
Покажите получившийся код класса.

chefil
06.11.2008, 12:22
import mx.utils.Delegate
class Item extends MovieClip {
function Item() {
}
function loadThumb(path:String, target:Object) {
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(this);
onLoadInit = mx.utils.Delegate.create(this, init)
mcLoader.loadClip(path, target);
}
function init() {
onRollOver = mx.utils.Delegate.create(this, over);
onRollOut = mx.utils.Delegate.create(this, out);
onRelease = mx.utils.Delegate.create(this, rls);
}
function over() {
trace("1")
}
function out() {
trace("2")
}
function rls() {
trace("3")
}
}

etc
06.11.2008, 12:29
Боже мой. Вам ВООБЩЕ не нужен Delegate, не надо его использовать везде и всюду.

class Item extends MovieClip {

public function Item() {
super();
}

private var _loader:MovieClipLoader;

public function loadThumb(path:String, target:MovieClip):Void {
if (this._loader) this._loader.removeListener(this);
delete this.onRollOver;
delete this.onRollOut;
delete this.onRelease;
this._loader = new MovieClipLoader();
this._loader.addListener(this);
this._loader.loadClip(path, target);
}

private function onLoadInit(target:MovieClip):Void {
trace('init');
this.onRollOver = this.handler_rollOver;
this.onRollOut = this.handler_rollOut;
this.onRelease = this.handler_release;
}

private function handler_rollOver():Void {
trace("1")
}

private function handler_rollOut():Void {
trace("2")
}

private function handler_release():Void {
trace("3")
}
}

chefil
06.11.2008, 13:06
незнаю насколько правильное решение, но класс из поста выше, заработал только если немного переписать onLoadInit

private function onLoadInit(target:MovieClip):Void {
trace('init');
target.onRollOver = this.handler_rollOver;
target.onRollOut = this.handler_rollOut;
target.onRelease = this.handler_release;
}

etc
06.11.2008, 13:27
А, ну тогда нужно в качестве target в loadThumb использовать this и не передавать в параметрах. А ваше изменение неверное.

chefil
06.11.2008, 14:13
а как тогда корректно вызвать класс Item и загрузить внешние данные в нужный мне клип?

etc
06.11.2008, 15:00
У вас Item и должен быть контейнером клипа.

chefil
06.11.2008, 16:35
запускаем так:

this.attachMovie("Item","i",1);
i.loadThumb("del.gif");


сам класс

class Item extends MovieClip {

public function Item() {
super();
}

private var _loader:MovieClipLoader;

public function loadThumb(path:String):Void {
trace('loadThumb');
if (this._loader) this._loader.removeListener(this);
delete this.onRollOver;
delete this.onRollOut;
delete this.onRelease;
this._loader = new MovieClipLoader();
this._loader.addListener(this);
this._loader.loadClip(path, this);
}

private function onLoadInit():Void {
trace('init');
this.onRollOver = this.handler_rollOver;
this.onRollOut = this.handler_rollOut;
this.onRelease = this.handler_release;
}

private function handler_rollOver():Void {
trace("1")
}

private function handler_rollOut():Void {
trace("2")
}

private function handler_release():Void {
trace("3")
}
}


в итоге loadThumb выполняется клип грузится
но листенет несрабатывает и onLoadInit не вызывается

etc
06.11.2008, 17:04
class Item extends MovieClip {

public function Item() {
super();
this._container = this.createEmptyMovieClip('container', 0);
}

private var _loader:MovieClipLoader;

private var _container:MovieClip;

public function loadThumb(path:String):Void {
trace('loadThumb');
if (this._loader) this._loader.removeListener(this);
delete this.onRollOver;
delete this.onRollOut;
delete this.onRelease;
this._loader = new MovieClipLoader();
this._loader.addListener(this);
this._loader.loadClip(path, this._container);
}

private function onLoadInit():Void {
trace('init');
this.onRollOver = this.handler_rollOver;
this.onRollOut = this.handler_rollOut;
this.onRelease = this.handler_release;
}

private function handler_rollOver():Void {
trace("1")
}

private function handler_rollOut():Void {
trace("2")
}

private function handler_release():Void {
trace("3")
}
}

chefil
07.11.2008, 15:10
огромное спасибо за помощь