Контекстное меню не сбрасывается, не добавляется и не удаляется должным образом - PullRequest
0 голосов
/ 31 марта 2020

Проще говоря, игра с контекстными меню MS Word через VBA приводит к грязным результатам. Я не уверен, что я делаю неправильно, так как это должно быть просто.

Вот ситуация:

Я создал макрос, который добавит опции для щелчка правой кнопкой мыши, чтобы проверить Google и некоторые другие. другие сайты, такие как Wikipedia и Thesaurus.com, но иногда команда будет добавлена ​​более одного раза, а иногда и вовсе, и меню никогда не будет сброшено. Код с Google ниже (но тот же код для добавления каждого сайта):

Dim DoesGoogleOptionExist As CommandBarControl
Dim ContextControl As CommandBarControl

Application.CommandBars("Text").Reset
Set DoesGoogleOptionExist = Application.CommandBars(CommandBar(CommandBarCounter)).FindControl(Tag:="Google")
If (DoesGoogleOptionExist Is Nothing) Then
    Set ContextControl = Application.CommandBars(CommandBar(CommandBarCounter)).Controls.Add(Type:=msoControlButton, Temporary:=True, Before:=1)
    With ContextControl
        .Caption = "Check &Google.com"
        .OnAction = "OpenGoogle"
        .Tag = "Google"
        .FaceId = 86
    End With

Странная вещь здесь: хотя я проверяю, есть ли опция, когда я запускаю макрос, иногда это будет все равно создан заново. Иногда это даже не будет создано один раз. Поэтому я хотел начать все это с нуля. Я сбрасываю меню в начале макроса. Команда сброса не будет сбрасывать меню: опции все еще существуют!

Итак, я сделал быстрый тест: перезагрузите меню и закомментируйте оставшуюся часть кода, чтобы ничего не добавлялось. Так что ничто не должно появиться. Но когда я щелкаю правой кнопкой мыши, все еще там. Я перечисляю опции в VBA, и, конечно же, они все еще в списке:

Dim CommandBarCounter As Integer
For CommandBarCounter = 1 To Application.CommandBars("Text").Controls.Count
    Debug.Print Application.CommandBars("Grammar").Controls(CommandBarCounter).Caption
Next CommandBarCounter
Application.CommandBars("Text").Reset

Как Reset не выполняет свою единственную работу должным образом? Почему иногда некоторые параметры дублируются, а иногда они полностью отсутствуют? Я хотел бы (1) сбросить меню, затем (2) добавить каждую опцию только один раз.

Спасибо всем.

Важное редактирование: Новые подробности. Я понял, что работаю в двух разных шаблонах, поэтому иногда пункт меню добавляется к тому или иному шаблону. Не уверен, как это произошло, но сейчас я неявно собираюсь указать, какой шаблон. Я оставлю этот вопрос открытым и без ответа, потому что проблема не совсем решена, поэтому не стесняйтесь добавлять комментарии или решения. Но это само по себе может быть решением, почему вещи не сбрасываются, дублируются или отсутствуют.

Теперь есть новая проблема: в то время как опции добавляются в большинство меню (грамматика, орфография и т. Д. * 1032) *.) не все добавляются в текстовое меню. Это добавляет на два меньше, чем число, которое я добавляю. Так что если я добавлю 4, это действительно добавит 2. Если я добавлю 3, это добавит 1: всегда первый, затем последний (если их больше 3).

Итак, если я добавлю опции к go в словарь, тезаурус, википедию и Google, он добавит словарь и Google (но не средние два). Если я добавлю опции в словарь, тезаурус и википедию, он добавит словарь (но не последние два). Я могу изменить порядок добавленных пунктов меню, но он всегда будет добавлять первый, затем последний, а не средние.

Только текстовое меню. Все остальные меню работают должным образом.

Я проверил это (т.е. убедился, что они были добавлены, но просто невидимы) в VBA.

Объяснений пока нет. Кто-нибудь сталкивался с этим раньше?

1 Ответ

2 голосов
/ 02 апреля 2020

Фон

Функциональность Office CommandBars больше не является официальным способом настройки меню. Начиная с Office 2010, когда пользовательский интерфейс Fluent (RibbonX) был расширен за счет включения контекстных меню, этот подход устарел.

Объектные модели по-прежнему работают, если только по какой-либо другой причине, кроме обратной совместимости, и нет опубликовано ограничение на время, когда вещи могут перестать работать. Учитывая тот факт, что WordBasi c по-прежнему работает там, где базовая технология не изменилась, я не ожидаю, что функциональность будет вытеснена, но нет никакой гарантии, что усилия, приложенные для разработки решения с устаревшей технологией, окупятся с точки зрения долговечности ...

Тем не менее, описанная проблема хорошо известна с десятилетия версии 97 до 2007, хотя я не нашел дубликат, описывающий проблему здесь, в Переполнении стека. Проблема в том, что Word Контекст настройки .

Контекст настройки

Word может хранить такие вещи, как сочетания клавиш и настройки CommandBar в различные места (файлы). По умолчанию это часто будет шаблон Normal.dotm. Однако это может быть также прикрепленный шаблон (если это не Normal.dotm) активного документа, документа, содержащего макрос, или активного документа. Более того, Word может выбрать добавление в один контекст настройки и удаление из другого, что приведет к дублированию, невозможности удаления и т. Д.

Единственный способ контролировать это - указать контекст настройки в коде. прежде чем процедура будет работать с любыми CommandBar или Keybindings объектами.

CustomizationContext является свойством объекта Application, поэтому некоторые примеры:

save changes to menus in the document which is active when the macro runs
Application.CustomizationContext = ActiveDocument  

'save changes to menus in the template attached to the active document             
Application.CustomizationContext = ActiveDocument.AttachedTemplate

'save changes to the Normal.dotm template, meaning they will be available
'in all open documents, UNLESS menus in an active document override
Application.CustomizationContext = NormalTemplate

Как отмечено в комментарии к последней строке примера кода меню / привязки клавиш могут быть переопределены тем, что указано в других «контекстах». Эмпирическое правило гласит, что более общее будет переопределено более конкретным c. Таким образом, настройки в документе переопределяют параметры вложенного шаблона. В свою очередь, те, что в прикрепленном шаблоне, переопределят Normal.dotm или другой шаблон, загруженный как надстройка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...