Вызов процедуры в другом классе - PullRequest
3 голосов
/ 13 декабря 2011

Я создал надстройку для outlook 2010. У меня есть лента с кнопкой. Когда вы нажимаете эту кнопку, я хочу, чтобы она вызывала процедуру в ThisAddIn.vb.

Есть два файла: ThisAddin.vb и Ribbon.vb.

Я пробовал несколько вещей безрезультатно. Я также установил все процедуры для общественности.

Проверка вызова123 ()

Call ThisAddIn.Testing123 ()

Etc

Как правильно вызвать эту процедуру?

****Ribbon1.vb****
Imports Microsoft.Office.Tools.Ribbon


Public Class MyOutlookTab

    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click

        Call Testing123()

    End Sub

End Class


***ThisAddIn.vb***
Public Class ThisAddIn

    Public Sub Testing123()
        System.Windows.Forms.MessageBox.Show("It Works!")

    End Sub

End Class

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Проблема в том, что вы пытаетесь ссылаться на методы класса, не создавая класс.

У вас есть три варианта сделать эту работу:

1) Преобразовать ThisAddIn в Module. Тогда не будет никаких проблем с доступом к методу Testing123, как у вас сейчас.

2) Преобразовать ThisAddin.Testing123 в метод Shared, т. Е .:

Public Shared Sub Testing123()

Тогда вы получите следующий доступ:

Call ThisAddin.Testing123()

3) Создайте экземпляр класса ThisAddIn до использования его методов:

Dim oAddIn As New ThisAddIn
Call oAddIn.Testing123()

Обновление

Похоже, что надстройки обрабатываются иначе, чем стандартные классы.

В этой статье MSDN содержатся конкретные рекомендации по реализации доступа к функциональности AddIn из других типов решений.

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

1) Создайте интерфейс для предоставления функциональности из вашего AddIn:

<ComVisible(True)> _
Public Interface IAddInUtilities
    Sub Testing123()
End Interface

2) Добавьте класс утилит в ваш проект надстройки:

<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class AddInUtilities
    Implements IAddInUtilities

    Public Sub Testing123() Implements IAddInUtilities.Testing123
        System.Windows.Forms.MessageBox.Show("It Works!")
    End Sub
End Class

3) Добавьте следующее в ThisAddIn для предоставления утилит внешним абонентам:

Private utilities As AddInUtilities

Protected Overrides Function RequestComAddInAutomationService() As Object
    If utilities Is Nothing Then
        utilities = New AddInUtilities()
    End If
    Return utilities
End Function

4) Мне немного непонятно, какой именно синтаксис необходим для последнего шага, поскольку у меня не установлена ​​автоматизация в офисе, но вам нужно будет что-то сделать в этом направлении:

' OutlookTest should be changed to the name of the project ThisAddIn is in
Dim addIn As Office.COMAddIn = Globals.ThisAddIn.Application.COMAddIns.Item("OutlookTest")
Dim utilities As OutlookTest.IAddInUtilities = TryCast( _
    addIn.Object, OutlookTest.IAddInUtilities)
utilities.Testing123()
2 голосов
/ 13 декабря 2011

Спасибо за все комментарии, но я нашел решение в примере здесь: http://msdn.microsoft.com/en-us/library/ee620548.aspx, где они говорят о добавлении ленты в приглашение на собрание (2/3 пути вниз).

Это на самом деле довольно просто. Вы вызываете процедуру, используя «Глобал»

Globals.ThisAddIn.Testing123()

Больше ничего не нужно.

1 голос
/ 13 декабря 2011

Вам нужно создать новый экземпляр класса, прежде чем вы сможете вызывать его в vb.net!

Так что-то вроде должно позволить вам назвать это ..

Public Class MyOutlookTab

    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click
        Dim testing As New ThisAddIn()
        Call testing.Testing123()

    End Sub

End Class
...