PDA

Volledige versie bekijken : Probleem met XML in class


kamikaze
%Europe/Berlin %709 %2005, 18:01
Het lukt me steeds niet om binnen een class een xml bestand in te laden. Als je ik gewoon in een flash file probeer een bestand in te laden gaat het goed, maar binnen de class lukt het niet.
Stukje code:

class loadXML
{
var m_cXML:XML;

private function loadData(bSuccess:Boolean)
{
if(bSuccess)
{
trace('Loading complete');
}
else
{
trace('Could not load XML file');
}
}

public function loadXML(sFile:String)
{
this.m_cXML = new XML();
this.m_cXML.onLoad = this.loadData;
this.m_cXML.load(sFile);
}
}

Dauntless
%Europe/Berlin %715 %2005, 18:09
Ik zie niet direct een fout... Je weet zeker dat je hem juist oproept e.d. ?

TheDutch
%Europe/Berlin %715 %2005, 18:10
....................

Roenes
%Europe/Berlin %716 %2005, 18:11
Werkt dit?

class loadXML
{
var m_cXML:XML;

private function loadData(bSuccess:Boolean)
{
if(bSuccess)
{
trace('Loading complete');
}
else
{
trace('Could not load XML file');
}
}

public function loadXML(sFile:String)
{
m_cXML = new XML();
m_cXML.onLoad = loadData;
m_cXML.load(sFile);
}
}
Zo niet, maak dan eens de functie loadData public :)

Dauntless
%Europe/Berlin %717 %2005, 18:13
Ik heb het nu ook even getest (exact zoals jij het hebt) en het werkt...

TheDutch
%Europe/Berlin %718 %2005, 18:15
Wat dacht je van?

// Zorg dat je Flash MX 2004 7.2 hebt!
import mx.utils.Delegate;

public function loadXML(sFile:String)
{
this.m_cXML = new XML();
this.m_cXML.onLoad = Delegate.create(this, loadData)
this.m_cXML.load(sFile);
}

Dauntless
%Europe/Berlin %719 %2005, 18:15
Wat dacht je van?

import mx.utils.Delegate;

public function loadXML(sFile:String)
{
this.m_cXML = new XML();
this.m_cXML.onLoad = Delegate.create(this, loadData)
this.m_cXML.load(sFile);
}

Dat probleem gaat hij pas hebben wanneer hij vanuit de loadData class een functie uit de class wilt oproepen...
Ps: Zorg ervoor dat je dan geupgrade hebt naar 7.2 :)

Hehe, als er zo'n AS 2.0 classe vraag voorbij komt wilt iedereen direct helpen :D (spijtig genoeg komen die niet vaak :( :( )

Dauntless
%Europe/Berlin %719 %2005, 18:16
Dat probleem gaat hij pas hebben wanneer hij vanuit de loadData class een functie uit de class wilt oproepen...
Ps: Zorg ervoor dat je dan geupgrade hebt naar 7.2 :)

Hehe, als er zo'n AS 2.0 classe vraag voorbij komt wilt iedereen direct helpen :D (spijtig genoeg komen die niet vaak :( :( )

TheDutch
%Europe/Berlin %722 %2005, 18:20
Dat probleem gaat hij pas hebben wanneer hij vanuit de loadData class een functie uit de class wilt oproepen...
Ps: Zorg ervoor dat je dan geupgrade hebt naar 7.2 :)
Het is gewoon goed om altijd die Delegate class voor dit soort dingen te gebruiken, maakt de boel ook sneller :).

Dauntless
%Europe/Berlin %723 %2005, 18:22
Het is gewoon goed om altijd die Delegate class voor dit soort dingen te gebruiken, maakt de boel ook sneller :).
Je gaat hem zowieso nog nodig hebben.. (Je kan moeilijk al de rest van je class in de loadData zetten :p). Maar 'k wist niet dat hij het ook sneller maakt? Heb je daar ergens lectuur van?

TheDutch
%Europe/Berlin %724 %2005, 18:23
Precies, als je goed OOP gaat gebruiken is die class in AS2 gewoon onmisbaar :).

Tuurlijk heb ik lecture, klik! (http://www.actionscript.org/tutorials/beginner/the_delegate_class/index.shtml)
3e regel...

kamikaze
%Europe/Berlin %739 %2005, 18:45
Dat vanb Delegate classes begrijp ik nog niet helemaal. Daar zal ik even naar kijken.
De code die hier staat is letterlijk gekopieërd van wat ik heb. Ik zal eens proberen om de functie loadData public te maken. Dit is natuurlijk niet echt netjes verder maar als het werkt.

Edit: bedankt mensen. Het werkt nu. Ik heb de functie loadData public gemaakt en ik krijg nu Data loaded :)
Ik zal ook maar eens updaten, want ik gebruik 7.0 nog zie ik :)

TheDutch
%Europe/Berlin %743 %2005, 18:50
Met de Delegate class hoef je hem niet public te maken volgensmij :).
Het is niet zo netjes om die functie public te hebben...

kamikaze
%Europe/Berlin %746 %2005, 18:54
Met de Delegate class hoef je hem niet public te maken volgensmij :).
Het is niet zo netjes om die functie public te hebben...

Nee, dat zei ik ook al.
Heeft er nog iemand een tutorial en/of uitleg over delegated classes? Ik kan hier tussen de tutorials niks vinden. In de help van Flash MX staat ook niks.

Dauntless
%Europe/Berlin %748 %2005, 18:57
Hier een tut! (http://www.senocular.com/?id=0.163)
Het vreemde is wel: ik heb jouw classe rechstreeks gekopieerd en bij mij werkt hij!!

kamikaze
%Europe/Berlin %750 %2005, 19:01
Bedankt voor de tutorial.
Ik heb hem ook rechtstreeks gekopieërd, maar misschien dat het een versie probleem is? Ik werk nog met een oude versie van Flash MX. Versie 7.0 nog. Ben hem nu maar direct aan het updaten :)

TheDutch
%Europe/Berlin %751 %2005, 19:01
Heeft er nog iemand een tutorial en/of uitleg over delegated classes? Ik kan hier tussen de tutorials niks vinden. In de help van Flash MX staat ook niks.
Als je even naar boven scrolled dan zie je de link naar een tutorial voor beginners :).

kamikaze
%Europe/Berlin %752 %2005, 19:03
Sorry, die had ik over het hoofd gezien :$

Edit: @Dauntless: Ik heb mijn flash versie nu ook geupdate en dan doet mijn script het ook gewoon. Was dus blijkbaar ergens een versie probleem.

kamikaze
%Europe/Berlin %815 %2005, 20:34
Sorry voor de dubbelpost, maar ik heb nog een vraag.
Ik laat nu mijn class data ophalen uit een XML bestand, maar hoe zorg ik er voor dat mijn code pas weer verder gaat als mijn XML bestand is ingeladen?

TheDutch
%Europe/Berlin %819 %2005, 20:40
In the onLoad een andere functie aanroepen die de rest verwerkt of het in the onLoad laten verwerken.

kamikaze
%Europe/Berlin %823 %2005, 20:45
Ik roep mijn class aan en dan wordt in de constructor de XML geladen en de onload aangeroepen. Als ik nu echter na het aanmaken van de class nog een functie aanroep, dan geeft deze incorrecte data terug, omdat flash nog niet klaar is met laden van de XML. Een functie in de onLoad aanroepen is dus geen optie.

Dauntless
%Europe/Berlin %850 %2005, 21:25
Dan moet je wachten tot je class zelf de betreffende functie oproept... Je kan ook je eigen listener maken dmv de eventDispatcher class. Dan kan je wachten tot je data is ingeladen:)

Tommyfied
%Europe/Berlin %854 %2005, 21:30
Of gewoon een preloadertje erin zetten? (Good ol' getBytesLoaded en getBytesTotal gaan hier volgens mij ook gewoon op :))

Dauntless
%Europe/Berlin %857 %2005, 21:35
Of gewoon een preloadertje erin zetten? (Good ol' getBytesLoaded en getBytesTotal gaan hier volgens mij ook gewoon op :))
Dan moet je nog een public method maken die dan weer de bytes opvraagt van het xml object? Of denk ik te moeilijk? :) (doe ik namelijk vaak :p)

TheDutch
%Europe/Berlin %883 %2005, 22:12
Ik roep mijn class aan en dan wordt in de constructor de XML geladen en de onload aangeroepen. Als ik nu echter na het aanmaken van de class nog een functie aanroep, dan geeft deze incorrecte data terug, omdat flash nog niet klaar is met laden van de XML. Een functie in de onLoad aanroepen is dus geen optie.
Wanneer in de constructor method een onLoad functie staat kan je daar gewoon een private of public method uitvoeren hoor. Snap je probleem niet echt.

Volgensmij maak je het moeilijker dan het is :).

Dauntless
%Europe/Berlin %884 %2005, 22:14
Wanneer in de constructor method een onLoad functie staat kan je daar gewoon een private of public method uitvoeren hoor. Snap je probleem niet echt.

Volgensmij maak je het moeilijker dan het is :).
Welja, je kan toch niet gewoon : classeInstance.getBytesLoaded() doen? Je moet aan het getBytesLoaded() van de xml graken. En die moet je dan toch in bv een onEnterFrame oproepen dmv een public method?

TheDutch
%Europe/Berlin %891 %2005, 22:24
Let niet op de code, is nogal snel neergezet zonder op syntax enzo te letten, gaat om het idee :).

// Constructor
function getXML(url){
xmlObj.onLoad = function(){
processXML(this);
}
xmlObj.load(url);
}

function processXML(xml){
trace("XML wordt verwerkt");
}

Dauntless
%Europe/Berlin %893 %2005, 22:26
Maar 'k heb het over het preloader deel, niet over het verwerken :p

TheDutch
%Europe/Berlin %894 %2005, 22:28
// Constructor
function getXML(url,textfield){
xmlObj.onLoad = function(){
delete this.onEnterFrame;
processXML(this);
}
xmlObj.load(url);
xmlObj.onEnterFrame = function(){
percentage = Math.floor((this.getBytesLoaded() / getBytesTotal() ) * 100);
textfield.text = percentage + " %";
}
}

function processXML(xml){
trace("XML wordt verwerkt");
}

Het kan zijn dat we langs elkaar heen praten, maar dan hoor ik graag waar het nu werkelijk om gaat ;).

kamikaze
%Europe/Berlin %940 %2005, 23:34
Nee, ik denk dat ik er wel uit kom hiermee. Had nog niet gedacht aan de onEnterFrame event. Allemaal bedankt in ieder geval :D

Dauntless
%Europe/Berlin %942 %2005, 23:37
Het kan zijn dat we langs elkaar heen praten, maar dan hoor ik graag waar het nu werkelijk om gaat ;).
Ik dacht dat hij een method van z'n class zou oproepen vanuit flash zelf (en niet vanuit de class) nadat het laden voltooid was. En dan zou de onEnterFrame buiten de class moeten staan , en zou je dus een andere method moeten oproepen die de getBytesLoaded() van het xml object weergeeft. Niet ?

TheDutch
%Europe/Berlin %211 %2005, 06:05
Ja, klop! :)

kamikaze
%Europe/Berlin %355 %2005, 09:31
Ik dacht dat hij een method van z'n class zou oproepen vanuit flash zelf (en niet vanuit de class) nadat het laden voltooid was. En dan zou de onEnterFrame buiten de class moeten staan , en zou je dus een andere method moeten oproepen die de getBytesLoaded() van het xml object weergeeft. Niet ?
Dat bedoel ik inderdaad.

TheDutch
%Europe/Berlin %376 %2005, 10:01
Persoonlijk combineer ik niet graag procedural en OOP code, maar dat verschilt eigenlijk weer per project. Grote projecten alles OOP, kleinere kan gecombineerd omdat dit tijd scheelt.

Maar om op jouw manier verder te borduren :).
Je kunt ook een local variable in the class maken die je later gebruikt als XML object en die op deze manier uitlezen:

className.XMLObj.getBytesLoaded();
className.XMLObj.getBytesTotal();

kamikaze
%Europe/Berlin %380 %2005, 10:08
Ik heb het probleem opgelost op de volgende manier:
Ik heb in mijn class een functie loaded() gemaakt.
Op de keyframe heb ik nu de class aangemaakt en daarna laat ik een onEnterFrame lopen. Deze controleerd of de functie loaded() true geeft. Als dat zo is, roept hij de functie main() aan en vernietigd hij zichzelf. In de functie main staat de rest van de code.

Dauntless
%Europe/Berlin %381 %2005, 10:09
Persoonlijk combineer ik niet graag procedural en OOP code, maar dat verschilt eigenlijk weer per project. Grote projecten alles OOP, kleinere kan gecombineerd omdat dit tijd scheelt.

Maar om op jouw manier verder te borduren :).
Je kunt ook een local variable in the class maken die je later gebruikt als XML object en die op deze manier uitlezen:

className.XMLObj.getBytesLoaded();
className.XMLObj.getBytesTotal();

Bij een groot project waarbij je een grote interface hebt, doe je dan ook alles OOP ? :o Dan zet je dus alles via attachMovie() op je stage? Anders moet je toch vanuit flash acties toewijzen aan je knoppen?

TheDutch
%Europe/Berlin %431 %2005, 11:21
Dan doe ik inderdaad zoveel mogelijk met attachMovie :).