Как перейти на n-ый символ документа Word?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.01.10 18:28
Оценка:
Все привет.

Задача такая...

Есть позиция в документе заданная в количестве символов от начала документа Word (так можно вычислить ее и в параграфах, но будет не так точно).
Нужно установить курсор (точку ввода) в в документе на символ соответствующих этой позиции и проскролировать окно документа так чтобы эта позиция была видна на экране.
Как этого добиться?
Попытался использовать функцию MoveRight, но она а) переходит по отображаемым символам (куда могут входить, например комментарии), б) некорректно (для моей задачи) ведет себя в таблицах с объеденных колонками или строками.

Поясню почему именно так...
Я обрабатываю Word XML. Делаю это напрямую читая файл, а не через атомэйшон, так как это в сто раз быстрее и дает больше возможностей.
В некоторых случаях появляются ошибки (не поддерживаемые теги или стили и т.п.). Мне нужно сделать список ошибок и показать его пользователю. При этом пользователь должен иметь возможность кликнуть на описание ошибки и перейти к месту в одкументе где она возникла (короче, как в IDE).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как перейти на n-ый символ документа Word?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 21.01.10 07:49
Оценка: 41 (1)
Здравствуйте, VladD2, Вы писали:

VD>Есть позиция в документе заданная в количестве символов от начала документа Word (так можно вычислить ее и в параграфах, но будет не так точно).

VD>Нужно установить курсор (точку ввода) в в документе на символ соответствующих этой позиции и проскролировать окно документа так чтобы эта позиция была видна на экране.
VD>Как этого добиться?
VD>Попытался использовать функцию MoveRight, но она а) переходит по отображаемым символам (куда могут входить, например комментарии), б) некорректно (для моей задачи) ведет себя в таблицах с объеденных колонками или строками.

VD>Поясню почему именно так...

VD>Я обрабатываю Word XML. Делаю это напрямую читая файл, а не через атомэйшон, так как это в сто раз быстрее и дает больше возможностей.
VD>В некоторых случаях появляются ошибки (не поддерживаемые теги или стили и т.п.). Мне нужно сделать список ошибок и показать его пользователю. При этом пользователь должен иметь возможность кликнуть на описание ошибки и перейти к месту в одкументе где она возникла (короче, как в IDE).

А если использовать ActiveDocument.Characters(i).Select, где i = 1...N — позиция символа? Не плохо бы иметь пример, в котором нужно встать на определенную позицию.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Как перейти на n-ый символ документа Word?
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.01.10 08:14
Оценка:
Здравствуйте, 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.

В общем, буду экспериментировать...

Спасибо за помощь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.