Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Замена 2х-3х подряд идущих слов одним (http://forum.oszone.net/showthread.php?t=235507)

Marsella_88 28-05-2012 10:13 1923790

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

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

Iska 28-05-2012 10:36 1923799

Цитата:

Цитата Marsella_88
Проблема в том, что если выделено несколько слов подряд, то заменяется каждое отдельно… »

Начните с того, что приведите Ваш код.

Marsella_88 28-05-2012 11:05 1923812

Код:

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

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

lxa85 28-05-2012 21:49 1924145

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

Marsella_88 28-05-2012 22:19 1924157

Вложений: 1
Готово!

lxa85 28-05-2012 22:56 1924184

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

Marsella_88 28-05-2012 23:01 1924188

Буду ждать. может и саму осенит :) Заранее спасибо )

Marsella_88 01-06-2012 00:19 1925821

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

lxa85 01-06-2012 00:57 1925832

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

lxa85 01-06-2012 04:08 1925854

дурацкий ворд, обкуренные, обколотые создатели этой дурацкой автоматизации и психоделики! И т.д. и т.п.
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 1925898

тьфу, не заметила второй страницы :)

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


Время: 06:08.

Время: 06:08.
© OSzone.net 2001-