Arrays und der Planverlust in der for-Schleife

Budman

Erfahrenes Mitglied
Hallo!

Wie der Titel schon sagt, ich habe hier so ein kleines Problem, und keinen Ansatz parat. Ich weiss, das der Code nicht funktioniert, und es auch nicht kann, aber ich habe keine Ahnung, wo ich ansetzen soll, um das zu ändern...

PHP:
var btnName:Array = new Array("home_mc", "sims_mc", "simsZwei_mc", "simCity_mc", "kontakt_mc");
var btnLabel:Array = new Array("Home", "Die Sims", "Die Sims2", "SimCity4", "Kontakt");
function setBtn() {
	var current = btnName.length;
	for (i=0; i<current; i++) {
		this.buttonLeiste_mc.createEmptyMovieClip(btnName[i], [i]);
		this.buttonLeiste_mc.createTextField(btnLabel[i] , [i]+10, 5, 3, 105, 16);
		this.buttonLeiste_mc.btnLabel[i].text = btnLabel[i];
		this.buttonLeiste_mc.btnLabel[i].setTextFormat(btnfmt_fmt);
		this.buttonLeiste_mc.btnName[i]._x = btnName[i]*125;
		this.buttonLeiste_mc.btnName[i]._y = 2;
	}
}
// ---------------------------------------------------------------------
this.createEmptyMovieClip("buttonLeiste_mc", 20);
this.buttonLeiste_mc.onEnterFrame = function() {
	setBtn();
	delete this.onEnterFrame;
};

Ob mir jemand einen Schubs in die richtige Richtung geben könnte?

Danke und Gruss Bud
 
Hi,

ich hab das jetzt nur mal überflogen, aber sowohl createEmptyMovieClip als auch createTextfield geben Referenzen zurück, die Du in einem Array speichern kannst:
PHP:
tf[i] = button_mv.createTextfield("tf" + i, bla, bla, bla);
tf[i].text ="blubb";
Außerdem kannst Du durchnummerierte Objekte mit this[] oder eval ansprechen:
PHP:
// angenommen, ein Clip hat den Instanznamen "button0" bis "button100":
this["button" + nummer]._visible = false;

Gruß
.
 
Hallo!

Sorry, aber ich blick's nicht wirklich. Wie meinst Du das mit geben Referenzen zurück? Heisst das, ich kann über den Namen des Arrays die einzelnen erstellten Dinge ansprechen?

In etwa so:
PHP:
btnName[i] = buttonLeiste_mc.createTextField (btnName[i], [i], bla, bla, bla, bla)

Nur wie weiter? Ich möchte im Endeffekt pro Punkt im Array einen MC erstellen, ein Textfeld erstellen und in diesem dann den Namen aus dem zweiten Array setzen. Nur irgendwie verstolpere ich mich da...

Ob Du es mir etwas genauer sagen könntest?

Danke und Gruss Bud
 
Hi,

Du musst die Einträge in Deinem Array nicht als Bezeichner für die neuen Objekte (z.B. Textfelder) verwenden (Du kannst es natürlich tun, aber die Textfelder identisch zu bennen ist übersichtlicher). Folgendes Script erstellt z.B. 5 Buttons mit Textfeld und entsprechenden Beschriftungen:
PHP:
var labels = new Array("Home", "About", "Links", "Guestbook", "Imprint");

var buttons = new Array(labels.length); // Array, in dem wir MC-Referenzen speichern

for (var i=0; i<labels.length; i++) {
    button[i] = this.createEmptyMovieClip("button" + i, this.getNextHighestDepth());
    button[i]._x = i * 100; //Positionierung uns andere Dinge... ;)
    button[i].tf = button[i].createTextField("tf", 1, 5, 3, 100, 16);
    button[i].tf.text = label[i]; // Hier bekommt das Textfeld seinen Inhalt
    // Alle Textfeldinstanzen heissen "tf", befinden sich aber in ihren jeweiligen Buttons.
    // Die Buttons sind als MovieClip-Instanzen im Array "button" hinterlegt.
    button[i].onPress = function() {
        trace(this.tf.text); // Würde z.B. beim Klick die Beschriftung ausgeben
    }
}

Gruß

P.S.: wenn Du den Buttoninstanzen keine eigenen Namen gibst, sondern sie einfach stur "button1" - "buttonX" benennst, behältst Du sicher mehr Überblick; in sofern benötigst Du keine 2 Array, sondern nur eins mit den Texten. ;)
.
 
Danke! Bringt mih einen Schritt weiter, aber leider noch nicht zum Ziel. :(

Ich hab's jetzt mal so übernommen:
PHP:
var labels = new Array("Home", "Die Sims", "Die Sims2", "SimCity4", "Kontakt");
var buttons = new Array(labels.length); // leeres Array mit 5 Positionen
function setBtn() {
	for (var i = 0; i<labels.length; i++) {
		buttons[i] = this.buttonLeiste_mc.createEmptyMovieClip("button"+i, this.buttonLeiste_mc.getNextHighestDepth()); // erstellen und ins Array schreiben?!
                [...] // positionieren usw.
		buttons[i].tf = buttons[i].createTextField("tf", 1, 5, 0, 105, 16); // soweit noch klar
		buttons[i].tf.text = labels[i]; // hier hängt das Verständnis, eigentlich müsste jetzt doch alles angezeigt werden,oder?
		buttons[i].tf.setTextFormat(btnfmt_fmt);
	}
}

Sorry, aber ich komme nicht ganz klar, da ich mir echt nicht sicher bin, ob Du nun zwei oder ein Array verwendest. Lt Deinem Post von vorhin sind das ja zwei (button und buttons), oder?

Zumal kein Text ausgegeben wird. Das Textfeld wird erstellt, aber es erscheint nichts... :(

Sorry, ich merke schon Arrays liegen mir nicht....

Danke und Gruss Bud
 
Zuletzt bearbeitet:
EDIT:

Jupp - ;) - der Fehler lag ausschließlich bei mir (man sollte "blind" keine Code posten, ohne ihn getestet zu haben):

- createTextField gibt keinen Wert zurück (was nichts macht, da wir ja überall den gleichen Instanznamen vergeben)

- Ich habe die Arraybezeichner durcheinander gebracht: button/buttons label/labels.

So funktioniert es:
PHP:
var labels = new Array("Home", "About", "Links", "Guestbook", "Imprint");

var button = new Array(labels.length); // Array, in dem wir MC-Referenzen speichern

for (var i=0; i<labels.length; i++) {
    button[i] = this.createEmptyMovieClip("button" + i, this.getNextHighestDepth());
    button[i]._x = i * 100; //Positionierung uns andere Dinge... ;)
    button[i].createTextField("tf", 1, 5, 3, 100, 16);
    button[i].tf.text = labels[i];
    button[i].onPress = function() {
        trace(this.tf.text);
    }
}

Gruß
.
 
Zuletzt bearbeitet:
Danke!
a040.gif


Jetzt hab ich's verstanden (hoffe ich ;) ). Und es funktioniert!
 
Zuletzt bearbeitet:
Leider zu früh gefreut... :(

Wie bekomme ich es hin, dass ich den Buttons nun auch noch eine onRelease-Funktion mitgeben kann, in Abhängigkeit des jeweiligen Buttons?

Ich hab das mal so versucht:
PHP:
var labels = new Array("Home", "About", "Links", "Guestbook", "Imprint");

var button = new Array(labels.length); 

var titles ("home.swf", "about.swf", "links.swf", "guestbook.swf", "imprint.swf"); 
// neues Array für die swf Titel

for (var i=0; i<labels.length; i++) {
    button[i] = this.createEmptyMovieClip("button" + i, this.getNextHighestDepth());
    button[i]._x = i * 100; 
    button[i].createTextField("tf", 1, 5, 3, 100, 16);
    button[i].tf.text = labels[i];
    // hier wollte ich eigentlich aufrufen
    button[i].onRelease = function() {
        _root.loader_mcl.loadClip(titles[i], _root.standard_mc);
    }
}

Leider klappt das natürlich wieder nicht, weil "i" zum Zeitpunkt von onRelease nämlich immer 5 ist. Aber auch den fünften Eintrag im Array lädt er nicht...

Setze ich die onRelease-Funktion aber ausserhalb der for-Schleife, geht's schonmal gar nicht....

Danke!
 
Hi,

so kann das nicht gehen, aber Du kannst jedem Button doch eine Eigenschaft geben (hier: titles), die Ihn auszeichnet:
PHP:
button[i].titles = titles[i]; // Hier bekommt der Button den Titel...
button[i].onRelease = function() {
        _root.loader_mcl.loadClip(this.titles, _root.standard_mc);
        // ... welcher beim onRelease eingesetzt wird :-)
}

... den fünften Eintrag zählt er schon, beachte allerdings, dass der erste Eintrag den Index 0 hat ("but0" - "but4").

Gruß
.
 
Zurück