Eingebundene Fonts und Array funktioniert nicht

FlorianR

Erfahrenes Mitglied
Hallo Zusammen,

ich habe zwei kleine Problemchen und ich hoffe ihr könnt mir weiterhelfen.
Ich lade via Actionscript ein XML Dokument in meine Flashdatei. Siehe hier:

HTML:
<?xml version='1.0' encoding='utf-8'?>
<inhalte>
	<inhalt 
	cmsUeberschrift="Dies ist eine Überschrift" 
	cmsText="Hier steht der Text in der Datei. Dieser Text kann sich über mehrere Zeilen erstrecken. Diese Tatsache wurde in Flash realisiert. Weitere Informationen erhaltet ihr direkt bei mir" />
	
	<inhalt cmsUeberschrift="Willkommen auf meiner Seite" cmsText="Hier steht dann der zweite Inhalt, der ausgelesen wird." />
</inhalte>

Bevor ich meine beiden Probleme erläutere, hier mein Actionscript:

HTML:
		var fff1:TextFormat = new TextFormat();
			fff1.font = "fffBusiness";
		
		var XMLdaten = new XML(); //erstellt ein neues XML Objekt
		XMLdaten.ignoreWhite=true; // ignoriert die leerRäume (spaces) inder XML-file 
		
		//lädt die XML-file und "verhindert" das die Datei im Browsercache bleibt (sobald Die XML neu geladen wird):
		//?nocache=" + new Date().getTime() <- In der finalen Version wieder einbauen.
		XMLdaten.load("xml/inhalt.xml"); 
	
		// Abfrage (wenn laden erfolgreich war...):
		XMLdaten.onLoad = function(success) {
			// Die zu füllenden Variablen (Arrays):
			var Ueberschriften:Array = new Array();
			var Texte:Array = new Array();
			anzahlInhalte = XMLdaten.firstChild.childNodes.length; // Liest XML Elemente aus
			// Arrays mit den XML-Inhalten füllen:
				for (var i=0; i<anzahlInhalte; i++){
					Ueberschriften = XMLdaten.firstChild.childNodes[i].attributes.cmsUeberschrift; // Array füllen
					Texte = XMLdaten.firstChild.childNodes[i].attributes.cmsText; // Array füllen
				
					// Textfelder im "Inhalt" Movieclip erzeugen:
					
					// Überschriften:
					_root.inhalt.createTextField("fUeberschrift", 1+i, 10, 10+10*i, 600, 100);
					_root.inhalt.fUeberschrift.embedFonts = true;
					_root.inhalt.fUeberschrift.setTextFormat(fff1);
					_root.inhalt.fUeberschrift.selectable = true;
					_root.inhalt.fUeberschrift.text = Ueberschriften[i]; // Inhalt
					
					// Texte:
					_root.inhalt.createTextField("fText", 1+i, 10, 30+10*i, 600, 100);
					_root.inhalt.fText.embedFonts = true;
					_root.inhalt.fText.setTextFormat(fff1);
					_root.inhalt.fText.selectable = true;
					_root.inhalt.fText.text = Texte[i]; // Inhalt
					}				
				
		stop();
		}

Nun habe ich das Problem das er meine eingebundenen Schriften nicht erkennt. Ich habe die Schrift in meine Bibliothek importiert und fff1 (habe es auch mal anders gegannt) genannt. Als nächstes habe ich sie dann verknüpft und das ganze für ActionScript Exportiert, sowie für das erste Bild zugänglich gemacht. Die Verknüpfung heisst ebenfalls fff1. Das wäre mein erstes Problem.

Mein zweites, wahrscheinlich schwierigeres Problem lautet wie folgt. Ich möchte nun meine aus der XML ausgelesenen Inhalte natürlich ausgeben. Dazu habe ich im MC "inhalt" ein "dynamisches" Textfeld erstellt. Sind nun zwei Inhalte vorhanden (in der XML) sollen jeweils 4 Textfelder erstellt werden. Zwei Überschriften und Zwei Textinhalte - logisch. So wie ich es oben probiert habe, geht es leider nicht. Ich hoffe ihr könnt mir helfen... vielen vielen Dank im Voraus!

Gruß,
Florian
 
Hi,

ist "fff1" nun der Verknüpfungsbezeichner Deines Fonts wie Du sagst, oder nur der Name des Textformat-Objekts? In Deinem Code wird ein Font mit dem Bezeichner "fffBusiness" gewählt.

Zudem: Du erstellt mehrere Textfelder, gibts aber allen den selben Instanznamen - dadurch werden die Objektreferenzen überschrieben, so dass Du bestenfalls das zuletzt erstellte Textfeld adressierst.

Probier dann mal, die Methode "setTextFormat" nach der Zuweisung des Textinhaltes aufzurufen. Textformate für folgende Textänderungen werden mit "setNewTextFormat" gesetzt.

Gruß
.
 
Danke für deine Hilfe erstmal, stimmt das fffBusiness habe ich übersehen, das muss natürlich auch fff1 heissen - danke. Nun habe ich noch das Problem (wie du beschrieben hast), dass nur ein Textfeld ausgegeben wird... nämlich der letzte Inhalt (auch keine Überschrift). Denn dort steht nur "undefined". Wie kann ich nun die Bezeichner in der Schleife ändern?

Das geht ja schlecht:
_root.inhalt.createTextField("fUeberschrift"+i, 1+i, 10, 10+10*i, 600, 100);
_root.inhalt."fUeberschrift"+i.embedFonts = true;
_root.inhalt."fUeberschrift"+i.selectable = true;
(...)

Danke im Voraus,
Florian
 
Nein, aber das geht:
Code:
_root.inhalt.createTextField("fUeberschrift"+i, 1+i, 10, 10+10*i, 600, 100);
_root.inhalt["fUeberschrift"+i].embedFonts = true;
_root.inhalt["fUeberschrift"+i].selectable = true;

Gruß
.
 
Danke für den Tipp! Leider funktioniert es immernoch nicht ganz, nun zeigt er mir zwei undefined an. Selbst wenn ich in der schleife trace(Ueberschrift); oder trace(Ueberschrift[0]); ausgeben lasse. Hier nochmal zur Sicherheit der ganze Quellcode:

HTML:
		var fff1:TextFormat = new TextFormat();
			fff1.font = "fff1";
			fff1.size = 8;
		
		var XMLdaten = new XML(); //erstellt ein neues XML Objekt
		XMLdaten.ignoreWhite=true; // ignoriert die leerRäume (spaces) inder XML-file 
		
		//lädt die XML-file und "verhindert" das die Datei im Browsercache bleibt (sobald Die XML neu geladen wird):
		//?nocache=" + new Date().getTime() <- In der finalen Version wieder einbauen.
		XMLdaten.load("xml/inhalt.xml"); 
	
		// Abfrage (wenn laden erfolgreich war...):
		XMLdaten.onLoad = function(success) {
			// Die zu füllenden Variablen (Arrays):
			var Ueberschriften:Array = new Array();
			var Texte:Array = new Array();
			anzahlInhalte = XMLdaten.firstChild.childNodes.length; // Liest XML Elemente aus
			// Arrays mit den XML-Inhalten füllen:
				for (var i=0; i<anzahlInhalte; i++){
					Ueberschriften = XMLdaten.firstChild.childNodes[i].attributes.cmsUeberschrift; // Array füllen
					Texte = XMLdaten.firstChild.childNodes[i].attributes.cmsText; // Array füllen
				
					// Textfelder im "Inhalt" Movieclip erzeugen:
					trace(Ueberschrift);
					// Überschriften:
					_root.inhalt.createTextField("fUeberschrift"+i, 1+i, 10, 10+10*i, 600, 100);
					_root.inhalt["fUeberschrift"+i].embedFonts = true;
					_root.inhalt["fUeberschrift"+i].selectable = true;
					_root.inhalt["fUeberschrift"+i].text = Ueberschriften[i]; // Inhalt
					_root.inhalt["fUeberschrift"+i].setTextFormat(fff1);
					
					// Texte:
					_root.inhalt.createTextField("fText"+i, 1+i, 10, 30+10*i, 600, 100);
					_root.inhalt["fText"+i].embedFonts = true;
					_root.inhalt["fText"+i].selectable = true;
					_root.inhalt["fText"+i].text = Texte[i]; // Inhalt
					_root.inhalt["fText"+i].setTextFormat(fff1);
					}				
				
		stop();
		}
 
Hi,

Code:
Ueberschriften = XMLdaten.firstChild.childNodes[i].attributes.cmsUeberschrift; // Array füllen
Texte = XMLdaten.firstChild.childNodes[i].attributes.cmsText; // Array füllen
So kannst Du keine Arrays füllen. Wirf doch bitte mal einen Blick in die AS-Doku. ;)

Code:
Ueberschriften[i] = XMLdaten.firstChild.childNodes[i].attributes.cmsUeberschrift;
Texte[i] = XMLdaten.firstChild.childNodes[i].attributes.cmsText;
So ists korrekt.

Ausserdem gibst Du eine Variable namens "Ueberschrift" aus, Dein Array heisst aber "Ueberschriften".


Noch etwas: Ich halte es für sinnvoller, die Textfeldinstanzen in den Arrays abzulegen - es sollte ja genügen, wenn die Inhalte in den Textfeldern stehen und von dort ggf. wieder abgerufen werden. Zudem macht es keinen Sinn, die Texte aus dem XML-Objekt in ein lokales Array zu schreiben und von dort aus dann in die Textfelder.

Gruß
.
 
Danke Tobias, vllt. sollte ich erstmal einen Kaffee trinken und nochmal konzentriert drüber schauen, damit ich solche Schusselfehler vermeide.

Noch etwas: Ich halte es für sinnvoller, die Textfeldinstanzen in den Arrays abzulegen - es sollte ja genügen, wenn die Inhalte in den Textfeldern stehen und von dort ggf. wieder abgerufen werden. Zudem macht es keinen Sinn, die Texte aus dem XML-Objekt in ein lokales Array zu schreiben und von dort aus dann in die Textfelder.

Das habe ich noch nicht ganz verstanden. Momentan hole ich mir ja die Daten aus der XML und will sie dann in einem erstellten Textfeld ausgeben (wie du beschrieben hast). Dein Lösungsansatz wäre jetzt das Textfeld im Array zu erstellen und zusätzlich gleich die Inhalte dort zu füllen?
 
Zuletzt bearbeitet:
Ja, in etwa so:
Code:
for (var i=0; i<anzahlInhalte; i++){
    Ueberschriften[i] = _root.inhalt.createTextField("fUeberschrift"+i, 1+i, 10, 10+10*i, 600, 100);
    Ueberschriften[i].embedFonts = true;
    Ueberschriften[i].selectable = true;
    Ueberschriften[i].text = XMLdaten.firstChild.childNodes[i].attributes.cmsUeberschrift;
    Ueberschriften[i].setTextFormat(fff1);
					
    Texte[i] = _root.inhalt.createTextField("fText"+i, 1+i, 10, 30+10*i, 600, 100);
    Texte[i].embedFonts = true;
    Texte[i].selectable = true;
    Texte[i].text = XMLdaten.firstChild.childNodes[i].attributes.cmsText;
    Texte[i].setTextFormat(fff1);
}
Wobei Du die Arrays "Ueberschriften" und "Texte" besser als Zeitleistenvariablen (d.h. nicht in der onLoad-Methode des XML-Objekts) deklarieren solltest, damit Du auch später noch Zugriff darauf hast.

Gruß
.
 
Ich nochmal :)

Momentan wird mir nur ein Textfeld ausgegeben, ich denke es liegt an der "Ebene". Nun habe ich schon diverse Varianten ausprobiert und bin nun bei der Methode "getNextHighestDepth" gelanedt, allerdings will nichts helfen. Ich würde mich freuen wenn Du, oder ihr noch eine Idee habt.

Code:
		var fff1:TextFormat = new TextFormat();
			fff1.font = "fff1";
			fff1.size = 8;
		
		var XMLdaten = new XML(); //erstellt ein neues XML Objekt
		XMLdaten.ignoreWhite=true; // ignoriert die leerRäume (spaces) inder XML-file 
		
		// Die zu füllenden Variablen (Arrays):
		var Ueberschriften:Array = new Array();
		var Texte:Array = new Array();
		
		//lädt die XML-file und "verhindert" das die Datei im Browsercache bleibt (sobald Die XML neu geladen wird):
		//?nocache=" + new Date().getTime() <- In der finalen Version wieder einbauen.
		XMLdaten.load("xml/inhalt.xml"); 
	
		// Abfrage (wenn laden erfolgreich war...):
		XMLdaten.onLoad = function(success) {
			
			anzahlInhalte = XMLdaten.firstChild.childNodes.length; // Liest XML Elemente aus
			
			// Arrays mit den XML-Inhalten füllen:
			for (var i:Number = 0; i<anzahlInhalte; i++){
				
				Ueberschriften[i] = _root.inhalt.createTextField("fUeberschrift"+i, this.getNextHighestDepth(), 10, 1+10*i, 600, 100);
				Ueberschriften[i].embedFonts = true;
				Ueberschriften[i].selectable = true;
				Ueberschriften[i].text = XMLdaten.firstChild.childNodes[i].attributes.cmsUeberschrift;
				Ueberschriften[i].setTextFormat(fff1);
				
				Texte[i] = _root.inhalt.createTextField("fText"+i, this.getNextHighestDepth(), 10, 100+10*i, 600, 100);
				/*Texte[i].wordWrap = true; - Erzeugt einen automatischen Umbruch*/
				Texte[i].border = true; 
				Texte[i].autoSize = true;
				Texte[i].text = XMLdaten.firstChild.childNodes[i].attributes.cmsText;
				Texte[i].embedFonts = true;
				Texte[i].selectable = true;
				Texte[i].multiline = true;
				Texte[i].antiAliasType = "advanced";
				Texte[i].gridFitType = "pixel";
				Texte[i].sharpness = 5;
				Texte[i].setTextFormat(fff1);				
			}
		stop();
		}
 
Hallo,

wenn du in einer Funktion des XML-Objekts mit "this" referenzierst, ist damit das XML-Objekt selbst gemeint, folglich wird this.getNextHighestDepth() einen undefinierten Wert zurückgeben. Probier es mal mit _root.inhalt.getNextHighestDepth().

gruss
 
Zurück