PDA

Volledige versie bekijken : Dynamic function


kolnedra
%Europe/Berlin %680 %2005, 17:20
Ik wil hetvolgende doen:
deFunctie = "trace('BLA BLA')";

// Dan hier de code die invulling van deFunctie als functie aanroept > deFunctie()
// eval(deFunctie); <<< Iets in die richting, maar dat werkt niet
Iemand ideeen?
En niet vragen waar ik niet gewoon trace('BLA BLA'); doe in actionScript, want de functie wordt dynamisch aangeleverd via een XML document en is dus constant anders, maar hij moet wel uitgevoerd worden

Roenes
%Europe/Berlin %683 %2005, 17:24
normaal gesproken definieer je een functie zo in flash:
function deFunctie()
{
trace("bla bla");
}
//of
deFunctie = function()
{
trace("bla bla");
}De functie kun je dan aanroepen met:
deFunctie();Wat jij nu precies wilt is me niet helemaal duidelijk. Misschien heb je iets aan bovenstaande maar ik denk dat daarmee niet je probleem is opgelost. Misschien iets meer uitleg geven? :)

kolnedra
%Europe/Berlin %685 %2005, 17:26
ja dat snap ik, maaaaaaaaaaar...

"trace('bla bla')" is dus een variabelle string en die variable wil ik aanroepen als een functie

Dauntless
%Europe/Berlin %694 %2005, 17:40
Zo direct gaat dat niet...
Zo wel:
var myFunction:String = "init";
var myParameter:String = "Flashfocus";
this[myFunction](myParameter);
function init(pvar:String)
{
trace(pvar);
}

kolnedra
%Europe/Berlin %348 %2005, 09:21
Gaat wel

function dothis (command) {
var comarr = command.split(".");
var end = comarr.pop();
var myobj = eval(comarr.join("."));
var checkforprop = end.indexOf("=");
var startargs = end.indexOf("(");
if (checkforprop>-1) {
var prop = end.substring(0, checkforprop-1);
var value = end.substring(checkforprop+1, end.length);
myobj[prop] = value;
} else if (startargs>-1) {
var endargs = end.indexOf(")");
var args = end.substring(startargs+1, endargs);
var method = end.substring(0, startargs);
myobj[method](args);
_root.answer = myobj[method](args)
}

Alleen krijg je meteen het volgende probleem:
Deze werkt WEL:

var tr = trace('Test trace');
dothis(tr);

Deze werkt NIET:

var tr = "trace('Test trace')";
dothis(tr);

xtr0
%Europe/Berlin %470 %2005, 12:17
bij de 2e keer maak je een string van de hele trace functie, dus de variable tr heeft nu de waarde: "trace("test trace")". Je moet tr eens tracen dan zie je het zelf.

Dauntless
%Europe/Berlin %492 %2005, 12:49
Ik zei toch ook: Zo direct gaat dat niet... Maar ik zie echt het nut niet om een functie te gaan schrijven die een string uiteenhaalt en die als functie uitvoert. Waarom wil je nu "trace('blaat')" uitvoeren? Vanwaar haal je die string?

Flasher
%Europe/Berlin %496 %2005, 12:54
Het kan veel simpeler:

tr = trace("blaat");
tr()
//output: blaat

Dauntless
%Europe/Berlin %497 %2005, 12:56
Flasher, lees dit topic nog eens goed door, hij wil juist dit:
tr = "trace(\"blaat\");"
tr();

Flasher
%Europe/Berlin %514 %2005, 13:21
zoiets komt mss in de richting:
function doIt(name:String) {
var func:Function = eval(name);
func(arguments.splice(1));
}
doIt("traceOut","param1","param2");
function traceOut(args:Array):Void {
for(i=0;i<args.length;i++) {
trace("args["+i+"] = "+args[i]);
}
}
//output:
//args[0] = param1
//args[1] = param2
Edit: een aagepaste versie van de doIt functie (output blijft gelijk)
function doIt(com:String):Void {
var arr:Array = com.split("(");
var args:Array = arr[1].slice(0,-1).split(",");
var func:Function = eval(arr[0]);
func(args);
}
doIt("traceOut(param1,param2)");

kolnedra
%Europe/Berlin %360 %2005, 09:38
Heb nu wel een soort van oplossing:
Hij is misschien wel omslachtig, alleen hij werkt perfect.
je moet hem wel zo gebruiken:

dothis("deFunctie('hallo','dit is een string',verwijderMovieClip(container))")


Hij checkt namelijk zelf of de parameters van de functie die je wil dothis'en, een string is of een object / instancename / functie

function dothis(actie) {
// Roept een zelfgemaakte functie aan (dus geen trace)
actie = actie.substr(0,actie.length-1);
ab = actie.split("(");
abbb = ab[1];
for (o=2; ab[o]; o++) { abbb = abbb+"("+ab[o]; }
abb = abbb.split(",");
parameters = new Array();
for (tel=0;abb[tel];tel++) {
abb[tel] = abb[tel].split("\"").join("").split("'").join("");
parameters[tel] = abb[tel];
}
for (a=0;parameters[a];a++) { if (_root[parameters[a]]) { parameters[a] = _root[parameters[a]]; } }
switch(parameters.length) {
case 0 : _root[ab[0]](); break
case 1 : _root[ab[0]](parameters[0]); break;
case 2 : _root[ab[0]](parameters[0],parameters[1]); break
case 3 : _root[ab[0]](parameters[0],parameters[1],parameters[2]); break
case 4 : _root[ab[0]](parameters[0],parameters[1],parameters[2],parameters[3]); break
//etcetera
}
}

@Flasher: Jouw ding werkt okay, maar dan moet je je functie anders aanroepen en niet meegeven als 'n string

...Maar ik zie echt het nut niet om een functie te gaan schrijven die een string uiteenhaalt en die als functie uitvoert...
Omdat ik in 'n XML doc flashFuncties meegeef

Dauntless
%Europe/Berlin %647 %2005, 16:32
Dan lijkt het mij simpeler om gewoon iets te doen als:

<person func="trace" para="flashfocus">Dauntless</person>