Булево значение TRUE на других локалях другое, помогите!

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

Булево значение TRUE на других локалях другое, помогите!

Сообщение Pantalone » 03.04.2007 (Вт) 12:44

Если попробовать в дебагере VB6 в отладочном окошке набрать ?CStr(True) то результатом будет True практически на любой машине где я это тестировал с разными языковыми настройками. Мою фриварную прогу использует туча народу в мире и по отзывам все работает прекрасно, но у некоторых довольно редких людей почему-то значение True выдается не в английской интерпретации, а в их собственном языке, например один бельгиец прислал мессагу что у него не работает прога, стали разбираться и тестить и тут я обнаружил что у него значение True, если его перевести в строку будет как Vrai. Я честно говоря в ступоре... как же так? Просил его выслать msvbvm60.dll, думал он виноват, но этот файл оказался моим, т.е. моя прога его установила. Как быть, помогите, прогу перелопачивать и корректировать очень муторно будет, нельзя ли как-то флаг в компиляторе где поставить чтобы True всегда было True, а не аналог на их языке. Причем подчеркиваю, это на очень редких компах такое, я при тестировании на куче машин такого трабла не видел.

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

Сообщение Хакер » 03.04.2007 (Вт) 13:00

Бред какой то :? . У тебя что в проге сравнения, вида CStr(BoolVar)="True" ? Если так, то лучше бы такая прога и не работала...

А вообще True хранится в msvbvm60 - сам менял на "Истина" когда-то.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 13:07

У меня прога работает в связке с Access и он отказывается например при апдейте строки принимать это Vrai, если сделать True, то нормально обновляется. Насчет CStr(True) это я как пример привел чтобы дать понять в чем кроется трабла, Т.е. булево значение выдается не на английском языке.

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

Сообщение Andrey Fedorov » 03.04.2007 (Вт) 13:21

Вообще-то True это лишь представление числа -1. И как оно пишется - совершенно безразлично. Так что единственный вариант неправильной работы - это ты где-то хранишь его в виде строки ("True" или "False") и потом сравниваешь... Не в реестре, случаем? Храни там число.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 13:33

Ну вот например (DAO):

strSQL = "UPDATE XTable SET IsSold = " & boolValue & " WHERE ID = 1"
где boolValue - булева переменная, а IsSold логическое поле в Access.

И получаем:
strSQL = "UPDATE XTable SET IsSold = Vrai WHERE ID = 1"
Вместо
strSQL = "UPDATE XTable SET IsSold = True WHERE ID = 1"

Далее при Call dbM.Execute(strSQL ) Access корчит рожу.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.04.2007 (Вт) 13:50

Пиши
strSQL = "UPDATE XTable SET IsSold = " & Iif(boolValue, "True", "False") & " WHERE ID = 1"
или
strSQL = "UPDATE XTable SET IsSold = " & Abs(Val(boolValue)) & " WHERE ID = 1"
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.04.2007 (Вт) 14:11

IIf(BoolValue,"1","0")
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.04.2007 (Вт) 14:12

Pantalone писал(а):strSQL = "UPDATE XTable SET IsSold = " & boolValue & " WHERE ID = 1"

Используй параметрические запросы и будет тебе щастье.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Хакер » 03.04.2007 (Вт) 14:14

alibek


"За кнопки Правка не-юзанье
не получает модератор наказанье
и дажа ...
"

:wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 14:26

Вы предлагаете лопатить весь код чтоли? Как это сделать и на что подменить это даже ежику понятно, вариантов масса я и сам могу вам понаписать, я спросил нельзя ли как-то сделать чтобы True было True, настройка компилятора например или еще чего такое.

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

Сообщение Andrey Fedorov » 03.04.2007 (Вт) 14:27

alibek писал(а):IIf(BoolValue,"1","0")


Или совсем просто:

Код: Выделить всё
-BoolValue


:lol:

В итоге при

Код: Выделить всё
strSQL = "UPDATE XTable SET IsSold = " & -BoolValue & " WHERE ID = 1"


Получаем:

Код: Выделить всё
UPDATE XTable SET IsSold = 1 WHERE ID = 1


Что будет работать всегда правильно.
Последний раз редактировалось Andrey Fedorov 03.04.2007 (Вт) 14:43, всего редактировалось 1 раз.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 03.04.2007 (Вт) 14:32

[url=http://support.microsoft.com/kb/216379]FIX: Visual Basic 6.0 Booleans are Coerced to Localized Strings
[/url]

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.04.2007 (Вт) 15:04

Pantalone писал(а):я спросил нельзя ли как-то сделать чтобы True было True, настройка компилятора например или еще чего такое.

Тогда надо патчи ставить. Service Pack 6.
Lasciate ogni speranza, voi ch'entrate.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 15:15

Патч стоит. Gloom, почитаю, спасибо.

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

Сообщение Andrey Fedorov » 03.04.2007 (Вт) 15:16

alibek писал(а):Тогда надо патчи ставить. Service Pack 6.


IMHO, хоть и не сталкивался с таким, но это не зависит от патчей.

Просто не надо в программе использовать строчное представление булевой переменной. Только число.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение tyomitch » 03.04.2007 (Вт) 17:04

На крайний случай остаётся запасной вариант: SetThreadLocale(&H409)
Изображение

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 17:10

Нет это не работает, попробовал на своем компе чтобы True выходило по другому, не получается. Значит SetThreadLocale тут не работает.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 18:06

Вот нашел кое что:

CStr() behaves differently on international VB versions, preventing VB class generation on German OS.

Because the strings True and False are localized in German, CStr(True) results in Wahr and CStr(False) results in Falsch, causing problems with the code. (The code assumes that these strings are not localized.)

Workarounds: One alternative is to change the Regional Settings to English. The other alternative is to rename the vb6de.dll file in the windows/system32 folder. The vb6de.dll contains the localized string resources for the German Visual Basic run-time. By changing the name of the dll, the default English strings will be used and the code will function correctly.


Не понял только что это за vb6de.dll и как его переимновать, причем найти его не могу.
Подозреваю что у юзера на компе стоит французский бэйсик и у него есть файл vb6fr.dll, который и косячит мне все. Но как ни странно я у себя ни vb6ru.dll ни vb6en.dll не нашел.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 18:58

Разобрался, все дело в vb6fr.dll, если этот файл есть в системе, то никакого True вы не получите.

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

Сообщение tyomitch » 03.04.2007 (Вт) 19:01

Pantalone писал(а):Нет это не работает, попробовал на своем компе чтобы True выходило по другому, не получается. Значит SetThreadLocale тут не работает.

Когда пишут "One alternative is to change the Regional Settings to English.", то предлагают изменить именно эту локаль.
То, что у тебя от неё строки не зависят, ещё ни о чём не говорит.
Изображение

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 19:22

Точно это оно, файл vb6fr.dll: Visual Basic Environment International Resources.
Вот как бы теперь отключить его влияние на конкретную программу, может кто сообразит быстрее меня?

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

Сообщение tyomitch » 03.04.2007 (Вт) 19:41

Так а что, вызвать SetThreadLocale религия не позволяет?
Ну и ладно.
Изображение

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 19:44

Не срабатывает твой SetThreadLocale, несколько раз проверял.

Код: Выделить всё
Private Declare Function SetThreadLocale Lib "kernel32" (ByVal Locale As Long) As Long

Private Sub Form_Load()

SetThreadLocale (&H409)

MsgBox CStr(True)

End Sub


Может чего не так написал?

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

Сообщение tyomitch » 03.04.2007 (Вт) 20:32

И что, хочешь сказать, выдаёт "Vrai"?
Изображение

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 21:16

Да, можешь сам попробовать, прилагаю этот vb6fr.dll, его нужно поместить в system32. И в региональных настройках поставь французский язык. Проверять только в скомпилированом виде.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.04.2007 (Вт) 21:36

Нда. Если твоей программой пользуется большое количество народа, значит у нее должен быть сайт, откуда ее можно скачать. Не проще ли легким взмахом руки исправить глюк одним из предложенных в самом начале способом, а не изобретать ректальные пути обхода? Тому же бельгийцу проще скачать и установить новую версию, чем ковыряться во всяких длл.
Лучший способ понять что-то самому — объяснить это другому.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 03.04.2007 (Вт) 22:52

Antonariy
Ты не понял ничего.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 04.04.2007 (Ср) 13:04

Вот блин! Еще и выборки рекордсетов с условием на этом и других логических полях тоже улетели нафиг...

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

Сообщение Andrey Fedorov » 04.04.2007 (Ср) 13:31

Pantalone писал(а):Вот блин! Еще и выборки рекордсетов с условием на этом и других логических полях тоже улетели нафиг...


Кто же виноват что ты так пишешь. Причина та же.
Пиши правильно и будет счастье...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 04.04.2007 (Ср) 13:37

Я пишу правильно.
"Select * From XTable Where XBoolean = " & True
Работает в связке VB + Access всегда и везде.
Это просто очередной баг VB, которых при написании проги я выявил просто немерянно. Этож надо додуматься переводить значение True к установленной локали. Все функции и прочее на инглише как было так и осталось, а тут нате, сидите на французской локали да еще с установленным файлом vb6fr.dll, так вот вам Vrai, распишитесь и делайте че хотите.

След.

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

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

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

    TopList  
cron