Flashhilfe.de - Flash Community

Kommunikation zweier Klassenobjekte auf der Stage [Flash 9]

 


AntwortenRegistrieren Seite1  

Skinny01#1
Benutzerbild von Skinny01
Beiträge: 112
Wohnort: Stadthagen
Registriert: Oct 2002

26.02.2008, 16:01

Brauche mal eure Hilfe, komme da nicht weiter...

Angenommen ich habe die drei Klassen A,B und C in AS 3 erstellt.
In Klasse C erstelle ich die Objekte a und b der jeweiligen Klassen, gebe ihnen Namen:

a.name="a";
b.name="b";

und addiere sie zur Stage. Wie kann ich nun auf die Methoden von a aus b heraus zugreifen?
ich dachte, das funktioniert mit:

stage.a.tudas();

Ging natürlich nicht.Also dachte ich mir:Die Klasse von a in Klasse C casten:

public var a:A = new A() as A;

Ging auch nicht....

Wenn ich im Konstruktor der Klasse B folgendes probiere:
trace(stage.numChildren)
bekomme ich eine korrekte Ausgabe mit der Anzahl der eingefügten Objekte auf der Stage.
Aber bei :
trace(stage.getChildAt(0,1...).name)

bekomme ich immer nur instance1,2,3.....
Wieso denn nicht den Namen, den ich doch festgelegt habe? Sonst könnte man ja sagen:

stage.getChildByName("a").tudas()

Denkfehler?! Bitte erklär' es mir jemand...

Alex_Milde#2
Benutzerbild von Alex_Milde
Beiträge: 204
Wohnort: Hamburg
Registriert: Aug 2005

26.02.2008, 17:20

hi
normalerweise sollte einfach
a.tudas() gehen also ohne das stage
ist name ne private oder public variable?

lg
alex

-- wer nicht fragt bleibt dumm --
-- wer nicht fragt bleibt dumm --
Skinny01#3
Benutzerbild von Skinny01
Beiträge: 112
Wohnort: Stadthagen
Registriert: Oct 2002

Themenautor/in

26.02.2008, 22:18

Dachte ich auch, schließlich sind ja beide Objekte Instanzen des gleichen DOC.
die variablen sind beide als public deklariert.

wolf_g#4
Benutzerbild von wolf_g
Beiträge: 71
Wohnort: Niddatal
Registriert: Aug 2006

26.02.2008, 22:39

Hi,

'name' muss eine Klassenvariable in A und B sein. 'name' muss
als public definiert werden.

Abfragen/setzen kann man diese dann mit object.variable = wert;
also a.name = "aa".

Gruß Ulf

Alex_Milde#5
Benutzerbild von Alex_Milde
Beiträge: 204
Wohnort: Hamburg
Registriert: Aug 2005

27.02.2008, 01:22

wenns nicht geht poste mal den code plz

-- wer nicht fragt bleibt dumm --
omega psi#6
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

27.02.2008, 09:04

Wenn Klasse B mit Instanzen von Klasse A arbeiten soll, musst du B eine Referenz übergeben. Das macht man mit get und set Methoden. Wenn du nur mit einer Instanz arbeiten musst, reichen die:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package {

   /**
    * Created with BeanButler © 2007, Omega Psi
    */

   public class Bean {

      private var _name:String;

      public function Bean() { }

      public function get name():String {
         return this._name;
      }

      public function set name(name:String):void {
         this._name = name;
      }
   }
}
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package {

   /**
    * Created with BeanButler © 2007, Omega Psi
    */

   public class CompositeBean {

      private var _bean:Bean;

      public function CompositeBean() { }

      public function get bean():Bean {
         return this._bean;
      }

      public function set bean(bean:Bean):void {
         this._bean = bean;
      }
   }
}
Wenn es mehrere sein sollen, die gleichzeitig verarbeitet werden sollen, würde ich ein Array verwenden:
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
package {

   /**
    * Created with BeanButler © 2007, Florian Salihovic
    */

   public class CollectionBean {

      private var _beans:Array;

      public function CollectionBean() {
         this._beans = new Array();
      }

      public function addBean(bean:Bean):void {
         this._beans.push(bean);
      }

      public function get beans():Array {
         return this._beans;
      }

      public function getBeansLength():int {
         return this._beans.length;
      }

      public function removeBeanAt(index:uint):void {
         this._beans.splice(index, 1);
      }

      public function set beans(beans:Array):void {
         this._beans = beans;
      }
   }
}


Architectures - Refactoring - Prototyping - Coding - Training
Skinny01#7
Benutzerbild von Skinny01
Beiträge: 112
Wohnort: Stadthagen
Registriert: Oct 2002

Themenautor/in

27.02.2008, 11:11

Hm, bitte korrigiert mich wenn ich falsch liege, aber ob ich nun den Objektnamen innerhalb der Klasse oder beim instanzieren auf der Bühne vergebe ist doch eigentlich das Gleiche, oder?

stage.addChild(a);
a.name="name_von_a";

Ich kann zwar nicht erklären warum mir heute die Anweisung

trace(stage.getChildAt(1,2,3....).name)

die von mir vergebenen Instanzennamen wiedergibt, aber so kann ich immerhin mit

stage.getChildByName("name_von_a")

auf die objekte zugreifen.

Bleibt die Frage offen, warum ich erst den Namen abfragen muß.

Wenn ich aus Klasse B auf das Objekt a zugreifen will, dessen Name ja (warum auch immer das heute funzt) bekannt ist sollte das doch mit
var a:A
a.tudas();

passen.
Gibt mir aber die Fehlermeldung

TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.

bei

stage.a.tudas()

Zugriff auf eine nicht definierte Eigenschaft über einen Verweis mit statischem Typ flash.display.stage

Was aber funktioniert ist:

var objekta:Object;
objekta = stage.getChildByName("name_von_a");
objekta.tudas();

ist ja schön, das ich es so hinbekomme, aber das muß doch auch ohne diesen Umweg gehen, oder?

Alex_Milde#8
Benutzerbild von Alex_Milde
Beiträge: 204
Wohnort: Hamburg
Registriert: Aug 2005

27.02.2008, 13:05

du solltest vielleicht noch deine hauptklasse posten in der du mit dem package von omega psi arbeitest. generell sollte

var a:A
a.tudas();


ersetzt werden durch

var a:A = new A();

du musst das objekt erst instanzieren bevor du damit arbeiten kannst. mit var a:A tust du es nur deklarieren

danach kannst du die funktion ohne probleme aufrufen

ich versthe nicht ganz was du mit klasse a b und c meinst

lg
alex

-- wer nicht fragt bleibt dumm --
omega psi#9
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

27.02.2008, 13:08

Deine Beispiele sind gerade irgendwie lückenhaft

Wenn ich aus Klasse B auf das Objekt a zugreifen will, dessen Name ja (warum auch immer das heute funzt) bekannt ist sollte das doch mit
ActionScript:
1
2
var a:A
a.tudas();
passen. Gibt mir aber die Fehlermeldung
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.


Das Objekt ist nicht initialisiert. Du kannst also auf nichts zurgeifen, da nichts existiert.

ActionScript:
1
2
3
var objekta:Object;
objekta = stage.getChildByName("name_von_a");
objekta.tudas();
Ich schätze du kompilierst im strict Mode. getChildByName liefert ein DisplayObject zurück. Die entsprechende Methode ist in der Klasse nicht bekannt. Ein Typecast sollte da ziehen:
ActionScript:
1
2
3
var name:String = "myName";
var displayObjekt:MyDisplayObject = MyDisplayObject(stage.getChildByName(name));
displayObjekt.tudas();


Noch zwei Anmerkungen: mit stage zu arbeiten sollte man versuchen zu vermeiden und auch mit dem name-Attribut, da es nicht eindeutig ist.

Architectures - Refactoring - Prototyping - Coding - Training
Skinny01#10
Benutzerbild von Skinny01
Beiträge: 112
Wohnort: Stadthagen
Registriert: Oct 2002

Themenautor/in

27.02.2008, 13:33

Aber

var objekta:Object;
objekta = stage.getChildByName("name_von_a");
objekta.tudas();

funktioniert doch...

Wenn oberes Script in Klasse B steht, kann ich mit "objekta" auf alle Mothoden der Klasse A zugreifen.
(@Alex_Milde: In welcher Beziehung die Klassen A,B und C stehen, habe ich im ersten Thread gepostet. Was darin passiert ist für mein Problem erstmal nicht so wichtig - denke ich.)
Meine Frage ist ja warum dieser Umweg über getChildByName...
Da das Objekt a auf der Bühne angezeigt wird und ich es über den Namen ansprechen kann, muß ich es doch auch mit dem Variablen- oder  Objektnamen global ansprechen können,oder? Das Objekt a wurde ja in Klasse C deklariert und instanziert.

public var a:A = new A();
stage.addChild(a);

Mit
var a:A
a.tudas();
habe ich versucht Bezug zu dem zweiten Script von omega psi herzustellen, indem eine variabel des typs bean deklariert wird. Hab' ich bestimmt was falsch verstanden...

@omega psi:
wenn ich die Objekte a und b doch aber anzeigen lassen möchte, brauche ich doch nunmal einen DiplayObjectContainer. Warum sollte ich denn dann nicht mit der stage arbeiten? Bietet sich doch an. Und wenn nicht auf die Stage, wohin denn dann?

Skinny01#11
Benutzerbild von Skinny01
Beiträge: 112
Wohnort: Stadthagen
Registriert: Oct 2002

Themenautor/in

27.02.2008, 14:03

ok, hier mal ein Beispiel, vielleicht wirds dann deutlicher was ich meine:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
package{
   
   import flash.display.Sprite
   
   public class A extends Sprite{
      
      public function saghallo():void
      {
         trace ("hallo");
      }
   }
   }


ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package{
   
   import flash.events.Event;
   import flash.display.Sprite;
   
   public class B extends Sprite{
      
      public function B():void
      {
         this.addEventListener(Event.ADDED_TO_STAGE,aufstage)
      }
      
      private function aufstage(e:Event):void
      {
         a.saghallo();
         this.removeEventListener(Event.ADDED_TO_STAGE,aufstage)
      }
   
   
   }
   }

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package{
   
   import A;
   import B;
   import flash.display.Sprite;
   
   public class C extends Sprite{
      
      public var a:A = new A();
      public var b:B = new B();
      
      
      public function aufstage():void
      {
         stage.addChild(a);
         stage.addChild(b);
      }
   }
   }

auf der maintimeline:

ActionScript:
1
2
3
4
5
import C;

var d= new C();
addChild(d);
d.aufstage();


Skinny01#12
Benutzerbild von Skinny01
Beiträge: 112
Wohnort: Stadthagen
Registriert: Oct 2002

Themenautor/in

27.02.2008, 14:08

scheibe ich in Klasse C
ActionScript:
1
2
stage.addChild(a);
a.name="a";


und änder Klasse B folgend:
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
package{
   
   import flash.events.Event;
   import flash.display.Sprite;
   
   public class B extends Sprite{
      
      private var targeta:Object;
      
      public function B():void
      {
         this.addEventListener(Event.ADDED_TO_STAGE,aufstage)
      }
      
      private function aufstage(e:Event):void
      {
         targeta=stage.getChildByName("a");
         targeta.saghallo();
         this.removeEventListener(Event.ADDED_TO_STAGE,aufstage)
      }
   
   
   }
   }


funtioniert's...

omega psi#13
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

27.02.2008, 16:15

Das ist eine ziemlich wilde Geschichte...

Architectures - Refactoring - Prototyping - Coding - Training
badskill#14
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

27.02.2008, 17:21

Hi,
warum übergibst du B nicht einfach eine Referenz von A, so wie es omega psi in RE5 bereits geschrieben hat.
Das wäre es doch dann schon.


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   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de