Существует ли в VBA корректная работа с элементами интерфейса?

  • Автор темы Автор темы _MBK_
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

_MBK_

Пикирующий бомбардировщик
Топикстартер
15 лет на форуме
Сообщения
33 765
Реакции
11 041
Бывают ситуации, когда хочется, чтобы макрос сам создавал себе пункт меню, кнопку для вызова и т.д., без ручного лазания по менюшкам. И тут сразу сталкиваемся с проблемой, что свойства CommandBars и MainMenu до сих пор, фактически, недокументированы: поиск по хелпу дает только то, что они существуют, но никакого внятного описания нет:
Application.CommandBars
Property CommandBars As CommandBars

Description
Member of Application

The CommandBars property returns a collection of all command bars.

The CommandBars property returns a read-only value.
Посмотреть их свойства можно только через подсказки в редакторе или в Object Browser при установленном VGCore (чего лично я ни разу не встречал). Получается, что работа через них - чистой воды хакерство, а раз хакерство, то и поддержка соответствующая. Начать с того, что добавить можно только "Пользовательскую кнопку" через CommandBars().Controls.AddCustomButton . Есть еще метод Add, но, на мой взгляд, он, практически, бесполезен. То есть, ни нормальный пункт меню, ни подменю, ни что иное создать непонятно как - только надпись с иконочкой, положение которой к тому же нельзя регулировать. Причем, даже такую штуку можно создать только в верхнем основном меню или на некоторых панелях. Судя по всему, удалить или переместить ее тоже программно нельзя, поменять действие на ней или,хотя бы посмотреть его - тоже нельзя! Такие свойства в объекте Control просто отсутствуют. Можно, разве что, поменять заголовок и подсказку, но смысла в этом нет никакого - ведь при перезапуске корела изменения теряются! Зато, для какой-то уму не постижимой цели, создатели VBA специальным параметром сделали в AddCustomButton возможность создавать "временную" кнопку, которая пропадает при переоткрытии панели.
И в довершение ко всему - в VBA напрочь отсутствует возможность прямого доступа к уже существующей кнопке. То есть, чтобы найти интересующий пункт меню, даже если знаешь его ID, нужно обязательно перебирать все Controls, пока нужный не найдешь. Причем, данная операция тоже не является корректной! Я пару раз встречал ситуацию, когда Controls.Count возвращал "левое" количество элементов, а, как известно, обращение к несуществующему элементу вызывает физический крах всего корела и никакие обработчики ошибок тут не спасают. Самый простой пример такого случая - когда пользовательская кнопка уже добавлена, коллекция Controls ее уже содержит, но обращение к новосозданному элементу рушит всю систему.
Надо сказать, что я не первый поднимаю подобные вопросы, к примеру:
http://forum.oberonplace.com/archive/index.php?t-209.html
Или, даже у нас: http://forum.rudtp.ru/showthread.php?t=24756
Но вышеперечисленные проблемы, насколько я понимаю, советуют решать, разве что, правкой XML. Какие еще есть мнения по этому поводу?
 
Статус
Закрыто для дальнейших ответов.