Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 01-02-2006, 02:23   #1 (permalink)
Neuer User
 
Registriert seit: Jun 2004
Beiträge: 9
Question Probleme mit OOP. Variable geht 'verloren'

Kluges und waches Forum,

ich versuche mich gerade in OOP und habe nun ein kleines Verständnisproblem.

Aus einer Klasse heraus wird ein MovieClip aus der Bibliothek attached. Der 'attachte' MovieClip wird dann in einer return Anweisung in eine Variable geschrieben, die ich vorher im Klassenkopf initialisiert habe.
Wieso wird mir nun in der Methode checkCurrentframe25() in der onEntreFrame-Funktion eine undefinierte Variable ausgegeben, wenn diese doch vor der onEnterFrame-Anweisung noch existierte?

PHP-Code:
class BALKEN_FORUM {
    
    private var 
target_mc:MovieClip;
    private var 
attach_mc:String;
    private var 
balken_container_mc:MovieClip;
    private var 
balken_1:MovieClip;
    private var 
balken:MovieClip;
    
    public function 
BALKEN_FORUM(mc1:MovieClipmc2:String) { // konstruktor
            
        
target_mc mc1;
        
attach_mc mc2;
        
balken attachContainerMC();
            
    } 
// ende function BALKEN()
    
    
public function btnOver():Void {
    
        
balken_container_mc.play();
        
checkCurrentframe25(balken);
            
    } 
// ende function btnOver()
    
    
private function checkCurrentframe25(mc:MovieClip):Void {
            
        
trace("******"+balken_1); // trace gibt MovieClip aus
        
trace("******"+mc);
        
mc.onEnterFrame = function() {
            
            
trace("++++++"+balken_1); // trace ist undefined
            
trace("++++++"+mc);
            
            if (
mc._currentframe == 25) {
                
                
delete mc.onEnterFrame;
                
trace(mc);
                    
            }
        }
        
    } 
// ende function checkCurrentframe()
    
    
private function attachContainerMC():MovieClip {
    
        
balken_container_mc target_mc.attachMovie(attach_mc"attach_mc_"1);
        
balken_container_mc.stop();
        
balken_1 balken_container_mc.balken_inside_mc.attachMovie("balken_ani""balken_ani"+11);
        
        return 
balken_container_mc;
        
    }
// ende function attachContainerMC
    
    
// ende class BALKEN_FORUM 

Geändert von padawan (01-02-2006 um 02:25 Uhr)
padawan ist offline   Mit Zitat antworten
Alt 01-02-2006, 02:36   #2 (permalink)
Banned
 
Benutzerbild von _level0
 
Registriert seit: Jan 2006
Beiträge: 849
this._parent.balken_1...

du rufst aus "mc" "balken_1 auf, der ligt aber auf der selben ebene wie mc also musste du erstmal _parent eine bebene höher
_level0 ist offline   Mit Zitat antworten
Alt 01-02-2006, 03:02   #3 (permalink)
Neuer User
 
Registriert seit: Jun 2004
Beiträge: 9
Hi ,
Deine Lösung hört sich gut an, funktioniert leider nicht.


Ausserdem dachte ich, daß ich ein Variable aufrufe die in der Klasse selber existiert, da ich sie am Anfang der Klasse initialisiere:
Code:
private var balken_1:MovieClip;

Geändert von padawan (01-02-2006 um 03:04 Uhr)
padawan ist offline   Mit Zitat antworten
Alt 01-02-2006, 04:12   #4 (permalink)
Banned
 
Benutzerbild von _level0
 
Registriert seit: Jan 2006
Beiträge: 849
ups sorry hast recht...

wie siehts denn mit "this" aus, blödfrag?
_level0 ist offline   Mit Zitat antworten
Alt 01-02-2006, 06:50   #5 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
moin

es stimmt der gültigkeitsbereich der variable nicht mehr.
durch das mc.onEnterFrame verlässt du die klasse und bist nun innerhalb des mc .
wäre balken_1 eine lokale variable also ein

var balken_1

dann könnteste darauf zugreifen versuch das mal

PHP-Code:
var bl MovieClip balken_1
 mc
.onEnterFrame = function() {
            
            
trace("++++++"+bl);
            
trace("++++++"+mc);
            
            if (
mc._currentframe == 25) {
                
                
delete mc.onEnterFrame;
                
trace(mc);
                    
            }
        } 
mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 01-02-2006, 11:37   #6 (permalink)
Neuer User
 
Registriert seit: Jun 2004
Beiträge: 9
@ _level0
Code:
trace("++++"+this.balken1);
... funktioniert leider auch nicht.

der ansatz von atothek funktioniert!
Und vor allem danke ich für Deine Erklärung, wieso es nicht funktionierte! das macht einiges klarer für mich!

Danke und Gruß,
Martin
padawan ist offline   Mit Zitat antworten
Alt 01-02-2006, 12:21   #7 (permalink)
Neuer User
 
Registriert seit: Jun 2004
Beiträge: 9
Hi,

das Problem mit der Variable hat sich ja nun gelöst. Was ist aber, wenn ich in dem onEnterFrame-Konstrukt eine Methode aufrufen will, die sich in der Klasse befindet?

PHP-Code:
private function checkCurrentframe25(mc:MovieClip):Void {

    var 
b1:MovieClip balken1;
    
animiereBalken("out"); // funktioniert
    
    
mc.onEnterFrame = function() {
        
        if (
mc._currentframe == 25) {
            
            
animiereBalken("in"); //funktioniert nicht
            
b1._width += 5;
            
            if (
b1._width >= 100) {
                
                
b1._width 100;
                
delete mc.onEnterFrame;
            
            }
            
        }
    
    } 
// ende onEnterFrame = function()
    
// ende function checkCurrentframe()
    
public function animiereBalken(parameter:String):Void {
    
    
trace("animiereBalken "+parameter);
        
// ende function animiereBalken() 
Habe mir dann überlegt, weil ich die Klasse ja verlasse, die Methode mit dem Klassenpfad anzusprechen, also quasi:
PHP-Code:
BALKEN_FORUM.animiereBalken("in"
Dies funktioniert auch nur, wenn die Methode static ist. Leider kann ich dann nicht auf Instanzvariablen zugreifen.
Gibt's vielleicht eine Lösung?

Martin

Geändert von padawan (01-02-2006 um 12:23 Uhr)
padawan ist offline   Mit Zitat antworten
Alt 01-02-2006, 12:55   #8 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
Also ich würde dir ab jetzt zum Delegate raten.
es gibt das standard Delegate von MM ab Flash 7.2( nicht der player sondern die IDE )

import mx.utils.Delegate;

damit kannst du das onEneterFrame direkt auf deine Klasse umleiten(delegieren)
das sieht dann so aus
PHP-Code:
private function checkCurrentframe25(mc:MovieClip):Void 
// ....
mc.onEnterFrame Delegate.createthisonEnterFrameHandler );

// ...

}

function 
onEnterFrameHandler() : Void {
// und hier bist du wieder in der klasse und hast alle 
// klassen members zurverfügung wie gehabt

mfg
alex
__________________
TVNEXT Solutions

Geändert von atothek (01-02-2006 um 16:36 Uhr)
atothek ist offline   Mit Zitat antworten
Alt 01-02-2006, 16:21   #9 (permalink)
new Benutzer
 
Registriert seit: Mar 2003
Ort: Hamburg
Beiträge: 256
kann die Standart Delegate Klasse denn Parameter übergeben?
Ich erinnere mich, dass ich da schwierigkeiten hatte...

Ich benutz diese hier(hab ich auch hier aus forum, weis aber leider nicht mehr genau wo):
PHP-Code:
class Delegate {
        
        public static function 
createobjfunc ) : Function {
                var 
args : Array = arguments.splice(2);
                return function(){
                        if( 
func instanceof Function )
                        return 
func.applyobjarguments.concatargs ) );
                        else
                        return 
objfunc ].applyobjarguments.concatargs ) );
                };
        }

ciou
Markus
screamingworld ist offline   Mit Zitat antworten
Alt 01-02-2006, 16:36   #10 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
LOL na das sieht ja aus wie die Delegate klasse von mir
der link zum thema ist

Methode innerhalb der Klasse aufrufen?!

mfg
alex
__________________
TVNEXT Solutions
atothek 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 12:52 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele