1

Тема: Как поймать событие изменения текста документа?

Задача: необходимо контролировать количество символов в тексте документа, а в случае превышения некоторого максимального значения выделять цветом "лишние" символы.

Собственно сама проверка и выделение цветом проблем не вызывают. Главный вопрос, каким образом оперативно отслеживать изменения в документе и вызывать проверку.

Вариант 1. Запускать проверку периодически через некоторые интервалы времени. Недостатки: бесконечный цикл с проверкой условия даже при отсутствии изменений в документе.
Вариант 2. Отслеживать события нажатия клавиш (набор и удаление символов) и левой кнопки мыши (вставка текста посредством контекстного меню или кнопки на панели инструментов).

Sub HandleEvents()
  Dim m As MSG
  
  bCancel = False
  Do While Not bCancel
    WaitMessage
    If PeekMessage(m, GetActiveWindow, 0, 0, PM_NOREMOVE) Then
      Select Case m.Message
      Case WM_KEYUP, WM_LBUTTONUP
        UpdateInfo
      End Select
    End If
    DoEvents
  Loop
End Sub

Sub AutoOpen()
  HandleEvents
End Sub

Недостатки, выявленные в Word 2003 SP3: 1) некоторые изменения становятся видны только после дополнительного клика мышью или нажатия клавиши; 2) при запуске документа иконки стандартных панелей инструментов не видны до первого клика.

Может, есть решение лучше? Подходящих событий объектной модели Word я не нашел.

Post's attachments

dead_toolbars.png 5.31 Кб, файл не был скачан. 

You don't have the permssions to download the attachments of this post.

2

Re: Как поймать событие изменения текста документа?

Через WinAPI это круто! Но тут нужно работать через класс. Создаём класс с именем Class1 и пишем в него такой код:

Public WithEvents app As Word.Application

Private Sub app_WindowSelectionChange(ByVal Sel As Selection)
  MsgBox Sel.End
End Sub

Затем при открытии документа связываем наше приложение с классом:

Dim app As New Class1 'Объявляем глобально

Private Sub Document_Open()
  Set app.app = Application
End Sub
Лучше день потерять — потом за пять минут долететь!

3

Re: Как поймать событие изменения текста документа?

Событие WindowSelectionChange все-таки не очень подходит, так как случается, когда меняется выделенный текст либо точка вставки.

Недостаток предложенного вами варианта в том, что событие не происходит:

1) при наборе текста с клавиатуры, хотя курсор перемещается вправо;
2) при удалении символов клавишей BackSpace.