2012-01-19 15 views
7

Tengo un gran proyecto VB6 donde muchas variables no tienen un tipo explícitamente definido, por lo que automáticamente se configuran de manera predeterminada en Variant. Encontrar todos esos objetos a mano es una tarea enorme, así que ¿hay alguna forma de automatizar esto? En VB.Net es posible desactivar todo el uso automático de variantes usando 'Option Strict', pero VB6 no tiene esa opción.VB6: Deshabilitar las variantes

Ahora mismo agregué DefByte A-Z a cada clase, lo que hace que el tipo predeterminado sea 'Byte' en lugar de 'Variant'. Esto me permite capturar muchas variables indefinidas en tiempo de ejecución, tan pronto como se les asigna un valor mayor que 255. Pero todavía no es totalmente infalible.

¿Existe alguna manera más confiable de detectar todas las variables indefinidas?

+0

¿No puede simplemente buscar la palabra "Variant" en toda la solución? – pikzen

+1

@pikzen: en VB6 si no especificas el tipo, obtienes Variant. – MartW

+1

Además, si tiene una línea como "Dim x, y, z AS Integer", solo z será un Entero. x y y serán Variantes. Este comportamiento cambió con VB.NET, afortunadamente. – MartW

Respuesta

2

No creo que haya una forma "infalible" de detectar todas las variables indefinidas. Sin embargo, la instrucción Option Explicit requerirá que todas las variables se declaren en el módulo en el que aparece la instrucción, por lo que el compilador marcará las instancias en las que no sea el caso. También hay una opción IDE que agrega automáticamente esta declaración al comienzo de cualquier módulo nuevo.

+0

El código ya se ha utilizado Opción explícita, gracias de todos modos! – Muis

+0

Si ha utilizado Option Explicit en su código, ¿por qué hace esta pregunta? –

+0

@MarkBertenshaw - 'Opción Explícita' comprueba las variables no declaradas. No verifica si las variables declaradas son variantes, que es lo que OP requiere –

5

Solía ​​usar Aivosto's Project Analyzer para recoger cosas como esta. Hay una versión demo que le dará una buena idea de lo que puede hacer.

+0

de acuerdo. El software no es costoso y se amortizará muy rápidamente con el tiempo ahorrado y los problemas evitados. –

4

Decora tus módulos con Option Explicit.

Esta frase debe ir en la parte superior de cada módulo que cree. Cuando lo haya hecho, causará un error de compilación cuando se encuentren variables no declaradas.

Option Explicit no será, sin embargo, evitar declaraciones de variables de tipo-menos, como

Dim i 

La variable i será declarada como una variante, y ningún error de compilador sean lanzados incluso con Option Explicit definido.

+0

El código ya utilizó Option Explicit, ¡gracias de todos modos! – Muis

2

Utilice un editor de texto de programador (yo uso UltraEdit) y realice una búsqueda masiva en los directorios de origen del proyecto.

Comience con la búsqueda de Variant (obviamente), aunque probablemente ya haya hecho eso.

Siguiente usar un tipo de búsqueda de expresiones regulares para algo a lo largo de las líneas de:

*Dim [a-zA-Z][a-zA-Z0-9_]*\p 

Eso debe conseguir el escenario Dim x sin el arrastre As DataType.

Usa *Dim [a-zA-Z][a-zA-Z0-9_]*,.* para encontrar el tipo de escenario Dim a, b, c As Integer.

Uso *Dim .*, [a-zA-Z][a-zA-Z0-9_]*,.* para escenarios de bolas impares como Dim a As Integer, b, c As Long

Repita los seaches anteriores con Private y Global en lugar de Dim y que deben conseguir casi todo.

+1

'ReDim' también debe incluirse, porque VB no requiere primero un 'Dim'. Y no funciona para matrices, parámetros de funciones, valores de retorno, etc. Por lo tanto, aunque es un buen esfuerzo, tiene algunas lagunas;) – Muis

+0

Solo he usado Redim con matrices. Pensé en el tema de los parámetros, pero para ser sincero, no soy lo suficientemente fluido con las expresiones regulares para golpear uno por cada uno. Lo dejaré en manos de alguien más ambicioso que yo :) – tcarvin

+0

¿No se puede usar Public y Private para declarar un campo? Necesita expresiones regulares para esos también. – MarkJ

Cuestiones relacionadas