Dynamisch erzeugte Textfelder werden auf dynamisch erzeugten MCs nicht angezeigt

JaguarGorgone

Mitglied
Hallo liebe Gemeinde,

ich stehe vor einem Problem, welches mich seit Tagen nicht in Ruhe lässt. Nach vielem Suchen und Herumprobieren, hoffe ich nun bei Euch auf den entscheidenen Tip.

Zunächst zum Rahmen des Ganzen:
Ich sitze an einem Flashfilm. In einer Funktion wird eine Liste aus einer Datenbank über PHP bzw. XML in den Film importiert. Jeder Datensatz hat wird in einen eigens erzeugten Movieclip angezeigt. Um den Rahmen des Films nicht zu sprengen, liegen diese Clips hinter einer Maske und können über eine Scrollleiste bewegt werden.
Da jedes Element eine eigene Funktion (d.h. beim Anklicken des Movieclips wird eine Änderung im Film ausgeführt) im Film besitzt, konnte ich diese nicht einfach in ein Textfeld untereinander setzen.

Das Problem:
In einer for-Schleife werden nun die Datensätze der XML-Datei ausgelesen. Für jeden Datensatz wird ein MC erzeugt. Das klappt auch einwandfrei. Auf diesen Movieclip wird dann direkt ein Textfeld mit dem Inhalt/Daten des Satzes gesetzt. Dort liegt das Problem. Der Text wird nicht angezeigt. Der textliche Inhalt ist vorhanden (trace). Meine Vermutungen gehen in zwei Richtungen: Entweder ist der Pfad falsch oder die Tiefe des Textfeldes ist nicht korrekt.
Da der Pfad aber vorher schon zur Erzeugung des Movieclips erfolgreich genutzt wurde, würde ich das eher ausschliessen. Bliebe die Tiefe der Ebene. Dort habe ich verschiedene Werte eingesetzt:
  • getNextHighestDepth() versuchte Pfade: von _root. bis _root.shoplocator_inhalt.shopback['shop_'+(i+1)]. und this.
  • feste Werte (sowohl kleine Werte als auch grosse Werte
  • swapDepths(12)
Alles bisher ohne Erfolg.

Den Quelltext für die MC Erzeugung (die wichtigsten Auszüge):
Code:
on (release) {
                var shopXML:XML = new XML();
	var sh:Array = new Array();
	shopXML.ignoreWhite = true;
	shopXML.onLoad = function(success) {
		var currentNode:XMLNode = this.firstChild;
		var i:Number = 0;
		var c:Number = 0;
		var u:Number = 4;
		for (var childNode = currentNode; childNode != null; childNode=childNode.nextSibling, i++) {
			sh[i] = new Array();
			_root.shoplocator_inhalt.shopback.createEmptyMovieClip('shop_'+(i+1), _root.shoplocator_inhalt.shopback.getNextHighestDepth());
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].beginFill(0xFFFFFF, 100);
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].moveTo(u, c);
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].lineTo(324, c);
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].lineTo(324, (c+60));
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].lineTo(u, (c+60));
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].lineTo(u, c);
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].endFill();
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].createTextField('shop', this.swapDepths(12), (u + 12), (c + 4), 300, 60);
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].shop.multiline = true;
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].shop.html = true;
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].shop.color = 0xDD1100;
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].shop.htmlText = childNode.childNodes[0].childNodes[0].nodeValue+'<br />'+childNode.childNodes[1].childNodes[0].nodeValue+'<br />'+childNode.childNodes[2].childNodes[0].nodeValue+' '+childNode.childNodes[3].childNodes[0].nodeValue;
			// Abstand fürs nächste Element
                                                c = c+64;
			// Aktion erzeugen
			_root.shoplocator_inhalt.shopback['shop_'+(i+1)].onRelease = function() {
                                                                // hier kommt dann die Aktion			
			};
			
		}
	};
	// XML laden
	shopXML.load("shoplocator.xml");
}

Zum besseren Verständnis:
Die Instanz "shopback" liegt auf der Instanz "shoplocator_inhalt". Über der Ebene liegt eine Maske, um den Scrolleffekt für die erzeugten MCs zu erhalten. Wie bereits beschrieben, werden auch alle MCs angezeigt und auch die Scrollfunktion arbeitet korrekt.

Der entscheidende Befehl ist wohl:
Code:
_root.shoplocator_inhalt.shopback['shop_'+(i+1)].createTextField('shop', this.swapDepths(12), (u + 12), (c + 4), 300, 60);

Warum erscheinen diese dynamisch erzeugten Textfelder nicht auf der dynamisch erzeugten Ebene?
Für Tips und Lösungen bin ich sehr dankbar.

Schöne Grüsse
 
Hi,

was soll denn jedes mal das
Code:
this.swapDepths(12)
dort? this bezieht sich in diesem Fall auf Dein XML-Objekt (shopXML) und die Funktion wird daher wohl "undefined" zurückgeben ...

Gruß
.
 
Hallo Tobias,

danke für Deinen Hinweis.

Das swapDepths() war jetzt der letzte Versuch, den ich als Tiefenwert mal versucht habe.
Vorher hatte ich dort, wie geschrieben, _root.getNextHighestDepth(), etc. stehen.
Also auch mit Verweis auf den absoluten Pfad.

Ich hab die Tiefen mal über trace ausgeben lassen mit Tiefenwerterzeugung über
Code:
_root.shoplocator_inhalt.shopback['shop_'+(i+1)].createTextField('shop', (i +_root.shoplocator_inhalt.shopback['shop_'+(i+1)].getNextHighestDepth() + 1), (u + 12), (c + 4), 300, 60);

Befehl zur Ausgabe:
Code:
trace(_root.shoplocator_inhalt.shopback.getDepth() + ' +++ ' + _root.shoplocator_inhalt.shopback['shop_'+(i+1)].getDepth() + ' +++ ' + _root.shoplocator_inhalt.shopback['shop_'+(i+1)].shop.getDepth());

Ausgabe (bei 13 vorhandenen Werten in der XML Datei):
Code:
-16376 +++ 0 +++ 1
-16376 +++ 1 +++ 2
-16376 +++ 2 +++ 3
-16376 +++ 3 +++ 4
-16376 +++ 4 +++ 5
-16376 +++ 5 +++ 6
-16376 +++ 6 +++ 7
-16376 +++ 7 +++ 8
-16376 +++ 8 +++ 9
-16376 +++ 9 +++ 10
-16376 +++ 10 +++ 11
-16376 +++ 11 +++ 12
-16376 +++ 12 +++ 13

Obwohl hier das Textfeld die höchste Ebene hat, wird sie nicht angezeigt.

Vielleicht hast Du ja noch einen Tip.

Danke und schöne Grüsse
 
Hi,

prinzipiell kannst Du allen Textfeldern die selbe Tiefe (z.B. 1) geben, da sie sich alle in unterschiedlichen MovieClips befinden. Jeder MC hat seine ganz eigene Stapelreihenfolge.

Wenn Du die Textfelder "tracen" kannst (die Objekte also existieren), Du aber keinen Text siehst, kann es an Problemen mit dem Font liegen (Du hast soweit ich sehen kann, nicht mal einen Font definiert). Probiers mal mit einer komplett eingebetteten Schriftart, die zum Export für AS freigegeben ist.

Wahrscheinlich würdest Du Dir viel Arbeit ersparen, wenn Du einfach einen MC mit Rahmen und Textfeld "per Hand" erstellst und nach dem Einladen der XML-Datei das Ding einfach x-mal per attachMovie auf die Bühne holst, statt Linien und Textfeld per AS zu zeichnen.

Im Übrigen sind solche Monster wie "_root.shoplocator_inhalt.shopback['shop_'+(i+1)].shop." recht schlecht zu lesen (verwende doch Rückgabewerte und temporäre Objekte), ich würde Dich also bitten, die Datei (samt dazugehöriger .xml) einmal zu posten. Dann würde ich mal drüberschauen.

Gruß
.
 
Hallo Tobias,

ein weiteres Dankeschön für Deine Tips. Die Idee mit dem attachMovie finde ich gut. Habe auch schon mit der Umsetzung begonnen.

Trotzdem finde ich es höchst unbefriedigend nicht zu wissen, warum das so nicht funktioniert.

Die eingebettete Schriftart dem Textfeld zuzuweisen brachte übrigens keinen Erfolg.

Seltsam ist es, dass der Text schon mal angezeigt wurde. Da hatte ich diese Elemente alle direkt auf der _root Ebene erscheinen lassen ohne Maske, Verschachtelung und Scrollbalken.

Ich hab mal aus Übersichtsgründen einen Dummy erzeugt, der dieselbe Ausgangslage wie der Film hat. Hier besteht dasselbe Problem.
Nebenbei bemerkt:
Dort habe ich Deine Scrollleiste eingebaut. Wirklich sehr schönes Arbeiten damit.

Wenn Du Zeit und Lust hast, dort mal kurz drüber zu schauen, wäre ich Dir sehr dankbar.

Danke für Deine Mühe

Grüsse
 

Anhänge

Hi,

um einen eingebetteten Font zu verwenden, musst Du ein TextFormat-Objekt erstellen, dem Du die entsprechende font-Eigenschaft zuweist. Zudem musst Du die embedFonts-Eigenschaft des Textfeldes auf "true" stellen. Beispiel:
Code:
			// wir nehmen mal eine temporäre Variable, um uns jedes Mal
			// diese endlos lange Adressierung zu sparen:
			var tf = _root.shoplocator_inhalt.shopback['shop_'+(i+1)].shop;
			// embedFonts einschalten
			tf.embedFonts = true;
			tf.border = false;
			tf.multiline = true;
			tf.html = true;
			tf.textColor = 0xDD1100;
			tf.htmlText = childNode.childNodes[0].childNodes[0].nodeValue+'<br />'+childNode.childNodes[1].childNodes[0].nodeValue+'<br />'+childNode.childNodes[2].childNodes[0].nodeValue+' '+childNode.childNodes[3].childNodes[0].nodeValue;
			// TextFormat-Objekt erstellen:
			var f = tf.getTextFormat();
			// Font zuweisen: (Verknüpfungsbezeichner)
			f.font = 'MeinFont';
			// selbe Größe wie beim Font einstellen:
			f.size = 10;
			// ... und dem Textfeld wieder zuweisen:
			tf.setTextFormat(f);

Gruß
.
 
Asche über mein Haupt.
Mit der eingebetteten Schriftart funktioniert es. Aber wegen meiner bescheidenen Flashkenntnisse konnte ich die eingebettete Schriftart nicht richig dem Textfeld zuweisen.

Vielen Dank für Deine kompetente Hilfe, Tobias.

Somit hat sich die Geschichte erledigt.
 
Zurück