2012-01-29 3 views

ответ

32

Это почти то же, что и на других языках, к которым вы привыкли. Синтаксис выглядит следующим образом:

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

Это легко запомнить, если вы помните, что синтаксис точно так же, как и другие заявления потока управления в VB 6, за исключением того, что во время компиляции условных начать с фунтом знак (#).

Трюк фактически определяет константу DEBUG (или что-то еще), потому что я уверен, что по умолчанию не определено. Есть два стандартных способа сделать это:

  1. Используйте кнопки #Const ключевое слово, чтобы определить константу в верхней части каждого исходного файла. Определение, которое вы устанавливаете таким образом, действует во всем исходном модуле. Это будет выглядеть примерно так:

    #Const DEBUG = 1 
    
  2. Задайте константу в свойствах проекта. Это определит константу, которая действительна на протяжении всего проекта (и, вероятно, это то, что вы хотите для индикатора режима «Отладка»).

    Для этого нужно ввести что-то вроде следующего в «условной компиляции Константы» текстовое поле на вкладке «Make» диалогового окна «Свойства проекта»:

    DEBUG = 1 
    

    Вы можете определить несколько констант в этом диалоге, разделяя каждый из них с толстой кишки (:):

    DEBUG = 1 : VERSION2 = 1 
    

Помните, что любая константа, не определено считается равным 0.

+0

Это выглядит фантастическим, только один вопрос, при компиляции окончательной версии ЕХЕ Я предполагаю, что вам нужно установить DEBUG = 0 или же VB автоматически обнаружит это и каким-то образом удается обеспечить отлаживать материал не компилируется (я думаю, что const должен быть внутренне жестко закодирован в компилятор, чтобы он мог это сделать, маловероятно, но просто хотел убедиться). Итак, перед выпуском просто установите DEBUG = 0 и ур готов к компиляции? –

+1

@Erx: Нет, автоматическое обнаружение не выполняется компилятором. Символ 'DEBUG' не определяется автоматически, вы должны сделать это самостоятельно. Поэтому переход в режим «выпуска» - это ручное действие. Да, в этом примере вы изменили бы константу 'DEBUG' времени компиляции на 0. –

+0

, что произойдет, если вы поместите DEBUG = 1 в область модуля общих деклараций кода ...? Будет ли он работать или терпеть неудачу? –

11

Коди рассказал вам об условной компиляции. Я хотел бы добавить, что если вы хотите по-разному вести себя при отладке в среде IDE (например, отключите собственную обработку ошибок, чтобы ошибки IDE ловушки) вам не нужно условная компиляция. Вы можете обнаружить IDE во время выполнения, как это.

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

Это работает, потому что Debug.Print опущен в скомпилированном EXE.

  • EDIT Не забудьте выключить On Error Resume Next!
  • EDIT Вы можете обернуть проверку в функции как this (спасибо CraigJ)
+1

Это хороший совет, но вы, вероятно, захотите отключить 'On Error Resume Next' в какой-то момент, а? :-) –

+1

Почему? On Error Resume Next - лучшая стратегия обработки ошибок - пользователь не видит ошибки таким образом :) Ну, по крайней мере, пока он не посмотрит на фактические данные ... Более серьезно, мы просто используем глобальную переменную (inEXE) и инициализировать его во время запуска программы; то же самое для флагов отладки и трассировки. Да, этот подход не использует директивы препроцессора, но накладные расходы времени выполнения (от проверки различных флагов) незначительны по сравнению с доступом к базе данных или даже простым графическим интерфейсом. – Arvo

+0

Вам бы лучше объявить глобальный флаг и выполнить эту проверку где-то в начале Sub Main. Таким образом, вы можете проверить наличие отладки с минимальными накладными расходами. –

6

Для достижения такого же эффекта, как MarkJ, но с обработкой ошибок, вы можете использовать следующий код.

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 

Когда вы работаете внутри IDE, там будет дополнительные накладные расходы вызова функции (что смехотворно мало). При компиляции это оценивается простым сравнением чисел.

+0

+1. Это похоже на то, что мы фактически используем на работе, но я не публиковал этот код, потому что он принадлежит моему работодателю. – MarkJ

2

Это мой короткий и стабильный код. Я думаю, что это лучше условных констант, потому что вам не нужно менять его на каждое усложнение.

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

+1 Лучший ответ, потому что он короткий и приятный и не требует изменения свойств проекта, когда вам нужно перекомпилировать. – Keith

Смежные вопросы