Принцип Неопределенности -Excel, VBA и Locals

Программирование на Visual Basic for Applications
Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 156
Зарегистрирован: 16.09.2010 (Чт) 4:33

Принцип Неопределенности -Excel, VBA и Locals

Сообщение Sam777e » 31.10.2013 (Чт) 18:08

VB отдельно у меня сейчас нет и по нескольким причинам пользуюсь VBA.

Обнаружил странную ситуацию; удивляюсь, что впервые за 20 лет.

Есть Sub - Клиент и объект класса [ сейчас это специальный проект для демонстрации всем ].

Поставьте останов, как показано на картинке. Откройте окно Locals и нажмите, пожалуйста, [ , скажем 4 раза, ] [F5].

TestVBA-1.png
TestVBA-1.png (62.3 Кб) Просмотров: 1394


А теперь в окне Locals раскройте объект oTestVBA. Почему отличаются значения mForProperty и mForProperty ?

TestVBA-2.png
TestVBA-2.png (9.12 Кб) Просмотров: 1394


А если несколько раз раскрывать-закрывать объект oTestVBA, то можно увидеть и такое.

TestVBA-3.png
TestVBA-3.png (9.32 Кб) Просмотров: 1394


Встретилось мне все это при программировании/отладке программы, где мне нужна была Очередь. Реализовал через массив и пошли непонятные ошибки с индексами . . .

Такое впечатление, что при раскрытии объекта в окне Locals система пытается [ вроде ведь совершенно необходимо ] получить значения всех переменных - и, по непонятной причине, считает Property Get xxxName как переменную; происходит вызов Property Get и пошло-поехало. Естественно, после такого "пристального взгляда" системы на программу импульс и / или положение меняются и программа работает неверно.

Кстати, картинки и код класса немного устарели - я добавил еще Private Property Get - с ней та же история.
И еще - проверял на Excel 2003, 2007 ( Windows XP ), 2010 ( Windows 7 / 64 / Pack 1 ) - одинаково плохо.
Строка Watch показывает все верно - но только до тех пор, пока не скажешь, что хочешь ее Edit; и вот, ничего там не меняешь, но в зависимости от способа закрытия окошка редактирования : крестиком - ничего не меняется, а вот "правильное" [ OK ] сразу покажет значение из Locals.

Хорошо помню, как в переводной книге по VB6 [ она также входит в поставку Visual Studio 6 - но на английском ] написано : " ...не бойтесь использовать вместо переменных Property - все равно за кулисами переменная реализуется парой оных ...". Но хотелось бы - без таких последствий.

А может это все уже давно известно грамотным людям ? Тогда извините.

Код: Выделить всё
'   Attribute VB_Name = "modTestVBA"

Option Explicit


Sub TestVBA()
  Dim oTestVBA As cTestVBA, j As Long
 
  Set oTestVBA = New cTestVBA
    For j = 1 To 4
      oTestVBA.AddM
    Next j
  Set oTestVBA = Nothing
End Sub

'----------------------------------------------------------------------------------------

' VERSION 1.0 CLASS
' BEGIN
'  MultiUse = -1  'True
' END
' Attribute VB_Name = "cTestVBA"
' Attribute VB_GlobalNameSpace = False
' Attribute VB_Creatable = False
' Attribute VB_PredeclaredId = False
' Attribute VB_Exposed = False

Option Explicit

Private mForFunction As Long, mForProperty As Long

Public Function anyFunctionFrom() As Long
  anyFunctionFrom = mForFunction
   mForFunction = mForFunction - 1
End Function

Public Property Get anyPropertyFrom() As Long
  anyPropertyFrom = mForProperty
  mForProperty = mForProperty - 1
End Property

Public Sub AddM()
  mForProperty = mForProperty + 1
  mForFunction = mForFunction + 1
End Sub

Private Sub Class_Initialize()
  mForProperty = 7
  mForFunction = 7
End Sub
Вложения
TestVBA.zip
(88.52 Кб) Скачиваний: 92
Здоровья и удачи

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Re: Принцип Неопределенности -Excel, VBA и Locals

Сообщение Vi » 01.11.2013 (Пт) 8:57

Property Get не должно менять состояние объекта - на этом и вертится отображение свойств объекта в разного рода браузерах объектов. Это настолько фундаментальное свойство, что об этом, наверное, уже не пишут. Ведь чтение обычной переменной не меняет объект, так и чтение(вызов) свойства не должно менять его. Всё просто.

Ах, да, переменных в СОМе нет: Public переменная выглядит вовне как единство двух свойств - Property Get и Property Set или Let.
Код: Выделить всё
Public xProperty As Long

эквивалентно
Код: Выделить всё
Public Property Get xProperty() As Long
...
End Property
Public Property Let xProperty(ByVal val As Long)
...
End Property

созданным Бэйсиком за сценой. И, наоборот, наличие хотя бы одного Property вводит в пространство новое имя - его можно считать именем переменной.
PS
В браузерах объектов также не вызываются свойства, имеющие параметры, или имеющие специальные запрещающие атрибуты. Не вызываются ВСЕ функции(методы), т.к. функции могут иметь или должны иметь побочное действие в виде изменения состояния объекта.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


Вернуться в VBA

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

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

    TopList