Текущее время: 21 окт 2017, 05:20


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

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

Сообщение HAMMER » 13 фев 2011, 17:34

Границы применимости: Visual Basic 6.0 до SP3 (все редакции)
Перевод: Н. Амеличев

СИМПТОМЫ
При неявном преобразовании (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 и другие функции - лучшее средство от таких трудноустранимых проблем
АКЦИЯ: Каждому флудеру/оффтопщику - день бана в подарок! Приведи с собой друга и отгреби за двоих!

VIP группа на форуме BestCoding.info

FAQ по SEO (постепенно пополняется)
Мой любимый форум phpBB

HAMMER

Автор темы
Аватара пользователя
Администратор
 
Сообщения: [ 930 ]
Зарегистрирован: 20 янв 2011, 13:54
Откуда: Зеленоград
Благодарил (а): 9 раз.
Поблагодарили: 85 раз.

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

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

Зарегистрированные пользователи: Yandex [Bot]

cron