Просмотр полной версии : не обрабатываются события после 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")
}
}
Подскажите, в чем ошибка?
Потому что такая запись неверна
mcListener.onLoadInit = mx.utils.Delegate.create(this, init)
Вы присваиваете обработчику РЕЗУЛЬТАТ выполнения правого выражения, т.е. оно будет выполнено еще до наступления события LoadInit.
Ну вот скажите, зачем вы делаете mcListener, чтобы потом сделать редирект на собственные же функции, а?
Не пугайтесь, markoffko, вопрос __etc в каком-то смысле риторический, поскольку все знают на него ответ)))) - "так написано в хелпе". Надо, однако, понимать, что в хелпе дается обобщенный пример синтаксиса. В данном же случае, конечно, надо использовать в качестве листенера сам экземпляр Item, т.е. this. Тогда круговорот делегатов резко сократится а в коде появится логика)
попробовал этот класс, в качестве листенера использовал экземпляр Item.
Может не разобрался с делагатами, но компилятор не смог найти свойство onLoadInit
Покажите получившийся код класса.
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")
}
}
Боже мой. Вам ВООБЩЕ не нужен 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")
}
}
незнаю насколько правильное решение, но класс из поста выше, заработал только если немного переписать onLoadInit
private function onLoadInit(target:MovieClip):Void {
trace('init');
target.onRollOver = this.handler_rollOver;
target.onRollOut = this.handler_rollOut;
target.onRelease = this.handler_release;
}
А, ну тогда нужно в качестве target в loadThumb использовать this и не передавать в параметрах. А ваше изменение неверное.
а как тогда корректно вызвать класс Item и загрузить внешние данные в нужный мне клип?
У вас Item и должен быть контейнером клипа.
запускаем так:
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 не вызывается
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")
}
}
огромное спасибо за помощь
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.