Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке C# Консольные и оконные приложения. Лабораторный практикум. Учебное пособие
.pdf
Длинный список пунктов меню обычно разделяется на несколько блоков (разделов)
сплошной линией. Для этого в окне редактора пунктов над левым списком в выпадающем
списке необходимо выбрать не Menu Item, а Separator, и нажать кнопку Add.
Пункт 3. Быстрое формирование списка команд
При добавлении компонента MainStrip на форме в ее окне вверху появляется строка меню на форме с единственным пунктом-пустышкой (окном редактирования текста).
Там вписан текст «Type Here». Ткнув мышкой в окно редактирования и заполнив его, задают наименование первого раздела меню. После этого справа появляется пункт-пустышка
для наименования другого раздела меню (заполняется по потребности). По мере заполнения пунктов меню появляется пустышка для новых пунктов (на правом рисунке вверху его
видно под системными кнопками). Если выделить имя уже созданного раздела, то внизу
появится пункт-пустышка для первого пункта меню в этом разделе. После заполнения появится пункт ниже.
Некоторые манипуляции с разрабатываемым пунктом меню можно выполнить, вызывав контекстное меню на этом пункте и дав соответствующую команду. Например, в пункте
Convert To выбрать подпункт Separator и преобразовать пункт в разделяющую линию.
Пункт 4. Создание обработчиков событий
Для создания обработчиков событий к пунктам меню можно воспользоваться одним из
трех способов:
просто выбрать нужный пункт меню в дизайнере формы и выполнить двойной щелчок
мышкой в нужный пункт меню; вписать в шаблон процедуры необходимые действия;
выбрать этот пункт в меню в дизайнере формы, а на вкладке Events обратиться к
строке Click; двойным щелчком мышкой создать шаблон; вписать в шаблон процедуры необходимые действия;
если процедура-обработчик уже ранее была создана
35
, на вкладке Events обратиться
к строке Click и в выпадающем списке указать (выбрать) имя процедуры, исполняющейся
при выборе этого пункта меню. Тогда при выборе пункта меню, во время выполнения программы, инициируется событие Click и запускается эта процедура-обработчик.
Пункт 5. Создание контекстного меню
Контекстное меню ContextMenuStrip заполняется аналогично. Отличие: это меню не
имеет горизонтальной полосы разделов меню, сразу заполняется список команд. Другое отличие, что каждый компонент ContextMenuStrip (для одной формы их может быть несколько)
привязывается к отдельному видимому компоненту формы (один, возможно, к форме).
Чтобы ContextMenuStrip меню вызывалось по нажатию правой кнопки мыши во
время работы программы, необходимо его привязать к конкретному видимому компоненту
или к форме. Для этого выбирают видимый компонент и в его свойстве ContextMenuStrip
инспектора объектов (на вкладке Properties) выбирают имя одного из ранее созданного
ContextMenuStrip меню.
Создания окон диалогов
Страница (раздел) Dialogs палитры содержит компоненты, используемые для создания
различных диалоговых окон, общепринятых в приложениях Windows. Применение стандартных, поставляемых в составе MS Visual Studio диалоговых окон помогает сэкономить время
на разработку приложения и придать ему совместимость с принятыми в Windows нормами
диалога. На странице Dialogs представлены компоненты для вызова стандартных диалогов
Windows. Объекты, представленные на данной странице, невидимы во время разработки и
выполнения. Эти компоненты отображаются на полосе внизу окна дизайна формы. Вызов
этих диалоговых окон происходит из программного кода, в обработчике вызова пункта меню
или кнопки. К таким стандартным диалогам относятся:
35
Например, для кнопки или другого элемента интерфейса.
61

OpenFileDialog – для выбора имени файлов на чтение;
SaveFileDialog – для выбора имени файлов для сохранения;
FontDialog – для создания окна диалога «Шрифты», с целью выбора шрифта;
СolorDiolog – для создания окна диалога «Цвет» и выбора цвета.
Открытие соответствующего диалогового окна в модальном режиме36 осуществляется
вызовом метода ShowDialog(). Завершение работы окна37 происходит после нажатия одной из соответствующих кнопок. Только теперь метод ShowDialog() прекращает работу и
возвращает результат типа DialogResult.
Если в диалоговом окне пользователь нажмет кнопку «OK» (или эквивалентные ей –
«Открыть», «Сохранить»), диалог закрывается и метод ShowDialog возвращает значение
DialogResult.OK, и выбранные пользователем установки отображаются в свойствах
(например, Font или Color), соответствующих невизуальным компонентам. Из этих свойств в
программе можно скопировать значения в соответствующую переменную. Если же пользователь отказался от диалога (нажал кнопку «Отмена» или клавишу <Esc>), то метод
ShowDialog() возвращает DialogResult.Cancel.
Компоненты OpenFileDialog и SaveFileDialog вызывают стандартные диалоги
Windows открытия и сохранения файлов (по сути, только для выбора имени файла и пути к
нему). Эти компоненты имеют свойство FileName, которое можно задать и перед обращени-
ем к диалогу. Тогда оно появится в диалоге как значение по умолчанию в окне «Имя файла».
Указание типов открываемых файлов
При использовании диалоговых окон типа OpenFileDialog и SaveFileDialog
пользователю интересно видеть не все файлы в текущем каталоге, а только определенного
типа, например текстовые или изображения. Типы искомых файлов, появляющиеся в диалоге
в выпадающем списке38 «Тип файла» задаются свойством Filter. В процессе проектирования
это свойство задается текстовой строкой вида
<текст на интерфейсе> | <маска> | <текст на интерфейсе 2> | <маска 2>
Например,
Bitmap files|*.bmp|Image files|*.jpg
Такой текст может быть длинен (при большом наборе вариантов фильтров). Поэтому
можно порекомендовать набрать такую строку в текстовом редакторе, а в свойство Filter потом его скопировать. Если в одном варианте несколько типов файлов, то разделять маски
необходимо знаком «точками с запятой» (;). Например,
Документы|*.doc;*.docx;*.txt
При этом в окошке с типами отображаемых файлов будет написан текст
«Документы (*.doc;*.docx;*.txt)», т. е. система формирует строку более информа-
тивную для пользователя.
Последним рекомендуется писать шаблон для любых файлов с маской «*.*», чтобы
пользователь в крайнем случае мог видеть и полный список файлов.
Ещё можно отметить свойство DefaultExt, в котором
указывается приписываемое
(добавляемое) по умолчанию расширение имени файла, который выбирается в диалоговом
окне SaveFileDialog. Другими словами, если пользователь напишет только имя, то окно
прибавит это расширение и передаст в программу.
Отдельно у класса SaveFileDialog можно еще выделить пару свойств:
CreatePrompt – при значении true в случае, если указан несуществующий файл,
то будет отображаться сообщение о его создании;
36
В этом режиме доступ к другим окнам программы заблокирован.
37
Но компонент продолжает жить. И с ним можно взаимодействовать из программного кода.
38
Окошко справа от строки «Имя файла:» или строка ниже, в зависимости от версии Windows.
62

OverwritePrompt – при значении true в случае, если указан существующий файл, то
будет отображаться сообщение о том, что файл будет перезаписан.
Все это позволяет быстро оформить интерфейс программы, которая будет выглядеть
профессионально.
Создания окон диалогов шрифта и цвета
Компонент FontDialog позволяет вызвать типовое диалоговое окно, где пользователь
может выбрать тип и другие параметры шрифта. Вызов осуществляется также методом
ShowDialog(). Завершение также проверяется на соответствующее значение DialogResult.
Основным свойством является свойство Font, которое и содержит параметры выбранного шрифта.
Окно отображается в минимальном комплекте. Поэтому возможно необходимо переключить и значения в других свойствах. Например, свойство ShowColor дополнит окно полем выбора цвета шрифта.
Воспользоваться полученными настройками легко. Например, чтобы изменить параметры шрифта в компоненте метка достаточно одного оператора присваивания:
label1.Font = fontDialog1.Font;
Но необходимо помнить, что набор свойств (полей) в классе (структуре) Font далеко
не полный в смысле потребностей программиста. Например, там нет данных о цвете шрифта. Поэтому для задания цвета шрифта в метке, выбранного пользователем, необходимо воспользоваться ещё одним оператором присваивания:
label1.ForeColor = fontDialog1.Color;
Другие свойства используются более редко.
Для выбора пользователем только цвета используется типовое диалоговое окно «Цвет».
Для отображения такого окна используется компонент ColorDialog. Основным свойством
этого компонента является Color – свойство, из которого можно получить значение цвета,
выбранного пользователем. Например, как и в предыдущем примере цвет шрифта метки
можно задать оператором:
label1.ForeColor = colorDialog1.Color;
Практически все типовые диалоговые окна здесь перечислены. Есть еще типовое окно
для выбора каталога (директории), но оно применяется значительно реже, оно аналогично
рассмотренным и может быть освоено самостоятельно. Отдельный набор окон составляют
типовые окна настройки различных параметров при печати документов (раздел Printing).
Примеры работы с диалоговыми окнами
Для лучшего понимания работы
со стандартными диалоговыми окнами можно приве-
сти следующие примеры решения типовых задач.
Пример 1. С использованием компонента FontDialog выбрать нужный фонт для
метки
Label1.
Решение:
if (fontDialog1.ShowDialog() == DialogResult.OK)
label1.Font = fontDialog1.Font;
Пример 2. С использованием компонента СolorDialog выбрать нужный цвет для
однострочного редактора TextBox.
Решение:
if (colorDialog1.ShowDialog() == DialogResult.OK)
textBox1.BackColor = colorDialog1.Color;
63

Компоненты рисованных форм Shape
Иногда для улучшения внешнего вида формы необходимо нанести на нее рисованные
формы. Рисование по форме и другим элементам интерфейса – это отдельная трудоемкая задача. Но MS VS C# содержит несколько компонентов отображающих стандартные геометрические фигуры – линию, эллипс, прямоугольник. Эти компоненты находятся в разделе Visual
Basic Power Pack.
Компонент LineShape отображает линию
на форме. К основным можно отнести сле-
дующие свойства:
BorderColor (Appearance) – цвет линии;
BorderStyle (Appearance) – стиль линии (сплошная, пунктирная, штрихпунк-
тирная);
BorderWidth (Appearance) – толщина линии;
X1, Y1, X2, Y2 (Layout) – координаты начальной и конечной точки на форме, в пик-
селах.
Компонент OvalShape отображает эллипс на форме. К основным можно отнести следующие свойства:
BorderColor (Appearance) – цвет линии;
BorderStyle (Appearance) – стиль линии (сплошная, пунктирная, штрихпунктирная);
BorderWidth (Appearance) – толщина линии;
FillColor (Appearance) – цвет заливки области;
FillStyle (Appearance) – стиль заливки (сплошная, решетчатая);
Location, Size (Layout) – координаты начальной точки и размеры.
Компонент может иметь и градиентную заливку. Тогда необходимо указать стиль заливки и второй цвет.
Компонент RectangleShape отображает прямоугольник на форме. Имеет те же основные свойства. Еще можно отметить свойство:
CornerRadius (Appearance) – радиус закругления углов.
Этот компонент отображает не только прямоугольник, но и прямоугольник с закругленными углами, вплоть до того, что меньшая сторона превращается в полуокружность.
При решетчатой заливке еще может потребоваться настройка фонового цвета и его
прозрачность. Помимо этого, такие компоненты могут выбираться (выделяться) пользователем в ходе работы программы. Поэтому может оказаться актуальным настройка и цвета выделения фигуры.
Контрольные вопросы
1. Для чего используется компонент MainMenu? Как заполнить его пункты?
2. Чем отличается создание ContextMenuStrip от MainMenu? OpenFileDialog
от SaveFileDialog?
3. Как добавить новый пункт к меню?
4. Как создать контекстное меню?
5. Как вызвать дизайнер меню? Перечислить и объяснить различные способы.
6. Как перейти к обработчику событий для пунктов меню?
7. Перечислите некоторые свойства FontDialog и СolorDiolog?
OpenFileDialog и SaveFileDialog?
8. Как создать фильтр для выбора файлов?
9. Какой смысл вкладывается в термин «Открыть диалог»?
64

Варианты заданий
Для освоения работы с описанными выше компонентами меню и стандартных диалоговых окон необходимо выполнить следующие задания.
Вариант 1
Создать приложение, в главном меню которого содержатся пункты:
а) настройки цветов следующих визуальных компонентов: формы, DataGridView,
TextBox (многострочный), компонента Shape (прямоугольника);
б) чтения из имеющегося графического файла информации
в компонент Image;
в) записи в новый файл информации из TextBox (многострочный); рекомендуется
сымитировать запись переписыванием текста в ListBox;
г) выход.
В контекстном меню компонента TextBox (многострочный) содержатся пункты: изменения шрифта и изменение цвета компонента TextBox (многострочный), запись в
TextBox (однострочный) имени нового файла.
Вариант 2
Создать приложение, в главном меню которого содержатся пункты:
а) настройки цветов следующих визуальных компонентов: формы, Label, компонента Shape (прямоугольника с округлыми вершинами);
б) чтения из имеющегося текстового файла информации в компонент ListBox;
в) выход.
В контекстном меню Label – изменения шрифта и изменение цвета компонентов
TextBox, DataGridView и записи в Label имени нового файла.
Вариант 3
Создать приложение, в главном меню которого содержатся пункты:
а) настройки цветов следующих визуальных компонентов: формы, Label, компонента Shape (эллипса);
б) чтения из имеющегося графического файла информации в компонент Image;
в) записи в файл информации из TextBox (многострочный);
г) выход.
В контекстном меню TextBox (однострочный) – изменения шрифта и изменение цвета компонентов Label, TextBox и записи в Label имени нового файла.
65

Лабораторная работа № 14
Создание приложения потокового чтения и записи данных на диск
в среде MS VS C#
Цель работы: приобрести практические навыки в использовании потоковых объектов
и стандартных сообщений.
Методические указания
Приложения, обрабатывающие данные большого объема, считывают эти данные с диска или
из баз данных. Для хранения и обработки данных разрабатываются специальные форматы файлов
и процедуры чтения и записи. Данные небольшого размера удобно формировать и хранить в виде
текстовых файлов. Это позволяет готовить данные с помощью простейших текстовых редакторов,
просматривать результаты вне программы, обрабатывать такие данные и другими программами,
например, входящими в стандартный пакет MS Office. Также в таком формате удобно контролиро-
вать работу программы на стадии тестирования и обучения работе с файлами.
С внедрением элементов объектно ориентированного в универсальных языках программирования появились классы потокового чтения/записи файлов. Такие классы есть и в MS VS C#.
Общий порядок работы программы с файлами
В профессиональных приложениях, написанных на MS Visual (Builder, Delphi, RAD Studio и т. п.), как правило, обрабатываются данные считываемые и сохраняемые на дисках39.
При разработке кода программы, работающей с файлами (в текстовом или нетекстовом
формате), необходимо понимать общую логику взаимодействия программы с файлом.
Структура и порядок работы приложения с файлом следующие:
В программе (или подпрограмме) описывается переменная файлового типа, пусть
будет F. При работе через потоки это переменная потокового типа.
Выполняется процедура открытия файла на чтение (или запись). Здесь текстовый
путь и имя файла используются чтобы однозначно указать, какой именно файл требуется
программе и через Windows выполнить открытие файла на чтение (запись) и привязать этот
файл к программе, конкретно к файловой переменной F. Другими словами, потом программа
взаимодействует с файлом через эту специальную переменную F, которая хранит информацию о текущей позиции в файле и т. п.
Выполняются многократные операции чтения файла до достижения конца. Могут
выполняться перемотки файла на начало или произвольную позицию. Если файл для записи,
то выполняется многократное дописывание новой информации.
Выполняется процедура закрытия файла.
Из всего сказанного необходимо усвоить, что при работе программы с файлом образуется целая цепочка контрагентов: программа – файловая переменная – ОС Windows – драй-
вер диска – файл.
Но при разработке приложения достаточно помнить и хорошо владеть операторами открытия файла, чтения/записи и закрытия через файловую переменную соответствующего типа. Все остальное сделают компилятор и ОС.
Внимание! Процедура закрытия файла (особенно при записи) является очень важным
элементом в работе с файлом.
Настоятельный совет! При работе с проектом на собственной флеш-карте файл для
записи указывать в папке C:\TEMP или на диске40 S:\. Некорректная работа программы с за-
писью в файл может привести к порче информационного поля флеш-карты (у вас там мате-
риалы и по другим дисциплинам). Указанные папки компьютера достаточно хорошо защище-
ны операционной системой.
39
Здесь упоминаются только диски. Но описанный порядок работы с файлами един для всех видов внешних
носителей. Это единство обеспечивается операционной системой, в частности Windows.
40
Имеется в виду, что писать файл можно непосредственно в эти папки, а можно создать в них свою папку и
писать в неё.
66

Операторы потокового чтения/записи текстовых файлов
Описание переменной потокового типа для чтения текстового файла выполняется опе-
ратором описания переменной и её инициализацией:
FileStream <имя> = new FileStream (<путь>, <метод>);
FileStream <имя> = File.OpenRead (<путь>);
StreamReader <имя> = new StreamReader (<путь>).
Здесь указаны два типа файловой переменной. Первые две строки – это два способа создания переменной одного типа. Эти операторы описывают и создают файловые переменные
именно на чтение. Первый способ создает переменную посредством конструктора класса
FileStream. Здесь же одновременно происходит и открытие текстового файла на чтение.
Второй способ – через метод класса File. Но файловые переменные типа FileStream
позволяют читать файл только побайтно. Это удобно, когда файл хранит данные во внутреннем формате переменных. Файлы такого типа здесь рассматриваться не будут.
Третья строка – это создание файловой переменной типа StreamReader, для чтения
файлов с текстовой информацией. Такие файлы могут подготавливаться в простейших текстовых редакторах, где и тексты, и числа пишутся в текстовом виде, подобно экрану консоли.
Этот тип файловой переменной имеет несколько конструкторов, с различными списками параметров. Но здесь рассматривается простейший. Пример открытия текстового файла
на чтение, находящегося в указанной папке:
StreamReader fsr = new StreamReader("C:\\TEMP\\mass.txt");
Операция открытия может завершиться неудачей. Поэтому хорошая программа должна
проверять, было ли открытие успешным, и выдавать внятное сообщение пользователю. Проверка на успешное открытие файла можно осуществить оператором if, например:
if (fsr != null)
MessageBox.Show("Файл открыт успешно!", "Открытие файла");
Но, к сожалению, если при открытии произойдет сбой, то “вылетит” системное сообщение об ошибке, т. е. до этой проверки дело и не дойдёт.
Предварительно проверить существование файла можно оператором класса File:
File.Exists (<путь>);
Но отлавливать другие сбои при открытии, видимо, необходимо в программном блоке try.
Чтение данных текстового файла можно осуществлять операторами Read,
ReadBlock, ReadLine, ReadToEnd, файловой переменной типа StreamReader. Они
позволяют читать данные по одному символу, блоками, строками, а то и «прочитать одним
махом» весь файл (остаток файла) в одну переменную-строку.
К сожалению, этот класс позволяет читать только тексты посимвольно или строками.
Разбор строки по словам или на другие составляющие осуществляются уже в памяти другими
операторами. Если в файле указаны числа, то их конвертирование необходимо выполнять отдельным кодом.
Чтение текстового файла может сопровождаться ошибками в момент выполнения чтения.
Этот факт можно «
if (((line = fsr.ReadLine()) == null))
// выполнить необходимые при ошибке действия
{
// может быть выдать окно сообщения пользователю
}
Текстовый файл с массивом может иметь следующий формат – количество данных (целое), данные (вещественные) по одному числу в строке41. Такой файл можно
читать построчно и тут же конвертировать каждую строку в целое или вещественное
число (рис. 1).
41
Данных может быть значительно больше, чем указано. Подготовив один раз такой файл и меняя «количе-
ство» можно запускать тот же EXE (не компилируя) для обработки как малого набора данных, так и большого.
Более того, в такой файл в нижних дополнительных строках можно вписывать текст с пояснениями. Они не
помешают, т. к.
отловить» тем, что проверить, «породилась ли» строка оператором чтения:
500
1.2
–2.34
5.67
…
–0.02
Рис. 1
программа считывает только указанное количество чисел, а остальное проигнорирует.
67

Числа могут быть записаны неверно42 или там вообще может быть буквенный текст.
Проверка на ошибки чтения строки и конвертирования данных во внутренний формат может
быть выполнено, например, таким кодом.
Листинг 1. Пример чтения файла с одномерным массивом:
StreamReader fsr = new StreamReader(@"C:\\TEMP\\mass.txt");
String line;
int cou;
bool flag = true;
if (flag = (line = fsr.ReadLine()) == null || !int.TryParse(line, out cou))
{ MessageBox.Show("Не удалось прочитать количество!",
"Количество элементов");
return; // уже имеем flag = false;
}
double[] arr = new double [cou];
for (int i = 0; i < cou; i++)
if (((line = fsr.ReadLine()) == null) ||
!Double.TryParse(line, out arr[i]))
{ MessageBox.Show("Не удалось считать " + (i+1).ToString() + " элемент!",
"Чтение элемента");
flag = false;
break;
}
if (flag)
{ // если предыдущий цикл закончился успешно, то с
}
// массив удалится автоматически в конце функции
fsr.Close(); // закрыть поток
массивом можно что-то
Конечно, файл может содержать и пустые разделяющие строки. Тогда необходимо
усложнить проверку, чтобы пропускать такие строки.
Некоторые программы читают файл до конца, т. е. программа может быть разработана
так, что не определено количество данных (строк в файле) ни в коде программы, ни в первых
стоках файла, и она читает, пока не встретится символ «конец файла». Проверку на окончание файла можно осуществить оператором
if (fsr.EndOfStream)
{
// действия при окончании файла
}
Желательно избегать разработки такого рода программ, т. к. они требуют дополнитель-
ной особой отладки на признак конца файла.
Закрытие файла осуществляется оператором:
fsr.Close();
Применять этот оператор желательно, т. к. если не закрыть файл, то ОС будет считать та-
кой файл недоступным, заблокированным для других приложений, и второй запуск программы или открытие файла другой программой могут быть невозможны до перезагрузки ОС.
Работа с файлами на запись во много сходна c манипуляциями при чтении.
43
Описание переменной
файлового типа на запись с одновременным открытием файла
на запись осуществляется операторами:
StreamWriter fsw = new StreamWriter("X:\\AST\\6A61.txt");
42
Дробная часть вещественных чисел отделена «,» (запятой), а программа ждет «.» (точку). Или пользователь
по ошибке указал не тот текстовый файл.
43
Имя переменной, как и всегда, придумывает программист. Но здесь имя составлено из первых букв слов file
stream writer.
68

Проверка на ошибки открытия файла осуществить сложно, т. к. сам конструктор
(в операторе new) вызовет системную ошибку. Поэтому для написания безопасного кода
необходимо блок работы с файлом заключить в специальный оператор try…catch.
Запись данных в текстовый файл, например fsw, выполняется через операторы Write,
WriteLine. Оператор Write выводит одну переменную, но любого типа – целого, вещественного, строку, т. е. таким оператором можно выводить сразу переменные в файл, без
предварительной конвертации в строку текста44, например:
fsw.Write(arr[i]);
Здесь arr[i] – элемент массива. Но необходимо учитывать, что такой оператор «не
выводит лишнего», т. е. если его поместить в тело цикла, то такой цикл выведет набор цифр
и запятых. Различить начало очередного числа будет невозможно. Поэтому после такого
оператора должен стоять оператор fsw.Write(“”); – для вывода пробела.
Или выводить значения оператором fsw.WriteLine();. Этот оператор аналогичен
оператору Wrtite, но он автоматически дополнительно выводит символ признака конца
строки, чтобы каждый элемент массива выводился в отдельную строку.
Закрытие файла осуществляется оператором
fsw.Close();
Применять этот оператор строго необходимо, т. к. программа сбрасывает данные в ОС,
точнее в буферную переменную файла, а уже ОС организует запись заполненного буфера на
диск. К завершению программы буфер наверняка будет не полон и ОС не сбросит его на диск.
Оператор Close() заставляет ОС перебросить остатки данных на диск и выполнить закрытие
файла, т. е. записать все необходимые пометки, положенные файлу на диске. Неиспользование
оператора Close() приведет к потере конечных записанных данных.
Стандартные окна сообщений
При выполнении программы могут возникать нештатные ситуации. Хорошая програм-
ма должна отслеживать возникновение таких ситуаций и выдавать окно с сообщением пользователю. Для выдачи сообщений можно создать окна (формы) особого вида. Но MS VS C#
предлагает целый набор функций, которые вызывают типовые окна с сообщениями. Текст
сообщения и другие параметры программист может заложить в код программы.
В MS VS C# существуют функции, реализующие простые типовые диалоги, обеспечи-
вающие отображение сообщения пользователю и получение от пользователя ответа в виде
кода завершения
.
Простейшую задачу – информирование пользователя сообщением – можно решить при
помощи статического метода Show класса MessageBox. Заголовок окна, текст сообщения,
кнопки и значки, отображаемые в окне сообщения, определяются параметрами, которые указываются при вызове метода. Пример вызова простейшего окна сообщения:
MessageBox.Show("Не удалось открыть файл!");
Порождаемое диалоговое окно состоит только из статического текста Msg и кнопки OK.
Вариант вызова
MessageBox.Show("Файл открыт успешно!", "Открытие файла");
дает такое же окно, но уже с заголовком.
Этими окнами можно выдать сообщение пользователю в модальном режиме. По про-
чтении сообщения пользователь закроет окно и только после этого будет иметь доступ к другим окнам приложения.
44
Здесь имеется в виду, что то автоматическое преобразование в текст, которое встроено в оператор Write,
устраивает программиста. Если необходимо специфическое преобразование значения в текст, то это делается в
коде программы.
69

Когда после информирования пользователя от него требуется получить определенный
ответ (а не единственный OK), можно применить более45 полный вариант вызова этого метода класса:
MessageBox.Show("You must enter a name.", "Name Entry Error",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
В этом примере дописывается параметр с кнопкой и иконкой. Поскольку текст сообще-
ния может быть длинным, а кнопок несколько, то можно предварительно в отдельные переменные (с короткими именами) присвоить соответствующие значения, а потом вызвать метод указав в параметрах эти переменные. (вызов будет выглядеть компактно; код будет более
читабельным). Например, можно написать такой код:
Листинг 2. Пример вызова окна с сообщением и обработкой ответа пользователя:
string message = "You did not enter a server name. Cancel this operation?";
string caption = "Error Detected in Input";
MessageBoxButtons buttons = MessageBoxButtons.YesNo;
MessageBoxIcon icon = MessageBoxIcon.Stop;
DialogResult result;
// и теперь отображаем окно сообщений -- MessageBox.
result = MessageBox.Show(message, caption, buttons, icon);
// анализируем и предпринимаем действия
switch (result)
{
case DialogResult.OK: /* действия */ ; break;
case DialogResult.Yes: /* действия */ ; break;
case DialogResult.No: /* действия */ ; break;
case DialogResult.Ignore: /* действия */ ; break;
case DialogResult.Abort: /* действия */ ; break;
}
Текстовая информация содержится в строке message, а заголовок окна в caption.
(В этом примере проверяется ответов больше, чем заложено в кнопки окна. Достаточно
только тех ответов, что заложены в кнопки.) Часто достаточно проверить только одно значение (из двух), например:
if (result == DialogResult.Yes) { действия }
Константы класса MessageBoxButtons, определяющие комбинации кнопок (или отдель-
ную кнопку): AbortRetryIgnore, OK, OKCancel, RetryCancel, YesNo, YesNoCancel.
Константы класса MessageBoxIcon, определяющие иконку на окне: Asterisk,
Error, Exclamation, Hand, Information, None, Question, Stop, Warning.
Константы класса DialogResult, определяющие результат, возвращаемый при за-
крытии окна: Abort, Cancel, Ignore, No, None, OK, Retry, Yes. Константа
None озна-
чает, что диалоговое окно не вернуло никакого результата.
Все эти классы входят в пространство имен System.Windows.Forms.
Контрольные вопросы
1. Какие типы файловых переменных существуют в языке C#?
2. Какие основные действия должна выполнить программа при работе с файлом для
чтения данных? С файлом для записи данных?
3. Как проверить наличие ошибок при работе с файлом?
4. Как можно решить задачу информирования пользователя во время работы
программы?
5. Как задать свой набор кнопок на окне сообщения типа MessageBox?
6. Как задать свой заголовок на окне сообщения типа MessageBox?
7. Как задать свой текст сообщения на окне сообщения типа MessageBox?
45
Есть варианты вызова с более расширенным списком параметров.
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
