Viser to varianter:
- Med egen klasse som laster rutetabell fra XML-fil
- Enklere variant med rutetabell i Array
/**************************** Flystevne - oppgave 3 H-P Ulven 12.03.12 *****************************/ import flash.events.Event; /// --- Brukergrensesnitt --- /// // Kobler beregningsrutinen på beregn-knappen: beregnBtn.addEventListener(MouseEvent.CLICK,beregnKlikket); // Klargjør komboboksene i brukergrensesnitt når xml er lastet og klart i // den egne klassen Rutetabell.as: // (ENKLERE løsning: Legge navn i komboboksene direkte og // ha rutetabellen i vanlig Array). // Unngår da denne lytteren: function xmlLastet(evt: Event): void { //setter opp komboboksen fraCb: var data:Array = rutetabell.getFraNavn(); //Henter tabell fra klassen Rutetabell.as for(var i:int =0; i<data.length;i++) { fraCb.addItem(data[i]); }//for // Setter opp komboboksen tilCb: data=rutetabell.getTilNavn(); //Henter tabell fra klassen Rutetabell.as for(i = 0; i<data.length;i++) { tilCb.addItem(data[i]); }//for //Melding til bruker: meldingTa.visible=true; meldingTa.text="Klart til beregning, tast inn fra, til og fart og trykk beregn!"; rutetabell.debug(); //Sjekker debug-metode i Rutetabell }//xmlLastet() /// --- Data-struktur --- /// // XML-LØSNING med Rutetabell.as som egen klasse: // Rutetabell som laster rutetabell fra xml-fil og kan beregne avstander: var rutetabell:Rutetabell = new Rutetabell(); // Må få tak i URLLoader og henge på lytter for å unngå å referere til // data som ikke er ferdig lastet rutetabell.getLoader().addEventListener(Event.COMPLETE,xmlLastet); // ENKLERE løsning med assosiativt array: var rutetabell2: Object = { Gardermoen: {Gardermoen: 0, Flesland: 40}, Flesland: {Gardermoen: 40, Flesland: 0}, Værnes: {Gardermoen: 60, Flesland: 50}, Bodø: {Gardermoen:100, Flesland: 80}, Evenes: {Gardermoen:150, Flesland: 130}, Tromsø: {Garermoen: 200, Flesland: 180} }//rutetabell2 /// --- Beregninger --- /// // Henter fart og avstand, beregner og setter resultat function beregnKlikket(evt: Event): void { trace("beregnKlikket():"); var fart: Number = Number(fartTi.text); trace("fart: "+fart); var fra: String = fraCb.selectedItem.label; trace("fra: "+fra); var til: String = tilCb.selectedItem.label; trace("til: "+til); // MED Rutetabell.as klasse: var avstand: Number = rutetabell.getAvstand(fra,til); trace("avstand: "+avstand); // ENKLERE løsning med vanlig array: var avstand2: Number = rutetabell2[fra][til]; trace("avstand2: "+avstand2); var reisetid: Number = avstand*10/(fart*1.852); trace("tid: "+reisetid); var timer: Number = int(reisetid); trace("timer: "+timer); var minutter =int((reisetid-timer)*60); trace("min: "+minutter); tidT.text = ""+timer+"h "+minutter+"m" }//beregnKlikket()
package { import flash.events.Event; import flash.net.URLLoader; import flash.net.URLRequest; /** * Rutetabell - Klasse * * Leser inn rutetabell fra xml-fil til xml-variabel. * Bruker AS attributt-syntaks (@attr=...) til å slå opp. * * Interface: * Rutetabell() Leser inn rutetabell fra xml-fil til xml-variabel * getFra():Object Hent fra-data som skal legges i combobox * getTil():Object Hent til-data som skal legges i combobox * getAvstand(fra: String, til: String): Number Slår opp riktig avstand * getLoader():URLLoader Trenger for å henge på lytter som venter på Event.COMPLETE... * * @author H-P Ulven * @version 12.03.12 */ public class Rutetabell { private var rutetabell: XML = null; private var xmlURL:URLRequest = new URLRequest("rutetabell.xml"); private var xmlLoader:URLLoader = new URLLoader(xmlURL); /* Konstruktør leser inn fil til variabel rutetabell */ public function Rutetabell():void { xmlLoader.addEventListener(Event.COMPLETE, rutetabellFerdig); }//constructor private function rutetabellFerdig(evt:Event):void { rutetabell = XML(evt.target.data); }//rutetabellFerdig() /* Oppslagsfunksjonen */ public function getAvstand(fra: String, til: String): Number { return Number( rutetabell.avstand.(@fra == fra).verdi.(@til == til) ); }//getAvstand(fra, til) /* Lager array med objekter {label:franavn, data: nr} til kombobox fraCb */ public function getFraNavn():Array { var navn: Array = new Array(); var o: Object = null; for(var i: int = 0;i<rutetabell.avstand.length();i++) { o=new Object(); o.label=rutetabell.avstand[i].@fra; //label settes o.data=i; //data settes (kan være tom) navn.push(o); //legger i array }//for return navn; //returnerer array }//getFraNavn /* Lager objekter til kombobox tilCb */ public function getTilNavn():Array { var navn: Array = new Array(); var o: Object=null; for(var i: int = 0;i<rutetabell.avstand[0].verdi.length();i++) { o=new Object(); o.label=rutetabell.avstand[0].verdi[i].@til; o.data=i; navn.push(o); }//for return navn; }//getTilNavn() /* Returnerer loader slik at brukere av klassen kan henge på lytter for å sikre at filen er lastet før forsøk på bruk av klassen */ public function getLoader(): URLLoader { return xmlLoader;} /* Debug function: Lister ut innhold i rutetabell */ public function debug(): void { var fra: String; var til: String; trace("rutetabell.debug():"); for (var i:int = 0; i < rutetabell.avstand.length(); i++) { fra = rutetabell.avstand[i].@fra; trace("fra: " + fra); for (var j:int=0; j< rutetabell.avstand[i].verdi.length();j++) { til = rutetabell.avstand[i].verdi[j].@til; trace("til: " + til); trace("avstand: " + rutetabell.avstand.(@fra == fra).verdi.(@til == til)); }//for j }//for i }//debug() }//class }//package
<rutetabell> <avstand fra="Gardermoen"> <verdi til="Gardermoen"> 0 </verdi> <verdi til="Flesland"> 40 </verdi> </avstand> <avstand fra="Flesland"> <verdi til="Gardermoen"> 40 </verdi> <verdi til="Flesland"> 0 </verdi> </avstand> <avstand fra="Værnes"> <verdi til="Gardermoen"> 60 </verdi> <verdi til="Flesland"> 50 </verdi> </avstand> <avstand fra="Bodø"> <verdi til="Gardermoen"> 100 </verdi> <verdi til="Flesland"> 80 </verdi> </avstand> <avstand fra="Evenes"> <verdi til="Gardermoen"> 150 </verdi> <verdi til="Flesland"> 130 </verdi> </avstand> <avstand fra="Tromsø"> <verdi til="Gardermoen"> 200 </verdi> <verdi til="Flesland"> 180 </verdi> </avstand> </rutetabell>