Avatar billede Shasim Novice
03. maj 2006 - 11:35 Der er 35 kommentarer og
1 løsning

Arrays igen

Hej

Jeg har et array (indenfor), som indeholder navnene på de af mine klip som er blevet brugt. Jeg vil gerne registrere disse klips _x, så jeg til sidst kan overføre klippenes egenskaber i korrekt rækkefølge fra venstre til nogle nummererede dyn. tekstfelter.
Hvordan kan jeg gøre det?

Sådan tilføjer og fjerner jeg i mine nuværende arrays:

function fjern(arraynavn, vaerdi) {
    //fjern værdi hvis den findes i array
    var i;
    for (i=0; i<arraynavn.length; i++) {
        if (arraynavn[i] == vaerdi) {
            arraynavn.splice(i, 1);
        }
    }
}
function tilfoej(arraynavn, vaerdi) {
    //Tilføj værdi hvis den ikke findes i array
    fjern(arraynavn, vaerdi);
    arraynavn.push(vaerdi);
    arraynavn.sort();
}
Avatar billede barklund Nybegynder
03. maj 2006 - 13:49 #1
Er det ikke nemmest at gøre det tilsidst - altså når du så skal bruge dem, så finder du _x'erne, sorterer, indsætter...
Avatar billede Shasim Novice
03. maj 2006 - 13:56 #2
Jo, det tror jeg også, for det skal bruges på et print af det som brugeren har lavet, så det vil være fint om sorteringen kan foregå når man trykker på "Udskriv".

Men hvordan gør jeg det?
De klip, som er i indenfor har nogle egenskaber, som skal listes i en rækkefølge, så det klip der ligger længst til venstre bliver til mc1 osv osv. og dets egenskaber skal overføres til et dyn. tekstfelt. Undskyld gentagelserne, men er ikke sikker på at jeg kan forklare mig godt nok:)
Avatar billede barklund Nybegynder
03. maj 2006 - 14:04 #3
Well, så opretter du bare et array af objekter, bruger Array.sortOn (kig i manualen) og sorterer arrayet efter den egenskab, du ønsker. Så kan du efterfølgende løbe det igennem og hente teksterne i den rigtige rækkefølge.
Avatar billede Shasim Novice
03. maj 2006 - 14:11 #4
Altså, jeg kigger efter hvilke klip, der er i mit indenfor-array, og aflæser alle _x positionerne, og... ja... hvad så? Putter dem i et nyt array? Sorterer dem efter den laveste værdi? Og hvordan ved jeg så hvilke værdier der passer sammen i det nye array og mit indenfor-array? Altså hvilket klip indeholder oplysningerne om de egenskaber som klippet på et_eller_andet._x ?
Avatar billede barklund Nybegynder
03. maj 2006 - 15:28 #5
Lav et nyt array af objekterne med egenskaber, sorter det, udskriv dem:

var objekter = new Array();
var o, m;
for (i = 0; i < indenfor.length; i++) {
    m = _root["mc_"+indenfor[i]); // movieclip som indenfor[i] peger på
    o = new Object(); // objekt med data om m
    o.x = m._x;
    o.label = m.et_tekstfelt.text;
    objekter.push(o);
}
// nu har vi et array af objekter med x og label
objekter.sortOn("x", Array.NUMERIC);
// nu er de sorteret efter stigende x-egenskab
for (i = 0; i < objekter.length; i++) {
    trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].label);
}

Hopla :)

--
Morten Barklund
Avatar billede Shasim Novice
04. maj 2006 - 08:58 #6
Hvor er det smukt - tusind tak! Jeg prøver at få det broklet ind i sammenhængen. Læg et svar.
Avatar billede Shasim Novice
04. maj 2006 - 09:34 #7
Jeg bøvler lidt...
Hvis de oplysninger jeg skal have gemt om hvert objekt skal hentes i variabler i roden (var ctStr_mc1 = 0.01;), skal jeg så skrive f.eks.:
o.str = _root["ctStr_"+m];

Og hvordan når jeg så skal have skrevet denne værdi i et tekstfelt på min udskrift... har jeg ikke helt fattet endnu... kan jeg så linke til o.str i mit variabel-felt i tekstfelts-properties?
Avatar billede Shasim Novice
04. maj 2006 - 09:55 #8
Det virker ikke rigtigt... den når aldrig frem til trace:

function optaelMc(){
var objekter = new Array();
var o, m;
    for (i = 0; i < indenfor.length; i++) {
    m = _root["mc"+indenfor[i]]; // movieclip som indenfor[i] peger på
    o = new Object(); // objekt med data om m
    o.x = m._x;
    o.label = m.et_tekstfelt.text;
    //o.str = _root["ctStr_"+m];
    objekter.push(o);
    }
// nu har vi et array af objekter med x og label
objekter.sortOn("x", Array.NUMERIC);
// nu er de sorteret efter stigende x-egenskab
for (i = 0; i < objekter.length; i++) {
    trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].label);
}
}
Avatar billede barklund Nybegynder
04. maj 2006 - 10:07 #9
Nej, du skal aldrig bruge variabel-feltet på tekstfelter. Aldrig. Altid instancenavn. Hvis du så vil have overført variablerne til tekstfelter, så gør du det i den sidste løkke.

Men ja, metoden til at hente er god nok - dog peger "m" på et movieclip, så det giver ikke rigtig mening - brug "i" i stedet.
Avatar billede barklund Nybegynder
04. maj 2006 - 10:12 #10
Og er m korrekt? Peger m på dine movieclips? Jeg ved jo ikke om dine movieclips hedder mc_1, mc_2 og så videre og er placeret i _root :)
Avatar billede Shasim Novice
04. maj 2006 - 10:17 #11
m er rigtig nok... eller, jeg sørger for at rette det til i min rigtige fil.
Hænger lige lidt med underkæben her, over resten af det du har svaret...
Avatar billede Shasim Novice
04. maj 2006 - 10:22 #12
Det er for rodet med alt det bytten ud af instancenavne og variabler hver gang jeg skal lægge en kommentar her - der sker bare fejl. Her er scriptet som jeg forsøger at få til at fungere, men det virker som sagt ikke, for jeg kan ikke trace:
var ctStr_brill1 = 0.01;

function optaelBrill(){
var objekter = new Array();
var o, m;
    for (i = 0; i < indenfor.length; i++) {
    m = _root["brill"+indenfor[i]]; // movieclip som indenfor[i] peger på
    o = new Object(); // objekt med data om m
    o.x = m._x;
    //o.label = m.et_tekstfelt.text;
    o.str = _root["ctStr_"+[i]];
    objekter.push(o);
    }
// nu har vi et array af objekter med x og label
objekter.sortOn("x", Array.NUMERIC);
// nu er de sorteret efter stigende x-egenskab
for (i = 0; i < objekter.length; i++) {
    trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].str);
}
}
Avatar billede barklund Nybegynder
04. maj 2006 - 10:32 #13
[i] ser lidt mærkeligt ud - et array med i som eneste element? Okay, det vil virke, da toString heraf bare vil give "i", men det er lidt fjollet. Og du skal jo nok endda hente den i indenfor. :)

Lad os indsætte lidt traces:

function optaelBrill(){
  var objekter = new Array();
  var o, m;
  for (i = 0; i < indenfor.length; i++) {
    m = _root["brill"+indenfor[i]]; // movieclip som indenfor[i] peger på
    o = new Object(); // objekt med data om m
    o.x = m._x;
    //o.label = m.et_tekstfelt.text;
    o.str = _root["ctStr_"+indenfor[i]];
    trace("Jeg har fundet "+indenfor[i]+" ("+m+") og teksten "+_root["ctStr_"+indenfor[i]]);
    objekter.push(o);
  }
  // nu har vi et array af objekter med x og label
  objekter.sortOn("x", Array.NUMERIC);
  trace("antal fundne er "+objekter.length);
  // nu er de sorteret efter stigende x-egenskab
  for (i = 0; i < objekter.length; i++) {
    trace("første objekt er på x="+objekter[i].x+" og har teksten: "+objekter[i].str);
  }
}

Hvad giver disse traces?
Avatar billede Shasim Novice
04. maj 2006 - 10:36 #14
Ingenting... Jeg har sat et kald af funktionen på en knap, men der sker intet.
Avatar billede Shasim Novice
04. maj 2006 - 10:38 #15
Du har tabt mig helt nu - jeg forstår ikke din sidste kommentar omkring i.

Skal jeg forsøge at forklare helt fra bunden?
Avatar billede barklund Nybegynder
04. maj 2006 - 10:42 #16
Altså, hvis der ingenting kommer, så bliver din funktion jo slet ikke kaldt - lad os starte der :)

Hvad har du skrevet på din knap der skal kalde funktionen?
Avatar billede Shasim Novice
04. maj 2006 - 10:45 #17
on (release){
    _root.optaelBrill();
    }
Avatar billede Shasim Novice
04. maj 2006 - 11:55 #18
Det var Omit trace action der var slået til...
Her er output af dine traces efter jeg har placeret 2 mc'er i indenfor:

Jeg har fundet 1 (_level0.brill1) og teksten undefined
Jeg har fundet 2 (_level0.brill2) og teksten undefined
antal fundne er 2
første objekt er på x=233 og har teksten: undefined
første objekt er på x=290 og har teksten: undefined
Avatar billede barklund Nybegynder
04. maj 2006 - 12:06 #19
Well, hvis dine tekster er undefined, så ligger teksterne altså ikke i variablerne _root.ctStr_1, _root.ctStr_2 og så videre :) Så er problemet her :)
Avatar billede Shasim Novice
04. maj 2006 - 12:09 #20
Ja, men det gør de nu, altså værdierne ligger i mine variabler, som hedder ctStr_brill1 = 0.01; osv.
Hvis jeg tracer variablen efter ændring af en værdi, så går det godt nok.
Avatar billede Shasim Novice
04. maj 2006 - 12:13 #21
SÅ er den der - det hjælper at kalde det rigtige variabel navn :)

Tusind tak for hjælpen! Nu må du smide et svar.
Avatar billede barklund Nybegynder
04. maj 2006 - 12:17 #22
Okay :)

Håber du fangede konceptet i et array af objekter og brugen heraf. Det er ganske anvendeligt. Og muligvis kan du få noget ud af at investere i http://globe.dk/?action=detail&vare=FG227-7 :)

--
Morten Barklund
Avatar billede Shasim Novice
04. maj 2006 - 12:23 #23
Ahhh... fornuftigt at snige lidt reklame for din udmærkede bog ind her :) Jeg er sikker på den er alle pengene værd.
Jo, jeg fattede konceptet, som er rigtigt smart, og håber jeg er i stand til at huske principperne til næste gang jeg skal bruge noget lignende.
Mangler nu kun at få mine værdier udskrevet i de dyn. tekstfelter. Det skulle gøres i den sidste løkke?
Avatar billede barklund Nybegynder
04. maj 2006 - 12:26 #24
Ja - når du kan trace dem, så kan du jo også skrive dem i et tekstfelt :)
Avatar billede barklund Nybegynder
04. maj 2006 - 12:27 #25
Og tark for points :)
Avatar billede Shasim Novice
04. maj 2006 - 13:57 #26
Øv jeg har stadig problemer...
Når jeg forsøger at trace flg.:
o.str = _root["ctStr_brill"+indenfor[i]];
o.farve = _root["farve_brill"+indenfor[i]];
trace(indenfor[i]+". brill. fra venstre er en: "+objekter[i].str+" "+objekter[i].farve);
så får jeg bare: 1. brill. fra venstre er: undefined undefined
Avatar billede Shasim Novice
04. maj 2006 - 14:08 #27
Åh nej - undskyld har fundet ud af det nu.
Avatar billede Shasim Novice
04. maj 2006 - 14:15 #28
Og det havde jeg så ikke alligevel :)
Nu gentager den bare den længst til venstre ligeså mange gange som den finder noget i indenfor.
Hvis jeg smider min trace i den første løkke, så får jeg jo ikke sorteret efter x. Og hvis jeg putter den i den anden løkke, så bliver der ikke talt op.
Avatar billede barklund Nybegynder
04. maj 2006 - 14:20 #29
Hvad har du helt præcist skrevet? det lyder som om du har byttet helt rundt på tingene :(
Avatar billede Shasim Novice
04. maj 2006 - 14:22 #30
Sådan, nu funger det efter hensigten:
for (i=0; i<objekter.length; i++) {
trace(indenfor[i]+". brill. fra venstre er en: "+objekter[i].str+", "+objekter[i].farve);
trace(indenfor[i]+". brill. er på x ="+objekter[i].x);
_root.dyn_ct_txt.text = _root.dyn_ct_txt.text+(indenfor[i]+". brill. fra venstre er: "+objekter[i].str+", "+objekter[i].farve+" ");

Det eneste jeg kan finde på at spørge om nu er: Kan man indsætte et linjeskift i et dyn. tekstfelt?
Avatar billede barklund Nybegynder
04. maj 2006 - 14:28 #31
indenfor[i] peger absolut ikke på det samme element, som objekter[i] - de to arrays er helt uafhængige, da det ene jo er sorteret og det andet ikke er. Så ovenstående er noget rod. Hvis du vil have nummeret med, skal det tilføjes til objekter.

Men ja, du kan indsætte et linjeskift med \n eller newline:


function optaelBrill(){
  var objekter = new Array();
  var o, m;
  for (i = 0; i < indenfor.length; i++) {
    m = _root["brill"+indenfor[i]]; // movieclip som indenfor[i] peger på
    o = new Object(); // objekt med data om m
    o.x = m._x;
    o.nummer = indenfor[i];
    o.str = _root["ctStr_"+indenfor[i]];
    o.farve = <<hvor du nu henter farven>>;
    objekter.push(o);
  }
  // nu har vi et array af objekter med x og label
  objekter.sortOn("x", Array.NUMERIC);
  trace("antal fundne er "+objekter.length);
  // nu er de sorteret efter stigende x-egenskab
  for (i = 0; i < objekter.length; i++) {
    _root.dyn_ct_txt.text = objekter[i].nummer+". brill. fra venstre er: "+objekter[i].str+", "+objekter[i].farve+"\n";
  }
}

Noget i den stil :)

--
Morten Barklund
Avatar billede Shasim Novice
04. maj 2006 - 14:36 #32
Hmmm... det kan jeg godt se, men hvis jeg bruger dit eksempel bliver output'et i det dynamiske tekstfelt:
2. brill. fra venstre er: 0.01, cognac
1. brill. fra venstre er: 0.01, WSI

Det er de rigtige egenskaber der listes set fra venstre, men der er byttet om på 1. og anden.
Det virkede altså før... mener jeg....?
Avatar billede Shasim Novice
04. maj 2006 - 14:38 #33
Jeg skrev sådan:
_root.dyn_ct_txt.text = _root.dyn_ct_txt.text+(objekter[i].nummer+". brill. fra venstre er: "+objekter[i].str+", "+objekter[i].farve+"\n");
Avatar billede Shasim Novice
04. maj 2006 - 14:41 #34
Det er jo fordi at klippene uanset deres tidligere nummer skal vises som stående på 1. pladsen fra venstre, 2. pladsen osv. osv.
Så måske er det jo netop rigtigt ikke at sortere på det?
Avatar billede barklund Nybegynder
04. maj 2006 - 14:41 #35
Ah, du vil have rækkefølgen ind? Så er det bare i (eller i+1):

_root.dyn_ct_txt.text += (i+1)+". brill. fra venstre er: "+objekter[i].str+", "+objekter[i].farve+"\n";
Avatar billede Shasim Novice
04. maj 2006 - 14:44 #36
Ja, nemlig :)
Tusind tak for al din ulejlighed. Nu tror jeg nok jeg er igennem.
Tak Tak! Vil helt sikkert købe din bog :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester