Страница 1 из 1

Q216379 Преобразование величин булевского типа

СообщениеДобавлено: 29.12.2004 (Ср) 18:14
hCORe
Статья Q216379
Границы применимости: 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 и другие функции - лучшее средство от таких трудноустранимых проблем 8)