Fehler in der Schleife

ClaudiaGlade

Mitglied
Hallo ich hab mal wieder eine Frage...
Und zwar habe ich jetzt die erste Version meiner Homepage fertig (so gut wie alles mit Flash gemacht). Hab jetzt aber festgestellt das das alles ziemlich redundant ist und dadurch auch viel zu viel Script....
Jetzt hab ich angefangen das alles ein bisschen "schöner" zu machen und wollte eine einfache for-Schleife einbinden, die funktioniert aber leider nicht so wie ich mir das vorstelle....
(Der Code liegt auf verschiedenen Buttons, je nachdem über welchen Button mit der Maus gezogen wird erscheint eine andere Leiste)

Code vorher:
Code:
on(rollOver){
	//Leiste sichtbar/unsichtbar schalten
	_root.leiste_1._visible=true;
	_root.leiste_2._visible=false;
	_root.leiste_3._visible=false;
	_root.leiste_4._visible=false;
	_root.leiste_5._visible=false;
	_root.leiste_6._visible=false;
	_root.leiste_11._visible=false;
	_root.leiste_7._visible=false;
	_root.leiste_8._visible=false;
	_root.leiste_9._visible=false;
	_root.leiste_10._visible=false;
	_root.leiste_12._visible=false;
	}

Code jetzt:
Code:
on(rollOver){
	//Leiste sichtbar/unsichtbar schalten
	for (i=0; i<=12; i++){
		_root."leiste_"+i._visible=false;
		};
             // hier muß dann ja noch eine Leiste auf true gesetzt werden....

Kann mir vielleicht einer Helfen?
 
Ein Problem liegt am pfad den du angibst. Der müsste so lauten:
Code:
_root["leiste_"+i]._visible = false;

Abgesehen davon könntest du auch eine funktion definieren, die alle MC's unsichtbar macht und nur den geklickten ausläßt. zum Beispiel so:
Code:
function aus(diesNicht:String) {
	for (var i:Number = 1; i<=12; i++) {
		if (_root["leiste_"+i]._name != diesNicht) {
			_root["leiste_"+i]._visible = false;
		}else{
			_root["leiste_"+i]._visible = true;
		}
	}
}
Dies hätte den eventuellen Vorteil, dass die Buttons nurnoch diesen Code bräuchten:
Code:
on(rollOver){
	_root.aus(this._name);
}
Statt this._name könnte es auch "leiste_45" sein, oder eine Mischung aus Buttonname und String.. "leiste_"+this._name
usw. und sofort. Je nach Anwendung und Namengebung..

Hoffe das hilft...
 
Zuletzt bearbeitet:
Ja, vielen Dank, das funktioniert!

Jetzt habe ich mir den nächsten Block vorgenommen und versteh nicht richtig wieso das jetzt nicht funktioniert (es kommt keine Fehlermeldung, aber er zeigt keine Leiste mehr an)

Code vorher:
Code:
_root.attachMovie("leiste_1", "leiste_1", 1);
_root.attachMovie("leiste_2", "leiste_2", 2);
_root.attachMovie("leiste_3", "leiste_3", 3);
_root.attachMovie("leiste_4", "leiste_4", 4);
_root.attachMovie("leiste_5", "leiste_5", 5);
_root.attachMovie("leiste_6", "leiste_6", 6);
_root.attachMovie("leiste_11", "leiste_11", 11);
_root.attachMovie("leiste_7", "leiste_7", 7);
_root.attachMovie("leiste_8", "leiste_8", 8);
_root.attachMovie("leiste_9", "leiste_9", 9);
_root.attachMovie("leiste_10", "leiste_10", 10);
_root.attachMovie("leiste_12", "leiste_12", 12);

Code jetzt:
Code:
for (var i:Number = 1; i<=12; i++) {
	_root.attachMovie('["leiste_"+i]', '["leiste_"+i]', i);
}

kann man bei attachMovie keine Schleife verwenden?
 
Hallo,

doch kann man sehr wohl, aber du überschreibst die Leisten auf den Tiefenebenen 1-12 postwendend wieder mit den in der Schleife attachten Clips. Einfach beim Ebenen-Parameter i um jeweils etwa 20 erhöhen.

Gruss
 
Das versteh ich jetzt nicht. Ich dachte der Zähler i wird doch in der Schleife immer um 1 erhöht. Dann ist doch i beim ersten mal 1, beim zweiten mal 2, usw bis 12, wie überschreiben die sich dann gegenseitig?
Schuldige aber ich steh irgendwie auf dem Schlauch....
 
Hallo,

huch, falsch verstanden, war ich ein wenig schusslig eben. So sollte es funktionieren:
Code:
for (var i:Number = 1; i<=12; i++) {
	_root.attachMovie("leiste_"+i, "leiste_"+i, i);
}

Gruss
 
ja funktioniert prima, vielen Dank!

Ich komme immer in schleudern wo man welche Klammern, Anführungszeichen usw setzt. Gibt es irgendwo eine Seite wo das genau beschrieben wird? Damit ich da immer mal wieder nachschauen kann....
 
Hallo,

ja also am besten erklärt werden diese Dinge in der Flash-Referenz. Die wichtigsten Dinge fass ich hier nochmals zusammen.

1. Ob du nun Singlequotes(') oder Anführungszeichen benutzt, ist in AS eigentlich egal. Beide bezeichnen Anfang bzw. Ende eines Strings. Verwendet man sie in Kombination, so gelten die zuerst verwendeten als String-Bezeichner und die innern werden als normale Zeichen gewertet:
Code:
trace("Ich sage 'Halt!'");
//oder
trace ('ich sage "Halt!"');

2. Normale Klammern stehen mit Ausnahmen (Argumente einer Definition etc.) für einen Ausdruck, der innerhalb der Klammer zuerst behandelt wird, bevor er mit äusseren Faktoren interagiert. Beispiel:
Code:
var i: Number = 2;
trace ("foobar"+i+1);
//Output:  foobar21
trace ("foobar"+(i+1));
//Output:  foobar3
In diesem Beispiel wird dank der Klammern zuerst die Variable i um eins hochgezählt, bevor sie als Teil des Strings interpretiert wird.

Diese Anwendung kann auch praktisch bei Bedingungen sein.


3. Eckige Klammern gewähren immer Zugriff auf eine Eigenschaft eines Objekts. Prominentester Fall: Ein Array. Mit einer eckigen Klammer und einem gültigen Index greift man auf den Wert des Arrays der unter gegebenem Index gespeichert wird, zu:
Code:
var myArray: Array = ["Hallo", "Welt"];
trace (myArray[0]);

Dies funktioniert nun auch mit Objekten und weil (fast) alle Klassen in AS2 und AS3 von der Object-Klasse abstammen mit eigentlich jedem beliebigen Objekt, wie z.B. MovieClips. Anstatt wie bei Arrays Zahlen zu verwenden, benötigt man aber hier für den Zugriff den Namen der Eigenschaft. Ein Beispiel:
Code:
//Folgende Ausgaben sind identisch, weil sie dieselbe Eigenschaft ansprechen:
trace (myMovieClip._x);
trace (myMovieClip["_x"]);
In diesem konkreten Fall macht die Anwendung von eckigen Klammern wenig Sinn. Wichtig werden sie jedoch bei dynamisch erstellten Eigenschaften, deren Namen sich aus mehreren Werten ergeben:
Code:
var i: Number = 15;
var type: String = "movieclip";
this.createEmptyMovieClip (type+i, i);
trace (this[type+i]._x);

Bei deinem Problem von oben hilft auch immer die Flash-Referenz. Dort kannst du nachlesen, dass die Funktion attachMovie als erste zwei Parameter Strings verlangt, also simple Zeichenketten die mit einem Plus verknüpft werden können. Eckige Klammern haben da gar nichts zu melden, die sind bloss für den Objektzugriff nötig. Wenn du nun jedoch z.B. alle _alpha-Werte deiner neu erstellten Leisten modifizieren willst, machen sie sehr Sinn:
Code:
for (var i:Number = 1; i<=12; i++) {
	_root["leiste_"+i]._alpha = 50;
}


Gruss
 
Zuletzt bearbeitet:
Zurück