Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 930
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
this.button14.Click += new System.EventHandler(this.ОПЕРАЦИЯ);
this.button15.Click += new System.EventHandler(this.ОПЕРАЦИЯ);
this.button11.Click += new System.EventHandler(this.РАВНО);
this.button16.Click += new System.EventHandler(this.ОЧИСТИТЬ);
}
private void ЦИФРА(object sender, EventArgs e)
{ // Обработка события нажатия кнопки-цифры.
// Получить текст, отображаемый на кнопке, можно таким образом:
Button Кнопка = (Button)sender;
String Digit = Кнопка.Text;
if (Начало_Ввода == true)
{ // Ввод первой цифры числа:
textBoxl.Text = Digit;
Начало_Ввода = false; return;
}
// "Сцепливаем" полученные цифры в новое число:
if (Начало_Ввода == false) textBoxl.Text = textBox1.Text + Digit;
}
private void ОПЕРАЦИЯ(object sender, EventArgs e)
{ // Обработка события нажатия кнопки арифметической операции:
Число1 = Double.Parse(textBoxl.Text);
// Получить текст, отображаемый на кнопке, можно таким образом:
Button Кнопка = (Button)sender;
Znak = Кнопка.Text;
Начало_Ввода = true; // ожидаем ввод нового числа
}
private void РАВНО(object sender, EventArgs e)
{ // Обработка нажатия клавиши "равно"
double Результат = 0;
Число2 = Double.Parse(textBox1.Text);
if (Znak == "+") Результат = Число1 + Число2;
if (Znak == "-") Результат = Число1 - Число2;
if (Znak == "*") Результат = Число1 * Число2;
if (Znak == "/") Результат = Число1 / Число2;
Znak = null;
// Отображаем результат в текстовом поле:
textBox1. Text = Результат.ToString();
Число1 = Результат; Начало_Ввода = true;
}
private void ОЧИСТИТЬ(object sender, EventArgs e)
{ // Обработка нажатия клавиши "Очистить"
textBox1.Text = "0"; Znak = null; Начало_Ввода = true;
}
}
}
В этой книге мы принципиально отказались от задания свойств элементов управления и формы в окне Properties, чтобы не потеряться в огромном количестве этих свойств и не забывать, какое свойство мы изменили, а какое нет. Исходя из этих соображений, автор задал все свойства объектов сразу после выполнения процедуры InitializeComponent. Именно здесь заданы надписи на кнопках, ноль в текстовом поле, причем этот ноль прижат к правому краю поля:
textBox1.TextAlign = HorizontalAlignment.Right.
Далее связываем все события Click от кнопок-цифр с одной процедурой обработки этих событий цифра. Аналогично все события Click от кнопок арифметических операций связываем с одной процедурой операция.
В процедуре обработки события щелчок на любой из кнопок-цифр цифра в строковую переменную Digit копируем цифру, изображенную на кнопке из свойства Text так, как мы это делали в предыдущем примере, когда отлавливали нажатие пользователем одной из двух кнопок. Далее необходимо значение Digit присвоить свойству
textBox1.Text, но здесь изначально записан ноль. Если пользователь вводит первую цифру, то вместо нуля нужно записать эту цифру, а если пользователь вводит последующие цифры, то их надо "сцепить" вместе. Для управления такой ситуацией мы ввели булеву (логическую) переменную Начало_Ввода. Мы сознательно назвали эту переменную по-русски, чтобы она выделялась среди прочих переменных, ведь она играет ключевую роль в программе и участвует в обработке практически всех событии. Поскольку мы ввели ее в начале программы, область действия этой переменной — весь класс Form1, т. е. эта переменная "видна" в процедурах обработки всех событий.
То есть различаем начало ввода числа Начало_ввода = true, когда ноль следует менять на вводимую цифру, и последующий ввод Начало_Ввода = false, когда очередную цифру следует добавлять справа. Таким образом, если это уже не первая нажатая пользователем кнопка-цифра (Начало_Ввода = false), то "сцепливаем" полученную цифру с предыдущими введенными цифрами, иначе— просто запоминаем первую цифру в текстовом поле textBox1.
При обработке событий "щелчок указателем мыши по кнопкам" арифметических операций +, -, *, / в процедуре операция преобразуем первое введенное пользователем число из текстового поля в переменную value1 типа Double. Строковой переменной Znak присваивается символьное представление арифметической операции. Поскольку пользователь нажал кнопку арифметической операции, ожидаем, что следующим действием пользователя будет ввод очередного числа, поэтому присваиваем булевой переменной Начало_ввода значение true. Заметьте, что обрабатывая два других события: нажатие кнопки "равно" и нажатие кнопки Очистить, мы также устанавливаем логическую переменную Hачало_Ввода в состояние true (т. е. начинаем ввод числа).
В процедуре обработки события нажатия кнопки "равно" преобразуем второе введенное пользователем число в переменную типа Double. Теперь, поскольку знак apифметической операции нам известен, известны также оба числа, мы можем выполнить непосредственно арифметическую операцию. После того как пользователь получит результат, например result = value1 + value2, возможно, он захочет с зтим результатом выполнить еще какое-либо действие, поэтому этот результат записываем в первую переменную value1. Заметьте, что в этой программе мы сознательно не предусмотрели обработку исключительной ситуации
деления на ноль, поскольку среда Visual Studio 2010 (впрочем, как и ее предыдущие версии) взяла на себя обработку этой ситуации. Когда в строковую переменную попадает очень большое число, в эту переменную система пишет слово "бесконечность" (рис. 3.5).
Убедиться в работоспособности программы можно, открыв решение Calc.sln в папке Calc.
Рис. 3.5. Фрагмент работы калькулятора
Пример 19. Ссылка на другие ресурсы LinkLabel
Элемент управления LinkLabel позволяет создавать в форме ссылки на Web-страницы, подобно гиперссылкам в HTML-документах, ссылки на открытие файлов какими-либо программами, ссылки на просмотр содержания логических дисков, папок и проч. Напишем программу, которая с помощью элемента управления LinkLabel обеспечит ссылку для посещения почтового сервера www.mail.ru, ссылку для просмотра папки C:\Windows\ и ссылку для запуска текстового редактора Блокнот.
Для программирования этой задачи после запуска Visual Studio 2010 выберем шаблон Windows Forms Application С#, затем из панели Toolbox перетащим в форму три элемента управления LinkLabel. Равномерно разместим их в форме. Далее, следуя нашим традициям, не будем задавать никаких свойств этим элементам в окне Properties. Все начальные значения свойств укажем в программном коде сразу после вызова процедуры InitializeComponent (ЛИСТИНГ 3.5).
Листинг 3.5. Ссыпки на ресурсы
// Программа обеспечивает ссылку для посещения почтового сервера www.mail.ru,
// ссылку для просмотра папки C:\Windows\ и ссылку для запуска текстового.
// редактора Блокнот с помощью элемента управления LinkLabel
using System;
using System.Windows.Forms;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace СсылкиLinkLabel
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Text = "Щелкните по ссылке:";
linkLabel1.Text = "www.mail.ru";
linkLabel2.Text = @"Папка С:\Windows\";
linkLabel3.Text = "Вызвать \"Блокнот\"";
this.Font = new System.Drawing.Font("Consoles", 12.0F);
linkLabel1.LinkVisited = true;
linkLabel2.LinkVisited = true;
linkLabel3.LinkVisited = true;
// Подписка на события: все три события обрабатываются одной процедурой:
linkLabel1.LinkClicked += new System.Windows.Forms.
LinkLabelLinkClickedEventHandler(this.ССЫЛКА);
linkLabel2.LinkClicked += new Systern.Windows.Forms.
LinkLabelLinkClickedEventHandler(this.ССЫЛКА);
linkLabel3.LinkClicked += new System.Windows.Forms.
LinkLabelLinkClickedEventHandler(this.ССЫЛКА);
}
private void ССЫЛКА(object sender, LinkLabelLinkClickedEventArgs e)
{
LinkLabel ссылка = (LinkLabel)sender;
switch (ссылка.Name) // Выбор ссылки:
{
case "linkLabel1":
System.Diagnostics.Process.Start(
"IExplore.exe", "http://www.mail.ru"); break;
case "1inkLabel2":
System.Diagnostics.Process.Start("C:WWindowsW"); break;
case "linkLabel3":
System.Diagnostics.Process.Start("Notepad", "text.txt"); break;
}
}
}
}
Как видно из программного кода, в свойстве Text каждой из ссылок LinkLabel задаем текст, из которого пользователь поймет назначение каждой ссылки. В задании свойства Text ссылки LinkLabel3 для того, чтобы слово "Блокнот" было в двойных кавычках, используем escape-последовательность (\") . Для большей выразительности задаем шрифт Consolas, 12 пунктов. Это шрифт моноширинный, кстати, по умолчанию редактор в Visual Studio 2010 имеет также шрифт Consolas. Поскольку свойство LinkVisited = true, то соответствующая ссылка отображается как уже посещавшаяся (изменяется цвет).
Так же как и в предыдущих разделах, организуем обработку всех трех событий Сlick по каждой из ссылок одной процедурой обработки ссылка. В этой процедуре так же как и в программе о трех кнопках и калькуляторе, в зависимости от имени
объекта (ССЫЛКИ), создающего события (linkLabel1, linkLabel2, linkLabel3), Мы вызываем одну из трех программ: либо Internet Explorer, либо Windows Explorer, либо Блокнот. Информация об объекте, создающем событие Сlick, записана в объектную переменную sender. Она позволяет распознавать объекты (ссылки), создающие события. Чтобы "вытащить" эту информацию из sender, объявим переменную ссылка типа LinkLabel и с помощью неявного преобразования выполним конвертирование параметра sender в экземпляр класса LinkLabel. В этом случае переменная ссылка будет содержать все свойства объекта-источника события, в том числе свойство name, с помощью которого мы сможем распознавать выбранную ссылку. Идентифицируя по свойству name каждую из ссылок, с помощью метода start вызываем либо Internet Explorer, либо Windows Explorer, либо Блокнот. Вторым параметром метода start является имя ресурса, подлежащее открытию. Именем ресурса может быть или название Web-страницы, или имя текстового файла.
Фрагмент работы обсуждаемой программы приведен на рис. 3.6. Убедиться в ее работоспособности можно, открыв соответствующее решение в папке CcылкиLinkLabel.
Рис. 3.6. Ссылки на ресурсы
Пример 20. Обработка событий клавиатуры
События клавиатуры (клавишные события) создаются в момент нажатия или отпуская ее клавиш. Различают событие Keypress, которое генерируется в момент нажатия клавиши. При удержании клавиши в нажатом состоянии оно генерируется
непрерывно с некоторой частотой. С помощью этого события можно распознать нажатую клавишу, если только она не является так называемой модифицирующей,т. е. <Alt>, <Shift> и <Ctrl>. А вот для того чтобы распознать, нажата ли модифицирующая клавиша <Alt>, <Shift> или <Ctrl>, следует обработать либо событие KeyDown, либо событие KeyUp. Событие KeyDown генерируется в первоначальный момент нажатия клавиши, а событие KeyUp — в момент отпускания клавиши. Напишем программу, информирующую пользователя о тех клавишах и комбинациях клавиш, которые тот нажал. Запустим Visual Studio 2010, выберем проект шаблона Windows Forms Application С#, затем из панели Toolbox перетащим в форму две текстовых метки Label. Далее, поскольку нам потребуются клавишные события формы: KeyPress, KeyDown, KeyUp, получим пустые обработчики этих событий традиционным образом. То есть в панели Properties щелкнем на пиктограмме молнии (Events), а затем в списке всех возможных событий выберем каждое из названных событий клавиатуры. Программный код приведен в листинге 3.6.
Листинг 3.6. Обработка событий клавиатуры
// Программа, информирующая пользователя о тех клавишах и
// комбинациях клавиш, которые тот нажал
using System;
using System.Drawing;
using System.Windows. Forms ;
// Другие директивы using удалены, поскольку они не используются в данной программе
namespace Key
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Устанавливаем шрифт с фиксированной шириной (моноширинный):
base.Font = new Font(FontFamily.GenericMonospace, 14.0F);
base.Text = "Какие клавиши нажаты сейчас:";
label1.Text = string.Empty; label2.Text = string.Empty;
}
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{ // Здесь событие нажатия клавиши: при удержании
// клавиши генерируется непрерывно
Label1.Text = "Нажатая клавиша: " + e.KeyChar;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)