Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > вопросы по RichTextBox


Автор: PaZ1T1V 3.4.2008, 18:26
Сабж, делаю приложение, напоминающее простенькиц текстовый редактор

1. есть компонент тулстрип на нем есть много кнопок сохранить загрузить копи паст кут клир, ундо(сделано), есть еще и кнопки болд, италик, андерлайн, собствено к зада4е если раз кликнули на нее то ее 4екед  =true и текст становится жирным(про болд), а как сделать, 4тобы она становилась false, то есть как ето отработать???

2.реализовать кнопки find, find & replace... сабж 

3. наетой же панеле есть еще 2 комбобокса, в одном размеры шрифта а в другом названия, как менять

Подскажите плз!!

ЗЫ заране благодарен!!!

Автор: mr.DUDA 3.4.2008, 20:02
Модератор: Пожалуйста, один топик - один вопрос.

Автор: PaZ1T1V 3.4.2008, 20:28
Да, да, знаю, сорри... но все же....... хелп ме плиз, кстати  на вопрос

1. есть компонент тулстрип на нем есть много кнопок сохранить загрузить копи паст кут клир, ундо(сделано), есть еще и кнопки болд, италик, андерлайн, собствено к зада4е если раз кликнули на нее то ее 4екед  =true и текст становится жирным(про болд), а как сделать, 4тобы она становилась false, то есть как ето отработать???

я сам ответил 

Код


public Form1()
        {
            InitializeComponent();
            ...................
            this.toolStripButton10.CheckedChanged += new EventHandler(toolStripButton10_CheckedChanged);
            this.toolStripButton10.CheckOnClick = true;
        }

private void toolStripButton10_CheckedChanged(object sender, EventArgs e)
        {
            if (toolStripButton10.Checked)
            {
                if (richTextBox1.SelectedText != "")
                {
                    Font newFont = new Font(richTextBox1.Font, FontStyle.Bold);
                    richTextBox1.SelectionFont = newFont;
                }
            }
            else
            {
                Font newFont = new Font(richTextBox1.Font, FontStyle.Regular);
                richTextBox1.SelectionFont = newFont;
            }
        }



буду ждать ответы на следующие вопросы

ЗЫ модеры не закрывайте плз тему!!!!

ЗЗЫ сорри за нарушение правил smile))) 

Автор: vponomarov 3.4.2008, 20:38
Цитата(PaZ1T1V @  3.4.2008,  20:28 Найти цитируемый пост)
я сам ответил 

ну ок, так ты поменял жирность всего текста, а куски текста у тебя не могут иметь разную жирность?
тот же вопрос и про стиль и размер шрифта.


Цитата(PaZ1T1V @  3.4.2008,  18:26 Найти цитируемый пост)
2.реализовать кнопки find, find & replace... сабж 

Код

private void searchButton_Click(object sender, EventArgs e)
        {
            if (criteriaBox.Text.Length == 0)
                return;
            historyBox.SelectionBackColor = Color.Transparent;

            RichTextBoxFinds options = RichTextBoxFinds.None;
            if (registrBox.Checked)
                options = RichTextBoxFinds.MatchCase;
            if (wholeBox.Checked)
                options |= RichTextBoxFinds.WholeWord;
            __searchStart = historyBox.Find(criteriaBox.Text, __searchStart, options);
            if (__searchStart >= 0)
            {
                historyBox.Select(__searchStart, criteriaBox.Text.Length);
                historyBox.SelectionBackColor = Color.Red;
            }
            else
                MessageBox.Show("По вашему запросу ничего не найдено!");
            ++__searchStart;
        }

это моя реализация find next
если нужен реплэйс - после каждого поиска делаешь что-то типа richTextBox.SelectedText="replace string"
идея ясна?

Цитата(PaZ1T1V @  3.4.2008,  18:26 Найти цитируемый пост)
3. наетой же панеле есть еще 2 комбобокса, в одном размеры шрифта а в другом названия, как менять

Код

public static string InsertText(string txt, Font fnt, Color clr)
        {
            System.Windows.Forms.RichTextBox txtBox = new System.Windows.Forms.RichTextBox();
            System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex("\n");
            int numNewLines = r.Matches(txt).Count;

            txtBox.AppendText(txt);
            txtBox.Select(txtBox.TextLength - txt.Length+numNewLines, txt.Length);
            //Font tmpFnt = txtBox.SelectionFont;
            txtBox.SelectionFont = fnt;
            //Color tmpClr = txtBox.SelectionColor;
            txtBox.SelectionColor = clr;
            
            /*txtBox.DeselectAll();
            txtBox.SelectionFont = tmpFnt;
            txtBox.SelectionColor = tmpClr;*/

            txtBox.SelectAll();
            return txtBox.SelectedRtf;
        }

вот так я добавляю текст с заданым стилем
думаю легко доработаешь под свои нужды smile 

Автор: PaZ1T1V 3.4.2008, 20:45

Цитата

ну ок, так ты поменял жирность всего текста, а куски текста у тебя не могут иметь разную жирность?
тот же вопрос и про стиль и размер шрифта.


да, есть такое, но когда отжимаешь кнопку "bold", то дальше текст идет нормальный, обы4ный тоесть

Цитата

идея ясна?


ну канешна ясна

еще вопрос, реализация оного 

•    выравнивание (справа, центр, слева) текущей строки.

какова ???

Автор: vponomarov 3.4.2008, 21:12
PaZ1T1V, а если я кликну на жирный текст кнопка загорится? а если не на жирный - пропадет?
если да, то поделись рецептом smile

Добавлено через 1 минуту и 42 секунды
Цитата(PaZ1T1V @  3.4.2008,  20:45 Найти цитируемый пост)
•    выравнивание (справа, центр, слева) текущей строки.


txtBox.SelectionAlignment = System.Windows.Forms.HorizontalAlignment.Center;

Автор: PaZ1T1V 3.4.2008, 21:19
Цитата

txtBox.SelectionAlignment = System.Windows.Forms.HorizontalAlignment.Center;


ето то я знаю, но я работаю в ри4текстбоксе, а как там определить строку, в которой сьтоит каретка, пока не знаю ???

знаю только вот 4то

Код


int x, y;
            if (richTextBox1.Text != "")
            {
                string[] mas = richTextBox1.Text.Substring(0, richTextBox1.SelectionStart - 1).Split('\n');
                x = mas.Length;
                y = mas[x - 1].Length + 1;
                toolStripStatusLabel3.Text = x.ToString();
                toolStripStatusLabel5.Text = y.ToString();
            }
            else
            {
                x = 0; y = 0;
                toolStripStatusLabel3.Text = x.ToString();
                toolStripStatusLabel5.Text = y.ToString();
            }



типа определяет сколько символов мы написали


Цитата

PaZ1T1V, а если я кликну на жирный текст кнопка загорится? а если не на жирный - пропадет?


нет, до етого дело еще не дошло, а жаль..... хотелось бы знать как ето делается ))0 

Автор: vponomarov 4.4.2008, 14:19
PaZ1T1V, так тебе и не надо знать где стоит каретка.
идея предложенного подхода заключается в том, что ты выделяешь нужный тебе кусок текста (к нему можно обратиться через свойство SelectedText), а потом задаешь ему стиль (шрифт, цвет, выравнивание)

Автор: PaZ1T1V 4.4.2008, 18:39
и ето тоже верно, но если у меня есть конкретный вопрос, сделать алигмент у какой нибудь определенной строки, где стоит каретка, как ето сделать ? 

Автор: vponomarov 4.4.2008, 22:39
PaZ1T1V, ок, без вопросов.
вот так вот выделяешь текст с текущего положения курсора до конца строки:
Код

            int l=txtBox.Find("\n", txtBox.SelectionStart, System.Windows.Forms.RichTextBoxFinds.None);
            l = l == -1 ? txtBox.TextLength : l;
            txtBox.Select(txtBox.SelectionStart, l-txtBox.SelectionStart);

Автор: PaZ1T1V 16.4.2008, 14:37
бааааааа запутался 4е то с поиском в обратную сторону(Find.Reverse) (((( 

Код


searchStart = 1;
                this.form1.findValue = findBox.Text;
                if (this.form1.findValue.Length == 0)
                    return;

                this.form1.richTextBox1.Select(searchStart, form1.findValue.Length);
                this.form1.richTextBox1.SelectionBackColor = findBox.BackColor;

                searchStart = form1.richTextBox1.Find(this.form1.findValue, searchStart, -1, RichTextBoxFinds.Reverse);

                if (searchStart <= form1.richTextBox1.Text.Length)
                {
                    this.form1.richTextBox1.Select(searchStart, form1.findValue.Length);
                    this.form1.richTextBox1.SelectionBackColor = Color.Gray;
                    this.form1.richTextBox1.Select(searchStart + 2, form1.findValue.Length);
                    this.form1.richTextBox1.SelectionBackColor = findBox.BackColor;
                }
                else
                    MessageBox.Show("По вашему запросу ничего не найдено!");
                searchStart -= (findBox.Text.Length + 1);
                if (searchStart < 0)
                {
                    MessageBox.Show("Просмотр документа закончен");
                    searchStart = form1.richTextBox1.Text.Length;
                }



знаю 4то тут половина ненужного

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

Автор: vponomarov 16.4.2008, 17:14
Код

searchStart = form1.richTextBox1.TExt.Length;
searchStart = form1.richTextBox1.Find(this.form1.findValue, searchStart, RichTextBoxFinds.Reverse);

Автор: PaZ1T1V 16.4.2008, 18:08
ну я, если ты заметил так и пишу, тока полу4ается не файнд некст с низу вверх а просто файнд, то есть находит первое попавшееся заданное слово и дальше не двигается

а на етот вопрос ответ найдется ??

Цитата

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

Автор: vponomarov 16.4.2008, 21:00
ок, так заметнее будет?
Код

searchStart = form1.richTextBox1.Find(this.form1.findValue, form1.richTextBox1.TExt.Length, RichTextBoxFinds.Reverse);

Автор: vponomarov 17.4.2008, 09:45
Цитата(PaZ1T1V @  16.4.2008,  14:37 Найти цитируемый пост)
+ вопрос, как узнать в какой строке находится выделеный елемент 

Код

form1.richTextBox1.GetLineFromCharIndex(form1.richTextBox1.SelectionStart);

Автор: PaZ1T1V 17.4.2008, 16:14
написал, все как мне было сказано, один 4ерт не работает как надо, находит первый елемент и дальше не двигается ((((((( 

Код


//searchStart = form1.richTextBox1.Text.Length; нельзя етого делать 
this.form1.findValue = findBox.Text;
                if (this.form1.findValue.Length == 0)
                    return;
searchStart = form1.richTextBox1.Find(this.form1.findValue, searchStart, RichTextBoxFinds.Reverse );

                if (searchStart <= form1.richTextBox1.Text.Length)
his.form1.richTextBox1.Select(searchStart, form1.findValue.Length);
                    this.form1.richTextBox1.SelectionBackColor = Color.Gray;
} else
                    MessageBox.Show("По вашему запросу ничего не найдено!");
                ++searchStart; // при --searchStart тоже не работает
                this.form1.listBox1.Items.Add("searchStart " + searchStart.ToString());
                if (searchStart <= 0 )
                {
                    MessageBox.Show("Просмотр документа закончен");
                    searchStart = form1.richTextBox1.Text.Length;
                }

в общем как не крути, а все одно полу4ается файнд а нефайнд некст)))))))

Автор: vponomarov 17.4.2008, 21:07
PaZ1T1V, блин, ну а подумать? smile 
метод richTextBox.Find ищет указанный текст начиная с заданной позиции.
если ты ему будишь указывать один и тотже searchStart=richTextBox1.Text.Length то понятное дело, что он будет находить одно и тоже, т.е. первое вхождение.
для того чтобы реализовать Find NExt 
1. можно сделать переменную searchStart глобальной, присвоить ей начальное значение richTextBox1.Text.Length и потом изменять ее как написано в твоем коде searchStart = form1.richTextBox1.Find(this.form1.findValue, searchStart, RichTextBoxFinds.Reverse );
2. (этот вариант мне нравится больше) searchStart = form1.richTextBox1.Find(this.form1.findValue, richTextBox1.SelectionStart, RichTextBoxFinds.Reverse );

если что-то не так понял, то извени smile 

Автор: PaZ1T1V 18.4.2008, 06:51
я думал над етим и пришол к тому же времени; когда я пытаюсь написать обратный поиск я уменьшаю етот сеар4старт

++searchStart; // при --searchStart тоже не работает
ето тут неправильно надо так
--searchStar

вроде дожно все работать, ан нет, находит первое попавшееся слово и останавливается на нем сколько бы я не жал на кнопку 

Автор: vponomarov 18.4.2008, 10:17
PaZ1T1V, перечитай пожалуйста внимательно мой последний пост и сделай, как я сказал smile 

Автор: PaZ1T1V 18.4.2008, 15:44
пере4итал, сделал как ты сказал, все одно и тоже, может ты выложиш сюда готовый код етого поиска ? 

Автор: vponomarov 18.4.2008, 17:52
Код

this.form1.findValue = findBox.Text;
                if (this.form1.findValue.Length == 0)
                    return;
searchStart = form1.richTextBox1.Find(this.form1.findValue, richTextBox1.SelectionStart, RichTextBoxFinds.Reverse );

                if (searchStart <= form1.richTextBox1.Text.Length)
his.form1.richTextBox1.Select(searchStart, form1.findValue.Length);
                    this.form1.richTextBox1.SelectionBackColor = Color.Gray;
} else
                    MessageBox.Show("По вашему запросу ничего не найдено!");
                this.form1.listBox1.Items.Add("searchStart " + searchStart.ToString());
                if (searchStart <= 0 )
                {
                    MessageBox.Show("Просмотр документа закончен");
                    searchStart = form1.richTextBox1.Text.Length;
                }

Автор: PaZ1T1V 21.4.2008, 21:38
именно так написал и не работает )))))))

Автор: vponomarov 21.4.2008, 22:25
PaZ1T1V, держи. вот это точно работает smile 
Код

string findValue = findBox.Text;
            if (findValue.Length == 0)
                return;

            int searchStart = richTextBox1.Find(findValue,0, richTextBox1.SelectionStart, RichTextBoxFinds.Reverse);
            if (searchStart >= 0)
                richTextBox1.SelectionBackColor = Color.Red;
            else
            {
                MessageBox.Show("По вашему запросу ничего не найдено!");
                richTextBox1.Select(richTextBox1.Text.Length, 0);
            }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)