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

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

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Лабораторная работа № 10
Использование функций времени при разработке оконного приложения
в среде MS VS C#
Цель работы: приобрести практические навыки в работе с таймерами.
Методические указания
Некоторые программы требуют учёта времени во время работы пользователя, реги­страции текущей даты и т. п. В этом случае в программе используются типы и функции ра­боты со временем.
Некоторые функции определения даты и времени
Для работы со временем, как текущим, так и произвольным, в MS VS C# используют переменные класса DateTime.
Для опроса текущего момента можно использовать функция Now этого класса, которая возвращает дату и время.
Функция этого класса Today, возвращает только нынешнюю дату. Поля, отвечающие за время, обнуляются.
Переменная типа DateTime имеет сложную структуру – много полей и методов. В частности, в её отдельных полях Day, TimeOfDay, Month, Hour, Minute, Second мож­но узнать значение день, время (с долями секунды), месяц, час, минуту, секунду.
Как саму переменную, так и любое её поле можно легко перевести в текстовый формат, вызвав у соответствующего поля (или самой переменной) метод ToString().
Примеры использования функций времени:
1. Оператор
textBoxl.Text = "Сегодня: " + DateTime.Now.ToString();
помещает в окне textBoxl текст вида "Сегодня: 20.03.17 10:25:01".
2. Коды
DateTime dateNow = DateTime.Now;
или
DateTime dateToday;
dateToday = DateTime.Today;
определяют переменную типа DateTime и инициируют её путём опроса времени у опера­ционной системы при описании или в отдельном операторе.
3. Код программы
DateTime dateNow = DateTime.Now;
textBox2.Text = "Сегодня: " + dateNow.Date + " (" + dateNow.DayOfWeek + ")";
помещает в окне textBox2 текст вида "Сегодня: 19.03.2017 0:00:00 (Sunday)". Чтобы избавиться от обнулённого поля времени, придётся склеивать текст из полей «день», «месяц» и «год».
Примечание. Обратите внимание, что не всегда необходимо использовать функцию преобразования к тексту ToString(). Иногда компилятор генерирует необходимый код автоматически.
4. Если вам надо зафиксировать интервал времени, на протяжении которого выполня-
ются какие-то длинные вычисления, вы можете сделать это следующим кодом:
1) ввести переменную, например с именем Tl, типа DateTime как глобальную или
поле класса24;
2) занести в эту переменную время начала работы программы:
DateTime Tl = DateTime.Now;
24
Второй вариант предпочтительней.
41
5. Далее по коду программы, где-то после окончания таймируемого процесса, исполь-
зовать, например, такой оператор:
textBox3.Text = “Прошло ” + (DateTime.Now.TimeOfDay -
stTime.TimeOfDay).ToString();
Здесь выполняется простое вычитание, и оно уже преобразуется к текстовому виду. В результате в окно textBox3 будет помещен текст вида «Прошло 00:00:03.4816241». Что­бы избавить от долей секунды, надо склеить текст вывода из часов, минут, секунд. Конечно, чтобы зафиксировать большой интервал времени, надо организовать «длительный» процесс. Например, можно поместить две кнопки «Старт» и «Финиш», а разницу времени нажатия этих кнопок отобразить.
Компонент Button
К дополнительным свойствам компонента Button можно отнести такие, которые поз­воляют задавать следующие возможности:
задавать/настраивать цвет надписи; это обеспечивает свойство ForeColor (Ap-
pearance); для выбора значения необходимо нажать «» (справа от поля), а в выпавшем ме- ню выбрать раздел Custom, Web или System, а в разделе – желаемое значение;
возможность иметь на кнопке не только надпись, но и иконку или картинку (свой-
ство Image (Appearance)); для этого необходимо нажать кнопку «…» (справа от поля); в диалоговом окне Select Resource выбрать место расположения картинки – на диске или в файле ресурсов; в стандартном диалоговом окне найти на диске подходящую картинку формата .bmp, .gif, .jpeg и т. п.; кроме этого, есть возможность по-разному размещать надпись и иконку относительно друг друга (свойство ImageAlign (Appearance)); необхо­димо нажать «» и в мнемонической схеме выбрать положение рисунка;
аналогично можно выбирать положение текста на кнопке в поле TextAlign (Ap-
pearance); можно выбирать тип наложения текста на картинку в поле TextImageRelation (Appearance);
возможность задавать стандартное функциональное действие кнопки (свойство
DialogResult (Behavior)), а не писать код в обработчик события Click(); такое поле удобно использовать при разработке формы в виде диалогового окна; тогда достаточно настроить это поле, и кнопка будет закрывать окно и возвращать соответствующее значе­ние – OK, Cancel и т. п.
Использование этих свойств
улучшает внешний вид окна программы, показывает про-
фессионализм разработчика.
Технология подключение кнопок с иконками
Для подключения кнопки типа Button с учетом новых возможностей можно проде-
лать примерно следующие действия:
1. Потянуть за нижний угол формы и увеличить площадь формы.
2. На форму поместить кнопку Button с панели Toolbox, со страницы
Controls или All Windows Forms.
3. Свойство Text кнопки исправить на соответствующее. Подобрать соответствующий
шрифт и цвет надписи – свойства Font и ForeColor.
4. В свойстве Image справа нажать кнопку «…». В диалоговом окне Select Resource
выбрать место расположения картинки – на диске или в файле ресурсов:
если выбрано Local Resource, то нажать кнопку Import… и в стандартном диало-
говом окне найти на диске подходящую картинку формата .bmp, .gif, .jpeg и т. п.
Закрыть стандартное диалоговое окно по кнопке Открыть. Закрыть окно Select Re-
source, нажав OK;
если выбрано Project resource file, процесс картинки выполняется в два этапа – со-
ставление списка картинок (заполнение файла ресурсов), а уже из списка выбирается
42
Common
картинка. Для пополнения списка по кнопке Import… открывается стандартное диало-
говое окно Select Resource и выбирается файл с картинкой. Для выбора картинки в
списке указывается нужная строка и нажимается кнопка OK.
5. В свойствах ImageAlign, TextAlign и TextImageRelation выбрать раз-
личные значения и смотреть результат на кнопке Button. Выбрать подходящее значение.
6. Подготовить и написать обработчик на событие Click().
Результаты можно проконтролировать непосредственно на форме окна, на вкладке ди­зайнера.
Технология выбора стандартного вида работ кнопок с иконками Button
Для организации работы кнопок на диалоговых окнах (модальный режим) достаточно выбрать тип результата нажатия кнопки. Результат работы окна будет совпадать с типом ре­зультата кнопки. Настройку кнопки можно выполнить следующими шагами:
1. На форму поместить кнопку Button с панели Toolbox, со страницы Common
Controls. Кнопку разместить в правом нижнем углу формы.
2. Свойство DialogResult установить в требуемое значение.
3. Свойство Text установить в значение &Закрыть. Подобрать соответствующий
шрифт и цвет надписи.
4. В свойствах ImageAlign, TextAlign и TextImageRelation выбрать подхо-
дящие значения.
5. Сохранить проект. Запустить задачу на выполнение. Убедиться в корректности ра-
боты программы:
нажатие кнопки приводит к завершению задачи; нажатие комбинации клавиш <ALT+З> приводит к завершению задачи (возмож-
но, что только при включенной русской раскладке).
Примечание. Корректность реакции кнопки необходимо проверять в диалоговом окне при работе про-
граммы.
Технология подключения компонента Timer
Для организации работы периодически происходящих процессов в программе, можно использовать компонент Timer (Components). Суть его функционирования в следующем: после настройки параметров работы и активизации, компонент периодически запускает не­которую функцию (обработчик события), которая делает некоторую короткую работу. Такое действие на короткий промежуток времени прерывает работу программы, быстро выполня ется и возвращает управление программы. Создается впечатление, что в программе что-то выполняется в фоновом режиме, помимо основных действий.
Компонент Timer «бросается» на форму, аналогично другим компонентам. Но он не является визуализируемым (он невидимый). Поэтому отображается не на форме, а на панели, ниже формы.
Для настройки параметров компонент выбирается на
панели (а не на форме). Основны-
ми параметрами компонента Timer являются:
Name (Design) – имя объекта в программе;
Interval (Behavior) – интервал (период) запуска обработчика события; значение зада-
ется в миллисекундах – 1000 мс = 1 с;
Enabled (Behavior) – является ли таймер активным (выдает тики, активизирует пери-
одически обработчик события) или пассивным (бездействует);
Tick (Behavior) – обработчик события, который периодически активизируется тай-
мером.
Таким образом для использования компонента Timer необходимо бросить его на фор­му (на дополнительную панель). Настроить его параметры. Настройка параметров может выполняться и в ходе работы программы. Переключение значение свойства Enabled в ходе работы программы позволяет запускать таймер или приостанавливать его работу.
-
43
Контрольные вопросы
1. Как подключается картинка для кнопок Button?
2. Как использовать переменные типа DateTime?
3. Как преобразовать значения, возвращаемые функциями, предназначенными для ра-
боты с датами и временем, в строку?
4. Как получить текст вида "Сегодня 25.02.16"?
5. Как подсчитать время, соответствующее длительности вычислительного процесса?
Варианты заданий
Создать однооконное приложение
. На форме разместить поля ввода для переменных,
использованных для вычисления по формуле. К одной из кнопок подключить обработчик
Click(), в котором организовать передачу и преобразование данных во внутренние пере­менные, вычисление и передачу результата на форму. Вычисления проводить непосред- ственно по указанной формуле. Не упрощать выражение. При желании на форму можно добавить третью кнопку и вычислить результат по упрощенной формуле.
Программа должна выполнять вычисления по одной из формул, в зависимости от вы­полнения условия, указанного справа.
На форме разместить два поля. В первом, на старте программы, отобразить текущую дату, можно и время старта программы, т. е. текущее время на момент старта. Во втором отображать секунды (а потом и минуты), прошедшие с начала работы программы.
Вариант 1
5
tg , 7, 2;
xe i i
 

ln(3) sin ( ), 7;
yii
   
a

nx i
ik
i
23

k
1
56
k
7
остальные .,
Вариант 2
7

sin , 5, 2;
kixnkk
 

ye kk
  
sin ( ) остальные .

2
ln(3 )
x
k
,1, 3;
m
34
1
i
ke k
,
3
Вариант 3
m
 
i
 

yxbxd
cos 2 , ;

tg sin , ;
kx axb


3

2
7
4
sin , остальные .
 
kn x

44
Лабораторная работа № 11
Разработка многооконного приложения в среде MS VS C#
Цель работы: получить практические навыки разработки приложений с интерфейсом, состоящим из нескольких окон; работы с основными визуальными компонентами в среде
MS Visual Studio C#.
Порядок выполнения работы
Рекомендуется следующий порядок выполнения данной лабораторной работы:
1. Подготовить интерфейс главной формы, как это показано на рис. 1.
Рис. 1. Рекомендуемая форма главного окна приложения
2. Подготовить обработчик событий под кнопку «Выход».
3. Добавить новую форму к проекту и связать ее с кнопкой «Задача 1».
4. Убедиться, что связка работает.
5. Добавить новую форму к проекту и связать ее с кнопкой «Задача 2».
6. Разработать (на Form2) интерфейс решения задачи 1, подобно тому, как это показано
на рис. 2. Разместить визуальные компоненты на форме и установить необходимые свойства.
Рис. 2. Интерфейс формы для решения задачи 1
7. Подготовить обработчики событий.
8. Разработать (на Form3) интерфейс решения задачи 2, подобно тому, как это показа-
но на рис. 3.
9. Разместить визуальные компоненты на форме и установить необходимые свойства.
45
10. Синхронизировать действия ListBox и ComboBox (в тех заданиях, где необходи-
мы такие компоненты).
11. Убедиться, что действия синхронизированы.
12. Подготовить остальные обработчики событий.
Рис. 3. Интерфейс формы для решения задачи 2
Методические указания
Для реализации проекта в этой лабораторной необходимо использовать уже знакомые компоненты (TextBox), но новые их свойства и компоненты (ListBox, ComboBox).
Компонент TextBox
Компонент TextBox является однострочным редактором. Но у него есть и иная форма – многострочная. Эта форма подразумевает работу с небольшими текстами. Компонент TextBox может переносить слова25, сохранять в Clipboard фрагменты текста и восстанавли­вать их и имеет другие основные функции простейшего текстового редактора.
Компонент представляет собой многострочный редактор текста. Отображается на фор­ме прямоугольной областью для ввода и редактирования множества строк информации. Со­держимое области редактирования определяет массив строк, являющийся значением свой­ства Lines. На стадии
справа («
…»), в поле значения этого свойства.
Свойства компонента TextBox, используемые в режиме многострочного редактора26:
Lines (Appearance) – ссылка на строки редактора; в режиме разработки позволяет
вызвать окно для редактирования строк, отображаемых на старте программы; в режиме ра­боты программы позволяет считывать, пополнять и удалять строки;
TextAlign (Appearance) – задает тип выравнивания текста в окне редактора;
AcceptsReturns, AcceptsTab – определяет, вводятся символы <Enter> и
<Tab> в текст редактора или остаются управляющими командами для всей формы проекта27. Если эти поля имеют значения True, то переместиться на другую компоненту можно по кла­вишам <Ctrl + Tab>, а выполнить кнопку по умолчанию – по комбинации
<Ctrl + Enter>;
25
Речь идет о переносе слов в окне отображения на следующую строку целиком, а не по слогам.
26
Некоторые функционируют и в однострочном режиме.
27
С клавишей <Return> не срабатывает. Видимо, зависит от какого-то ещё свойства (поля).
проектирования окно редактора списка строк открывается кнопкой
46
WordWrap (Behavior) – определяет, переносить/не переносить слова автоматически
при выходе их за границу окна редактора;
ScrollBars (Appearance) – определяет наличие и тип полос прокрутки в окне ре-
дактора;
MultiLine (Behavior) – определяет, является ли редактор однострочным или мно-
гострочным. Если его значение равно true, то редактор многострочный, окно можно растяги­вать на несколько строк (иначе окно только высотой в одну строку);
Text (Appearance) – содержит весь текст компонента в поле редактирования как
одну строку.
Текст в окне редактора можно корректировать и из программы. Текст можно добав­лять/удалять/копировать через стандартные команды Copy(), Paste() и Cut(), задавае­мые программой, для выделенного фрагмента текста. Пополнять текст можно также коман­дой AppendText (<текст>).
Добавить знак разрыва строк можно командой
TextBox.AppendText(Environment.NewLine);
Компонент TextBox добавляет исключительно текст как с клавиатуры, так и програм­мно. Поэтому и программно необходимо задать спецсимвол, соответствующий переводу строки, как аналог клавиши <Enter>.
Компонент ListBox
Представляет собой простой список. Создает прямоугольную область, в которой отоб­ражается список текстовых строк. Эти текстовые строки можно добавлять в список, выби­рать или удалять из него.
Компонент ListBox используется для показа прокручиваемого списка строк.
Если все элементы списка не умещаются в отведенную область (видимую часть окна компонента), то список можно продвигать с помощью линейки прокрутки. Элементы списка содержатся в свойстве Items, а номер элемента, который выделен на окне интерфейса
(в ListBox), может быть выбран во время выполнения программы в свойстве Selecte­dIndex компонента.
На этапе разработки формы окно текстового редактора корректировки элементов спис­ка открывается кнопкой «…» в поле значений свойства Items.
Основные действия со списком ListBox из кода программы: динамически добавлять, вычеркивать (удалять), вставлять и перемещать элементы списка с помощью методов
Add(), RemoveAt() и Insert() свойства Items (подобъекта), например:
ListBoxl.Items.Add ("Последний элемент списка");
Значение true свойства Sorted устанавливает сортировку элементов списка по алфавиту.
MultiColumn – определяет, будет ли отображение списка в окне компонента много-
колоночным.
ColumnWidth – определяет ширину колонок.
Компонент TComboBox
Компонент TComboBox во многом напоминает ListBox, за исключением того, что позволяет водить или выбирать информацию пользователю через интерфейс программы, в маленьком поле ввода. Иногда28 такое поле находится сверху списка подобного ListBox. Есть несколько типов ComboBox, но наиболее популярен выпадающий вниз (DropDown), который можно видеть, например, внизу окна диалога выбора файла. Тип оформления ком­понента устанавливается при разработке или из кода программы в свойстве
DropDownStyle (Appearance).
28
В зависимости от настроек свойств компонента.
47
Другими словами, этот компонент на интерфейсе формы предоставляет комбинацию областей редактирования и выпадающего списка текстовых вариантов для выбора.
Основные характерные приемы работы с этим компонентом:
значение свойства Text (если ему присвоить значение в программе или в инспекто-
ре объектов) заносится непосредственно в область редактирования;
элементы списка, которые может выбирать пользователь, содержатся в свойстве
Items;
номер элемента, который будет выбран во время выполнения программы – в свой-
стве SelectedItem;
сам выбранный текст – в свойстве SeleltedText;
свойства SelectionStart и SelectionLength позволяют установить выборку
части текста или обнаружить, какая часть текста выбрана.
Как и в ListBox, в список компонента ComboBox можно динамически добавлять, вы­черкивать, вставлять и перемещать элементы списка с помощью методов Add, RemoveAt и
Insert подобъекта Items, например:
comboBoxl.Items.Insert(0, "Первый элемент списка");
Значение true свойства Sorted задает сортировку элементов списка по алфавиту. Внешний вид компоненты ComboBox можно выбрать в свойстве FlatStyle.
Компонент состоит из списка и помещенного рядом окна поля ввода. На старте програм­мы значение свойства SelectedIndex = –1. Строка редактирования содержит значение из поля Text. Если в ходе работы программы присвоить SelectedIndex = –1, то
поле ре­дактирования станет пустым. Если присвоить число меньше comboBoxl.Items.Count(), то в строке редактирования отобразится текст соответствующей строки списка.
Примечание. Присваивать свойству SelectedIndex можно значения только в интервале [–1; Count – 1].
Отличия компонентов ListBox и ComboBox в следующем:
в ComboBox список может быть развернут и свернут, а в ListBox – всегда раз-
вернут;
ListBox может допускать множественный выбор, а в ComboBox пользователь мо-
жет выбрать только один элемент.
Технология подсоединения новой формы к проекту
Сложные проекты содержат не одно окно (форму), а несколько. При создании проекта Windows Forms Application среда MS VS C# создает проект с единственной формой – главной. Остальные формы добавляет программист по ходу разработки проекта. Для
добавления но-
вой формы необходимо выполнить команду меню:
1. Выполнить команду: Проект>Добавить форму Windows… (Project>Add Windows
Form …).
2. Среда откроет диалоговое окно c разделом Элементы Visual C# с выбранным пунк-
том Форма (Windows Forms)
29
. Нажать кнопку Добавить (Add).
3. Сохранить форму в папке проекта командой: Файл >Сохранить как… (File>Save
as…) под новым именем. Желательно переименовать, согласно задаче, выполняемой формой в проекте. Например, Task_1.
4. Проконтролировать, что новый файл проекта (с формой) добавился в структуру про-
екта в окне Обозреватель решений (Solution Explorer).
5. Создать обработчик события Click() под кнопку «Задача 1» вида
Task_1 FTask_1 = new Task_1(); // создать локальную переменную
// класса Task_1
FTask_1.Show(); // показать форму
29
После открытия диалогового окна необходимо проконтролировать, что среда установила выбор именно на
эту строку. Если среда выбрала другой пункт, то аккуратно выбрать именно этот пункт.
48
Рис. 4. Диалоговое окно для добавления элемента с выбранным пунктом создания новой формы (окна)
Примеры решений
Для закрепления навыков оперирования с текстовыми компонентами следует разобрать коды решения приведённых примеров.
Пример 1. Написать программный код, в котором производилось бы чтение веще­ственных числовых значений из textBox1 с записью этих значений в textBox2 с проме­жуточным конвертированием.
Решение:
int cou = textBox1.Lines.Count(); // Определить число строк в textBox1
//int cou = textBox1.Lines.Length; // эквивалентное поле
double a; // рабочая переменная (может быть массивом, если это необходимо
// по условию задачи)
String str; // рабочая переменная
for (int i=0; i<cou; i++) // цикл по числу строк в textBox1
{
str = textBox1.Lines[i]; // запоминание строки из textBox1 в str
a = Convert.ToDouble (str); // преобразование строки в число а
textBox2.AppendText(a.ToString()); // обратное преобразование числа а
// с записью в
textBox2.AppendText(Environment.NewLine);
// добавление знака ‘перевод строки’
}
textBox2
Здесь надо учитывать, что в TextBox можно добавлять только текст. Чтобы разделить текст на разные строки, необходимо вставить отдельный спецсимвол – Environment.NewLine.
Пример 2. Загрузить содержимое файла с именем «TestCombo.txt» в TextBox1.
Решение. Часто бывает необходимо отобразить все строки текстового файла в каком-то
компоненте. Например, для редактирования небольшого простого текста текстовый файл можно считать весь в компонент типа TextBox. Это можно выполнить командой
textBox1.Items.AddRange
(File.ReadAllLines(@"TestCombo.txt", Encoding.Default));
Здесь надо понимать, что несмотря на единообразный синтаксис, имена обозначают разные объекты и абстракции. Переменная File – это имя класса, и через нее вызывается метод этого класса ReadAllLines. В качестве параметров передаются: путь к файлу (в ви­де строковой константы или переменной) и способ декодирования. Указанное здесь значение Encoding.Default (константа Default класса Encoding), позволяет корректно считы­вать из файла и тексты на кириллице.
Функция ReadAllLines формирует временную переменную как список строк, и этот список строк передается как параметр в метод AddRange компонента textBox1. Считан­ные строки добавляются в список строк компонента и отображаются в этом окне.
49
Для корректной компиляции необходимо подключить пространство имен System.IO.
Пример 3. Скопировать данные из TextBox в ListBox.
Решение:
// в cou занести количество заполненных строк TextBox:
int cou = textBox1.Lines.Count();
// Из TextBox все строки скопировать в ListBox:
for (int i = 0; i < cou; i++)
listBox1.Items.Add (textBox1.Lines [i]);
Пример 4. В строку редактирования ComboBox (в поле Text) необходимо поместить строку из списка с номером 0. При этом на интерфейсе окна программы в окошке редактиро­вания компонента ComboBox отобразится эта строка.
Решение:
comboBox1.SelectedIndex = 0;
Пример 5. Синхронизировать выделение строк в списках ListBox и ComboBox.
Решение. Предполагается, что в обоих списках идентичный список строк. Для решения
этой задачи необходимо проделать два шага:
1. К событию SelectedIndexChanged компонента listBox1 формы (например,
Form3) привязать процедуру, которая помечает выделенную строку listBox1 в строку ре- дактирования comboBox1, например, командой
comboBox1.SelectedIndex = listBox1.SelectedIndex;
2. К событию SelectedIndexChanged компонента comboBox1 формы (например,
Form3) привязать процедуру, которая строку редактирования comboBox1 выделяет и в списке listBox1, например командой
listBox.SelectedIndex = comboBox.SelectedIndex;
Пример 6. Написать программный код, в котором из ListBox1 удаляются строки, начинающиеся с буквы «a».
Решение. Такую задачу можно решить следующей процедурой:
String str; // рабочая переменная
int cou = 0; // переменная – счетчик числа строк
cou = listBox1.Items.Count; // запомнить число строк
for (int i=0; i< cou; ) // делать цикл по числу строк
{
// занести очередную строку
str = listBox.Items[i].ToString(); // из ListBox1 в str
// проверить первый символ на условие
if (str[0] == 'A' || str[0] == 'a')
{
listBox.Items.RemoveAt (i); //удалить из списка
cou--; // изменить счетчик числа строк
}
else i++; // переход к следующей по номеру строке (если строка
// была удалена из списка, то изменять i не нужно)
}
Следует обратить внимание на разницу в опросе количества. В одном случае это функ­ция (компонент TextBox), а в другом – свойство (компонент ListBox). Поэтому обраще­ние немного разное.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]