Границы применимости: Visual Basic 6.0 до SP3 (все редакции)
Перевод: Н. Амеличев aka hCORe
СИМПТОМЫ
При неявном преобразовании (coercion) констант или переменных типа Boolean в строку, Visual Basic 6.0 преобразует булевское значение в строку национального формата. Например, при русских региональных установках, это будет строка "Истина" для значения True. Проблема в том, что такую строку нельзя преобразовать обратно в значение типа Boolean, даже при использовании функции CBool - это вызовет ошибку Type Mismatch (несоответствие типов.)
РЕШЕНИЕ
Простейшим решением является применение функции CStr или Str$ к булевской константе или переменной непосредственно перед преобразованием. Например, в этом коде булевская переменная прямо преобразовывается к строку "True", и обратное преобразование проблем не вызывает:
- Код: Выделить всё
sTemp = "-" & CStr(True) ' CStr заставляет VB выводить "True".
Debug.Print sTemp
sTemp = Right(sTemp, 4)
Debug.Print sTemp
bTemp = CBool(sTemp) ' Никаких ошибок.
СОСТОЯНИЕ
Microsoft подтвердила наличие этой ошибки в программных продуктах, перечисленных выше (см. Границы применимости.)
Она была исправлена в Visual Studio 6.0 Service Pack 3. Информация о сервис-паках:
194022 INFO: Visual Studio 6.0 Service Packs, What, Where, Why
194295 HOWTO: Tell That Visual Studio 6.0 Service Packs Are Installed
ПОДРОБНОСТИ
Visual Basic 6.0 неявно преобразует булевские переменные и константы в строки национального формата. Visual Basic 6.0 не может преобразовать такие строки обратно в значения типа Boolean.
Повторение поведения
1. Установите любые национальные настройки, отличные от английских.
2. Создайте проект типа Standard EXE. Форма Form1 будет создана по умолчанию.
5. Вставьте этот код в секцию General Declarations формы Form1:
- Код: Выделить всё
Private Sub Form_Load()
sTemp = "-" & True ' Неявное преобразование
Debug.Print sTemp
sTemp = Right(sTemp, 4)
Debug.Print sTemp
bTemp = CBool(sTemp) ' Ошибка!
End Sub
6. При отладке можно заметить, что переменной sTemp присваивается значение, которое Visual Basic 6.0 не может корректно обработать. Это и является причиной ошибки.
P.S. Очень распространённый глюк. Никогда не думал, почему Debug.Print "-" & True возвращало значение "-Истина" - просто использовал прямое преобразование.
Можно, конечно, поставить последний сервис-пак. Но вообще, CStr, CBool, CSng, CDbl и другие функции - лучшее средство от таких трудноустранимых проблем