Flash, AS3 Konstruktor: Klasseninitialisierungswert

Seite 1 von 2 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/flash_as3_konstruktor_klasseninitialisierungswert_219187/page_1 - zur Vollversion wechseln!


Flochiller schrieb am 26.09.2010 um 19:26

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 schrieb am 26.09.2010 um 19:38

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


Flochiller schrieb am 26.09.2010 um 19:43

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


Nico schrieb am 26.09.2010 um 19:54

mach keinen defaultwert, sondern check den inhalt vor der zuweisung innerhalb des konstruktors.


Flochiller schrieb am 26.09.2010 um 20:06

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 schrieb am 26.09.2010 um 20:07

so würd ichs zumindest machen. das was du machen willst funktioniert glaub ich nicht.


ica schrieb am 26.09.2010 um 20:27

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 schrieb am 26.09.2010 um 22:40

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 schrieb am 27.09.2010 um 11:24

das funktioniert sehr wohl.


Flochiller schrieb am 27.09.2010 um 12:07

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 schrieb am 27.09.2010 um 12:13

poste mal den code der ganzen klasse bzw. des ganzen Konstruktors.


Flochiller schrieb am 27.09.2010 um 15:41

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 schrieb am 27.09.2010 um 21:36

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 schrieb am 28.09.2010 um 00:20

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 schrieb am 28.09.2010 um 09:53

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.




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025