ContextMenu in Addin speichern

  • Word

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von harryhirsch.

    ContextMenu in Addin speichern

    Hi Leute

    Ich habe mir eine Erweiterung für MS-Word gebaut (VBA-Projekt in Dokumentvorlage (.dot)). Das Addin beinhaltet ein Hauptformular (hauptsächlich bestehend aus einem TreeView) und in diesem Hauptformular verwende ich ein Kontextmenu. Ich habe nun das Problem, dass irgendwie das Kontextmenu nicht richtig im Addin gespeichert wird. Deshalb lasse ich als Workaround bei jedem Start des Hauptformulars das Kontextmenu löschen und neu erstellen. Dies führt aber dazu, dass bei der Verwendung des Addins Word meint, das Addin sei geändert worden und fragt deshalb nach, ob die Änderungen an der Dokumentvorlage gespeichert werden sollen. Diese Rückfrage verunsichert die User und ausserdem ist die Rückfrage störend. Deshalb wäre es mir eigentlich am liebsten, wenn die Sache von Anfang an richtig gelöst wäre und nicht per workaround.

    Hier mal der relevante Code im Ereignis Initialize des Hauptformulars:

    Visual Basic-Quellcode

    1. ' ContextMenu erstellen
    2. ' ContextMenu muss zuerst gelöscht und dann wieder neu erstellt werden, weil ansonsten jeweils zur Laufzeit der Fehler:
    3. ' "Automatisierungsfehler -2147467259 (80004005): unbekannter Fehler" auftritt. Dies muss offenbar damit zu tun haben, dass
    4. ' das Contextmenu nicht korrekt dauerhaft gespeichert wird.
    5. ' Allenfalls schafft die Verwendung von: Application.CustomizationContext Abhilfe.
    6. For lngCounter = 1 To Application.CommandBars.Count
    7. If Application.CommandBars.Item(lngCounter).Name = strTBContextMenu Then
    8. Call DeleteContextMenu
    9. Call DeleteContextMenu
    10. Exit For
    11. End If
    12. Next
    13. Call CreateContextMenu


    und hier noch ein anderer Code-Ausschnitt:

    Visual Basic-Quellcode

    1. Private Sub CreateContextMenu()
    2. On Error GoTo Err_CreateContextMenu
    3. Dim objMenu As CommandBar
    4. Dim objME As CommandBarButton
    5. Dim objTemplate As Template
    6. Dim objOldTemplate As Template
    7. Dim intCounter As Integer
    8. ' 1. CustomizationContext ändern
    9. Set objOldTemplate = Application.CustomizationContext
    10. Set objTemplate = Nothing
    11. For intCounter = 1 To Application.Templates.Count
    12. If Application.Templates(intCounter).Name = strTBFileName Then
    13. If objTemplate Is Nothing Then
    14. Set objTemplate = Application.Templates(intCounter)
    15. End If
    16. End If
    17. Next
    18. If objTemplate Is Nothing Then
    19. Application.CustomizationContext = Application.ActiveDocument
    20. Else
    21. Application.CustomizationContext = objTemplate
    22. End If
    23. ' 2. Menu aufbauen
    24. Set objMenu = Application.CommandBars.Add(Name:="TBContextMenu", Position:=msoBarPopup, MenuBar:=False, Temporary:=True)
    25. Set objME = objMenu.Controls.Add(Type:=msoControlButton, ID:=1, Temporary:=True)
    26. With objME
    27. .Caption = "Eintrag neu"
    28. .Parameter = "NewEntry"
    29. .FaceId = 1589
    30. .OnAction = "ContextMenuHandler"
    31. End With
    32. Set objME = objMenu.Controls.Add(Type:=msoControlButton, ID:=1, Temporary:=True)
    33. With objME
    34. .Caption = "Ordner neu"
    35. .Parameter = "NewFolder"
    36. .FaceId = 1660
    37. .OnAction = "ContextMenuHandler"
    38. End With
    39. Set objME = objMenu.Controls.Add(Type:=msoControlButton, ID:=1, Temporary:=True)
    40. With objME
    41. .Caption = "Eintrag ändern"
    42. .Parameter = "EditEntry"
    43. .FaceId = 1552
    44. .OnAction = "ContextMenuHandler"
    45. End With
    46. Exit_CreateContextMenu:
    47. Application.CustomizationContext = objOldTemplate
    48. Set objOldTemplate = Nothing
    49. Set objTemplate = Nothing
    50. Set objME = Nothing
    51. Set objMenu = Nothing
    52. Exit Sub
    53. Err_CreateContextMenu:
    54. If Err.Number = 0 Then
    55. GoTo Exit_CreateContextMenu
    56. Else
    57. LogError "MainForm::CreateContextMenu", Err
    58. Resume Exit_CreateContextMenu
    59. End If
    60. End Sub


    Hat irgendwer eine Idee, was hier das Problem sein könnte und wo ein allfälliger Lösungsansatz zu suchen wäre? Für jeden Hinweis bin ich dankbar.
    Lieber Digot

    ich verstehe leider einiges nicht an Deiner Antwort:

    1. Wie soll die Zuweisung "deinprog = deinsub" funktionieren, immerhin wäre "deinsub" nicht vom Typ Addin

    2. Schlägst Du vor, ich solle alles in eine Sub packen. Wie soll ich das machen, immerhin habe ich mehrere Module, Formulare und Klassenmodule, aus denen das Addin besteht.

    3. Inwiefern hat Dein Vorschlag einen Einfluss darauf, wie das Kontextmenü in der Vorlage gespeichert wird?

    Danke trotzdem.

    Gruss

    harryhirsch