powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / RichTextBox и выделение
7 сообщений из 7, страница 1 из 1
RichTextBox и выделение
    #39499150
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую!

Я вроде бы здоровый, но лыжи не едут...

Задача проста на столько, что стыдно спрашивать. Есть RichTextBox, в него гружу текстовый файлик (*.txt) в котором есть строки, начинающиеся со слова "Версия", эти строки нужно выделить жирным. ВСЕ! Но почему-то простой код напрочь ушатал мою психику!

Вот, кстати и он:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
            //rtxt = RichTextBox
            string line;
            int index;

            //Загружаем файл
            if (File.Exists(GO.PathStart() + "\\History.txt"))
                rtxt.Text = File.ReadAllText(GO.PathStart() + "\\History.txt", Encoding.Default);
            else
                rtxt.Text = "Не найден файл \"History.txt\"";

            //Проходим в цикле по всем строкам
            for (int i = 0; i < rtxt.Lines.Length; i++)
            {
                line = rtxt.Lines[i]; // Получаем значение строки
                index = rtxt.GetFirstCharIndexFromLine(i); // Получаем индекс первого символа

                rtxt.DeselectAll(); // Сбрасываем выделение
                rtxt.Select(index, index + rtxt.Lines[i].Length); // Выделяем всю строку

                if (line.StartsWith("Версия", StringComparison.CurrentCulture)) // Проверяем строку на условие
                    rtxt.SelectionFont = new System.Drawing.Font(rtxt.Font, System.Drawing.FontStyle.Bold); // Выделяем строку
            }



В чем проблема? Да в том, что правильно выделяется только первая строка, а потом строки выделяются хаотично!
Что самое интересное, иногда index первого символа в следующей строке МЕНЬШЕ, чем длина предыдущей О_о... спасайте...
...
Рейтинг: 0 / 0
RichTextBox и выделение
    #39499194
наутилус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__,

ну как минимум логичней выделять в условии, когда строка вам подходит. а не всегда.

плюс вот это точно ошибка:
Код: c#
1.
index + rtxt.Lines[i].Length


у вас в Length уже вся длинна строки, а вы ей ещё и плюсуете стартовый индекс. т.е. выход за пределы строки.
...
Рейтинг: 0 / 0
RichTextBox и выделение
    #39499195
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__,

для работы с фоматированным текстом нельзя использовать индексы символов, надо использовать курсор для навигации, я не работал в WF, но в WPF для этого есть соответствующие класс и методы навигации, вперёд, назад и т.д.
...
Рейтинг: 0 / 0
RichTextBox и выделение
    #39499205
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наутилус,

Да, моя ошибка, я почему-то подумал, что там нужен индекс последнего символа, а не длина. Спасибо,
НО проблема пока не решена...

Roman Mejtes,

Я тоже об этом подумал, но пока решения не нашел, во всех примерах делают именно так, как и я =(
...
Рейтинг: 0 / 0
RichTextBox и выделение
    #39499206
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наутилус,

и еще... на счет выделения, я так сделал, т.к. нужно выделять не одну строку, условий будет много, производительность здесь не критична, а вот плодить одинаковые строки не хочу ;)
...
Рейтинг: 0 / 0
RichTextBox и выделение
    #39499211
__Pavel__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РЕШЕНИЕ

Оказывается данный БАГ (или так и задумано мелкомягкими) был из-за включенного переноса слов !

Вот рабочий код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
            //rtxt = RichTextBox
            string line;
            int index;

            rtxt.WordWrap = false; // Отключаем перенос слов

            //Загружаем файл
            if (File.Exists(GO.PathStart() + "\\History.txt"))
                rtxt.Text = File.ReadAllText(GO.PathStart() + "\\History.txt", Encoding.Default);
            else
                rtxt.Text = "Не найден файл \"History.txt\"";
            
            //Проходим в цикле по всем строкам
            for (int i = 0; i < rtxt.Lines.Length; i++)
            {
                line = rtxt.Lines[i]; // Получаем значение строки
                index = rtxt.GetFirstCharIndexFromLine(i); // Получаем индекс первого символа

                rtxt.DeselectAll(); // Сбрасываем выделение
                rtxt.Select(index, line.Length); // Выделяем всю строку

                if (line.StartsWith("Версия", StringComparison.CurrentCulture)) // Проверяем строку на условие
                    rtxt.SelectionFont = new System.Drawing.Font(rtxt.Font, System.Drawing.FontStyle.Bold); // Выделяем строку
            }

            rtxt.WordWrap = true; //Включаем перенос слов
...
Рейтинг: 0 / 0
RichTextBox и выделение
    #39499486
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Pavel__ РЕШЕНИЕ

Оказывается данный БАГ (или так и задумано мелкомягкими) был из-за включенного переноса слов !

Вот рабочий код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
            //rtxt = RichTextBox
            string line;
            int index;

            rtxt.WordWrap = false; // Отключаем перенос слов

            //Загружаем файл
            if (File.Exists(GO.PathStart() + "\\History.txt"))
                rtxt.Text = File.ReadAllText(GO.PathStart() + "\\History.txt", Encoding.Default);
            else
                rtxt.Text = "Не найден файл \"History.txt\"";
            
            //Проходим в цикле по всем строкам
            for (int i = 0; i < rtxt.Lines.Length; i++)
            {
                line = rtxt.Lines[i]; // Получаем значение строки
                index = rtxt.GetFirstCharIndexFromLine(i); // Получаем индекс первого символа

                rtxt.DeselectAll(); // Сбрасываем выделение
                rtxt.Select(index, line.Length); // Выделяем всю строку

                if (line.StartsWith("Версия", StringComparison.CurrentCulture)) // Проверяем строку на условие
                    rtxt.SelectionFont = new System.Drawing.Font(rtxt.Font, System.Drawing.FontStyle.Bold); // Выделяем строку
            }

            rtxt.WordWrap = true; //Включаем перенос слов



имхую, что лучше проверить и сохранить состояние флага
rtxt.WordWrap = false ; // Отключаем перенос слов

а потом возвращать предыдущее, если нужно.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / RichTextBox и выделение
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]