Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 05-07-2010, 21:51   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Variable Funktionsnamen

Guten Abend zusammen.

Ich steh grad etwas auf dem Schlauch mit dem Erstellen von Funktionen mit variablen Namen.
Ich möchte mir gerne die Option offen lassen beliebig viele UILoader zu erstellen aber kann die Funktionsnamen nicht richtig vergeben:

PHP-Code:
function vorschauErstellen(){
    for(var 
i:int 0i<3i++){    // bisher nur 3 UILoader vorhanden
        
var loader:String "meinLoader";
        var 
funktion:String "onKlick"+i;
        
        
output_txt.text output_txt.text+"\n"+loader+i;    // weil mein Flash defekt ist...
        
        
this[loader+i].source vorschauBilder[i];
        
this[loader+i].addEventListener(MouseEvent.MOUSE_UP, [funktion]);
        function [
funktion](e:MouseEvent):void{
            
navigateToURL(new URLRequest(grosseBilder[i]));
        }
    }

Es hapert nur an dem [funktion]. Könnt mir da wer auf die Sprünge helfen? Danke schonmal
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 05-07-2010, 22:32   #2 (permalink)
Achim Math.PI
 
Benutzerbild von bloba
 
Registriert seit: Jul 2001
Ort: cool Colonia
Beiträge: 11.642
keine vars in der laufzeit erzeugen!!!

das war in as2 nicht anders
PHP-Code:
var loader:Array = new Array() 
var 
funktion:Array = new Array() 
var 
i:uint;

function 
vorschauErstellen(){ 
    for(
i0i<3i++){    // bisher nur 3 UILoader vorhanden 
        
loader[i] = "meinLoader"
        
funktion[i] = "onKlick"+i
         
       
// output_txt.text = output_txt.text+"\n"+loader[i]    // weil mein Flash defekt ist... 
         
        
this[loader[i]].source vorschauBilder[i]; 
        
this[loader[i]].addEventListener(MouseEvent.MOUSE_UP, [funktion]);
        
        
this[funktion[i]]=  function (e:MouseEvent):void
            
navigateToURL(new URLRequest(grosseBilder[i]));//wo immer die auch  
        

    } 

__________________
gruß bloba

2 x onkel² b_d
bloba ist offline   Mit Zitat antworten
Alt 06-07-2010, 16:34   #3 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Hmm, will nicht so recht?! Ich denke ich werde das als Klasse definieren. Aber grundsätzlich würde es mich trotzdem interessieren woran es hakt.

Edit: Hier bin ich glaub schonmal weiter gekommen:
PHP-Code:
function vorschauErstellen(){
    for(var 
i:int 0i<3i++){    // bisher nur 3 UILoader vorhanden
        
var loader:String "meinLoader";
        var 
funktionsName:Array = ["test1","test2","test3"];
        
        
output_txt.text output_txt.text+"\n"+loader+i;    // weil mein Flash defekt ist...
        
output_txt.text output_txt.text+"\n"+funktionsName[i];
        
        
this[loader+i].source vorschauBilder[i];
        
this[loader+i].addEventListener(MouseEvent.MOUSE_UPfunktionsName[i]);
        
this[funktionsName[i]] = function(e:MouseEvent):void{
            
navigateToURL(new URLRequest(grosseBilder[i]));
        }
    }

Ich vermute mal, dass es noch am funktionsaufruf hapert. Als Fehlermeldung gibts:
Zitat:
TypeError: Error #1034: Type Coercion failed: cannot convert "test1" to Function.
at pic_fla::MainTimeline/vorschauErstellen()[pic_fla.MainTimeline::frame1:106]
at Function/pic_fla:MainTimeline/onTest/pic_flanFertig()[pic_fla.MainTimeline::frame1:38]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
Ohne die Funktionszuweisung gibt mein "Trace" die werte eigentlich richtig aus?!
Zitat:
meinLoader0
test1
meinLoader1
test2
meinLoader2
test3
Das Array soll später dynamisch gefüllt werden.

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6

Geändert von dr monk (06-07-2010 um 17:08 Uhr) Grund: Ergänzung
dr monk ist offline   Mit Zitat antworten
Alt 06-07-2010, 17:07   #4 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Da fehlt noch das this vor den Funktionsnamen. Beispiel:
PHP-Code:
function huhu() {
    
trace("hallo");
}
var 
funk "huhu";
trace(funk);
this[funk]() 
...oder nicht?
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 06-07-2010, 20:05   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Code:
package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.net.navigateToURL;
    import flash.text.TextField;
    import flash.utils.Dictionary;

    public class HelloWorld extends Sprite
    {

        private var _images:Array;

        private var _loaders:Array;

        private var _thumbs:Array;

        public function HelloWorld()
        {
            initialize();
        }

        private function initialize():void
        {
            _images = [];
            _loaders = [];
            _thumbs = [];
        }

        private function createThumbNails(urls:Array):Array
        {
            var loader:UILoader;

            for (var i:int = 0; i < urls.length; i++)
            {
                if (_loaders.length <= i)
                {
                    _loaders[_loaders.length] = new UILoader();
                }

                loader = _loaders[i];
                loader.addEventListener(MouseEvent.MOUSE_UP, loader_mouseupHandler);
                loader.source = urls[i];
            }

            return _loaders;
        }

        private function loader_mouseupHandler(event:MouseEvent):void
        {
            var url:String = _images[_loaders.indexOf(event.currentTarget)];

            navigateToURL(new URLRequest((url)));
        }
    }
}
oder
Code:
package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.net.navigateToURL;
    import flash.text.TextField;
    import flash.utils.Dictionary;

    public class HelloWorld extends Sprite
    {

        private var _dict:Dictionary;

        private var _images:Array;

        private var _loaders:Array;

        private var _thumbs:Array;

        public function HelloWorld()
        {
            initialize();
        }

        private function initialize():void
        {
            _dict = new Dictionary();
            _images = [];
            _loaders = [];
            _thumbs = [];
        }

        private function createThumbNails():Array
        {
            var loader:UILoader;

            for (var i:int = 0; i < _thumbs.length; i++)
            {
                if (_loaders.length <= i)
                {
                    _loaders[_loaders.length] = new UILoader();
                }

                loader = _loaders[i];
                loader.addEventListener(MouseEvent.MOUSE_UP, loader_mouseupHandler);
                loader.source = urls[i];

                _dict[loader] = _images[i];
            }

            return _loaders;
        }

        private function loader_mouseupHandler(event:MouseEvent):void
        {
            var url:String = _dict[event.currentTarget];

            navigateToURL(new URLRequest((url)));
        }
    }
}
Erste Variante geht, wenn man beide Arrays kennt... die andere ist flexibler, falls es nur ein Array geben soll... oder wie auch immer.

Das mit den dynamischen Method closures könnte so aussehen, ist aber ungetestet und so was möchte man auch eigentlich nicht:
Code:
package
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.net.URLRequest;
    import flash.net.navigateToURL;
    import flash.text.TextField;
    import flash.utils.Dictionary;

    public class HelloWorld extends Sprite
    {

        private var _dict:Dictionary;

        private var _images:Array;

        private var _loaders:Array;

        private var _thumbs:Array;

        public function HelloWorld()
        {
            initialize();
        }

        private function initialize():void
        {
            _dict = new Dictionary();
            _images = [];
            _loaders = [];
            _thumbs = [];
        }

        private function createThumbNails():Array
        {
            var loader:UILoader;

            for (var i:int = 0; i < _thumbs.length; i++)
            {
                if (_loaders.length <= i)
                {
                    _loaders[_loaders.length] = new UILoader();
                }

                loader = _loaders[i];
                loader.addEventListener(MouseEvent.MOUSE_UP, function(event:MouseEvent):void
                {
                    var url:String = _images[i];

                    navigateToURL(new URLRequest((url)));
                });
                loader.source = urls[i];

                _dict[loader] = _images[i];
            }

            return _loaders;
        }
    }
}
Das sollte alles so grob passen.
Omega Psi ist offline   Mit Zitat antworten
Alt 06-07-2010, 20:10   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Was ich damit ausdrücken wollte, es geht auch einfacher...
Omega Psi ist offline   Mit Zitat antworten
Alt 07-07-2010, 08:25   #7 (permalink)
Neuer User
 
Registriert seit: Nov 2005
Beiträge: 548
Ich gehe davon aus, du hast die Loader nicht per Script erstellt (dann wäre ein Array natürlich das Beste) sondern ziehst Komponenten auf die Bühne und möchstest dazu komfortabel mehrere Listener anfügen? Sind die Namen meinLoader1 und co. dann wirklich Variablennamen? Oder nur Instanznamen die du auf der Bühne vergeben hast? Ist nämlich nicht dasselbe. Ich habs mal vorsichtshalber für letzteres umgeschrieben.
Außerdem reicht ein Eventhandler für alle. Von verschachtelten Funktionsdefinitionen rate ich generell ab.

Probiers mal so:
ActionScript:
  1. var ids:Dictionary=new Dictionary(true);//zum Speichern der ids passend zu den Loadern
  2.  
  3. function vorschauErstellen(){
  4.     var loader:String = "meinLoader";
  5.     for(var i:int = 0; i<3; i++){    // bisher nur 3 UILoader vorhanden
  6.         //falls du tatsächlich Variablennamen vergeben hast:
  7.         //var meinLoader:UILoader=this[loader+i];
  8.         //oder falls du nur Instanznamen auf der Bühne vergeben hast, das ist nämlich was anderes:
  9.         var meinLoader:UILoader=this.getChildByName(loader+i);
  10.         meinLoader.source = vorschauBilder[i];
  11.         meinLoader.addEventListener(MouseEvent.MOUSE_UP,onKlick);
  12.         ids[meinLoader]=i;//hier die id passend zum Objekt speichern, dem der Listener angehängt wird
  13.     }
  14. }
  15.  
  16. //du brauchst nur einen Handler für alle
  17. function onKlick(e:MouseEvent):void{
  18.     //e.target liefert das Objekt das das Event ausgelöst hat
  19.     var i:int=ids[e.target];//hier die id des Objekts auslesen, dem der Listener angehängt wurde
  20.     navigateToURL(new URLRequest(grosseBilder[i]));
  21. }
joeydee ist offline   Mit Zitat antworten
Alt 07-07-2010, 09:04   #8 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Danke erstmal für eure Antworten. Werde das gleich nach meiner Arbeit heute Abend testen. Ich habe so das gefühl, dass es jetzt klappen könnte

Ich meld mich dann nochmal kurz falls es geklappt hat

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 07-07-2010, 19:40   #9 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Ich bekomm´s einfach nicht hin... Ich bin mir fast sicher, dass es bei mir an der deklarierung der Funktion liegt.
Die Instanznamen der erzeugten UILoader sind immer andere als deren Listener.

Wenn ich es bloß schaffen würde die Eventlistener in ein Array zu schreiben um damit die URLs zu laden

Grundsätzlich passt es bei mir ja fast immer. Nur der doofe Funktionsaufruf macht immer einen Strich durch die Rechnung (aus diesem Grund hatte ich ja auch anfänglich versucht einen variablen Funktionsnamen zu erstellen).

Hier mal mein Programm was fast funktioniert... und das seit einigen Stunden... arghh... das macht es mit absicht...

PHP-Code:
import flash.events.MouseEvent;
import fl.containers.UILoader;
import flash.net.URLLoader;

var 
vorschauBilder:Array = [];
var 
grosseBilder:Array = [];

var 
versatzX:int 100;
var 
versatzY:int 0;

var 
ids:Array = [];

function 
vorschauErstellen() {

    var 
loader:String "meinLoader";
    for (var 
i:int 0i<12i++) {// 12 UILoader sollen erstellt werden
        
        
var bild:UILoader=new UILoader(); 
        
        
bild.source vorschauBilder[i];        
        
        if (
versatzX 300) {
            
bild.versatzX;
            
bild.versatzY;
            
versatzX +=  150;// damit die Bilder nicht aufeinander liegen 
        
}
        else {
            
bild.versatzY;
            
bild.versatzX;
            
versatzX 100;
            
versatzY +=  150;
        }
        
        
        
loader "loader"+i;
        
bild.name loader;
        
ids.push(bild);
        
bild.addEventListener(MouseEvent.MOUSE_UP,onKlick);
        
        
output_txt.text output_txt.text+"\n"+ids[i].name;
        
        
stage.addChild(bild);
    }
}

function 
onKlick(e:MouseEvent):void
    var 
nummer:int ids.indexOf(e.target.name);    // ist eine andere als bild.name
    
output_txt.text output_txt.text+"\n"+grosseBilder[nummer];    // Trace geht bei mir nicht...
    //navigateToURL(new URLRequest(grosseBilder[nummer]));

An den Bilder-Arrays liegt´s bei mi nicht. Dort sind 20 Einträge vorhanden.

Vielleicht weiß wer wie man der Funktion einen Wert mitgeben kann. Und nochmal danke für den Code den ihr gepostet habt. Ich weiß es sehr zu schätzen.

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Alt 07-07-2010, 21:56   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Ein vereinfachtes Beispiel...
Code:
<thumbs>
    <thumbs target="images/image.jpg" url="thumbs/image.jpg" />
</thumbs>
Code:
package
{
    import flash.display.DisplayObject;
    import flash.display.Graphics;
    import flash.display.Sprite;
    import flash.errors.IOError;
    import flash.events.Event;
    import flash.events.IEventDispatcher;
    import flash.events.MouseEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.utils.Dictionary;

    public class HelloWorld extends Sprite
    {

        private var _dict:Dictionary;

        private var _thumbs:Array /* of flash.display.Loader */;

        private var _urlLoader:URLLoader;

        public function HelloWorld()
        {
            initialize("data.xml");
        }

        private function initialize(url:String):void
        {
            _dict = new Dictionary();
            _urlLoader = new URLLoader();
            _urlLoader.addEventListener(Event.COMPLETE, urlLoader_completeHandler)
            _urlLoader.load(new URLRequest(url));
        }

        private function urlLoader_completeHandler(event:Event):void
        {
            IEventDispatcher(event.target).removeEventListener(event.type, arguments.callee);

            var xml:XML = new XML(_urlLoader.data);
            _urlLoader = null;

            parseList(xml.children());
        }

        private function parseList(list:XMLList):void
        {
            _thumbs = [];

            for each(var item:XML in list)
            {
                _thumbs[_thumbs.length] = addChild(parseItem(item));
            }
        }

        private function parseItem(item:XML):DisplayObject
        {
            var target:String = item.@target;
            var url:String = item.@url;

//            var loader:Loader = new Loader();
//            loader.addEventListener(MouseEvent.CLICK, loader_clickHandler);
//            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_completeHandler);
//            loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loader_eventHandler);
//            loader.load(new URLRequest(url));

            /*
             * Replace with real loader.
             */
            var loader:Sprite = new Sprite();
            loader.addEventListener(MouseEvent.CLICK, loader_clickHandler);
            draw(loader.graphics);
            _dict[loader] = target;

            return loader;
        }

        private function draw(graphics:Graphics):void
        {
            graphics.clear();
            graphics.beginFill(0);
            graphics.drawRect(0, 0, 10, 10);
            graphics.endFill();
        }

        private function loader_completeHandler(event:Event):void
        {
        }

        private function loader_eventHandler(event:IOError):void
        {
        }

        private function loader_clickHandler(event:MouseEvent):void
        {
            trace(_dict[event.currentTarget]);
        }
    }
}
Funktioniert mit dem Klicken wie erwartet.
Omega Psi ist offline   Mit Zitat antworten
Alt 08-07-2010, 15:55   #11 (permalink)
Neuer User
 
Registriert seit: Sep 2006
Beiträge: 620
Thumbs up Geschafft!

Das Dictionary war genau das was ich brauchte. Endlich klappt das kleine Skript das mich Stunden lang geärgert hat. Werd es mir gleich mal in mein Wiki schreiben damit ich es nicht wieder vergesse

@ Omega Psi: Danke nochmal für deinen Code! Mein Programmierstiel ist wahrscheinlich nicht so optimal aber ich lerne ja immernoch dazu

Und hier mal das gute Stück (Bild-Arrays müssen selbst gefüllt werden)

PHP-Code:
import flash.events.MouseEvent;
import fl.containers.UILoader;
import flash.net.URLLoader;
import flash.utils.Dictionary;

var 
vorschauBilder:Array = [];
var 
grosseBilder:Array = [];

var 
versatzX:int 100;
var 
versatzY:int 0;

var 
_dict:Dictionary = new Dictionary();

function 
vorschauErstellen() {

    for (var 
i:int 0i<12i++) {// 12 UILoader sollen erstellt werden
        
        
var bild:UILoader=new UILoader(); 
        
        
bild.source vorschauBilder[i];        
        
        if (
versatzX 300) {
            
bild.versatzX;
            
bild.versatzY;
            
versatzX +=  150;// damit die Bilder nicht aufeinander liegen 
        
}
        else {
            
bild.versatzY;
            
bild.versatzX;
            
versatzX 100;
            
versatzY +=  150;
        }
        
        
        
        
bild.addEventListener(MouseEvent.MOUSE_UP,onKlick);
         
_dict[bild] = grosseBilder[i];
        
        
stage.addChild(bild);    // fügt neuen UILoader der Bühne hinzu
    
}
}

function 
onKlick(e:MouseEvent):void
    
navigateToURL(new URLRequest(_dict[e.currentTarget]));

MfG Monk
__________________
Flash CS5 / Flex 3 / Flashdevelop / FB 4.6
dr monk ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Funktionsnamen in Array speichern chrissy810 ActionScript 3 2 11-09-2009 12:08
[Flash CS4] problem mit Funktionsnamen Prinz_Martin Flash Einsteiger 8 06-01-2009 16:58
Variablen Funktionsnamen aufrufen Hasch2o ActionScript 1 2 23-04-2007 15:20
Funktionsnamen aus Variabler zusammensetzen... Morty ActionScript 1 7 09-12-2003 22:34
kann man funktionsnamen konkatinieren? mole PHP und MySQL 4 06-06-2003 16:57


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele