Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[flash] geen return vanuit onLoad

Pagina: 1
Acties:

  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 30-11 19:37
Ik moet voor een opdracht een simpel scrollmenu maken waarin een aantal afbeeldingen worden geladen. De breedte van dit menu is 700px. Zodra de afbeeldingen bij elkaar opgeteld breder zijn dan 700px moet de breedte van een movieclip worden gewijzigd.

Nu is dit geen probleem en had ik dit netjes voor elkaar (na veel gepruts gezien mijn actionscript kennis). De afbeelding laad ik uit een XML file, dus toen ik dit beide voor elkaar had was ik erg blij. Als ik deze beide functies echter combineer, wat inhoud dat ik de breedte van de movieclip wijzig vanuit de onload functie voor het lezen van XML file, dan wordt de breedte niet gewijzigd.

Wat ik heb is het volgende (enigzins versimpeld)
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
placeImages = function() {
    var xmlUrl          = "pictures.xml";
    var itemsArray:Array    = new Array();
    var xmlFile         = new XML();    
    xmlFile.ignoreWhite     = true;
    
    xmlFile.onLoad = function(succes){
        if(succes){
            
            var item = this.firstChild;
            itemsArray = item.childNodes;
            
            for (var i=0; i < itemsArray.length; i++){
                // en hier gebeuren een aantal dingen, imageSpace wordt gedeclareerd enz.
                
            }
            
            
        } else {
            trace("inladen mislukt!");
        }
        
        
        var scrollWidth:Number  = imageSpace + ((i * 100) + (i * imageSpace));
        _root.contentMain.scrollBlocker._width = scrollWidth;

        trace(_root.contentMain.scrollBlocker._width); // <-- dit geeft de waarde van scrollWidth
    }
    
    xmlFile.load(xmlUrl);
    trace(_root.contentMain.scrollBlocker._width) <-- dit geeft de oude waarde, terwijl die dus de waarde van scrollWidth zou moeten zijn
    
}


Wat ik heb geprobeerd is het volgende:
Ik heb de waarde scrollWidth gereturned. Het probleem is alleen dat het een onload functie is. Ik kreeg dus alleen de waarde true terug, verder niets (ik acht het niet uitgesloten dat ik wat verkeerd deed ;))

Verder heb ik ipv een onload functie een normale functie geprobeerd, maar toen kreeg ik de xml niet meer geladen.

En nog veel meer domme dingen die ik maar niet beschijf ;)
Ik zie nu zelf echt niet meer waar ik moet zoeken, dus als iemand een hint heeft dan zou ik blij zijn.

edit:
Ik snap eigenlijk sowieso niet waarom ik de breedte van de desbetreffende MC niet gewoon kan veranderen vanuit een onload functie, kan iemand mij dat uitleggen?

[ Voor 3% gewijzigd door Geert.H op 03-09-2007 23:59 ]


  • sanderb
  • Registratie: November 2000
  • Laatst online: 30-11 23:05
Je declareert een variabele i in een for loop:

Flash ActionScript:
1
2
3
4
for (var i=0; i < itemsArray.length; i++){
                // en hier gebeuren een aantal dingen...
                
            }


buiten de for loop probeer je deze weer aan te spreken:

Flash ActionScript:
1
var scrollWidth:Number     = imageSpace + ((i * 100) + (i * imageSpace));

zet daar eens een trace("i: "+i); onder...en je zal zien dat die undefined is.

Als je de i in die laatste regel vervangt door itemsArray.length kom je een heel eind denk ik.

Let overigens op met het declareren van een variabele binnen een functie (dus ook een onload). Wanneer je binnen een functie een variabele declareert met var foo = bar , bestaat deze variabele alleen binnen die functie. Ik kan niet zien waar je "imageSpace" declareert, maar ik vermoed binnen de for loop zoals je schrijft?

[ Voor 31% gewijzigd door sanderb op 04-09-2007 01:03 ]

" A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools. " - Douglas Noel Adams


  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 30-11 19:37
Dat is het probleem niet. Het klopt dat ik de i bij de for loop definieer, maar een for loop is geen function. Ik hou dus aan het einde van de for loop de laatste waarde van i over. Ik heb bewust die regel buiten de for loop gezet omdat ik anders de MC elke keer breder maak, terwijl één keer op het eind meer dan genoeg is.

Dit geldt dus ook voor imagespace. De trace geeft in mijn geval netjes i: 15.

[ Voor 19% gewijzigd door Geert.H op 04-09-2007 10:33 ]


  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Als je nu eens de onload functie de width laat returnen?

Going for adventure, lots of sun and a convertible! | GMT-8


  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 30-11 19:37
Heb ik gedaan, het probleem is alleen hoe vang ik die waarde op? Waar komt die terecht? Wat ik deed was het volgende:
Flash ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var breedte = xmlFile.load(xmlUrl);
//geeft:  "true" (immers, de load functie is gelukt)

óf

var breedte = xmlFile.load();
//geeft "false"

óf
var breedte = xmlFile.onLoad();
// geeft undefined

óf 
var breedte = xmlFile();
// geeft undefined


Wat ik ook al in mijn TS me afvroeg snap ik nog steeds niet. Waarom kan ik niet vanuit de onload functie de MC breder maken? Het is alsof zodra de onLoad functie geweest is, de MC weer terug gereset wordt naar z'n oude waarde.

[ Voor 42% gewijzigd door Geert.H op 04-09-2007 11:06 ]


  • Geert.H
  • Registratie: Maart 2001
  • Laatst online: 30-11 19:37
Probleem is opgelost, had de vraag ook op flashfocus gepost. Het antwoord wat ik kreeg luidde als volgt:
De XML class werkt met events (bv het onLoad event). Dit houdt in dat wanneer het laden voltooid is, de xml classe een andere functie oproept wanneer het laden voltooid is. Omdat je dan in een andere functie zit dan de originele, kan je de functie geen waarde laten returnen.

Waarom is je trace op het einde anders? Stel dat je xml bestand 10 mb is. Tegen de tijd dat het bestand eindelijk ingeladen is, is flash al lang klaar met al het andere AS dat op je frame staat (inclusief de trace die onder je .load staat). Wanneer de xml dan eindelijk ingeladen is, wordt de onLoad getriggerd. Hoe je dit kan oplossen: Ga vanaf je onLoad functie verder met andere functies.
http://www.flashfocus.nl/forum/showthread.php?t=35665
Pagina: 1