2010-11-04 24 views
13

Estoy manteniendo una aplicación ASP clásica escrita en VB Script por una empresa externa hace mucho, mucho tiempo.Compruebe si existe un objeto en VBScript

que tienen una gran variedad de caminos imageFile, así:

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" 

Esto va a existir únicamente en las páginas que tienen los anuncios de banner. Existe un código estándar que recorre esta lista en un archivo de inclusión (común a todas las páginas).

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

El problema es que si banners no se instancia en la página (que no es en todas las páginas), me sale un error Can't find object

¿Cuál es la forma correcta de comprobar si existe un objeto en VB Script?

Respuesta

29

@ Atomix: Reemplazar

If Not banners Is Nothing then 

y utilizar

If IsObject(banners) Then 

Su otro tipo de código a continuación, puede colocar en un archivo de inclusión y utilizarlo en la parte superior de sus páginas para evitar la duplicación innecesaria.

@Cheran S: Probé mis fragmentos con Option Explicit on/off y no encontré errores para ninguna versión, independientemente de si Dim banners estaba allí o no. :-)

+0

Hmmmm ... esto muestra una promesa. – Armstrongest

+0

@ Atømix: Olvidé verificar esta pregunta nuevamente; ¿Funcionó para ti? :-) – stealthyninja

+1

Sí, lo hizo! Gracias. VB6 es un maravilloso mundo de interés. – Armstrongest

3

Si se declara una variable, pero no inicializado, su valor será Empty, que se puede comprobar con la función IsEmpty():

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

banners sólo será igual a Nothing si asigna explícitamente que valor con Set banners = Nothing.

Sin embargo, tendrá problemas con esta técnica si tiene activado Option Explicit (que es la recomendación, pero no siempre es el caso). En ese caso, si banners no ha sido Dim ed e intenta probar IsEmpty(banners), obtendrá un error de tiempo de ejecución. Si no tiene activado Option Explicit, no debería tener ningún problema.

corregir: Acabo de ver esto related question and answer que podría ayudar también.

+0

Sí, ese es el problema, 'banners' no ha sido' dim'med en páginas sin banderas. – Armstrongest

0

Necesita tener al menos dim banners en cada página.

¿No tiene un head.asp o algo incluido en cada página?

+0

Hay ... sin embargo, es la página donde se especifican los banners y el "trabajo" se realiza en htmlhead.inc ... por lo que para las páginas que tienen pancartas, necesito establecer la variable ANTES del encabezado. Es confuso, lo sé. Me alegraré cuando no tenga que mantenerlo. – Armstrongest

25

IsObject podría funcionar, pero IsEmpty podría ser una mejor opción: está específicamente diseñado para verificar si existe una variable o si se ha inicializado.

En resumen:

  • IsEmpty(var) procedimiento permite determinar si existe una variable (sin objeto explícito), o se inicializa
  • IsNull(var) pondrá a prueba si una variable se ha asignado a Null
  • var Is Nothing pondrá a prueba si una variable ha sido Set a Nothing, pero lanzará un error si lo intenta en algo que no es un objeto
  • IsObject(var) probará si una variable es un objeto (y aparentemente aún devolverá False si var es Empty).
0

Ni IsEmpty, Is Object, IsNull funcionan con la configuración "Option Explicit", ya que stealthyninja ha respondido erróneamente. La única forma que conozco es 'hackear' la 'Option Explicit' con el ajuste 'On Error Resume Next', mientras Tristán Havelick muy bien lo hace aquí: Is there any way to check to see if a VBScript function is defined?

+0

Creo que eso es para verificar si se define una función, donde más arriba es solo para verificar si todavía existe una variable simple. ¡Interesante pregunta! – Hannele

0

Poco relacionado es IsMissing() para probar si un parámetro opcional fue aprobada, en este caso un objeto, como esto:

Sub FooBar(Optional oDoc As Object) 

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

... 
Cuestiones relacionadas