Volledige versie bekijken : class property icm array
ocdaan
%Europe/Berlin %740 %2005, 18:46
Goeidag ;)
Dit word een laatste (ultime) pogin om een vraag te stellen over classes, ik denk dat dit toch te hoog gegrepen is voor de meeste mede-forum-membera want ik heb al 2 keer een vraag gesteld maar krijg helaas geen antwoord :S Als hier weer niet op geantwoord word zal dit de laatste zijn.... :O (over classes natuurlijk he ;-)
Goed, vrij simpel vraagje eingelijk:
class xmlLoader {
private var xmlArray:Array
function xmlLoader(connString:String){
Binnen de contructor word een xml pagina opgevraagd en de info word in een array gestopt:
xmlArray = new Array()
een stukje verderop (in een for loop) word in ieder item een nieuwe array gemaakt
xmlArray[i] = new Array();
en dan word de array gevult....
xmlArray[i][j] = bla die bla
Dit werkt allemaal prima, met een trace zie ik dat de array word gevult namelijk.
Maar zodra ik van buitenaf de getFile functie aanroep (zie beneden) om de array uit te lezen krijg ik een undifined. Ik begrijp niet goed waarom dit niet werkt met een array. Als ik het zelfde trukje toepas op een string variablele bv 'test' werkt het wel. Dus eerst de test var als private class property declaren, net als hierboven met de xmlArray var. Dan binnen de contructor de test var een waarde geven. En buiten de class kan ik dan via getFile() die waarde uit 'test' lezen. (functie ff aangepast voor testen) Waarom werkt dit met een string wel en niet met m'n array? de array word in ene een local var van de contructor functie.... zo lijkt het tenminste... weet iemand hoe dit komt en evt hoe dit op te losssen? Bijvoorbaat dank ;)
public function getFile(id:Number):String{
return xmlArray[id][2];
//return test;
}
//edit - foutje eruit ;-)
Dauntless
%Europe/Berlin %754 %2005, 19:05
Kan je even heel je class hier zetten? (Eventueel kan je irrelevante methods weglaten, maar zoals het er nu staat is het wat onoverzichtelijk :)).
En had je dan nog 2 anderen vragen gestelt? Ff kijken :). (Of hoeft het al niet meer? :#)
Ahja, zet ook [*AS][*/AS] rond je code (zonder asterisk weliswaar :) ).
//EDIT: Je derde vraag vind ik niet :# .
ocdaan
%Europe/Berlin %763 %2005, 19:19
Hoi Dauntless,
Geweldig dat je ff wil kijken ;)
class xmlLoader {
private var xmlArray:Array
//private var test:String
function xmlLoader(connString:String){
//test = "hoi"
var vidXML:XML = new XML();
vidXML.ignoreWhite = true;
vidXML.load(connString);
vidXML.onLoad = function(success:Boolean){
if (success) {
trace("\nXML load succes")
xmlArray = new Array()
var currentNode:XMLNode = this.firstChild.firstChild;
var i:Number = 0;
// hier doen we een soort van RS.MoveNext
for (var childNode = currentNode; childNode != null; childNode = childNode.nextSibling, i++) {
var j:Number = 0;
this.xmlArray[i] = new Array();
// hier vullen we de array met de velden uit het huidige record
for (var stringNode:XMLNode = childNode.firstChild; stringNode != null; stringNode = stringNode.nextSibling, j++) {
this.xmlArray[i][j] = stringNode.firstChild.firstChild.nodeValue;
}
}
// hardcoded wat getallen om te testen - eerste is record - 2e is het veld
trace("arr value from constructor = "+ xmlArray[4][2])
}else{
trace("\nXML load error");
}
}
}
public function getFile(id:Number):String{
return xmlArray[id][2];
//return test;
}
}
var xmlLoader:xmlLoader = new xmlLoader(url)
_root.btnX.onRelease = function() {
trace("called getFile() = "+xmlLoader.getFile(4))
}
Laiverd
%Europe/Berlin %766 %2005, 19:23
var xmlLoader:xmlLoader = new xmlLoader(url) lijkt me sowieso niet slim; een instance dezelfde naam geven als de class. Verder heb ik er nog niet naar gekeken.
John
Laiverd
%Europe/Berlin %769 %2005, 19:28
Het is een beetje een wild guess hoor maar als je in de constructor xmlArray() = new Array() doet, dan is ie volgens mij lokaal en dus buiten de functie undefined. Wat ik zou doen is in de functie tempArray = new Array() declareren en dan aan het einde van de functie een simpel xmlArray = tempArray;
In dit verhaal (of in elk geval in mijn gedachtengang) is het logisch dat wanneer je de variabele test oproept, dat dat wel werkt. Die is nl. niet lokaal.
Als dit niet werkt, wil ik vanavond nog wel even kijken, maar kun je dan misschien even ergens een voorbeeld XML bestand neerzetten dat je gebruikt?
John
ocdaan
%Europe/Berlin %770 %2005, 19:29
Nee, klopt, maar als je een volle middag loopt te pielen probeer je echt alles uit (blijkbaar niet alles - maargoed ;-) en ik merkte dat het niet uitmaakt kwa werking. Net even veranderd maar verschilt niets, nog hetzelfde probleem.
Dauntless
%Europe/Berlin %772 %2005, 19:32
Lijkt me niet echt dat je die array lokaal maakt, maar hem wel lokaal vult :D . In principe wordt hij pas lokaal als je hem terug met 'var' declareert...
Probeer die onLoad van je xml eens met Delegate om te leiden naar je class scope, misschien helpt dat ? :).
Laiverd
%Europe/Berlin %775 %2005, 19:36
Als
trace("arr value from constructor = "+ xmlArray[4][2])wel werkt in de constructor, maar niet in de public function getFile() dan lijkt me toch echt dat xmlArray() lokaal is. Maar we zullen zien; leuke puzzel ;)
Overigens: als je een var als private declareert, zou het direct opvragen ervan een parse error moeten geven. Het is netter om dan maar met getters en setters te werken, of anders de var gewoon niet private te maken.
John
TheDutch
%Europe/Berlin %777 %2005, 19:38
Even heel kort naar je code gekeken, maar zou dit niet je oplossing kunnen zijn?
public function getFile(id:Number)tring{
return this.xmlArray[id][2];
}
ocdaan
%Europe/Berlin %782 %2005, 19:46
Als
trace("arr value from constructor = "+ xmlArray[4][2])wel werkt in de constructor, maar niet in de public function getFile() dan lijkt me toch echt dat xmlArray() lokaal is. Maar we zullen zien; leuke puzzel ;)
Overigens: als je een var als private declareert, zou het direct opvragen ervan een parse error moeten geven. Het is netter om dan maar met getters en setters te werken, of anders de var gewoon niet private te maken.
John
ehhhmmm, volgens mij is het toch zo dat private en public betekend dat de property of method wel dan niet van buitenaf benaderbaar zijn en dat jij in de war bent met het static attribuut.
ohhhhw nu kom ik even wijs over - ik heb geen idee hoor - ben nog maar een paar dagen met classes enz bezig namelijk ;) sow, correct me if I'm wrong :D
ocdaan
%Europe/Berlin %783 %2005, 19:47
Even heel kort naar je code gekeken, maar zou dit niet je oplossing kunnen zijn?
public function getFile(id:Number)tring{
return this.xmlArray[id][2];
}
Thanx , maar nee, dat heb ik al een aantaal maal in verschillende combo's geprobeerd, zo makkelijk is het helaas niet.
Laiverd
%Europe/Berlin %784 %2005, 19:49
Volgens mij zeggen we precies hetzelfde; althans bedoel ik wat je zelf zegt ;) Maar zet anders ook even ergens een voorbeeld xml bestand neer.
Dauntless
%Europe/Berlin %784 %2005, 19:50
import mx.utils.Delegate;
class xmlLoader
{
private var xmlArray : Array
//private var test:String
function xmlLoader (connString : String)
{
//test = "hoi"
var vidXML : XML = new XML ();
vidXML.ignoreWhite = true;
vidXML.load (connString);
vidXML.onLoad = Delegate.create (this, onLoadHandler);
}
public function onLoadHandler (success : Boolean)
{
if (success)
{
trace ("\nXML load succes")
xmlArray = new Array ()
var currentNode : XMLNode = this.firstChild.firstChild;
var i : Number = 0;
// hier doen we een soort van RS.MoveNext
for (var childNode = currentNode; childNode != null; childNode = childNode.nextSibling, i ++)
{
var j : Number = 0;
this.xmlArray [i] = new Array ();
// hier vullen we de array met de velden uit het huidige record
for (var stringNode : XMLNode = childNode.firstChild; stringNode != null; stringNode = stringNode.nextSibling, j ++)
{
this.xmlArray [i][j] = stringNode.firstChild.firstChild.nodeValue;
}
}
// hardcoded wat getallen om te testen - eerste is record - 2e is het veld
trace ("arr value from constructor = " + xmlArray [4][2])
}else
{
trace ("\nXML load error");
}
}
}
public function getFile (id : Number) : String
{
return xmlArray [id][2];
//return test;
}}
Zo misschien?
Btw, als je ff de url naar het xml bestand geeft kunnen wij ook testen :). (Zoals Laiverd dus ook vraagt ;))
TheDutch
%Europe/Berlin %786 %2005, 19:52
Jammer, was het proberen even waard. Ik zou je willen adviseren Post #5 en #8 nog even goed te lezen, Laiverd zegt daar hele goede dingen.
Verder zou ik als ik jou was het boek "Essentials ActionScript 2.0" van Colin Moock kopen. Wanneer je dat boek goed gelezen hebt ben je enorm goed op weg. De foutjes die je nu maakt zijn vooral structuur fouten en die kan je het beste leren van iemand die al jaren OOP programmeert (in Java) en er hele hoofdstukken over kan schrijven in een fijne en duidelijke taal :).
Laiverd
%Europe/Berlin %786 %2005, 19:52
Met een test movie en een CTRL-ALT-V kun je overigens precies zien wat voor objecten etc. je code aanmaakt. I.h.a. wordt ik daar wel wijzer van ;)
John
ocdaan
%Europe/Berlin %788 %2005, 19:54
yes, ff xml ouput als bestandje ge-saved, en getest ;)
// edit - zipje dan
Dauntless
%Europe/Berlin %788 %2005, 19:55
Kan je ons ook even dat bestandje geven? :)
ocdaan
%Europe/Berlin %792 %2005, 20:01
Dit is een iets andere versie van de class, aangepast naar het idee van alle post hierboven (erg bedank trouwens - geeft een mens weer moed ;-) Het lijkt nu wel dat de class array word gevult maar nu krijg ik die getFile functie niet aan de praat... mss ben ik al te lang bezig ;)
class xmlLoader {
private var xmlArray:Array = new Array()
private var xmlArrayTemp:Array
function xmlLoader(connString:String){
var vidXML:XML = new XML();
vidXML.ignoreWhite = true;
vidXML.load(connString);
vidXML.onLoad = function(success:Boolean){
if (success) {
trace("\nXML load succes")
xmlArrayTemp = new Array()
var currentNode:XMLNode = this.firstChild.firstChild;
var i:Number = 0;
// hier doen we een soort van RS.MoveNext
for (var childNode = currentNode; childNode != null; childNode = childNode.nextSibling, i++) {
var j:Number = 0;
xmlArray[i] = new Array();
xmlArrayTemp[i] = new Array();
// hier vullen we de array met de velden uit het huidige record
for (var stringNode:XMLNode = childNode.firstChild; stringNode != null; stringNode = stringNode.nextSibling, j++) {
xmlArrayTemp[i][j] = stringNode.firstChild.firstChild.nodeValue;
}
}
// hardcoded wat getallen om te testen - eerste is record - 2e is het veld
trace("arr value from constructor = "+ xmlArrayTemp[4][2])
this.xmlArray = xmlArrayTemp
trace("arr value from class property = "+ xmlArray[4][2])
}else{
trace("\nXML load error");
}
}
}
public function getFile(id:Number):String{
return xmlArray[id][2];
trace("XXX" + xmlArray[3][2])
//return test;
}
}
let trouwens even op de multi dimentional array - ik heb nu de class array er ook tussen gezet zodat die dezelde structuur krijgt als de temp, volgens mij grote onzin maargoed, toch maar proberen ;) kijk zelf maar...
Dauntless
%Europe/Berlin %799 %2005, 20:11
import mx.utils.Delegate;
class xmlLoader
{
private var xmlArray : Array
private var vidXML;
function xmlLoader (connString : String)
{
vidXML = new XML ();
vidXML.ignoreWhite = true;
vidXML.load (connString);
vidXML.onLoad = Delegate.create (this, onLoadHandler);
}
public function onLoadHandler (success : Boolean)
{
if (success)
{
xmlArray = new Array ()
var currentNode : XMLNode = vidXML.firstChild.firstChild;
var i : Number = 0;
// hier doen we een soort van RS.MoveNext
for (var childNode = currentNode; childNode != null; childNode = childNode.nextSibling, i ++)
{
var j : Number = 0;
this.xmlArray [i] = new Array ();
// hier vullen we de array met de velden uit het huidige record
for (var stringNode : XMLNode = childNode.firstChild; stringNode != null; stringNode = stringNode.nextSibling, j ++)
{
this.xmlArray [i][j] = stringNode.firstChild.firstChild.nodeValue;
}
}
} else
{
trace ("\nXML load error");
}
}
public function getFile (id : Number) : String
{
return "dit hier: "+xmlArray [id][2];
//return test;
}
}
var xmlLoader:xmlLoader = new xmlLoader("thumbs.xml");
var timeOut = setTimeout(getMyFile, 500);
function getMyFile()
{
trace(xmlLoader.getFile(4));
}
Output:
dit hier: Aprilia_Pegaso_Tibet_Raid_256k.jpg
Enjoy! :)
ocdaan
%Europe/Berlin %800 %2005, 20:12
Dit vind ik nogal wat lastige constructies, heb iets meer tijd nodig om alles uit te pluizen.. thanx ;-) ik merk wel dat het toch lastiger is dan ik in eerste instantie dacht, maar ach, dat is de charme van het proggen nu eenmaal he ;-)
Dauntless
%Europe/Berlin %801 %2005, 20:14
Het enige grote verschil is die Delegate ... En die maakt het je juist eenvoudiger hoor...
Dit is overigens een héél mooie tutorial van senocular. (http://www.senocular.com/index.php?id=0.163)
//Edit
Wrm verwijder je je post nu? :#
ocdaan
%Europe/Berlin %813 %2005, 20:31
Hmmm, precies zoals je zei he - delegate. Daar kan je leuke dingen mee doen zie ik nu wel.
maargoed, ik snap eingelijk nog niet goed waarom het een wel werkt en het ander niet. Waarom blijft die class array nu wel op het class niveau?
Door de public function onLoadHandler omdat'ie een public attribuut heeft?
maarruhhh..... Dauntless je bent geweldig ;)
Dauntless
%Europe/Berlin %814 %2005, 20:32
maargoed, ik snap eingelijk nog niet goed waarom het een wel werkt en het ander niet. Waarom blijft die class array nu wel op het class niveau?
Dat komt door die delegate hé :). Lees die tutorial maar :).
ocdaan
%Europe/Berlin %815 %2005, 20:34
ohhwkee... sgoed, heb een goed boek en deligate zal wel goed bedocumenteerd zijn op het net dus geen probleem, thanx again voor je tijd en moeite ;-)
Dauntless
%Europe/Berlin %816 %2005, 20:36
Graag gedaan :).
En ik heb dat boek ook :). En nog vééééle andere mensen hier op FF ook, dus je hebt zéker het juiste boek gekozen :). 'k Heb dat boek ook gebruikt om m'n AS 2.0 te leren, en ik ben toch goed bezig denk ik :p.
ocdaan
%Europe/Berlin %822 %2005, 20:45
:P :P :P absuluutje - maar ik ben een sprintje aan het trekken, sow beware [:o)] hahaha
ja, klopt, ik had overal gelezen op allerlij sites dat dat boek toch wel de beste was.
// ff offtopic, Kan me nog herinneren dat op die moock site altijd leuke dingen te vinden waren in de tijd, zo vanaf flash 4 & 5. (voor mij tenminste) In die tijd had je alle tutorials van flashkit, moock en nog een paar van die sites op je hdd staan. Nu zie je door de bomen het bos niet meer en zit er zoveer crap tussen....
TheDutch
%Europe/Berlin %825 %2005, 20:48
Fijn te horen dat je dat boek hebt ocdaan, het is echt een topper! :).
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.