Avatar billede jakwag Nybegynder
07. februar 2006 - 10:09 Der er 7 kommentarer og
1 løsning

fange variabler i as2

Hej

Jeg har en as2 class fil. Den er meget simple da den er en test af noget som jeg ikke kan få til at virke:

class Tester extends MovieClip
{
    var but:Button;
    var v:String;
   
    function Tester(){
        v="Hello";
        but.onRelease = function()
        {
            trace(v);
        }
    };
}

outputtet er undefined, og det er det der er problemmet. Hvordan får jeg fat i variablen v? Jeg kunne bruge _parent, men det er ingen løsning da det er i en onLoad på et xml object at jeg skal bruge den.

Så altså: Hvordan kan jeg uden at bruge _parent få den til at trace variablen v når man klikker på knappen but?

: ) Jakob
Avatar billede barklund Nybegynder
07. februar 2006 - 10:29 #1
http://www.actionscript.dk/artikler/?a=28&s=2#callbacksproblemet

Dog er det noget tid siden jeg skrev den pågældende artikel - i dag ville jeg enten løse det med Delegate eller lave en specifik klasse til knappen. Først med delegate:

class Tester extends MovieClip
{
    private var but:Button;
    private var v:String;
 
    private function Tester(){
        v="Hello";
        but.onRelease = mx.utils.Delegate.create(this, knapTrykket);
    }
    private function knapTrykket():Void {
        trace("v er "+v);
    }
}

Så med en klasse:


class Tester extends MovieClip {
    private var but:TestKNap;
    private var v:String;
 
    private function Tester(){
        v="Hello";
    }
    private function knapTrykket():Void {
        trace("v er "+v);
    }
}
class TestKnap extends MovieClip {
    private var t:Tester;
    private function TestKnap() {
        t = Tester(_parent);
    }
    private function onRelease():Void {
        t.knapTrykket();
    }
}

En sidste og mest generisk mulighed er at lave det med en EventDispatcher som knap og så lytte på denne fra den omliggende klasse. Det kan jeg da godt illustrere, om du ønsker? :)

--
Morten Barklund
Avatar billede jakwag Nybegynder
07. februar 2006 - 10:49 #2
hej

Nej ellers tak, delegate løsningen virker nydelig nok til mig.. I hvert fald væsentlig mere nydelig end min egen løsning ;)

men du skal da være velkommen til at skrive et par enkelte ord om hvad delegate er hvis du har lyst.

Kom med et svar.
Avatar billede barklund Nybegynder
07. februar 2006 - 11:19 #3
Delegate er blot at delegere en funktion videre til en anden funktion. Det er simpelthen så enkelt (uden at tænke på argumenterne eller hukommelse) som:

class Delegate {
    public static function create(o:Object, f:Function):Function {
        return function() { f.call(o); };
    }
}

Altså Delegate.create returnerer en funktion, der når den bliver kaldt, kalder en anden funktion på et bestemt objekt. Ovenstående er forsimplet, men derhenaf :)

For en nydeligere Delegate end den indbyggede, se:

http://dynamicflash.com/2005/02/delegate-class-refined/

:)

--
Morten Barklund
Avatar billede jakwag Nybegynder
07. februar 2006 - 12:01 #4
cool, den har jeg ikke set før men det kunne da tit være nytigt. Havde næsten lavet den løsning du linkede til, men der er en enkelt ting jeg ikke helt forstår.

Hvorfor virker dette ikke:

class Tester extends MovieClip
{
    var but:Button;
    var v:String;
    var base:MovieClip;
    function Tester()
    {
        v = "hej";
        base = this;
        but.onRelease = function()
        {
            trace(base.v);
        };
    }
}

Når dette gør:

class Tester extends MovieClip
{
    var but:Button;
    var v:String;
    function Tester()
    {
        v = "hej";
        var base = this;
        but.onRelease = function()
        {
            trace(base.v);
        };
    }
}
Avatar billede barklund Nybegynder
07. februar 2006 - 12:38 #5
Hvis du kunne læse base fra den omliggende klasse, så ville du jo også kunne læse v direkte :)

Kompileren tilføjer automatisk this. til variabler på klassen - uanset om det faktik vil være forkert; for eksempel i en callback.

At bruge en anonym callback er dog ikke særlig pænt - brug hellere Delegate og langt hellere en selvstændig klasse til knappen.

:)

--
Morten Barklund
Avatar billede jakwag Nybegynder
07. februar 2006 - 12:54 #6
ja. ok så gør jeg det, hvis du siger det må det jo være rigtigt ;)
Avatar billede barklund Nybegynder
07. februar 2006 - 13:02 #7
Tark for points - og hvis du vil vide mere om AS2 så bliver det emnet for mit indlæg ved FlashVision, hvor jeg sandsynligvis også præsenterer en kommende bog under titlen "Objekt-orienteret programmering i ActionScript". :)
Avatar billede jakwag Nybegynder
07. februar 2006 - 13:48 #8
begge dele lyder godt!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester