Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-06-2005, 22:06   #1 (permalink)
Animateur
 
Benutzerbild von Master Wu
 
Registriert seit: Jan 2003
Ort: MZ
Beiträge: 1.536
Methode innerhalb der Klasse aufrufen?!

Ich bastel gerade an ner Portfolio-Navigation.
Ich hab also eine Klasse gebaut, die eine Arbeit zeigen soll.
In der Klasse baue ich einen Button (mcBar),
der onRelease die Funktion aufrufen soll, die dann das Bild groß darstellt.

Jetzt habe ich ein Problem, die Methode aufzurufen, weil ich ja in diesem Button drin bin, dachte schon an this._parent.createBla(), aber hat auch nicht geklappt.

Jemand ne Idee?

ActionScript:
  1. // PortBar Klasse -----------------------------------------------
  2. PortBar = function (xml, id) {
  3.     this.xml = xml;
  4.     this.id = id;
  5.    
  6.     //------------------------
  7.     this.createBar = function () {
  8.         _root.mcPort.createEmptyMovieClip ("mcBar"+id, 10+id);
  9.         this.mc = _root.mcPort["mcBar"+id];
  10.         this.mc.createEmptyMovieClip("mcGfx", 2);
  11.         mcGfx = this.mc.mcGfx;
  12.         // ThumbBar
  13.         mcGfx.drawRect (0, -13, 220, 13, 0x000000); //schwarz, oben
  14.        
  15.         mcGfx.onRelease = function() {
  16.                        // hier ist das Problem!
  17.             this.createContent(); //??
  18.         }
  19.         //
  20.     }
  21.  
  22.     // Methode
  23.     this.createContent = function () {
  24.         // hier passiert dann was
  25.     }
  26.  
  27.  
  28. }
  29. Port.prototype = new MovieClip ();
  30.  
  31. // action:
  32.     for (i=0; _root.pfCount>i; i++) {
  33.         xa = xmlCont.childNodes[0].childNodes[i].attributes;
  34.         _root["myPort"+i] = new PortBar(xa, i);
  35.         _root["myPort"+i].createBar();
  36.     }
__________________
there is no way to happiness, happiness is the way - flashgames

Geändert von Master Wu (11-06-2005 um 22:07 Uhr)
Master Wu ist offline   Mit Zitat antworten
Alt 12-06-2005, 10:45   #2 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
scope und delegation heißen die zauberwörter

ActionScript:
  1. class Delegate {
  2.    
  3.     public static function create( obj, func ) : Function {
  4.         var args : Array = arguments.splice(2);
  5.         return function(){
  6.             if( func instanceof Function )
  7.                 return func.apply( obj, arguments.concat( args ) );
  8.             else
  9.                 return obj[ func ].apply( obj, arguments.concat( args ) );
  10.         };
  11.     }
  12. }

anwednen tuste das ganze wie folgt

ActionScript:
  1. mcGfx.onRelease = Delegate.create( this, createContent ); // jeder weitere parameter wird an die methode mit übergeben
  2.  

ohne eine Delegate klasse verläßt nix mehr mein haus. Events werden einfach auf den klassen scope umgebogen und fertisch

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 12-06-2005, 11:30   #3 (permalink)
Animateur
 
Benutzerbild von Master Wu
 
Registriert seit: Jan 2003
Ort: MZ
Beiträge: 1.536
Danke schonmal,
leider versteh ich nur Bahnhof

Zum laufen hab ichs leider auch nicht gebracht und tu mich schwer mit der Fehlersuche, wenn ich nicht wirklich kapiere,
was da in Delegate.create überhaupt passiert

Bin schon in der ersten Zele verwirrt, was macht die?

var args : Array = arguments.splice(2);

was ist arguments?
wo kommt das überhaupt her?
sorry, bin nicht so der Pro
__________________
there is no way to happiness, happiness is the way - flashgames
Master Wu ist offline   Mit Zitat antworten
Alt 12-06-2005, 11:47   #4 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
arguments sind alle FunctionArguments also alle parameter einer function.
zB.

function test( arg1, arg2 ) {

}

arguments wäre also eine array bestehend aus Array( arg1, arg2 ).

Die delegate.create methode erstellt eine function die zurück gegeben wird
anstelle eine eigene function zu definieren. der erste parameter ist das object welches die aufzurufende methode handhabt in diesem fall also this (Delegate.create( this, myCallback ); ) der 2 parameter ist die callbackmethode in diesem fall wäre es createContent.

Was ich auch verafft habe ist das du ja AS1 klassen machst in einer komischen schreibweiße . anstatt das delegate zu nuzten versuch folgendes

ActionScript:
  1. var scope = this;
  2. mcGfx.onRelease = function() {
  3.                         // hier ist das Problem!
  4.                         scope .createContent(); //??
  5.                 }


das sollte nun aber klappen.

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 12-06-2005, 12:23   #5 (permalink)
Animateur
 
Benutzerbild von Master Wu
 
Registriert seit: Jan 2003
Ort: MZ
Beiträge: 1.536
Zitat:
Zitat von atothek
das du ja AS1 klassen machst in einer komischen schreibweiße
hmmja, ich wurschtel so rum

Die scope-Sache funktioniert ... mann, da hätt ich aber auch mal selber drauf kommen können ...

Vielen Dank!

Die andere Sache muss ich mir nochmal gaanz genau anschauen, damit ich das raff
__________________
there is no way to happiness, happiness is the way - flashgames
Master Wu ist offline   Mit Zitat antworten
Alt 12-06-2005, 13:44   #6 (permalink)
poke
 
Registriert seit: Dec 2002
Ort: Iserlohn [NRW]
Beiträge: 2.304
benutz die Flash-eigene Delegate Klasse dafür.

schreib oben vor deine klassendefinition:

ActionScript:
  1. import mx.utils.Delegate

und ändere den aufruf in:

ActionScript:
  1. mcGfx.onRelease = Delegate.create( this, createContent );
pokepika ist offline   Mit Zitat antworten
Alt 12-06-2005, 15:05   #7 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
@pokepika warum???

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 12-06-2005, 16:24   #8 (permalink)
poke
 
Registriert seit: Dec 2002
Ort: Iserlohn [NRW]
Beiträge: 2.304
weil man dann nicht erst noch ne eigene Klasse schreiben muss..

Warum das Rad neu erfinden? (oder wie war das ^^)
pokepika ist offline   Mit Zitat antworten
Alt 12-06-2005, 18:40   #9 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
tja da sage ich nicht neu erfinden aber rund machen
versuch mal parameter mit der mx Delegate klasse mit zu übergeben

ActionScript:
  1. import mx.utils.Delegate;
  2.  
  3. bla = {};
  4. bla.onTest = function( arg1 ) {
  5.     trace( "onTest: " + arg1 );
  6. }
  7.  
  8. mc.onPress = Delegate.create( bla, bla.onTest, "testParam" );

das geht in die hose und ist eigentlich nen notwendiges feature

mfg
alex
__________________
TVNEXT Solutions

Geändert von atothek (12-06-2005 um 18:41 Uhr)
atothek ist offline   Mit Zitat antworten
Alt 12-06-2005, 19:22   #10 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
jo die parameterbeschränkung suckt ziemlich bei delegate..deshalb benuz ich mittlerweile eigentlich immer diese klasse
http://www.person13.com/articles/proxy/Proxy.htm
da ist das mit dem parameter übergeben kein problem - und durch die gleiche syntax ist die verwendung auch ziemlich einfach finde ich

Gruss nky
nky ist offline   Mit Zitat antworten
Alt 12-06-2005, 19:34   #11 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
hey marcel alter haudegen

jau im allgemenen ist der name besser Proxy drückt das ja auch besser aus als
Delegate. da ja eine Stellvetretermethode erzeugt wird

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 12-06-2005, 19:55   #12 (permalink)
poke
 
Registriert seit: Dec 2002
Ort: Iserlohn [NRW]
Beiträge: 2.304
@atothek: ah, jo stimmt.
hab jetzt ne erweiterung geschrieben, die das Problem behebt

Proxy Klasse? guck ich mir mal an
pokepika ist offline   Mit Zitat antworten
Alt 15-06-2005, 22:23   #13 (permalink)
web-addict
 
Registriert seit: Jun 2005
Ort: beautiful south
Beiträge: 36
=)

@atothek: feines ding dein delegate. versuch da grad durchzusteigen, vielleicht
kannst/magst du mir ein wenig helfen?

ich hab mir auch das (besser kommentierte) proxy-beispiel angeschaut und mir
is schon einigermassen klar was das ganze überhaupt macht und soll. ich würd
nur gern verstehen was genau in deinem code passiert.

dazu nehm ich ihn mal ein wenig auseinander:
... sorry wegen der scrollerei *schäm*

ActionScript:
  1. class Delegate {
  2.        
  3.         public static function create( obj, func ) : Function {     // <-- obj & func typisieren? naja, is kosmetik, durch die namen ja klar.
  4.                 var args : Array = arguments.splice(2);             // <-- warum splice? das fügt doch eigentlich elemente ein und braucht mehr args, oder? meinst du vielleicht slice?
  5.                 return function(){                                  // <-- ok, das is ein netter hack, dachte man muss erst die funktion anlegen, ihr was zuweisen und dann zurückgeben, aber wenn as das auch rückwärts kann... why not.
  6.                         if( func instanceof Function )              // <-- ??? schaust du nach ob das ne funktion im lokalen scope ist?
  7.                         return func.apply( obj, arguments.concat( args ) );   // <-- arguments sollte eigentlich leer sein bis hierhin, oder? dann werden einfach nur die params angehängt?
  8.                         else
  9.                         return obj[ func ].apply( obj, arguments.concat( args ) );   // <-- ??? wenn nicht lokal dann auf das zielobjekt angewandt?was wenn obj keine passende func hat? warum wird obj wieder übergeben? ist das dann logisch ein 'this'???
  10.                 };
  11.         }
  12. }


danke fürs erklären...

Geändert von antiplex (15-06-2005 um 22:25 Uhr)
antiplex ist offline   Mit Zitat antworten
Alt 15-06-2005, 23:29   #14 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
ich versuche das mal...

ActionScript:
  1. class Delegate {
  2.        
  3.         public static function create( obj, func ) : Function {     // die Typen sind nicht bekannt, obj kann irgendeine Instanz sein, func ist entweder eine Funktion, oder ein String (Unterscheidung später mit typeof)
  4.                 var args : Array = arguments.splice(2);             // die ersten 2 Parameter sind obj und func, es geht aber nur um die (wenn es welche gibt) anderen
  5.                 return function(){                                  // das ist kein Hack, der Trick ist nur, dass die lokalen Variablen obj und func in dieser Funktion später verfügbar sind! (heißt glaube ich "closure")
  6.                         if( func instanceof Function )              // func entweder eine Funktion oder ein Methodenname
  7.                         return func.apply( obj, arguments.concat( args ) );   // arguments sind die Argumente, die beim eigentlichen Aufruf übergeben werden, args sind die Argumente die beim Delegate-Erstellen nach func und obj übergeben wurden
  8.                         else
  9.                         return obj[ func ].apply( obj, arguments.concat( args ) );   // die Funktion wird immer auf obj angewendet (s. Hilfe zu apply) diesmal allerdings wenn func ein String war
  10.                 };
  11.         }
  12. }

Hoffe ich konnte zur Klärung beitragen...
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 16-06-2005, 00:42   #15 (permalink)
web-addict
 
Registriert seit: Jun 2005
Ort: beautiful south
Beiträge: 36
ok, danke für den versuch, aber ich glaube wir reden aneinander vorbei oder ich
bin zu doof...

in meiner ersten comment zeile meinte ich, dass es doch eigentlich obj:Object
und func:Function ist. dass nicht feststeht ist, was für ein objekt ist klar.

zweite commentzeile: mit myarray1:Array = myarray2.spline(2, 0 , "hinzu1", "hinzu2");
dachte ich füge ich zu myarray2 an stelle 2 die werte "hinzu1" und "hinzu2" zu
ohne welche darin enthaltenen zu löschen (durch die '0'). anschliessend wird das
gesamte ergebnis einfach an myarray1 übergeben.

dritte zeile: ok, hack war im sinne der bücherserie '... hacks' gemeint. das proxy
beispiel machts andersrum, was mir auf den ersten blick einleuchtender erschien.

vierte zeile: was meinst du mit funktion/methodenname? dasselbe? oder meinst
du mit methoden functions von objekten und mit funktion functions auf
framecode-ebene? hmmm... vielleicht liegt hier mein denkfehler, ich geh mal
davon aus dass man an create für func eigentlich immer nur strings übergibt
die dann halt auf die tatsächlichen functions mappen...

fünfte zeile: das war mir soweit klar, allerdings wurde die funktion doch erst
erzeugt/zusammengebaut und daher ist der arguments array doch noch leer,
oder? naja, dann werden die übergebenen parameter reingehängt... klar.

letzte commentzeile: die hilfe hab ich gelesen =) anwendung auf objekt is klar,
rest siehe vierte zeile... den unterschied blick ich nicht...

sorry... da wills mal wieder einer genau wissen...
antiplex 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



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele