Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-12-2011, 21:47   #1 (permalink)
Neuer User
 
Registriert seit: Dec 2011
Beiträge: 3
Funktion registrieren klappt nicht wie ich will

Moin,

ich bin neu hier und entschuldige mich erstmal für meinen Threadtitel. Ich wusste einfach nicht wie ich mein Problem nennen soll. Macht auch das googlen schwer. Ich habe mal meine "Problem"-Klassen abstrahiert und führe diese im Folgenden auf:

Hier erstmal meine Klassen:

Code:
public class MyClass
{
  public var mouseClickHandler:Function = new Function();

  // Konstruktor, Events registrieren etc.
  
  public function mouseHandler(evt:MouseEvent)
  {
    switch (evt.type)
    {
      case MouseEvent.CLICK:
		mouseClickHandler();
		break;
    }
  }
}
Code:
public class ManagerClass
{
  // Konstruktor etc.
  
  private static function foo()
  { 
    for each(var i:int in myArray)
	{
		var mC:MyClass = new MyClass();
		
		mC.mouseClickHandler = function()
		{
			machIrgendwasMit(i);
		}
	}
  }
  
  private static function machIrgendwasMit(i)
  {
	trace(i);
  }
}
Mein Problem ist nun, dass die ganzen mCs, die in der foreach-Schleife erstellt werden das letzte i nutzen, das in der Schleife übergeben wird.
Warum ist das so? Wie kann ich das ohne diesen Fehler bewerkstelligen?
messyOne ist offline   Mit Zitat antworten
Alt 07-12-2011, 22:05   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
willkommen im flashforum!!!

oje, schmeiss deine scipte ganz schnell weg ;-)
so macht man das nicht!

schau doch mal in der flash-hilfe nach. da ist das mit den listenern erklärt.
und lies doch mal ein paar beispiele hier im forum.

suche z.b. nach: addEventListener


zu deiner frage selbst:

mC.mouseClickHandler = function() { machIrgendwasMit(i);}
in deiner schleife zählst du i hoch.
der clickhandler wird 'wochen' später angesprochen und soll sich dann noch erinnern, welchen inhalt die variable i zum damaligen zeitpunkt der zuordnung der function hatte. dieses i ist aber mit der function foo gestorben. bzw. wenn es i noch gibt, dann ist dessen inhalt natürlich der endzustand nach dem for each. i gibt es nur einmal.



erkläre doch mal, was das ganze geben soll. dann kann man dir vermutlich eher helfen.

ein paar einfache beispiele zu as9: H.G.Seib


p.s.
auch nicht so prickelnd, du kannst der klasse die variable übergeben und dort speichern.
var mC:MyClass = new MyClass(i);
aber die events funktionieren ohne nummerierung der mc's.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (07-12-2011 um 22:29 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 07-12-2011, 22:22   #3 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Hallo und willkommen im Forum!

Zunächstmal kannst Du froh sein, dass i da überhaupt noch definiert ist (was was mit Closures zu tun hat).
  • Wenn Du eine Variable in eine Schleife ständig neu belegst, hat sie nun mal nach der Schleife, den Wert, der als lettes in Ihr gespeichert wurde. Da die Listener erst bei einem Event (also in jedem Fall nach der Schleife) ausgeführt wird hat i dort natürlich immer den letzten Wert.
  • Wenn Du einen Wert mit einer bestimmte Instanz verketten willst, solltest Du Ihn auch in dieser Instanz speichern - z.B. indem Du dort eine entsprechende Variable deklarierst.

Generell find' ich den Aufbau Deiner Klassen auch nicht so wahnsinnig sinnvoll:

Ist es nicht wahnsinnig umständlich einen zentralen Listener mit den ganzen cases zu definieren, nur um mit von außen injezierten Callback-Funktionen arbeiten zu können? Mal ganz abgesehen davon, dass man so nur einen Listener definieren kann...

Wäre es nicht wesentlich einfach die Listener (ggf. in der Klasse selbst) auf herkömlichem Weg zu definieren und die variablen Werte von außen in entsprechenden Variablen speichert?

P.S.:
  • Was ist eigentlich myArray?
  • new Function(); ist überflüssig.
P.P.S.: hgseib war schneller
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (07-12-2011 um 22:23 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 07-12-2011, 22:52   #4 (permalink)
+ Zimt & Zucker
 
Registriert seit: Mar 2006
Ort: hinterm Mond gleich links
Beiträge: 2.040
Du kannst den Listener uU auch einfach an den Container all deiner mcs anhängen und dann mit evt.target arbeiten.

Zum index kommst du dann über indexOf()
__________________
anbei Grüße vom milchreis: Viva la [Silb]
"Selbst wenn uns nur noch der Zynismus treibt, wir werden trotzdem einfach immer weiter gehen!"

[Von null auf Flash in einem Klick.] <<< klick
milchreis ist offline   Mit Zitat antworten
Alt 08-12-2011, 15:05   #5 (permalink)
Neuer User
 
Registriert seit: Dec 2011
Beiträge: 3
Erstmal Danke für die Antworten. Was ich in meinem ersten Post geschrieben habe, war wohl alles andere als schön. Ich weiß auch nicht, was ich mir dabei gedacht habe.

Ich erläutere mal, was ich haben möchte und ihr gebt mir dann den richtigen Ansatz.

Ich habe eine Klasse welche u.a. für klickbare TextFields zuständig ist (im Prinzip Hyperlinks). Je nach Verwendung sollen verschiedene Aktionen (Funktionen + Parameter) ausgeführt werden. Also unterschiedliche ClickEvents. Warum ich das bisher so umständlich und nicht direkt mit addEventListener() gemacht habe, liegt daran, dass ich bei der Funktion, die bei einem ClickEvent aufgerufen wird, Parameter übergeben möchte. Bisher kam ich mit meiner unhübschen Variante auch gut zurecht, aber jetzt, wo ich keine Literale verwende, sondern Variablen (das i in der Schleife) gibt es natürlich Ärger (Danke für die Erklärung, eigentlich total logisch ).

Also: Objekte einer Klasse, sollen Funktionen (mit unterschiedlichen Parameterwerten) ausführen, welche in anderen (Manager-)Klassen definiert sind. Manager-Klassen sind bei mir Klassen, die ausschließlich static-Methoden verwenden und den "Spielflow" steuern.
messyOne ist offline   Mit Zitat antworten
Alt 08-12-2011, 15:23   #6 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Der Aufbau kommt mir immer noch nicht so wahnsinnig glücklich vor:
  • Eine Klasse die nur statische Methoden (z.B. Math) beinhaltet speichert in der Regel keine eigenen Inhalte.

  • Die zu einer bestimmten Instanz gehörenden Informationen sollten eigentlich auch über dieser referenziert (bzw. in ihr gespeichert) werden.
Wenn Du die Informationen trotzdem unbedingt in Deiner statischen Manager-Klasse halten willst, könntest Du mit einem Dictionary arbeiten:
ActionScript:
  1. package {
  2.    
  3.     import flash.events.MouseEvent;
  4.     import flash.utils.Dictionary;
  5.    
  6.     public class ManagerClass {
  7.  
  8.         static private var mCs:Array = [];
  9.         static private var mCValues:Dictionary = new Dictionary();
  10.        
  11.         // Konstruktor etc.
  12.  
  13.         static private function foo():void {
  14.             var mC:MyClass;
  15.  
  16.             for each(var i:int in [2,5,8,4,1,6,7]) {
  17.                 mC = new MyClass();
  18.                 mCValues[mC] = i;
  19.                 mCs.push(mC);
  20.                 mC.addEventListener(MouseEvent.CLICK, handleMCClick);            
  21.             }
  22.         }
  23.        
  24.         static private function handleMCClick(e:MouseEvent):void {
  25.             machIrgendwasMit( mCValues[e.currentTarget] );
  26.         }
  27.  
  28.         static private function machIrgendwasMit(i:uint):void   {
  29.             trace(i);
  30.         }
  31.     }
  32. }
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (08-12-2011 um 15:27 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-12-2011, 15:43   #7 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.867
Statische Klassen machen nur als Container für Utility-Funktionen sinn, nicht für Daten.
Der Grund dafür ist, dass man sie nicht vernünftig referenzieren kann, und dadurch kann man sie nicht (so einfach) austauschen.

Was spricht dagegen, das static da wegzumachen, und eine Instanz der Manager-Klasse zu verwenden? (außer der Arbeit, die du jetzt einmal hast)
Diese Instanz kannst du dann jedem Objekt übergeben, dass sie kennen muss. Und die Parameter sind so auch immer dabei.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist gerade online   Mit Zitat antworten
Alt 08-12-2011, 18:28   #8 (permalink)
Neuer User
 
Registriert seit: Dec 2011
Beiträge: 3
Hmm... ich glaube, ich konnte mein Vorhaben immer noch nicht klar rüberbringen, aber ist auch kein Problem. Die Geschichte mit den e.target hat mich auf eine Idee gebracht, welche mich zu einer Lösung geführt hat. Vielen Dank. Ganz korrekt wird es auch nicht sein, was ich hier mache, aber der Zeitdruck zwingt mich dazu.

Habe meinen Code auf jeden Fall so überarbeitet, dass es "korrekter" sein sollte als vorher.

Die Static-Manager habe ich durch meine Zeit mit der Programmierung mit dem XNA-Framework (C#) mitgebracht. Dort wird das sehr viel genutzt.
messyOne 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
Text-scale-Funktion klappt nicht richtig hceins Flash CS5 Professional 0 27-07-2010 13:58
Funktion klappt nicht Da-JS Flash Einsteiger 4 04-06-2006 09:57
setInterval(funktion, ...) klappt nicht. one2tim ActionScript 1 3 28-02-2006 16:06
variabler button mit funktion. klappt nicht! ikonograf Flash MX 2004 6 07-11-2005 10:38


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele