Button enable Problem

nick2005

Mitglied
Hallo Leute.
Habe lange nicht mehr Flash gemacht und bin ein bisschen aus der Übung.
Meine Frage:

Ich habe eine Knopfleiste, die per AS gesteuert werden soll, also die Knöpfe sich automatisch deaktivieren sollen, wenn man draufklickt und die anderen wieder aktiv werden sollen.

Dazu habe ich mir ein prototype geschrieben in dem in einer Schleife die Knöpfe auf enabled bzw disabled gesetzt werden sollen.
Code:
	for (var i = 0; i<=5; i++) {
		
		if (movie == arraymovie[i]) {
			tmpenable = "_root.knopfleiste."+ movie;
			tmpenable.enabled = false;
		} else {
			tmpenable = "_root.knopfleiste."+arraymovie[i];
			tmpenable.enabled = true;
		}
	}

so wieso funktioniert das so nicht
mache ich das so:
Code:
              for (var i = 0; i<=5; i++) {
		
		if (movie == arraymovie[i]) {
			//tmpenable = "_root.knopfleiste."+ movie;
			_root.knopfleiste.Button.enabled = false;
		} else {
			//tmpenable = "_root.knopfleiste."+arraymovie[i];
			_root.knopfleiste.AndereButton.enabled = true;
		}
	}

funktioniert das
also er kommt nur mit diesem : tmpenable = "_root.knopfleiste."+ movie;
tmpenable.enabled = false;
nicht klar. warum? Ist doch ein String genauso als würde ich es geschrieben haben. mit trace steht auch in tmpenable auch das Richtige drin.

Danke Im Vorraus
Bis dann
 
Hi,

es wäre vielleicht praktischer, Du würdest die Datei einmal posten. Ich finde es ziemlich unbequem, sich in ein Script einzulesen, wenn nicht klar ist, was die Bezeichner nun genau bezeichnen... ;) (ich weiß, ich bin heute faul)

Generell geht so etwas z.B. so:
PHP:
// Einem Button kannst Du z.B. diesen Code geben:
var isenabled = true;

function enable() {
    // was auch immer Du hier machen willst
    this.isenabled = true;
}

function disable() {
    // hier auch
    this.isenabled = false;
}

this.onPress = function() {
    if (this.isenabled) _parent.pressed(this);
}
Auf der Zeitleiste, in der sich die Buttons befinden würde ich entweder alle Buttons in ein Array schreiben, oder Du verwendest einen MovieClip, der ausschliesslich diese Buttons enthält: Dann kannst Du alle Buttons mit einer for..in-Schleife durchlaufen:
PHP:
function pressed(obj) {
    for (var i in this) {
        if (typeof(this[i]) == "movieclip") {
            if (this[i] != obj) {
                this[i].enable();
            } else {
                this[i].disable();
            }
        }
    }
}
Vorteil: Du kannst in dem Menü-MC beliebig viele Buttons unterbringen, ohne den Code zu ändern, und brauchst auch keine bestimmten Instanznamen zu vergeben.

Gruß
.
 
Zuletzt bearbeitet:
jo danke auch ne idee. aber ich brauche noch die Instanzen sowieso , und wollte ein bischen wenig code haben. Nicht immer if und so schreiben, habe es jetzt hinbekommen:
Code:
MovieClip.prototype.navigation = function(movie) {
	var arraymovie = new Array("Home", "fsg", "fdsf", "Tfdg", "dfgh", "fgfff");
	for (var i = 0; i<=5; i++) {
		
		if (movie eq arraymovie[i]) {
			
			tmpe ="_root.knopfleiste."+ movie;
			eval(tmpe).enabled = false;
		} else {
			var tmpe = "_root.knopfleiste."+arraymovie[i];
			eval(tmpe).enabled = true;
		}
	}
};

so muss es sein.mir fehlte das eval :)
diese Methode wird von einer anderen verwendet wird noch erweitert :)
Aber danke für die Mühe

Ps achja kannst du mir mal erklären was for( i in this) macht? so ein konstrukt kenne ich nämlich gar nicht. also so eine for schleife
 
Nun ja, ohne Deine Datei gesehen zu haben, konnte ich leider nicht wissen, was diese Funktio genau machen soll...

Mal am Rande: Ich dachte bisher eval() dürfte nicht auf der linken Seite einer Zuweisung stehen? Na ja, muss ich nochmal testen. ;) Normalerweise sollte so etwas ausreichen:
PHP:
 this[tmpe].enabled = false;

Die for..in-Schleife durchläuft alle Objekte in dem angegebenen Objekt. Siehe Flashhilfe unter "for..in".

Gruß
.
 
Hi Datic

Nachdem ich dachte, dass ich schon fertig wäre mit den Knöpfen, und mit der Seite auch schon weiter gearbeitet habe, testen wollte, kam ein Problem, was ich nach rumprobiern nicht lösen konnte. Vielleicht kannt du mir da bitte helfen, wie ich das lösen soll.

Also Problembeschreibung:

Wenn ich schnell hintereinander die Knöpfe klicke, wird nur der vorletze auf enable gesetzt. Auch die Farben bleiben stehen. Ist auch klar wie du gleich sehen wirst.
Und zwar , erreicht der Zustand des Knöpfes die Bedingung alpha <= 10 und somit geht er noch nicht dort rein. Schon startet aber ein neuer Ablauf der diesen überschreibt. Und der vorherige ist damit gelöscht.

Ich habe verschiedene Möglichkeiten ausprobiert, aber kreige es nicht hin :(

hier daran liegt es:

PHP:
function fadeOut(movie) {
	tmpe = "_root.knopfleiste."+movie;
	var controller = this.createEmptyMovieClip("fader", 1); 
	controller.onEnterFrame = function() {
		eval(tmpe)._alpha -= 4;
		if (eval(tmpe)._alpha<=10) {
			setnewColor(-118, 25, -210, movie);
			eval(tmpe).enabled = true;
			delete this.onEnterFrame;
		}
	};
}

Wie kriege ich es nun hin, dass er die Funktion atomar ausführt aber für jeden Knopf einzeln. So als hätte ich davon 5 Stück, wo der eine dem anderm nicht dazwischen funken kann, die aber wohl parallel laufen können.

Habe mal die fla mitbei gelegt, weil das diesmal schwer zu verstehen ist, wie ich das da zusammengebaut habe, wenn es kürzer geht bin ich für jeden guten Vorschlag dankbar.

Achja das am Anfang ist die Aufbau - Simulation und gestartet wird mit Home, deshalb ist der zuerst auf enabled = false und hat auch eine andere Farbe.


DIE .FLA

Bis dann
 
Hi,

Du musst für jeden Button einen eigenen Controller anlegen. Mal auf die Schnelle, ohne die Datei anzusehen (wenns nicht klappt, schau ich halt noch mal rein):
PHP:
function fadeOut(movie) {
    var tmpe = _root["knopfleiste" + movie];
    var controller = tmpe.createEmptyMovieClip("fader", 1);
    controller.onEnterFrame = function() {
        tmpe._alpha -= 4;
        if (tmpe._alpha<=10) {
            setnewColor(-118, 25, -210, movie); // bist Du sicher, dass
            // Du hier nich auch "tmpe" meinst?
            tmpe.enabled = true;
            delete this.onEnterFrame;
        }
    }
}

Gruß
.
 
Hi Datic danke für schnelle Antwort. Habe mir das so gedacht, habe das auch ausprobiert für jeden Knopf einen MC zu erstellen, leider klappt das nicht. Müsste eigentlich aber klappen weil ist ja sowas ähnliches dann wie verschiedene Objekte, die paralell laufen und im Speicher zu finden sind. Sind sie auch in Debuger aber laufen leider nicht so wie sie solen. Habe das allerdings ein bisschen anders mit meinen eval, weil das mit den eckigen Klammern nicht klappt bei mir. Flash Mx 2004 ist es bei mir.

Wäre nett wenn du dir das mal anschauen würdest. Das mit setnewColor und da movie das ist schon richtig, weil ist meine funktion die ich mir da gebaut habe und der reicht nur movie aus. Wirst du aber sehen.
Bis dann
 
Hi,

Puh, da ist aber (m.E.) einiges unnötig kompliziert bzw. doppelt.

Warum hast Du z.B. die Buttons mehrmals übereinander liegen? Und warum Grafiken statt MovieClips? Na ja, ich hab das mal weitestgehend gelassen und nur das AS etwas angepasst. Du brauchst nicht auf jeder Buttoninstanz ewig viel AS, wenn Du alles mit ein paar kleinen globalen Funktionen erledigen kannst.

Die Farbwerte usw. musst Du u.U. noch anpassen.

Gruß
.
 

Anhänge

danke datic, werde mal schauen ob es jetzt klappt. das mit den movieclips übereinader hast du recht. da habe ich unüberlegt gehandelt. könnte man wegnehmen, allerdings könnte ich die farben der knöpfe wenn man drüber geht nicht schön ausblenden und einbelden. also es ist mir nichts besseres eingefallen.

ich melde mich wenn es jetzt klappt.
Bis dann! und danke
 
Danke Datic, schein zu funktionieren. Ich habe das auch versucht mit globalen funktionen die Knöpfe mit rollover und out zu machen, aber das hat nicht geklappt. deshalb habe ich es so gemacht. Jetzt weiß ich dank dir wie es geht. Zu lange nichts mit flash gemacht :(

Wenn noch was sein sollte melde ich mich, aber scheint alles zu funktionen, habe nur speed noch eingebaut als Übergabeparamter damit ich bei rollover und rollout verschiedene speeds habe. Und muss noch dass er beim anfang Home richtig von anfang an auf blau setzt und disable. Aber sonst alles bestens.

Bis dann!
 
Zurück