Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 933
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
GetEncoding(1251) устанавливает кодовую страницу Windows 1251 для объекта кодировка. Можно убедиться в этом, если распечатать свойство Кодировка .HeaderName.
При создании объекта Читатель используются уже два аргумента: имя файла filename и объект кодировка, указывающий, в какой кодировке (для какой кодовой страницы) читать данные из текстового файла. А при создании объекта Писатель используются три аргумента: имя файла filename, установка false (для случая, если файл уже существует, нужно будет не добавлять новые данные, а создавать новый файл) и объект Кодировка, указывающий, в какой кодировке писать данные в файл. Убедиться в работоспособности программы можно, открыв решение TXT_1251.sln в папке ТХТ_1251.
Пример 25. Простой текстовый редактор. Открытие и сохранение файла. Событие формы Closing
Итак, мы уже знаем, что существуют технологии чтения/записи текстового файла для нужной кодовой страницы. Таким образом, мы имеем основные компоненты для написания текстового редактора. Запустив систему Visual Studio 2010 и щелкцув по шаблону Windows Forms Application С#, перенесем из панели элементов управления Toolbox в форму текстовое поле TextBox и меню MenuStrip. Используя элемент управления MenuStrip, создадим один пункт меню Файл и три пункта подменю: Открыть, Сохранить как и Выход (рис. 4.2).
Рис. 4.2. Простой текстовый редактор
Из панели Toolbox нам понадобятся еще элементы управления OpenFileDialog и SaveFileDialog, также перенесем их в форму, хотя их очень легко объявить и использовать непосредственно в программном коде. Итоговый текст програм "Простой текстовый редактор" представлен в листинге 4.3, и автор заранее приносит свои извинения за слишком длинный программный код, однако короче нельзя! Ксати, чтобы увеличить количество строчек программного кода, который вы хотели бы одновременно видеть на экране, удобно пользоваться комбинацц клавиш <Shift>+Alt>+<Enter> (Full Screen).
Листинг 4.3. Простой текстовый редактор
// Простой текстовый редактор
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace TXT_edit
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Multiline = true; textBox1.Clear();
textBox1.Size = new System.Drawing.Size(268, 160);
this.Text = "Простой текстовый редактор";
openFileDialog1.FileName = @"C:\Text2.txt";
openFileDialog1.Filter =
"Текстовые файлы (*.txt)|*.txt|All files (*.*)|*.*";
saveFileDialogl.Filter =
"Текстовые файлы (*.txt)|*.txt|All files (*.*)|*.*";
}
private void oткрытьToolStripMenuItem_Click(object sender,
System.EventArgs e)
{ // Вывести диалог открытия файла
openFileDialogl.ShowDialog();
if (openFileDialogl.FileName == null) return;
// Чтение текстового файла:
try
{ // Создание экземпляра StreamReader для чтения из файла
var Читатель = new System.IO.StreamReader (openFileDialog1.FileName, System.Text.Encoding.GetEncoding(1251));
// - здесь заказ кодовой страницы Winl251 для русских букв
textBox1.Text = Читатель.ReadToEnd();
Читатель.Close();
}
catch (System.IO.FileNotFoundException Ситуация)
MessageBox.Show(Ситуация + "\nНет- такого файла", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
catch (System.Exception Ситуация)
{
// Отчет о других ошибках
MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void coxpaнить КакToolStripMenuItem_Click(object sender,
System.EventArgs e)
{ // Пункт меню "Сохранить как"
saveFileDialog1.FileName = openFileDialog1.FileName;
if (saveFileDialog1.ShowDialog() == DialogResult.OK) Запись();
}
void Запись()
{
try
{ // Создание экземпляра StreamWriter для записи в файл:
var Писатель = new System. IO.StreamWriter
(saveFileDialogl.FileName, false, System.Text.Encoding.GetEncoding(1251));
// - здесь заказ кодовой страницы Winl251 для русских букв
Писатель.Write(textBox1.Text);
Писатель.Close(); textBox1.Modified = false;
}
catch (System.Exception Ситуация)
{ // Отчет обо всех возможных ошибках
MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void выходToolStripMenuItem_Click(object sender.
System.EventArgs e)
{ this.Closed ; }
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (textBox1.Modified == false) return;
// Если текст модифицирован, то спросить, записывать ли файл?
DialogResult МВох = MessageBox.Show(
"Текст был изменен. \nСохранить изменения?",
"Простой редактор", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
// YES — диалог; NO — выход; CANCEL - редактировать
if (МВох == DialogResult.No) return;
if (MBox == DialogResult.Cancel) e.Cancel = true;
if (MBox == DialogResult.Yes)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
Запись(); return;
}
else e.Cancel = true; // Передумал выходить из ПГМ
} // DialogResult.Yes
}
}
}
Как видно их текста программы, сразу после завершения работы процедуры InitializeComponent присваиваем начальные значения некоторым переменным. В частности для открытия (Open) и сохранения (Save) файлов заказываем фильтр (Filter) для текстовых файлов *. txt, а также для всех файлов *. *.
При обработке события "щелчок на пункте меню" Открыть выводим стандартный диалог открытия файлов
OpenFileDialog, и если полученное в результате диалога имя файла не пусто (null), то организуем чтение текстового файла. Эта процедура в точности соответствует процедуре чтения файла из предыдущего раздела, разве что упрощен заказ на чтение в кодировке Windows 1251.
Аналогично написана обработка события "щелчок на пункте меню" Сохранить как (см. рис. 4.2). Выводится стандартный диалог SaveFiieDialog сохранения файла, и если пользователь щелкнул на кнопке ОК (или Сохранить), то вызывается процедура Запись (). Если нет, то пользователь отправляется редактировать текст. Процедура Запись() также в точности соответствует процедуре записи текстового файла из предыдущего раздела. Как видно, в процедуре Запись() попытка (Trу) записи заканчивается оператором textBox1.Modified = false. Свойство Modified отслеживает изменения в тестовом поле. Понятно, что сразу после записи в файл следует это свойство перевести в состояние false.
На мой взгляд, наибольший интерес представляет организация выхода из программы. Выйти из программы можно либо через пункт меню Выход, либо закрывая программу традиционными методами Windows, т. е. нажатием комбинации клавиш <Alt>+<F4>, кнопки Закрыть или кнопки системного меню (слева вверху)( «обработка события закрытия формы FormClosing). Момент закрытия формы отбиваем с помощью события формы FormClosing, которое происходит во время укрытия формы. Обратите внимание, выход по пункту меню Выход организован не через метод Application.Exit (), а через закрытие формы this .Сlose (). Почему? Потому что метод Application.Exit () не вызывает событие формы FormClosing.
Обычно выход из любого редактора (текстового, графического, табличного и т. д.) реализуется по следующему алгоритму. Если пользователь не сделал никаких изменений в редактируемом файле, то выйти из программы. Изменения в текстовом поле регистрируются свойством textBox1.Modified. Если в документе имеются несохраненные изменения (textBox1 .Modified = true), а пользователь хочет выйти из программы, то выводят диалоговое окно (рис. 4.3).
Рис. 4.3. Диалоговое окно при выходе из программы
В программе следует обработать каждый из возможных ответов пользователя по алгоритму, представленному на рис. 4.4.
Рис. 4.4. Алгоритм обработки ответа пользователя программы
Обращаю внимание читателей на ветвь алгоритма "Отмена" (Cancel). Это случай, когда пользователь передумал выходить из программы и желает вернуться к редактированию файла. Для реализации этого случая (см. листинг 4.3) обработка события FormClosing предусматривает булево свойство е.Cancel, которому можноприсвоить значение true, означающее отказ от закрытия программы (пользователь передумал), т. е. в этом случае процедура Form1_FormClosing не закончится выходом из программы.
Аналогично, если пользователь согласился сохранить данные, то он попадает в стандартный диалог сохранения файла, и если при этом он передумал (диалог сохранения закрыт кнопкой Отмена или комбинацией клавиш <Alt>+<F4>), то cледует предложить пользователю продолжить редактирование файла: е.Сancel = true. Как видно, в процедуре Form1_FormСlosing, к сожалению, не удается избежать вложенных операторов условия.
Убедиться в работоспособности программы можно, открыв соответствующее решение в папке ТекстовыйРедактор.
Пример 26. Программа тестирования знаний студента по какому-либо предмету
В связи с внедрением в образование так называемого Болонского процесса-процесса сближения и гармонизации систем образования стран Европы с целью создания единого европейского пространства высшего образования — процедур проверки знаний студентов осуществляется в том числе посредством тестирования по различным предметам преподавания. Причем тестированию уделяется наибольшее внимание. В данном примере создадим инструмент для тестирования студентов, напишем программу, которая читает заранее подготовленный преподавателем текстовый файл с вопросами по какому-либо предмету, выводит в экранную форму каждый вопрос с вариантами ответов. Студент выбирает правильный вариант ответа, а в конце тестирования программа подводит итоги проверки знаний, выставляет общую оценку и, в качестве обоснования поставленной оценки, показывает вопросы, на которые студент ответил неправильно.
Фрагмент такого текстового файла для проверки знаний по информатике представлен в листинге 4.4.
Листинг 4.4. Содержимое текстового файла для тестирования студента по информатике
Информатика и программирование
1/6. Основные компоненты вычислительной системы:
процессор, звуковая карта, видеокарта, монитор, клавиатура;
монитор, клавиатура, материнская плата, процессор
процессор, ОП, внешняя память, монитор, клавиатура
3
2/6. Во время исполнения прикладная программа хранится:
в ПЗУ
в процессоре
в оперативной памяти
3
3/6. Иерархию усложнения данных можно представить в виде:
Бит - Байт - Поле - Запись - Файл - База Данных
Запись - Файл - Бит - Байт - База Данных - Поле
База Данных - Байт - Поле - Запись - Бит - Файл
1
4/6. Укажите строку, содержащую неверное утверждение
1 Кбайт = 1024 байт; 1 Гбайт = 1024 Мбайт
1 Мбайт это примерно миллион байт; 1 байт = 8 бит
1 Гбайт это примерно миллион байт; 1 Мбайт = 1024 Кбайт
3
5/6. Экспоненциальное представления числа -1,84Е-04 соответствует числу:
-0,000184
-0,00184
-18400
1
6/6. Текстовые данные кодируют с использованием:
таблиц размещения файлов FAT, NTFS и др.
таблиц символов Windows 1251, Unicode, ASCII и др.
структурированного языка запросов SQL
2
J
Структура этого файла такова. Первой строкой приведенного текстового файла является название предмета или темы, по которой проводится тестирование. Это название программа будет выводить в строке заголовка экранной формы. Для краткости изложения в данном тесте приводятся только шесть вопросов. На компакт-диске, прилагаемом к данной книге, представлен более полный файл test_полный.txt, с помошью которого автор тестирует знания своих студентов. Как видно из листинга 4.4, каждый вопрос имеет три варианта ответа. Строка с числом 1- 2 или 3 означает номер правильного ответа. Программа будет считывать это число и сравнивать с номером варианта, который выбрал тестируемый. Дробь, например 4/6 приведена для того, чтобы тестируемый понимал, в какой точке траектории в данный момент находится, т. е. он отвечает на четвертый вопрос, а всего их шесть.
Таким образом, задача понятна, приступаем к ее программированию. Запустим Visual Studio 2010, закажем новый проект шаблона Windows Forms Application Затем из панели элементов перенесем в форму две командных кнопки, текстовую метку и три переключателя RadioButton
При создании объекта Читатель используются уже два аргумента: имя файла filename и объект кодировка, указывающий, в какой кодировке (для какой кодовой страницы) читать данные из текстового файла. А при создании объекта Писатель используются три аргумента: имя файла filename, установка false (для случая, если файл уже существует, нужно будет не добавлять новые данные, а создавать новый файл) и объект Кодировка, указывающий, в какой кодировке писать данные в файл. Убедиться в работоспособности программы можно, открыв решение TXT_1251.sln в папке ТХТ_1251.
Пример 25. Простой текстовый редактор. Открытие и сохранение файла. Событие формы Closing
Итак, мы уже знаем, что существуют технологии чтения/записи текстового файла для нужной кодовой страницы. Таким образом, мы имеем основные компоненты для написания текстового редактора. Запустив систему Visual Studio 2010 и щелкцув по шаблону Windows Forms Application С#, перенесем из панели элементов управления Toolbox в форму текстовое поле TextBox и меню MenuStrip. Используя элемент управления MenuStrip, создадим один пункт меню Файл и три пункта подменю: Открыть, Сохранить как и Выход (рис. 4.2).
Рис. 4.2. Простой текстовый редактор
Из панели Toolbox нам понадобятся еще элементы управления OpenFileDialog и SaveFileDialog, также перенесем их в форму, хотя их очень легко объявить и использовать непосредственно в программном коде. Итоговый текст програм "Простой текстовый редактор" представлен в листинге 4.3, и автор заранее приносит свои извинения за слишком длинный программный код, однако короче нельзя! Ксати, чтобы увеличить количество строчек программного кода, который вы хотели бы одновременно видеть на экране, удобно пользоваться комбинацц клавиш <Shift>+Alt>+<Enter> (Full Screen).
Листинг 4.3. Простой текстовый редактор
// Простой текстовый редактор
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace TXT_edit
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Multiline = true; textBox1.Clear();
textBox1.Size = new System.Drawing.Size(268, 160);
this.Text = "Простой текстовый редактор";
openFileDialog1.FileName = @"C:\Text2.txt";
openFileDialog1.Filter =
"Текстовые файлы (*.txt)|*.txt|All files (*.*)|*.*";
saveFileDialogl.Filter =
"Текстовые файлы (*.txt)|*.txt|All files (*.*)|*.*";
}
private void oткрытьToolStripMenuItem_Click(object sender,
System.EventArgs e)
{ // Вывести диалог открытия файла
openFileDialogl.ShowDialog();
if (openFileDialogl.FileName == null) return;
// Чтение текстового файла:
try
{ // Создание экземпляра StreamReader для чтения из файла
var Читатель = new System.IO.StreamReader (openFileDialog1.FileName, System.Text.Encoding.GetEncoding(1251));
// - здесь заказ кодовой страницы Winl251 для русских букв
textBox1.Text = Читатель.ReadToEnd();
Читатель.Close();
}
catch (System.IO.FileNotFoundException Ситуация)
MessageBox.Show(Ситуация + "\nНет- такого файла", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
catch (System.Exception Ситуация)
{
// Отчет о других ошибках
MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void coxpaнить КакToolStripMenuItem_Click(object sender,
System.EventArgs e)
{ // Пункт меню "Сохранить как"
saveFileDialog1.FileName = openFileDialog1.FileName;
if (saveFileDialog1.ShowDialog() == DialogResult.OK) Запись();
}
void Запись()
{
try
{ // Создание экземпляра StreamWriter для записи в файл:
var Писатель = new System. IO.StreamWriter
(saveFileDialogl.FileName, false, System.Text.Encoding.GetEncoding(1251));
// - здесь заказ кодовой страницы Winl251 для русских букв
Писатель.Write(textBox1.Text);
Писатель.Close(); textBox1.Modified = false;
}
catch (System.Exception Ситуация)
{ // Отчет обо всех возможных ошибках
MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void выходToolStripMenuItem_Click(object sender.
System.EventArgs e)
{ this.Closed ; }
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (textBox1.Modified == false) return;
// Если текст модифицирован, то спросить, записывать ли файл?
DialogResult МВох = MessageBox.Show(
"Текст был изменен. \nСохранить изменения?",
"Простой редактор", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
// YES — диалог; NO — выход; CANCEL - редактировать
if (МВох == DialogResult.No) return;
if (MBox == DialogResult.Cancel) e.Cancel = true;
if (MBox == DialogResult.Yes)
{
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
Запись(); return;
}
else e.Cancel = true; // Передумал выходить из ПГМ
} // DialogResult.Yes
}
}
}
Как видно их текста программы, сразу после завершения работы процедуры InitializeComponent присваиваем начальные значения некоторым переменным. В частности для открытия (Open) и сохранения (Save) файлов заказываем фильтр (Filter) для текстовых файлов *. txt, а также для всех файлов *. *.
При обработке события "щелчок на пункте меню" Открыть выводим стандартный диалог открытия файлов
OpenFileDialog, и если полученное в результате диалога имя файла не пусто (null), то организуем чтение текстового файла. Эта процедура в точности соответствует процедуре чтения файла из предыдущего раздела, разве что упрощен заказ на чтение в кодировке Windows 1251.
Аналогично написана обработка события "щелчок на пункте меню" Сохранить как (см. рис. 4.2). Выводится стандартный диалог SaveFiieDialog сохранения файла, и если пользователь щелкнул на кнопке ОК (или Сохранить), то вызывается процедура Запись (). Если нет, то пользователь отправляется редактировать текст. Процедура Запись() также в точности соответствует процедуре записи текстового файла из предыдущего раздела. Как видно, в процедуре Запись() попытка (Trу) записи заканчивается оператором textBox1.Modified = false. Свойство Modified отслеживает изменения в тестовом поле. Понятно, что сразу после записи в файл следует это свойство перевести в состояние false.
На мой взгляд, наибольший интерес представляет организация выхода из программы. Выйти из программы можно либо через пункт меню Выход, либо закрывая программу традиционными методами Windows, т. е. нажатием комбинации клавиш <Alt>+<F4>, кнопки Закрыть или кнопки системного меню (слева вверху)( «обработка события закрытия формы FormClosing). Момент закрытия формы отбиваем с помощью события формы FormClosing, которое происходит во время укрытия формы. Обратите внимание, выход по пункту меню Выход организован не через метод Application.Exit (), а через закрытие формы this .Сlose (). Почему? Потому что метод Application.Exit () не вызывает событие формы FormClosing.
Обычно выход из любого редактора (текстового, графического, табличного и т. д.) реализуется по следующему алгоритму. Если пользователь не сделал никаких изменений в редактируемом файле, то выйти из программы. Изменения в текстовом поле регистрируются свойством textBox1.Modified. Если в документе имеются несохраненные изменения (textBox1 .Modified = true), а пользователь хочет выйти из программы, то выводят диалоговое окно (рис. 4.3).
Рис. 4.3. Диалоговое окно при выходе из программы
В программе следует обработать каждый из возможных ответов пользователя по алгоритму, представленному на рис. 4.4.
Рис. 4.4. Алгоритм обработки ответа пользователя программы
Обращаю внимание читателей на ветвь алгоритма "Отмена" (Cancel). Это случай, когда пользователь передумал выходить из программы и желает вернуться к редактированию файла. Для реализации этого случая (см. листинг 4.3) обработка события FormClosing предусматривает булево свойство е.Cancel, которому можноприсвоить значение true, означающее отказ от закрытия программы (пользователь передумал), т. е. в этом случае процедура Form1_FormClosing не закончится выходом из программы.
Аналогично, если пользователь согласился сохранить данные, то он попадает в стандартный диалог сохранения файла, и если при этом он передумал (диалог сохранения закрыт кнопкой Отмена или комбинацией клавиш <Alt>+<F4>), то cледует предложить пользователю продолжить редактирование файла: е.Сancel = true. Как видно, в процедуре Form1_FormСlosing, к сожалению, не удается избежать вложенных операторов условия.
Убедиться в работоспособности программы можно, открыв соответствующее решение в папке ТекстовыйРедактор.
Пример 26. Программа тестирования знаний студента по какому-либо предмету
В связи с внедрением в образование так называемого Болонского процесса-процесса сближения и гармонизации систем образования стран Европы с целью создания единого европейского пространства высшего образования — процедур проверки знаний студентов осуществляется в том числе посредством тестирования по различным предметам преподавания. Причем тестированию уделяется наибольшее внимание. В данном примере создадим инструмент для тестирования студентов, напишем программу, которая читает заранее подготовленный преподавателем текстовый файл с вопросами по какому-либо предмету, выводит в экранную форму каждый вопрос с вариантами ответов. Студент выбирает правильный вариант ответа, а в конце тестирования программа подводит итоги проверки знаний, выставляет общую оценку и, в качестве обоснования поставленной оценки, показывает вопросы, на которые студент ответил неправильно.
Фрагмент такого текстового файла для проверки знаний по информатике представлен в листинге 4.4.
Листинг 4.4. Содержимое текстового файла для тестирования студента по информатике
Информатика и программирование
1/6. Основные компоненты вычислительной системы:
процессор, звуковая карта, видеокарта, монитор, клавиатура;
монитор, клавиатура, материнская плата, процессор
процессор, ОП, внешняя память, монитор, клавиатура
3
2/6. Во время исполнения прикладная программа хранится:
в ПЗУ
в процессоре
в оперативной памяти
3
3/6. Иерархию усложнения данных можно представить в виде:
Бит - Байт - Поле - Запись - Файл - База Данных
Запись - Файл - Бит - Байт - База Данных - Поле
База Данных - Байт - Поле - Запись - Бит - Файл
1
4/6. Укажите строку, содержащую неверное утверждение
1 Кбайт = 1024 байт; 1 Гбайт = 1024 Мбайт
1 Мбайт это примерно миллион байт; 1 байт = 8 бит
1 Гбайт это примерно миллион байт; 1 Мбайт = 1024 Кбайт
3
5/6. Экспоненциальное представления числа -1,84Е-04 соответствует числу:
-0,000184
-0,00184
-18400
1
6/6. Текстовые данные кодируют с использованием:
таблиц размещения файлов FAT, NTFS и др.
таблиц символов Windows 1251, Unicode, ASCII и др.
структурированного языка запросов SQL
2
J
Структура этого файла такова. Первой строкой приведенного текстового файла является название предмета или темы, по которой проводится тестирование. Это название программа будет выводить в строке заголовка экранной формы. Для краткости изложения в данном тесте приводятся только шесть вопросов. На компакт-диске, прилагаемом к данной книге, представлен более полный файл test_полный.txt, с помошью которого автор тестирует знания своих студентов. Как видно из листинга 4.4, каждый вопрос имеет три варианта ответа. Строка с числом 1- 2 или 3 означает номер правильного ответа. Программа будет считывать это число и сравнивать с номером варианта, который выбрал тестируемый. Дробь, например 4/6 приведена для того, чтобы тестируемый понимал, в какой точке траектории в данный момент находится, т. е. он отвечает на четвертый вопрос, а всего их шесть.
Таким образом, задача понятна, приступаем к ее программированию. Запустим Visual Studio 2010, закажем новый проект шаблона Windows Forms Application Затем из панели элементов перенесем в форму две командных кнопки, текстовую метку и три переключателя RadioButton