"We are back" « oc.at

Flash, AS3 Konstruktor: Klasseninitialisierungswert

Flochiller 26.09.2010 - 19:26 3042 16
Posts

Flochiller

Here to stay
Avatar
Registered: Jan 2004
Location: Wien
Posts: 1521
Hi, ich möchte meine Klasse gerne mit dem unten angegebenen Konstruktor initialisieren, leider spuckt er immer wieder: "1047: Parameterinitialisierer unbekannt oder keine Kompilierungszeit-Konstante." aus, wenn ich =[] und Konsorten einfüge.
Gibt es eine Möglichkeit, Standardwerte für Arrays zu definieren?!
Code:
package {
	public class Kunde {

		public var imagePath:Array;
		public var Ordner:String;

		public function Kunde(fol:String="",img:Array=[]):void {
		Ordner = fol;
		imagePath=img;
		}
	
		public function getData():String {
			return imagePath.toString();
		};
	}
}

tia

Flo

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15285
ich versteh nicht ganz was du machen willst. wenn du es mit dem konstruktor aufrufen willst übergibst du doch eh den string bzw den array wert an der stelle wo du eben den konstruktor aufrufst.

du rufst ja Kunde(blubb, array[10]) auf. dann muss dein konstruktor ja nur wissen welches datenformat in array[10] drinsteht und nicht mehr. (das ist jetzt nur theoretisch. keinen schimmer ob das die exakte as3 syntax ist)

wenn es immer der selbe wert sein soll definierst du das halt irgendwo.

hoffe das war die frage :D
Bearbeitet von d3cod3 am 26.09.2010, 19:40

Flochiller

Here to stay
Avatar
Registered: Jan 2004
Location: Wien
Posts: 1521
leider nein ;)
es ist so ich will die klasse in ein array packen und dann jeder klasse folgende eigenschaften zuteilen:
name = Kundenname
ordner= selbstredend
imagePath= Array mit den Dateinamen der Bilder.

Wenn ich jetzt aber keine Bilder habe so will ich nur einen Namen übergeben und keinen ordner/Path. ==> leere autowerte

Oder bin ich grad einfach in einer Richtung steckengeblieben?!
As3 unterstützt leider keine multiple constructors
Bearbeitet von Flochiller am 26.09.2010, 19:52

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
mach keinen defaultwert, sondern check den inhalt vor der zuweisung innerhalb des konstruktors.

Flochiller

Here to stay
Avatar
Registered: Jan 2004
Location: Wien
Posts: 1521
also soll ich einfach nur
var Kunde1 = new Kunde("Name",[],"") schreiben? Is auch eine Möglichkeit, dachte mir aber er wäre auch eleganter zu lösen...

d3cod3

Legend
...
Avatar
Registered: Aug 2002
Location: insert location ..
Posts: 15285
so würd ichs zumindest machen. das was du machen willst funktioniert glaub ich nicht.

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9822
public function Kunde(fol:String="",img:Array=null):void

wäre eine möglichkeit - dann noch ein simples if dazu - ist imho schöner.

Flochiller

Here to stay
Avatar
Registered: Jan 2004
Location: Wien
Posts: 1521
Zitat von ica
img:Array=null
Eben das geht leider nicht: "1067: Implizite Umwandlung eines Werts des Typs Array in einen nicht verwandten Typ String".

bzw. [null] oder "new Array()" liefert das altbekannte.(1047: Parameterinitialisierer unbekannt oder keine Kompilierungszeit-Konstante.)

Dann muss ichs wohl mit nem workaround machen...

trotzdem danke für die Hilfe ;)

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9822
das funktioniert sehr wohl.

Flochiller

Here to stay
Avatar
Registered: Jan 2004
Location: Wien
Posts: 1521
Aber er spuckt bei mir aus, dass "1067: Implizite Umwandlung eines Werts des Typs Array in einen nicht verwandten Typ String", wenn ich img:array=null schreib?!
Ich checks ned

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9822
poste mal den code der ganzen klasse bzw. des ganzen Konstruktors.

Flochiller

Here to stay
Avatar
Registered: Jan 2004
Location: Wien
Posts: 1521
Vielleicht könnt ihr mir ja sonst auch noch ein paar Tipps geben. Ich bin normal ein Spaghetticoder, da ich bis jetzt noch nie einen Vorteil von Klassen gesehen habe. In diesem Fall siehts allerdings so aus, als wäre es viel einfacher damit zu lösen.
Worum gehts?
BilderLaufband (klick auf Bild --> Laufband stopp + bild groß anzeigen) mit darunterliegenden in Spalten angeordneten Menü zur Auswahl des Laufbands.

Hier der Code in der FLA:
Code:
import Kunde;
var Menu_array:Array = new Array();
Menu_array.push(new Kunde("Firma","Ordner",["neuerTisch.jpg","Sesselliege 8.jpg","Sesselliege6.jpg","Sesselliege7.jpg","Tisch.jpg"],this));
/*................usw*/
j=0;
var kick:int=5;
for (i in Menu_array) {
    small_mc.addChild(Menu_array[i].CreateText(i,j,kick));
    if (i%kick==kick-1)j++;
}
hier liegen auch die MovieClips (blende_mc,laufband_mc,...)

Hier die Klasse:
Code:
package {
	import flash.events.*,flash.text.*,flash.display.*,fl.transitions.Tween,fl.transitions.easing.*,fl.transitions.TweenEvent,flash.net.URLRequest;
	/*******************************************************************Klasse***************************************************************************/
	public class Kunde {
		public var imagePath:Array=[];//Dateinamen
		private var _imagePath:Array=[];//temporäres Array für imageload
		private var imageArray:Array = [];//Array für Zugriff auf einzelne Bilder -> Buttons
		private var lastx=0;//nächster Anfangswert für Bild
		private var selectedMenue:String="";

		public var Ordner:String="";//Speicherordner
		public var KundenName:String;//Linkname
		public var hasImages:Boolean=false;//Bildercheck, ==> grau oder nicht
		private var Root:MovieClip;//Zugriff auf MovieClips

		private var textFieldMenu:TextField = new TextField();
		/** Farb und Fonts**/
		/*******************************************************************Konstruktor***************************************************************************/
		public function Kunde(nam:String,fol:String,img:Array,roo:MovieClip):void {
			KundenName=nam;
			Root=roo;
			if (img.length!=0) {
				hasImages=true;
				Ordner = fol;
				imagePath=img;
				imagePath.push(imagePath[0]);//Für Endlosschleife die ersten Bilder hinten angehängt
				imagePath.push(imagePath[1]);
				_imagePath=imagePath.concat();
			}
		}
		/*******************************************************************Textfelder***************************************************************************/
		public function CreateText(i:int,j:int,kick:int):TextField {
			textFieldMenu.name = i+"_Menu_txt";
			if (hasImages) {
				textFieldMenu.defaultTextFormat = Menu_format;
				/*on over/out events*/
				textFieldMenu.addEventListener(MouseEvent.CLICK,function(event:MouseEvent) {SlideShow();}); ;//Weil wenn direkt auf SlideShow muss man Event als argument haben
			} else {
				textFieldMenu.defaultTextFormat = MenuX_format;
			}
			textFieldMenu.text = KundenName;
			/***diverse Positionierung usw....*/
			return textFieldMenu;
		}
		/*******************************************************************SlideShow***************************************************************************/
		public function SlideShow() {	//Initialisierung des Laufbandes
			_imagePath=imagePath.concat();	//Kopieren nicht Referenzieren von imagePath
			for (var i in Root.Menu_array)//Alle Klickbaren auf Schwarz schalten
				if (Root.Menu_array[i].hasImages)
					Root.Menu_array[i].textFieldMenu.textColor =black; 					
			textFieldMenu.textColor =pink;
			selectedMenue=textFieldMenu.text;
			Root.laufband_mc.alpha=0;
			Root.wait_mc.visible=true;
			loadImage(_imagePath[0]);
		}
		/******************************************************************************************************************************************************/
		private function loadImage(img:String) {
			var imageLoader:Loader = new Loader();
			imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, ImageLoaded);
			imageLoader.load(new URLRequest ("/"+Ordner+"/"+img));
		}
		/******************************************************************************************************************************************************/
		private function ImageLoaded(event:Event) {

			var Target=event.target.content;
		/**diverses Positionieren***/
		/***................**/
			lastx+=Target.width;
		
			var tmp_mc:MovieClip = new MovieClip;//Movieclip für Schaltflächenfunktionen
			tmp_mc.addChild(Target);
			tmp_mc.name=_imagePath.shift();//erstes Element entfernt und Rest nachrücken
			imageArray.push(tmp_mc);
			Root.laufband_mc.addChild(imageArray[imageArray.length-1]);

			if (_imagePath.length > 0) {
				loadImage(_imagePath[0]);//Rekursiver Aufruf bis nix mehr da
			} else {
				var alphaTween:Tween = new Tween(Root.laufband_mc, "alpha",  Regular.easeOut, 0, 1,2,true);//Nach Ladevorgang langsames einblenden
				alphaTween.addEventListener(TweenEvent.MOTION_FINISH, function (){Root.wait_mc.visible=false});//Loader kicken
				var letztbilder=-Root.laufband_mc.width+imageArray[imageArray.length-1].width+imageArray[imageArray.length-2].width+Root.laufband_mc.x;//Laufband
				var myTween:Tween = new Tween(Root.laufband_mc, "x",  None.easeOut, Root.laufband_mc.x, letztbilder,Root.laufband_mc.width/3,false);
				myTween.addEventListener(TweenEvent.MOTION_FINISH, function(){ myTween.rewind();myTween.start()});
				/*vielleicht wieder auf x+=3 umschreiben, ruckeln ist dasselbe*/
				
				for (var i in imageArray) { //bei klick aufs bild stoppen und groß zeigen
					imageArray[i].addEventListener(MouseEvent.CLICK,showPic);
				}
				function showPic(event:MouseEvent) {
					myTween.stop();
					var imageLoader:Loader = new Loader();
					imageLoader.load(new URLRequest ("/"+Ordner+"/"+event.target.name));
					imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadbig);

					function loadbig(ev:Event) {
						var Target=ev.target.content;
						Root.showpic_mc.addChild(Target);
					}
				}
				
				Root.blende_mc.addEventListener(MouseEvent.CLICK,killall);//alles einblenden und band weiterlaufen lassen
				function killall(event:MouseEvent) {
					myTween.resume();
					Root.reset();
}}}}}
grad kämpf ich auch noch ein bisschen mit dem Löschen des laufband_mc, bei klick auf anderen Kunden.

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9822
brrr, der code wär nix für mich :)

womit codest du denn? die formatierung ist etwas strange. würde dir entweder flash builder oder flashdevelop empfehlen. auch wärs nicht schlecht wenn du dich wenigstens an deinen eigenen coding standard halten würdest - nicht einmal eine funktion groß schreiben und einmal klein...

aber egal, darum gehts ja nicht - ich seh hier nirgends den versuch von optionalen konstruktor parametern.

noch ein tip: schau dir tweenmax bzw. tweenlite von greensock an - sind weitaus besser als die flash tweening klassen.

Flochiller

Here to stay
Avatar
Registered: Jan 2004
Location: Wien
Posts: 1521
Ich code in Flash direkt... (ich mag die autovervollständigung)
standard hab ich leider keinen :( ich progge relativ selten
bin für jeden Tipp dankbar ;)

@konstruktor: hab jetzt darauf verzichtet, da es nicht gefunkt hat

ica

hmm
Avatar
Registered: Jul 2002
Location: Graz
Posts: 9822
public function Kunde(nam:String,fol:String,img:Array = null,roo:MovieClip = null):void

muss eigentlich funktionieren. und in flash direkt coded man eigentlich nicht wirklich - ich kenne zumindest keinen der das macht. andere editoren haben eine weitaus bessere autovervollständigung.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz