PDA

Просмотр полной версии : Помогите повесить листенер


marat_sa
18.12.2007, 21:03
Подскажите, пожалуйста, что не так? В главном классе проекта на AS2 в функции-конструкторе хочу повешать листенер на Stage, но не работает:

class main.application extends Object {
private static var instance:application;
private var resizeListener:Object;

function application() {
resizeListener = new Object();
resizeListener.onResize = Resize();
Stage.addListener(resizeListener);
Stage.scaleMode = "noScale";
}


public function Resize():Void {
var W:Number = Stage.width;
var H:Number = Stage.height;
trace(W+"|"+H);
}
}

Если на листенер повесить просто функцию, при изменении размеров окна все работает:

function application() {
resizeListener = new Object();
resizeListener.onResize = function(){
trace("O_o");
};
Stage.addListener(resizeListener);
Stage.scaleMode = "noScale";
}

etc
18.12.2007, 21:09
Вы где-нибудь во флешовых классах видели класс, у которого название начинается с маленькой буквы? Если нет, то почему у вас с маленькой? И где вы видели у флешовых классов методы, у которых название с большой буквы? Если нет, почему с большой?

В вашем случае код должен выглядеть так:

import mx.utils.Delegate;
class main.Application {

public function Application() {
super();
Stage.addListener(Delegate.create(this, this.resizeHandler));
Stage.scaleMode = "noScale";
}


private function resizeHandler():Void {
var w:Number = Stage.width;
var h:Number = Stage.height;
trace(w+"|"+h);
}
}

marat_sa
18.12.2007, 21:35
Спасибо, все заработало!

wvxvw
18.12.2007, 21:40
Любой класс по умолчанию наследуется от Object лишний раз об этом писать нет смысла (ну, вобщем, как и super() вызывать - ничего это не изменит Ъ)
Ваш код не работает изза того, что вы пытаетесь присвоить функции результат работы другой функции не являющийся функцией.
Т.е.:
var a:Function = function(){trace("!")};
var b:Function = a;
b();//output: !
var b:Function = a();
b();//output:
var a:Function = function():Function{return trace};
var b:Function = a();
b("?");//output: ?

etc
18.12.2007, 21:44
(ну, вобщем, как и super() вызывать - ничего это не изменит Ъ)
Как раз super() лучше всегда писать, потому как инициализация оного должна четко прослеживаться в коде. Необязательно, но желательно.