.NET - Замена 2х-3х подряд идущих слов одним

Аватара пользователя
Marsella_88

.NET - Замена 2х-3х подряд идущих слов одним

Сообщение Marsella_88 »

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



Заранее спасибо! Изображение
Аватара пользователя
Iska

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение Iska »

Цитата Marsella_88:



Проблема в том, что если выделено несколько слов подряд, то заменяется каждое отдельно…
.NET - Замена 2х-3х подряд идущих слов одним




Начните с того, что приведите Ваш код.
Аватара пользователя
lxa85

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение lxa85 »

дурацкий ворд, обкуренные, обколотые создатели этой дурацкой автоматизации и психоделики! И т.д. и т.п.

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, и следующие за ним попадает на его место.

Пример: Текст - просто черный текст

Желтый - некоторой текст с желтым выделением

- индекс слова в массиве 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 - это слово "конец". Его необходимо будет закрасить белым, и шрифту также назначить белый цвет. Т.е. вроде как есть, а вроде как и не видно. Либо заменить другим кодовым словом.

Большой вопрос с конечному оформлению документа. Оно(оформление) поплывет.



Изображение надеюсь поможет
Аватара пользователя
Marsella_88

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение Marsella_88 »

Код:

Код: Выделить всё

            // активный 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

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение Marsella_88 »

Очень нужна помощь, подскажите, а то на этой неделе уже сдавать...
Аватара пользователя
lxa85

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение lxa85 »

Marsella_88, выложите проект, формы, тестовые файлы и т.д.

Чтобы можно было дебажить алгоритм в приближенных вам условиях.

И чтобы не думалось, куда эту процедуру использовать и куда передавать результат.

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

Где-то в пробелах ошибка ИМХО. Глаз вроде "спотыкается", но точно сказать не могу.

На спокойную голову в четверг.
Аватара пользователя
Marsella_88

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение Marsella_88 »

Готово!
Вложения
проект.rar
(53.14 КБ) 0 скачиваний
проект.rar
(53.14 КБ) 0 скачиваний
Аватара пользователя
lxa85

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение lxa85 »

Marsella_88, спасибо. Проект открывается, в четверг на трезвую голову буду разбирать. Ранее, извини, никак.

Только если коллеги помогут.
Аватара пользователя
Marsella_88

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение Marsella_88 »

Буду ждать. может и саму осенит Изображение Заранее спасибо )
Аватара пользователя
Marsella_88

Re: .NET - Замена 2х-3х подряд идущих слов одним

Сообщение Marsella_88 »

Очень жду каких-нибудь известий....
Ответить

Вернуться в «Программирование и базы данных»