1.
Andrey Fedorov
Интересный глюк - столкнулся впервые - оказывается переменная типа Boolean может иметь значение True = 1:
Переменная типа Boolead может иметь все те же значения, что и переменная типа Byte (убедиться в этом можно хотя бы с помощью PutMem1). Это в техническом плане.
Чтобы не было хаоса, VB компилирует код так, что все присвоения вида
[As Boolean] = [НЕ As Boolean]
проходят через абсолютизацию, т.е. правый операнд превращается либо в 0, либо в 255UB (т.е. -1 Singed Byte (True)).
Так, VB считает, что в Boolean-переменной гарантировано содержится либо 0, либо -1. Потому как другое значение туда попасть не может (вспомните о проверке и абсолютизации).
Поэтому, при присвоении вида
[As Boolean] = [As Boolean] происходит простое копирование значения, без проведения каких либо проверок. Это из соображений здравого смысла и оптимизации.
В данном случае мы имеем, что одна из сторон (гадкий тулбар) нарушает соглашение о чистоте Boolean-переменных, и в локальную Boolean-переменную просачивается гадость.
В общем выходит что ButtonMenu.Visible возвращает значение True = 1 типа Boolean, которое умудряется успешно пройти через CBool и присвоиться переменной типа Boolean...
По поводу успешности прохода через CBool.
CBool это не функция, а синтаксическая структура, подобная (BOOL) в сях. Компилятор VB (опять же, из соображений здравого смысла) убирает все конструкции вида:
[As Boolean] = CBool([As Boolean]) заменяя их на простое присвоение.
kiberneticsя где-то читал про это.
особенность бейсика
Фигню пишут. Это не особенность бейсика, это _обычность_ всех языков программирования, которые не делают ежесекундной проверки валидности переменных.
2.
Andrey FedorovПеременная Boolean по определению может иметь лишь 2-а значения True (-1) и False (0). Однако ButtonMenu.Visible возвращет еще одно значение типа Boolean - True (1). Причем это значение спокойно присваивается и обычной переменой Boolean...
См. выше по поводу спокнойности присвоения.
13GHOSTНет.
False это 0 (00000000), а True это Not False, т.е. -1 (11111111).
3.
Andrey FedorovДа, но Boolean переменная по определению должна хранить лишь два значения True(-1) и False(0), как и функция CBool() должна приводить именно к этим значениям. Иначе становятся невозможны булевы операции. Из-за чего я и наткнулся на данный баг:
CBool - это не функция, поэтому она ничего не должна приводить. Как и CInt и CStr. А вот Int и Str, обратно, - функции.