• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 04-12-2006, 16:46   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
Kennt eine Klasse Ihren eigenen Instanznamen?

Hallo zusammen,

ich arbeite gerade an einer AS Klasse, die die Erstellung eines Menüs ausführen soll. Also addButton.. addSubButton etc...

Mein Problem: In der Klasse werden die Buttons als separate MovieClips im Hauptfilm erzeugt. Jeder Button bekommt dann ne Reihe von on-Mouse... Funktionen zugewiesen.

Und hier ist das Problem: bei einem onPress sollte der Button eine Funktion der Klasse ausführen. Nur weiß der Button ja nicht, wie die Instanz der Klasse auf der _root Ebene heißt und weder _parent noch this beziehen sich auf die Klasse, so dass ich darüber auch keine Funktion aufrufen kann.

Hat jemand einen Rat? Vielen Dank!

Und hier noch ein Code-Schnippsel...

Class dynMenu(){
[....]
function initialize(){
[...]


eval("dynbtn"+i).onPress = function() {
var depth = 100+this.localMenuNumber;
// ###################################
// PROBLEM: INSTANCE NAME! HOW TO GEHT IT HERE "m"????
// ###################################
_root.m.showMenuLevel(this.localMenuNumber);
}
// label the button
eval("dynbtn"+i+"."+this.MainBtnLabelField).text = this.MenuButtons[i][1];
NumberOfButtons++;
}
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 16:53   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
eine möglichkeit:
du vergibst ids, also eindeutige nummern...

diese fragst du dann in den "on..." methoden ab...

beispiel:
class Beispiel{
var id:Number;
function Beispiel(id:Number):Void {
this.id=id;
}
function onPress() {
if (this.id == 0) {
...
} else if (this.id == 1)
...
} // usw.
}
}

Geändert von Omega Psi (04-12-2006 um 16:55 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:00   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
@Omega Psi

Danke für den Tip. Das mit der ID ist gut, aber das löst glaube ich nicht das Problem.

Bei

eval("dynbtn"+i).onPress = function() {
if (this.id == ...)
}

bezieht sich das this natürlich auf den Button. Aber den kenne ich natürlich und er kennt sich selbst auch. Aber woher kennt der Button denn die Klassen, die ihn erzeugt?

Leider geht ja sowas

eval("dynbtn"+i).onPress = function(mynMenu) {
if (this.id == ...)
}

auch nicht.
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:04   #4 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
anbei auch einfach mal die as und ein test fla dazu... danke für hilfe im voraus
Angehängte Dateien
Dateityp: zip dynamisches_menu.zip (6,7 KB, 7x aufgerufen)
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:05   #5 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Wo oder wann genau willst du den Buttons die events zuweisen?
Schon in der Klasse oder soll der Benutzer deiner Klasse diese events erst nach der Erstellung der Instanz diese zuweisen?
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:06   #6 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
Hi rendner,

die Events werden innerhalb der DynMenu-Klasse zugewiesen.

DynMenu sollte also den Button erstellen und gleich die Events zuweisen.
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:06   #7 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Sorry, ich hatte das falsch gelesen.

Aber genau für solche Fälle brauchst du _parent (sonst macht die inverse traversierung über _parent keinen Sinn und die Eigenschaft ist sinnlos). _parent adressiert doch genau den MovieClip, der als Container für ButtonMovieClip dient. dabei aber keine Klasse sondern die Instanz direkt.

Mit der id kannst du dann eine Buttonklasse erzeugen, die als Schablone für alle Buttons dient.

class Beispiel{
var id:Number;
function Beispiel(id:Number):Void {
this.id=id;
}
function onPress() {
if (this.id == 0) {
trace(this._parent);
} else if (this.id == 1)
trace(this._parent);
} // usw.
}
}


Sollte so funktionieren, da ich genau mit dieser Idee arbeite - ist aber gerade aus dem Kopf heraus geschrieben.

Geändert von Omega Psi (04-12-2006 um 17:09 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:08   #8 (permalink)
nobody is perfect
 
Benutzerbild von richtsteiger
 
Registriert seit: Jul 2004
Ort: munich
Beiträge: 873
Hi,

also dann übergeb einfach eine Referenz auf die Instanz. Und das brauchst du auch gar nicht mit der id zu machen. Hier mal grob die Vorgehensweise:
PHP-Code:
...
function 
XXX () {
  ...
  
// in deiner Klasse
  
var self:Object this// hier die Instanz merken
  
eval("dynbtn"+i).onPress = function() { 
    
self.test(); // und hier drauf zugreifen
  
}
  ...
}
function 
test() {
  
trace("Hallo");
}
... 
richtsteiger ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:09   #9 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
Hi OmegaPsi,

die Idee hatte ich auch. Aber das ist ja das blöde, dass _parent den MovieClip anpeilt, leider nicht die Instanz einer Klasse.

_parent verweist also bei all meinen Buttons auf _root. That's it. Und in _root gibt es die Instanz der DynMenu Klasse, aber auf die zeigt _parent leider net. Zum Verzweifeln... mir kommen das so Dinge in den Kopf wie Reflection unter Java... gibts so was für Flash?
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:12   #10 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
@richtsteiger

Danke für den Tip...

Das geht leider auch nicht weil das self nicht in die onPress Funktion übergeben wird.
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:17   #11 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
Oh mann, ich habs.


ich mach im Konstruktor der Klasse einfach ein

_root.DynMenu_Instance = this;

und auf _root.DynMenu_Instance kann ich immer zugreifen.

Dann habe ich zwar ein bisschen mit OOP gebrochen und eine böse globale Veriable reingemacht, aber es funktioniert.

DANKE FÜR DIE TIPS!
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:17   #12 (permalink)
nobody is perfect
 
Benutzerbild von richtsteiger
 
Registriert seit: Jul 2004
Ort: munich
Beiträge: 873
Versteh ich nicht, warum das denn nicht sollte. Ich realisier das nur so. Funktioniert auch alles prima. Vielleicht liegst ja auch an deinem eval?
Schon mal versucht mit
PHP-Code:
this["dynbtn" i].onPress = function() { 
Wie gesagt, bei mir geht's und zwar bei jedem onClipEvent
richtsteiger ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:19   #13 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
@richtsteiger

Interessant. Machst Du die Erzeugung auch innerhalb einer Klasse, die einen Button erzeugt, der eine onPress Funktion hat?
andi2003 ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:19   #14 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Habe mir noch einmal deinen ersten Beitrag durchgelesen... meinst du vielleicht so etwas?

PHP-Code:
import mx.utils.Delegate;

class 
Menue
{
    public function 
MenuetimelineMovieClipattachIDString )
    {
        
createtimelineattachID );
    }
    
    private function 
createtimelineMovieClipattachIDString ): Void
    
{
        var 
buttMovieClip timeline.attachMovieattachID"_t"timeline.getNextHighestDepth() );
        
butt.onPress Delegate.createthisonPress );
    }
    
    private function 
onPress(): Void
    
{
        
trace"hallo" );
        
test();
    }
    
    private function 
test(): Void
    
{
        
trace"test" );
    }

Aufruf in der fla: (in der bibo muss ein mc mit dem Verknüpfungsnamen "mc" zum export bereit liegen)
PHP-Code:
new Menuethis"mc" ); 
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 04-12-2006, 17:22   #15 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 11
@rendner

Also das

Delegate.create( this, onPress );

sieht verdammt schick aus. Was ist das Da gehe ich wehmütig zurück zum Manual...

Danke!
andi2003 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele