Avatar billede mikkel_breum Nybegynder
07. maj 2001 - 15:50 Der er 8 kommentarer og
1 løsning

variabel navngivning til variabler

Hejsa

hvordan kan man, i lingo, oprette variabler, hvis navn udledes af andre variabler?

fx til dette formål (med eksemplet fungerer ikke)

repeat with i = 1 to amountOfKids
    set string(\"Kid\"&i) to new(script \"orderKids\")
  end repeat


Jeg vil gerne kunne oprette en række objekter ud fra et parentscript, men jeg ved ikke på forhånd om jeg skal oprette 10 eller 700 objekter, derfor vil jeg oprette dem via en repeat løkke. Jeg ved bare ikke hvordan jeg kan få løkken til at generere objekter med nye navne...

jeg skal have objekter der fx hedder:

kid1
kid2
kid3
kid4 ... etc..

Avatar billede lingoman Nybegynder
07. maj 2001 - 21:36 #1
Hej Mikkel,

En effektive måde for dette er at udnytte symboler
fks. #Kid1,#Kid2,.. til at referere dine objekter.

Navne og objekter genereres således

global Kidlist
set KidList = [:]

repeat with i = 1 to amountOfKids
    set KidName = string(\"Kid\"&i)
    set KidSymbol = value(KidName)
setaProp(KidList,KidSymbol,new(script\"orderKids\")
end repeat

-----

Du kan herefter hente et specifikt objekt direkte

set thisKidObject = getaProp(KidList,#Kid3)

eller thisKidObj = getAt(list,3)

Håber du kan bruge det!

mvh Geo
Avatar billede mikkel_breum Nybegynder
07. maj 2001 - 21:57 #2
Cool ! det kan jeg bruge..

til orientering fant jeg frem til at benytte denne metode, og det vil jeg gerne høre kommentarer i forhold til:

Repeat with i = 1 to maxAmount

BuildVarString = string(\"set var\"&i& \" to new(script \" &numtochar(34)&\"parentScript\"&numtochar(34)&\")\")

Do BuildVarString
End repeat

The \"Do BuildVarString\" simply executes the string of that variable as normal lingo!! that is COOL !

Jeg benytter numtochar(34) for at skabe et \", da jeg ikke kan finde ud af om lingo har en escape character som fx. PHP hvor man kan skrive \\\" i en streng, og derved undgå at strengen opfattes som afsluttet, men derimod få selve gåseøjet med ind som en del af strengen.


Avatar billede lingoman Nybegynder
07. maj 2001 - 22:23 #3
Hej Mikkel,

Du kan også bruge lingo konstanten \"QUOTE\".
fks.
put \"set Var\" & i && \"to new(script \" & QUOTE & \"parentScript\" & QUOTE & \")\"

Den eneste ulempe ved string operationer er at de er særdeles langsomme i Lingo...Din metode er velegnet til dynamisk script-generation, og dets potentiale enorm.Det er COOL! Operationer med symboler er derimod noget af det hurtigste og de kan nemt konverteres tilbage til en \"string\" når det kræves.
Prøv fks.  put string(#Kid3)

mvh Geo

Avatar billede mikkel_breum Nybegynder
07. maj 2001 - 22:30 #4
hmmm men der et problem med do finktionen

men kan ikke deklarere globaler i den, og det skal jeg jo kunne...

men dit eksempel virker heller ikke helt efter hensigten, jeg har slået debuggeren til, og kan se, at det er fordi

set KidSymbol = value(KidName)

genererer <void>

en anden ting er, at jeg ikke helt er klar over, hvordan jeg får disse objekter til at arbejde for mig. Nu er de i hukommelsen på hver deres adresse, som er gemt i min property liste, men jeg skal vel have erklæret alle mine objektnavne (kidSymbol) som globals eller hvad? og det ken jeg ikke finde ud af, for jeg kan ikke skrive

global getAt(list,3)
eller
global string(getAt(list,3))
eller
global value(getAt(list,3))

og jeg kan ikke bruge mit \"do-trick\", da globaler ikke kan erklæres heri.
Avatar billede kanding Nybegynder
07. maj 2001 - 22:54 #5
Hej !
DO er en fantasstik kommando, men i dit tilfælde er det nok bedre at gøre sådan her.

on opretVar varNavn, fra, til
  repeat with s = fra to til
    addGlobal(varNavn & string(s), new(script \"parentScript\"))
  end repeat   
end

on addGlobal navn, vaerdi
  if not symbolP(navn) then
    navn = symbol(navn)
  end if
  (the globals)[navn] = vaerdi
end

i messagevindue prøv:
put (the globals)[#var1]
put (the globals).count
put (the globals).getPropAt(2)

Avatar billede lingoman Nybegynder
07. maj 2001 - 23:06 #6
Undskyld
erstat med

repeat with i = 1 to amountOfKids
    set KidName = string(\"#Kid\"&i)
    set KidSymbol = value(KidName)
setaProp(KidList,KidSymbol,new(script\"orderKids\")
end repeat

Det ordner <VOID> delen

Kun PropertyListen \"KidList\" skal deklareres som global. De individuelle objekter behøver ikke.

Hvis du på et senere tidspunkt gerne vil sende en besked til fks. objektet i #Kid3, kan det gøres således:

doSomething getaProp(KidList,#Kid3)
eller
doSomething KidList[#Kid3]

Med hensyn til din do funktion behøver du blot deklarere en tom global list før dit repeat loop

fks.

global myKidList

set myKidList = [:]

---generer property navne og objekter
---gem i listen

mvh Geo
Avatar billede lingoman Nybegynder
07. maj 2001 - 23:09 #7
Jeg antager at objektet har en handler som hedder

on doSomething me
---
end
Avatar billede kanding Nybegynder
08. maj 2001 - 08:37 #8
Hej mikkel & lingoman
Man kan også konvertere til et symbol direkte

set KidName = string(\"Kid\"&i)
set KidSymbol = symbol(KidName)

Det er også vigtigt at den globale variabel er inden for handleren når man laver en DO. Normalt kan man bare have sin globale variabler i toppen af et script, men ikke når det gælder DO. Jeg tror også at det er det lingoman mener, men jeg ville bare understrege det yderligere

Lige en bemærkning til mit script ovenover. Når jeg skriver:
put (the globals)[#var1] så er det i forhold til at man har kaldt sine variabler var. Det kunne også være:
put (the globals)[#kid1]
Avatar billede mikkel_breum Nybegynder
08. maj 2001 - 11:16 #9
dejligt at blive så informeret, tak til jer begge !
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
Kurser inden for grundlæggende programmering

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