Практическое занятие № 3

ТЕМА: Создание текстового редактора

ЦЕЛЬ РАБОТЫ: получить практические навыки по работе с диалогами, меню, строкой статуса. Научиться создавать формы-заставки.

 

Ход работы

 

Создать программу, которая:

 

При запуске открывается окно ввода пароля:

 

 

Пароль разбивается на четыре части по 5 символов. Предусмотреть автоматический переход курсора в следующее поле при вводе 5 символов в текущем поле. В случае неверного ввода программа должна выдать сообщение об ошибке и предложить ввести пароль снова (переходит в первое текстовое поле). В случае 5 неверных попыток кнопка ОК блокируется и запуск программы становится невозможным;

 

Указания: для формы задайте свойства: Text = "Регистрация. Осталось попыток : 5", FormBorderStyle = FixedDialog, MinimizeBox = False, MaximizeBox = False, StartPosition = CenterScreen.

Разместите на форме 4 поля TextBox и кнопку Button. Для полей задайте свойства: Text - очистить, MaxLength = 5, PasswordChar = *.

Для кнопки задайте свойство Text = ОК.

 

Для первого поля в событии TextChanged напишите код:

 

void textBox1_TextChanged(object sender, EventArgs e)

{

    //если в первом поле введено 5 символов   

    if (textBox1.Text.Length == 5)

        //переходим на второе поле

        textBox2.Focus();

}

 

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

 

По умолчанию при перемещении по текстовым полям их содержимое не выделяется, что делает редактирование полей неудобным для пользователя. Напишем код, который будет выделять поле при перемещении у него курсора клавишей TAB или с помощью метода Focus(). Для первого поля в событии Enter напишите код:

 

void textBox1_Enter(object sender, EventArgs e)

{

    // для компонента с типом "Текстовое поле"

    //выделяем весь текст

    (sender as TextBox).SelectAll();

}

 

Для других полей в событии Enter выберите из списка подпрограмму обработки аналогичного события первого поля. Теперь при перемещении между полями их содержимое будет выделяться автоматически.

 

Если пользователь верно введет пароль, то должно открыться окно редактора.

Сначала создадим новую форму. Перейдите в окно "Обозреватель решений". В окне в контекстном меню проекта выберите команду "Добавить – Создать элемент". В новом окне укажите элемент "Форма Windows Form".

В результате в дереве проекта появится файл новой формы с именем Form2.cs

Теперь можно написать код для кнопки, который откроет эту форму.

 

Для кнопки в событии Click напишите код:

 

void button1_Click(object sender, EventArgs e)

{

    //если пароль верный

    if (textBox1.Text+textBox2.Text+textBox3.Text+textBox4.Text=="11111111111111111111")

    {

        // форма регистрации скрывается с экрана

        Hide();

        //в памяти создается форма редактора

        Form2 form2 = new Form2();

        //созданная форма отображается на экране

        form2.Show();

    }

    //если пароль не верный

    else

    {

    //наращиваем счетчик попыток регистрации

    k++;

    //меняем в заголовке окна число оставшихся попыток

    Text="Регистрация. Осталось попыток : "+(5-k).Tostring();

    //выдаем сообщение об ошибке

    MessageBox.Show("Пароль не верный. Осталось попыток: "+Convert.ToString(5-k),

                    "Попробуйте еще",

                    MessageBoxButtons.OK,

                    MessageBoxIcon.Error);

    }

    //если пользователь сделал 5 попыток

    if (k==5)

        //то кнопка блокируется

        button1.Enabled=false;

}

 

Замечание: для работы этого кода надо описать переменную k как глобальную. Для этого найдите строку с заголовком класса формы

 

public partial class Form2 : Form

 

и после фигурной скобки опишите глобальную переменную:

 

int k = 0;

 

При верном вводе пароля на экране появляется окно редактора, который состоит из многострочного текстового поля, меню и панели инструментов.

 

 

Указания: перейдите на форму Form2.

Для формы задайте свойства: Text - заголовок формы, StartPosition = CenterScreen.

 

Для создания меню нанесите на форму компонент MenuStrip, который автоматически разместится внизу за границами формы. Одновременно с этим в верхней части формы появится рамка для ввода названия первой команды меню. Создайте меню вида:

- Файл (Открыть, Сохранить, Выход);

- Правка (Вырезать, Скопировать, Вставить, Выделить все, Очистить);

- Формат (Шрифт, Цвет текста, Цвет фона);

- Справка ( О программе).

Для каждого пункта меню задайте свойства: Image - иконка; ShortCut - клавиша для выбора пункта.

 

Для создания панели инструментов нанесите на форму компонент ToolStrip, который автоматически разместится внизу за границами формы. Одновременно с этим на форме появится панель с кнопкой, с помощью которой можно создавать другие кнопки на панели. Добавьте 2 кнопки Button, 1 Separator, 3 Button, 1 Separator, 1 Button, 1 DropDownButton ( для этой кнопки также введите две команды выпадающего меню (Текст, Фон).

 

Для создания текстового поля редактора нанесите на форму компонент TextBox и задайте свойства: Text - очистить, MultiLine = true (в поле можно вводить текст в несколько строк), Dock = Fill (поле заполнит всю форму кроме меню и строки статуса).

Для автоматического отображения вертикальной полосы прокурутки по мере ввода текста в событии TextChanged поля введите код:

 

private void textBox1_TextChanged(object sender, EventArgs e)

{

    //описываем переменную и присваиваем ей

    //размер текста, введенного в textBox2, в точках

    Size textBoxRect = TextRenderer.MeasureText(this.textBox1.Text, this.textBox1.Font,

                       new Size(this.textBox1.Width, int.MaxValue),

                       TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl);

    //если высота текста больше высоты поля

    if (textBoxRect.Height > textBox1.Height)

        //отображаем вертикальную полосу прокрутки

        this.textBox1.ScrollBars = ScrollBars.Vertical;

    //иначе

    else

        //скрываем полосы прокрутки

        this.textBox1.ScrollBars = ScrollBars.None;

}

 

Для работы пунктов меню Открыть и Сохранить на форме разместите компоненты-диалоги:

- OpenFileDialog (диалог открытия файла);

- SaveFileDialog (диалог сохранения файла).

Эти диалоги являются невидимыми при работе программы, поэтому будут размещены внизу за пределами формы. Наш редактор будет работать только с текстовыми файлами, поэтому для обоих диалогов задайте свойства: Filter = Текстовые файлы|*.txt (тип фалов, который будет доступен в диалогах), DefaultExt = txt (расширение файла, которое будет использоваться при сохранении).

 

При работе с файлами будет использоваться специальный класс File, для работы с которым надо вверху кода формы подключить специальное пространство имен с помощью команды:

 

using System.IO;

 

Напишем код для всех пунктов меню. Для создания кода выберите нужен пункт и в его событии Click введите нужные команды.

 

Для команды "Открыть" напишем код:

 

void открытьToolStripMenuItem_Click(object sender, EventArgs e)

{

    //если в диалоге пользователь выбрал файл и щелкнул ОК

    if (openFileDialog1.ShowDialog()==DialogResult.OK)

        //в поле загружается содержимое файла

        textBox1.Lines = File.ReadAllLines(openFileDialog1.FileName);

}

 

Для команды "Сохранить" напишем код:

 

void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)

{

    //если в диалоге пользователь указал имя файл и щелкнул ОК

    if (saveFileDialog1.ShowDialog()==DialogResult.OK)

        //содержимое поля сохраняется в указанном файле   

        File.WriteAllLines(saveFileDialog1.FileName,textBox1.Lines);

}

 

Для команды "Выход" напишем код:

 

void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

   Close();

}

 

Для команды "Вырезать" напишем код:

 

void вырезатьToolStripMenuItem_Click(object sender, EventArgs e)

{

    textBox1.Cut();

}

 

Для команды "Копировать" напишем код:

 

void копироватьToolStripMenuItem_Click(object sender, EventArgs e)

{

    textBox1.Copy();

}

 

Для команды "Вставить" напишем код:

 

void вставитьToolStripMenuItem_Click(object sender, EventArgs e)

{

    textBox1.Paste();

}

 

 Для команды "Выделить все" напишем код:

 

void выделитьВсеToolStripMenuItem_Click(object sender, EventArgs e)

{

    textBox1.SelectAll();

}

 Для команды "Очистить" напишем код:

 

void очиститьToolStripMenuItem_Click(object sender, EventArgs e)

{

    textBox1.Clear();

}

 

Для работы пунктов меню Шрифт, Цвет текста, Цвет фона на форме разместите компоненты-диалоги:

- FontDialog (диалог выбора формата символов);

- ColorDialog (диалог выбора цвета).

Эти диалоги являются невидимыми при работе программы, поэтому будут размещены снизу формы.

 

Для команды "Шрифт" напишем код:

 

void шрифтToolStripMenuItem_Click(object sender, EventArgs e)

{

    //загружаем в диалог текущие параметры шрифта поля

    fontDialog1.Font=textBox1.Font;

    //если пользователь задал параметры шрифта и щелкнул ОК

    if (fontDialog1.ShowDialog()==DialogResult.OK)

        //для поля применяем выбранные параметры шрифта

        textBox1.Font=fontDialog1.Font;

}

 

Для удобства пользователя в диалоге выбора параметров шрифта рекомендуется отображать кнопку Применить. Для этого у компонента FontDialog задайте свойство ShowApply = True. Для работы этой кнопки для компонента FontDialog в событии Apply введите код:

 

void fontDialog1Apply(object sender, EventArgs e)

{

    //для поля применяем выбранные параметры шрифта

    textBox1.Font=fontDialog1.Font;

}

 

Для команды "Цвет текста" напишем код:

 

void цветТекстаToolStripMenuItem_Click(object sender, EventArgs e)

{

    //если пользователь задал цвет и щелкнул ОК

    if (colorDialog1.ShowDialog()==DialogResult.OK)

        //для символов поля применяем выбранный цвет

        textBox1.ForeColor=colorDialog1.Color;

}

    

Для команды "Цвет фона" напишем код:

 

void цветФонаToolStripMenuItem_Click(object sender, EvenTargs e)

{

    //если пользователь задал цвет и щелкнул ОК

    if (colorDialog1.ShowDialog()==DialogResult.OK)

        //для фона поля применяем выбранный цвет

        textBox1.BackColor=colorDialog1.Color;

}

 

Команда О программе должна отобразить новую форму с информацией о программе.

 

 

Указания: Для этого сначала надо добавить новую форму как описано выше.

Для формы Form3 задайте свойства: Text = О программе, FormBorderStyle = FixedDialog, MinimizeBox = False, MaximizeBox = False, StartPosition = CenterScreen, BackGroundImage - рисунок на форме (скачать), BackGroundImageLayout =Stretch (тип размещения рисунка - масштабирование).

 

Перейдите на форму Form2 и для команды меню "О программе" введите код:

    
       
 void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)

{

    //создаем форму в памяти

    Form3 form3 = new Form3();

    //отображаем форму в модальном режиме

    form3.ShowDialog();

}

 

 Для кнопок на панели инструментов надо задать те же  самые процедуры, которые заданы для соответствующих пунктов меню.

 

Указания: для каждой кнопки на панели инструментов в свойстве Image задайте иконку, а в событии Click из списка выберите событие Click соответствующего пункта меню.

 

Из окна Form3 сделайте форму-заставку, которая отображается при запуске в течении 2 секунд.

 

Указания: надо открыть в главный файл проекта. Для этого перейдите в окно "Обозреватель решений" и двойным щелчком откройте файл Program.cs.

 

Перед командой Application.Run . . . добавьте команды:

 

//создаем форму в памяти

Form3 form3 = new Form3();

//у формы-заставки обычно нет заголовка окна (выключаем его)

form3.FormBorderStyle=FormBorderStyle.None;

//отображаем форму-заставку на экране

form3.Show();

//обновляем форму для корректного отображения на ней рисунка

form3.Refresh();

//делаем паузу в 2 секунды (2000 мс)

System.Threading.Thread.Sleep(2000);

//удаляем форму из памяти

form3.Dispose();

 

Если запустить программу, а потом выйти из нее, то будет видно, что программа не завершает корректно свою работу и продолжает находиться в памяти компьютера (запустите и убедитесь в этом). Надо реализовать корректный выход из программы.

 

Указания: этот недостаток возникает поэтому, что после регистрации главная форма не была закрыта, а была скрытая методом Hide() и продолжает находиться в памяти. Для корректного выхода из программы перейдите на форму Form2 и в ее событии FormClose введите команду, которая завершает работу программы.

 

void Form1_FormClosed(object sender, FormClosedEventArgs e)

{

    //завершить работу программы   

    Application.Exit();

}