11. januar 2009 - 14:07Der er
7 kommentarer og 1 løsning
Hønen og ægget - ns er ikke defineret (AS3)
Hej eksperter.
Jeg er ved at lave en stream-videoafspiller, men har problemer med en kommando, der sætter min volumen. Det kan sikkert laves på 117 andre måder, men det irriterer mig ikke at den melder fejl på noget så simpelt.
Denne funktion styrer volumen: function setVolume(intVolume:Number = 0):void { trace("Volume sat"); var sndTransform = new SoundTransform(intVolume); ns.soundTransform = sndTransform; <--- DENNE LINIE GIVER COMPILERFEJL osv... }
Problematikken er, at ns ikke erklæres lige med det samme - for det afhænger af, hvorvidt der kunne opnåes forbindelse vha. NetConnection (den forbinder til en rtmp-tjeneste).
Først når en XML-fil er indlæst samt når forbindelsen er oprettet, erklæres ns:
// *************** HER OPRETTES FORBINDELSEN *************** function connectStream():void { if (!ns) { trace("ns eksisterer ikke. Opret denne"); // Opret sammenkædningen 1 gang var ns:NetStream = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); ns.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); var custom_obj:Object = new Object(); ...osv }
Jeg har også prøvet if(Boolean(ns)) og try/catch - men hvorfor giver den vedholdende compilerfejl: 1120: Access of undefined property ns?
1. gem en referense til din SoundTransform(), og vent med at sætte den på ns indtil ns findes, eller
2. Ignorer kald til setVolume, hvis der ikke er en ns. Sæt en default SoundTransform() på ns under creation.
Synes godt om
Slettet bruger
11. januar 2009 - 19:53#3
Hej Welcor - og tak for dit svar.
Mulighed nr. 1 overvejede jeg også. Det er hermed gjort og alt virker OK. Mulighed nr. 2 er (hvis jeg har forstået dig korrekt) også det jeg har gjort med if(Boolean(ns)) og min try/catch. Men jeg var primært ude efter at høre, hvad årsagen er til at det ikke virker. Hvis jeg f.eks. skriver: if (Boolean(ns)) { var sndTransform = new SoundTransform(intVolume); //ns.SoundTransform = sndTransform; } så melder den compilerfejl i både if-sætningen... og eftersom jeg checker på, hvorvidt ns overhovedet er sat, fatter jeg ikke hvorfor den giver compilerfejl
if (!ns) { trace("ns eksisterer ikke. Opret denne"); // Opret sammenkædningen 1 gang var ns:NetStream = new NetStream(nc);
Findes der simpelthen ingen ns endnu, i if-sætningen.
Du bliver nød til at deklarere din variabel udenfor if-sætningen, i "toppen" af klassen, så den kan ses af alle functions:
var ns:NetStream = null;
....
function connectStream():void { if (ns == null) { trace("ns eksisterer ikke. Opret denne"); // Opret sammenkædningen 1 gang ns = new NetStream(nc); ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); ns.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); var custom_obj:Object = new Object(); ...osv }
Jeg er lidt rusten i lige præcis ActionScript, men den fejl tyder på scope-problemer.
Synes godt om
Slettet bruger
11. januar 2009 - 21:31#5
Jeg forstår det stadig ikke helt... Selv om der skulle være tale om et scope-problem, burde der vel ikke ske andet end at if-sætningen bliver rapporteret som "false", hvis ns ikke er undefined?
Det er ActionsScripts måde at "hjælpe dig" på - Pludselig dukker der en referense til en ukendt variabel, ns, op. Er det en stavefejl?
Husk at ActionScript (i setVolume) ikke kan vide at du lokalt i din connectStream() function deklarerer en variabel med det navn - og at det er den du mener...
Alle moderne programmeringssprog tillader også shadowing:
public class test {
public function test() { var a:Animation = new Animation(); }
public function test2() { a = new Animation(); } }
Her vil du få samme fejl i test2().
Synes godt om
Slettet bruger
11. januar 2009 - 22:57#7
Nå nej, det er da klart :) Tak for det. Svar = point.
Bare lige for at sige det - det er ikke shadowing, jeg demonstrerer i det sidste eksempel :)
Synes godt om
Ny brugerNybegynder
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.