- •Ю.Е. Алексеев, а.В. Куров
- •Часть 5
- •Алексеев Юрий Евтихович Куров Андрей Владимирович
- •14. Классы
- •15. Создание проекта
- •15.1 Помещение компонент на форму
- •15.2 Окно сведений об объекте
- •15.3 Редактор кода
- •15.4 Основные компоненты визуальной среды программирования
- •15.5 Лабораторная работа №1. Освоение среды визуального программирования на примере создания приложения для вычисления значения определенного интеграла
- •15.6 Задания для самостоятельной работы
- •15.7 Лабораторная работа n2. Работа с текстовым файлом с использованием многострочного текстового редактора
- •Многострочный текстовый редактор RichTextBox
- •Компонент OpenFileDialog
- •Компонент SaveFileDialog
- •Компонент главное меню MenuStrip
- •Окно сообщений MessageBox
- •Порядок выполнения лабораторной работы.
- •15.8 Задания на обработку текстовых файлов Общее указание для всех вариантов
- •Д обавляемые подпункты меню Работа1 и Работа2 по вариантам
- •15.9 Лабораторная работа n3. Работа с бинарным файлом с использованием таблицы DataGridView
- •Порядок выполнения лабораторной работы.
- •Примеры обработчиков событий.
- •15.10 Задания на обработку бинарных файлов Общее указание для всех вариантов
- •Д обавляемые подпункты меню Работа1 и Работа2 по вариантам
- •Список литературы
- •Алфавитный указатель
- •Вопросы для самопроверки
- •Заключение
Окно сообщений MessageBox
Окно сообщения — это готовое модальное диалоговое окно, которое отображает пользователю текстовое сообщение. Окно сообщения демонстрируется при вызове статического метода Show класса MessageBox. Отображаемое текстовое сообщение — строковый аргумент, который можно передать методу Show. Несколько перегруженных версий метода Show также позволяют вам указать заголовок.
Чтобы позволить пользователю закрыть окно сообщения, метод Show отображает окно сообщения с кнопками ОК и Закрыть в заголовке.
Также можно с помощью окна сообщений задать пользователю вопрос. Пользователь отвечает нажатием одной из нескольких кнопок, указанных для отображения с помощью перечисления MessageBoxButton. Это перечисление можно передать нескольким перегруженным версиям метода Show. Значением по умолчанию для перечисления MessageBoxButton является OK.
Можно определить, какую кнопку нажмет пользователь, проанализировав значение, возвращенное методом Show. Возвращаемое значение — это значение перечисления MessageBoxResult, в котором каждое значение равно одной из кнопок, которые может отобразить окно сообщения. Значение по умолчанию для окна сообщения — OK, так как ОК в окне сообщения — кнопка по умолчанию. Однако некоторые перегруженные версии метода Show позволяют указать другое значение по умолчанию MessageBoxResult.
У окон сообщений всегда есть окно-владелец. По умолчанию владелец окна сообщения — это текущее активное окно в приложении в тот момент, когда окно сообщения открылось Однако можно указать другого владельца для окна Window, воспользовавшись одним из нескольких перегруженных версий Show. Дополнительные сведения об окнах-владельцах см. в разделе Window..::.Owner.
В этом примере демонстрируются способы отображения окна сообщения и получения возвращаемого значения.
Окно сообщения отображается путем вызова метода Show, который имеет несколько перегрузок, позволяющих настраивать вид и поведение окна сообщения, в том числе следующие его свойства:
Сообщение.
Заголовок окна.
Значок.
Кнопки.
Окно-владелец.
Специальные параметры, например, поддержка чтения справа налево.
Порядок выполнения лабораторной работы.
1.Создать макет формы, разместив на ней следующие компоненты
- RichTextBox – для отображения и редактирования текста файла (это визуальный компонент, отображаемый на макете формы прямоугольником),
- MenuStrip – для создания меню работы с файлами (этот компонент представляет синей полосой на макете формы непосредственно под заголовком окна полосой место размещения строки меню),
- OpenFileDialog – для использования стандартного диалога открытия файла (это невизуальный компонент),
- SaveFileDialog – для использования стандартного диалога сохранения файла (это невизуальный компонент).
Для компонента richTextBox1 установить моноширинный шрифт Courier New, для этого на вкладке Properties раскрыть подсписок Font и в раскрывшемся списке строки Name выберать Courier New.
2. Создать меню. В строке меню на макете формы в раскрывшемся списке корневому пункту меню дать имя Файл. Щелкнуть на очередном прямоугольнике меню, при этом появляются новые пункты ниже и справа. В текущем прямоугольнике набрать очередной пункт меню, например, Создать. Полный перечень пунктов меню может быть следующим: Создать, Открыть, Сохранить, Работа1, Работа 2, Очистить, Выход.
Для пунктов меню текст, отображаемый при работе программы, войдёт (без пробелов и без некоторых небуквенных символов) в имя объекта, если этот текст вводить так, как описано в предыдущем замечании, и не войдёт, если сначала выбрать из списка готовящегося пункта меню строку MenuItem, а затем в поле Text на вкладке Properties ввести отображаемое имя.
3. Создать события и обработчики событий для каждого пункта меню. Для создания события (в данном случае – выбор очередного пункта меню) следует выбрать очередной пункт меню и на вкладке Events окна Properties выбрать событие Click сделать двойной щелчок в поле справа. Событие можно создать и другим способом: выполнить двойной щелчок на выбранном пункте меню.
4. Создать события и обработчики таких событий, как создание формы, изменение размеров формы.
Для отслеживания изменений содержимого редактора вводится переменная flag (поле формы), которая принимает значение 0, если изменений не происходило, и 1, если произошло изменение содержимого редактора. Для установления факта изменения содержимого создается событие richTextBox1_TextChanged, обработчик которого и изменяет значение переменной flag.
Приведем примеры обработчиуов событий.
Обработчик события создание формы должен очищать содержимое текстового редактора, устанавливать его положене и разворачивать его до размеров клиентской части формы, а также устанавливает начальное значение переменной flag.
private:System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
this->richTextBox1->Clear();
this->richTextBox1->Location = Point(0,24);
this->richTextBox1->Size = this->ClientSize;
flag=0;
}
Обработчик события изменение размеров формы обеспечивает каждый раз изменение размеров текстового редактора до размеров формы и выводит (для информации) название текущего шрифта редактора.
private: System::Void Form1_Resize(System::Object^ sender, System::EventArgs^ e)
{
//расширить до границ клиентской области
this->richTextBox1->Size = this->ClientSize;
//текущий шрифт
this->richTextBox1->Text = this->richTextBox1->Font->Name;
}
Обработчик события создать проверяет наличие изменений в текстовом редакторе и, если они были, выводит окно сообщения о этом. Если пользователь подтверждает необходимость сохранения изменений, то производится сохранение измененного содержимого редактора (обращение к обработчику события сохранить), а затем выполняется очистка поля редактора. В протвном случае поле редактора сразу очищается.
private: System::Void создатьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
if(flag)
{
//MessageBoxButtons buttons = MessageBoxButtons::YesNo;
System::Windows::Forms::DialogResult result;
// Вывод MessageBox.
result = MessageBox::Show( this
,"Файл изменен.Сохранить?","Ошибка"
,MessageBoxButtons::YesNoCancel,MessageBoxIcon::Error);
if (result==System::Windows::Forms::DialogResult::Yes )
{
сохранитьToolStripMenuItem_Click( sender, e);
flag=0;
}
this->richTextBox1->Clear();
}
}
Обработчик события открыть прежде всего открывает диалог для выбора файла, содержимое которого должно быть загружено в редактор, а затем с помощью метода LoadFile выполняет загрузку в редактор. В случае ошибки в окне сообщений выдается соответствующее сообщение.
private: System::Void открытьToolStripMenuItem_Click(System::Object^ sender
, System::EventArgs^ e)
{
//функция открытия файла и вывода его на экран
// Создание запроса OpenFileDialog для открытия файла.
OpenFileDialog^ openFile1 = gcnew OpenFileDialog;
// Инициализация OpenFileDialog для RTF файлов.
// openFile1->DefaultExt = "*.rtf";
// openFile1->Filter = "RTF Files|*.rtf";
// Реализация выбора файла из OpenFileDialog.
if ( openFile1->ShowDialog()
== System::Windows::Forms::DialogResult::OK
&& openFile1->FileName->Length > 0 )
{
// Загрузка содержимого файла в RichTextBox.
richTextBox1->LoadFile( openFile1->FileName,
RichTextBoxStreamType::PlainText );
}
else
MessageBox::Show("Ошибка открытия файла");
flag=0;
}
Обработчик события сохранить вызывает диалоговое окно для задания имени файла, а затем с помощью метода SaveFile производится сохранения содержимого редактора в файле.
private: System::Void сохранитьToolStripMenuItem_Click(System::Object^sender
, System::EventArgs^ e)
{
//Вызов SaveFileDialog для запроса пути и имени файла,чтобы сохранить
//содержимое из редактора текста в выбранном файле.
SaveFileDialog^ saveFile1 = gcnew SaveFileDialog;
//Инициализация SaveFileDialog спецификации - RTF расширения для файла.
saveFile1->DefaultExt = "*.rtf";
saveFile1->Filter = "RTF Files|*.rtf";
// выбор файла в окне SaveFileDialog
if ( saveFile1->ShowDialog()
== System::Windows::Forms::DialogResult::OK
&& saveFile1->FileName->Length > 0 )
{
// Сохранение содержимого окна RichTextBox в файле.
richTextBox1->SaveFile( saveFile1->FileName,
RichTextBoxStreamType::PlainText );
}
else
MessageBox::Show("Ошибка открытия файла");
}
Обработчик события очистить с помощью метода Clear очищает содержимое редактора.
private: System::Void очиститьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
this->richTextBox1->Clear();
flag=0;
}
В качестве обработчиков событий Работа1 и Работа2 рассмотрим реализацию алгоритмов обработки текстового файла с информацией о студентах. Файл представляет собой совокупность строк, каждая из которых хранит информацию об одном студенте. Структура строки следующая (в скобках указаны длины полей и способ выравнивания): Номер студента (4, правое), Пробела(2), Название группы (8,левое), пробелы (2), Фамилия. (12, левое), Оценка1 (3, правое), Оценка2 (3, правое), Оценка3 (3,правое).
Например,
Предварительно с использованием пунктов меню создать и сохранить должно быть набрано содержимое файла (в текстовом редакторе) и сохранено в файле.
В качестве задания рассмотрим следующую задачу: в исходном файле найти информацию о всех студентах, чей средний балл по трем экзаменам превышает 4, и сохраняет эту информацию в новом файле, дополняя каждую строку значением среднего балла. Номера студентов в новом файле должны начинаться с единицы.
Во-первых, необходимо с помощью диалоговых окон выбрать имена исходного и результирующего файлов. При этом необходимо выполнить преобразование полученной строки (указателя на строку), содержащей имя файла, в массив символов типа char (указатель на тип char) (преобразование из управляемой кучи в неуправляемую). При этом необходимо в программу добавить строку с указанием области действия имени области, содержащей необходимую функцию.
using namespace System::Runtime::InteropServices;
Во-вторых, после открытия файлов следует производить последовательное считывание строк исходного файла. При этом считывание осуществляется по полям с указанием формата считываемых значений и преобразованием строки к соответствующему типу данных.
В-третьих, вычисляется средний балл и проводится его сравнение с заданным значением. Если условие выполняется, то результат выводится в результирующий файл, при этом записывается новый номер для каждого студента и исходная строка дополняется вычисленным средним баллом. Для проверки формируемых результатов результирующая строка выводится в текстовый редактор, при этом выполняется преобразование данных из типа char* в String^.
private: System::Void работа1ToolStripMenuItem_Click(System::Object^ sender
, System::EventArgs^ e)
{
FILE *f, *g;
char *fn, *gn;
int nomer,o1,o2,o3,i=0;
char gr[9],fam[13];
float sr;
OpenFileDialog^ openFile1 = gcnew OpenFileDialog;
SaveFileDialog^ saveFile1 = gcnew SaveFileDialog;
if ( openFile1->ShowDialog()
== System::Windows::Forms::DialogResult::OK
&& openFile1->FileName->Length > 0 )
{
fn=(char*)(void*)Marshal::StringToHGlobalAnsi(
openFile1->FileName->ToString());
if((f=fopen(fn,"r"))==NULL)
MessageBox::Show("Ошибка открытия файла ");
else
{
if ( saveFile1->ShowDialog()
== System::Windows::Forms::DialogResult::OK
&& saveFile1->FileName->Length > 0 )
{
gn=(char*)(void*)Marshal::StringToHGlobalAnsi(
saveFile1->FileName->ToString());
if((g=fopen(gn,"w"))==NULL)
MessageBox::Show("Ошибка открытия файла");
else
{
richTextBox1->Clear();
while (fscanf( f, "%d %s %s %d %d %d"
, &nomer, gr, fam, &o1, &o2, &o3 )>0)
{
sr=(o1+o2+o3)/3.0f;
if (sr > 4)
{
for (int j=strlen(fam); j<10; j++)
//добавьте # include "string.h"
strcat(fam," ");
String^ s=gcnew String("");
//Преобразование строки с 0
//в конце к типу String
String ^q = gcnew String(gr);
String ^p = gcnew String(fam);
//nomer автоматически преобразуется
//к типу String
s=s+nomer;
if (s->Length==1)
s=" "+s;
s=s+" "+q+" "+p+" "+o1+" "+o2
//"\n" переводят строку в richtextBox
+" "+o3+" "+sr+"\n";
//Добавить строку в richtextBox
this->richTextBox1->AppendText(s);
i++;
fprintf(g,"%2d %8s %10s%2d%2d%2d 8.2f\n”
,i,gr,fam,o1,o2,o3,sr);
}// if (sr > 4)
}// while (fscanf ///
}// else
}// if( saveFile1->...
fclose(f);
fclose(g);
}// else
}// if ( openFile1->
}// private: System::Void работа1ToolStripMenuItem_Click(...
В качестве второго примера обработки файла (Работа2) рассмотрим следующее задание: отобразить в окне редактора фамилии и оценки тех студентов, которые обучаются только на хорошо и отлично. Фамилии найденных студентов сохранить во втором файле.
private: System::Void работа2ToolStripMenuItem_Click(System::Object^ sender,
System::EventArgs^ e)
{
FILE *f, *g;
char *fn, *gn;
int nomer,o1,o2,o3,i=0;
char gr[9],fam[13];
float sr;
OpenFileDialog^ openFile1 = gcnew OpenFileDialog;
SaveFileDialog^ saveFile1 = gcnew SaveFileDialog;
if ( openFile1->ShowDialog()
== System::Windows::Forms::DialogResult::OK
&& openFile1->FileName->Length > 0 )
{
fn=(char*)(void*)Marshal::StringToHGlobalAnsi
(openFile1->FileName->ToString());
if((f=fopen(fn,"r"))==NULL)
MessageBox::Show("Ошибка открытиф файла1");
else
{
if ( saveFile1->ShowDialog()
== System::Windows::Forms::DialogResult::OK
&& saveFile1->FileName->Length > 0 )
{
gn=(char*)(void*)Marshal::StringToHGlobalAnsi
(saveFile1->FileName->ToString());
if((g=fopen(gn,"w"))==NULL)
MessageBox::Show("Ошибка открытия файла2");
else
{
richTextBox1->Clear();
while (fscanf( f, "%d %s %s %d %d %d"
,&nomer, gr, fam, &o1, &o2, &o3 )>0)
{
if (o1>=4&&o2>=4&&o3>=4)
{
//Преобразование строки с 0 в конце
//к типу String
String ^p = gcnew String(fam);
p=p+" "+o1+" "+o2+" "+o3+"\n";
//"\n" переводят строку
//в richtextBox
this->richTextBox1->AppendText(p); //Добавить строку в richtextBox
fprintf(g," %8s %2d%2d%2d\n" ,fam,o1,o2,o3);
i++;
}// if (o1>=4&&o2>=4&&o3>=4)
}// while (fscanf(
if (i==0)
fprintf(g,"нет\n");
}// else
}// if ( saveFile1->
fclose(f);
fclose(g);
}//else
}// if ( openFile1->...
}// private: System::Void работа2ToolStripMenuItem_Click
Обработчик события изменение содержимого редактора присваивает переменной флаг единицу, фиксируя тем самым факт изменения содержимого.
private: System::Void richTextBox1_TextChanged(System::Object^ sender, System::EventArgs^ e)
{
flag=1;
}
Обработчик события выход проверяет наличие изменений в текстовом редакторе и, если они были, выводит окно сообщения об этом. Если пользователь подтверждает необходимость сохранения изменений, то производится сохранение измененного содержимого редактора (обращение к обработчику события сохранить), а затем выполняется закрытие формы (окончание работы). В противном случае сразу выполняется закрытие формы.
private: System::Void выходToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
if(flag)
{
//MessageBoxButtons buttons = MessageBoxButtons::YesNo;
System::Windows::Forms::DialogResult result;
//Вывод MessageBox.
result = MessageBox::Show( this
,"Файл изменен.Сохранить?","Ошибка"
,MessageBoxButtons::YesNoCancel,MessageBoxIcon::Error );
if (result==System::Windows::Forms::DialogResult::Yes )
сохранитьToolStripMenuItem_Click( sender, e);
flag=0;
}// if(flag)
Close();
}// private: System::Void выходToolStripMenuItem_Click(
