Все привет.
Задача такая...
Есть позиция в документе заданная в количестве символов от начала документа Word (так можно вычислить ее и в параграфах, но будет не так точно).
Нужно установить курсор (точку ввода) в в документе на символ соответствующих этой позиции и проскролировать окно документа так чтобы эта позиция была видна на экране.
Как этого добиться?
Попытался использовать функцию MoveRight, но она а) переходит по отображаемым символам (куда могут входить, например комментарии), б) некорректно (для моей задачи) ведет себя в таблицах с объеденных колонками или строками.
Поясню почему именно так...
Я обрабатываю Word XML. Делаю это напрямую читая файл, а не через атомэйшон, так как это в сто раз быстрее и дает больше возможностей.
В некоторых случаях появляются ошибки (не поддерживаемые теги или стили и т.п.). Мне нужно сделать список ошибок и показать его пользователю. При этом пользователь должен иметь возможность кликнуть на описание ошибки и перейти к месту в одкументе где она возникла (короче, как в IDE).
Здравствуйте, Vi2, Вы писали:
Vi2>А если использовать ActiveDocument.Characters(i).Select, где i = 1...N — позиция символа?
Так срабатывает, спасибо. Но получается не совсем то что нужно. Почему-то выделение оказывается на 1 и более символов раньше чем нужно. Видимо Ворд учитывает какие-то невидимые символы или еще что-то.
Vi2>Не плохо бы иметь пример, в котором нужно встать на определенную позицию.
Дык я же описал ситуацию. У меня есть некий COM-объект который парсит документ записанный в формат Word 2003 XML. Запись осуществляется по средством создания нового документа, копирования в него содержимого исходного и вызва SaveAs. Вот код макры вызывающей этот COM-объект:
Public Sub MakeXml()
If Not InitRsdnMlAutomation() Then Exit Sub
Dim doc As Document, tmpDoc As Document
Dim rsdnMlFileName As String, tmpFileName As String
Dim errors() As String
Set doc = ActiveDocument
doc.Save
Set tmpDoc = Documents.Add(doc.AttachedTemplate & "", , , False)
tmpDoc.Content.InsertFile doc.FullName, , False, False, False
tmpFileName = rsdnML.MakeTempFileName()
tmpDoc.SaveAs tmpFileName, WdSaveFormat.wdFormatXML, , , False, , , False
tmpDoc.Close wdSaveChanges
rsdnMlFileName = rsdnML.MakeRsdnMlFileName(doc.FullName)
errors = rsdnML.MakeXmlAndShowPreview(tmpFileName, rsdnMlFileName)
FileSystem.Kill tmpFileName
Dim error As Variant
For Each error In errors
Debug.Print error
Next
End Sub
Как видно в конце в отладочное окно выводится список сообщений об ошибках. В дальнейшем планируется выводить его в специальное оного с возможностью перехода на то место где ошибка произошла. Сейчас же это вылядит примерно так:
Не поддерживаемый стиль параграфа (смещение 1598): 'XML TAG'!
"смешение" — это и есть то смещение на которое нужно указать.
Рассчитывается оно при разборе файла. Проект COM-объекта находится
здесь. Но он на Nemerle.
В общем, буду экспериментировать...
Спасибо за помощь.