2016-01-21 2 views
1

Я хочу разработать надстройку MS Word 2010 (2013/2016), которая работает как инструмент проверки орфографии (восстанавливает символы акцента) для турецкого текста. Я хочу дать 3 варианта (через контекстное меню) пользователям использовать этот инструмент.Как манипулировать Word Word Word Word

  • исправить весь текст в документе. (включая те, что указаны в таблицах и списках и т. д.)
  • исправить весь текст в выбранной области
  • исправить слово в позиции курсора.

Для первого варианта я пытался перебирать все слова и закрепить их по одному с помощью следующего кода:

var words = App.ActiveDocument.Words; 

foreach (Range word in words) 
{ 
    var corr = MyCorrecter(word.Text); 
    word.Select(); 
    App.Selection.TypeText(corr); 
} 

Однако это застрявшей в бесконечной петле. word.Next() всегда возвращает первое слово. Если я удалю строку word.Text = MyCorrecter(word.Text);, код успешно повторит все слова. Существуют примеры поиска/замены, но они не очень эффективны для этого конкретного случая.

Одним словом, что является самым эффективным способом манипулирования словами один за другим в Word Document?

+1

@stuartd Код выше, за исключением строки 'word.Text = MyCorrecter (word.Text);', также проходит через каждое слово. Но когда я устанавливаю текст слова, это не работает. – hrzafer

+0

какой «не работает» - текст не изменился, есть ошибка, или ..? – stuartd

+0

@stuartd Я редактировал вопрос. Пожалуйста, перечитайте абзац прямо под кодом. – hrzafer

ответ

1

Для такого рода ситуаций, когда вы фактически меняете содержимое целевого диапазона («слово»), вам нужно работать с циклом, который «подсчитывается» с помощью индекса. Например:

Word.Words words = app.ActiveDocument.Words; 
int iWordCount = words.Count; 
Word.Range rngWord = null; 
for (int i = 1; i<= iWordCount; i++) 
{ 
    rngWord = words[i] 
    var corr = MyCorrecter(rngWord.Text); 
    rngWord.Text = corr; 
} 
//When you're done, dont' forget to release the COM objects 
rngWord = null; 
words = null; 

Я настоятельно рекомендую вам не использовать Выбор или выделение в вашем коде, если то, что вам нужно сделать, не может быть сделано любым другим способом. Назначьте непосредственно объекту Range.Text.

Обратите внимание, что в Word есть ситуации, когда он помогает выполнить цикл назад через документ (начиная с самого высокого счетчика до самого низкого). Однако я думаю, что эта ситуация будет работать вперед.

+0

«Я настоятельно рекомендую вам НЕ использовать Select или Selection в вашем коде, если только то, что вам нужно сделать, не может быть сделано каким-либо другим способом. Назначьте непосредственно объекту Range.Text». Можете рассказать об этом? – hrzafer

+1

Выбор имеет тенденцию быть более медленным в исполнении. Это не так надежно - пользователь может щелкнуть по документу/это может быть не так, как вы думаете. В более поздний момент или для кого-то еще неясно, что делает код и где. У вас может быть только один выбор. В Word.Application, но несколько диапазонов. –

Смежные вопросы