2012-01-29 19 views

Respuesta

32

Es prácticamente lo mismo que los otros idiomas a los que está acostumbrado. La sintaxis es la siguiente:

#If DEBUG = 1 Then 
    ' Do something 
#Else 
    ' Do something else 
#End If 

Es fácil de recordar si usted se acuerda que la sintaxis es exactamente lo mismo que las otras declaraciones de control de flujo en VB 6, excepto que los condicionales en tiempo de compilación comienzan con una libra signo (#).

El truco está en definir la constante DEBUG (o lo que sea) constante porque estoy bastante seguro de que no hay una definida por defecto. Hay dos formas estándar de hacerlo:

  1. utilizar la palabra clave #Const para definir la constante en la parte superior de cada fichero fuente. La definición que establece de esta manera es válida en todo el módulo fuente. Se vería algo como:

    #Const DEBUG = 1 
    
  2. Establecer la constante en las propiedades del proyecto. Esto definiría una constante que es válida en todo el proyecto (y es probablemente lo que quiere para un indicador de modo "Depurar").

    Para ello, introduzca algo así como lo siguiente en el cuadro de texto "Las constantes de compilación condicional" en la pestaña "Marca" del cuadro de diálogo "Propiedades del proyecto":

    DEBUG = 1 
    

    Puede definir varias constantes en este diálogo por la separación de cada uno de ellos con dos puntos (:):

    DEBUG = 1 : VERSION2 = 1 
    

recordar que cualquier constante que es no definidos se supone que es 0.

+0

Esto tiene un aspecto fantástico, solo una pregunta, cuando se compila la versión de lanzamiento del exe Asumo es necesario establecer debug = 0 o no detecta este VB automático y de alguna manera se las arregla para garantizar la materia de depuración es no compilado (supongo que const tendría que estar codificado internamente en el compilador para poder hacer esto, poco probable pero solo quería asegurarse). Entonces, antes del lanzamiento, ¿simplemente estableces DEBUG = 0 y estás listo para compilar? –

+1

@Erx: No, no hay autodetección hecha por el compilador. El símbolo 'DEBUG' no se define automáticamente, tienes que hacerlo tú mismo. Entonces cambiar al modo "liberar" es una acción manual. Sí, en este ejemplo, cambiaría la constante 'DEBUG' en tiempo de compilación a 0. –

+0

¿qué pasaría si colocara DEBUG = 1 en el área del módulo de declaraciones generales del código ...? ¿Seguiría funcionando o fallaría? –

11

Cody se ha dicho acerca de la compilación condicional. Me gustaría agregar que si desea un comportamiento diferente al depurar en el IDE (por ejemplo, desactivar su propio manejo de errores para que el IDE atrape errores) no necesita compilación condicional. Puede detectar el IDE en tiempo de ejecución de esta manera.

On Error Resume Next 
Debug.Print 1/0 
If Err=0 then 
    'Compiled Binary 
Else 
    'in the IDE 
End if 

Esto funciona porque Debug.Print se ha omitido en el EXE compilado.

  • EDITAR recuerde apagar On Error Resume Next!
  • EDITAR Usted puede envolver el cheque en una función como this (gracias CraigJ)
+1

Es un buen consejo, pero es probable que desee desactivar 'On Resume Error Next' en algún momento, ¿eh? :-) –

+1

¿Por qué? On Error Resume Next es la mejor estrategia de manejo de errores - el usuario no ve ningún error de esta manera :) Bueno, al menos hasta que no mire los datos reales ... Más en serio, solo estamos usando variables globales (inEXE) e inicializándolo mientras se inicia el programa; lo mismo para los indicadores de depuración y rastreo. Sí, este enfoque no usa directivas de preprocesador, pero la sobrecarga en tiempo de ejecución (desde el control de varios indicadores) es insignificante en comparación con el acceso a la base de datos o incluso al dibujo de IU simple. – Arvo

+0

Sería mejor declarar una bandera global, y hacer esta comprobación en algún lugar hacia el comienzo de Sub Main. De esta forma puede verificar la depuración con una sobrecarga mínima. –

6

Para lograr el mismo efecto que MarkJ, pero con el tratamiento de errores, puede utilizar el siguiente código.

Public Function GetRunningInIDE() As Boolean 

    Dim x As Long 
    Debug.Assert Not TestIDE(x) 
    GetRunningInIDE = x = 1 

End Function 

Private Function TestIDE(x As Long) As Boolean 

    x = 1 

End Function 

Cuando se ejecuta desde el IDE, habrá una sobrecarga adicional de llamar a una función (que es ridículamente pequeña). Cuando se compila, esto se evalúa como una simple comparación numérica.

+0

+1. Esto realmente se parece a lo que usamos realmente en el trabajo, pero no publiqué ese código porque pertenece a mi empleador. – MarkJ

2

Este es mi código corto y estable. Creo que es mejor que las constantes condicionales, porque no es necesario cambiarlo cada vez que se produce una complicación.

Public Function InIDE() As Boolean 
    On Error Resume Next 
    Debug.Print 0/0 
    InIDE = Err.Number <> 0 
End Function 
+0

+1 La mejor respuesta porque es corta y es dulce, y no requiere cambiar las propiedades del proyecto cada vez que necesite recompilarlo. – Keith

Cuestiones relacionadas