2013-07-26 12 views
5

Sto riprogettando una parte di una pagina Web per rendere più facile l'aggiornamento in futuro. Attualmente, è una serie di tabelle, che sono hard-coded. Per ridisegnare la tabella (ad esempio, per alfabetizzarla come voglio), è necessario scambiare manualmente molti valori in html.Come implementare un array in vbscript con una dimensione variabile

Questo è quello che mi piacerebbe fare: Creare un oggetto url_Link con un titolo e una variabile di collegamento, per mantenere rispettivamente il nome visualizzato e l'url. Creare una matrice di oggetti url_Link e compilarla nella parte superiore del file .asp per la pagina. Esegui a ogni ciclo su quegli array per compilare e popolare la tabella

Questo non è poi così male, ma ho incontrato due problemi. Per prima cosa, non mi piacerebbe dover definire la dimensione dell'array, poiché questo rende un secondo posto che deve essere cambiato quando vengono apportate modifiche al numero di collegamenti. Ci sarà un po 'di logica per impedire la visualizzazione di alcuni oggetti url_Link (ad esempio, alcuni utenti non possono accedere ad alcune pagine, quindi non vedranno i link), e ciò causerebbe problemi quando si dimensionano gli array.

So che potrei semplicemente creare array di grandi dimensioni, ma questo mi sembra uno spreco (e non so come per ogni funzione e non voglio che vengano visualizzate un mucchio di righe vuote).

Cosa posso fare per risolvere questi problemi? Non sono molto esperto in vbscript e la maggior parte del codice con cui ho lavorato non sfrutta gli array o gli oggetti.

AGGIORNAMENTO: Ho provato a utilizzare una PRESERVAZIONE di redim. Per ridurre il grasso in eccesso di un array di grandi dimensioni. Il problema è che in alcuni casi, il mio array è popolato da piccole quantità di oggetti rispetto alla sua dimensione massima a causa delle condizioni if. Ciò sta causando problemi in seguito quando uso un ciclo for (ho cercato di far funzionare uno per ciascuno e questo non sta accadendo al momento). Ottengo l'errore "Questa matrice è fissa o temporaneamente bloccato" sulla linea ReDim

Codice:

dim systemSettingsArray(1) 
    arrayCounter = 0 
    if ADMIN = "Y" then 
     set systemSettingsArray(arrayCounter) = (new url_Link).Init("Account Administration","Maintenance/Account_Admin.asp") 
     arrayCounter = arrayCounter + 1 
    end if 
    set systemSettingsArray(arrayCounter) = (new url_Link).Init("Time Approval","Maintenance/system_Time_Approval.asp") 
    redim Preserve systemSettingsArray(arrayCounter) 
+2

"Dim a (1)" crea un array fisso (non-ReDim-able) con 2 elementi indicizzati 0 e 1. Utilizzare "Dim a: a = Array()" o "ReDim a (-1)" per creare un array vuoto RiDim-capable. –

risposta

5

Usa ReDim preservare sulla matrice. È possibile utilizzare UBound per trovare l'attuale numero di elementi e di fare qualcosa di simile

ReDim Preserve myArrayName (UBound(myArrayName) + 1) 

http://msdn.microsoft.com/en-us/library/c850dt17%28v=vs.84%29.aspx

+1

Ho provato questo, e ottengo un errore Questa matrice è fissa o temporaneamente bloccata. Codice aggiunto sopra –

+3

Marshall: assicurati che le parentesi tra parentesi siano vuote quando inizialmente oscuri la variabile dell'array. Controlla la sezione dei commenti nel link che ho postato, lo menzionano casualmente ma è un pò un affare enorme. Sarà necessario attenuarlo con parens vuoti e quindi ridimimerlo immediatamente. –

3

Per mostrare il modo corretto di utilizzare le matrici dinamiche in VBScript e per dimostrare di Matt commento sbagliato:

Option Explicit 

ReDim a(-1) 
Dim b : b = Array() 
Dim c() 
Dim i 
For i = 0 To 1 
    ReDim Preserve a(UBound(a) + 1) : a(UBound(a)) = i 
    ReDim Preserve b(UBound(b) + 1) : b(UBound(b)) = i 
    On Error Resume Next 
    ReDim Preserve c(UBound(c) + 1) : c(UBound(c)) = i 
    WScript.Echo Err.Description, "- caused by Dim c()" 
    On Error GoTo 0 
Next 
WScript.Echo "a:", Join(a) 
WScript.Echo "b:", Join(b) 

uscita:

Subscript out of range - caused by Dim c() 
Subscript out of range - caused by Dim c() 
a: 0 1 
b: 0 1 

Aggiornamento WRT commento:

Sia l'uno e il modo b sono corrette - si ottiene un un array dinamico dimensionale a cui UBound() può essere applicato fin dall'inizio. Alcune persone potrebbero preferire b, perché non amano ReDim v senza un precedente Dim v; altri possono sentire che b è maldestro o errorprone.

Se si guarda this problem about a two-dimensional array, si può giungere alla conclusione che il modo migliore si ridimensiona.

+0

@ Styne666 - consultare l'aggiornamento. –