2010-11-04 54 views
13

Tôi đang duy trì một ứng dụng ASP cổ điển được viết bằng VB Script bởi một công ty bên ngoài lâu rồi, lâu rồi.Kiểm tra xem một đối tượng tồn tại trong VBScript

Tôi có một mảng các đường dẫn imagefile, như vậy:

dim banners, arrKeys, i 
set banners=CreateObject("Scripting.Dictionary") 
banners.Add "banner1.jpg", "http://www.somelink.com" 
banners.Add "banner2.jpg", "http://www.somelink.com" 
banners.Add "banner3.jpg", "http://www.somelink.com" 

này sẽ chỉ tồn tại trên các trang có quảng cáo banner. Có một số mã tiêu chuẩn lặp qua danh sách này trong một tệp bao gồm (phổ biến cho tất cả các trang).

If Not banners Is Nothing then 
    ' then loop through the Dictionary and make a list of image links 
End if 

Vấn đề là nếu banners không khởi tạo trên trang (nó không phải trên tất cả các trang), tôi nhận được một lỗi Can't find object

cách thích hợp để kiểm tra xem một đối tượng tồn tại trong VB Script là gì?

Trả lời

29

@ Atomix: Thay thế

If Not banners Is Nothing then 

và sử dụng

If IsObject(banners) Then 

mã khác của bạn sau đó bạn có thể đặt vào một tập tin bao gồm và sử dụng nó ở phía trên cùng của trang web của bạn để tránh trùng lặp không cần thiết.

@Canan S: Tôi đã thử nghiệm các đoạn mã của mình ở trên với Option Explicit bật/tắt và không gặp phải lỗi cho một trong hai phiên bản, bất kể là Dim banners có ở đó hay không. :-)

+0

Hmmmm ... điều này cho thấy lời hứa. – Armstrongest

+0

@ Atømix: Tôi quên kiểm tra lại câu hỏi này; Nó đã làm việc cho bạn? :-) – stealthyninja

+1

Vâng, nó đã làm! Cảm ơn. VB6 là một thế giới thú vị. – Armstrongest

3

Nếu một biến được khai báo, nhưng không được khởi tạo, giá trị của nó sẽ Empty, mà bạn có thể kiểm tra với IsEmpty() chức năng:

Dim banners 
If IsEmpty(banners) Then 
    Response.Write "Yes" 
Else 
    Response.Write "No" 
End If 
' Should result in "Yes" being written 

banners sẽ chỉ được tính bằng Nothing nếu bạn dứt khoát gán nó mà giá trị với Set banners = Nothing.

Bạn sẽ gặp sự cố, với kỹ thuật này nếu bạn đã bật tính năng này là Option Explicit (đây là đề xuất nhưng không phải luôn luôn như vậy). Trong trường hợp đó, nếu banners chưa được Dim chỉnh sửa và bạn thử kiểm tra IsEmpty(banners), bạn sẽ gặp phải lỗi thời gian chạy. Nếu bạn không có Option Explicit, bạn không nên gặp bất kỳ sự cố nào.

chỉnh sửa: Tôi vừa thấy điều này related question and answer cũng có thể hữu ích.

+0

Vâng, đó là vấn đề, 'biểu ngữ' chưa được' làm mờ trong các trang không có biểu ngữ. – Armstrongest

0

Bạn cần có ít nhất dim banners trên mọi trang.

Bạn không có head.asp hoặc nội dung nào đó được đưa vào mọi trang?

+0

Có ... tuy nhiên đó là trang chỉ định các biểu ngữ và "công việc" được thực hiện trong htmlhead.inc ... vì vậy đối với các trang có biểu ngữ tôi cần phải đặt biến TRƯỚC đầu. Thật là khó hiểu, tôi biết. Tôi sẽ rất vui khi tôi không phải duy trì nó. – Armstrongest

25

IsObject có thể hoạt động, nhưng IsEmpty có thể là một lựa chọn tốt hơn - nó được thiết kế đặc biệt để kiểm tra xem biến có tồn tại hoặc đã được khởi tạo hay không.

Để tóm tắt:

  • IsEmpty(var) sẽ kiểm tra nếu một biến tồn tại (không có Object Explicit), hoặc là sở khởi
  • IsNull(var) sẽ kiểm tra nếu một biến đã được giao cho Null
  • var Is Nothing sẽ kiểm tra nếu một biến đã được Set đến Nothing, nhưng sẽ ném một lỗi nếu bạn thử nó trên một cái gì đó không phải là một đối tượng
  • IsObject(var) sẽ kiểm tra nếu một biến là một đối tượng (và dường như vẫn trả về False nếu varEmpty).
0

Không có IsEmpty, là đối tượng, IsNull làm việc với cài đặt "Tùy chọn rõ ràng", như stealthyninja ở trên đã trả lời sai lạc. Cách đơn tôi biết là để 'Hack' the 'Option Explicit' với thiết lập các 'On Error Resume Next', như Tristan Havelick độc đáo làm nó ở đây: Is there any way to check to see if a VBScript function is defined?

+0

Tôi tin rằng đó là để kiểm tra xem một hàm có được định nghĩa không, ở trên chỉ là để kiểm tra nếu một biến đơn giản tồn tại chưa. Câu hỏi thú vị mặc dù! – Hannele

0

Hơi liên quan là IsMissing() để kiểm tra nếu một tham số tùy chọn đã được thông qua, trong trường hợp này là một đối tượng, như sau:

Sub FooBar(Optional oDoc As Object) 

    'if parameter is missing then simulate it 
    If IsMissing(oDoc) Then Dim oDoc as Object: oDoc = something 

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