Вызов процедуры внутри другого класса

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

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

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

Вызов Тестирование123()

Вызовите ThisAddIn.Testing123()

И т.д

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

****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

person malt_man    schedule 12.12.2011    source источник


Ответы (3)


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

У вас есть три варианта выполнения этой работы:

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) Создайте интерфейс для доступа к функциям вашей надстройки:

<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()
person competent_tech    schedule 12.12.2011
comment
Хорошо, я попробовал вариант 2, и мне удалось распознать testing123 в классе MyOutlookTab, но... Когда я преобразовал подпрограмму в общий, это вызвало другие проблемы с кодом (не распознал бы me.application.createItem... который используется но я не включал для простоты) - person malt_man; 13.12.2011
comment
Затем я попробовал вариант 3, и похоже, что это сработает, потому что он смог найти процедуру, но я получаю сообщение об ошибке. Аргумент не указан для параметра «Factory» в «Public sub New (factory as Microsoft.blahblahblha)». Никогда не видел этого раньше. Спасибо за вашу помощь, я думаю, что приближаюсь - person malt_man; 13.12.2011
comment
@ user7801: Основываясь на этой дополнительной информации, вариант 3 может быть вашим лучшим выбором. - person competent_tech; 13.12.2011
comment
хорошо, для варианта 3 мне нужно было создать процедуру Sub New, потому что я, очевидно, пытаюсь ее вызвать. Что я должен в него положить? - person malt_man; 13.12.2011
comment
@ user7801: Вам не нужно ничего в него вставлять, но вы можете в целях безопасности поставить MyBase.New(). - person competent_tech; 13.12.2011
comment
Я пробовал MyBase.New(), а также MyClass.New(), и это дает мне ту же ошибку о новой версии Factory of Public. Если я ничего не добавляю в Sub New, возникает ошибка: первый оператор этого «Sub New» должен быть вызовом «MyBase.New» или «MyClass.New», поскольку базовый класс «Microsoft.Office.Tools. Outlook.OutlookAddInBase" из "Update_Emailer.ThisAddIn" не имеет доступного "Sub New", который можно вызвать без аргументов. Еще раз, спасибо за вашу помощь, я весь день ломал голову над этим. - person malt_man; 13.12.2011
comment
msdn.microsoft.com/en-us/library/707s02fy.aspx говорит попробовать MyBase.New(ничего).... это тоже не сработало. хм надо копнуть поглубже - person malt_man; 13.12.2011
comment
Можете ли вы показать полное сообщение об ошибке, которое вы получаете, чтобы я мог увидеть полное имя фабрики, которое оно ожидает? Это может помочь. - person competent_tech; 13.12.2011
comment
Это ошибка, которую я получаю в процедуре Sub New (): первый оператор этого «Sub New» должен быть вызовом «MyBase.New» или «MyClass.New», поскольку базовый класс «Microsoft.Office.Tools.Outlook. OutlookAddInBase» из «Update_Emailer.ThisAddIn» не имеет доступного «Sub New», который можно вызвать без аргументов. - person malt_man; 13.12.2011
comment
@malt_man: Спасибо за исключение; это показывает, что вы создаете реальную надстройку, а не просто называете класс таким образом. К сожалению, это усложняет реализацию. Я обновил ответ ссылкой на соответствующую документацию MSDN и шаги, которые, как я думаю, вам нужно предпринять, чтобы заставить его работать. - person competent_tech; 13.12.2011
comment
Спасибо, что нашли время, чтобы изучить его подробнее. Однако я нашел простое решение, см. комментарий. Разочаровывает, что надстройка такая разная. Спасибо - person malt_man; 14.12.2011

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

Это на самом деле довольно просто. Вы вызываете процедуру, используя "Global"

Globals.ThisAddIn.Testing123()

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

person malt_man    schedule 13.12.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
person Standage    schedule 12.12.2011