Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите перехватить событие SelectionChange у Outlook 2000

4.9K
24 февраля 2004 года
e_s
12 / / 24.02.2004
на Addhendler пишет No such interface supported
и всё. Как ни крути.
258
24 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by e_s
на Addhendler пишет No such interface supported
и всё. Как ни крути.



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

Пока, попробую угадать суть затруднений и в качестве ответа предложить свой модуль-класс для перехвата события открытия письма в отд. окне в Outlook'е (через перехват SelectionChange)

Это модуль класс:

Код:
Option Explicit

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
4.9K
24 февраля 2004 года
e_s
12 / / 24.02.2004
Цитата:
Originally posted by SergeySV


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

Пока, попробую угадать суть затруднений и в качестве ответа предложить свой модуль-класс для перехвата события открытия письма в отд. окне в Outlook'е (через перехват SelectionChange)

Это модуль класс:
Код:
Option Explicit

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.

258
25 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Ты так и не ответил в чем ты пишешь, судя по коду это не VBA и не VB6, а скорей всего VB.NET

В 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 я не в курсе.
4.9K
25 февраля 2004 года
e_s
12 / / 24.02.2004
Да, это 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(), то в неё никогда в жизни управление не заходит. Я перерыл весь интернет и МСДН, но никакого объяснения этому не нашел.
258
25 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Ну что ж, если с Outlook.Application все прошло нормально, то этот синтаксис можно взять за основу. Судя по всему проблемы не с алгоритмом, а с выбором типов.

Что мне не нравится и что я бы поменял на основе вышенаписанного текста:


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... ?!
258
25 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
А, кажись я нашел в MSDN откуда ты взял этот ExplorerClass.... так, ну тогда по их примеру надо делать так:

Код:
Dim m_olOutlook As Outlook.Application
   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 (чтоб код не разбрасывать). По идее должно быть так... проверь у себя
4.9K
25 февраля 2004 года
e_s
12 / / 24.02.2004
В прошлом примере (там где NewExplorer) я действительно не то написал. Это я уже в сотый раз экспериментировал и по запаре вставил этот код.

Я так думаю, что проблема не в событии и не в синтаксисе, потому что у меня не перехватывается даже Application_Startup. У ребят рядом работает. Я так думаю, что у меня что-то со студией. Потому что у меня стоит их две (2002 и 2003), и два Framework, соответственно. Мне тут сосед рядом дал проект, в котором просто перехватывается Startup, и он у меня то же не может скомпилироваться

Сейчас попробую удалить обе студии с frameworkami и постваить всё заново.
258
25 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
VB6 с VB.NET на одном компе тоже не слишком шибко вместе работают... :)
4.9K
25 февраля 2004 года
e_s
12 / / 24.02.2004
Да напасть какая-то.
Третью неделю работаю на новом месте и уже четвертый день парюсь с этим SelectionChange. Так меня ещё и выкинут :)

У тебя ест и-мейл, чтобы мы так обсуждали а не через форум.
Запиши мой

[email]Eugeniy.Sentsov@miratech-pro.com.ua[/email]
258
25 февраля 2004 года
SergeySV
1.5K / / 19.03.2003
Я вот тоже думаю, что пора бы начать осваивать VB.NET, хотя бы для себя, потому как на работе пока не очень актуально, так основной упор это Access, а его пока(как и весь Office) еще не перевели на .NET хотя и добавили в Office2003 его поддержку. С другой стороны Microsoft заявил о прекращении разработке Visual Basic и связи с этим думаю не далек тот день когда и весь Office переведут на рельсы VB.NET

e-mail: [email]SSVeryaskin@ovk.ru[/email]
icq и т.д. прикрыты админами, не пролезешь :(
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог