2013-07-26 29 views
5

Tôi đang thiết kế lại một phần của trang web để dễ dàng cập nhật hơn trong tương lai. Hiện tại, nó là một loạt các bảng, được mã hóa cứng. Để thiết kế lại bảng (ví dụ: để sắp xếp theo thứ tự bảng chữ cái như tôi muốn), yêu cầu trao đổi theo cách thủ công xung quanh rất nhiều giá trị trong html.Cách triển khai mảng trong vbscript có kích thước biến là

Đây là những gì tôi muốn làm: Tạo đối tượng url_Link với biến tiêu đề và liên kết, để giữ tên hiển thị và url tương ứng. Tạo một mảng các đối tượng url_Link và điền nó ở đầu tệp .asp cho trang. Thực hiện cho mỗi vòng lặp trên các mảng đó để tạo và điền vào bảng

Bản thân điều này không quá tệ, nhưng tôi gặp phải hai vấn đề. Trước tiên, tôi không muốn phải xác định kích thước mảng, vì điều này làm cho một vị trí thứ hai phải được thay đổi khi thay đổi được thực hiện cho số lượng liên kết. Sẽ có một số logic để ngăn các đối tượng url_Link nhất định hiển thị (ví dụ, một số người dùng không thể truy cập một số trang nhất định, vì vậy họ sẽ không thấy liên kết) và điều này sẽ gây ra sự cố khi định kích thước mảng.

Tôi biết rằng tôi chỉ có thể tạo các mảng có kích thước lớn, nhưng điều này dường như lãng phí đối với tôi (và tôi không biết làm thế nào cho mỗi chức năng và không muốn một loạt các hàng trống hiển thị).

Tôi có thể làm gì để giải quyết những vấn đề này? Tôi không hiểu nhiều về vbscript, và hầu hết đoạn code mà tôi đã làm việc với không tận dụng lợi thế của mảng hoặc đối tượng.

CẬP NHẬT: Tôi đã thử sử dụng tính năng BẢO QUẢN redim để cắt chất béo thừa của một mảng quá khổ. Vấn đề là trong một số trường hợp, mảng của tôi được phổ biến bởi số lượng đối tượng nhỏ hơn kích thước tối đa của nó vì nếu điều kiện. Điều này đang gây ra vấn đề sau này khi tôi sử dụng vòng lặp for (cố gắng để có được một cho mỗi để làm việc và đó là không xảy ra vào lúc này). Tôi nhận được lỗi "mảng này là cố định hoặc tạm thời khóa" trên dòng ReDim

Code:

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)" tạo một mảng cố định (không có thể xác định lại) với 2 phần tử được lập chỉ mục 0 và 1. Sử dụng "Dim a: a = Array()" hoặc "ReDim a (-1)" để tạo một mảng ReDim-có thể trống. –

Trả lời

5

Sử dụng ReDim giữ gìn trên mảng. Bạn có thể sử dụng UBound để tìm số lượng hiện tại của các yếu tố và làm điều gì đó như

ReDim Preserve myArrayName (UBound(myArrayName) + 1) 

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

+1

Tôi đã thử cách này và tôi gặp lỗi. Mảng này đã được sửa hoặc tạm thời bị khóa. Mã được thêm vào phía trên –

+3

Marshall: Đảm bảo rằng các dấu ngoặc đơn mảng của bạn trống khi bạn ban đầu làm mờ biến mảng. Kiểm tra phần nhận xét trong liên kết tôi đăng, họ đề cập đến nó tình cờ nhưng nó kinda một thỏa thuận rất lớn. Bạn sẽ cần phải làm mờ nó bằng các khoảng trống rỗng, và sau đó ngay lập tức làm lại nó. –

3

Để hiển thị cách chính xác để sử dụng mảng động trong VBScript và để chứng minh Matt bình luận sai:

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) 

đầu ra:

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

Cập nhật nhận xét wrt:

Cả hai cách a và b đều đúng - bạn nhận được mảng động một chiều mà UBound() có thể được áp dụng ngay từ đầu. Một số người có thể thích b, bởi vì họ không thích ReDim v mà không có Dim v trước đó; người khác có thể cảm thấy rằng b là vụng về hoặc bị lỗi.

Nếu bạn nhìn vào this problem about a two-dimensional array, bạn có thể đi đến kết luận, rằng cách cân bằng tốt hơn.

+0

@ Styne666 - vui lòng xem cập nhật. –

Các vấn đề liên quan