07. marts 2004 - 11:30Der er
16 kommentarer og 1 løsning
Lav variabler i en løkke
Sikkert temmelig simpelt - men jeg kan bare ikke få det til at virke: Jeg skal have lavet et x antal variabler i en løkke, som efterfølgende skal bruges uden for løkken. Princippet er følgende:
for i = 1 to 5 var(i) = "Dette er hej nummer" & i response.write var(i) & "<br>" end
...hvor var(i) gerne skulle være variabler med navnene var1, var2, var3 .... osv. Og som jeg kan kalde igen senere i samme dokument. Men var(i) accepteres ikke - har også prøvet var+(i), "var"(i) osv. Men ingen af dem kan jeg få til at fungere. Hvordan gør jeg?
...ja det ser vel ud til at virke. Men mon det virker til mit egentlige formål, for det jeg viste var kun "princippet" i det jeg i virkeligheden skal bruge det til. Her er det virkelige formål:
for i = 1 to 9 varTxtSti = "tekster\brs\brs" & i & ".txt" filespec(i) = (server.mappath(varTxtSti)) Set f(i) = fso.OpenTextFile((filespec(i)),1) next
...jeg skal bruge de "dynamiske" variabler for senere at kunne kalde et antal forskellige tekstfiler - f1, f2, f3 osv - en ad gangen. Jeg kunne selvfølgelig skrive scriptet det antal gange, jeg skal bruge det, og selv ændre variablen fra gang til gang - men nu er jeg blevet stædig. Det må kunne lade sig gøre i en løkke....(?)
for i = 1 to 9 varTxtSti = "tekster\brs\brs" & i & ".txt" filespec = server.mappath(varTxtSti) ReDim f( i ) Set myTextStream = fso.OpenTextFile( filespec, 1 ) f( i ) = myTextStream next
..nå ja - filespec behøver jo egentlig ikke være "dynamisk". Du har puttet en ekstra linje på - det med "Set myText.....". Er det fordi det ikke kan lade sig gøre at bruge en "dynamisk" variabel (eller hvad jeg nu skal kalde det) - f(i) - samtidig med "Set", eller.....?!?
Det ser ellers lovende ud - prøver lige om det virker til formålet...
...hmmmm jeg har nu lige testet det. Har kopieret og indsat dit forslag direkte i mit dokument, og jeg får nogenlunde samme fejlmeddelelse, som ved mine egne forsøg:
Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01B6) Objektet understøtter ikke denne egenskab eller metode: 'f' /brsnj/www/index.asp, line 16
Line 16 er: f(i) = myTextStream
???? Nogle forslag til hvad der er galt, og hvad jeg kan gøre...?
jo, du kan sagtens fjerne den extra linje (Set myTextStream ... ) og skrive 'Set f( i ) = fso.Open ...'. Jeg skrev den blot for at vise eksplicit hvad der sker :)
Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8) Et objekt er obligatorisk: 'f1' /brsnj/www/index.asp, line 60
Line 60 er der hvor jeg henter teksterne frem:
Line 60: Do While not f1.AtEndOfStream Response.write f1.ReadLine & "<br>" Loop
....hmmmmm tænker selv at det måske skyldes at denne løkke egentlig fordrer at jeg stadig har "kontakt" til tekstdokumentet....måske. Måske skulle jeg lave denne løkke inde i den forrige løkke, og samle al teksten med noget i retning af:
Redim TxtSamlet(i) 'hvis din måde at gøre det på holder stik... Do While not f1.AtEndOfStream Set TxtSamlet(i) = TxtSamlet(i) & f1.ReadLine & "<br>" Loop
hmm ... det er nærmest umuligt at sige. det jeg har postet fungere, men jeg ved jo ikke i hvilken sammenhæng du bruger det. lad mig se hele koden du bruger for at løbe dine filer igennem ...
...okay, her er hele dynen ganske ukritisk, som den p.t. ser ud:
<html> <title>Læse fra tekstfiler</title> <head> <link rel="stylesheet" type="text/css" href="brsnj-stylesheet.css">
<%
Set fso = CreateObject("Scripting.FileSystemObject")
for i = 1 to 9 varTxtSti = "tekster\brs\brs" & i & ".txt" filespec = server.mappath(varTxtSti) ReDim f(i) Set myTextStream = fso.OpenTextFile( filespec, 1 ) Set f(i) = myTextStream next
ahh... for det første, så har du glemt ordet 'Preserve' efter ReDim statementen. og for det andre, så ville jeg nok have gjort det på en anden måde:
Den første loop ville jeg have lavet sådan:
for i = 1 to 9 varTxtSti = "tekster\brs\brs" & i & ".txt" ReDim Preserve f(i) f(i-1) = server.mappath(varTxtSti) next
og så ville jeg skrevet ud filen sådan:
Set objTextStream = fso.OpenTextFile( f(1), 1 ) Do While not objTextStream.AtEndOfStream Response.write objTextStream.ReadLine & "<br>" Loop objTextStream.Close
...okay. Den skal jeg lige tygge lidt på (prøve at forstå!) - det med f(i-1) forstår jeg ikke lige umiddelbart, men det gør jeg nok, når jeg får sat mig lidt mere ind i det.
Preserve....det er vist noget med at det forgående bevares og noget mere tilføjes...??? Eller hvad?
Prøver lige at forstå og tester....vender tilbage.
f(i-1) bruges fordi en array i VB (og de fleste andre sprog) er 0-baseret. Dette betyder at det første element i en array, har "id" (index) 0. når du laver din loop, så starter du på 1, og for at arrayet skal have noget indhold "helt i starten" ( ed det første index), så sætter man i-1. I en loop der starter på 1, så vil den første f(i-1) jo være: f(1-1) som igen er det samme som f(0) :-)
Preserve bruges når du gerne vil ændre størrelsen på din array, men beholde indholdet i den. Det der sker når du ReDim'er en array, så allokeres der en ny plads i minde til den nye array, og hvis du vil beholde indholdet i den array du ReDim'er, så er du nødt til at bruge 'Preserve'
Du er bare en sveske.....tak for hjælpen. Jeg har ikke testet det færdigt endnu, men jeg er ret sikker på at det virker ;-). Måske vender jeg tilbage med et par spørgsmål - ok?
Skal rejse her til aften...så vender måske tilbage i morgen.
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.