PDA

Volledige versie bekijken : Namen creëeren at runtime


zendmaar
%Europe/Berlin %551 %2006, 14:13
Mijn vraag luidt als volgt:

ik heb een klasse FilmObject waar ik dus FilmObjecten kan creëeren.
Deze hebben enkele setters en getters, bv filmNaam, filmAanwezig.
Deze klasse werkt op zich zonder problemen.

Nu vraag ik mijn db om bepaalde gegevens en wil ik at runtime dus mijn objecten creëeren en hun info setten.

vroeger kon ik iets als volgt doen dacht ik:


var this["film_"+i]:Film = new FilmObject();
this["film_"+i].filmId = +re.result[i].film_id;
this["film_"+i].filmNaam = +re.result[i].film_titel;
this["film_"+i].filmAanwezig = +re.result[i].film_aanwezig;


Of ik kon de eval() functie gebruiken.

Blijkbaar kun je sinds f5 geen eval meer gebruiken aan de linkerkant an een vergelijking dus kan dat ook niet meer.

Nu lukt het me dus niet om namen dynamisch te creëeren adhv een voorvoegsel "film_" + een gegeven i.

De bedoeling is dat ik deze later kan aanroepen adhv een geselecteerde index + hun voorvoegsel.

indien je raad weet, alvast bedankt!

marcvz
%Europe/Berlin %557 %2006, 14:22
Je manier is opzich niet verkeerd.
Maar als je path[] of eval () (want dit is ook nog gewoon mogelijk) gebruikt, is het niet mogelijk om types toe te wijzen aan je variablen.


this["film_"+i] = new FilmObject();
this["film_"+i].filmId = +re.result[i].film_id;
this["film_"+i].filmNaam = +re.result[i].film_titel;
this["film_"+i].filmAanwezig = +re.result[i].film_aanwezig;

zendmaar
%Europe/Berlin %563 %2006, 14:30
ok,

ik heb dit dus even geprobeert.
Het volgende was m'n code die ik in mn Class heb geimporteerd:

root.Film["film_"+i] = new FilmObject();
root.Film["film_"+i].filmId = re.result[i].film_id;
root.Film["film_"+i].filmNaam = re.result[i].film_titel;
root.Film["film_"+i].filmAanwezig = re.result[i].film_aanwezig;

en wat gebeurd er?
Niets :p

en als ik een trace doe van:
trace(root.Film["film_"+i]);
krijg ik undefined.

Enig id?

marcvz
%Europe/Berlin %566 %2006, 14:35
Huh, welke class.
Trace even of je film object wel bestaat. Zo ja, dan vul je je variablen niet goed in.

zendmaar
%Europe/Berlin %568 %2006, 14:39
Mijn FilmObject vindt hij prima: [type Function]

Ik heb mijn code al eens op een andere manier geschreven:
var obj = root.Film["film_"+i];
obj = new FilmObject();
obj.filmId = re.result[i].film_id;
obj.filmNaam = re.result[i].film_titel;
obj.filmAanwezig = re.result[i].film_aanwezig;

Maar dit is verre van wat ik wil. Op deze manier worden er geen blijvende objecten gecreëerd. Die obj wordt namelijk altijd overschreven.

marcvz
%Europe/Berlin %591 %2006, 15:11
Als je film object instance wel bestaad. Dan vul je de properties niet goed in.
Dit is dan dus het gedeelte waar je de fout moet zoeken, en dan het gedeelte na de "=" tekens.
root.Film["film_"+i].filmId = re.result[i].film_id;
root.Film["film_"+i].filmNaam = re.result[i].film_titel;
root.Film["film_"+i].filmAanwezig = re.result[i].film_aanwezig;

zendmaar
%Europe/Berlin %601 %2006, 15:25
Er is geen enkel probleem met de delen na het = teken.
Dit kun je al zien in m'n code boven uw bericht die perfect werkt. Maar deze vervult het gewenste doel niet.

marcvz
%Europe/Berlin %610 %2006, 15:39
Dan spreek je jezelf tegen.
Het object wordt wel aangemaakt zeg je, maar als je je properties traced krijg je undefined. Dan gaat het toch mis bij de properties :S
Maar goed, ik heb geen idee wat je allemaal nog meer aan het doen bent, net had je het ookal over een class.

In ieder geval is het mogelijk om met zowel path[] als eval() dynamisch variablen/objecten aan te maken.
Alleen is het NIET mogelijk om er types aan toe te wijzen.

Verder weet ik dus niet wat je precies allemaal aan het doen bent, dus ik kan je niet vertellen wat je nog meer verkeerd doet.

zendmaar
%Europe/Berlin %627 %2006, 16:04
Ik zal eens proberen een schets te maken van wat ik precies allemaal doe.

Eerst en vooral heb ik een .fla met daarin een datagrid, een knop en een tekstveld.
De bedoeling is dat een user in dat tekstveld een zoekwaarde ingeeft. bv a, dan krijgt hij in het datagrid alle films beginnende met een a te zien.

wat gebeurt er van as in m'n .fla?

bijna niets, enkel de initialisatie van de klasse FilmService.
Deze klasse is grotendeels gegenereerd door amfphp.
Ik haal dus via een gegenereerde functie al m'n films startende op de zoekwaarde uit mn db.
Ik krijg deze voorgeschoteld via een array.
Nu heb ik nog een klasse. De klasse FilmObject.
In deze klasse staan getters, setters en een constructor om filmobjecten aan te maken.
Filmobjecten hebben enkele properties, zoals je hierboven kan zien in de voorbeelden.

Op het moment dat ik m'n array ontvang wil ik dus alle data in objecten gaan stoppen.
Hier gaat het dus mis.

Nog even m'n code:

for(var i:Number = 0; i<re.result.length; i++){
//var obj = root.Film["film_"+i];
//var root."film_"+i:Film = new FilmObject();
root.Film["film_"+i] = new FilmObject();
root.Film["film_"+i].filmId = re.result[i].film_id;
root.Film["film_"+i].filmNaam = re.result[i].film_titel;
root.Film["film_"+i].filmAanwezig = re.result[i].film_aanwezig;

trace("eerste trace: " + root.Film["film_"+i].filmId);
trace("tweede trace: " + re.result[i].film_id);
trace("derde trace: " + FilmObject());

root.dgFilms.addItem({titel:root.Film["film_"+i].filmNaam, aanwezig:root.Film["film_"+i].filmAanwezig});
}


wat kun je nu zien in dit stukje code?
Het overlopen van de array, aanmaken van een object en de informatie correct setten.
Ook het invoegen in het datagrid kun je hier zien.

Helaas loopt het hier fout.
Je kunt er echter enkele traces in zien:
trace1 -> krijg je undefined
trace2 -> krijg je correcte id's te zien
trace3 -> krijg je te zien dat hij de functie inderdaad wel vindt.

Hopelijk duidelijker voor diegene die het willen begrijpen :)

Jimbooo
%Europe/Berlin %654 %2006, 16:42
zijn je types wel goed?

root.Film["film_"+i].filmId
re.result[i].film_id

zijn deze van hetzelfde type? Laat de code van je class eens zien, heb je daar de var filmId wel goed gedefineerd?

zendmaar
%Europe/Berlin %670 %2006, 17:05
Zoals reeds eerder gezegt werkt volgende code perfect:

obj = new FilmObject();
obj.filmId = re.result[i].film_id;
obj.filmNaam = re.result[i].film_titel;
obj.filmAanwezig = re.result[i].film_aanwezig;

Dus klopt al m'n code ivm klassen en dergelijke.
Het enige waar het mis gaat is het moment dat ik het volgende wil doen:
root.Film["film_"+i] als naam voor m'n object maken.

Wat ik wil bereiken is dat mijn objecten volgende naam bezitten film_0, film_1, ...

Alles inzage types enzo is correct :S
M'n klasse werkt ook perfect, enkel die namen bestaande uit voorvoegsel "film_" + i werken neit.

marcvz
%Europe/Berlin %674 %2006, 17:11
Dan zit er niets anders op dan alles even uploaden zodat we kunnen kijken.
Want path["film"+i] zou gewoon moeten werken.
Of je root var staat op een rare plaatst zodat je deze niet aan kan roepen.

zendmaar
%Europe/Berlin %679 %2006, 17:18
ok,
hierbij dan even m'n .fla en 2 klassen.rar bestandje (http://users.pandora.be/angelsky/Film.rar)

zendmaar
%Europe/Berlin %791 %2006, 20:00
na nog een heel eind zoeken en inet te doorzoeken stoote ik toevallig op een item die mij te hulp kwam. Het kwam zelfs van hier op het board.

namelijk de volgende thread (http://www.flashfocus.nl/forum/showthread.php?t=7839)

blijkt als ik het volgende doe:

root["film_"+i] = new FilmObject();
root["film_"+i].filmId = re.result[i].film_id;
root["film_"+i].filmNaam = re.result[i].film_titel;
root["film_"+i].filmAanwezig = re.result[i].film_aanwezig;

dat het wel werkt
het komt er dus op neer dat ik root["film_"+i] gebruik ipv root.Film["film_"+i]

alvast bedankt voor de vele mensen die mij te hulp schoten!!