Flashhilfe.de - Flash Community

Von Klasse in Textfeld schreiben ? [Flash 10]

 


AntwortenRegistrieren Seite1  

Tic2k#1
Benutzerbild von Tic2k
Beiträge: 8
Registriert: Sep 2011

26.09.2011, 21:14

Hi ich bin noch relativ neu beim Flash proggen und versuche jetzt schon eine weile einen weg zu finden wie ich aus meiner Klasse den Inhalt von ein paar variablen in ein Textfeld bekomme.

Über die suche hab ich das mit dem getChildByName gefunden aber noch nicht hinbekommen das es klappt.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package
{
     import flash.display.*;
     import flash.events.Event;
 
     public class item extends MovieClip         
     {
        public var itemname:String;
        public var itemid:int;
        public var att:int;
        public var def:int;
        public var inslot:int;
        public var slot:int;
        public var beschreibung:String;
        public var menge:int;      
        public var pic:Loader;
        public var _myMC:MovieClip;
              
        public function dingklick(e)
        {
           if(stage) init();
              else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event=null):void
             {
              removeEventListener(Event.ADDED_TO_STAGE, init);
              //ab jetzt sind stage und root verfügbar, ab jetzt kannst du damit arbeiten
         _myMC = root.getChildByName("tooltip") as MovieClip
           }
     }
}


als fehler kommt :
Zeile 31   1061: Aufruf für eine möglicherweise nicht definierte Methode getChildByName über einen Verweis mit statischem Typ flash.display:DisplayObject.

hoffe mir kann da jemand helfen
Danke schonmal.
Schlagwörter: Klasse, textfeld
Geändert von Tic2k am 26.09.11 um 21:15 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


willie33#2
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

27.09.2011, 22:13

Du musst root als MovieClip casten:
ActionScript:
1_myMC= MovieClip(root).getChildByName("tooltip") as MovieClip;
Loading comments...
Tic2k#3
Benutzerbild von Tic2k
Beiträge: 8
Registriert: Sep 2011

Themenautor/in

27.09.2011, 23:22

okay hab das so geändert und nun gehts nicht weiter weil das event nicht ausgelöst wird. Das Feld ist auch schon auf der Bühne bevor die function darauf zugreift.

und in das textfeld schreiben müsste dann mit

ActionScript:
1_myMC.text="beschreibung";


gehen oder?
willie33#4
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

28.09.2011, 21:47

Ja, das geht.
Und ändere einfach das Event auf das du achtest.
Von "ADDED_TO_STAGE" zu "ADDED".
Dann musst du nur noch überprüfen ob das Target des Events wirklich dein Item ist.
ActionScript:
1
2
3
4
5
6
7
8
private function init(e:Event = null):void
{
      if (e.target == this && this.stage)
      {
          this.removeEventListener(Event.ADDED, init);
          //Mach hier was du willst.
    }
}
Loading comments...
Werbung
Beiträge: 0
Registriert: Feb 2016


Tic2k#5
Benutzerbild von Tic2k
Beiträge: 8
Registriert: Sep 2011

Themenautor/in

29.09.2011, 12:41

auch mit

ActionScript:
1addEventListener(Event.ADDED, init);


scheint es so als ob das event nie ausgelöst wird.

ActionScript:
1trace(stage);

ist immer "null"

Müsste ich im Hauptscript dafür noch irgendwas machen oder auf etwas achten?
willie33#6
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

29.09.2011, 12:51

Na must natürlich eine Item instanz zur Anzeigeliste im Hauptskript hinzufügen. Über "addChild()" oder "addChildAt()"
Loading comments...
Tic2k#7
Benutzerbild von Tic2k
Beiträge: 8
Registriert: Sep 2011

Themenautor/in

29.09.2011, 13:03

das objekt wird dort so erstellt.
Ist zwar noch nicht schön aber soll erstmal nur funktionieren.

ActionScript:
1
2
3
4
5
6
7
ding[i]=new item();
ding[i].pic = new Loader();
addChild( ding[i].pic );
ding[i].pic.load( new URLRequest( (i+1)+".png" ) );
ding[i].pic.x=200+(i*64);
ding[i].pic.y=200;
ding[i].pic.addEventListener(MouseEvent.CLICK, ding[i].dingklick);


ich denke mal du meinst das oder?
Geändert von Tic2k am 29.09.11 um 13:05 Uhr
willie33#8
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

29.09.2011, 19:41

Ich habe da einige Vorschläge das noch zu optimieren:
1. Wenn die Item Klasse keine Zeitleiste benötigt, verwende Sprite statt MovieClip als erweiterte Klasse um Speicherplatz einzusparen.
2. Konventionsgemäß werden Klassennamen groß geschrieben ;)
3. Überschreibe den Konstruktor wenn Aktionen ausgeführt werden sollen, sobald eine Klasse instanziert wird.
4. Erstelle eine private Methode "init()", die im Konstruktor aufgerufen wird. Code im Konstruktor wird vom Compiler nicht optimiert, sonstiger Code schon.
5. Eigenschaften werden normalerweise Gekapselt, d.h: Die Variablen werden als private deklariert und öffentliche getter/setter erstellt. Dadurch erhält man mehr Kontrolle, kann schreibgeschützte Elemente erstellen und man kann gegebenenfalls sofort eine Aktion ausführen wenn der Wert einer Eigenschaft geändert wird.

Zuerst sehen wir uns die Klasse "Item" an:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package
{
      import flash.display.Loader;
      import flash.display.MovieClip;
      import flash.display.Sprite;
      import flash.events.MouseEvent;
      import flash.net.URLRequest;
 
      public class Item extends Sprite //Item großgeschrieben, wie in der Checkliste vorher besprochen
    {
          //Variablen werden als "private" deklariert"
        private var itemname:String;
          private var itemid:int;
          private var att:int;
          private var def:int;
          private var inslot:int;
          private var slot:int;
          private var beschreibung:String;
          private var menge:int;      
          private var pic:Loader;
          private var _myMC:MovieClip;
 
          public function Item(i:int) //Der Konstruktor hat keinen Rückgabewert, nicht einmal "void"
        {
              init(i);
          }
 
          private function init(i:int):void
          {
              pic = new Loader();
              this.addChild(pic);
              pic.load(new URLRequest((i+1)+".png"));
 
              this.x = 200 + (i * 64);
              this.y = 200;
              
              this.addEventListener(MouseEvent.CLICK, dingClick);
          }
          private function dingClick(e:MouseEvent):void
          {
              //Das ADDED event entfällt, da man ein DisplayObject nur anklicken kann wenn es sichtbar auf der Bühne ist.
            _myMC= MovieClip(root).getChildByName("tooltip") as MovieClip;
              //Sonstiger Code der ausgeführt werden soll wenn das Item angeklickt wird.
        }
 
          public function set itemName(value:String):void
          {
              itemname = value;
          }
          public function get itemName():String
          {
              return itemname;
          }
 
          public function set itemId(value:int):void
          {
              itemid = value;
          }
          public function get itemId():int
          {
              return itemid;
          }
 
          //Das ganze geht jetzt mit allen Variablen weiter die du öffenlich zugänglich machen möchtest. Mit _myMC und pic solltest du das aber nicht machen oder zumindest den setter weglassen um die Eigenschaft für die Öffentlichkeit schreibgeschützt zu machen.
    }
}


So, und jetzt zu der Schleife:
ActionScript:
1
2
3
var item:Item = new Item(i);
this.addChild(item);
dings[i] = item;


So das wars...
Loading comments...
Tic2k#9
Benutzerbild von Tic2k
Beiträge: 8
Registriert: Sep 2011

Themenautor/in

30.09.2011, 09:57

Schonmal danke für die verbesserungen. Ich denke mal ich habe das soweit umgesetzt und verstanden.

Aber
ActionScript:
1this.addChild(item);

wirft bei mir diesen Fehler aus:

TypeError: Error #1006: addChild ist keine Funktion.
   at MethodInfo-331()
   at flash.events::EventDispatcher/dispatchEventFunction()
   at flash.events::EventDispatcher/dispatchEvent()
   at flash.net::URLLoader/onComplete()

Wenn ich aber das "this" weglasse läuft es schonmal alles wie es soll bis auf das Hauptproblem leider.

Die ausgabe sieht erstmal so aus zum testen:
ActionScript:
1
2
3
4
5
6
7
private function dingClick(e:MouseEvent):void
          {
                //Das ADDED event entfällt, da man ein DisplayObject nur anklicken kann wenn es sichtbar auf der Bühne ist.
            _myMC= MovieClip(root).getChildByName("tooltip") as MovieClip;
                //Sonstiger Code der ausgeführt werden soll wenn das Item angeklickt wird.
           _myMC.text="Zeig mir was";
          }


Und hier bekomme ich dann wieder:

TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
   at Item/dingClick()

Ich hoffe du kannst mir da noch weiterhelfen.
willie33#10
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

30.09.2011, 10:49

Ah, verwende statt root einfach "stage" und lass MovieClip weg.
Loading comments...
Tic2k#11
Benutzerbild von Tic2k
Beiträge: 8
Registriert: Sep 2011

Themenautor/in

30.09.2011, 11:15

ActionScript:
1_myMC= stage.getChildByName("tooltip") as MovieClip;

bringt leider die selbe Fehlermeldung
willie33#12
Benutzerbild von willie33
Beiträge: 147
Wohnort: Qo'noS
Registriert: Nov 2009

30.09.2011, 11:20

Bitte lade einmal dein gesamtes Projekt hoch, damit ich mir das mal ansehen kann. Ich möchte nämlich auch einen gesamten Überblick haben.
Loading comments...

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de