• SpryFlashCMS das Flash CMS
  • Flash on the Beach 2010 in Brighton!
  • Adobe User Group
Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 18-12-2007, 08:51   #1 (Permalink)
Neuer User
 
Benutzerbild von bruce_wayne
 
Registriert seit: Nov 2005
Beiträge: 128
Delegates in Objekt abspeichern?

hallo,

tut mir leid wenn es schon einen beitrag zu diesem thema gibt, aber die suche nach "delegate" fördert doch ziemlich viele treffer zu tage.

ich mache es bisher so, dass ich meine delegates in verbindung mit eventListenern immer in klassenvariablen abspeichere, um sie später wieder sauber entfernen zu können. also so:

Code:
class Test
{
var btnRollOverDelegate: Object;

public function Test ()
{
btnRollOverDelegate = Delegate.create (this, btnRollOver);
}
irgendwo wird dann
Code:
someInstance.addEventListener ("rollOver", btnRollOverDelegate);
aufgerufen, und zum entfernen analog
Code:
someInstance.removeEventListener ("rollOver", btnRollOverDelegate);
das ist irgendwie echt umständlich. ich hatte mal gelesen, dass das der sicherste weg wäre, aber ist es wirklich nötig?
bruce_wayne ist offline   Mit Zitat antworten
Alt 18-12-2007, 09:50   #2 (Permalink)
mushroom powered
 
Benutzerbild von b.asile
 
Registriert seit: Jun 2005
Ort: Amsterdam
Beiträge: 2.647
Theoretisch kannst du auch:

PHP-Code:
someInstance.onRollOver Delegate.create(thisfunc); 
Aber mir persönlich liegt die Variante die du verwendest am meisten.
b.asile ist offline   Mit Zitat antworten
Alt 18-12-2007, 10:13   #3 (Permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Bis auf die Typisierung (das Delegate ist ne Function) ist das gut so, wie du es machst.

Ich hab mir auch schonmal Gedanken drüber gemacht, das einzige was mir einfiel war, dass sich die Delegate-Klasse selber um die von ihr erzeugten Delegates kümmern könnte, wenn du beim create noch ne ID übergibst.
Dann könnte die Anwendung so aussehen:
PHP-Code:
// erzeugen
component.addEventListener("event"Delegate.create(thismethodparams"myEventDelegate"));

// löschen
component.removeEventListener("event"Delegate.remove("myEventDelegate")); 
wobei dann die Delegate.remove Methode das Delegate aus einer statischen Map holt, den Eintrag in der Map löscht, und die Delegatefunktion zurückgibt.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 18-12-2007, 10:49   #4 (Permalink)
Neuer User
 
Benutzerbild von bruce_wayne
 
Registriert seit: Nov 2005
Beiträge: 128
danke für die antworten, das mit der typisierung ist natürlich gut zu wissen.

also belasse ich die delegate-objekte so, und schiele neidisch rüber zu AS3!

@janoscharlipp: hast du so eine erweiterte Delegate-klasse gerade zur hand, oder war das erstmal nur eine überlegung?
bruce_wayne ist offline   Mit Zitat antworten
Alt 18-12-2007, 11:09   #5 (Permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
War eigentlich mehr ne Überlegung, aber hier mal ein Ansatz, als Vorlage diente atotheks Delegate allerdings habe ich einige Änderungen vorgenommen:
* keine Übergabe von Strings für die Methode
* Parameter werden als Array und nicht als weitere Argumente übergeben
* Reihenfolge der Parameter vom Delegate vertauscht
PHP-Code:
class Delegate
{
    private static var 
delegateMap Object = new Object();
    
    public static function 
create(obj:Objectfunc:Function, params:Array, id:String) : Function
    {
        var 
delegate : Function = function() {
            return 
func.apply(objparams.concat(arguments));
        };
        
        if (
id != null) {
            if (
delegateMap[id] != null) {
                throw new 
Error("Delegate#create - there is already a Delegate for id '" id "'");
            } else {
                
delegateMap[id] = delegate;
            }
        }
        
        return 
delegate;
    }
    
    public static function 
remove(id:String) {
        var 
delegate : Function = delegateMap[id];
        
        if (
delegate == null) {
            throw new 
Error("Delegate#remove - there is no Delegate to remove for id '" id "'");
        } else {
            
delete delegateMap[id];
            
            return 
delegate;
        }
    }

Anwendung wäre dann
PHP-Code:
component.addEventListener("myEvent"Delegate.create(thismyMethod, ["myParameter"], "myId"));
// ...
component.removeEventListener("myEvent"Delegate.remove("myId")); 
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)

Geändert von Janoscharlipp (18-12-2007 um 11:11 Uhr)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 18-12-2007, 11:30   #6 (Permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
Man könnte es eigentlich auch so ähnlich wie AS3 machen, indem man einfach die Funktion eines Objekts durch einem Delegate ersetzt.

PHP-Code:
import mx.utils.Delegate;

class 
TestDelegates
{
    
    
    private var 
property String "test";
    
    public function 
TestDelegatesproperty String )
    {
        
this.property property;
        
        
initDelegates();
    }
    
    public function 
handleClickButton() : Void
    
{
        
trace("handleClickButton " property);
    }
    
    private function 
initDelegates() : Void
    
{
        
handleClickButton Delegate.createthishandleClickButton );
    }


Wenn du die handleClickButton jetzt als Listener benutzt, ist es automatisch ein Delegate.

PHP-Code:
btn1.addEventListener"click", new TestDelegates("eins").handleClickButton);
btn2.addEventListener"click", new TestDelegates("zwei").handleClickButton); 
mfg
hz
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 18-12-2007, 11:56   #7 (Permalink)
Neuer User
 
Benutzerbild von bruce_wayne
 
Registriert seit: Nov 2005
Beiträge: 128
@janoscharlipp: super, vielen dank! werde das gleich mal ausprobieren.

@hazy: danke, guter denkanstoss. wie würde dann entfernen des events aussehen, bzw. würde das hier funktionieren?
PHP-Code:
btn1.removeEventListener"click", new TestDelegates("eins").handleClickButton); 
bruce_wayne ist offline   Mit Zitat antworten
Alt 18-12-2007, 11:59   #8 (Permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Nähe Mainz
Beiträge: 10.753
Ich speichere übrigens auch in Variablen. Das Problem ist halt, dass bei
Delegate jedes Mal eine neu generierte Funktion zurückgeliefert wird und
diese natürlich nicht zugeordnert werden könnne.

Und das mit der ID finde ich weniger schön, deshalb bleibe ich bei meiner Variante

gruß
__________________
XING
sebastian ist offline   Mit Zitat antworten
Alt 18-12-2007, 12:00   #9 (Permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
Die Instanz von TestDelegates musst du dann schon irgendwo speichern.
Und dann einfach btn.removeListener("click", testDelegate.handleClickButton )

Man spart sich auf jeden Fall die zusätzlichen Variablen für jeden Delegate.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D

Geändert von hazy fantazy (18-12-2007 um 12:01 Uhr)
hazy fantazy ist offline   Mit Zitat antworten
Alt 18-12-2007, 12:02   #10 (Permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Ich glaube bei hazy fantazy würde das etwas anders aussehen.
Eher so, dass du deine Klasse hast, welche die Event-Methoden enthält, und die diese am Anfang durch die Delegates ersetzt. Dann kannst du diese Methoden einfach ganz normal verwenden, also
PHP-Code:
// ganz am Anfang
myEventMethod Delegate.create(thismyEventMethod);

// irgendwann
component.addEventListener("myEvent"myEventMethod);
// ... later
component.removeEventListener("myEvent"myEventMethod); 
EDIT: ups, zu spät
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 18-12-2007, 12:27   #11 (Permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Nähe Mainz
Beiträge: 10.753
Zitat:
Zitat von Janoscharlipp Beitrag anzeigen
Ich glaube bei hazy fantazy würde das etwas anders aussehen.
Eher so, dass du deine Klasse hast, welche die Event-Methoden enthält, und die diese am Anfang durch die Delegates ersetzt. Dann kannst du diese Methoden einfach ganz normal verwenden, also
PHP-Code:
// ganz am Anfang
myEventMethod Delegate.create(thismyEventMethod);

// irgendwann
component.addEventListener("myEvent"myEventMethod);
// ... later
component.removeEventListener("myEvent"myEventMethod); 
EDIT: ups, zu spät
Das ist doch die normale Variante von der Ausgangssituation?
__________________
XING
sebastian ist offline   Mit Zitat antworten
Alt 18-12-2007, 12:34   #12 (Permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
Der Unterschied ist, dass eine Funktion durch ihren Delegate ersetzt wird.

PHP-Code:
wichtigeFunktion createDelegatethiswichtigeFunktion ); 
Du brauchst dann keine extra Variable mehr für den Delegate
und die Nutzerklasse kann einfach die Eigenschaft selbst als
Listener benutzen und muss nicht mehr Delegate.create benutzen.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 18-12-2007, 12:36   #13 (Permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Nö, hier nochmal als Klasse, da wird es klarer:
PHP-Code:
import mx.controls.Button;
import mx.utils.Delegate;

class 
MyClass extends MovieClip {
    private var 
myButton Button;
    
    public function 
MyClass()
    {
        
initializeDelegates();
        
        
setListeners();
    }
    
    private function 
initializeDelegates() : Void
    
{
        
myEventFunction Delegate.create(thismyEventFunction);
    }
    
    private function 
setListeners() : Void
    
{
        
myButton.addEventListener("click"myEventFunction);
    }
    
    public function 
myEventFunction(event:Object) : Void
    
{
        
trace("CLICK - this: " this); // ergibt Instanz von MyClass
        
        
myButton.removeEventListener(myEventFunction);
    }

EDIT: schon wieder zu langsam, das wir hoffentlich nicht zur Gewohnheit
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)

Geändert von Janoscharlipp (18-12-2007 um 12:37 Uhr)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 18-12-2007, 12:44   #14 (Permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Nähe Mainz
Beiträge: 10.753
Ah stimmt, das ist echt eine gute Variante, auch wenn sie sicher nicht 100%ig sauber ist.

Meint ihr man sollte immer so vorgehen? Von der Anwendung ist es am Ende
ja eindeutig die schönere Variante.
__________________
XING
sebastian ist offline   Mit Zitat antworten
Alt 18-12-2007, 12:50   #15 (Permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
So richtige Nachteile kann ich auch nicht entdecken. Schön ist, dass sich die Klasse selbst versaut und nicht jemand anders
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy 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 17:38 Uhr.

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


Copyright ©1999 – 2010 Marc Thiele und Sascha Wolter.