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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-08-2006, 11:25   #1 (permalink)
_M++
 
Benutzerbild von monroe
 
Registriert seit: Mar 2004
Ort: Stuttgart
Beiträge: 400
loadVars

Mahlzeit

Ich habe mal eine Frage bezüglich loadVars.

Wie geht ihr denn mit der Kommunikation zwischen PHP und FLASH um.
Habt ihr eine zentrale Funktion oder Klasse die dies managed, oder definiert ihr an 50 verschiedenen Orten dann 50 verschiedene loadVars.

Ich hab mir eine zentrale Funktion geschrieben, die das Daten-Management übernimmt. Ich bin jedoch nicht zufrieden, da diese Funktion sehr unflexibel ist.

Wie geht ihr damit um?

Ich bedanke mich mal

gruss
monroe ist offline   Mit Zitat antworten
Alt 21-08-2006, 11:31   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.086
"..Ich bin jedoch nicht zufrieden, da diese Funktion sehr unflexibel ist .. Wie geht ihr damit um?.."
genauso: wir sind damit unzufrieden ;-)

zeig vielleicht einmal deine lösung und sage uns, was genau dir daran nicht passt. da kann man drüber reden.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 21-08-2006, 11:48   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
Bei uns läuft sowas immer über eine zentrale Klasse, ich würde ganz im Gegenteil behaupten, das das sehr flexibel ist.
Womit hast du denn Probleme?
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 21-08-2006, 11:53   #4 (permalink)
_M++
 
Benutzerbild von monroe
 
Registriert seit: Mar 2004
Ort: Stuttgart
Beiträge: 400
Servus

Zitat:
Zitat von Janoscharlipp
Bei uns läuft sowas immer über eine zentrale Klasse, ich würde ganz im Gegenteil behaupten, das das sehr flexibel ist.
Womit hast du denn Probleme?
Ja deine Lösung sicher, meine nicht


Also meine Lösung sieht folgendermaßen aus.

Ich habe eine Funktion unter _root definiert, die einen Parameter übergebene bekommt.
Innerhalb der Funktion wird dann ein loadVars Objekt erzeugt und die Daten aus der PHP Datei gelesen.

Bin ich jetzt in einem MC zum Beispiel _root.xxx.meinMC rufe ich die _root.funktion auf.
Am liebsten wäre mir, wenn die _root.funktion den Inhalt aus der PHP Datei einfach zurück gibt und ich im MC: _root.xxx.meinMC dann meinString = _root.funktion schreiben kann.
Ich bekomme jedoch immer einen Leerstring zurück. Ich vermute weil die Daten noch nicht verfügbar sind wenn die Funktion die Daten zurück gibt.

Ich habe dies dann gelöst, dass meine _root.funktion eine funktion (zum Beispiel: _root.xxx.meinMC.schreibeDatenAusPhpInTextdatei() ) aufruft wenn die Daten geladen sind. Dann funktioniert es.

Und das ist schon meine Frage, wie kann dies umgehen das ich nicht irgendwelche Funktionen aufrufen muss die Daten an gewünschtem Ort und Stelle verfügbar zu machen.

Wenn es zu verwirrend ist erkläre ich es gerne noch mal

Vielen dank

Gruss

Geändert von monroe (21-08-2006 um 11:54 Uhr)
monroe ist offline   Mit Zitat antworten
Alt 21-08-2006, 12:01   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.086
du hasst dir bereits selbst die antwort gegeben:
"..Ich vermute weil die Daten noch nicht verfügbar sind wenn die Funktion die Daten zurück gibt.."
das ist korrekt!

AS wartet nicht, bis die daten geladen sind, sondern der aktuelle script wird zu ende geführt.
der vorgang etwas vom server nach zu laden geschieht asynchron. die daten kommen irgendwann viel später - oder auch garnicht.
sonst bräuchte man ja auch keine empfangs-funktionen wie onLoad durch .send, .load bzw .sendAndLoad ausgelösst.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (21-08-2006 um 13:54 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 21-08-2006, 12:13   #6 (permalink)
_M++
 
Benutzerbild von monroe
 
Registriert seit: Mar 2004
Ort: Stuttgart
Beiträge: 400
danke für die Antwort

Aber wie bewerkstellige ich dass dann?
In meiner _root.funktion befindet sich eine Routine die prüft ob die Daten erfolgreich und ganz geladen wurden.
Sollte ich die Daten extern zwischenspeichern? Dann müsste ich ja aber in einem onEnterFrame fragen wann diese Variable "gefüllt" wäre.

Mir ist nicht klar wie ich auf diesen Ladevorgang (onLoad) in der Funktion, an einer anderen Stelle warte.

Gruss

Geändert von monroe (21-08-2006 um 12:14 Uhr)
monroe ist offline   Mit Zitat antworten
Alt 21-08-2006, 13:20   #7 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
Du wartest garnicht, sondern du übergibst deiner _root-Funktion eine Callback-Funktion, die dann die Daten verarbeitet.

Allerdings würde ich für sowas als allererstes mal ne Klasse anlegen, die sich um die Ladevorgänge kümmert, einfach so ne Funktion in _root ... das ist nicht wirklich sauber.
Die Klasse kannst du dann auch immer wieder verwenden, durch die Callbacks ist sie allgemein einsetzbar.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 21-08-2006, 13:35   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.086
"..Dann müsste ich ja aber in einem onEnterFrame fragen wann diese Variable "gefüllt" wäre.."
ja, nur eleganter: das onLoad-event teilt dir genau das mit.

meine besten 'erklärversuchsergebnisse' hatte ich damit (sinngemäss):
du arbeitest nur in frame1.

function xxxx.onLoad(ok)
{ if (ok) gotoAndPlay(2);
}

sobald der programmablauf in frame 2 angekommen ist kannst du die geladenen daten benützen.
das mit den frames dient nur zur erklärung. das geht auch, wenn du nach if-ok eine funktion aufrufst.

jedenfalls, die ursprünglich auslösende funktion ist abgelaufen, tot, passe, im datenhimmel, wo auch immer aber auf garkeinen fall mehr auf empfang!
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (21-08-2006 um 13:40 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 21-08-2006, 13:48   #9 (permalink)
_M++
 
Benutzerbild von monroe
 
Registriert seit: Mar 2004
Ort: Stuttgart
Beiträge: 400
ich dank euch, ich werd dies mal mit einer Klasse verusuchen und euch spätestens dann wieder nerven

danke

Gruss
monroe ist offline   Mit Zitat antworten
Alt 23-08-2006, 19:39   #10 (permalink)
_M++
 
Benutzerbild von monroe
 
Registriert seit: Mar 2004
Ort: Stuttgart
Beiträge: 400
hallo jungs

ich hab meine erste klasse in flash geschrieben, bitte nicht hauen!!!
sind arge Konzeptionsfehler vorhanden?

*angst hat*

ich hab eine PHP Datei:
php.php
PHP-Code:
$sRet "flashforum";
echo 
"&phpinfo=".urlencode(utf8_encode($sRet)); 
einen movieclip in der ich meine klasse aufrufe:
Code:
    import CphpDb; var oDb:CphpDb = new CphpDb(); textfeld.text = oDb.ausgabe;

und meine klasse!

Code:
    /************************************************************************************************************** **************************************************************************************************************/ class CphpDb //************************************************************************************************************* {     private var lvData:LoadVars;     private var sData:String;         function CphpDb()     {         //erzeugt ein neues LoadVar Objekt         lvData = new LoadVars();         sData = "err";     } //end Konstruktor         private function onLoadData():Number     {         var nRet:Number = 0;         lvData.onLoad = function(sucess)         {             if (sucess)             {                 sData = this.phpinfo;                 nRet = 1;             }             else             {                 nRet = 0;             } //end if         } //end onLoad         return nRet;     } //end onLoadData         private function sendData():Number     {         var nRet:Number = 0;         lvData.sendAndLoad('php.php', lvData);         if (onLoadData() == 1)         {             nRet = 1;         }         return nRet;     } //end sendData         public function get ausgabe():String     {         if (sendData() == 1)         {             return sData;         }     } //end get sData } //end class

ausgegeben wird ein undefined!



danke für euer bemühen

gruss
monroe ist offline   Mit Zitat antworten
Alt 23-08-2006, 20:49   #11 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
Jepp, da sind Konzeptionsfehler drinn

Also, es ist ja klar, dass das Laden von Daten in Flash immer asynchron abläuft, d.h. du startest eine Anfrage, kannst aber nicht im gleichen Atemzug die Daten verwenden, sondern musst entweder regelmäßig prüfen, ob die Daten da sind, oder über ein Callback verständigt werden.

Wenn man jetzt das hier ansieht:
Code:
    import CphpDb;       var oDb:CphpDb = new CphpDb(); textfeld.text = oDb.ausgabe;

Dann fehlt da schonmal das Asynchrone, egal was deine Klasse tut, so kann es nicht gehen, da oDb.ausgabe noch nicht definiert sein kann.

Am besten du baust mal in deinen Code ganz viele traces ein, und gibst an, was grad passiert, und dann noch die Zeit (einfach getTimer()) dazu aus, dann siehst du, wie dein aktueller Code durchlaufen wird.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 02-09-2006, 12:09   #12 (permalink)
_M++
 
Benutzerbild von monroe
 
Registriert seit: Mar 2004
Ort: Stuttgart
Beiträge: 400
servus Janoscharlipp und CO

ich war leider eine Weile verhindert und konnte nicht weiter machen. Aber ich habe troztdem eine Frage. Wie kann ich denn die onLoad Funktion public machen, so dass ich abfragen kann wann die Daten fertig geladen wurden.

zum Beispiel:
wenn objekt.status = ok ist dann
objekt.ausgabe der dateien

ich verzweifel:

Code:
    class CphpDb {     private var lvData:LoadVars;     private var sData:String;     private var bStatus:Boolean;         function CphpDb()     {         lvData = new LoadVars();         sData = "err";     }         private function getDataFromPhp()     {         lvData.sendAndLoad('php.php', lvData, 'POST');         lvData.onLoad = function (sucess)         {             if (sucess)             {                 sData = this.phpinfo;                 bStatus = true;             }         } //end onLoad        }         public function get stat()     {         getDataFromPhp();         if (bStatus == true)         {             return true;         }     }         public function ausgabe():String     {         return sData;     }             }

aufruf:

Code:
    import CphpDb; var oDb:CphpDb = new CphpDb(); if (oDb.stat) {     a.text = oDb.ausgabe(); }



danke für die hilfe

gruss
monroe ist offline   Mit Zitat antworten
Alt 02-09-2006, 13:09   #13 (permalink)
notzucht
 
Benutzerbild von shorty
 
Registriert seit: Nov 2003
Ort: Potsdam
Beiträge: 2.939
Mit Events vieleicht?

Biliges beispiel:
PHP-Code:
<?php
    
echo "&word=hello world!&";
?>
PHP-Code:
import mx.utils.Delegate
import mx
.events.EventDispatcher

class CphpDb
{
    
    var 
source LoadVars
    
var data String
    
    
private var dispatchEvent : Function
    public var 
addEventListener : Function
    public var 
removeEventListener : Function
    
    function 
CphpDb ()
    {
        
EventDispatcher.initializethis )
    }
    
    public function 
load url String )
    {
        
source = new LoadVars ()
        
source.onLoad Delegate.create thisonDataComplete )
        
source.sendAndLoad urlsource'POST' )        
    }
    
    private function 
onDataComplete success Boolean )
    {
        if ( 
success )
        {
            
data source.word
            dispatchEvent 
( {type:'onDataComplete'target:this} );
        }
    }
    

PHP-Code:
var test CphpDb = new CphpDb ()
function 
output Object )
{
    
trace (e.target.data)
}
test.addEventListener 'onDataComplete'output )
test.load 'http://localhost/say.php' 
Anbei noch ein link zum Eventdispatcher: http://www.asnative.de/artikel/eventdispatcher.html
__________________
.
Flex in a week | Viertel vor halb nach Vollmond | ^^°.°^^ | Waltz with Bashir
.

Geändert von shorty (02-09-2006 um 13:12 Uhr)
shorty 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 23:49 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele