Avatar billede cpfrande Nybegynder
03. oktober 2006 - 11:07 Der er 12 kommentarer og
1 løsning

OOP, LoadVars & returnering af data.

Hej alle eksperter,

Jeg er stødt på store problemer i Flash. I kan finde min AS-fil på http://www.gratisupload.dk/show.php?fileId=611

Det meste af koden virker, dog virker det mest afgørende ikke: Returnering af variablerne vi modtager fra PHP.

Problemet ligger ved funktionen getResult(), der ligger i den statiske funktion addTimeTable().

Jeg ved:
- getResult()-funktionen bliver kørt.
- this["timeTableId"] indeholder det rigtige ID sendt fra PHP.

Problemet er nu blot: Hvordan kan jeg få den ud af getResult()-funktionen og derved kunne retunere den i addTimeTable()-funktionen. Jeg har forsøgt på flere måder, dog uden held:

1. Statisk medlemsvariabel
Jeg har her dannet en statisk medlemsvariabel for klassen, som jeg har forsøgt at få getResult()-funktionen til at sætte en værdi i. Dette er dog ikke lykkes. Den har simpelthen ikke sat nogen værdi i den.

2. Global variabel
Jeg har forsøgt ved at danne en global variabel i funktionen addTimeTabel(). Jeg har derefter forsøgt at få getResult() til at sætte en værdi i den, også uden held.

Jeg kan bare ikke få det til at virke. Er der nogen af jer, der har forslag?

På forhånd tak!
Avatar billede cpfrande Nybegynder
04. oktober 2006 - 09:43 #1
Er der slet ingen, der har nogen forslag?
Avatar billede mat Nybegynder
04. oktober 2006 - 10:14 #2
Det er vel fordi du returnerer inden loadVars.onLoad er kommet tilbage? Jeg tror at jeg ville sende en event og have mine objekter der skal bruge informationerne, lytte på denne. Kig eventuelt på EventDispatcher eller ASBroadcaster...det er et forslag :)

mvh mat
Avatar billede cpfrande Nybegynder
04. oktober 2006 - 11:03 #3
Hej mat,

Ja, jeg har set, at onLoad fungerer som callback.

Det lyder dog meget interessant med EventDispatcher og ASBroadcaster. Er det noget, som du kan fortælle mere om eller evt. komme med et lille kode-eksempel på?

På forhånd tak!
Avatar billede cpfrande Nybegynder
04. oktober 2006 - 11:55 #5
Hej igen,

Jeg havde selv fundet de fleste af siderne på google, tak dog!

Mit problem er dog stadig, at jeg ikke helt kan se, hvordan jeg kan anvende det i mit problem. Mine spørgsmål er pt.:
- Hvordan får jeg EventDispatcher (eller AsBroadcaster) til at lytte på om metoden getResult køres og variablerne deri sættes?
- Hvordan får jeg det rigtige resultat retuneret fra addTimeTable()?

Som jeg ser det, skal jeg have et hav af ekstra funktioner i min klasse - blot for at få min timeTableId retuneret i addTimeTable()-funktionen.

Eller er jeg helt gal på den? :(

--
Kristian
Avatar billede mat Nybegynder
04. oktober 2006 - 12:40 #6
Du sætter dem ikke til at lytte på getResult per se, getResult lader du dispatche en event (eller broadcaste hvis det er den model du bruger), dine andre objekter lytter på denne event. Du kan sende parametre med eventen, eksempelvis dit id.

Der skal laves lidt ekstra kode for at gøre det ja, men "et hav" ved jeg ikke om det er? :)

Jeg har ikke det store indblik i din overordnede programstruktur, og det kan derfor være lidt svært at forholde sig til om ovenstående er det mest hensigtsmæssige?

mvh mat
Avatar billede cpfrande Nybegynder
04. oktober 2006 - 14:42 #7
Hej igen,

Jeg tror ikke helt, at det vil fungerer. Jeg har som sådan brug for, at den stopper med at lave andet, mens den laver det her. Dvs. den skal på sin vis, når den kører getResult() vente på, at der kommer et svar tilbage.

En lytte-metode, som de nævnte, vil vel blot lytte, men stadig tillade anden kode at blive eksekveret. Derfor vil det heller ikke blive optimalt i så fald.

Jeg ved ikke helt, hvad jeg skal stille op med problemet.

På forhånd tak!

--
frande
Avatar billede mat Nybegynder
04. oktober 2006 - 14:48 #8
Endnu engang med forbehold for at jeg ikke har dybere kendskab til dit program, men hvis din lyttefunktion er den der sætter det videre forløb igang, så venter programmet på at eventen smides :) ...Jeg bruger det selv til køer, hvor objekter henter stads fra databaser, billeder og hvad man ellers kan finde på.

mvh mat
Avatar billede cpfrande Nybegynder
04. oktober 2006 - 14:57 #9
Halløjsa,

Okey, måske jeg har misforstået det så.
Er det muligt, at jeg kan få dig til at lave en stump kode, der viser det? Evt. "din" version af det kode, som jeg har angivet længere oppe på siden.

Det eneste addTimeTable() skal gøre er at retunere det ID, som vi får sendt fra den PHP og som fanges getResult()-funktionen.

Du skal naturligvis blot sige nej, hvis det ikke har din interesse.

Det hele er til et skoleprojekt, som jeg er igang med, så tiden er nemlig ved at blive lidt presset for mig :) Mit eneste alternativ er at undlade at arbejde med klasser i Flash og så blot skrive det direkte ind ved hver funktionalitet i selve Flash-filmen, men så går OOP jo lidt ud af det hele :P

På forhånd tak!

--
frande
Avatar billede mat Nybegynder
04. oktober 2006 - 15:25 #10
I en forsimplet version;

import mx.utils.Delegate;
import mx.events.EventDispatcher;

class TimeTables
{
    private var c:LoadVars;
    public var addEventListener:Function;
    public var removeEventListener:Function;
    public var dispatchEvent:Function;
   
    public function TimeTables()
    {
        c = new LoadVars();
        c.onLoad = Delegate.create(this, getResult);
        EventDispatcher.initialize(this);
    }
   
    public function addTimeTable():Void
    {
        // Vi snakker til PHP-filen
        c.sendAndLoad("system/timetable.php", c, "POST");
       
    }
    private function getResult(s:Boolean):Void {
        if ( s ) {
            var evtObj:Object = { type:"onLoadComplete", id:c.timeTableId };
            dispatchEvent(evtObj);
        }
        else {
            trace("unable to reach url");
        }
    }
}

Og så en lille "manager";

import mx.utils.Delegate;

class TimeTableManager {
    private var tt:TimeTables;
    public function TimeTableManager() {
            tt = new TimeTables();
            tt.addEventListener("onLoadComplete", Delegate.create(this, onLoadComplete));
            tt.addTimeTable();
    }
    private function onLoadComplete(evtObj:Object):Void {
        trace(evtObj.id);
        trace("proceed");
    }
}

Jeg ved ikke om der var en bestemt grund til at have dine metoder statiske, men det har jeg lavet om?

Som sagt ved jeg ikke om det er noget i den stil du har i tankerne?

mvh mat
Avatar billede mat Nybegynder
04. oktober 2006 - 23:22 #11
Men hvis det skal være helt simpelt kan man selvfølgelig også bare sende en reference til det objekt man vil kalde en metode på :)

import mx.utils.Delegate;
class TimeTables
{
    private var c:LoadVars;
    private var tm:TimeTableManager;
    public function TimeTables(time_table_manager:TimeTableManager)
    {
    tm = time_table_manager;
        c = new LoadVars();
        c.onLoad = Delegate.create(this, getResult);
    }
 
    public function addTimeTable():Void
    {
        // Vi snakker til PHP-filen
        c.sendAndLoad("system/timetable.php", c, "POST");
     
    }
    private function getResult(s:Boolean):Void {
        if ( s ) {
        tm.onLoadComplete(c.timeTableId);
        }
        else {
            trace("unable to reach url");
        }
    }
}

Og så;

class TimeTableManager {
    private var tt:TimeTables;
    public function TimeTableManager() {
            tt = new TimeTables(this);
            tt.addTimeTable();
    }
    public function onLoadComplete(id:String):Void {
        trace(id);
       
    }
}

..eller noget? :)

mvh mat
Avatar billede cpfrande Nybegynder
05. oktober 2006 - 07:56 #12
Halløjsa mat,

Tak for dine eksempler. Jeg vil lige kigge på det i løbet af i dag :)
Hvis du vil smide et svar, vil jeg give dig de 60 points :-)

Min klasse TimeTables er statisk, idet den skal være creator-klasse for bl.a. TimeTable-klassen, som udarbejdes senere. TimeTables vil indeholde metoder som tilføj, slet og hent. Derfor vil den også jvf. de gængse UML "regler" nok arbejde mest som en statisk klasse :-)

Tak for hjælpen!

--
Kristian
Avatar billede mat Nybegynder
05. oktober 2006 - 09:04 #13
aight :)
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