Zurück   Flashforum > Flash > Flash Einsteiger

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-09-2011, 10:57   #1 (permalink)
Neuer User
 
Registriert seit: Jun 2007
Beiträge: 5
Eventbubbling bei Buttonliste

Hallo liebes Forum,

ich habe eine Liste aus Buttons (EqButton-Instanzen), die beim Auftreten eines Click-Events dieses bis zur Main hinaufbubblen lassen.

Daraufhin soll die Main, abhängig davon, welcher Button das Event geschickt hat, eine Instanz einer Klasse Bike erzeugen, mit unterschiedlichen Eigenschaften. Dabei wäre es schön, wenn Main die EqButton-Instanzen dazu nicht kennen muss.




Zur Veranschaulichung habe ich eine Grafik erstellt:




Codemäßig sieht es momentan so aus:

Code:
package as3.EquipList {
	
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.display.Bitmap;
	
	
	public class EqButton extends MovieClip {
		
		// Wird beim Click-Event zur Main geschickt
		public static var eventString:String;
		
		private var color:String;
		private var gears:int;
		private var tireSize:Number;
		private var brand:String;
		private var image:Bitmap;
		
		public function EqButton(image:Bitmap, brand:String, color:String, gears:int, tireSize:Number) {
			this.image = image;
			this.brand = brand;
			this.color= color;
			this.gears= gears;
			this.tireSize = tireSize;

			// Eigenschaften in String verpacken, um es in Main wieder aufzuteilen
			eventString = brand+","+color+","+gears+","+tireSize;

			addEventListener(MouseEvent.CLICK, launchEvent);
		}

		private function launchEvent(e:MouseEvent):void{
			var newEvent:Event = new Event(eventString, true, true);
			dispatchEvent(newEvent);
		}
}
}
Hier wird das Event in Main aufgefangen:
Code:
addEventListener(EqButton.eventString, onEvent);
function onEvent(e:Event):void{
        // Hier Instanzen von Bike erzeugen
	trace("EVENT: "+e);
}

Da bekomme ich jedoch folgenden Fehler:
Zitat:
ArgumentError: Error #1063: Argument count mismatch on as3.EquipList::EqButton(). Expected 5, got 0.
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at as3.EquipList::List()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at as3.EquipList::EquipList()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
at simulator_fla::MainTimeline()
Also scheinbar kann er die statische Variable eventString nicht ansprechen, da er die Instanz nicht kennt...
Könnt ihr mir bitte sagen, wie man es hinbekommt, dass die individuellen Daten aus eventString ohne Instanz übermittelt werden können?
Oder muss ich von der Main aus doch die Instanzen ansprechen und einzelnd auf Click-Events abfragen?

Danke schonmal für eure Hilfe. Wenn euch noch Angaben fehlen, so sagt bescheid und ich reiche sie natürlich nach.

Grüße,
Sven
Xebian ist offline   Mit Zitat antworten
Alt 07-09-2011, 11:20   #2 (permalink)
keep cool...
 
Benutzerbild von cytrics
 
Registriert seit: Mar 2006
Ort: Erlangen
Beiträge: 356
Hy,

bin mir alles andere als sicher, aber müßtest du nicht so schreiben:

Code:
addEventListener(EqButton.eventString, onEvent);

function onEvent(e:EqButton):void
{
        // Hier Instanzen von Bike erzeugen
	trace("EVENT: "+e);
}

Geändert von cytrics (07-09-2011 um 11:21 Uhr)
cytrics ist offline   Mit Zitat antworten
Alt 07-09-2011, 11:28   #3 (permalink)
Neuer User
 
Registriert seit: Jun 2007
Beiträge: 5
Hi,

schreibe ich es so, kommt leider auch der gleiche Fehler
Xebian ist offline   Mit Zitat antworten
Alt 07-09-2011, 11:52   #4 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Ein Button ist nunmal kein Event-Objekt.

die Struktur ist schlecht, das mit dem String zusammensetzen und wieder zerlegen.

bau dir ne eigene DatenKlasse für die FarradKonfiguration
bau dir eine eigene Event-Klasse, die erwartet, dass man Ihr Daten mitgibt. und lass alle Elemente so dumm wie möglich.
der Button muss die genaue Konfiguration nicht kennen, keine Farbe, Rad-Grösse, oder sonstwas.

wenn du jetzt noch was an der Konfiguration erweiterst, musst du das nur in der DatenKlasse tun, und an den Stellen, die auch wirklich auf die neuen Daten zugreifen müssen, alle anderen Objekte die mit den FahrradDaten in Berührung kommen merken von der Änderung nichts.

DatenKlasse
PHP-Code:
package data
{
//dürfte ich vorschlagen, hier ein BitmapData anzugeben statt eines Bitmaps.
//ein Bitmap kann immer nur an einer Stelle sein, aber du kannst endlos viele 
//Bitmaps mit dem selben BitmapData-Objekt erstellen und anzeigen
//    import flash.display.Bitmap;
    
import flash.display.BitmapData;
    
    public class 
BikeConfiguration
    
{
        public var 
color:String;
        public var 
gears:int;
        public var 
tireSize:Number;
        public var 
brand:String;
        public var 
image:BitmapData;    //brauchst du das Bild hier wirklich?
        
        
public function BikeConfiguration(image:BitmapDatabrand:Stringcolor:Stringgears:inttireSize:Number) {
            
this.image image;
            
this.brand brand;
            
this.color color;
            
this.gears gears;
            
this.tireSize tireSize;
        }
        
        public function clone():
BikeConfiguration
        
{
            return new 
BikeConfiguration(imagebrandcolorgearstireSize);
        }
        
        public function 
toString():String
        
{
            return 
brand+","+color+","+gears+","+tireSize;
        }
    }

Event
PHP-Code:
package events
{
    
import data.BikeConfiguration;
    
import flash.events.Event;
    
    public class 
BikeEvent extends Event
    
{
        
//Event-Typen
        
public static const CREATE:String "createBike";
        public static const 
SHOW:String "showBike";
        public static const 
DESTROY:String "destroyBike";
        public static const 
CONQUER:String "conquerTheWorldOnABike";
        
    
        public var 
data:BikeConfiguration;
        
        public function 
BikeEvent(type:Stringdata:BikeConfigurationbubbles:Boolean=truecancelable:Boolean=false)
        {
            
this.data data;
            
super(typebubblescancelable);
        }
        
        
override public function clone():Event
        
{
            return new 
BikeEvent(typedata.clone(), bubblescancelable);
        }
    }

//und der eigentliche Button
PHP-Code:
package as3.EquipList
{
    
import flash.display.Sprite;
    
import flash.events.MouseEvent;
    
import flash.display.Bitmap;
    
    
import data.BikeConfiguration;
    
import events.BikeEvent;
    
    public class 
EqButton extends Sprite
    
{
        private var 
bikeData:BikeConfiguration;
        
        public function 
EqButton(bikeData:BikeConfiguration) {
            
this.bikeData bikeData;
            
addEventListener(MouseEvent.CLICKlaunchEvent);
        }

        private function 
launchEvent(e:MouseEvent):void
        
{
            
dispatchEvent(new BikeEvent(BikeEvent.CREATEbikeDatatrue));
        }
    }


Edith: hatte den problematischen Teil vergessen einzubinden
PHP-Code:
import data.BikeConfiguration;
import events.BikeEvent
//...

addEventListener(BikeEvent.CREATEonCreateBike);
function 
onCreateBike(e:BikeEvent):void
{
    
// Hier Instanzen von Bike erzeugen
    
trace("EVENT:"e.typee.data.toString());

edit2:
die privaten Eigenschaften in BikeConfiguration public gemacht.
brauchst du das Bild in der DatenKlasse, oder war das nur für den Button? dann solltest du es wieder da rein tun.
und du kannst die Daten ggf weiter verschachteln, bspw eine weitere Klasse für die Räder, und deren Spezifikation, oder für die Schaltung, sofern benötigt.
du musst jetzt nicht alle Informationen in eine Klasse quetschen
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (07-09-2011 um 12:10 Uhr)
thomas_E ist offline   Mit Zitat antworten
Alt 07-09-2011, 12:42   #5 (permalink)
Neuer User
 
Registriert seit: Jun 2007
Beiträge: 5
Hey Thomas, danke für deinen ausführlichen Beitrag.

Ich werde ihn genauer durchgehen und versuchen, umzusetzen. Melde mich dann später wieder.


Zum Bild: Das ist nur für den Button gedacht.
Xebian ist offline   Mit Zitat antworten
Alt 07-09-2011, 12:50   #6 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
Zitat:
Zum Bild: Das ist nur für den Button gedacht.
ok,
ich würde aber trotzdem nur ein BitmapData übergeben, und den Button entscheiden lassen, wie er den verwendet,
oder du nutzt eine factory-Klasse, die die Buttons erstellt und zusammenbaut, und dann geht es auch den Button nichts mehr an, was oder ob er er ein Bild erhält/enthält.

edit eine änderung noch:
PHP-Code:
dispatchEvent(new BikeEvent(BikeEvent.CREATEbikeData.clone(), true)); 
hier nbicht das Original-Objekt, sondern eine Kopie von bikeData übergeben, weil sonst änderungen die du an dem Objekt machst, dass du aus dem Event-erhältst, auch im Button selber geändert würden.
__________________
greetz Thomas

plz RTFM & Coding Conventions

Geändert von thomas_E (07-09-2011 um 12:54 Uhr)
thomas_E ist offline   Mit Zitat antworten
Alt 07-09-2011, 17:49   #7 (permalink)
Neuer User
 
Registriert seit: Jun 2007
Beiträge: 5
So, ich hab's jetzt so umgesetzt bekommen und den Code soweit verstanden.

Danke nochmal für die Hilfe!
Xebian ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
as3, event bubbling, events

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
EventBubbling André Michelle ActionScript 3 21 04-03-2007 09:28
scrollbare buttonliste wie machen ??? taroma Flash MX 2004 4 18-09-2006 09:22
Dynamische vertikale Buttonliste mit versch. Attributen Smookey1984 Flash und Datenbanken 2 18-03-2004 14:58


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele