Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный_практикум.doc
Скачиваний:
74
Добавлен:
15.11.2019
Размер:
45.35 Mб
Скачать

6. Модификация приложения Windows Forms: открытие файла, сохранение файла и работа с текстом

Расставим третью группу элементов. Добавим поле расширенной работы с текстом и организуем небольшой текстовый редактор с сохранением и открытием файлов, а также добавим контекстное меню по щелчку правой кнопки мыши на любой пустой позиции формы.

Расставим третью группу следующим образом:

Рис. 5. 1. Расстановка элементов третьей группы (Открытие файла, сохранение файла и работа с текстом)

Перетащим с панели элементов новый элемент ContextMenuStrip. Установим для него свойство (Name): MenuRight. Заполним его элементами также как и главное меню Файл:

Если редактирование прямо на форме не слишком наглядно, можно также воспользоваться расширенным редактором коллекции элементов для меню. Он также подходит для обычного меню MenuStrip, элемента ToolStrip и строки состояния StatusStrip.

Рис. 6. 1. Редактор коллекции элементов (для MouseRight)

С панели инструментов добавим также элементы диалоговых окон сохранения и загрузки: OpenFileDialog и FileSaveDialog. Установим им имена (Name) соответственно: FileOpen и FileSave:

Свойства элемента FileSave:

(Name):

FileSave

FileName:

Документ

^ Здесь указываем название файл без разширения по умолчанию.

InitialDirectory:

<ваш путь>

Если нужно указать стартовую директорию для сохранения. Путь может выглядеть так: D:\Folder1\Folder2

DefaultExt:

Файлы RTF|*.rtf

^ Здесь указывается суффикс файла сохранения и название этого суффикса.

Filter:

Файлы RTF|*.rtf|Текстовый документ|*.txt|Текст OpenDocument|*.odt|Все файлы|*.*

ПРИМЕЧЕНИЕ № 4: Свойства DefaultExt и Filter записываются через разделители «|». Напомним, что в лабораторных работах данного практикума запись значений для полей свойств элементов управления иногда такова: «Имя свойства: <Значение>.» — точка после закрывающей кавычки не относится к значению, поэтому не стоит заносить скажем в поле принимающее только целое числовое значение ещё и точку. Среда выдаст ошибку либо уберёт точку.

Пример (задание точки в имени элемента):

Рис. 6. 2. Ошибочное задание поля (Name)

Свойства элемента FileOpen:

(Name):

FileOpen

FileName:

Документ

^ Здесь указываем название файл без расширения по умолчанию.

Имена остальных элементов оставляем как есть:

(Name):

button10

Text:

Цвет

ToolTip на Hint:

Цвет выделенного текста

(Name):

button11

Text:

Шрифт

ToolTip на Hint:

Шрифт выделенного текста

(Name):

button14

Text:

Фон

ToolTip на Hint:

Фон выделенного текста

(Name):

button15

Text:

Копировать

ToolTip на Hint:

Копировать выделенный текст в буфер обмена

(Name):

button13

Text:

Выделить всё

(Name):

button12

Text:

Очистить

Событие Click кнопки Цвет:

private void button10_Click(object sender, EventArgs e)

{

ColorSelect.ShowDialog();

richTextBox1.SelectionColor = ColorSelect.Color; // Меняем цвет выделенного текста richTextBox1

}

Событие Click кнопки Шрифт:

private void button11_Click(object sender, EventArgs e)

{

try

{

FontSelect.ShowDialog();

richTextBox1.SelectionFont = FontSelect.Font; // Меняем шрифт выделенного текста richTextBox1

}

catch

{

// Ловим ошибку: шрифт не TrueType

}

}

Событие Click кнопки Фон:

private void button14_Click(object sender, EventArgs e)

{

ColorSelect.ShowDialog();

richTextBox1.SelectionBackColor = ColorSelect.Color; // Меняем фон выделенного текста richTextBox1

}

Событие Click кнопки Копировать:

private void button15_Click(object sender, EventArgs e)

{

richTextBox1.Copy(); // Копируем выделенный фрагмент текста в элементе

}

Событие Click кнопки Очистить:

private void button12_Click(object sender, EventArgs e)

{

richTextBox1.Clear(); // Очистка richTextBox1

}

Событие Click кнопки Выделить всё:

private void button13_Click(object sender, EventArgs e)

{

richTextBox1.Focus(); // Фокус на элемент

richTextBox1.SelectAll(); // Выделяем весь текст

}

Событие Click кнопки главного меню Открыть:

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

{

try

{

// Открываем диалог открытия файла

FileOpen.ShowDialog();

// Создаём поток для содержимого файла

Stream FStream = FileOpen.OpenFile();

// Загружаем файл (открываем форматированный текст)

richTextBox1.LoadFile(FStream, RichTextBoxStreamType.RichText);

// Закрываем поток и высвобождаем память

FStream.Close();

this.Text = Title + " :: " + FileOpen.FileName;

}

catch

{

// Ловим ошибку: файл не найден

}

}

Событие Click кнопки главного меню Сохранить как…:

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

{

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

String FileSavedAs;

// Создаём поток в памяти

MemoryStream MStream = new MemoryStream();

// Cоздаём поток для файл

Stream FStream;

if (FileSave.ShowDialog() == DialogResult.OK) // По завершении диалога и нажатии кнопки ОК...

{

// Связываем поток с именем существующего файла, если файла нет, то создаём новый файл

FStream = FileSave.OpenFile();

// Меняем положение в потоке

MStream.Position = 0;

// Сохраняем в поток содержимое richTextBox1 (сохраняем форматированный текст)

richTextBox1.SaveFile(MStream, RichTextBoxStreamType.RichText);

// Записываем информацию в файл

MStream.WriteTo(FStream);

// Закрываем поток и высвобождаем память

FStream.Close();

FileSavedAs = FileSave.FileName;

this.Text = Title + " :: " + FileSavedAs; // После сохранения укажем сохранённый файл в заголовке

}

}

Модифицируем событие Click кнопки :

private void button4_Click(object sender, EventArgs e)

{

SaveQuestion(); // Вызов метода обработки "правильного" закрытия предложения с выводом диалога сохранения данных

}

Сам метод SaveQuestion(), добавим в этом же файле LWP05Main.cs:

void SaveQuestion()

{

DialogResult Result = MessageBox.Show("Сохранить изменения в документе?", Title + " :: Сохранение изменений", MessageBoxButtons.YesNo);

switch (Result) // Оператор переключения switch, получает значения Result результата выполнения диалога

{

case DialogResult.Yes:

{

сохранитьToolStripMenuItem_Click(null, null); // Генерируем событие нажатия кнопки Сохранить как...

Close();

break;

}

case DialogResult.No: { Close(); return; }

}

}

В начале файла добавим строковую переменную:

public partial class LWP05Main : Form

{

String Title; // Строковая переменная для хранения заголовка приложения

Модифицируем метод LWP05Main() следующим образом:

public LWP05Main()

{

InitializeComponent();

/* Инициализируем массив элементов для checkedListBox1 */

String[] CheckItems = { "Непрозрачность окна в %", "Овальное окно" };

checkedListBox1.Items.AddRange(CheckItems);

/* Устанавливаем режим выбора 'ktvtynf с двойного нажатия на одинарный */

checkedListBox1.CheckOnClick = true;

NumericAplha.Value = 100; // Начальное значение

progressBar1.Maximum = 60; // Граница индикаторы выполнения

Title = this.Text; // Сохраняем первоначальный заголовок

}

Теперь обработаем контекстное меню. События Click кнопок контекстного меню Открыть, Сохранить как и Выход:

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

{

открытьToolStripMenuItem_Click(null, null); // Вызываем метод события Click главного меню для пункта Открыть

}

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

{

сохранитьToolStripMenuItem_Click(null, null); // Вызываем метод события Click главного меню для пункта Сохранить как...

}

private void выйтиToolStripMenuItem_Click(object sender, EventArgs e)

{

SaveQuestion();

}

События MouseEnter оставшихся кнопок главного меню:

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

{

StatusLabel.Text = открытьToolStripMenuItem1.Text + " (" + открытьToolStripMenuItem1.ShortcutKeyDisplayString + ")";

}

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

{

StatusLabel.Text = сохранитьКакToolStripMenuItem.Text + " (" + сохранитьКакToolStripMenuItem.ShortcutKeyDisplayString + ")";

}

Компилируем, проверяем работоспособность:

Рис. 6. 3. Окончательная работа третьего блока (Открытие файла, сохранение файла и работа с текстом)