Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 12-09-2003, 17:29   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2003
Ort: Graz
Beiträge: 36
Question Globales Array in Function erzeugt - aber undefined wenn von außerhalb ausgelesen?

Hallo alle zusammen und danke, daß ihr euch die Zeit zum Lesen nehmt!

Ich habe folgendes Problem:

Ich lese aus einer externen Textdatei (UTF-8) folgende Einträge aus:
Code:
&idea1=put in a new material&
&idea2=redesign the frontside&
&idea3=change the colour&
Die einzelnen Variablen werden in das Array mit dem Namen ideaArray geschrieben (ich weiß, nicht ganz konventionelle Namensgebung). Später möchte ich dann zufallsgeneriert einen Eintrag aus dem Array auslesen und in ein dyn. Textfeld schreiben.

Leider kommt es nie soweit, denn obwohl ich das Array als globale Variable deklariert habe, kann ich den Inhalt von außerhalb der Funktion nicht abrufen, sondern bekomme immer ein "Undefined".

Vielleicht sitze ich ja einem Denkfehler auf, aber wenn mit
Code:
var Empfaenger.load("BSS_ideas.txt");
die Funktion "handleText" aufgerufen wird, so sollte das Array ja erzeugt werden und später mit dem trace Befehl ausgelesen werden können. Tatsächlich scheint es mir aber, daß zuerst der trace Befehl ausgeführt wird und dann natürlich ein "undefined" zurückgibt.

Wie komme ich nun an meine Arraydaten außerhalb der Funktion?

Ich sitze hier nun schon den ganzen Tag dabei, habe Bücher gewälzt und das Internet bemüht, aber keine Lösung gefunden...
Bin für jede Anregung dankbar!

ActionScript:
  1. _global.ideaArray   = new Array();
  2.  
  3. var Empfaenger   = new LoadVars();
  4. var Empfaenger.onLoad   = handleText;
  5. var Empfaenger.load("BSS_ideas.txt");     // lädt die externe Textdatei
  6.  
  7. //  ********************************************
  8. //  Funktion welche Daten aus einer externen Textdatei liest
  9. //  ********************************************
  10. function handleText(success) {
  11. //  wenn erfolgreich (success = true) eingelesen dann
  12.     if (success) {
  13.         //  solange Variable vorhanden
  14.         if (this.idea1 != undefined) {
  15.             var i = 1;
  16.             // führe aus solange Variable gefunden werden kann
  17.             while (this["idea"+i] != undefined) {
  18.                 idea = this["idea"+i];
  19.                 //  die eingelesenen Variablen werden in das entsprechende Array geschrieben
  20.                 _global.ideaArray.push(idea);
  21.                 trace(_global.ideaArray[i-1]); // gibt den Inhalt des Arrays richtig aus
  22.                 i++;
  23.             }
  24.  
  25.         } else {
  26.             trace("Variablen nicht gefunden");     
  27.         }
  28.     } else {
  29.         trace("Textdatei nicht gefunden");
  30.     }
  31. }
  32. //  Ende der Funktion handleText()
  33. //  =======================================
  34.  
  35. trace(ideaArray[0]);    // gibt immer "undefined" aus
  36.  
__________________
Robert Niessner
LAUFBILDkommission

Geändert von rniessner (12-09-2003 um 17:35 Uhr)
rniessner ist offline   Mit Zitat antworten
Alt 12-09-2003, 17:34   #2 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi und willkommen im FF
wenn schon global dann ohne _root.
ActionScript:
  1. trace(ideaArray[0]);
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 12-09-2003, 17:38   #3 (permalink)
Neuer User
 
Registriert seit: Sep 2003
Ort: Graz
Beiträge: 36
Danke, hab ich im 1. Posting schon ausgebessert (macht aber fürs Problem keinen Unterschied ). Ist nur ein Schnipsel den vergessen habe zurückzuändern, bei meinen vielen Experimenten in meiner Verzweiflung.

Jedenfalls schön bei euch hier zu sein
__________________
Robert Niessner
LAUFBILDkommission

Geändert von rniessner (12-09-2003 um 17:40 Uhr)
rniessner ist offline   Mit Zitat antworten
Alt 12-09-2003, 17:47   #4 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi
mach mal so dein array ist so wie du das schreibst noch nicht initialisiert.
ActionScript:
  1. _global.ideaArray   = new Array();
  2. Empfaenger = new LoadVars();
  3. Empfaenger.onLoad = function (success){
  4.                 if (success) {
  5.                 //  solange Variable vorhanden
  6.                 if (this.idea1 != undefined) {
  7.                         var i = 1;
  8.                         // führe aus solange Variable gefunden werden kann
  9.                         while (this["idea"+i] != undefined) {
  10.                                 idea = this["idea"+i];
  11.                                 //  die eingelesenen Variablen werden in das entsprechende Array geschrieben
  12.                                 _global.ideaArray.push(idea);
  13.                                 trace(_global.ideaArray[i-1]); // gibt den Inhalt des Arrays richtig aus
  14.                                 i++;
  15.                        }
  16.                         anzeige()
  17.                 } else {
  18.                         trace("Variablen nicht gefunden");
  19.                 }
  20.         } else {
  21.                 trace("Textdatei nicht gefunden");
  22.         }
  23. }
  24. Empfaenger.load("BSS_ideas.txt");
  25. function anzeige(){
  26. trace(ideaArray[0]);   
  27. }
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 12-09-2003, 17:59   #5 (permalink)
Neuer User
 
Registriert seit: Sep 2003
Ort: Graz
Beiträge: 36
Danke für die schnelle Antwort!

Aber das ist nicht so ganz das, was ich damit bezwecken will.
Im Prinzip machst Du ja mit dem eingefügten anzeige() nun nichts anderes, als was mein trace(_global.ideaArray[i-1]); oberhalb auch schon macht.

Ich möchte die eingelesenen Daten in dem Array zwischenspeichern und später bei Bedarf woanders ausgeben.
Da bringt es mir aber nichts, wenn das Auslesen schon direkt in der Funktion aufgerufen wird.

Die Frage ist: Warum ist das Array noch nicht initialisiert, obwohl die Funktion aufgerufen wurde? Und wie kann man das ändern?


So, ich gehe jetzt mal nachhause - schaue später wieder rein.
__________________
Robert Niessner
LAUFBILDkommission
rniessner ist offline   Mit Zitat antworten
Alt 12-09-2003, 18:18   #6 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi
wenn dein code hier in diesem frame abgearbeitet wird
wird dein trace ausgabe aufgerufen bevor dein array initialisiert
ist.auch wenn es hinter deinem onload steht.
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 13-09-2003, 09:53   #7 (permalink)
Neuer User
 
Registriert seit: Sep 2003
Ort: Graz
Beiträge: 36
Zitat:
wenn dein code hier in diesem frame abgearbeitet wird
wird dein trace ausgabe aufgerufen bevor dein array initialisiert
Hmm, das habe ich mir gedacht. Aber wie bringe ich nun das Array dazu, vorher initialisiert zu werden.

Ich habe eine Funktion main() eingebaut, in der eigentlich alle wichtigen Aufrufe und Initalisierungen gestartet werden. Und ich möchte nicht eine zweite Funktion extra fürs Array einführen müssen.

Ich habe mir schon überlegt eine Klasse zu machen und das Auslesen zu einer Methode davon, dann könnte ich mit getter/setter Methoden darauf zugreifen.

Oder hat jemand eine einfache Lösung?
__________________
Robert Niessner
LAUFBILDkommission
rniessner ist offline   Mit Zitat antworten
Alt 13-09-2003, 10:05   #8 (permalink)
HAY
Neuer User
 
Benutzerbild von HAY
 
Registriert seit: Aug 2002
Ort: Faust-Stadt
Beiträge: 2.577
hi
denk manchmal nicht zu kopliziert,
wennn du diese ganze onload-loadvars geschichte auf einem mc hast.mache aus dem mc 2 frames und springe wenn variablen geladen sind einfach mit nextFrame eins weiter und alles ist gut.
__________________
gruß Harry
HAY ist offline   Mit Zitat antworten
Alt 15-09-2003, 13:15   #9 (permalink)
Neuer User
 
Registriert seit: Sep 2003
Ort: Graz
Beiträge: 36
Danke HAY!

Du hast recht, ich hab mich da in ein kompliziertes Gedankenkonstrukt verrannt.

Tatsächlich scheint das Problem folgendes zu sein:
die LoadVars Methoden laufen asynchron ab, der onLoad() Handler gibt mir nur zurück, daß die Variablen geladen worden sind, aber ich weiß nicht, wann das Parsen im handleText() fertig ist.

Lösung 1: ich setze am Ende der handleText() Funktion eine Variable auf TRUE, welche in regelmäßigen Abständen von einem Handler überwacht wird und rufe erst dann die Funktion anzeige() auf.

Lösung 2: ich setze am Ende der handleText() Funktion ein nextFrame(). In einem neuen Keyframe wird dann erst das Array ausgelesen (die Lösung, die ich nun auch angewandt habe).

Code im Frame 1:


ActionScript:
  1. _global.ideaArray   = new Array();
  2.  
  3. var Empfaenger   = new LoadVars();
  4. var Empfaenger.load("BSS_ideas.txt");
  5. var Empfaenger.onLoad   = handleText;
  6.  
  7.  
  8.  
  9. function handleText(success) {
  10.         if (success) {
  11.                 if (this.idea1 != undefined) {
  12.                         var i = 1;
  13.                         while (this["idea"+i] != undefined) {
  14.                                 var idea = this["idea"+i];
  15.                                 _global.ideaArray.push(idea);
  16.                                 i++;
  17.                         }
  18.                        
  19.                 } else {
  20.                         trace("Variablen nicht gefunden");
  21.                 }
  22.         } else {
  23.                 trace("Textdatei nicht gefunden");
  24.         }
  25.         nextFrame();
  26. }

Und im nächsten Frame 2:

ActionScript:
  1. for(var i = 0; i <_global.ideaArray.length; i++) {
  2.     trace(_global.ideaArray[i]);
  3. }
__________________
Robert Niessner
LAUFBILDkommission

Geändert von rniessner (15-09-2003 um 13:22 Uhr)
rniessner ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele