Adressierungsproblem mit dyn. erzeugten Komponenten

DJTrancelight

Erfahrenes Mitglied
Hallo zusammen,

habe eine kleine Adressierungsfrage und konnte hier im Forum und unter Google leider keine Lösung finden.

Über eine For-Schleife lasse ich Flash MX RadioButton-Kompenenten auf die Bühne erzeugen. Jetzt bekomme ich es leider nicht hin, diese anzusprechen, so dass diese auf eine Funktion reagieren:

PHP:
.....
var rb_ypos = 100;
var sortanzahl_liste = 3;
for(i = 0; i < sortanzahl_liste; i++){
	_root.attachMovie("FRadioButtonSymbol", ["radio"+i], i);
	_root["radio"+i].setLabel(["Beschriftung"+i]);
            _root["radio"+i]._y = rb_ypos; 
            rb_ypos += 20;
}

So, das funktioniert alles (RB-Buttons werden auf die Bühne gebracht), leider reagieren die RBs nicht, wenn sie aktiviert werden.


hab schon alles versucht:

PHP:
_level0.radio0.onPress = function(){
	trace("RB-1 wurde gedrückt")
}

_level0.radio1.onPress = function(){
	trace("RB-2 wurde gedrückt")

....
}


auch mit _root, hat es nicht geklappt. Im Test-Modus (STRG+Enter) habe ich mir die Objekte anzeigen lassen und da hat mir das Ausgabefenster die Adressierung

Movieclip: Bild=1 Ziel="_level0.radio0.frb_states_mc.frb_frame_mc.shadow_mc" Bezeichnung="Symbol_23"

Movieclip: Bild=1 Ziel="_level0.radio1.frb_states_mc.frb_frame_mc.shadow_mc"

Movieclip: Bild=1 Ziel="_level0.radio2.frb_states_mc.frb_frame_mc.shadow_mc"
bescheinigt.

Also so ganz steig ich mit den RadiobuttonKomponenten nicht durch. Wenn jmd. ne tolle Quellangabe zum Nachlesen hat, würde ich mich freuen. Die Flash-Hilfe hat mich nicht weitergebracht.

Letztendlich sollte das so funktionieren, wenn auf einen Radiobutton geklickt wird, soll eine Funktion ausgeführt werden.

PS: Eine RadioButtonKomponente befindet sich schon in der Bibliothek.

Vielen Dank für eure Hilfe
 
Hi,

ist aus dem Stehgreif schlecht zu sagen. Am besten wäre es, Du würdest Deine .fla einmal posten.

Fürs erste:
  • wo weist Du den Buttons ihre Mausereignisse zu - ich hoffe doch, nach dem Instanzieren. ;)

  • schon mal probiert, den Rückgabewert der attachMovie-Methode zu verwenden, um dem Ding dann sein Ereignis zuzuweisen?
Code:
var foo = bar.attachMovie("batz", "foo", x);
foo.onPress = function() {
  fooBar();
}
  • Handelt es sich um 6er, 7er, 8er oder 9er Komponenten? Ab Komponenten der Version 7 werden Ereignislistener anders zugewiesen.

  • Geht "onPress" etc. überhaupt sinnvoll auf Komponenten? Müsste das nicht eher ein "click"-Ereignis (Listener) sein?

Gruß
.
 
Hallo:)

Es handelt sich wie oben beschrieben um Flash MX (Version 6) Komponenten.

Ja, eigentlich müßte es mit onPress gehen. Habe das jedenfalls auch schon einmal so gesehen.

Hmmm, vielleicht liegt es auch am XML-Dokument.

Wäre toll, wenn du mal einen Blick darauf werfen könntest:

Und wie könnte ich diesen Bereich dynamischer machen, so dass ich nicht manuell die onPress-Events eintragen muss?

PHP:
_root.radio0.onPress = function(){
	datenAusgeben(0);
	trace("rb0")
}

_root.radio1.onPress = function(){
	datenAusgeben(1);
	trace("rb1")
}

_root.radio2.onPress = function(){
	datenAusgeben(2);
	trace("rb2")
}

Sprich die Zahl hinter radio und die Übergabezahl in der Funktion datenAusgeben( ) sind immer gleich.

Vielen lieben Dank schon mal!
 

Anhänge

  • liste_test.zip
    101,9 KB · Aufrufe: 11
Zuletzt bearbeitet:
Hi,

wie ich vermutet hatte, weist Du den Radiobuttons ihre onPress-Events zu, bevor sie überhaupt existieren: Der Code auf der Hauptzeitleiste wird natürlich sofort ausgeführt, das Laden der XML-Datei dauert aber immer mindestens ein paar Millisekunden, so dass die Funktion "xmlListeAuslesen" erst ausgeführt wird, wenn Deine Events schon (an nicht existierende Buttons) zugewiesen sind.

Lösung: Weise direkt nach dem Erstellen (also in der Funktion "xmlListeAuslesen") jedem Button seine Indexnummer und eine entsprechende onPress-Methode zu:
Code:
		_root.attachMovie("FRadioButtonSymbol", ["radio"+i], i);
		_root["radio"+i]._x = rb_xpos;
		_root["radio"+i]._y = rb_ypos;
		_root["radio"+i].idx = i;
		_root["radio"+i].onPress = function() {
			datenAusgeben(this.idx);
			trace(this.idx);
		}

Gruß
.
 
Absolut genial Tobias! Vielen lieben Dank.
Ich habe nicht gewußt, dass Flash nicht auf die XML-Daten "wartet" - jetzt weiß ich es :)

Habs verstanden und hast du auch super erklärt mit der ID-Zuweisung.

DANKE

Schöne Grüße
DJ Trancelight
 
Ich habe nicht gewußt, dass Flash nicht auf die XML-Daten "wartet"
Glücklicherweise ist das nicht so. Stell Dir vor, Du lädst eine größere Datei (oder rufst ein Script auf), die Verbindung ist aber langsam (z.B. 56k) oder kommt nicht gleich zustande - wenn dann der gesamte Flashfilm so lange "eingefrohren" wäre, wäre das in vielen Fällen recht unschön (übrigens: Preloader wären dann auch nicht möglich). ;)

Diese Art der Datenanforderung nennt man "asynchron" (vgl. AJAX, das ist das selbe Prinzip)

Gruß
.
 
Toll, vielen Dank für die Erläuterung!
Und deshalb ist auch der onLoad()-Befehl bei XML wichtig. Ich habe das nie verstanden, warum dieser Befehl eingesetzt werden muss.

Zur generellen Wissenserweiterung::D
Hab ich das richtig verstanden, dass Flash bei den Variablen und Funktionen wie folgt vorgeht:

Bsp: stop()-Befehl auf Bild 1

Flash geht bei allen Ebenen in der Zeitleiste das Bild 1 durch und die gefundenen Variablen und Funktionen stehen zur Verfügung.

Soll bedeuten, wenn ich z.B. eine Button-Instanz auf der Bühne mit

PHP:
_root.btnName.onPress = function(){
     ausgabe();
}
im 1. Bild anspreche, jedoch die Funktion ausgabe () erst weiter unten im Code steht, gibt es ja keine Fehlermeldung.

PHP:
function ausgabe(){
trace("Funktion Ausgabe aufgerufen")
}

Würde jedoch die Funktion ausgabe () in Bild 2 stehen (das noch nicht abgespielt wurde), dann würde es nicht klappen. Also Flash geht alle Ebenen und Schlüßelbilder bis zum nächsten Stop-Befehl durch. Alles was Flash bis dahin gefunden hat, steht zur Verfügung. Dabei spielt die Reihenfolge keine Rolle:

Soll heißen, es macht keinen Unterschied, ob ich das Skript so:

PHP:
_root.btnName.onPress = function(){
     ausgabe();
}

function ausgabe(){
trace("Funktion Ausgabe aufgerufen")
}

oder so

PHP:
function ausgabe(){
trace("Funktion Ausgabe aufgerufen")
}

_root.btnName.onPress = function(){
     ausgabe();
}


zusammensetze, sofern sich beide Funktionen und Aktionen im gleichen Bild befinden bzw. die function ausgabe () in einem früheren Bild vor dem onPress-Befehl steht.

Wichtig ist nur, dass Instanzen auf der Bühne instanziert sind, bevor darauf zugegriffen werden kann. Und da XML auch ein Objekt ist und ich davon eine Instanz genommen habe, leuchtet mir das ein.:)
So, und nun darf der Rotstift an den Stellen geschwungen werden, wo ich falsch der Annahme bin. Denn das Thema wurde bis jetzt in keinem meiner durchgelesenen Bücher auch nur annähernd erwähnt.

Viele Grüße und Danke!
DJ Trancelight
 
Zuletzt bearbeitet:
Hi,

so wie Du es beschrieben hast, stimmt es in etwa. Wenn Du allerdings in Frame 1 eine Funktion deklarierst, dann zu Frame 2 springst, kannst Du die Funktion dort aufrufen (Flash "vergisst" den Code aus vorherigen Frames also nicht).

So etwas:
Code:
button.onPress = function() {
  machWas();
}

function machWas() {
  trace("Hallo");
}
funktioniert schon deshalb, weil das onPress-Ereignis tatsächlich erst beim Klick aufgerufen wird, und nicht sofort beim Parsen des Codes.

Allerdings klappt auch das:
Code:
machWas();

function machWas() {
  trace("Hallo");
}
da der Code in einem Frame erst geparst wird, und dann Funktionen ausgeführt werden.

Noch ein Tipp am Rande: Code in MovieClips wird erst geparst, wenn der Code auf der übergeordneten Zeitleiste komplett abgearbeitet ist. Stell Dir vor, Du hast einen MovieClip "mc", auf dessen Zeitleiste die Funktion "machWas" deklariert ist. Folgendes klappt dann nicht:
Code:
var mc = this.attachMovie("mc", "mc", 1);

mc.machWas();
Wenn Du Funktionen in frisch instanzierten Clips aufrufen willst (gilt übrigens auch für MCs in einem grade angesteuerten Schlüsselbild), musst Du mindestens einen Frameaufruf warten:
Code:
var mc = this.attachMovie("mc", "mc", 1);

this.onEnterFrame = function() { // einen Frame warten
  delete this.onEnterFrame;
  mc.machWas(); // klappt!
}

Gruß
.
 
Tobias das hast du super toll erklärt. Wenn mein Drucker wieder funktioniert werde ich mir diesen Teil für meine Unterlagen ausdrucken. Hab jetzt durch diesen Thread total viel gelernt!

Ich habe mich auch immer gefragt, wie Flash mit dem parsen vorgeht - jetzt weiß ichs.

Wäre das vielleicht mal wert in einem Tutorial "Die Architektur von Flash" mit aufzunehmen? Das könnte vielleicht auch noch andere User hier interessieren:)

Jedenfalls vielen vielen Dank für deine Hilfe!

Schöne Grüße
DJ Trancelight
 
Hi,

ich spiele mit dem Gedanken, bei Gelegenheit eine kleine Sammlung "Tipps und Trick für AS-Einsteiger" aufzustellen, die auf meinen Erfahrungen basiert. Im Moment fehlt mir allerdings leider ein wenig die Zeit dazu. ;)

Gruß
.
 
Zurück