2013-07-26 26 views
5

Przeprojektowuję część strony internetowej, aby ułatwić jej aktualizację w przyszłości. Obecnie jest to seria tabel, które są zakodowane na sztywno. Aby przeprojektować tabelę (na przykład alfabetyzować ją tak, jak chcę), należy ręcznie zamieniać wiele wartości w html.Jak zaimplementować tablicę w vbscript o zmiennej wielkości

Oto, co chciałbym zrobić: Utwórz obiekt url_Link ze zmienną tytułu i łącza, aby zachować nazwę wyświetlaną i adres URL. Utwórz tablicę obiektów url_Link i zapełnij ją w górnej części pliku .asp strony. Wykonaj dla każdej pętli na tych tablicach, aby zbudować i wypełnić tabelę

To nie jest takie złe, ale mam dwa problemy. Po pierwsze, nie chciałbym definiować rozmiaru tablicy, ponieważ tworzy to drugie miejsce, które musi zostać zmienione po wprowadzeniu zmian w liczbie łączy. Pojawi się pewna logika, która uniemożliwi wyświetlanie niektórych obiektów url_Link (na przykład niektórzy użytkownicy nie mogą uzyskać dostępu do niektórych stron, więc nie zobaczą odsyłaczy), a to spowoduje problemy podczas wymiarowania tablic.

Wiem, że mogłem po prostu utworzyć tablice o dużym rozmiarze, ale wydaje mi się to marnotrawstwem (i nie wiem, jak działają poszczególne funkcje i nie chcę, aby pojawiły się całe zestawy pustych wierszy).

Co mogę zrobić, aby rozwiązać te problemy? Nie mam zbyt dużej wiedzy w vbscript, a większość kodu, z którym pracowałem, nie korzysta z tablic ani obiektów.

AKTUALIZACJA: Próbowałem używać Redim PRESERVE do przycinania nadmiaru tłuszczu z nadwymiarowej tablicy. Problem polega na tym, że w niektórych przypadkach moja tablica jest wypełniana przez mniejsze ilości obiektów niż jej maksymalny rozmiar z powodu warunków. Powoduje to problemy później, kiedy używam pętli for (próbowałem dostać dla każdej z nich do pracy i to nie dzieje się w tej chwili). I pojawia się błąd „Ta tablica jest stałe lub tymczasowo zablokowany” na Redim linii

Kod:

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)" tworzy stałą tablicę (bez możliwości ponownego odczytu) z 2 elementami indeksowanymi 0 i 1. Użyj "Dim a: a = Array()" lub "ReDim a (-1)" do utwórz pustą tablicę ReDim. –

Odpowiedz

5

Zastosowanie ReDim zachować na tablicy. Można użyć Ubound znaleźć aktualną liczbę elementów i zrobić coś jak

ReDim Preserve myArrayName (UBound(myArrayName) + 1) 

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

+1

Próbowałem tego i otrzymuję błąd Ta tablica jest stała lub tymczasowo zablokowana. Kod dodany powyżej –

+3

Marshall: Upewnij się, że nawiasy tablicowe są puste, gdy początkowo przyciemnisz zmienną tablicową. Zajrzyj do sekcji uwag w zamieszczonym przeze mnie linku, wspominają o tym niedbale, ale to trochę za dużo. Będziesz musiał przyciemnić go pustymi parenami, a następnie natychmiast go zredefiniować. –

3

Aby pokazać właściwą drogę do korzystania z dynamicznych tablic w języku VBScript i udowodnić Matta komentarz źle:

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) 

wyjściowa:

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

Aktualizacja komentarza:

Zarówno sposób a, jak i b są poprawne - otrzymuje się jednowymiarową tablicę dynamiczną, do której UBound() można zastosować od początku. Niektórzy ludzie mogą preferować b, ponieważ nie lubią ReDim v bez wcześniejszego Dim v; inni mogą poczuć, że b jest niezdarny lub błędny.

Jeśli spojrzysz na this problem about a two-dimensional array, możesz dojść do wniosku, że sposób jest lepszy.

+0

@ Styne666 - patrz aktualizacja. –