tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
431
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    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 actionscript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
        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 actionscript:
    1
    2
    3
    4
    5
    
    public function setVars(a:Array)
        {
            artworks = a;
            gatherData();
        }

    Gallery.as - Funktion zum herausfiltern der einzelnen Daten der XML und aufruf zur Funktion createLink
    Code actionscript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
        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 actionscript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
        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 actionscript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
        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 und ich könnte es einfach mal studieren, wie man Klassen vorzugsweiße aufbaut.
     

  2. #2
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    Hi,

    nach dem ersten Drüberschauen:
    Code actionscript:
    1
    
    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ß
    .
     

  3. #3
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    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?
     

  4. #4
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    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 :
    1
    
    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ß
    .
     

  5. #5
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Das mit den Klammern war mir neu, danke schonmal für die Aufklärung diesbezüglich

    Code actionscript:
    1
    
            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 actionscript:
    1
    2
    
    [type Function]
    undefined
     

  6. #6
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    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 actionscript:
    1
    2
    
    // Methode createLink in der Gallery.as:
    linkAction.useFade(100, gatherData, this); // Referenz auf diese Instanz mitgeben
    Code actionscript:
    1
    2
    3
    4
    
    // 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ß
    ,
     

  7. #7
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Letzte Korrekturfrage, wenn das nicht klappt, werde ich dein Angebot dankend annehmen..

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

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

    Allerdings tritt ein Fehler dabei auf:
    Code actionscript:
    1
    2
    3
    4
    
    **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.
     

  8. #8
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    Grmpf - hätt' ich mir eigentlich denken können.

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

    Gruß
    .
     

  9. #9
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    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!
    Angehängte Dateien Angehängte Dateien
     

  10. #10
    Registriert seit
    Mar 2004
    Ort
    Basisrealität
    Beiträge
    12.118
    Blog-Einträge
    7
    Hi,

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

    Gruß
    ,
     

  11. #11
    nijes nijes ist offline Mitglied
    Registriert seit
    Jun 2006
    Beiträge
    18
    Es tut immerhin gut zu wissen, das jeder sich mal irren kann

    Klappt nun soweit perfekt.Also nochmals herzlichen Dank!
     

Ähnliche Themen

  1. Frage zu Klassen und Funktionen
    Von tioz im Forum PHP
    Antworten: 3
    Letzter Beitrag: 28.01.08, 19:14
  2. VB6 - Klassen: Funktionen Private?
    Von nerddestroyer im Forum Visual Basic 6.0
    Antworten: 5
    Letzter Beitrag: 01.05.07, 21:03
  3. Klassen: Funktionen
    Von Sterpfi im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 15.03.05, 13:46
  4. PHP, Klassen und Funktionen
    Von pxlArtizzt im Forum PHP
    Antworten: 3
    Letzter Beitrag: 26.02.05, 00:56
  5. Klassen vs. Funktionen
    Von chris_sit im Forum PHP
    Antworten: 2
    Letzter Beitrag: 13.10.03, 13:04