Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-02-2006, 14:45   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 64
Array mit return() übergeben

Hi zusammen,

Habe ein (recht banales) Problem mit dem zurückliefern eines Arrays aus einer Funktion. Ich gestehe vorweg, dass ich nicht aus der Action-Script Entwickler Ecke komme und daher vielleicht irgendein Noob-Fehler schuld ist.

Hier mein Problem:

Code:
function loadXMLdaten(XMLfilename) {
	var XMLdaten = new XML();//erstellt ein neues XML Objekt
	XMLdaten.ignoreWhite=true;
	XMLdaten.load(XMLfilename);//lädt das XML-file 
	XMLdaten.onLoad = function(success) {
		datenContainer=new Array();
		if (success) {
			for (var i=0; i<XMLdaten.firstChild.childNodes.length; i++) {
				datenContainer[['image'],[i]]=XMLdaten.firstChild.childNodes[i].attributes.image;
			}
			trace(datenContainer[['image'],[0]]); // KLAPPT WUNDERBAR
			return datenContainer; // RÜCKGABE DES ARRAYS
		} else {
			trace('Fehler beim Laden des XML Files');
			return false;
		}
	}
}

XMLdatenContainer=new Array();
XMLdatenContainer=loadXMLdaten("de_content.xml");
trace(XMLdatenContainer[['image'],[0]]); // HIER UNDEFINED!!?!?
Das Problem kann nur irgendwo bei der Übergabe des Arrays aus der Funktion liegen. Evtl. habe ich hier auch ein Problem bei der Datentypdeklaration. Ein Pro kann mir hier sicher schnell und einfach weiterhelfen..

Danke vorweg & LG
Mike
__________________
-------------------------------------------------
"Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste Mißtrauensvotum gegen den lieben Gott."
Mik3e2 ist offline   Mit Zitat antworten
Alt 21-02-2006, 14:47   #2 (permalink)
°.oO°O.o°.oO.o°O
 
Benutzerbild von bamboocha
 
Registriert seit: Jun 2005
Ort: CH
Beiträge: 1.490
Hehe... ^^
Das wird nicht gehen...! onLoad ist ja eine Funktion an sich... und mit return wird lediglich diese beendet, nicht aber loadXML! Das einzige was dir übrig bleibt, ist, eine Funktion aufzurufen, die dir das ganze Weitere anstösst...
__________________
There is no way to happiness, happiness is the way! - Buddha
bamboocha ist offline   Mit Zitat antworten
Alt 21-02-2006, 14:47   #3 (permalink)
mod_rewrite
 
Benutzerbild von sonar
 
Registriert seit: Feb 2003
Ort: München
Beiträge: 15.621
Zitat:
Zitat von Mik3e2
Das Problem kann nur irgendwo bei der Übergabe des Arrays aus der Funktion liegen.
Nee nee, das Problem liegt dadran, dass du versuchst auf Daten zuzugreifen, die zum Zeitpunkt des Zugriffs noch nicht da sind... kuck mal kurz selber!
__________________
RTFM
Wie man Fragen richtig stellt.

Achim Bindannmalweg

Money makes the world go round, fear makes it turn much faster.
(New Model Army)
sonar ist offline   Mit Zitat antworten
Alt 21-02-2006, 14:52   #4 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 64
hmpf, das erklärt mir auch warum trace() zuerst
"undefined" und erst nachher "xmldatentestinhalt" ausgibt (obwohl es von der Logik her ja andersrum sein sollte)...

Manno, wie ich Flash verfluche... arbeitet ja gegen alle prinzipien *grml*
Vor allem das mit den success functions hab ich noch gar nicht durchblickt (kenn ich in keiner anderen Entwicklungsumgebung).

Aber das hier eine function in der function ist leuchtet sogar mir ein ...
Aber müsste dann nicht das Objekt "XMLdaten" den return Wert der Funktion zugewiesen bekommen?
__________________
-------------------------------------------------
"Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste Mißtrauensvotum gegen den lieben Gott."
Mik3e2 ist offline   Mit Zitat antworten
Alt 21-02-2006, 14:55   #5 (permalink)
°.oO°O.o°.oO.o°O
 
Benutzerbild von bamboocha
 
Registriert seit: Jun 2005
Ort: CH
Beiträge: 1.490
Ne, das return geht an das "onLoad"!
__________________
There is no way to happiness, happiness is the way! - Buddha
bamboocha ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:04   #6 (permalink)
Custom Title
 
Registriert seit: Aug 2001
Beiträge: 467
PHP-Code:
function loadXMLdaten(XMLfilename) {
    var 
scope this;
    var 
XMLdaten = new XML();//erstellt ein neues XML Objekt
    
XMLdaten.ignoreWhite=true;
    
XMLdaten.load(XMLfilename);//lädt das XML-file 
    
XMLdaten.onLoad = function(success) {
        
datenContainer=new Array();
        if (
success) {
            for (var 
i=0i<XMLdaten.firstChild.childNodes.lengthi++) {
                
datenContainer[['image'],[i]]=XMLdaten.firstChild.childNodes[i].attributes.image;
            }
            
trace(datenContainer[['image'],[0]]); // KLAPPT WUNDERBAR
            
scope.newXMLdata(datenContainer); // RÜCKGABE DES ARRAYS
        
} else {
            
trace('Fehler beim Laden des XML Files');
            return 
false;
        }
    }
}
function 
newXMLdata(XMLarray:Array){
    
XMLdatenContainer=new Array();
    
XMLdatenContainer=XMLarray;
    
trace(XMLdatenContainer[['image'],[0]]);
}
loadXMLdaten("de_content.xml"); 
So sollte es klappen.
Ich frag mich wie dass dann in anderen "Entwicklungsumgebungen" gelöst wird. Da wird man wohl auch kaum etwas einen Wert zuweisen können der noch nicht existiert.
__________________
---::::: AVisioN :::::---
AVisioN ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:06   #7 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 64
??
ist onLoad nicht eine Methode des Objekts XML bzw. der hier vorliegenden Instanz "XMLdaten"?? WTF macht diese Methode damit? Der Array landet im Daten Nirvana, oder??

Gibt es einen eleganten Woraround?? Wie wärs mit der Variante einer neuen Funktion "getXMLArray" die in der success funktion aufgerufen wird und an die der Array übergeben wird??
__________________
-------------------------------------------------
"Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste Mißtrauensvotum gegen den lieben Gott."
Mik3e2 ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:09   #8 (permalink)
°.oO°O.o°.oO.o°O
 
Benutzerbild von bamboocha
 
Registriert seit: Jun 2005
Ort: CH
Beiträge: 1.490
Zitat:
Zitat von Mik3e2
??
ist onLoad nicht eine Methode des Objekts XML bzw. der hier vorliegenden Instanz "XMLdaten"?? WTF macht diese Methode damit? Der Array landet im Daten Nirvana, oder??
Wenn du nix damit machst, ungefähr ja!
Zitat:
Zitat von Mik3e2
Gibt es einen eleganten Woraround?? Wie wärs mit der Variante einer neuen Funktion "getXMLArray" die in der success funktion aufgerufen wird und an die der Array übergeben wird??
Meine Rede:
Zitat:
Zitat von bamboocha
Das einzige was dir übrig bleibt, ist, eine Funktion aufzurufen, die dir das ganze Weitere anstösst...
AVisioN hat da zum Beispiel was schönes zusammengeschneidert (seh ich gerade )

EDIT: Dafür bräuchte es allerdings gar keine Funktion!? Könntest ja auch direkt ne Variable auf scope setzen...!
__________________
There is no way to happiness, happiness is the way! - Buddha

Geändert von bamboocha (21-02-2006 um 15:11 Uhr)
bamboocha ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:11   #9 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 64
@AVisioN: Du warst schneller als ich
Naja, ich arbeite großteils mit PHP5 und teilweise mit Java.. Dort gibt es keine möglichkeit funktionen innerhalb von funktionen zu deklarieren. Somit entsteht dieses Problem eigentlich gar nicht....

Abgesehen davon dürfte Flash hier ein wenig "Pseudo-Multithreading" betreiben. D.h. es wird die funktion ausgeführt ohne das auf einen return Wert gewartet wird. Anders kann ich mir nicht erklären, dass beim trace zuerst "undefined" und anschließend der korrekte Wert (der mit trace in der Funktion ausgegeben wird) angezeigt wird.

Übrigens:
function newXMLdata(XMLarray:Array){
wird nicht funktionieren, da ich noch Flash MX verwende wo eine Typdeklaration in der Parameterliste nicht gültig ist. (Zumindest hab ich das vorhin auch probiert und wurde gleich vom Interpreter böse geschimpft

Ciao,
Mike
__________________
-------------------------------------------------
"Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste Mißtrauensvotum gegen den lieben Gott."
Mik3e2 ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:14   #10 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 64
@bamboocha:
Zu Deinem Edit:
Im Prinzip brauche ich die Funktionen alle gar nicht, ist aber einfach wesentlich übersichtlicher und eleganter als die Spaghetti-Code Variante

Abgesehen davon muss ich mich erst an die ganze Frame und Bühnen Geschichte gewöhnen..
__________________
-------------------------------------------------
"Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste Mißtrauensvotum gegen den lieben Gott."
Mik3e2 ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:22   #11 (permalink)
Custom Title
 
Registriert seit: Aug 2001
Beiträge: 467
Hau die Typisierung raus dann klappts

Zitat:
Dort gibt es keine möglichkeit funktionen innerhalb von funktionen zu deklarieren.
In AS2 würde man auch versuchen das zu verhindern - Aber gerade mit dem XML Object geht das nicht so wirklich elegant. Schöner wäre es wenn man mit einem Listener beim XML Object "lauschen" würde.

Aber auch in Java wartet ein solcher Aufruf nicht zwingend auf einen Rückgabewert. Wenn Du da externe Daten lädst definierst Du halt eine Callback Funktion oä.

Zitat:
Abgesehen davon muss ich mich erst an die ganze Frame und Bühnen Geschichte gewöhnen..
Verständlich - mach Dich doch gleich direkt an AS2 ran. Macht mehr Spass
Aber auch da passt das Klassensystem nicht so ganz zum MovieClip Konzept. Richtig stimmig wirds dann erst mit AS3.
__________________
---::::: AVisioN :::::---
AVisioN ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:31   #12 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 64
Ja, habe leider nur Flash MX und das hat glaub ich nur AS2 oder so... Aber ich kenn mich mit den ganzen Compilern / Interpretern (oder wie das in diesem Fall auch immer heißen mag leider null aus.

Dafür bin ich bei einem neuen Problem gelandet.
Habe die Funktionen jetzt gekickt und bin zum guten alten Spaghetticode ala Basic zurückgekehrt

Dennoch gibt es nach wie vor das selbe Phänomen. Er wartet nicht bis die .onLoad Methode true oder false liefert sonder ruft die Funktion auf unsd spaziert lustig im Quellcode weiter... Eigentlich ziemlicher Horror.

PHP-Code:
stop();
var 
XMLfilename "de_content.xml";
var 
XMLdaten = new XML();//erstellt ein neues XML Objekt
XMLdaten.ignoreWhite=true;
XMLdaten.load(XMLfilename);//lädt das XML-file 
XMLdaten.onLoad = function(success) {
    if (
success) {
        var 
XMLdatenContainer=new Array();
        for (var 
i=0i<XMLdaten.firstChild.childNodes.lengthi++) {
            
XMLdatenContainer[['image'],[i]]=XMLdaten.firstChild.childNodes[i].attributes.image;
            
trace(XMLdatenContainer[['image'],[i]]); // LIEFERT KORREKTE WERTE
        
}
    } else {
        
trace('Fehler beim Laden des XML Files');
    }
}

trace(XMLdatenContainer[['image'],[0]]); // LIEFERT UNDEFINED 
Und zu dem ganze Spass sollte ich auch noch einen Preloader bauen (da die im XML File definierten Images auf einen Movieclip geladen werden sollen). Das kann ja noch heiter werden....

EDIT: Hatte noch ein trace() vergessen in der for-Schleife.. Ändert aber nichts an dem eigentlichen Problem...
__________________
-------------------------------------------------
"Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste Mißtrauensvotum gegen den lieben Gott."

Geändert von Mik3e2 (21-02-2006 um 15:35 Uhr)
Mik3e2 ist offline   Mit Zitat antworten
Alt 21-02-2006, 15:37   #13 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Beiträge: 64
Sorry, war diesmal mein Fehler...
var XMLdatenContainer=new Array();
funktioniert natürlich nicht. Mich macht dieser Misch-Masch aus Prozeduraler und Objektorientierter Programmierung noch wahnsinnig

Danke Euch allen jedenfalls und werde Euch sicher noch öfters quälen,
Ciao,
Mike
__________________
-------------------------------------------------
"Ein Blitzableiter auf einem Kirchturm ist das denkbar stärkste Mißtrauensvotum gegen den lieben Gott."
Mik3e2 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 11:10 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele