URL: https://www.overclockers.at/coding-stuff/flash_as3_konstruktor_klasseninitialisierungswert_219187/page_1 - zur Vollversion wechseln!
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(); }; } }
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
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
mach keinen defaultwert, sondern check den inhalt vor der zuweisung innerhalb des konstruktors.
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...
so würd ichs zumindest machen. das was du machen willst funktioniert glaub ich nicht.
public function Kunde(fol:String="",img:Array=null):void
wäre eine möglichkeit - dann noch ein simples if dazu - ist imho schöner.
Eben das geht leider nicht: "1067: Implizite Umwandlung eines Werts des Typs Array in einen nicht verwandten Typ String".Zitat von icaimg:Array=null
das funktioniert sehr wohl.
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
poste mal den code der ganzen klasse bzw. des ganzen Konstruktors.
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:
hier liegen auch die MovieClips (blende_mc,laufband_mc,...)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++; }
grad kämpf ich auch noch ein bisschen mit dem Löschen des laufband_mc, bei klick auf anderen Kunden.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(); }}}}}
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.
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
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