Практична робота 3

         Метою даної практичної роботи буде навчитися елементарним методам роботи із текстами, тому ми напишемо додаток «Блокнот».

         І так, почнемо. Наш блокнот буде підтримувати елементарні методи керування файлами, тобто зчитувати та записувати в файл, можна буде налаштувати вигляд шрифту, пошук та заміну текстових фрагментів. Для цього нам потрібно буде три форми – перша головна, із меню та багаторядковим редактором, інші дві будуть слугувати інтерфейсами для пошуку тексту та заміни тексту відповідно. Зараз будуть приведені всі форми із підписаними компонентами, щоб ви розуміли яка подія буде закріплена за якою компонентою.

         Наведені на малюнках англійські підписи компонент, та повідомлень мають бути замінені на українські.

Головна форма

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTMLe62701.PNG

Невізуальні компоненти які також потрібно додати

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTMLe7a8fe.PNG

Меню «файл» головної форми

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTMLe80641.PNG

Меню «вид» головної форми

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTMLe90949.PNG

Меню «Редагування» головної форми

Меню «пошук» головної форми

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTMLe9e3ea.PNG

Форма пошуку тексту та її компоненти

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTMLea5baa.PNG

Форма пошуку та заміни тексту та її компоненти

         Тепер опишемо події кожної із форм.

public partial class Form1 : Form

 {

  public bool edt=false;//маркер редагованого файлу

 

  public Form1() //конструктор форми

   {

    InitializeComponent();

   }

 

  private void newToolStripMenuItem_Click(object sender, EventArgs e) //елемент меню створення нового файлу

   {

    if (!edt) //якщо документ не змінювався

     { richTextBox1.Clear();/* Очищуемо текст в багаторядковому редакторі */ }

       else

     {//якщо текст змінювався

      //нагадуємо користувачу що зміни пропадуть

      if (MessageBox.Show("Text changed - continue?", "Qestion", MessageBoxButtons.YesNoCancel) == DialogResult.Yes)

      richTextBox1.Clear(); //якщо користувач натиснув "Так"

     }

           

    }

 

  private void openToolStripMenuItem_Click(object sender, EventArgs e) //елемент меню відкрити

  {

   if (openFileDialog1.ShowDialog() == DialogResult.OK)//показуємо стандартне вікно відкриття файлу

    {

     //якщо файл вибрано

     richTextBox1.LoadFile(openFileDialog1.FileName);//відкриваємо файл

    }

  }

 

  private void saveToolStripMenuItem_Click(object sender, EventArgs e)//елемент меню зберегти

   {

    if (saveFileDialog1.ShowDialog() == DialogResult.OK)//показуємо стандартне вікно відкриття файлу

     {

      //якщо вибрано ім’я файлу

      richTextBox1.SaveFile(saveFileDialog1.FileName);//зберігаємо файл

      edt = false;//прописуємо, що текст не змінений

     }

   }

 

  private void richTextBox1_TextChanged(object sender, EventArgs e)//подія зміни тексту багаторядкового редактора

   {

    edt = true;//прописуємо, що відбулася зміна

   }

 

  private void fontToolStripMenuItem_Click(object sender, EventArgs e)//елемент меню шрифт

   {

    if (fontDialog1.ShowDialog() == DialogResult.OK) //показуємо стандартне вікно шрифтів

     //якщо новий шрифт вибрано

     richTextBox1.Font = fontDialog1.Font;//змінюємо шрифт редактора

   }

 

  private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)//елемент меню вибрати все

   {

    richTextBox1.SelectAll();//виділяємо весь текст компоненти

   }

 

  private void cutToolStripMenuItem_Click(object sender, EventArgs e)//елемент меню вирізати

   {

    Clipboard.SetText(richTextBox1.SelectedText);//копіюємо текст в буфер обміну

    richTextBox1.SelectedText = "";//очищаємо вибраний фрагмент тексту

   }

 

  private void copyToolStripMenuItem_Click(object sender, EventArgs e)//елемнт меню копіювати

   {

    Clipboard.SetText(richTextBox1.SelectedText);//копіюємо текст в буфер обміну

   }

 

  private void pasteToolStripMenuItem_Click(object sender, EventArgs e)//елемент меню вставити

   {

    richTextBox1.SelectedText=Clipboard.GetText();//вставляємо текст в поточну позицію курсору

   }

 

  private void findToolStripMenuItem_Click(object sender, EventArgs e)//елемент меню пошук

   {

    Form2 f2 = new Form2(richTextBox1);//ініціалізуємо форму пошуку

    f2.ShowDialog();//показуємо вікно модально

   }

 

  private void replaceToolStripMenuItem_Click(object sender, EventArgs e) //елемент меню замінити

   {

    Form3 f3 = new Form3(richTextBox1);//ініціалізуємо форму заміни

    f3.ShowDialog();//показуємо вікно модально

   }

  }

         Тепер приведемо код форми пошуку тексту:

public partial class Form2 : Form

 {

  public RichTextBox rt; //посилання на багаторядковий редактор, в якому відбувається пошук

  int ind = 0;//індекс символу з якого відбувається пошук

 

  public Form2(RichTextBox r)//конструктор форми

   {

    InitializeComponent();//ініціалізація форми

    rt = r;//зберігаємо посилання на компоненту редактора тексту

    rt.HideSelection = false;//при втраті фокусу не приховувати виділений фрагмент

   }

 

  private void button3_Click(object sender, EventArgs e)//кнопка відмінити

   {

    this.Close();//ховаємо форму

   }

 

  private void button2_Click(object sender, EventArgs e)//кнопка продовжити пошук

   {

    string s = textBox1.Text;//зберігаємо в змінну текст для пошуку, так зручніше

    if (checkBox1.Checked)//якщо відмічено ігнорувати реєстр

     {

       //шукаємо фрагмент тексту

       //s - фрагмент тексту,

       //ind - індекс початку пошуку,

       //StringComparison.CurrentCultureIgnoreCase - знехтувати реєстром

      ind = rt.Text.IndexOf(s, ind, StringComparison.CurrentCultureIgnoreCase);

      if (ind != -1)//ind = -1 якщо нічого не знайдено

       {

        //виділяємо в редакторі фрагмент знайденого тексту

        rt.SelectionStart = ind;//позначаємо початок

        rt.SelectionLength = s.Length;//вказуємо довжину виділення

        ind += s.Length;//зміщуємо початок пошуку, для того, щоб знову не знайти те саме включення шуканого фрагменту

       }

        else { MessageBox.Show("Noting finded!"); }//виводимо повідомлення що не вдалося нічого знайти

       }

        else //якщо реєстр ігнорувати непотрібно

       {

        //шукаємо фрагмент тексту

        //s - фрагмент тексту,

        //ind - індекс початку пошуку,

        //StringComparison.CurrentCulture - пошук повного входження фрагменту тексту згідно локальних налаштувань

        ind = rt.Text.IndexOf(s, ind, StringComparison.CurrentCulture);

        if (ind != -1)//ind = -1 якщо нічого не знайдено

         {

          //виділяємо в редакторі фрагмент знайденого тексту

          rt.SelectionStart = ind;//позначаємо початок

          rt.SelectionLength = s.Length;//вказуємо довжину виділення

          ind += s.Length;//зміщуємо початок пошуку, для того, щоб знову не знайти те саме включення шуканого фрагменту

         }

          else { MessageBox.Show("Noting finded!"); }//виводимо повідомлення що не вдалося нічого знайти

        }

 

     }

   }

 

         І, на кінець, код форми знайти і замінити.

public partial class Form3 : Form

 {

  public int ind = 0;//індекс символу з якого відбувається пошук

  public RichTextBox rt;//посилання на багаторядковий редактор, в якому відбувається пошук

 

  public Form3(RichTextBox r)//конструктор форми

   {

    InitializeComponent();//ініціалізація форми

    rt = r;//зберігаємо посилання на компоненту редактора тексту

   }

 

  private void button3_Click(object sender, EventArgs e)//кнопка відмінити

   {

    this.Close();//ховаємо форму

   }

 

  private void button1_Click(object sender, EventArgs e)//кнопка замінити все

   {

    rt.HideSelection = true;//ховаємо виділення тексту при втраті фокусу компоненти

    string s = textBox1.Text;//текст який шукаємо

    string rs = textBox2.Text;//текст на який замінюємо

    StringComparison sc;//вид пошуку для заміни

    if (checkBox1.Checked)//якщо відмічено ігнорувати реєстр

     { sc = StringComparison.CurrentCultureIgnoreCase; }//вибираємо значення ігнорувати реєстр

     else { sc = StringComparison.CurrentCulture; }//вибираємо метод пошуку по точному входженні

    while (ind != -1)//поки в тексті містяться задані фрагменти тексту (ind = -1 -- нічого не знайдено)

     {

      ind = rt.Text.IndexOf(s, ind, sc);//пробуємо знайти фрагмент тексту

      if (ind != -1) //перевіряємо чи знайшли

       { //знайшли

        rt.SelectionStart = ind;//помічаємо початок виділеного тексту в компоненті

        rt.SelectionLength = s.Length;//вказуємо довжину виділеного фрагменту

        rt.SelectedText = rs;//замінюємо виділений текст на новий

        ind += s.Length;//зміщуємо початок пошуку для іншої ітерації

       }

      }

      MessageBox.Show("Done!");//виводимо що заміна завершена

      this.Close();//ховаємо форму

  }

 

 private void button2_Click(object sender, EventArgs e) //обробник кнопки замінити

  {

   rt.HideSelection = false;//показуємо виділення при втраті фокусу

   string s = textBox1.Text;//шуканий фрагмент тексту

   string rs = textBox2.Text;//текст для заміни

   StringComparison sc;//вид пошуку

   if (checkBox1.Checked)//якщо відмічено ігнорувати реєстр

    { sc = StringComparison.CurrentCultureIgnoreCase; }//вибираємо значення ігнорувати реєстр

    else { sc = StringComparison.CurrentCulture; }//вибираємо метод пошуку по точному входженні

   while (ind != -1)//поки в тексті містяться задані фрагменти тексту (ind = -1 -- нічого не знайдено)

    {

     ind = rt.Text.IndexOf(s, ind, sc);

     if (ind != -1)//перевіряємо чи знайшли

      {//знайшли

       rt.SelectionStart = ind;//пробуємо знайти фрагмент тексту

       rt.SelectionLength = s.Length;//вказуємо довжину виділеного фрагменту

       //виводимо повідомлення про заміну тексту

       if (MessageBox.Show("Replace this?","Question",MessageBoxButtons.YesNo)==DialogResult.Yes)

          //якщо користувач дав згоду

        rt.SelectedText = rs;//замінюємо виділений фрагмент новим

       ind += s.Length;//зміщуємо індекс пошуку

      }

     }

      MessageBox.Show("Done!");//виводимо повідомлення про завершення заміни

      this.Close();//ховаємо форму

    }

  }

         Для успішної здачі лабораторної роботи Вам потрібно буде ще додати до блокноту пункт меню про програму, та пункт меню «Зберегти виділене в файл», яка відповідно виділений фрагмент тексту в блокноті у файл, попередньо спитавши у користувача ім’я файлу. Також, якщо, виникнуть сумніви у викладача в тому, що Ви розібралися з цією лабораторною роботою, можливі додаткові питання.