Delegater Klasse mit Parametern

Wofür überhaubt einen Delegater?

Einen Delegater benötigt man, wenn zum Beispiel eine Methode einer Klasse mit onEnterFrame aufgerufen werden soll. Innerhalb von onEnterFrame ist this der Klasse nicht bekannt. Da der Delegater keine Parameter übergibt, müssen wir uns selbst drum kümmern.

1. Wir erweitern die mx.utils.Delegate Klasse und hängen die mit create übergebenen Parameter an.

/**
 * ...
 * @author Andreas Khong
 */
class de.flashdevelop.Delegate extends mx.utils.Delegate
{

	public function Delegate(f:Function)
	{
		super(f);
	}

	public static function create(obj:Object, func:Function):Function {
		var param:Array = arguments.slice(2);
		var f:Function;

		f = function() {
			var target = arguments.callee.target;
			return func.apply(target, param);
		};

		f.target = obj;
		f.func = func;

		return f;
	}

}

Benutzen können wir Delegater so:
Wir haben zwei Buttons und eine buttonEvent Methode. Zunächst hole ich mir die Buttons von der Bühne, gebe ihnen eine Beschriftung. Anschließend sage ich dem onPress mittels des Delegaters, dass  die Methode buttonEvent aufgerufen werden soll. Da wir den Delegater erweitert haben, können wir nun den Button mit übergeben und in der buttonEvent Methode auswerden und entsprechend reagieren.

/**
 * ...
 * @author Andreas Khong
 */
import de.flashdevelop.Delegate;

class Main
{
	public static var app:Main;

	private var _canvas:MovieClip;

	private var _continueBtn:MovieClip;
	private var _quitBtn:MovieClip;

	public static function main(swfRoot:MovieClip):Void
	{
		// entry point
		app = new Main(swfRoot);
	}

	public function Main(swfRoot:MovieClip)
	{
		app = this;
		_canvas = swfRoot;

		// Weiter Button
		_continueBtn = _canvas.continue_btn;
		_continueBtn.label_txt = "Weiter";
		_continueBtn.onPress = Delegate.create(this, buttonEvent, _continueBtn);

		// Schließen Button
		_quitBtn = _canvas.quit_btn;
		_quitBtn.label_txt = "Schließen";
		_quitBtn.onPress = Delegate.create(this, buttonEvent, _quitBtn);
	}

	private function buttonEvent(btn:MovieClip):Void
	{
		switch (btn) {
			case _continueBtn:
				_canvas.message_txt.text = "Weiter gedrückt";
				break;

			case _quitBtn:
				_canvas.message_txt.text = "Schließen gedrückt";
				break;
		}
	}

}

Es gibt noch viele andere Möglichkeiten den Delegater einzusetzen.

Das Projekt als Zip-Datei:

as2project-v-0-0-1

Für ActionScript 3.0 findet ihr ein ähnliches Thema: http://www.flashdevelop.de/actionscript-3/mehrere-parameter-ubergeben.html

Teilen macht glücklich!
  • facebook
  • Twitter
  • Delicious
  • Digg
  • StumbleUpon
  • Google Bookmarks
  • email
  • RSS

Tags: , , ,

Kommentar hinterlassen

*