[AS3] Dynamisch zusammengesetzte Variablennamen

Skippy

Mitglied
Hallo Forum,

Ich versuche gerade diverse Variablen zu erstellen, die nummeriert sind.
Es handelt sich um eine art Notenrechner, wofür ich z.B. 10 Variablen brauche mit den Namen Fach1 bis Fach10
mein bisheriger Syntax sieht so aus, dass die Variable nun mit einer Schleife und eben der angehängten Laufzahl definiert werden muss, aber ich komm nicht drauf wie, hab jetzt echt ne Stunde rumgegoogelt aber ich weiss nichtmehr nach was ich suchen soll.

So etwas ähnliches hab ich bisher:

Code:
	for (var i = 0;i <= temp1 - 1; i++){
		var ("fach" + i):String = "-";
	}

Also jetzt mal radikal verkürzt, da steckt noch ein Array drin und ein Algorhytmus und so, aber der ist ja nicht wichtig.
Nur wie krieg ich es hin, aus dem Wort "fach" und der zahl "i" eben eine Variable die so heist zu initialisieren?

MfG und danke im voraus! Skippy
 
Zuletzt bearbeitet:
Hallo,

schau hier:
Code:
//hier besser mit einem Array arbeiten in das man die Werte pushed
//über den Index kann man dann darauf zugreifen
var faecher:Array = [];

for (var i = 0; i <= 10; i++) {
	var fach:String = '-';
	faecher.push(fach);
}

trace(faecher.toString()); 	// Alle fächer ausgeben
trace(faecher[0])			// erstes Element


//--
//Dynamische erzeugung von objektvariablen sollte man in AS3 nicht mehr machen (untypisiert)
//dafür gibt es Klassen mit typisierten eigenschaften

for (var j = 0; j <= 10; j++) {
	this['fach'+j] = '-';
}

trace('Fach0:'+this['fach0'])
 
Danke für die Antwort!

Das werde ich morgen testen, im moment habe ich leider keine Zeit mehr dafür und arbeite gerade schon an was anderen, kannst du mir vieleicht noch sagen, warum folgender Befehl nicht funktioniert?

Im Hauptfilm, also oberste Ebene ist folgender Code:
Code:
	function makeFaecherBIG(klick:MouseEvent):void {
	trace("erstelle Fächer BIG");
}

Auf dieser Ebene ist ein MC, genannt Setup, mit dem Code:
Code:
speichern.addEventListener("click", makeFaecherBIG);

In dem Setup MC heist ein Button "speichern"

hab jetzt bei dem zweiten Code versucht vor dem "makeFaecherBIG" ein stage. und root. vorne ran zu stellen, hat aber immernoch die Fehlermeldung angezeigt "undefinierte Eigenschaft" und so.

Aus meinem Buch werde ich irgendwie nicht schlau wann was der Fall ist und wie das zusammen hängt x_X
 
Der Mc kann deine Funktion (Listener) nicht sehen da diese in einem ganz anderen Gültigkeitsbereich liegt.
Verschachtel den Code nicht in unter Mc's sonder schreibe dies auf die HZL:

PHP:
function makeFaecherBIG(klick:MouseEvent):void {
	trace("erstelle Fächer BIG");
}

setup.speichern.addEventListener("click", makeFaecherBIG);


Eine andere Möglichkeit wäre ein Event durch die Displaylist bubblen zu lassen bis es den target erreicht:

HZL:
PHP:
function makeFaecherBIG(klick:Event):void {
    trace("erstelle Fächer BIG");
}


this.addEventListener(setup.MY_EVENT,  makeFaecherBIG);

im setup mc:
PHP:
const MY_EVENT:String = 'myevent';

speichern.addEventListener("click", onClick);  

function onClick(e:MouseEvent):void{
	dispatchEvent(new Event(MY_EVENT, true));
}
 
Zuletzt bearbeitet von einem Moderator:
So, nochmals zu dem Problem dieses Treades.
Das von den letzten 2 Posts wurde ja jetzt in einem anderen Tread erledigt =)

Danke für den Code, hat funktioniert, wobei folgendes gereicht hätte:

Code:
this['fach'+i]

Mir hat praktisch nur der Syntax gefehlt um eben variablennamen zusammen zu setzen =)
Und ob ich das noch mit einem Array mach muss ich mir noch überlegen, aber es wird wohl ein mehrdimensionales werden.
Klassen lohnen sich hier noch nicht meine ich, das brauch ich erst später =D

naja auf jedenfall danke und bis dann ^^

EDIT:
Achja, eine kurze Sache würde mir da noch einfallen, brauche ich zwar jetzt noch nicht, aber evtl. später.

Wie kann ich eine Variable initialisieren, die so heist wie der Inhalt einer anderen Variable?
Also die Variable soll z.B. heisen wurst, und der inhalt von salami ist wurst, wäre dann folgender code richtig?

Code:
var salami:String = "wurst";

this[salami] = "wasAuchImmer";


EDIT:

Hmm... beim weiteren testen haben sich jetzt noch weitere Probleme ergeben, solange ich an denen weiter arbeite, schildere ich hier mein Problem mal genauer:

Ich muss x mal 6 Textfelder erstellen.
Diese Textfelder sind immer gleich aufgebaut ---> Schleife, die x mal durchlaufen wird
Der einzige Haken ist, dass die Textfelder alle verschiedene Namen haben sollten, weil ich nachher auf sie zugreifen muss.
Deshalb auch die Sache mit den dynamischen Variablennamen.
Vieleicht könnte es reichen, bei jedem Textfeld nur den Instanznamen zu ändern, dann gäbe es aber wieder beim zugreifen von dessen Text ein Problem, den deine Lösung hat ja das Child angesproche, dass wäre ja was anderes, oder?

Also wie setze ich das jetzt am besten um? Ne Idee?

EDIT:

Ohje, ich merke schon das sammelt sich...
Also nach etwas rumhantieren klappt das bis zu dem Punkt, dass der Button wieder meint:
Code:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
	at main_fla::MainTimeline/makeFaecherBIG()

Hier mal noch der rest vom Code:

Code:
firstButton.addEventListener("click", makeFaecher);

function makeFaecher(klick:MouseEvent):void {
	
	var fach:int;
	for(var i = 0; i < anzahlFaecher.text;i++){
	//var fach1:faecher = new faecher();
	
		//// Name des Fachs
		this['name'+i] = new TextField();
		var inhaltTemp:String = "-";
		
		this['name'+i].text = inhaltTemp;
		this['name'+i].x = -255;
		this['name'+i].y = -128 + (50*i);
		this['name'+i].width = 100;
		this['name'+i].height = 21;
		this['name'+i].background = true;
		this['name'+i].type = TextFieldType.INPUT;
		this['name'+i].name = this['name'+i];
				
		this['name'+i].setTextFormat(format);
		addChild(this['name'+i]);

Und in der Hauptzeitleiste immernoch:

Code:
function makeFaecherBIG(klick2:MouseEvent):void {
	
	trace(TextField(setupWindow.getChildByName('name1')).text);
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück