Условная компиляция в VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Условная компиляция в VB

Сообщение jangle » 06.07.2006 (Чт) 12:35

Подскажите, как реализуется условная компиляция в VB.

Например мне нужен такой код:

#IF #DUBUG=True then
END
#ELSE
ExitProcess(0)
#ENDIF


Как реализовать это на VB6?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.07.2006 (Чт) 12:36

Вот именно так и реализуется ;-)
Только вместо #DUBUG=True -- лучше просто Debug.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.07.2006 (Чт) 12:39

Cпасибо! :D

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.07.2006 (Чт) 12:44

Не работает


Код: Выделить всё
Option Explicit

Private Sub Command1_Click()

#If Debug = True Then
  MsgBox "Отладка"
#End If

End Sub

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.07.2006 (Чт) 13:04

Работает, если убрать, наконец, из всех своих прог сравнение булевых переменных с True :twisted: :twisted: и задать Debug=1 в Project -> Properties -> Make -> Conditional Compilation Arguments.
Изображение

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 06.07.2006 (Чт) 13:49

или объявить аргумент так:
Debug=-1

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.07.2006 (Чт) 13:56

Работает, если убрать, наконец, из всех своих прог сравнение булевых переменных с True и задать Debug=1 в Project -> Properties -> Make -> Conditional Compilation Arguments.


Сделал все как расписано, в результате получил:

Compie error:
An # ElseIf, #Else, or #EndIf must be preceded an # if clause

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.07.2006 (Чт) 14:23

Значит, где-то опечатался. У меня всё работает.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.07.2006 (Чт) 14:53

Да нет вроде, очепятаться там негде...

Вот этот код работает, можно определить, где работаешь в IDE или в EXE:

Код: Выделить всё
Private Function InIDE(Optional ByRef blArg As Boolean) As Boolean
    Static blRet As Boolean
    blRet = blArg
    If Not blRet Then
        Debug.Assert InIDE(True)
    End If
    InIDE = blRet
End Function



Но это все же не условная компиляция..

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.07.2006 (Чт) 15:12

А как ты задаешь переменную в Conditional Compilation Arguments?

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.07.2006 (Чт) 15:46

Debug=1

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 06.07.2006 (Чт) 15:53

Попробуй не Debug, а Dbg обозвать переменную.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.07.2006 (Чт) 17:23

Код: Выделить всё
Option Explicit
#Const Deb = True

Private Sub Command1_Click()
  #If Deb Then
    MsgBox "Отладка"
  #End If
End Sub

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 07.07.2006 (Пт) 7:03

Код: Выделить всё
Function InIDE() As Boolean
  On Error Resume Next
  Debug.Print 1 / 0
  InIDE = Err.Number <> 0
End Function

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.07.2006 (Пт) 8:08

Гмда.... логика не понятна:
Код: Выделить всё

Function InIDE() As Boolean
  On Error Resume Next
  Debug.Print 1 / 0
  InIDE = Err.Number = 11
End Function
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 07.07.2006 (Пт) 10:28

2Хакер Гмда..., это был ответ на этот странный код

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 07.07.2006 (Пт) 10:51

jangle писал(а):Но это все же не условная компиляция..


Вот именно.

Код: Выделить всё
    #If CLIENT Then
        ...
    #Else

    #End If


В свойствах проекта в Conditional Compilation Arguments пишем

CLIENT = 0

или

CLIENT = 1

И в зависимости от этого в скомпилированный проект будет включена та или иная часть кода в #IF. Ну и она-же будет выпольняться при отладке из IDE.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

IIIypuk
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 10.06.2006 (Сб) 12:39

Сообщение IIIypuk » 08.07.2006 (Сб) 18:04

Nicky, я тебе оплодирую. Начал читать тему, хотел предложить то же самое, но решил все таки дочитать. :roll: Оказалось опоздал.
Есть 10 типов людей. Те, кто понимает двоичную систему исчисления, и те, кто не понимает...

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 08.08.2007 (Ср) 12:34

А можно обойтись без объявления в свойствах проекта Deb=1, а просто #Const Deb = 1? Как в таком случае объявить её Public? Пробовал писать #Const Deb = 1 в модуле - не реагирует...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Me!
Новичок
Новичок
 
Сообщения: 35
Зарегистрирован: 05.08.2007 (Вс) 21:35

Сообщение Me! » 08.08.2007 (Ср) 15:59

делаю так и всё работает:
начало модуля/формы/класса:
Код: Выделить всё

#Const DBG = 1

а затем, где нужно:
Код: Выделить всё

#If DBG Then
'бла-бла-бла
#Else
'бла-бла-бла
#End If

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 08.08.2007 (Ср) 16:48

Так-то понятно, а чтоб на весь проект константу написать сразу и без редактирования свойств проекта?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.08.2007 (Ср) 16:53

Rojohn
Модули обрабатываются последовательно. Откуда компилятору знать, в какой последовательности обрабатывать модули, чтобы сначала найти все константы, а потом их учитывать?

Поэтому константы, объявляемые в коде действуют только в пределах модуля.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 08.08.2007 (Ср) 19:04

Нет, я имел ввиду одну константу в модуле, что-то типа #Public Const Deb=1. Но так писать нельзя. Но, наверное, можно как-то по-другому наподобе этого, без редактирования свойств проекта? Т.е. одна константа в модуле на весь проект. Ведь, когда мы объявляем константу в свойствах проекта она действительна для всего проекта. Вполне возможно, чтобы компилятор искал в декларэйшинах модулей константы, а потом компилил проект. Или это только из области фантазий? :)
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 08.08.2007 (Ср) 19:11

До тебя не дошло? Ты понимаешь что придётся просматривать при компилции все модули дважы? Сначала выискивать из них все константы, потом уже компилировтаь.

А если в условных блоках тоже определяются константы? Тогда проходится по модулям придётся ещё большее число раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Сообщение Rojohn » 08.08.2007 (Ср) 19:12

Да, наверное это фантазии. Если модули выполняются последовательно и условная компиляция будет стоять внутри модуля, то кусками он его обрабатывать не сможет, конечно. Нужно место вне кода для объявления этой константы, т.е. свойства проекта.
ОК! Всё ясно! Спасибки!
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 107

    TopList