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

Полезные статьи и переводы интересных статей
hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

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

Сообщение hCORe » 29.12.2004 (Ср) 18:14

Статья 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)
Моду создают модоки, а распространяют модозвоны.

Вернуться в VBStreets Knowledge Base

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList