Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-05-2009, 23:20   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2005
Beiträge: 53
Listener Funktion ohne Listener ausführen

Hallo,

wie so viele, fange ich jetzt auch an in AS 3.0 zu arbeiten, nachdem ich mich in 2.0 ganz gut auskenne.

Ich habe bisher schon verstanden, dass man für eigentlich alles Listener verwendet und das funktioniert auch. Jetzt aber meine Frage:
Wenn ich bei einem Knopf mit einem Listener ein CLICK abfrage und dann meine Funktion ausführe, ist es dann auch irgendwie möglich, diese Funktion von einer anderen Funktion ausführen zu lassen? Das Problem ist ja, dass ich theoretisch den MouseEvent.CLICK mitgeben müsste.

Code:
first_level.erlebnis.icon.addEventListener(MouseEvent.MOUSE_DOWN, setup_erlebnis);

function setup_erlebnis(evt:MouseEvent):void{
trace("Funktion ausgeführt");
}

setup_erlebnis;
Geht das nicht irgendwie? Sonst müsste ich die gesamte Funktion (natürlich mehr inhalt als hier im Beispiel) kopieren und als generelle Funktion verfügbar machen, hätte somit also unnötige Dopplungen im Code.

Vielen Dank schonmal!
Sebbal ist offline   Mit Zitat antworten
Alt 07-05-2009, 23:23   #2 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
du kannst die events auch manuell dispatchen..
such mal nach manually dispatch event bei google.

sorry weiss grad aussem kopf nicht wies geht

gruß
nky
nky ist offline   Mit Zitat antworten
Alt 07-05-2009, 23:31   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2005
Beiträge: 53
Danke

Super, danke...all meine Google Sucheingaben brachten keine Lösung, aber deine war super ;-)

Für alle die es interessiert:
Code:
first_level.erlebnis.icon.addEventListener(MouseEvent.MOUSE_DOWN, setup_erlebnis);

function setup_erlebnis(evt:MouseEvent):void{
trace("Funktion ausgeführt");
}

setup_erlebnis(new MouseEvent(MouseEvent.CLICK));
Man tut einfach so, als hätte es einen MouseEvent gegeben. Klasse!
Sebbal ist offline   Mit Zitat antworten
Alt 07-05-2009, 23:48   #4 (permalink)
.
 
Registriert seit: May 2003
Ort: bayern
Beiträge: 1.117
du kannst auch einfach schreiben:
PHP-Code:
setup_erlebnis(null); 
__________________
[mooseMash]
mooseMash ist offline   Mit Zitat antworten
Alt 07-05-2009, 23:50   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2005
Beiträge: 53
Thumbs up

stimmt, das geht auch :-) viel einfacher.... Danke
Sebbal ist offline   Mit Zitat antworten
Alt 09-05-2009, 00:18   #6 (permalink)
nky
Bontempi Punk
 
Benutzerbild von nky
 
Registriert seit: Dec 2001
Ort: Dtld/Pfalz
Beiträge: 4.185
cool das ist logisch, war mir aber irgendwie nie bewusst thx !
nky ist offline   Mit Zitat antworten
Alt 09-05-2009, 19:37   #7 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
eine etwas bessere Lösung wäre, den Event Parameter in der Funktion optional zu machen
ActionScript:
  1. function setup_erlebnis(evt:MouseEvent=null):void{
  2. trace("Funktion ausgeführt");
  3. }
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 09-05-2009, 20:10   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Eine noch besserere Lösung:
ActionScript:
  1. someMagic();
  2.  
  3. function eventListener(event:Event):void
  4. {
  5.     someMagic();
  6. }
  7.  
  8. function someMagic():void
  9. {
  10.     trace("Some magic happens here");
  11. }
Omega Psi ist offline   Mit Zitat antworten
Alt 09-05-2009, 20:13   #9 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Und warum ist das noch besser? Sieht so erstmal umständlicher aus als =null
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 09-05-2009, 20:22   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Es ist besser weil Eventlistener bestimmte Typen von Funktionen sind. Sie werden quasi in den Scope der registrierenden Klasse übernommen, so das die IEventDispatcher Instanzen die Funktionen direkt aufrufen können. Da die Klassen nun direkte Kontrolle über die Funktionen haben, obwohl sie ihnen nicht gehören ist es im Hinblick der Kaspelung besser/sauberer die entsprechenden Funktionen nur als definierte Schnittstellen zu verwenden für Kommunikationen mit anderen Klassen über Events.
Omega Psi ist offline   Mit Zitat antworten
Alt 09-05-2009, 20:34   #11 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Zitat:
Zitat von Omega Psi Beitrag anzeigen
Da die Klassen nun direkte Kontrolle über die Funktionen haben, obwohl sie ihnen nicht gehören
Ok, danke. Das ist soweit einleuchtend. Aber hat das einen praktischen Nachteil?

Zitat:
Zitat von Omega Psi Beitrag anzeigen
ist es im Hinblick der Kaspelung besser/sauberer die entsprechenden Funktionen nur als definierte Schnittstellen zu verwenden für Kommunikationen mit anderen Klassen über Events.
Sollte man also mit allen Funktionen, die man in Listenern registriert, so vorgehen?
Wenn aber der Listener in derselben Klasse registriert wird, die auch die Funktion enthält, macht es ja keinen Unterschied.
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 09-05-2009, 20:42   #12 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Praktisch macht das keinen Unterschied, aber dennoch würde ich Omega Psi auf jeden Fall zustimmen.
Der Punkt ist einfach, dass du eine Funktion als Listener-Funktion konzipiert hast, sie dann auf andere Art zu verwenden ist inkonsistent, und daher verwirrend.
Auch ein Grund ist, dass man (zumindest in der AS Welt) Listener-Funktionen meist anhand des Events, das sie behandeln, benennt. (Kommt vielleicht noch aus der AS1 Zeit, als Listener eigentlich nur normale Funktionen mit einem speziellen Namen waren) Der Name einer normalen Methode sollte aber ausdrücken, was die Methode macht. Der Vorschlag von Omega Psi wird beiden Konventionen gerecht.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 09-05-2009, 20:48   #13 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Wenn du die null Referenz nicht expizit erlaubst, hast du in meinen Augen ein paar Vorteile.

Es macht das Testen einfacher, weil du nicht auf Events angewiesen bist. Ausserdem weichst du so nicht die API auf, da die Signaturen keine null Referenz erlauben. Und die Signaturen kommunizieren ihre Funktionalität besser.
Omega Psi ist offline   Mit Zitat antworten
Alt 09-05-2009, 21:00   #14 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Was genau sind jetzt Signaturen, die Funktionsnamen?

Zum Testen habe ich in dem Projekt, an dem ich gerade arbeite, in den Funktionen den Event mit =null optional gemacht... funktioniert hat es jedenfalls ganz gut .
Aber es ist auch mein erstes richtiges AS3 Projekt. Änderungen an meinem Programmierstil übernehme ich gerne, wenn ich verstehe wieso. Mit Design Patterns werde ich mich auch noch intensiv beschäftigen. Momentan fehlt mir nur die Zeit.
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 10-05-2009, 12:05   #15 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.139
Signaturen sind die Funktionsdefinitionen nach außen:
Code:
<[Optional: override]> <Sichtbarkeitsmodifikator> <Name der Funktion> (<Menge der Argumente>): <Typ des Rückgabewerts>
Wenn nun eine Funktion null explizit erlaubt, mag das praktisch sein. Aber in den Fällen von EventListenern ist das eben nicht so schön.

Mit Design Patterns hat das ganze nichts zu tun, es ist viel mehr ein Idiom der ActionScript Sprache.
Omega Psi 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 11:54 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele