Войти

Показать полную графическую версию : Замена 2х-3х подряд идущих слов одним


Marsella_88
28-05-2012, 10:13
Всем Доброго времени суток! У меня есть программа, суть ее такова: берется вордовский документ, в нем выделяются слова желтым цветом, а потом при нажатии на кнопку заменяются тегами. Проблема в том, что если выделено несколько слов подряд, то заменяется каждое отдельно, а мне нужно чтобы одним заменялось. Как выполнить проверку на непрерывность выделения не могу найти... может кто подскажет?

Заранее спасибо! :)

Iska
28-05-2012, 10:36
Проблема в том, что если выделено несколько слов подряд, то заменяется каждое отдельно… »
Начните с того, что приведите Ваш код.

Marsella_88
28-05-2012, 11:05
// активный word-документ
Word.Document thisDocument = thisApplication.ActiveDocument;
// заменяем на Тег
string find = "{Тег_";
// счетчик
int s = 0;

// цикл поиска выделений в word-документе
foreach (Word.Range Range_1 in thisDocument.Words)
{
// проверка этого выделения на цвет
if (Range_1.HighlightColorIndex == Word.WdColorIndex.wdYellow)
{
// сюда записываем выделенное слово
string slovo_1 = Range_1.Text;
s = s + 1;
// запись слова в textBox
textBox1.Text += slovo_1 + Environment.NewLine;
// запись тегов в textBox1
textBox2.Text += "{Тег_" + s + "}" + Environment.NewLine;

// запускаем второй цикл для нахождения одинкаовых выделенных слов
foreach (Word.Range Range_2 in thisDocument.Words)
{
// проверка выделения на цвет
if (Range_2.HighlightColorIndex == Word.WdColorIndex.wdYellow)
{
string slovo2 = Range_2.Text;
// проверка "одинааковые ли выделенные слова"
if (slovo_1 == slovo2)
{
// замена выделенного слова на Тег
Range_2.Text = find + s + "} ";
// обесцвечиваем фон за текстом
Range_2.HighlightColorIndex = Word.WdColorIndex.wdWhite;
}
}
}

}
}

Marsella_88
28-05-2012, 20:53
Очень нужна помощь, подскажите, а то на этой неделе уже сдавать...

lxa85
28-05-2012, 21:49
Marsella_88, выложите проект, формы, тестовые файлы и т.д.
Чтобы можно было дебажить алгоритм в приближенных вам условиях.
И чтобы не думалось, куда эту процедуру использовать и куда передавать результат.
Сделайте простенький проект-заготовку, чтобы нам было удобно помогать вам.
Где-то в пробелах ошибка ИМХО. Глаз вроде "спотыкается", но точно сказать не могу.
На спокойную голову в четверг.

Marsella_88
28-05-2012, 22:19
Готово!

lxa85
28-05-2012, 22:56
Marsella_88, спасибо. Проект открывается, в четверг на трезвую голову буду разбирать. Ранее, извини, никак.
Только если коллеги помогут.

Marsella_88
28-05-2012, 23:01
Буду ждать. может и саму осенит :) Заранее спасибо )

Marsella_88
01-06-2012, 00:19
Очень жду каких-нибудь известий....

lxa85
01-06-2012, 00:57
Marsella_88, смотрю в оба глаза. :)
30ого защита диссера была, был невменяем.
Сейчас фильмишку фоном включу и за отладку.

lxa85
01-06-2012, 04:08
дурацкий ворд, обкуренные, обколотые создатели этой дурацкой автоматизации и психоделики! И т.д. и т.п.
Marsella_88,
private void button2_Click(object sender, EventArgs e)
{
// активный word-документ
Word.Document thisDocument = thisApplication.ActiveDocument;
// заменяем на Тег
string find = "{Тег_";
string finish = "конец";
string slovo_1 = "";
// счетчик
int s = 0;
int i = 0;

// цикл поиска выделений в word-документе
//foreach (Word.Range Range_1 in thisDocument.Words)
Word.Range Range_1=thisDocument.Words[1];
//Range_1.Text = " ";
while (Range_1.Text!=finish)
{
i=i+1;
Range_1 = thisDocument.Words[i];
// проверка этого выделения на цвет
if (Range_1.HighlightColorIndex == Word.WdColorIndex.wdYellow)
{
while (Range_1.HighlightColorIndex == Word.WdColorIndex.wdYellow)
{
// сюда записываем выделенное слово
slovo_1 = slovo_1+Range_1.Text;
Range_1.Text = "";// это приведет к тому, что выделенное слово станет пустым, это нарушит форматирование документа, но никуда от жтого не деться.
//i = i + 1;
Range_1 = thisDocument.Words[i];

};

s = s + 1;
//Range_1.
далее по тексту

Используя конструкции while получилось добиться того, что выделяются и обрабатываются группы слов. (переделывать поиск дубликатов slovo_1 = slovov_2 я не стал, это не сложно)
Дело в том, что Word, кроме всего прочего относит к слову и следующий за ним пробел, чем делает жизнь интересней (не знаю, то ли радоваться, то ли нет). Это ведет к некоторым подводным камням, как то:
поиск нескольких выделенных слов подряд
while (Range_1.HighlightColorIndex == Word.WdColorIndex.wdYellow)
{
// сюда записываем выделенное слово
slovo_1 = slovo_1+Range_1.Text;
Range_1.Text = "";// это приведет к тому, что выделенное слово станет пустым, это нарушит форматирование документа, но никуда от жтого не деться.
//i = i + 1;
Range_1 = thisDocument.Words[i];

};

Строка Range_1.Text = "" приводит к тому, что значение становиться 'null', индекс слов сдвигается на -1, и следующие за ним попадает на его место.
Пример: Текст - просто черный текст
Желтый - некоторой текст с желтым выделением
[i] - индекс слова в массиве thisDocument.Words
исходник:
1) текст[1] желтый[2] желтый[3]
нашли "желтый", начали выполнять цикл поиска следующих желтых слов
2) slovo_1 = желтый
Range_1.Text="" -> Range_1.Text = null ->
текст[1] желтый[null] желтый[3] -> текст[1] желтый[null] желтый[2] !
Текст в Word примет вид
текст[1] желтый[2]

Вот такая хитрая вещь, поэтому i=i+1 я закомментировал.
Хочется отметить, что если желтое слово стоит в конце строки, то он съестся вместе с переносом строки.
Поэтому надо все желтые слова обрамлять либо пробелами, либо как то оставлять переносы строк.
Это первое. Второе - я ввел в условное слово, по которому прекращается обработка цикла while - это слово "конец". Его необходимо будет закрасить белым, и шрифту также назначить белый цвет. Т.е. вроде как есть, а вроде как и не видно. Либо заменить другим кодовым словом.
Большой вопрос с конечному оформлению документа. Оно(оформление) поплывет.

:dont-know надеюсь поможет

Marsella_88
01-06-2012, 09:08
тьфу, не заметила второй страницы :)

Огромное спасибо за помощь, вечером разберу что к чему :)




© OSzone.net 2001-2012