forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Помогите разобраться с RTB (http://forum.boolean.name/showthread.php?t=18907)

Dark Dragon 02.02.2014 21:11

Помогите разобраться с RTB
 
Пишу приложение в котором необходимо в RichTextBox выводить текст в разном форматировании. На первой строке к примеру красные буквы привязанные к левому краю, а на второй зеленые буквы привязанные к правому краю. И затем так далее. Я написал такой код:
Код:

      int Th()
            {
              string say = "bla bla bla";               
                Dialogbox.Text += say + Environment.NewLine;
                int my1stPosition = Dialogbox.Text.Length - say.Length-1;
                Dialogbox.SelectionStart = my1stPosition;
                Dialogbox.SelectionLength = say.Length;
                Dialogbox.SelectionColor = Color.Green;
                Dialogbox.SelectionAlignment = HorizontalAlignment.Right;
            }

        private void button1_Click(object sender, EventArgs e)
        {
            string say = message.Text;
            if (say != "")
            {
                Dialogbox.Text += say + Environment.NewLine;
                int my1stPosition = Dialogbox.Text.Length - say.Length - 1;
                Dialogbox.SelectionStart = my1stPosition;
                Dialogbox.SelectionLength = say.Length;
                Dialogbox.SelectionColor = Color.Red;
                Dialogbox.SelectionAlignment = HorizontalAlignment.Left;
                message.Text = "";
                Th();
            }

Кнопка берет данные с текстбокса и запихивает его в RTB попутно обрабатывая. Затем вызывается функция ответа, которая пишет строчку и обрабатывает уже ее. Вопрос: почему в результате после второго, третьего и т.д. ввода данных предыдущий текст становится красным и привязанным к левому краю?

Dark Dragon 02.02.2014 23:20

Ответ: Помогите разобраться с RTB
 
Даже если я делаю так:
Код:

private void button1_Click(object sender, EventArgs e)
        {  int i = 0;
        for (; i < 10; i++)
        {
            string say = "dasas";
            Dialogbox.Text += say + Environment.NewLine;
            int my1stPosition = Dialogbox.Text.Length - say.Length -1;
            Dialogbox.SelectionStart = my1stPosition;
            Dialogbox.SelectionLength = say.Length;
            Dialogbox.SelectionColor = Color.Red;
            Th();
            say = "bla bla bla";
            Dialogbox.Text += say + Environment.NewLine;
            int my2ndPosition = Dialogbox.Text.Length - say.Length - 1;
            Dialogbox.SelectionStart = my2ndPosition;
            Dialogbox.SelectionLength = say.Length;
            Dialogbox.SelectionColor = Color.Green;
            Dialogbox.SelectionAlignment = HorizontalAlignment.Right;
        }

Ничего не меняется.

Жека 03.02.2014 07:02

Ответ: Помогите разобраться с RTB
 
Может порядок команд значение имеет? Сначала поставить SelectionAlignment а потом SelectionStart, SelectionLength.

Dark Dragon 03.02.2014 19:27

Ответ: Помогите разобраться с RTB
 
Конечно порядок кода имеет значение. SelectionStart определяет начальную область для изменения. SelectionLength - конечную точку. Их обязательно ставить перед тем как изменять выбранный сегмент.

Dark Dragon 03.02.2014 20:04

Ответ: Помогите разобраться с RTB
 
Только не говорите что это так RTB издевается и это никак не исправить. Это же бред! Я прогнал весь код в отладочном режиме: ни одного несоответствия переменных. Он правильно находит первую и последнюю точки. И все равно окрашивает до зеленой строки все в красный цвет.

johnk 04.02.2014 07:07

Ответ: Помогите разобраться с RTB
 
что это? winforms, wpf, silverlight?

Dark Dragon 04.02.2014 18:01

Ответ: Помогите разобраться с RTB
 
Windows Forms разрабатываемая на Visual Studio 2012.

johnk 05.02.2014 15:21

Ответ: Помогите разобраться с RTB
 
Цитата:

Сообщение от Dark Dragon (Сообщение 273620)
Конечно порядок кода имеет значение. SelectionStart определяет начальную область для изменения. SelectionLength - конечную точку.

Цитата:

Сообщение от Dark Dragon (Сообщение 273620)
SelectionLength - конечную точку.

Нет. SelectionLength - это количество символов начиная с SelectionStart, которые будут выбраны.

johnk 05.02.2014 15:50

Ответ: Помогите разобраться с RTB
 
Вложений: 1
Написал свой пример, как раз для VS2012. Смотри аттач.

Твоя ошибка была в том, что текст ты в RTB добавлял так: Dialogbox.Text += say + Environment.NewLine;
Надо было через AppendText.

Код:

var additionalText = "Новый абзац\n";

var start = MyTextBox.Text.Length;
var length = additionalText.Length;

MyTextBox.AppendText(additionalText);

MyTextBox.Select(start, length);
MyTextBox.SelectionColor = Color.FromArgb(random.Next(256), random.Next(256), random.Next(256));


Dark Dragon 05.02.2014 22:05

Ответ: Помогите разобраться с RTB
 
Цитата:

Сообщение от johnk (Сообщение 273723)
Написал свой пример, как раз для VS2012. Смотри аттач.

Твоя ошибка была в том, что текст ты в RTB добавлял так: Dialogbox.Text += say + Environment.NewLine;
Надо было через AppendText.

Код:

var additionalText = "Новый абзац\n";

var start = MyTextBox.Text.Length;
var length = additionalText.Length;

MyTextBox.AppendText(additionalText);

MyTextBox.Select(start, length);
MyTextBox.SelectionColor = Color.FromArgb(random.Next(256), random.Next(256), random.Next(256));


Спасибо за помощь.
Однако все равно не понимаю почему оператор "+=" создает такие ошибки.

johnk 06.02.2014 07:46

Ответ: Помогите разобраться с RTB
 
Цитата:

Сообщение от Dark Dragon (Сообщение 273748)
Спасибо за помощь.
Однако все равно не понимаю почему оператор "+=" создает такие ошибки.

Не знаю. Хочешь, пошарься в сорсах. Вот AppendText, к примеру:
Код:

if (text.Length <= 0)
  return;
int start;
int length;
this.GetSelectionStartAndLength(out start, out length);
try
{
  int endPosition = this.GetEndPosition();
  this.SelectInternal(endPosition, endPosition, endPosition);
  this.SelectedText = text;
}
finally
{
  if (this.Width == 0 || this.Height == 0)
      this.Select(start, length);
}

По-моему вполне удовлетворительно, что оно и так работает :)


Часовой пояс GMT +4, время: 04:49.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot