Avatar billede jakwag Nybegynder
27. marts 2003 - 14:00 Der er 47 kommentarer og
1 løsning

Styring af listbox fra function

Hej Eksperter

Denne gang sider jeg fast. Hvad gør jeg forkert her:

this.getPersons_Result = function(result) {
    curPersons_array = new Array();
    for (i=0; i<result.getLength(); i++) {
        names_lb.addItem("jakob",22);
        trace("i for loop");
    }
};

List boxen "names_lb" får ikke label: jakob og value: 22
trace funktionen virker fint.

Nogen gode bud?

Jakwag
Avatar billede jakwag Nybegynder
27. marts 2003 - 14:01 #1
scriptet ligger i første/eneste frame i maintimeline, det samme gør "names_lb"
Avatar billede mat Nybegynder
27. marts 2003 - 14:10 #2
..og hvad sender du til den? en anden listbox eller hvad? Hvad skal der ske?

Når jeg tester dit script skriver den jakob i min listbox, helt fint, det antal gange som den listbox der er sendt til funtionen er lang.

???
Avatar billede jakwag Nybegynder
27. marts 2003 - 14:13 #3
HVAD!

Det gør den altså ikke hos mig

Her kan du se scriptet som det skulle virke, problemet er at listboxen forbliver tom:

#include "NetDebug.as"
#include "NetServices.as"
NetServices.setDefaultGatewayURL("http://localhost:8500/flashservices/gateway");
var net_conn = NetServices.createGatewayConnection();
var personService = net_conn.getService("personale.personale", this);
//*****************************
//**************
firma_cb.addItem("Firma");
firma_cb.addItem("LOGICON");
firma_cb.addItem("MultiVision");
//*********************************
firma_cb.showPersons = function() {
    selected = firma_cb.getSelectedItem().label;
    names = personService.getPersons(selected);
    names_lb.setDataProvider(names);
};
firma_cb.setChangeHandler("showPersons", firma_cb);
//****************
this.getPersons_Result = function(result) {
    curPersons_array = new Array();
    for (i=0; i<result.getLength(); i++) {
        this["personData"+i] = new Object();
        this["personData"+i].navn = result.getItemAt(i).navn;
        this["personData"+i].lokalNummer = result.getItemAt(i).lokalNummer;
        curPersons_array[i] = this["personData"+i];
        names_lb.addItem(curPersons_array[i].navn, curPersons_array[i].lokalNummer);
    }
};
Avatar billede mat Nybegynder
27. marts 2003 - 14:24 #4
uha min viden om komponenterne kan ligge på et meget lille sted :)

Men du beder om at få itemAt i .navn er det et label der hedder navn, eller skal det ikke bare være label og data? Så dine objekter får tildelt label og data fra de givne poster i listboxen?

Jeg undskylder hvis jeg skyder totalt forbi her, men det er rent gætværk.
Avatar billede jakwag Nybegynder
27. marts 2003 - 14:27 #5
For at teste skiftede jeg:
names_lb.addItem(curPersons_array[i].navn, curPersons_array[i].lokalNummer);

-ud med:
names_lb.addItem("jakob",22);

Så det meste af dette script burde slet ikke have en indflydelse.
Avatar billede jakwag Nybegynder
27. marts 2003 - 14:28 #6
bruger f.eks. names_lb.removeAll(); samme sted virker det heller ikke;
Avatar billede barklund Nybegynder
27. marts 2003 - 15:08 #7
hvorfor skriver du "this" foran din funktion?

og hvem invoker din funktion (kalder den)?

Der mangler noget script - eller hva'?
Avatar billede barklund Nybegynder
27. marts 2003 - 15:09 #8
Nåja... Kan du trace inden fra dit loop? Kommer den derind?

Kan du trace værdien og typen af "names_lb" ud?
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:16 #9
Den kommer dertil da min trace funktion virker.

Jeg kan godt trace(names_lb._x) men ikke trace(names_lb.getItemAt(0))
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:18 #10
der er ingen grund til "this" : )
Avatar billede barklund Nybegynder
27. marts 2003 - 15:26 #11
hvad siger en trace("type is "+typeof names_lb.getItemAt);
Avatar billede barklund Nybegynder
27. marts 2003 - 15:26 #12
Hvorfra bliver dit script kaldt?
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:27 #13
scriptet ligger i første/eneste frame i maintimeline, det samme gør "names_lb"
Avatar billede barklund Nybegynder
27. marts 2003 - 15:29 #14
dit script bliver vist automatisk invoked af din netservices? har aldrig arbejdet med det, men kan da godt gætte lidt med... :)
Avatar billede barklund Nybegynder
27. marts 2003 - 15:31 #15
med script mener jeg funktionen "getPersons_result"... Hvem kalder den?
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:33 #16
præcis. Den bliver aktiveret når der kommer et result tilbage fra denne linie:
names = personService.getPersons(selected);

result i () efter funktionen indeholder de dataer som er mod taget.

Dette burde ikke have noget at gøre med mit problem, som sagt så køre funktionen godtnok men jeg kan ikke få fat i min listbox.
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:34 #17
Det er ellers ret effektivt - Flash remoting : )
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:35 #18
suffixet _Result aktivere et eller andet i netservices.as så den ved at der er modtaget data.
Avatar billede barklund Nybegynder
27. marts 2003 - 15:38 #19
jo, hvem der kalder HAR noget at gøre med det. Det er jo et spørgsmål om tidslinier og om din listbox overhovedet findes i det scope hvorfra din funktion kører.

Kan du trace typen af en funktion, der bør findes i din listbox ud?
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:40 #20
øøh..
Hvis du mener f.eks. trace(names_lb._x) kan jeg godt.

Hvad mener du med typen af en funktion
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:43 #21
under alle omstændighedder burde man kunne skrive:
_root.names_lb.addItem("jakob",22);

-eller hvad, for det virker heller ikke.
Avatar billede barklund Nybegynder
27. marts 2003 - 15:51 #22
trace("type of addItem is "+typeof names_lb.addItem)
Avatar billede jakwag Nybegynder
27. marts 2003 - 15:56 #23
output bliver: type of addItem is function

tracer jeg trace("type of addItem is "+typeof names_lb) = output:
type of addItem is movieclip
Avatar billede barklund Nybegynder
27. marts 2003 - 16:00 #24
så bør du have fat i den rigtige komponent. Så er en faktor elimineret :)

Kan du i din changeHandler tilføjes jakob/22?
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:03 #25
endnu en gang er jeg ikke med : )

mener du i denne linie:
firma_cb.setChangeHandler("showPersons", firma_cb);
så nej.

hvad mener du ellers?
Avatar billede barklund Nybegynder
27. marts 2003 - 16:08 #26
Nej... i ovenstående linie specificerer du, at funktionen "showPersons" skal være din changeHandler. Derfor referer jeg til denne funktion som netop din changeHandler, altså:

firma_cb.showPersons = function() {
    names_lb.addItem("jakob",22);
    selected = firma_cb.getSelectedItem().label;
    names = personService.getPersons(selected);
    names_lb.setDataProvider(names);
};
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:12 #27
hhmm..
Der sker det at hvis der i forvejen står noget i listboxen bliver det slettet - men der kommer ikke til at stå jakob.

(Selvfølgelig er det min changeHandler (jeg prøver lige at vågne op))
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:15 #28
men jeg kan trace en label som allerede eksistere:

firma_cb.showPersons = function() {
    trace(names_lb.getItemAt(0).label)
    selected = firma_cb.getSelectedItem().label;
    names = personService.getPersons(selected);
    names_lb.setDataProvider(names);
};
Avatar billede barklund Nybegynder
27. marts 2003 - 16:16 #29
hvad hvis du helt uden for i bunden af dit script tilføjer jakob?
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:16 #30
det kan den godt
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:22 #31
Det er altså sært...

hvis jeg i functionen tracer "this" så får jeg output: level0

this.getPersons_Result = function(result) {
    curPersons_array = new Array();
    for (i=0; i<result.getLength(); i++) {
        this["personData"+i] = new Object();
        this["personData"+i].navn = result.getItemAt(i).navn;
        this["personData"+i].lokalNummer = result.getItemAt(i).lokalNummer;
        curPersons_array[i] = this["personData"+i];
        names_lb.addItem(curPersons_array[i].navn, curPersons_array[i].lokalNummer);
        //trace("type of addItem is "+typeof names_lb)
        trace(this)
    }
};

så burde der da ikke være noget problem.
Jeg kunne nok finde en anden måde at gøre det på. Der er bare et problem: jeg er stædig..
Avatar billede barklund Nybegynder
27. marts 2003 - 16:22 #32
det er sgu da mærkeligt... hvorfor kan den tilføje det ene sted og ikke det andet?

prøv:

firma_cb.addItem("Firma");
firma_cb.addItem("LOGICON");
firma_cb.addItem("MultiVision");
firma_cb.names_lb = names_lb;
firma_cb.showPersons = function() {
    this.names_lb.addItem("jakob","22");
    selected = this.getSelectedItem().label;
    names = personService.getPersons(selected);
    this.names_lb.setDataProvider(names);
};
firma_cb.setChangeHandler("showPersons", firma_cb);
/
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:26 #33
nop.
Den gør det samme. sletter den der allerede står der (hvilket viser at der må være en kontakt) men tilføjer ikke den nye.

-og hvorfor skal overhovedet slette den eksisterende? underligt
Avatar billede barklund Nybegynder
27. marts 2003 - 16:31 #34
det er addItem der på en eller anden måde bliver fucked up undervejs...

måske bliver den interne repræsentation af data lavet om...

hvorfor laver du en setDataProvider? hvad gør den?
Avatar billede mat Nybegynder
27. marts 2003 - 16:34 #35
Hvad gav det her trace egentlig: trace(names_lb.getItemAt(0))

(jeg synes jeg har kigget tråden igennem efter resultatet)
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:37 #36
Nu fatter jeg INTET

Det her virker:

this.getPersons_Result = function(result) {
    curPersons_array = new Array();
    resultLength = 0;
    for (i=0; i<result.getLength(); i++) {
        resultLength++;
        this["personData"+i] = new Object();
        this["personData"+i].navn = result.getItemAt(i).navn;
        this["personData"+i].lokalNummer = result.getItemAt(i).lokalNummer;
        curPersons_array[i] = this["personData"+i];
    }
    names_lb.removeAll();
    for (i=0; i<resultLength; i++) {
        names_lb.addItem(curPersons_array[i].navn);
    }
};
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:39 #37
hovsa - haha - setDataProvider gør intet længere, en lille rest fra tidligere eksperimenter
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:40 #38
trace(names_lb.getItemAt(0)) giver "undefined"
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:41 #39
Hvordan kan det virke i det ene for loop og ikke det andet.
Det er jo den samme function?!?
Avatar billede barklund Nybegynder
27. marts 2003 - 16:46 #40
Det er også den forskel, at du nu kun adder med 1 argument og ikke 2... kan du adde som:

getPersons_Result = function(result) {
    curPersons_array = new Array();
    resultLength = 0;
    for (i=0; i<result.getLength(); i++) {
        resultLength++;
        this["personData"+i] = new Object();
        this["personData"+i].navn = result.getItemAt(i).navn;
        this["personData"+i].lokalNummer = result.getItemAt(i).lokalNummer;
        curPersons_array[i] = this["personData"+i];
    }
    names_lb.removeAll();
    for (i=0; i<resultLength; i++) {
        names_lb.addItem(curPersons_array[i].navn, curPersons_array[i].lokalNummer);
    }
};
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:53 #41
ja, det er ikke noget problem
Avatar billede barklund Nybegynder
27. marts 2003 - 16:54 #42
Men du påstår stadig, at hvis du flytter linien med addItem præcis som den er op i øverste loop, så virker det ikke?
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:57 #43
Det virker!!

this.getPersons_Result = function(result) {
    curPersons_array = new Array();
    resultLength = 0;
    for (i=0; i<result.getLength(); i++) {
        resultLength++;
        this["personData"+i] = new Object();
        this["personData"+i].navn = result.getItemAt(i).navn;
        this["personData"+i].lokalNummer = result.getItemAt(i).lokalNummer;
        curPersons_array[i] = this["personData"+i];
        names_lb.addItem(curPersons_array[i].navn, curPersons_array[i].lokalNummer);

    }
};
Avatar billede jakwag Nybegynder
27. marts 2003 - 16:59 #44
Det er jo det samme som jeg skrev første gang.

men jeg har fjernet linien: names_lb.setDataProvider(names);

Det giver også mening at det er den der har givet problemer.
Avatar billede barklund Nybegynder
27. marts 2003 - 17:02 #45
:)

netop at den interne håndtering af data-repræsentationen var lavet om...
Avatar billede jakwag Nybegynder
27. marts 2003 - 17:05 #46
Sikke en omgang.
Jeg takker mange gange for hjælpen - smid et svar.
Avatar billede barklund Nybegynder
27. marts 2003 - 17:06 #47
:)

i sådanne situationer er det altid er spørgsmål om at debugge fra en ende af... hvad virker og hvad virker ikke... en linie kode af gangen...
Avatar billede barklund Nybegynder
27. marts 2003 - 19:04 #48
Tark for point :)
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