Array außerhalb einer Funktion verfügbar machen

exgo_n1

Grünschnabel
Seit kurzem bei Flash dabei versuch ich gerade Bilder mit dazugehörigen Links
aus einer XML Datei auszulesen, um diese dann einem Movieclip zuweisen zu können.

Problem:
Das auslesen funktioniert soweit, nur bekomm ich die ausgelesenen Daten
(welche ich in ein Array geschrieben werden) nicht für das restliche Programm zur
Verfügung gestellt.

Der Inhalt des Arrays "images", bzw. "links", ist am Ende der Funktion function(success) {....]
noch gefüllt. Außerhalb der Funktion (siehe code unten)
Code:
fnames = new Array(images[0], images[1], images[2]);
flinks = new Array(links[0],links[1],links[2]);
wird nur noch undefined als Inhalt von images[0...2], bzw links[0...2] angezeigt.

Daher meine Frage:
Wie schaff ich es die Arrays auch im restlichen Programm verfügbar zu machen?

Code:
        var specials;
  	var specials = new XML();
	specials.ignoreWhite = true;
	specials.load("specials.xml");
  	
	specials.onLoad = function(success) {
  	    if (success) {
  	       parse(this);
    	    } else {
   	       _root.mainText.text = "Ladefehler";
  	    }
  	}
	
 	function parse(obj) {
		obj = obj.childNodes;
		var images:Array = new Array();
		var links:Array = new Array();
  		for (var i=0; i<obj.length; i++) {
   			//trace(obj[i]);
   			images[i] = obj[i].attributes.image;
   			links[i] = obj[i].attributes.link;
			trace(images[i]);
			//trace(links[i]);
 		}
		//trace(fnames);
	}
	
fnames = new Array(images[0], images[1], images[2]);
flinks = new Array(links[0],links[1],links[2]);
 
Hi,

Hier sind zwei verschiedene Probleme vertreten:
  • die Tatsache, dass lokale Member einer Funktion (hier: die beiden Arrays) nicht ausserhalb der Funktion verfügbar sind. Umgehen kannst Du das z.B., indem Du die Arrays ausserhalb der Funktion deklarierst:
Code:
var meinArray:Array;

function machWas() {
  meinArray = new Array(1, 2, 3);
}

machWas();

trace(meinArray);
  • die Abarbeitung des Codes: Die beiden Zeilen:
Code:
fnames = new Array(images[0], images[1], images[2]);
flinks = new Array(links[0],links[1],links[2]);
werden abgearbeitet, bevor die Funktion "parse" aufgerufen wird (einfach deshalb, da das Laden einer XML-Datei länger dauert, als die Zeit zwischen ein paar Codezeilen - externe Inhalte werden asynchron geladen; wäre das nicht so, würden alle Flashfilme komplett einfrieren, wärend Daten nachgeladen werden).

Wenn Du die Inhalte der Arrays nach dem Laden der Datei weiter verwenden willst, musst Du alles weitere von der Funktion "parse" aus anstoßen.

Gruß
.
 
Erst mal danke für deine Antwort.
Hab es nun gemacht wie du es zu 1. beschrieben hast und die zwei Arrays
außerhalb jeder Funktion deklariert.

Zu dem 2ten Ansatz von dir, was meinst du mit
alles weitere von der Funktion "parse" aus anstoßen

Ich habe den restlichen Inhalt bis auf 2 andere Funktionen in die parse Funktion,
ans Ende gelegt. (Hab ich die preloadImages() und die showImage() Funktion mit in die parse() Funnktion gelegt wurde gar nichts angezeigt.)
Fakt ist, die Bilder werden nun angezeigt, nur gleich alle drei auf einmal.

Der gesamten Code hab ich mir aus mehreren Codeschnipseln zusammengebaut.
Z.b. small_gallery.fla, die es hier im Forum in der Sammlung gab.
Und genau diese wollte ich mittels XML dynamisch die Bilder laden lassen und
drei feste Buttons zum Navigieren erstellen.

Für weitere Hilfe wäre ich sehr dankbar.
Den kompletten Code habe ich hier unten angehangen.

Code:
var specials;
var specials = new XML();
var simages:Array = new Array();
var slinks:Array = new Array();
specials.ignoreWhite = true;
specials.load("specials.xml");
  	
specials.onLoad = function(success) {
  	if (success) {
  		parse(this);
    } else {
   		_root.mainText.text = "Ladefehler";
  	}
}
	
function parse(obj) {
	obj = obj.childNodes;
  	for (var i=0; i<obj.length; i++) {
   		//trace(obj[i]);
   		simages[i] = obj[i].attributes.image;
   		slinks[i] = obj[i].attributes.link;
		//trace(images[i]);
		//trace(links[i]);
 	}
	//simages = new Array(simages[0], simages[1], simages[2]);
	//flinks = new Array(slinks[0],slinks[1],slinks[2]);
	//trace(simages);
	

//-- START IMAGE LADEN UND ANZEIGEN small_gallery.fla -->
//trace(simages);
var images = new Array(simages.length);
var loaded = 0;
// Anzahl der geladenen Bilder
var current = 0;
// Aktuell angezeigtes Bild
var container = this.createEmptyMovieClip("container", this.getNextHighestDepth());
container._x = 50;
// Position für die Bilder festlegen
container._y = 100;
container._visible = false;
// Zunächst unsichtbar
for (var i = 0; i<images.length; i++) {
	images[i] = container.createEmptyMovieClip("image"+i, i);
	images[i].loadMovie(simages[i]);
	// Bild laden
	this.attachMovie("button", "but1", this.getNextHighestDepth());
	this.attachMovie("button", "but2", this.getNextHighestDepth());
	this.attachMovie("button", "but3", this.getNextHighestDepth());
	
	with (this["but1"]) {
		_y = 400;
		// Buttons positionieren
		_x = 1*(_width+2)+50;	
	}
	this["but1"].onPress = function() {
		showImage(0);
		//currentLink = slink[1];
	}
	with (this["but2"]) {
		_y = 400;
		// Buttons positionieren
		_x = 2*(_width+2)+50;	
	}
	this["but2"].onPress = function() {
		showImage(1);
		//currentLink = slink[2];
	};
	with (this["but3"]) {
		_y = 400;
		// Buttons positionieren
		_x = 3*(_width+2)+50;	
	}
	this["but3"].onPress = function() {
		showImage(2);
		//currentLink = slink[2];
	};
	
}
preloadImages();

}// Ende function parse()

function preloadImages() {
	// Auf das Laden aller Bilder warten
	this.onEnterFrame = function() {
		for (var i = 0; i<images.length; i++) {
			if (images[i].isloaded == undefined) {
				if (images[i]._width>1) {
					images[i].isloaded = true;
					loaded++;
				}
			}
			image[i]._visible = false;
		}
		if (loaded>=images.length) {
			container._visible = true;
			this.onEnterFrame = function() {
				showImage(0);
				delete this.onEnterFrame;
			};
		}
	};
}
function showImage(nr) {
	// Ein Bild anzeigen
	for (var h = 0; h<images.length; h++) {
		this["but"+h]._visible = true;
		if (h == nr) {
			images[h]._visible = true;
		} else {
			images[h]._visible = false;
		}
	}
}
 
Hi,

alles, was in Deinem Code nach
Code:
//-- START IMAGE LADEN UND ANZEIGEN small_gallery.fla -->
kommt, wird sofort ausgeführt - das macht aber keinen Sinn, da Du erst warten musst, biss die XML-Datei geladen und geparst ist.

Man kann nicht beliebig Vorlagen durch Untereinanderkopieren kombinieren, sondern muss auf die speziellen Belange und Designs der Scripte achten. In Deinem Fall wäre es vielleicht das einfachste (normalerweise empfehle ich das nicht), den zweiten Teil des Codes in den zweiten Frame der Zeitleiste zu verschieben, und am Ende der Funktion "parse" einfach per gotoAndStop in den zweiten Frame zu springen ...

Gruß
.
 
Hab das nun so gemacht, wie du es geschrieben hast,
am Ende der Funktion parse() ein
Code:
gotoAndStop(2);
eingefügt und einen zweiten Frame erstellt indem sich der zweite Teil des Codes nun befindet.
Nun erscheint aber folgender Fehler, mit dem ich rein gar nichts anfangen kann.

Code:
Ziel nicht gefunden: Ziel="/container/image0" Basis="_level0.container.image0"
Ziel nicht gefunden: Ziel="/container/image1" Basis="_level0.container.image1"
Ziel nicht gefunden: Ziel="/container/image2" Basis="_level0.container.image2"
 
Hi,

wahrscheinlich hast Du die MovieClips aus Frame 1 nicht in Frame 2 verfügbar gemacht.

Poste bitte Deine .fla und die dazugehörige XML-Datei, denn Herumraten bringt hier nicht viel.

Gruß
.
 

Neue Beiträge

Zurück