1

Тема: Создание своих панели инструментов и меню

Уважаемые эксперты!
Помогите разобраться в следующем - есть код (приведен ниже). На моем компьютере добился, что он нормально работает и дома и на работе. Попробовал запускать его на других компьютерах, получал абслютно разные результаты. На одном было создано два одинаковых меню, на другом меню было одно, но панели инструментов не создалось вообще. В чем может быть проблема, может кто сможет увидеть???

Sub AutoExec()
' Создание новой панели инструментов

    Dim cbar As CommandBar
    Dim vidimost As Boolean
    For Each cbar In CommandBars
        If cbar.Name = "Моя_панель" Then GoTo startmenu:
    Next
       
    'Создание панель управления
    Set cbar = CommandBars.Add("Моя_панель", msoBarTop)
    cbar.Enabled = True
    If vidimost Then CommandBars("Моя_панель").Visible = True Else CommandBars("Моя_панель").Visible = False
    'Размещение первой кнопки на панели инструментов
    Dim But1 As CommandBarControl
    Set But1 = cbar.Controls.Add(msoControlButton)
    But1.Caption = "Первый макрос" 'надпись на кнопке
    But1.FaceId = 13 ' Номер иконки на кнопке, можно изменять на другую
    But1.OnAction = "Процедура 1"

    'Размещение второй кнопки на панели инструментов
    Dim But2 As CommandBarControl
    Set But2 = cbar.Controls.Add(msoControlButton)
    But2.Caption = "Продолжение..." ' Изменить то, что в кавычках, на нужное
    But2.FaceId = 136
    But2.OnAction = "" ' Изменить на имя процедуры, которую нужно выполнять

    'Размещение третьей кнопки на панели инструментов
    Dim But3 As CommandBarControl
    Set But3 = cbar.Controls.Add(msoControlButton)
    But3.Caption = "...следует" ' Изменить то, что в кавычках, на нужное
    But3.FaceId = 29 ' Номер иконки на кнопке, можно изменять на другую
    But3.OnAction = "" ' Изменить на имя процедуры, которую нужно выполнять
    'И так далее для ButN, где N - номер добавляемой кнопки по порядку

startmenu:
'Создание нового меню
' Проверка, есть ли такой пункт в стандартном меню
Dim cBarCont As CommandBarControl
For Each cBarCont In CommandBars(41).Controls
If cBarCont.Caption = "Мое_меню" Then ' поиск в коллекции
   cBarCont.Delete 'удаление найденного
   End If
Next

' Создание меню
Dim CBar1 As CommandBar
Set CBar1 = CommandBars(41)

CBar1.Enabled = True
CBar1.Visible = True
Dim Menu1 As CommandBarPopup
Dim SubMenu1 As CommandBarPopup
Dim SubMenu1Item1 As CommandBarButton
Dim SubMenu1Item2 As CommandBarButton
Dim SubMenu1Item3 As CommandBarButton

'Создание верхнего меню
Set Menu1 = CBar1.Controls.Add(msoControlPopup)
Menu1.Caption = "Мое_меню"

' Создание вложенного меню
Set SubMenu1 = Menu1.Controls.Add(msoControlPopup)
SubMenu1.Caption = "Макросы"

'Создание элемента во вложенном меню и назначение ему процедуры
Set SubMenu1Item1 = SubMenu1.Controls.Add(msoControlButton)
Set SubMenu1Item2 = SubMenu1.Controls.Add(msoControlButton)
Set SubMenu1Item3 = SubMenu1.Controls.Add(msoControlButton)
SubMenu1Item1.FaceId = 13
SubMenu1Item2.FaceId = 136
SubMenu1Item3.FaceId = 29
SubMenu1Item1.Caption = "Первый макрос"
SubMenu1Item2.Caption = "Продолжение..."
SubMenu1Item3.Caption = "...следует"
SubMenu1Item1.OnAction = "Процедура 1"
SubMenu1Item2.OnAction = "" ' имя будущей процедуры
SubMenu1Item3.OnAction = "" ' имя будущей процедуры
End Sub

Данный код размещаю в файле, который лежит в папке автозагрузки для ворда и подключен как надстройка.

Уже голову сломал, не могу понять, что тут не так???

2

Re: Создание своих панели инструментов и меню

У меня работает, но есть замечания.
Самое главное: если ты создаёшь меню и панели на уровне приложения, то их обязательно нужно удалять при закрытии твоего документа или при выгрузке шаблона. Тем самым ты будешь уверен, что не намусорил. При открытии документа рекомендуется использовать процедуру Document_Open, а при закрытии Document_Close. Эти процедуры нужно помещать в модуль ThisDocument. Если же процедура должна выполняться при загрузке или выгрузке глобального шаблона, то используй AutoExec и AutoExit.
Собственно, в этом и проблема. Логика создания панели и меню мне не понятна. Ты проверяешь наличие панели инструментов с заданным именем и, если она существует, создаёшь меню. Почему? Мне кажется, что если панель существует, то её нужно удалить и пересоздать. Хотя правильно делать так, как я написал выше. То же самое с меню. Если в меню твой пункт существует, то его нужно удалить и пересоздать. Здесь собака порылась. Запиши процедуры создания/удаления меню и панели инструментов как две отдельных процедуры и вызывай их.
Ну и ещё немного. Вот эта строка:

If vidimost Then CommandBars("Моя_панель").Visible = True Else CommandBars("Моя_панель").Visible = False

Мало того, что переменной vidimost не присваивается значение перед использованием, а значит она False, так ещё и прописан оператор If…Then…Else, который можно заменить таким простым и понятным выражением:

CommandBars("Моя_панель").Visible = vidimost

из которого сразу видно, что определяет эта переменная.

Лучше день потерять — потом за пять минут долететь!

3

Re: Создание своих панели инструментов и меню

Каждая панель инструментов создается, хранится и удаляется в конкретном документе.
Представленная команда указывает, что будем работать с шаблоном «Normal.dot»:

CustomizationContext = NormalTemplate

Если хотите хранить панель в Вашей надстройке:

CustomizationContext = ThisDocument

Попробуйте добавить одну из команд в начало Вашего макроса.

Учтите, что одноименных панелей инструментов может быть сколько угодно!

Отредактировано Вождь (17.03.2010 08:57:16)

Макросы под заказ и готовый пакет - mtdmacro.ru

4

Re: Создание своих панели инструментов и меню

Исходя из всего вышесказанного вот что у меня получилось:

Option Explicit
Public cbar As CommandBar
Public Vidimost As Boolean
Public cBarCont As CommandBarControl
Sub AutoExec()
        
    'запуск прецедуры поиска и удаления существующей панели
    'в данном документе и в normal.dot
    FindAndDeleteCommandBar
    FindAndDeleteCommandBarInNormal
    
    'создание новой панели инструментов
    CreateNewCommandBar
    
    'поиск и удаление заданного меню в панели меню
    '(номер панели в коллекции CommandBars - 41)
    ' в данном документе и в шаблоне
    FindAndDeleteCommandBarControlInNormal
    'создание нового элемента в панели меню
    '(номер панели в коллекции CommandBars - 41)
    CreateNewCommandBarControl
End Sub
Sub AutoExit()
'Удаление созданной панели инструментов и элемента меню
'при отключении надстройки
On Error Resume Next
FindAndDeleteCommandBar
FindAndDeleteCommandBarInNormal
FindAndDeleteCommandBarControlInNormal
End Sub
Sub FindAndDeleteCommandBar()
    CustomizationContext = ThisDocument
    For Each cbar In CommandBars
        If cbar.Name = "Нормоконтроль" Then 'Нахождение панели с таким именем
            'Запоминаем состояние видимости панели
            '(если их несколько - состояние последней из перебора)
            Vidimost = CommandBars("Нормоконтроль").Visible
            CommandBars("Нормоконтроль").Delete
            ' Удаление панели с таким именем
        End If
    Next
End Sub

Sub CreateNewCommandBar()
    CustomizationContext = ThisDocument
    'Создание панели управления
    Set cbar = CommandBars.Add("Нормоконтроль", msoBarTop)
    cbar.Enabled = True
    cbar.Visible = Vidimost
    'Размещение первой кнопки на панели инструментов
    Dim But1 As CommandBarControl
    Set But1 = cbar.Controls.Add(msoControlButton)
    But1.Caption = "Первый макрос" 'надпись на кнопке
    But1.FaceId = 13 ' Номер иконки на кнопке, можно изменять на другую
    But1.OnAction = "Процедура 1"

    'Размещение второй кнопки на панели инструментов
    Dim But2 As CommandBarControl
    Set But2 = cbar.Controls.Add(msoControlButton)
    But2.Caption = "Продолжение..." ' Изменить то, что в кавычках, на нужное
    But2.FaceId = 136
    But2.OnAction = "" ' Изменить на имя процедуры, которую нужно выполнять

    'Размещение третьей кнопки на панели инструментов
    Dim But3 As CommandBarControl
    Set But3 = cbar.Controls.Add(msoControlButton)
    But3.Caption = "...следует" ' Изменить то, что в кавычках, на нужное
    But3.FaceId = 29 ' Номер иконки на кнопке, можно изменять на другую
    But3.OnAction = "" ' Изменить на имя процедуры, которую нужно выполнять
    'И так далее для ButN, где N - номер добавляемой кнопки по порядку
End Sub



Sub CreateNewCommandBarControl()
    CustomizationContext = NormalTemplate
    ' Создание меню
    Dim CBar1 As CommandBar
    Set CBar1 = CommandBars(41)
        CBar1.Enabled = True
        CBar1.Visible = True
    Dim Menu1 As CommandBarPopup
    Dim SubMenu1 As CommandBarPopup
    Dim SubMenu1Item1 As CommandBarButton
    Dim SubMenu1Item2 As CommandBarButton
    Dim SubMenu1Item3 As CommandBarButton
    'Создание верхнего меню
    Set Menu1 = CBar1.Controls.Add(msoControlPopup)
        Menu1.Caption = "Нормоконтроль"
    ' Создание вложенного меню
    Set SubMenu1 = Menu1.Controls.Add(msoControlPopup)
        SubMenu1.Caption = "Макросы"
    'Создание элементов во вложенном меню и назначение им процедуры
    Set SubMenu1Item1 = SubMenu1.Controls.Add(msoControlButton)
    Set SubMenu1Item2 = SubMenu1.Controls.Add(msoControlButton)
    Set SubMenu1Item3 = SubMenu1.Controls.Add(msoControlButton)
        SubMenu1Item1.FaceId = 13
        SubMenu1Item2.FaceId = 136
        SubMenu1Item3.FaceId = 29
        SubMenu1Item1.Caption = "Первый макрос"
        SubMenu1Item2.Caption = "Продолжение..."
        SubMenu1Item3.Caption = "...следует"
        SubMenu1Item1.OnAction = "Процедура 1"
        SubMenu1Item2.OnAction = "" ' имя будущей процедуры
        SubMenu1Item3.OnAction = "" ' имя будущей процедуры
End Sub

Sub FindAndDeleteCommandBarInNormal()
    CustomizationContext = NormalTemplate
    For Each cbar In CommandBars
        If cbar.Name = "Нормоконтроль" Then 'Нахождение панели с таким именем
            'Запоминаем состояние видимости панели
            '(если их несколько - состояние последней из перебора)
            Vidimost = CommandBars("Нормоконтроль").Visible
            CommandBars("Нормоконтроль").Delete
            ' Удаление панели с таким именем
        End If
    Next
End Sub

Sub FindAndDeleteCommandBarControlInNormal()
    CustomizationContext = NormalTemplate
    For Each cBarCont In CommandBars(41).Controls
        If cBarCont.Caption = "Нормоконтроль" Then ' поиск в коллекции
            cBarCont.Delete 'удаление найденного
        End If
    Next
End Sub

Все работает, но с некоторыми ньюансами, которые мне не очень нравятся:
1) Новая панель создается только в левом углу. Если пользователь переместил ее в какое-то другое место, при перезапуске она снова окажется в том же углу. Можно ли у существующей панели перед ее удалением так же как и видимость, запомнить параметры ее положения (плавающего или в лубом месте панелей инструментов)? Такая гибкость нужна конечному пользователю.
2) Меню создается только, если выставлено CustomizationContext = NormalTemplate (Наверное, оно и понятно, так как мы добавляем элемент в стандартное меню с индексом 41, находяещееся в normal.dot). При открытии собственно шаблона надстройки меню, естественно, не создается..
3) Что самое доставаемое, так это то, что при каждом закрытии Ворда, идет запрос на сохранения файла надстройки.
Это файл надстройки прилагаю паралельно с тектом тут.
Опять же жду советов, можно точечных, как у Вождя, но раскрывающих суть вопроса. Заранее спасибо.

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

Post's attachments

commandbar.dot 76 Кб, 5 скачиваний с 2010-03-17 

You don't have the permssions to download the attachments of this post.

5

Re: Создание своих панели инструментов и меню

Итак, о граблях:
Разбираясь с панелями инструментов, нашел сайт "Этюды для программистов Microsoft Word"
Скачал следующий файл с готовым решением:
внешняя ссылка
Запустил у себя на компе макрос, выдающий полный список коллекции commandBars.
Увидел ужасающую картину - более 50 панелей с одинаковым названием "bmPopup". Попробовал сделать эти панели видимыми из макроса, на что получил ошибку выполнения. Имя панели макросом находится нормально. Так же в макросе написал удаление данных панелей. Вроде они исчезли. Но после перезапуска появились вновь. Как мне удалить эти панели из моего normal? Пересоздавать его не хочется, достаточно много в нем всего (ну а если пересоздавать, то нужно всю информацию из него вытащить в другой, который будет создаваться).
Да, сначала подумал, что эти панели остались от неправильного сноса этой надстойки. Подключил ее снова, проверил на состав панелей. А в этом файле их вообще оказалось более сотни, видимо все остались от отладки макроса. А уменя они создавались при каждом нажатии на кнопку панели для работы с закладками. Попробовал на чистый шаблон, действительно, добавлются невидимые, одноименные панели, причем неубиваемые. или я не знаю, как их убить. Данный опыт может повторить любой в той последовательности, что я описал.. Ну а как все же избавиться от этих лишних панелей? может можно написать макрос, который удаляет все невстроенные, а созданные пользователем панели???

макрос скачивал вот отсюда: http://wordexpert.ru/wp-content/uploads … tes/bm.zip

Добавлено - исходя из сказанного вопрос - нельзя ли как-то переделать процедуры по удалению панелей (приведенные в предыдущем сообщении) в функции, у которых на входе будет имя панели? И подавать в нее эти неудаляемые панели? Ну или не только для этого переделать все в функции, а еще для того, чтобы можно было используя этот же код добавлять еще к существующим новые панели и меню???

Отредактировано andrkar (17.03.2010 21:51:36)

6

Re: Создание своих панели инструментов и меню

Свойство CommandBars содержит панели всех активных шаблонов и документов Word. CustomizationContext на CommandBars не влияет,  а указывает, где будут производиться изменения.

Если хотите хранить состояние панели, то зачем ее каждый раз создавать/удалять? Может достаточно обновлять/создавать/удалять элементы на панели?

Что бы избавится от запроса на сохранение:
- или работайте с NormalTemplete
- или перед закрытием сохраняйте документ макросом.
- или создавайте панель временно: CommandBars.Add Temporary:=True, тогда панель автоматически удаляется при закрытии Word.

Узнать, где хранится панель, поможет свойство CommandBar.Context, содержащее полное имя документа (Document.FullName). Это чтобы чужие панели не удалять…

Удаление панелей через интерфейс Word 2003: меню "Сервис" > пункт "Шаблоны и надстройки" > кнопка "Организатор" > вкладка "Панели".

Макросы под заказ и готовый пакет - mtdmacro.ru

7

Re: Создание своих панели инструментов и меню

Вождь пишет:

Удаление панелей через интерфейс Word 2003: меню "Сервис" > пункт "Шаблоны и надстройки" > кнопка "Организатор" > вкладка "Панели".

В предложенном варианте видны только мной или другими программами созданные панели. Те, что описаны в граблях, не видны. А хотелось бы от них избавиться..

8

Re: Создание своих панели инструментов и меню

andrkar пишет:

макрос скачивал вот отсюда: wordexpert.ru/wp-content/uploads … tes/bm.zip

Макрос создает новое меню при каждом клике на кнопке "Работа с закладками" на панели "BookMark" smile

По-моему убить эти меню можно только вместе с Normal.dot.

Отредактировано Вождь (18.03.2010 16:26:31)

Макросы под заказ и готовый пакет - mtdmacro.ru

9

Re: Создание своих панели инструментов и меню

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

10

Re: Создание своих панели инструментов и меню

Вождь пишет:

По-моему убить эти меню можно только вместе с Normal.dot.

Я тоже так думал! smile Но свой нормал мне убивать не хотелось.. Для испытаний просто скопировал его в другое место и начал экспериментировать с пустым новым шаблоном.. Для начала создал в  нем с десяток таких невидимых панелей.
Абсолютно случайно, благодаря вашему совету про удаление панелей из организатора, нашел решение. А решение следующее:
Написал макрос, который перебирал коллекцию панелей и при нахождении удалял панель с именем "bmPopup". из него пытался установить видимость панели, но не получалось.. как уже говорил выше, макрос удалял все панели только в текущем сеансе. При запуске ворда эти панели появлялись снова. Что-то меня в голову стукнуло и я попробовал сделать такое решение. В макросе выставил on Error Resume Next перед попыткой сделать найденные панели видимыми (не знаю, нужно ли это было, но для полноты эксперимента привожу данное действие).  Запустил макрос, он сообщил, что удалил некоторое количество таких панелей, запустил его еще раз, макрос сказал, что удалять больше нечего. После этого уже из ворда создал вручную панель с именем "bmPopup" (естественно, если не запускал макрос на удаление, то ворд выдавал сообщение при попытке создать вручную, что такая панель уже существует). Перезапустил Ворд. Зашел в организатор, на закладку "Панель" и увидел, что необходимая панель присутствует.. (также она была видима после запуска ворда). Нажал кнопку "Удалить", но вроде не увидел никаких действий, панель осталась видимой, нажал еще несколько раз, тот же результат. Попробовал запустить макрос на удаление.. И, о чудо, он мне сообщил, что удалил уже меньше панелей, чем удалял раньше.. Тогда я снова перегрузил ворд, и начал снова попытки удаление панели из организатора. Жал кнопку "Удалить" до упора, пока и видимую панель не удалил.. После еще одного перезапуска ворда обнаружил, что этих невидимых панелей в шаблоне уже нет!!
вот такой вот рецепт удаления этих невидимых панелей.. smile

Отредактировано andrkar (18.03.2010 16:55:38)

11

Re: Создание своих панели инструментов и меню

Вождь пишет:

По-моему убить эти меню можно только вместе с Normal.dot.

Напрягся и... "родил" решение. Макрос удаляет любые панели, в том числе создаваемые "bm.dot":

Public Function CommandBars_DeleteByName(ByRef BarName As String) As Long
' удаление панелей инструментов с именем BarName
' во всех активных шаблонах и документах
' возвращает количество удаленных панелей

    CommandBars_DeleteByName = 0
    'On Error Resume Next
Dim CB As Office.CommandBar

    For Each CB In Application.CommandBars
        If StrComp(CB.Name, BarName, VBA.vbTextCompare) <> 0 Then
        Else
            Application.OrganizerDelete _
                Source:=CB.Context, _
                Name:=BarName, _
                Object:=Word.wdOrganizerObjectCommandBars
            CommandBars_DeleteByName = CommandBars_DeleteByName + 1
        End If
    Next CB
End Function
Макросы под заказ и готовый пакет - mtdmacro.ru

12

Re: Создание своих панели инструментов и меню

Друзья! Я вижу, что идет какой-то негатив в адрес разработанного мною шаблона "Работа с закладками", доступного по ссылке: Шаблон.
Это несправедливо по следующим основаниям.
1. Судя по первому сообщению пользователя andrkar (далее Андрей), он скачал мой шаблон, вытащил часть кода и попытался пристроить к своей ситуации и это не получилось по каким-то причинам (независящим от моего шаблона).
2. В скачанном архиве с моим шаблоном находится сам шаблон и инструкция по его установке и удалению. В инструкции ясно написано, как с ним работать - как установить и как удалить корректно.
3. После того, как шаблон будет установлен в папку автозагрузки, при открытии любого документа в левой части появится ОДНА панель инструментов (BookMarks) и одна меню-кнопка с вложенными командами. Никаких доп.меню или панелей инструментов по клику на кнопке НЕ СОЗДАЕТСЯ!
Вождь, этот вопрос и к вам. Вы тоже об этом сказали.
4. Андрей, как он сам пишет, скачал какой-то макрос с сайта "Этюды для программистов Microsoft Word" и запустил его. В результате работы ЭТОГО макроса у него появились масса панелей инструментов.
Вот ваши слова, Андрей:

Скачал следующий файл с готовым решением:
внешняя ссылка … uiltin.zip
Запустил у себя на компе макрос, выдающий полный список коллекции commandBars.
Увидел ужасающую картину - более 50 панелей с одинаковым названием "bmPopup".

И далее в этом же сообщении вы пишете:

Ну а как все же избавиться от этих лишних панелей? может можно написать макрос, который удаляет все невстроенные, а созданные пользователем панели???

макрос скачивал вот отсюда: http://wordexpert.ru/wp-content/uploads … tes/bm.zip

Ну, и причем здесь мой шаблон?
5. Андрей, в другом сообщении вы вновь пишите:

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

Он не создает никаких панелей. Вы путаете его с другим скачанным вами макросом!

Поскольку шаблон был разработан уже давно, я естественно подзабыл его моменты программирования. Но то, что он работает корректно - это проверено лично мною и, надеюсь, другими пользователями. Иначе бы меня сразу же засыпали этими жалобами.

Предлагаю для чистоты эксперимента скачать МОЙ шаблон, установить его как положено в инструкции, поработать с ним, затем удалить, как написано в инструкции. И сообщите, если он создает непонятно откуда взявшиеся панели.

И еще одно пожелание, Андрей к вам: если вы хотите переделать тот или иной шаблон под свои нужды, то неправильно выдирать из работающего механизма отдельные его части. Эта панель в левом углу редактора, не так-то легко создавалась. Я убил массу времени и сил, чтобы разобраться в этом механизме, а он не прост, как кажется - посмотрите по коду. По-крайней мере, для меня как непрограммиста. Там все взаимосвязано.
Правильно будет сделать ТЗ и либо самому его решить, либо попросить помощи, подробно описав свои запросы.
А так получается путаница. Вы и себя запутали, и других ввели в заблуждение.

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

13

Re: Создание своих панели инструментов и меню

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

14

Re: Создание своих панели инструментов и меню

admin пишет:

Понял, о чем идет речь

Минимальная модификация шаблона "bn.dot", чтобы создаваемые меню не сохранялись:

Set cb = CommandBars.Add("bmPopup", msoBarPopup, , True)
Макросы под заказ и готовый пакет - mtdmacro.ru

15

Re: Создание своих панели инструментов и меню

Александр, спасибо.
Буду думать над улучшением шаблона в этом плане.
Удалить-то все панели легко, а вот сделать их временными у меня почему-то тогда не получалось...

16

Re: Создание своих панели инструментов и меню

Для удаления только моих(!) панелей можно воспользоваться таким макросом:

Sub delCB()
Dim cb As CommandBar
For Each cb In CommandBars
  If cb.Name = "bmPopup" Or cb.Name = "BookMarks" Then cb.Delete
Next cb
End Sub

Надо подумать, на каком этапе внедрить этот код в шаблон. Вероятно, при выходе, как посоветовал Александр Витер.

17

Re: Создание своих панели инструментов и меню

Вождь пишет:

Минимальная модификация шаблона "bn.dot", чтобы создаваемые меню не сохранялись:

Set cb = CommandBars.Add("bmPopup", msoBarPopup, , True)

Как и говорил, не работает это дело  sad
Ладно, будем по-другому уничтожать вредителей.

18

Re: Создание своих панели инструментов и меню

andrkar пишет:

3) Что самое доставаемое, так это то, что при каждом закрытии Ворда, идет запрос на сохранения файла надстройки.

Нужно использовать в шаблоне не

CustomizationContext = ThisDocument

а

CustomizationContext = ActiveDocument.AttachedTemplate

19

Re: Создание своих панели инструментов и меню

Вождь пишет:

Напрягся и... "родил" решение. Макрос удаляет любые панели, в том числе создаваемые "bm.dot":

Спасибо! Проверил, все работает!!!
Антон, никакого негатива с моей стороны не было! Мне ваш этот проект с закладками очень нравится, хочу и дальше с ним работать! Поэтому и попросил вас поучаствовать в обсуждении, чтобы всем вместе найти решение!

20

Re: Создание своих панели инструментов и меню

В -общем, спасибо Андрею и Александру, что обратили мое внимание на такую "подлость" редактора, как неубиваемость скрытых панелей.
Проблема разрешилась у меня добавлением свойства CusomizationContext и установлением временности для панели инструментов.
После удаления шаблона из папки автозагрузки невидимых панелей не остается.
Похоже, что и в других моих шаблонах, где создается панель инструментов, такая же проблема.

21

Re: Создание своих панели инструментов и меню

admin пишет:
andrkar пишет:

3) Что самое доставаемое, так это то, что при каждом закрытии Ворда, идет запрос на сохранения файла надстройки.

Нужно использовать в шаблоне не

CustomizationContext = ThisDocument

а

CustomizationContext = ActiveDocument.AttachedTemplate

поправил по вашему совету - все заработало! Запроса на сохранение не происходит!

22

Re: Создание своих панели инструментов и меню

admin пишет:

Проблема разрешилась у меня добавлением свойства CusomizationContext и установлением временности для панели инструментов.

Когда уже можно будет скачать подправленную версию?

23

Re: Создание своих панели инструментов и меню

Собственно, вот ссылка на поправленную версию: http://wordexpert.ru/wp-content/uploads … tes/bm.zip.
Попробуйте и отпишитесь пожалуйста.
А на сайт выложу позже.

24

Re: Создание своих панели инструментов и меню

admin пишет:

Нужно использовать в шаблоне не

CustomizationContext = ThisDocument

а

CustomizationContext = ActiveDocument.AttachedTemplate

По-моему не нужно. Зачем свои панели хранить в чужом шаблоне? Ведь к документу может быть присоединен любой шаблон.  К тому же, если AttachedTemplate это не Normal.dot, то будет выдан запрос на сохранение AttachedTemplate.

Макросы под заказ и готовый пакет - mtdmacro.ru

25

Re: Создание своих панели инструментов и меню

Сейчас как раз разбираюсь с этим. Пробую по разному. как найду устойчивый вариант, напишу.

Отредактировано andrkar (19.03.2010 09:54:26)

26

Re: Создание своих панели инструментов и меню

Вождь пишет:

По-моему не нужно. Зачем свои панели хранить в чужом шаблоне? Ведь к документу может быть присоединен любой шаблон.  К тому же, если AttachedTemplate это не Normal.dot, то будет выдан запрос на сохранение AttachedTemplate.

Давайте уточним для ясности.
CustomizationContext - это свойство, от которого зависит, где будут сохраняться настройки меню, панелей инструментов...
Сохранять настройки можно либо в открытом документе, шаблоне открытого документа, или же в глобальном шаблоне Normal.dot.
Если в коде ничего не указывать, как это было у меня в шаблонах, то по умолчанию и в теории настройки будут сохраняться в том шаблоне, на основе которого создан данный документ, то есть в глобальном шаблоне, как мы могли наблюдать.
Поскольку, как правильно заметил Александр, к документу могут быть подсоединены и другие шаблоны, в том числе и мой bm.dot, то нужно явно тогда указывать место хранения настроек.
При указании ThisDocument возникает запрос на сохранение изменений в шаблоне bm.dot. При указании AttachedTemplate такого запроса не возникает.
Хотя вопрос остался - так где в таком случае сохранились настройки? Придется проверять...

27

Re: Создание своих панели инструментов и меню

Не могу отследить причину, по которой у меня не срабатывала временность панели инструментов. Работает сейчас. А вчера не работала. Просто так не бывает, знаю...
Даже не нужно указыать контекст.

28

Re: Создание своих панели инструментов и меню

При указании контекста настройки ThisDocument и после клика на кнопке проверка показала, что сохранилось в шаблоне bm.dot, и запрос выдается на его сохранение.

29

Re: Создание своих панели инструментов и меню

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

30

Re: Создание своих панели инструментов и меню

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

Отредактировано andrkar (19.03.2010 20:44:25)

31

Re: Создание своих панели инструментов и меню

Хранить можно в реестре, в переменных документа (Document.Variables), в файлах INI

Лучше день потерять — потом за пять минут долететь!

32

Re: Создание своих панели инструментов и меню

Если в переменных документа, то в глобальном шаблоне или в надстройке лучше сохранять?

33

Re: Создание своих панели инструментов и меню

При считываний данных о положении заметил вот какую особенность: если располагать панель слева, справа, снизу относительно рабочей области, то панель встает на то место, где она и была перед удалением. а вот если сверху, на одном уровне со стандартными панелями, то сохраняется только положение относительно левого края. а по вертикали панель восстанавливается на новую строку:( можно ли это как то победить?

34

Re: Создание своих панели инструментов и меню

Если указать свойство RowIndex, то можно панель размещать либо в самом верху над меню,  либо над панелями, либо слева от панелей.
Можно еще задавать смещение, но это все как-то не надежно.

35

Re: Создание своих панели инструментов и меню

На сайт не могу зайти и скачать. какие-то непонятные проблемы с провайдером:( приходится читать и писать сюда с телефона:(

36

Re: Создание своих панели инструментов и меню

Да, я уже тоже прихожу и выводу, что прикрепить эту панель к какому то углу, да не мучаться:) но хочется, чтобы и пользователя было удобно!

37

Re: Создание своих панели инструментов и меню

Однозначно постоянные панели хранить надо в родном шаблоне. Сохранение изменений панелей реализуется макросом при закрытии шаблона. Положение и состояние постоянных панелей Word сохраняет вместе с панелью.

Панель "BookMarks"  постоянная и ее положение должно сохранятся.  Или о какой скачущей панели идет речь?

Макросы под заказ и готовый пакет - mtdmacro.ru

38

Re: Создание своих панели инструментов и меню

Да я уже о своем:) как буду не с телефона, опишу подробнее

39

Re: Создание своих панели инструментов и меню

Вождь пишет:

Панель "BookMarks"  постоянная и ее положение должно сохранятся.  Или о какой скачущей панели идет речь?

В собственном шаблоне Андрея создается панель. Она крепится в левом углу под всеми стандартными панелями. При перемещении пользователем ее в любое другое место, после закрытия документа и повторного открытия панель восстанавливает свое местоположение.
Я посмотрел код этого шаблона и мне он не понравился. Как-то там всё нелогично выстроено. К тому же разбираться в чужом коде не люблю.

40

Re: Создание своих панели инструментов и меню

После всех разговоров мне тоже этот код не нравится!:) Причем достаточно сильно.. получилось, что это была тренировка по работе с панелями.. Думаю, что для своего шаблона, который будет передаваться пользователю нужно или просто создать панель (меню) вручную (или программно один раз, чтобы управлять изображениями на иконках) и оставить их в надстройке. А надстройку просто поместить в папку автозагрузки макросов. или просто проверять существование такой панели (меню) и только при ее отсутствии ее обновлять...

41

Re: Создание своих панели инструментов и меню

Если создается шаблон для конечного пользователя, то на мой взгяд правильно будет заранее обычным способом создать панель инструментов, а не через VBA. Это и проще и по-крайней мере гаранитирует от возможных ошибок (в том числе и логических).
По поводу иконок на кнопках, я честно говоря уже не помню... давно это было.

42

Re: Создание своих панели инструментов и меню

admin Установил обновленный шаблон по работе с закладками. Попробовал переместить панель в другое место. При закрытии приложения ответил положительно на запрос сохранить шаблон bm.dot. В последующем, если панель не трогать, запрос на сохранение не выдается..  Думаю, что нормально.. И пользователь - не параноик и не будет в каждом сеансе работы изменять положение панели "BookMarks":)

43

Re: Создание своих панели инструментов и меню

При закрытии приложения ответил положительно на запрос сохранить шаблон bm.dot.

А у меня вообще не выдается сообщение о сохранении. И панель остается там, куда я ее переместил.
Откройте код и посмотрите, что там указано про сохранение настроек. Просто я менял это значение на ActiveDocument.

44

Re: Создание своих панели инструментов и меню

admin - Антон, проверьте почту.

45

Re: Создание своих панели инструментов и меню

Создал еще один вариант - отдельный пункт в меню:

Создание своих панели инструментов и меню

Ничего лишнего нигде не светится. Но если есть желание, проверьте пожалуйста.
Скачать можно здесь: Шаблон "Работа с закладками".
Установка обычная - в папку автозагрузки. Оттуда же и удаляем.

46

Re: Создание своих панели инструментов и меню

Просто при копировании в папку автозагрузки ничего не появляется. дописал процедуру autoexec () и добавил в нее единственную строку - вызов процедуры создания меню - все заработало при запуске приложения:)

47

Re: Создание своих панели инструментов и меню

Очень странно, так как при копировании шаблона в папку автозагрузки (C:\Documents and Settings\UserName\Application Data\Microsoft\Word\STARTUP\) при запуске редактора крайним правым пунктом меню становится пункт "Закладки".
Только что проверил на случайном компьютере коллеги.

48

Re: Создание своих панели инструментов и меню

Сейчас тоже на другом попробую. но у меня точно не запускается:( и с добавлением того, что написал выше, тоже не все просто. буду дальше тестировать... удаление normаl.dot тоже ничего не меняет:(

Отредактировано andrkar (23.03.2010 14:17:50)