VB: присвоение логическому свойству в Adobe Illustrator, Photoshop

При автоматизации Adobe Illustrator CS3 с помощью VBA я обнаружил, что назначение логической переменной логическому свойству всегда приводит к присвоению False:

Dim New_Path As Illustrator.PathItem
Dim v As Boolean
' ...
v = True
New_Path.Filled = v     ' ERROR: New_Path.Filled is False
v = False
New_Path.Filled = v     ' New_Path.Filled remains False

Присвоение константе отлично работает:

Dim New_Path As Illustrator.PathItem
' ...
New_Path.Filled = True  ' New_Path.Filled is True
New_Path.Filled = False ' New_Path.Filled is False

Проверено для различных логических свойств AI, таких как PathItem.Stroked, Layer.Visible и т. д.

Проверено для Photoshop.ArtLayer.Visible.

Проверено для VB6.

Итак, я считаю, что такое поведение характерно для продуктов Adobe Adobe Creative Suite.

Это баг или фича?


person Argut    schedule 15.12.2014    source источник
comment
попробуйте сначала инициализировать его: Dim New_Path As New Illustrator.PathItem. Можешь попробовать New_Path.Filled = Cbool(v)   -  person    schedule 15.12.2014
comment
Инициализация выполнена хорошо, но не показана выше — не беспокойтесь об этом!   -  person Argut    schedule 15.12.2014
comment
Cbool работает нормально. Интересно, почему это происходит, а присваивание - нет. И почему назначение работает, например, для Office. В любом случае, большое спасибо!   -  person Argut    schedule 15.12.2014
comment
тогда вы примете CBool() решение в качестве ответа?   -  person    schedule 15.12.2014
comment
Да! Я чувствую, что это должно быть обычной практикой для автоматизации...   -  person Argut    schedule 15.12.2014


Ответы (1)


Оберните переменную v функцией CBool().

person Community    schedule 15.12.2014
comment
почему (в любом случае, это логическое значение)? - person Rob; 15.12.2014
comment
@Rob Я, вероятно, мог бы написать целую новую статью, основанную на этом простом WHY вопросе ... В основном в VBA присвоение свойству LET имеет странный синтаксис под капотом. Я полагаю (может ошибаться), что здесь происходит передача переменной v по ссылке, а не по значению. Приведение его к литералам True/False гарантирует, что переменная передается по значению ( True/False ), а НЕ по ее адресу в памяти (поэтому она не рассматривается как COM-объект). - person ; 15.12.2014
comment
По сути, вы передаете v свойству LET, которое принимает тип bool, который не эквивалентен собственному Boolean VBA. Вероятно, COM-сервер маршалирует его как object, и поэтому прямое преобразование в логическое значение невозможно. Я имею в виду, что это всего лишь моя догадка - я был бы более чем счастлив, если бы кто-то смог доказать, что я ошибаюсь. - person ; 15.12.2014
comment
Так может ли просто обернуть ( ) сделать то же самое? - person Rob; 15.12.2014