Funktionsaufruf klappt nicht richtig

Denniz

Erfahrenes Mitglied
Hi Leute,

ich habe ein Problem mit dem Funktionsaufruf für eine Navi.
Die Navileiste soll dynamisch plaziert werden, danach soll sich nach anklicken eines Menupunktes die Textfarbe ändern.
Es läßt sich aber kein Menüpunkt auswählen.
Code:
stop();
var mc_array = new Array();
mc_array[0] = this.navi_mc.mc1;
mc_array[1] = this.navi_mc.mc2;
mc_array[2] = this.navi_mc.mc3;
mc_array[3] = this.navi_mc.mc4;
mc_array[4] = this.navi_mc.mc5;
function showMenu() {
	var navi_mc = this.attachMovie("navi", "navi_mc", this.getNextHighestDepth());
	changeColor();
}
function changeColor(target_mc) {
	for (i=0; i<mc_array.length; i++) {
		if (target_mc) {
			mc_array[i].text.textColor = "0x000000";
			target_mc.text.textColor = "0xff0000";
		} else {
			mc_array[i].onRelease = function() {
				changeColor(this);
			};
		}
	}
}
showMenu();
Das Skript funktioniert wenn ich showMenu() auskommentiere und
Code:
var navi_mc = this.attachMovie("navi", "navi_mc", this.getNextHighestDepth());
	changeColor();
ins Skript schreibe.
Warum funktioniert es aber nicht wenn ich es in die Funktion schreibe?
Hier hab ich es hochgeladen.

Beste Grüße
 
Hi,

1.
Code:
function showMenu() {
	var navi_mc = sonstwas;
}
Wird eine Variable innerhalb einer Funktion mit dem Schlüsselwort "var" deklariert, so handelt es sich um eine lokale Variable, die nur innerhalb dieser Funktion bekannt und gültig ist.

Brauchst Du die Variable "navi_mc" noch an anderer Stelle, so lege sie als Zeitleistenvariable (ausserhalb der Funktion) an:
Code:
var navi_mc = null;

function showMenu() {
	navi_mc = this.attachMovie("navi", "navi_mc", this.getNextHighestDepth());
	changeColor();
}

2. Die Funktion "changeColor" erwartet bei Dir einen Parameter (target_mc), der innerhalb der Funktion auch verwendet wird. Du übergibst der Funktion allerdings keinen Parameter:
Code:
changeColor(); // wo ist der Parameter?
Daher dürfte "target_mc" innerhalb der Funktion "changeColor" immer undefined sein.

3. Ich vermute, Du willst der Funktion "changeColor" die Referenz auf "navi_mc" mitgeben, die Du in der Funktion "showMenu" erstellst. Dann wäre der Code so korrekt:
Code:
function showMenu() {
	var navi_mc = this.attachMovie("navi", "navi_mc", this.getNextHighestDepth()); // kann lokale Variable bleiben, denn ...
	changeColor(navi_mc); // .. sie wird hier weitergegeben
}

Gruß
.
 
Hallo Tobias,

an die lokale Variable hab ich jetzt nicht gedacht.
Hab dein Vorschlag getestet aber es klappt leider auch nicht.
Es läßt sich weiterhin kein Menüpunk auswählen.

Code:
changeColor();
gebe ich keine Parameter am Anfang mit weil der Parameter gibt den Verweis zu der Instanz an die dann die andere Schriftfarbe haben soll. Am Anfang soll aber kein Link eine andere Farbe haben.
Ok, könnte demnach also auch changeColor(null); schreiben.
Ich verstehe allerdings nicht wieso es funktioniert wenn ich showMenu() auskommentiere und
Code:
navi_mc = this.attachMovie("navi", "navi_mc", this.getNextHighestDepth());
	changeColor(null);
außerhalb der Funktion schreibe.
Dann lassen sich alle Buttons betätigen.
Ich brauche aber den Funktionsaufruf showMenu() um die Navi in den gesamten Film einzubauen.

Vielleicht hast du ja noch eine Idee?
 
Hi,

jetzt habe ich endlich verstanden, wo das Problem liegt (wer lesen kann, ist klar im Vorteil ;)). Ich nehme an, Du meinst folgendes:
Code:
stop();
var mc_array = new Array();

function showMenu() {
	var navi_mc = this.attachMovie("navi", "navi_mc", this.getNextHighestDepth());
	mc_array[0] = this.navi_mc.mc1;
	mc_array[1] = this.navi_mc.mc2;
	mc_array[2] = this.navi_mc.mc3;
	mc_array[3] = this.navi_mc.mc4;
	mc_array[4] = this.navi_mc.mc5;
	changeColor();
}

function changeColor(target_mc) {
	for (i=0; i<mc_array.length; i++) {
		if (target_mc) {
			mc_array[i].text.textColor = "0x000000";
			target_mc.text.textColor = "0xff0000";
		} else {
			mc_array[i].onRelease = function() {
				changeColor(this);
			}
		}
	}
}

showMenu();
Du kannst die Inhalte des navi_mc nicht in ein Array schreiben, bevor Du diesen MC überhaupt instanzierst - lege den entsprechenden Codeblock daher in die Funktion "showMenu" nach der Instanzierung.

Gruß
.
 
Ist eigentlich recht einfach zu merken: Es wäre so, als würdest Du Deine Einkäufe in den Kühlschrank legen wollen, bevor Du zum Supermarkt gehst. ;)

Du bist wahrscheinlich davon ausgegangen, dass zunächst eine Referenz auf ein bis dato unbekanntes Objekt in das Array geschrieben wird, welche später (nach der Instanzierung) auf die richtige Instanz zeigt. Der Denkfehler liegt hier: "this.navi_mc" ist zum Zeitpunkt der Array-Zuweisung "undefined", daher wird keine Referenz, sondern ein Wert (undefined) in das Array geschrieben. Wird in dem Bezeichner "navi_mc" dann später eine gültige Referenz abgelegt, bekommt Dein Array nichts davon mit.

Gruß
.
 
Zurück