В VB есть условная компиляция (#if...#endif), но нет встроенной константы, определяющей, в каком режиме запущен проект.
Я видел много вариантов определения того, под IDE или нет работает проект, но все они обладали одним общим недостатком: проверка выполнялась в run-time.
Вот самый распространённый вариант:
- Код: Выделить всё
Public Function IsInIDE() As Boolean
On Error GoTo InIDE
Debug.Print 1 / 0
IsInIDE= False
Exit Function
InIDE:
IsInIDE= True
End Function
При этом, в готовом скомпилированном файле остаются проверки и действия, которые заведомо будут всегда работать одним и тем же образом.
Вот например:
- Код: Выделить всё
If IsInIDE Then
MakeSomethingBad
MakeSomethingVeryBad
MakeSomethingVeryVeryBad
Else
MakeSomethingGood
End if
В скомпилированный файл попадёт функция IsInIde, мало того, что она всегда будет выполняться (и всегда отрицательно), в скомпилированный файл также попадут сами функции MakeSomethingBad, MakeSomethingVeryBad и MakeSomethingVeryVeryBad, да плюс вызовы этих функций.
По сравнению с уловной компиляцией такой расклад — очень плохо.
Я предлагаю свой способ, основанный на той же технике, но такой, что вся проблема разрешается на этапе компиляции, и в готовый скомпилированный файл попадает только нужный вариант кода.
Вы заводите в каком-нибудь модуле функцию со следующим кодом:
- Код: Выделить всё
Public Function MakeTrue(ByRef bvar As Boolean) As Boolean
bvar = True
MakeTrue = True
End Function
А затем, когда вам понадобится разместить код, который должен по разному работать, делаете следующее:
- Код: Выделить всё
Dim WE_ARE_IN_IDE As Boolean
Debug.Assert MakeTrue(WE_ARE_IN_IDE)
If WE_ARE_IN_IDE Then
MsgBox "Мы в IDE"
MakeSomethingBad
Else
MsgBox "Мы в скомпилированном файле"
MakeSomethingGood
End If
Когда вы работаете в IDE, функция MakeTrue установит истинное значение переменной bInIde. Вы будите проверять последнюю, и, с учётом её истинности, будет выполняться первый кусочек кода.
Когда же вы скомпилируете программу:
- выражение из Debug.Assert уничтожится (читайте справку по Debug)
- не останется ни одного вызова функции MakeTrue
- функция MakeTrue скомпилирована на будет и в exe-файл не попадёт
- умный компилятор увидит, что переменная WE_ARE_IN_IDE нигде не устанавливается и «заменит её на константу False»
- Будет обработана и скомпилирована только Else-ветка If-а, потому что условие в If-е константно и ложно.
- Вызов MakeSomethingBad скомпилирован не будет и в exe-файл не попадёт. Если нигде в других оставшихся местах эта функция не вызывается, то и сама MakeSomethingBad скомпилирована не будет, и её код в exe-файл не попадёт.