Помогите перехватить событие SelectionChange у Outlook 2000
и всё. Как ни крути.
на Addhendler пишет No such interface supported
и всё. Как ни крути.
По подробнее пожалуйста: как перехватываешь - пример кода, в какой программе, и самое главное - для чего.... что необходимо достичь в конечной фазе.. очень часто бывает что задают конкретный вопрос, а потом и распроссов выясняется что то что человеку нужно делается гораздо проще вообще не по другому. Как говорится: скажи мне зачем тебе это и я скажу как сделать это по другому.
Пока, попробую угадать суть затруднений и в качестве ответа предложить свой модуль-класс для перехвата события открытия письма в отд. окне в Outlook'е (через перехват SelectionChange)
Это модуль класс:
Public WithEvents myExp As Outlook.Explorer
Public WithEvents myMailItem As Outlook.MailItem
Public Sub InitializeExp()
'Set myItems = Application.GetNamespace("MAPI").Folders.Item("Личные папки").Folders.Item("Входящие").Items
Set myExp = Application.ActiveExplorer
End Sub
Private Sub myExp_SelectionChange()
' событие возникает когда пользователь перешел к другому письму
Dim mlItem As Outlook.MailItem
If myExp.Selection.Count = 1 Then
Set mlItem = myExp.Selection.Item(1)
' проверка условий:
If mlItem.Parent.FolderPath = strcPathFolderMailIn Then 'выбранное письмо в папке Входящие
If mlItem.Attachments.Count > 0 Then 'письмо содержит вложенный файл
Set myMailItem = mlItem
End If
End If
End If
End Sub
Private Sub myMailItem_Open(Cancel As Boolean)
' событие возникает когда пользователь открывает письмо
' загрузка формы ожидания
Load frmWait
' показ формы выбора действия
frmSelect.txtSubject.Text = myMailItem.Subject
frmSelect.Show
' показ формы ожидания
frmWait.Show vbModeless
frmWait.Repaint
' запуск обработки выбр. действия
Call RegMsg(strSelectAct, myMailItem)
' закрываем форму ожидания
Unload frmWait
End Sub
По подробнее пожалуйста: как перехватываешь - пример кода, в какой программе, и самое главное - для чего.... что необходимо достичь в конечной фазе.. очень часто бывает что задают конкретный вопрос, а потом и распроссов выясняется что то что человеку нужно делается гораздо проще вообще не по другому. Как говорится: скажи мне зачем тебе это и я скажу как сделать это по другому.
Пока, попробую угадать суть затруднений и в качестве ответа предложить свой модуль-класс для перехвата события открытия письма в отд. окне в Outlook'е (через перехват SelectionChange)
Это модуль класс:
Public WithEvents myExp As Outlook.Explorer
Public WithEvents myMailItem As Outlook.MailItem
Public Sub InitializeExp()
'Set myItems = Application.GetNamespace("MAPI").Folders.Item("Личные папки").Folders.Item("Входящие").Items
Set myExp = Application.ActiveExplorer
End Sub
Private Sub myExp_SelectionChange()
' событие возникает когда пользователь перешел к другому письму
Dim mlItem As Outlook.MailItem
If myExp.Selection.Count = 1 Then
Set mlItem = myExp.Selection.Item(1)
' проверка условий:
If mlItem.Parent.FolderPath = strcPathFolderMailIn Then 'выбранное письмо в папке Входящие
If mlItem.Attachments.Count > 0 Then 'письмо содержит вложенный файл
Set myMailItem = mlItem
End If
End If
End If
End Sub
Private Sub myMailItem_Open(Cancel As Boolean)
' событие возникает когда пользователь открывает письмо
' загрузка формы ожидания
Load frmWait
' показ формы выбора действия
frmSelect.txtSubject.Text = myMailItem.Subject
frmSelect.Show
' показ формы ожидания
frmWait.Show vbModeless
frmWait.Repaint
' запуск обработки выбр. действия
Call RegMsg(strSelectAct, myMailItem)
' закрываем форму ожидания
Unload frmWait
End Sub
Мне нужно делать определенные действия, когда пользователь выделяет несколько писем или пытается перейти на новое письмо в аутлуке.
я пишу :
Dim m_application As Object
Dim m_olApp As Outlook.Application
Dim WithEvents m_olExplorer As Outlook.ExplorerClass
Dim WithEvents m_olExplorers As Outlook.Explorers
Public Sub New(ByVal application As Object)
Try
m_application = application
m_olApp = CType(m_application, Outlook.Application)
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub
Public Sub InitHandler()
Try
m_olExplorer = CType(m_olApp.ActiveExplorer, Outlook.ExplorerClass)
AddHandler m_olExplorer.SelectionChange, AddressOf ddd
Public Sub ddd(ByVal explorer As Outlook.Explorer) Handles m_olExplorers.NewExplorer
MsgBox("test")
End Sub
на строке с AddHandler пишет no such interface supported.
В VB не используется понятие - интерфейс, там все делается в этом случае через модуль-класс, именно в нем можно объявлять типы (в том числе и через WithEvents). Потом все просто, если объектную переменную нужного типа мы объявил:
Public WithEvents myExp As Outlook.Explorer
потом надо забацать свою процедуру инициализации, например так:
Public Sub InitializeExp()
Set myExp = Application.ActiveExplorer
End Sub
ну и все, в VB редакторе, в этом модуле-классе, выбираем событие для SelectionChange для myExp:
Private Sub myExp_SelectionChange()
' событие возникает когда пользователь перешел к другому письму
..........
здесь любой код
...........
End Sub
Так это делается в VB, а вот какой синтаксис в VB.NET я не в курсе.
Я в принципе всё так и делаю. У меня есть
MyExpl = m_olApp.Explorer, где m_olApp as Outlook.Application (я предварительно получаю объект application, привожу его к outlook.application и присваиваю переменной m_olApp)
Что самое интересное, я спокойно могу доступиться до коллекции Selection, могу вызвать Display, вывести subject и т.д., а вот при попытке связать какую-то функцию с событием SelectionChange выскакивает exception.
Тут какой прикол. Если я объявляю переменную myExpl со словом WithEvents, то у меня выскакивает exception уже там, где я пытаюсь присвоить myExpl = m_olApp.ActiveExplorer.
Если я объявляю без WithEvents, но пишу AddHandle myExpl.SelectionChange, AddressOf myProc, то у меня exception на этой строке.
Если я не делаю ни то ни другое, а просто создаю функцию myExpl_SelectionChange(), то в неё никогда в жизни управление не заходит. Я перерыл весь интернет и МСДН, но никакого объяснения этому не нашел.
Что мне не нравится и что я бы поменял на основе вышенаписанного текста:
Dim m_olApp As Outlook.Application
Dim WithEvents m_olExplorer As Outlook.Explorer
Public Sub New(ByVal application As Object)
Try
m_olApp = CType(application, Outlook.Application)
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub
Public Sub InitHandler()
Try
m_olExplorer = CType(m_olApp.ActiveExplorer, Outlook.Explorer)
AddHandler m_olExplorer.SelectionChange, AddressOf ddd
End Sub
Public Sub ddd(ByVal explorer As Outlook.Explorer) Handles m_olExplorers.NewExplorer
MsgBox("test")
End Sub
Т.е. мне не нравится выражение .Explorers, помойму его вообще не надо использовать, токо Explorer.
Потом необходимо проверить момент с AddHandle, все ли правильно там в синтаксисе, особенно с фукнцией ddd, правильно ли она объявлена, в ней мне не нравится, что она почему то возвращает m_olExplorers.NewExplor, почему NewEx... ?!
Dim m_olApp As Outlook.Application
Dim WithEvents m_olExplorer As Outlook.ExplorerClass
Public Sub InitHandler(ByVal oApp As Outlook.Application)
m_olOutlook = oApp
m_olApp = CType(m_olOutlook, Outlook.Application)
m_olExplorer = CType(m_olApp.ActiveExplorer, Outlook.ExplorerClass)
AddHandler m_olExplorer.SelectionChange, AddressOf m_olExplorer_SelectionChange
End Sub
Private Sub m_olExplorer_SelectionChange()Handles m_olExplorer.ExplorerEvents_Event_SelectionChange
.......
'здеся наш код
.......
End Sub
Я все объединил в InitHandler и Outlook.Application и Outlook.Explorer (чтоб код не разбрасывать). По идее должно быть так... проверь у себя
Я так думаю, что проблема не в событии и не в синтаксисе, потому что у меня не перехватывается даже Application_Startup. У ребят рядом работает. Я так думаю, что у меня что-то со студией. Потому что у меня стоит их две (2002 и 2003), и два Framework, соответственно. Мне тут сосед рядом дал проект, в котором просто перехватывается Startup, и он у меня то же не может скомпилироваться
Сейчас попробую удалить обе студии с frameworkami и постваить всё заново.
Третью неделю работаю на новом месте и уже четвертый день парюсь с этим SelectionChange. Так меня ещё и выкинут :)
У тебя ест и-мейл, чтобы мы так обсуждали а не через форум.
Запиши мой
[email]Eugeniy.Sentsov@miratech-pro.com.ua[/email]
e-mail: [email]SSVeryaskin@ovk.ru[/email]
icq и т.д. прикрыты админами, не пролезешь :(