Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на языке C# Консольные и оконные приложения. Лабораторный практикум. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Длинный список пунктов меню обычно разделяется на несколько блоков (разделов) сплошной линией. Для этого в окне редактора пунктов над левым списком в выпадающем списке необходимо выбрать не 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 Stu­dio и т. п.), как правило, обрабатываются данные считываемые и сохраняемые на дисках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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]