LoadVars.onLoad in for-schleife wird erst nach Schleife abgearbeitet?

Lloyd

Erfahrenes Mitglied
Hi.
Ich möchte aus einer Datei Variablen einlesen und in einem assoziativen array speichern.
Der Code dazu:
PHP:
for(var i=1; i<10; i++){
	gastvars.load("load_test.txt"); 
	m=0;
	gastvars.onLoad = function() { 
		
		gast_array[m] = {name: gastvars.name            			
        				};
                  name+"m" = gast_array[m].name;  //ausgabe in Textfeld name0..1..2...
                  m++;
		}
	}
Nun hatte ich erst das Problem, dass eine Variable (ausserhalb) nur innerhalb einer function existiert, wenn sie übergeben wird, richtig? Und wie sollte ich auch die Laufvariable i der function übergeben?
Komischerweise trifft das hier nicht zu, wie ich bemerkte. Da die function erst nach
der for-schleife abgearbeitet wird. Wieso? Weil das Laden langsamer ist?
Kann man onLoad nicht als Trigger umschreiben, der die Abarbeitung anhält bis er ausgelöst wird?
Insgesamt finde ich das eine unsaubere Programmierweise, da das funktionieren von der Zeit abhängt, die man zum laden der Datei benötigt.
Hat jemand andere Vorschläge?
Danke.

Ich habe noch ein Problem das den Code betrifft, aber dafür ein neues Thema: "onLoad =function() Verstehe Schreibweise nicht" aufgemacht.
 
Zuletzt bearbeitet:
Hi,

zunächst mal: das ist nicht unsauber, sondern vom Objekt her gedacht das einzig sinnvolle.
Zu deinem Problem: Warum lädst du zehnmal dieselbe Datei, und das auch noch aus einer Schleife in immerdasselbe Objekt hinein ? Du überschreibst ja neunmal dasselbe Objekt mit demselben Inhalt. Und überschreibst den EINEN möglichen onLoad Handler des LoadVars Objektes 'gastvars' auch gleich neunmal.
Das macht überhaupt keinen Sinn. Auch die Ausgabe in die Textfelder ist syntaktisch vollkommen falsch. Und die Definition des assoziativen Arrays auch.

Hier für 10 Variablen mit Namen Extern0 - Extern9 aus Datei ExterneDaten.txt
PHP:
    gastvars = new LoadVars ();
    gastvars.load("ExterneDaten.txt"); 
    gastvars.onLoad = function() { 
        gast_array = new Array();
        for (i=0, i<=9; i++){
        Daten = eval ("gastvars.Extern"+ i);
        gast_array.push = {ExVar: Daten}; 
        Ausgabe = eval("name"+ i);
        Ausgabe.text =  gast_array[i].ExVar; 
        }
 }

Dafür brauchst du aber immer noch kein assoziatives Array, ein ganz normales würde auch reichen....

Grüsse
B
 
Ok, also was ich umsetzen möchte ist ein Gästebuch, dass gleichzeitig 10 Eintrage anzeigt. Das was ich gepostet hab ist eigentlich nur Code zum testen, obs funktioniert.
Eigentlich liest eine php-Datei immer einen Eintrag aus der Datenbank, dies wird in Flash eingelesen. Dann habe ich viele Variablen unteranderem Name und No (nr. des Eintrages).
Aber ich muss dies 10mal hintereinander tun damit ich 10 Einträge in Flash zur verfügung habe. Die for-Schleife dient dazu das zu realisieren. (No, wird dabei noch erhöht und an die php-Datei gegeben.)
Einen assoziativen Array habe ich gewählt, um ihn mit gast_array[1].name ansprechen zu können.
Der Code ist von Matthias Kannengiesser geklaut:
http://www.tutorials.de/tutorials25318.html&highlight=assoziativ+array
Und funktioniert auch.
Dann gibt es noch 10 dynamische Textfelder, die keinen Instanzennamen besitzen, sondern nur eine Variable einlesen (namem, m=0..10).
Was nicht funktioniert, da hast du recht, ist das name+"m".
Hast du dafür noch eine Idee?
Ansonsten wenn ich statt name+"m" name0 schreiben funktioniert der ganze Code den ich gepostet hab.
Ich hab wahrscheinlich zu blöden Code gepostet. Sorry, das war verwirrend.
Jetzt wirst du wahrscheinlich mein Anliegen verstehen.
 
Zuletzt bearbeitet:
Hi,
bei Textfeldern nimm statt Variablen lieber die Zuweisung über die Eigenschaft .text der Textfelder, wie oben im Beispiel, anders geht es auch, verursacht aber tendenziell mehr Probleme.
Das nacheinander auslesen von 10 Datenbankreihen lässt du lieber mal vom PHP Script erledigen - einfach da eine Schleife machen und 10 Variablen auf einmal ausgeben....ist besser, glaub mir...

Grüsse
B
 
hmpf. Ok das mit dem Textfeld is nen guter Tip, die Variable brauch ich zwar trotzdem, also wäre es ein Aufwasch. Und ich möchte ja nicht nur Probleme lösen, sondern auch Flash besser können, mich interessierts also immer noch wie man in eine dynamisch erzeugte Variable übergibt. Vielleicht hast du Lust mirs noch zu schreiben.
Aber ich bin dankbar für deinen Erfahrungswert.
Leider kenn ich mich mit php nicht so gut aus und müsste das dann neu Coden.
Wäre schon schön wenn das Flash macht. Klar von der Performance ist es schon besser einen anstatt 10 Datenbankzugriffe zu machen.
Ansonsten bleibt ausserdem nur noch die Frage, wieso die Variable m (siehe oben) innerhalb der function existieren kann.?
 
Hi,

Im Flash Objektmodell sind Variablen genauso Teil der Hierarchie wie MC´s und andere Objekte, wenn du also eine Variable nicht mit dem Schlüsselwort 'var' temporär und lokal begrenzt definierst, dann stehen sie auch in der selben Ebene ohne weiteres zur Verfügung:
PHP:
i = 100;
shit = function ()
{
	trace (i);
	i++;
	trace (i);
};
shit ();
Kompliziert, ob mit oder ohne 'var' wird das ganze sowieso erst bei verschachtelten Flash Konstruktionen, also dann, wenn du mehrere Zeitleisten ineinander hast. Dann kommt es nämlich auf die korrekten Pfade an.

mich interessierts also immer noch wie man in eine dynamisch erzeugte Variable übergibt

.. den Satz musst du mir noch einmal erklären - wer übergiebt was in eine wo und warum dynamisch erzeugte Variable ?

Wenn du mit Flash und Datenbankanbindung arbeiten möchtest, wirst du kaum um ein bisschen PHP herumkommen - es ist wirklich schlichter Unsinn 10 Datenbankanfragen zu starten - stell dir nur einmal vor, was passiert, wenn mal jemand aus Spass 10mal auf den Button drückt.
Wenn es aber unbedingt sein muss, dann musst du schon den korrekten Aufruf hier posten, und nicht deine 'load_test.txt' als Dummy im Code stehen haben - an dieser Stelle kann man die Datenbankanfrage nämlich dynamisieren, und das nur dort. Aber auf gar keinen Fall innerhalb einer Schleife...

Grüsse
B
 
schön, wieder was gelernt, mit lokaler und globaler variable.
Wobei wir irgendwie bei dem anderen Threat wären, den ich auch noch gepostet hab,
na vielleicht nehm ich die diskussion nochmal auf ;)

Was ich mit dynamisch erzeugter Variable meine:
Innerhalb einer Schleife eine Variable erzeugen, die anhand der Laufvariablen benannt wird. Halt so in der art: (bezieht sich auf Code der als erstes gepostet wurde)
PHP:
for (m=0;m<=9;m++) {
name+"m" = gast_array[m].name; //was natürlich nicht funktioniert
}
//das funktioniert, aber ist nicht dynamisch:
name0 = gast_array[m].name;
Am ende möchte ich die Variablen name0, name1, name2, ...bis...name9 haben, die alle mit einem Wert aus dem Array belegt sind. Ich brauch da nur noch die korrekte Syntax.

Zum Laden aus PHP-Datei:
Ich muss dir schon recht geben, es ist sehr unschön mit dem 10maligen Aufruf der PHP.
Ich versuchs mal mit PHP (*angst*).
Aber rein interessehalber, du meinst an der Stelle wo der dummy load_test.txt steht, könnte man ein Laden dynamisieren. Wie?
Normalerweise würde an der Stelle nicht viel mehr stehen:
PHP:
gastvars.sendAndLoad("load.php3",gastvars,"GET");
Also wie meinst du könnte man das ohne Schleife machen. Ich weiss noch nicht recht wa du meinst.
 
Hi,

mal eben bevor ich weg muss zu Deiner ersten Frage:
PHP:
for (m=0;m<=9;m++) {
    this["name" +m] = gast_array[m].name; // DAS funktioniert schon! ;)
}

Gruß
.
 
Vielen danke sehr.
Es funktioniert. Ich wollte eine globale Variable erzeugen, also hab ich einfach
PHP:
for (m=0;m<=9;m++) { 
    _root["name" +m] = gast_array[m].name; // DAS funktioniert schon! ;) 
}
geschrieben. Denn diese Schleife steht ja innerhalb einer function.

Mich würde noch interessieren was das Konstrukt _root["name" +m] denn ist und wie man diese Konvertierung nennt. Damit ich nachlesen kann um es weiterhin anwenden zu können. Sieht ja auch wie ein Array, ist aber laut Variablen Debugger eine normale Variable.
 
Hi,

es handelt sich um den Objektzugriffsoperator:
Flashhilfe hat gesagt.:
Punkt- und Array-Zugriffsoperatoren
Der Punkt-Operator (.) und der Array-Zugriffsoperator ([]) dienen dazu, auf die integrierten oder benutzerdefinierten Eigenschaften eines ActionScript-Objekts, einschließlich der Eigenschaften eines Movieclips, zuzugreifen.

Der Punkt-Operator steht zwischen dem Namen eines Objekts auf der linken und dem Namen einer Eigenschaft oder einer Variablen auf der rechten Seite. Bei dem Eigenschaften- oder Variablennamen darf es sich weder um einen String noch um eine Variable handeln, die zu einem String ausgewertet wird. Als Namen sind in diesem Fall nur Bezeichner zulässig. In den folgenden Beispielen wird der Punkt-Operator verwendet:

year.month = "June";
year.month.day = 9;

Der Punkt-Operator und der Array-Zugriffsoperator erfüllen dieselbe Funktion. Der Unterschied zwischen ihnen besteht darin, dass der Punkt-Operator als Eigenschaft einen Bezeichner erhält, während der Array-Zugriffsoperator seinen Inhalt zu einem Namen auswertet und auf den Wert dieser benannten Eigenschaft zugreift. Die beiden folgenden Ausdrücke beispielsweise greifen auf dieselbe Variable velocity im Movieclip rocket zu:

rocket.velocity;
rocket["velocity"];

Mit dem Array-Zugriffsoperator können Instanznamen und Variablen dynamisch eingestellt und abgerufen werden. Im folgenden Codebeispiel wird der vom Array-Zugriffsoperator ([]) umschlossene Ausdruck ausgewertet und der Ergebniswert als Name der Variablen verwendet, deren Wert aus dem Movieclip name abgerufen werden soll:

name["mc" + i]

Sie können zu diesem Zweck auch die im folgenden Beispiel dargestellte Funktion eval() verwenden:

eval("mc" + i)

Gruß

EDIT @B.: :p
.
 
Zurück