Volledige versie bekijken : DelegateArgs
Tha Narie
%Europe/Berlin %547 %2005, 14:08
Kleine extra aanpassing op de standaard Delegate Class.
Je kan nu als 3e argument een 'argumenten array' meegeven aan de Delegate.create().
Deze argumenten worden toegevoegd aan de argumenten die je van de functie zelf mee krijgt.
Is best handig (voor de mensen die vaak Delegates en classes gebruiken)!
//************************************************** **************************
//Copyright (C) 2003-2004 Macromedia, Inc. All Rights Reserved.
//The following is Sample Code and is subject to all restrictions on
//such code as contained in the End User License Agreement accompanying
//this product.
//************************************************** **************************
/**
The Delegate class creates a function wrapper to let you run a function in the context
of the original object, rather than in the context of the second object, when you pass a
function from one object to another.
*/
class DelegateArgs extends Object
{
/**
Creates a functions wrapper for the original function so that it runs
in the provided context.
@parameter obj Context in which to run the function.
@paramater func Function to run.
*/
static function create(obj:Object, func:Function, args: Array):Function
{
var f = function()
{
var target = arguments.callee.target;
var func = arguments.callee.func;
var ret = arguments.concat(args);
return func.apply(target, ret);
};
f.target = obj;
f.func = func;
return f;
}
function DelegateArgs(f:Function)
{
func = f;
}
private var func:Function;
function createDelegate(obj:Object):Function
{
return create(obj, func);
}
}
Dauntless
%Europe/Berlin %550 %2005, 14:12
Is best handig (voor de mensen die vaak Delegates en classes
Kan je Delegate dan gebruiken zonder classes?
Ziet er goed uit ! :) Ik kan het nu nog niet testen omdat ik juist bezig ben met een menutje met Delegate, en die klant heeft .fla nodig... Dus als ik dan die Delegate ga aanpassen en zo gebruiken... gaat het niet lukken natuurlijk :).
Tha Narie
%Europe/Berlin %551 %2005, 14:14
[QUOTE=Dauntless]Kan je Delegate dan gebruiken zonder classes?[QUOTE]
Tuurlijk, is gewoon een wrapper:
this.onMouseDown = Delegate.create(this, onMDown);
function onMDown()
{
}
Tadaa!
Roenes
%Europe/Berlin %553 %2005, 14:16
Handig stukje code en zeker erg bruikbaar :)
Alleen gebruik ik zelf delegate vrij weinig. Toch maar eens meer gaan gebruiken :)
Tha Narie
%Europe/Berlin %873 %2005, 21:57
Pas als je ze gebruikt weet je hoe handig ze zijn ;)
(En met deze aanpassing NOG handiger :p)
Dauntless
%Europe/Berlin %874 %2005, 21:59
Ik gebruik Delegate héél vaak. Anders heb ik ALTIJD probs met de scoping van m'n xml objecten.... (In AS 2.0 classes dan).
Ik heb het wel nog nooit nodig gehad dat ik iets moest meegeven...
Kan je een voorbeeldje geven van waar je die optie kan gebruiken? :I
Tha Narie
%Europe/Berlin %968 %2005, 00:15
neem bv de eventlisteners van componenten, daar kan je meerdere componenten naar 1 listener functie mappen, waar je in het argument een evt.target naar het component krijgt die de functie aanroept.
Als je bv een class hebt met allemaal MC's daarin, en je wilt alle onReleases delegaten naar 1 functie, en je wilt weten welke MC die aanriep, doe je dus:
mc.onRelease = DelegateArgs.create(this, onReleaseBtn, [mc]);
Voetsjoeba
%Europe/Berlin %367 %2005, 09:48
Ik gebruik Delegate zelf ook vaak, om event handlers van movieclips door mijn class instance te laten uitvoeren. Deze uitbreiding ziet mij er zo logisch uit (gezien de syntax Function.apply(object, params) en Delegate dat gewoon een wrapper hiervoor is) dat ik me afvraag waarom Macromedia dit niet standaard zo heeft gemaakt :)
Tha Narie
%Europe/Berlin %378 %2005, 10:04
Normaal stuurt hij alleen de arguments door die hij van de functie binnen krijgt.
Snap ook niet dat MM dat niet default heeft gedaan ;)
Voetsjoeba
%Europe/Berlin %391 %2005, 10:23
Zou wel raar zijn moest MM de arguments niet meegeven ;)
Ik merk nu ook dat je zowel de manuele als de automatische arguments meegeeft, doordat je de arguments array concatenate met de manuele array uit de create-arguments. (en dat ik posts beter moet lezen want het stond al in de eerste, heh).
Tha Narie
%Europe/Berlin %406 %2005, 10:44
Hehehe joh :D
Roenes
%Europe/Berlin %044 %2005, 02:04
Als je bv een class hebt met allemaal MC's daarin, en je wilt alle onReleases delegaten naar 1 functie, en je wilt weten welke MC die aanriep, doe je dus:
mc.onRelease = DelegateArgs.create(this, onReleaseBtn, [mc]);Toch alsnog even reageren hierop. Dit is volgens mij een beetje een omweg. Als je [mc] niet meegeeft als parameter kun je in de onReleases toch achterhalen welke mc die aanriep. Je gebruikt gewoon de waarde van 'this'. Deze is afhankelijk van de mc die em aanriep. :)
Tha Narie
%Europe/Berlin %344 %2005, 09:16
Nee, door deze Delegate wordt 'this' juist de class waarin die method staat. Dat is het nut ervan.
Wat ik me momenteel afvraag: volgens mij kan je het object waar de functie oorspronkelijk vandaan komt nog wel opvragen me 'arguments.callee;'.
Roenes
%Europe/Berlin %446 %2005, 11:42
Nee, door deze Delegate wordt 'this' juist de class waarin die method staat. Dat is het nut ervan.Shit, heb je nog gelijk in ook :)
Wat ik me momenteel afvraag: volgens mij kan je het object waar de functie oorspronkelijk vandaan komt nog wel opvragen me 'arguments.callee;'.Zou volgens mij moeten kunnen jah. Is het testen waard :)
Mediamonkey
%Europe/Berlin %456 %2005, 11:57
Ik gebruik zelf al een tijdje de Proxy van de ascb package. Werkt ook met extra argumenten, maar je hoeft ze niet als array mee te geven, maar je kunt ze gewoon als argumenten doorschrijven.
mc.doeIets = Proxy.create(this, doeIets, "abc", 123, "etc");
class ascb.util.Proxy {
public static function create(oTarget:Object, fFunction:Function):Function {
var aParameters:Array = new Array();
for(var i:Number = 2; i < arguments.length; i++) {
aParameters[i - 2] = arguments[i];
}
var fProxy:Function = function():Void {
var aActualParameters:Array = arguments.concat(aParameters);
aActualParameters.push(arguments.callee);
fFunction.apply(oTarget, aActualParameters);
};
return fProxy;
}
}
De (zeeeeer uitgebreide en handige) package kun je hier (http://www.person13.com/ascblibrary/) vinden.
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.