Funktionen und Variablen in Klassen

nijes

Grünschnabel
Dieses Thema bereitet mir nach leider wie vor gewisse Probleme in ActionScript, es geht um folgendes:

Ich habe eine Klasse, welche eine Instanz von einem Objekt erstellt.
In dieser Klasse wird zudem eine weitere Klasse aufgerufen, zum einfaden des Objektes - wenn dies erfolgt ist, wird eine Callback-Funktion aufgerufen, diese Funktion befindet sich ebenfalls in der Klasse, welches die Instanz erstellt, die hierfür relevanten Funktionen:

Gallery.as - Daten aus XML File werden geladen und per Funktion in der Klasse einer statischen Variable zugewissen
Code:
	static var linkID:Number = 0;
	private var masterTarget:MovieClip;
	
	static var dataXML:XML;
	private var links:MovieClip;
	static var artworks:Array

public function Gallery()
	{
		
		links = this.createEmptyMovieClip("linkContainer_mc", 0);
		
		var mc:Function = gatherData;
		var masterTarget:Gallery = this;
		dataXML = new XML;
		dataXML.ignoreWhite = true;
		dataXML.onLoad = function (b:Boolean)
		{
			if (b) 
			{
				trace("hoffe das ist nur einer hier");
				var artworks:Array = this.firstChild.childNodes;
				masterTarget.setVars(artworks);
			}
		};
		dataXML.load ("gallery.xml");
		
	}

Code:
public function setVars(a:Array)
	{
		artworks = a;
		gatherData();
	}

Gallery.as - Funktion zum herausfiltern der einzelnen Daten der XML und aufruf zur Funktion createLink
Code:
	public function gatherData()
	{

		var date:Number = artworks[linkID].attributes["date"];
		var file:String = artworks[linkID].attributes["file"];
		var desc:String = artworks[linkID].childNodes;

		if(linkID <= artworks.length - 1) createLink(date, file, desc);trace(createLink());
		
	}

Gallery.as - Erstellen und einfaden der Instanz

Code:
	public function createLink(date:Number, file:String, desc:String)
	{		
		trace(linkID);
		var linkPath:MovieClip = links.attachMovie("Link", "link"+linkID, linkID);
		linkPath._alpha = 0;
		linkPath._y = 15 * linkID;
		
		var linkAction = new Action(linkPath);	
		++linkID
		
		linkAction.useFade(100, gatherData)	
	}

Action.as - ausführen des Fades und bei fertigstellung Aufruf der Callback Funktion
Code:
	public function useFade (n:Number, _cb:Function) 
	{		
		var c:MovieClip = master.createEmptyMovieClip("fadeFunction", 9901);
		var alpha:Number = master._alpha;
		master.fadeFunction.onEnterFrame = function () 
		{
			var master:MovieClip = this._parent;
			alpha += (n - alpha) / 5;
			master._alpha = alpha;
			if (master._alpha >= n - 1 && master._alpha <= n + 1) 
			{
				master._alpha = n;
				_cb();
				
				this.removeMovieClip();
			}
		};
	}

Am Ende scheint jede Auslesung und Verarbeitung der Variablen fehlzuschlagen.
Bei dem 2. Ausführen des Ablaufes, wird mir für den trace "trace(createLink())", "undefined" zurückgegeben, somit scheint er diese Funktion nichteinmalmehr zu finden. Sehr nervig das ganze.

Habe schon verschiedene Ausführungen ausprobiert, nichts hat geklappt...

PS: Sollte jemand gute Fachlektüre über pure OOP bei ActionScript kennen, immer her damit. Die Lektüren, welche ich bisher habe, kratzen das Thema leider nur immer sehr Oberflächlich ein.

Ich wäre zudem sehr dankbar für einfache Snippets aus komplexeren Klassen, damit müsste ich hier nicht andauernt irgendwelchen Leute mit meinen fragen belästigen :p und ich könnte es einfach mal studieren, wie man Klassen vorzugsweiße aufbaut.
 
Hi,

nach dem ersten Drüberschauen:
Code:
if(linkID <= artworks.length - 1) createLink(date, file, desc);trace(createLink());
Was willst Du mit trace(createLink()) bezwecken? Die Methode "createLink" gibt keinen Wert zurück, daher kann die Ausgabe nur "undefined" sein. Zudem erwartet die Methode 3 Parameter (wie im vorherigen Aufruf).

Gruß
.
 
Nach meiner Erfahrung sollte ich [type Function] als Rückgabewert erhalten, was ich im ersten Durchlauf auch tue.

Anscheinend übersehe ich gerade etwas, es werden doch immer 3 Parameter übergeben?
 
Hi,

wenn Du eine Funktion mit abschließenden Klammern () aufrufst, wird die Funktion ausgeführt und Du bekommst bestenfalls ihren Rückgabewert. Willst Du den Typ des Objekts ausgeben, lass die Klammern weg:
Code:
trace(createLink);

Anscheinend übersehe ich gerade etwas, es werden doch immer 3 Parameter übergeben?
Das bezog sich auf den Aufruf in der trace-Aktion. ;)

Mit Deiner Zeile rufst Du die Methode zweimal hintereinander auf: Einmal mit allen Parametern, und einmal ohne, wobei Du versuchst, ihren Rückgabewert auszugeben.

Gruß
.
 
Das mit den Klammern war mir neu, danke schonmal für die Aufklärung diesbezüglich ;)

Code:
		if(linkID <= artworks.childNodes - 1) createLink(date, file, desc); trace(createLink);

So sieht es nun aus (habe das Array noch in XMLNodes umgewandelt) - aber getraced bekomme ich folgendes:

(trace(createLink) ist derzeit das einzige, was getraced wird)
Code:
[type Function]
undefined
 
Hi,

ich vermute, beim Aufruf der Callback-Funktion in der Methode "useFade" geht die Referenz auf die ursprüngliche Klasseninstanz verloren. Probier mal folgendes:
Code:
// Methode createLink in der Gallery.as:
linkAction.useFade(100, gatherData, this); // Referenz auf diese Instanz mitgeben
Code:
// Methode useFade in der Action.as:
public function useFade (n:Number, _cb:Function, _tgt:Gallery) { // Gallery-Klasse mugg ggf. inkludiert werden
...
_tgt._cb(); // Callback-Methode als Member der Originalinstanz ausführen

Sollte das Problem nach wie vor auftreten, kann ich das Ding mal direkt testen - es wäre hilfreich, wenn Du mir in diesem Fall alle beteiligten Dateien, die zum Testbetrieb nötig sind (auch die xml-Datei) als Anhang mitschicken könntest.

Gruß
,
 
Letzte Korrekturfrage, wenn das nicht klappt, werde ich dein Angebot dankend annehmen..

Alles sieht nun wie folgt aus:
Code:
linkAction.useFade(100, gatherData, this)

Code:
	public function useFade (n:Number, _cb:Function, _tgt:Gallery) 	
        [...]
        _tgt._cb();

Allerdings tritt ein Fehler dabei auf:
Code:
**Fehler** C:\Dokumente und Einstellungen\[...]Action.as: Zeile 110: Keine Methode mit dem Namen '_cb' vorhanden.
     				_tgt._cb();

Anzahl der ActionScript-Fehler: 1 	 Gemeldete Fehler: 1

Wäre es eine normale Variable, wüsste ich mir schon zu helfen, bei einer Funktion jedoch nicht.
 
Grmpf - hätt' ich mir eigentlich denken können. :eek:

Probiers mal so:
Code:
var fn:Function = _tgt[_cb];
fn();

Gruß
.
 
Will bei mir wohl nichts werden.
Ich habe im Anhang einmal eine .zip mit den Verwendeten Klassen - die hierfür relevanten sind jedoch einzig und alleine Action.as und Gallery.as

Danke für diese Hilfe!
 

Anhänge

  • projekt.zip
    11,7 KB · Aufrufe: 12
Hi,

ich muss mich korrigieren - der Funktionsname sollte als String übergeben werden:
Code:
linkAction.useFade(100, "gatherData", this);
Code:
      public function useFade (n:Number, _cb:String, _tgt:Gallery)  {
      _tgt[_cb](); 
}
:-( (getestet)

Gruß
,
 
Zurück