Text einer Schaltfläche dynamisch ändern

JaguarGorgone

Mitglied
Hallo,

es wäre schön, wenn mir jemand bei meinem Problem weiterhelfen kann.

Ausgangslage:
Ich habe eine Schaltfläche, mit Instanz "schaltflaeche_ins" betitelt. Diese Schaltfläche besteht aus einem Movieclip mit Instanznamen "sprach_ins". Dieser Movieclip wiederum enthält nur ein dynamisches Textfeld mit Instanznamen "sprach_label_ins".

Gewünschte Funktion:
Nach Klick auf die Schaltfläche soll sich der Text des dynamischen Textfelds "sprach_label_ins" ändern. Hintergrund ist ein zweisprachiger Flashfilm. Das dynamische Textfeld beinhaltet in Ausgangsposition den Ausdruck "Site in English". Nach dem Klick soll der Text dann "Seite auf Deutsch" lauten.

Problem:
Ich kann dieses Textfeld nicht ansprechen. Ich habe testweise versucht, über trace mir den aktuellen Inhalt "Site in Englisch" über
Code:
trace(_root.schaltflaeche_ins.sprach_ins.sprach_label_ins.text);
ausgeben zu lassen und auch dort einige Variationen durch weglassen von Instanzen z.B.
Code:
trace(_root.schaltflaeche_ins_sprach_label_ins.text);
probiert. Jedesmal erscheint im Ausgabefenster "undefined". Die Schaltfläche liegt auf der Hauptebene des Flashfilms. Einzig der Befehl
Code:
trace(_root.schaltflaeche_ins);
liefert eine andere Ausgabe: "_level0.schaltflaeche_ins". Somit scheint die Basis der Hierarchie ja korrekt zu sein.

Habe ich irgendwo einen Denkfehler? Ist es nicht möglich Instanzen innerhalb einer Schalfläche anzusprechen? Kann ich für die gewünschte Funktionsweise nur Movieclips nutzen?

Ich stehe mit meinen AS-Kenntnissen noch in den Kinderschuhen.
Vielen Dank für Deine Hilfe.

Schöne Grüsse
 
Hallo,

die Pfadangabe sollte eigentlich stimmen. Ist das Textfeld bzw. der MovieClip und das Textfeld auch für alle Bilder/Zustände deiner Schaltfläche verfügbar oder liegen die nur auf dem ersten Schlüsselbild?

gruss
 
Hi luke_the_duke,

erstmal Danke für Deine schnelle Antwort.

Der Movieclip und somit auch das Textfeld ist in allen 4 Zuständen der Schaltfläche vorhanden.

Übrigens ist bei Symboleigenschaften der Schaltfläche bei Verknüpfung "Export für ActionScript" nicht markiert. Ist die Verknüpfung markiert, erscheint eine Warnmeldung beim Test des Films ausgegeben wird.
Code:
**Warnung** Der Verknüpfungsbezeichner 'schaltflaeche_ins' wurde bereits dem Symbol 'button1' zugewiesen. Er kann nicht dem Symbol 'schaltflaeche_ins' zugewiesen werden, weil Verknüpfungsbezeichner eindeutig sein müssen.
Aber da der Button ja eh auf der Hauptmovie-Ebene liegt, spielt die Verknüpfung auch keine Rolle, oder täusch ich mich da?

Ich hab mal eine Dummy-FLA mit demselben Problem angehängt.

Vielen Dank und schöne Grüsse
 

Anhänge

  • 25433attachment.zip
    4,7 KB · Aufrufe: 40
Hallo,

mein Geständnis:
Ich kann dir die Ursache deines Problems nicht erklären :-(. Das hat bestimmt wieder irgendwas mit einer Ausnahme von wegen MovieClips in Buttons zu tun, aber ich blick da nicht durch.
Ich hab immer nur gewürgt mit der Button-Klasse bzw. dem Button-Symbol und hab u.a. deshalb aufgehört, damit zu arbeiten. Ich empfehl dir das auch so zu halten. Da das Button-Symbol im Grunde genommen nichts anders ist als ein spezifizierter MovieClip, bedeutet das aber für uns keinen grossen Verlust.

Dein Problem behebst du, indem du deinen Button in der Bibliothek und auf der Bühne als MovieClip deklarierst. MovieClips reagieren genau wie Buttons auch auf die gängigen Events wie on (release), on (rollOver) usw., der einzige Unterschied ist, das mit this auf(!) einem Button (und NUR da, also wenn du auf einem Keyframe codest, siehts schon wieder anders aus...du siehst ;)) die Container-Ebene gemeint ist, mit this auf einem MovieClip referenzierst du jedoch den MovieClip selbst.

gruss
 
Zuletzt bearbeitet:
Ich kann dir die Ursache deines Problems nicht erklären . Das hat bestimmt wieder irgendwas mit einer Ausnahme von wegen MovieClips in Buttons zu tun, aber ich blick da nicht durch.
Objekte innerhalb von Schaltflächensymbolen können nicht über Instanznamen adressiert werden. Ein Durchlauf der Objekte in einer Schaltfläche mit "for (var i in button_obj) {" ergibt eine Auflistung der Form "instance1", "instance2" usw. Über diese Aufzählung können die Objekte dann auch per AS adressiert werden:
Code:
trace(button_obj.instance1);

Gruß
.
 
Ich danke Euch beiden für die Antworten und die Zeit, die Ihr Euch genommen habt.

Zu Deinem Ansatz, Tobias:

ich hab es nun geschafft das Textfeld anzusprechen über
Code:
on(release)
{
	for (var i in _root.btn1)
	{
		for (var j in _root.btn1.instance2)
		{
			for (var k in _root.btn1.instance2.labeltext)
			{
				trace(_root.btn1.instance2.labeltext.text);
				if(_root.btn1.instance2.labeltext.text == 'Testbutton')
				{
					_root.btn1.instance2.labeltext.text = 'Test erfolgreich';
				}
				else
				{
					_root.btn1.instance2.labeltext.text = 'Testbutton';
				}
			}
		}
	}	
}
Das funktioniert beim ersten Mal drüberfahren und klicken auf den Button. Bei einem erneuten Drüberfahren mit der Maus passiert dann wieder nichts.
Ich nehme an, es hat was mit dem "instance2" zu tun, also das eine neue Instanz erzeugt wird. Ich hatte es versucht mit einem dynamischen Element in der Hierarchieangabe z.B.
Code:
_root.btn1.{'instance' .i}.labeltext.text = 'Testbutton';
Das ist jedoch nicht korrekt und es gibt einen AS-Fehler. Da ich aus der PHP Programmierung komme, dachte ich an diese Form (${'instance' .$i}). Gibt es in AS etwas äquivalentes, um die Variable mit in die Hierarchie einzubinden? Oder ist der Basisgedanke hier schon falsch?

Schöne Grüsse
 
Hallo,

nein, das gibts in Flash sehr wohl auch:

Code:
var i = 1;
trace (btn1["instance"+i]);

gruss

PS: Hier findest du das ausführlicher beschrieben.
 
Zuletzt bearbeitet:
Danke für den Tipp, luke_the_duke. Das hat mich schon viel weiter gebracht.
Mittlerweile ist das AS viel übersichtlicher:
Code:
on(release)
{
	for (var h in _root.btn1)
	{ 
		_root.btn1[h].labeltext.text = 'funktioniert';		
	}
}
Das bewirkt die Änderung des Textes. Leider nur solange ich mich mit dem Mauszeiger über der Schaltfläche befinde. Danach wechselt der Text wieder. Anscheinend wird dann (nach Abschluss des Klick-Prozesses) eine neue Instanz erzeugt.

Dank des trace()-Befehls habe ich gesehen, dass sich die 'instance#' immer um 2 erhöhen, also erst instance2 dann instance4 etc.

Wie bekomme ich es nun hin, dass der Text, der im oben gezeigten AS der Textfläche zugewiesen wird auch bestehen bleibt?

Meine Idee war, auf Hauptfilmebene in einem AS die Klicks zu zählen und dann der Instanz mit Namen "instance(zaehler + 2)" den Text zuzuweisen. Da diese Instanz aber noch nicht während des Klicks besteht, kann das ja auch nicht funktionieren.

Kennt jemand eine weitere Möglichkeit, damit der neu zugewiesene Text bestehen bleibt?

Die neuere Dummy-Version hab ich nochmal angehängt.

Schöne Grüsse
 

Anhänge

  • 25449attachment.zip
    5 KB · Aufrufe: 22
Hallo,

das Problem bei deiner Lösung ist, dass du für jedes Schlüsselbild/Keyframe eine andere Instanz ansprichst. Leg dein Textfeld einfach auf eine neue Ebene im Button und füge an den restlichen Positionen statt Schlüsselbildern normale Bilder. Das bedeutet, dass für den Bereich das jeweils letzte Schlüsselbild gilt, ergo deine Textfeldinstanz.

gruss
 

Anhänge

  • 25451attachment.zip
    6 KB · Aufrufe: 123

Neue Beiträge

Zurück