Flash CS4 - AS3 - Wie kann man auf dynamisch erzeugten MC mit Textfeld zugreifen?

kalterjava

Erfahrenes Mitglied
Hallo zusammen.

Mein Problem ist oben geschildert. Ich möchte mir eine horiz. Navigation bauen deren Inhalte aus einer XML kommen. Es klappt alles, jedoch möchte ich diese in der Funktionalität erweitern. Ich habe für die MouseEvents Hover, Click Textformate und Events geschrieben. Jetzt möchte ich jedoch gerne etwas hinzufügen und zwar einen Status, wenn der MC (Button) angeklickt wurde, dass er das selbe Textformat wie unter Hover zugewiesen bekommt und man somit weiß, auf welcher Seite man sich befindet (In CSS wird ja dafür meist "active" eingesetzt). Jedoch kann ich auf die dyn. erzeugten MCs nicht zugreifen. _root geht ja bei AS 3 nicht mehr, und Stage leider auch nicht.
Fehler " Auf Nullobjekt kann nicht zugegriffen werden ..." Klar, denke das liegt daran, dass beim Aufruf ausserhalb der Funktion die MCs noch nicht auf der Bühne sind.

Die MCs haben die Namensbezeichnung als String von der XML bekommen, diese wurden in einem globalen Array beschriftungArray[] gespeichert. Ich bräuchte jetzt also eine Umwandlung Array zu MovieClip oder so etwas.

Ich habe den umfangreichen Code aufs Wesentliche hier gekürzt.

Wäre toll, wenn jmd. einen Tipp hätte. Hab das bei AS3 noch nicht so sehr verstanden, wie man auf dynamisch erzeugte Objekte zugreifen kann und wie man dynamisch erzeugten Objekten noch Variablen zuweist.

PHP:
import flash.text.TextField;
import flash.text.TextFormat;
function horizNavi(beschriftungXML:String,…..):void{
//MC Festlegung
   var mein_mc:MovieClip = new MovieClip();
   mein_mc.name =  beschriftungXML as String;
//Textfeld Festlegung   
   var meinTextfeld_tf:TextField = new TextField();
   meinTextfeld_tf.autoSize = TextFieldAutoSize.LEFT;
   meinTextfeld_tf.text = beschriftungXML;
   mein_mc.buttonMode = true;
   mein_mc.mouseChildren = false;
   this.stage.addChild(mein_mc);
 …
}//end function horizNavi


in der XML-Loader Sequenz steht:
var beschriftungArray:Array = []; //Globale Variable
in einer For-Schleife werden die einzelnen Werte aus der XML gespeichert
beschriftungArray[i] = mein_XML.knoten[i].beschriftung.text();

//Funktionsaufruf   

horizNavi(beschriftungArray[k],….);

Ich würde jetzt z.B. gerne überprüfen, ob der MC mit der Beschriftung "Home" (kommt aus der XML-Datei) angeklickt wurde.

Also so in der Art
PHP:
var status:Boolean = false;

if(mein_mc.name == "Home" && status = true){
meinTextfeld_tf.setTextFormat(meinTextformatAngeklickt);
}
else{
meinTextfeld_tf.setTextFormat(meinTextformatStandard);
}

Danke im Voraus für eure Hilfe.

vg vom
kaltenjava
 
Hallo!
Ich bin mit nicht sicher, ob man einfach per .name so den Namen ändern kann. Meiner Meinung nach ist es in AS3 stets besser in solchen Fällen die MCs in ein Array zu speichern, also z.B. parallel zu deinem Beschriftungs-Array noch ein MCArray, etwa so:

Code:
var movieclipArray = new Array();
var beschriftungsArray = new Array();

// in einer For-Schleife werden die einzelnen Werte aus der XML gespeichert
// beschriftungArray[i] = mein_XML.knoten[i].beschriftung.text();

function horizNavi(k):void
{
	//MC Festlegung
	movieclipArray[k] = new MovieClip();
	movieclipArray[k].nummer = k;// wir haben hier immer zugriff auf beschriftungsArray[k]
	// textfeld usw
	
	movieclipArray[k].buttonMode = true;
	movieclipArray[k].mouseChildren = false;
	this.stage.addChild(movieclipArray[k]);

}
//end function horizNavi;

//Funktionsaufruf   

horizNavi(k);

Du verbindest in deinem Code übrigens in keinster Weise das Textfeld und den Movieclip, da scheinen entsprechende (wichtige) Teile des Codes hier zu fehlen. Deswegen habe ich das Textfeld außen vor gelassen, eventuell kannst du ja entsprechende Codeteile nachreichen.

Wofür sind die "& # 8 2 3 0 ; . ." ?

In der if-Abfrage muss "status == true" stehen, nicht einfach nur =.

Generell würde ich gern mal den ganzen Code sehen, vor allem wo was wie aufgerufen wird. Ein "Nullverweis" heißt meistens, dass eine Variable von der Funktion aus nicht gefunden wird. Dein "meinMC" und "meinTextfeld" sind beides lokale Variablen der Funktion horizNavi, von außen ist da wenig mit drauf zugreifen.
 
Zuletzt bearbeitet:
Hi Jens,

ich bedanke mich schon einmal bei dir. Kann es frühestens nächste Woche wieder testen und melde mich dann.
Wofür sind die "& # 8 2 3 0 ; . ." ?
Gute Frage! Das ist beim Kopieren wohl falsch interpretiert worden. Hab da da Punkte geschrieben, also für weitere Argumente in der Funktion. Aber es ist hier im Forum auch so, dass man z.B. keine 3 Ausrufezeichen schreiben darf, die werden ja auch umgewandelt : )
Ein "Nullverweis" heißt meistens, dass eine Variable von der Funktion aus nicht gefunden wird. Dein "meinMC" und "meinTextfeld" sind beides lokale Variablen der Funktion horizNavi, von außen ist da wenig mit drauf zugreifen.
Ich denke, dass es am xml-Loader liegt. Wenn ich auf einen dynamischen mc aus der XML zugreifen möchte, wird dieser wohl noch nicht auf der Bühne sein, so dass hierdurch der Nullverweis entsteht.

Ich würde dir, wenn ich gescheitert bin eine PN mit DL zum Projekt schicken.

Danke sehr

EDIT: Herzlichen Dank Jens! Musste das Problem nach hinten verschieben und konnte mich erst jetzt wieder darum kümmern. Ich habe es mit dem Array umgesetzt und jetzt kann ich über mc_Array[0] z.B. auf den MovieClip zugreifen - super!. Jetzt mach ich mich an das nächste Problem und versuch es so hinzubekommen, dass man über einen Namen und nicht über die Nummer darauf zugreifen kann. Also z.B. mc_Array['Home'].x = 150; Mal sehen ob ich das hinbekomme. Nochmals besten Dank!
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück