Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.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)