Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 919

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
button1 (см. рис. 1.4) щелкнуть на значке молнии Events (События) и в списке всех возможных событий кнопки button1 выбрать двойным щелчком событие Click. После этого мы попадем на вкладку программного кода Form1.cs (рис. 1.5).

При этом управляющая среда Visual С# 2010 сгенерировала тот самый пустой обработчик события button1_click:

private void buttonl_Click(object sender, EventArgs e) { }



Рис. 1.4. Свойства кнопки button1

в фигурных скобках которого мы можем написать команды, подлежащие выполне­нию после щелчка на кнопке. Вы видите, что у нас теперь две вкладки: Form1.cs и Form1.cs [Design], т. е. вкладка программного кода и вкладка визуального проекта программы (другое название этой вкладки — дизайнер формы). Переключаться между ними можно мышью или нажатием комбинации клавиш +, как это принято обычно между вкладками в Windows, а также функциональной клави­шей <F7>.

Напомню, что после щелчка на кнопке должно появиться диалоговое окно, в котором написано: "Всем привет!" Поэтому в фигурных скобках обработчика со­бытия напишем:

MessageBox.Show("Всем привет! ") ;

Здесь вызывается метод (программа) Show объекта MessageBox с текстом "Всем привет!" Таким образом, я здесь "нечаянно" проговорился о том, что объекты кро­ме свойств имеют также и методы, т. е. программы, которые обрабатывают объекты. Кстати, после каждого оператора в С-программах(Автор намеренно здесь указал "С", а не "С#", чтобы подчеркнуть особенность синтаксиса лю­бой Си-программы, будь то С++, или С#, или Turbo-C. ) ставят точку с запятой. Это вместе с фигурными скобками по форме отличает С-программу от программных кодов на других языках программирования.


Рис 1.5. Вкладка программного кода

Таким образом, мы написали процедуру обработки события щелчка (click) на кнопке button1. Теперь нажмем клавишу <F5> и проверим работоспособность про­граммы (рис. 1.6).

Поздравляю, вы написали свою первую программу на Visual С#!


Рис. 1.6. Работающая программа

Пример 2. Событие MouseHover

Немного усложним предыдущую задачу. Добавим еще одну обработку события MouseHover мыши для объекта label1. Событие MouseHover наступает тогда, когда пользователь указателем мыши "зависает" над каким-либо объектом, причем имен­но "зависает", а не просто перемещает мышь над объектом (от англ. hover— реять, парить). Есть еще событие MouseEnter (Войти), когда указатель мыши входит в пределы области элемента управления (в данном случае метки label1).

Чтобы добавить обработку события MouseHover мыши для объекта label1, сле­дует так же, как это мы делали при обработке события "щелчок на кнопке", в пане­ли Properties щелкнуть на значке молнии (Events) и двойным щелчком выбрать для объекта label1 событие MouseHover. При этом осуществится переход на вкладку программного кода Form1.cs и среда Visual Studio 2010 сгенерирует простой обработчик события:

private void label1_MouseHover(object sender, EventArgs e) { }

Между фигурными скобками вставим вызов диалогового окна:

MessageBox.Show("Событие Hover!");

Теперь проверим возможности программы: нажимаем клавишу <F5>, "зависа­ем" указателем мыши над label1, щелкаем на кнопке button1. Все работает!

А теперь я буду немного противоречить сам себе. Я говорил про визуальную технику программирования, направленную на минимизацию написания программ­ного кода. А сейчас хочу сказать про наглядность, оперативность, технологич­ность работы программиста. Посмотрите на свойства каждого объекта в панели Properties. Вы видите, как много строчек. Если вы меняете какое-либо свойство, то оно будет выделено жирным шрифтом. Удобно! Но все-таки еще более удобно свойства объектов назначать (устанавливать) в программном коде. Почему?

Каждый программист имеет в своем арсенале множество уже отлаженных фрагментов, которые он использует в своей очередной новой программе. Програм­мисту стоит лишь вспомнить, где он программировал ту или иную ситуацию. Про­грамма, которую написал программист, имеет свойство быстро забываться. Если вы посмотрите на строчки кода, которые писали три месяца назад, то будете ощу­щать, что многое забыли; если прошел год, то вы смотрите на написанную вами программу, как на чужую. Поэтому при написании программ на первое место вы­ходят понятность, ясность, очевидность написанного программного кода. Для этого каждая система программирования имеет какие-либо средства. Кроме того, сам программист придерживается некоторых правил, помогающих ему работать производительно и эффективно.

Назначать свойства объектов в программном коде удобно или сразу после ини­циализации компонентов формы (после процедуры InitializeComponent), или при обработке события Form1_Load, т. е. события загрузки формы в оперативную па­мять при старте программы. Получим простой обработчик этого события. Для это­го, как и в предыдущих случаях, можно выбрать нужное событие в панели свойств объекта, а можно еще проще: дважды щелкнуть в пределах проектируемой формы на вкладке Form1.cs [Design]. В любом случае получаем пустой обработчик собы­тия на вкладке программного кода. Заметим, что для формы таким умалчиваемым событием, для которого можно получить пустой обработчик двойным щелчком, является событие загрузки формы Form1_Load, для командной кнопки Button и метки Label таким событием является одиночный щелчок мышью на этих элемен­тах управления. То есть если дважды щелкнуть в дизайнере формы по кнопке, то получим пустой обработчик button1_Click в программном коде, аналогично — для метки Label.

Итак, вернемся к событию загрузки формы, для него управляющая среда сгене­рировала пустой обработчик:

private void Form1_Load(object sender, EventArgs e) { }

Здесь в фигурных скобках обычно вставляют свойства различных объектов и даже часто пишут много строчек программного кода. Здесь мы назначим свойству Text объекта label1 значение "Microsoft Visual С# 2010":

Label1.Text = "Microsoft Visual C# 2010";

Аналогично для объекта button1:

Button1.Text = "Нажми меня!";

Совершенно необязательно писать каждую букву приведенных команд. Напри­мер, для первой строчки достаточно написать "lа", уже это вызовет появление рас­крывающегося меню, где вы сможете выбрать нужные для данного контекста клю­чевые слова. Это очень мощное и полезное современное средство, называемое IntellSense, для редактирования программного кода! Если вы от Visual Studio 2010 перешли в другую систему программирования, в которой отсутствует подобный сервис, то будете ощущать сильный дискомфорт.

Вы написали название объекта label1, поставили точку. Теперь вы видите рас­крывающееся меню, где можете выбрать либо нужное свойство объекта, либо ме­тод (т. е. подпрограмму). В данном случае выберите свойство Text.

Как видите, не следует пугаться слишком длинных ключевых слов, длинных названий объектов, свойств, методов, имен переменных. Система подсказок совре­менных систем программирования значительно облегчает всю нетворческую рабо­ту. Вот почему в современных программах можно наблюдать такие длинные имена ключевых слов, имен переменных и проч. Я призываю вас, уважаемые читатели, также использовать в своих программах для названия переменных, объектов наи­более ясные, полные имена, причем можно на вашем родном русском языке. Пото­му что на первое место выходят ясность, прозрачность программирования, а гро­моздкость названий с лихвой компенсируется системой подсказок.

Далее хотелось бы, чтобы слева вверху формы на синем фоне (в так называе­мой строке заголовка) была не надпись "Form1", а что-либо осмысленное. Напри­мер, слово "Приветствие". Для этого ниже присваиваем эту строку свойству Text формы. Поскольку мы изменяем свойство объекта Form1 внутри подпрограммы об­работки события, связанного с формой, следует к форме обращаться через ссылку this: this.Text = "Приветствие" ИЛИ base.Text = "Приветствие".

После написания последней строчки кода мы должны увидеть на экране про­граммный код, представленный в листинге 1.1.

Листинг 1.1. Программирование событий

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;
namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

// Обработка события загрузки формы:

private void Form1_Load(object sender, EventArgs e)

{

this.Text = "Приветствие";

label1.Text = "Microsoft Visual C# 2010";

button1.Text = "Нажми меня";

}

// Обработка события щелчок на кнопке:

private void button1_Click(object sender, EventArgs e)

{

MessageBox.Show("Всем привет!");

}

// Обработка события, когда указатель мыши "завис" над меткой:

private void label1_MouseHover(object sender, EventArgs e)

{

MessageBox.Show("Событие Hover! ") ;

}

}

}

Комментарии, поясняющие работу программы, в окне редактора кода будут выделены зеленым цветом, чтобы в тексте выразительно отделять его от прочих элементов программы. В С-подобных языках комментарий пишут после двух слэ­шей (//) или внутри пар /* */. Даже если вам кажется весь­ма очевидным то, что вы пишете в программном коде, напишите комментарий. Как показывает опыт, даже весьма очевидный замысел программиста забывается удивительно быстро. Человеческая память отметает все, что по оценкам организма считается ненужным. Кроме того, даже если текст программы вполне ясен, в нача­ле программы должны быть описаны ее назначение и способ использования, т. е. как бы "преамбула" программы. Далее в примерах мы будем следовать этому пра­вилу.

На рис. 1.7 приведен фрагмент работы программы.

Обычно в редакторах программного кода используется моноширинный шрифт, поскольку все символы такого шрифта имеют одинаковую ширину, в том числе точка и прописная русская буква "Ш". По умолчанию в редакторе программного кода С# 2010 задан шрифт Consolas. Однако если пользователь привык к шрифту Courier New, то его настройку можно изменить, выбрав меню Tools | Options | En­vironment | Fonts and Colors.

Теперь закроем проект (File | Close Project). Система предложит нам сохранить Проект, сохраним проект под именем Hover. Теперь программный код этой программы можно посмотреть, открыв решение Hover.sin в папке Horver.



Рис. 1.7. Работа программы

Пример 3. Ввод данных через текстовое поле TextBoxcпроверкой типа методом TryParse

При работе с формой очень часто ввод данных организуют через элемент управления "текстовое поле" TextBox. Напишем типичную программу, которая вводит через текстовое поле число, при нажатии командной кнопки извлекает из него квадратный корень и выводит результат на метку Label. В случае ввода не числа сообщает пользователю об этом.

Решая сформулированную задачу, запускаем Visual Studio, выбираем пункт ме­ню File | New | Project, затем — шаблон Windows Forms Application Visual C# и щелкаем на кнопке ОК. Далее из панели элементов управления Toolbox (если в данный момент вы не видите панель элементов, то ее можно добавить, например, с помощью комбинации клавиш <Ctrl>+<Alt>+<X> или меню View | Toolbox) в форму указателем мыши перетаскиваем текстовое поле TextBox, метку Label и ко­мандную кнопку Button. Таким образом, в форме будут находиться три элемента управления.

Теперь перейдем на вкладку программного кода, для этого правой кнопкой мыши вызовем контекстное меню и выберем в нем пункт View Code. Здесь сразу после инициализации компонентов формы, т. е. после вызова процедуры InitializeComponent задаем свойствам формы (к форме обращаемся посредством ссылки this или base), кнопкам button1 и текстового поля textBox1, метке label1 следующие значения:

this.Text = "Извлечение квадратного корня";

batton1.Text = "Извлечь корень";

textBox1.Clear(); // Очистка текстового поля

label1.Text = null; // или = string.Empty;

Нажмем клавишу <F5> для выявления возможных опечаток, т. е. синтаксических ошибок и предварительного просмотра дизайна будущей программы.

Далее программируем событие button1_Click— щелчок мышью на кнопке Извлечь корень. Создать пустой обработчик этого события удобно, дважды щелкнув мышью на этой кнопке. Между двумя появившимися строчками программиру­ем диагностику правильности вводимых данных, конвертирование строковой пе­ременной в переменную типа single и непосредственное извлечение корня листинг 1.2).


Листинг 1.2. Извлечение корня с проверкой типа методом TryParse

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System. Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

// программа вводит через текстовое поле число, при щелчке на командной кнопке

//извлекает из него квадратный корень и выводит результат на метку label1.

// В случае ввода не числа сообщает пользователю об этом,

//выводя красным цветом предупреждение также на метку label1.
namespace Корень

{

public partial class Form1 : Form

{

public Form1 ()

{ // Инициализация компонентов формы
InitializeComponent();
buttonl.Text = "Извлечь корень";
label1.Text = null; // или = string.Empty;
this.Text = "Извлечение квадратного корня";
textBox1.Clear(); // очистка текстового поля

textBox1.Tablndex =0; // установка фокуса в текстовом поле

}
private void button1_Click(object sender, EventArgs e)

{ // Обработка щелчка на кнопке "Извлечь корень"

Single X; // - из этого числа будем извлекать корень

// Преобразование из строковой переменной в Single:

bool Число_ли = Single.TryParse(textBoxl.Text, System.Globalization.NumberStyles.Number,

System.Globalization.NumberFormatlnfо.Currentlnfo, out X); // Второй параметр - это разрешенный стиль числа (Integer, // шестнадцатиричное число, экспоненциальный вид числа и проч.).

// Третий параметр форматирует значения на основе текущего

// языка и региональных параметров из

// Панели управления -> Язык и региональные стандарты

// число допустимого формата;

// метод возвращает значение в переменную X

if (Число_ли == false)

{ // Если пользователь ввел не число:

Label1.Text = "Следует вводить числа";

Label1.ForeColor = Color.Red; // красный цвет текста на метке

return; // выход из процедуры

}

Single Y = (Single)Math.Sqrt(X); // извлечение корня

Label1.ForeColor = Color.Black; // черный цвет текста на метке

Label1.Text = string.Format("Корень из {0} равен {1:F5}", X, Y);

}

}

}

Здесь при обработке события "щелчок мышью" на кнопке Извлечь корень проводится проверка, введено ли число в текстовом поле. Проверка осуществляет­ся с помощью функции TryParse. Первым параметром метода TryParse является анализируемое поле textBox1.Text. Второй параметр — это разрешаемый для пре­образования стиль числа, он может быть целого типа (integer), шестнадцатеричным (HexNumber), представленным в экспоненциальном виде и проч. Третий пара­метр указывает, на какой основе формируется допустимый формат, в нашем случае мы использовали currentinfо, т. е. на основе текущего языка и региональных па­раметров. По умолчанию при инсталляции руссифицированной версии

Windows разделителем целой и дробной части числа является запятая. Однако эту установку можно изменить, если в Панели управления выбрать значок Язык и региональные стандарты, затем на вкладке Региональные параметры щелкнуть на кнопке На­стройка и на появившейся новой вкладке указать в качестве разделителя целой и дробной частей точку вместо запятой. В обоих случаях (и для запятой, и для точки) метод TryParse будет работать так, как указано на вкладке Региональные пара­метры.

Четвертый параметр метода TryParse возвращает результат преобразования. Кроме того, функция TryParse возвращает булеву переменную true или false, ко­торая сообщает, успешно ли выполнено преобразование. Как видно из текста про­граммы, если пользователь ввел не число (например, введены буквы), то на метку label1 выводится красным цветом текст "Следует вводить числа". Далее, посколь­ку ввод неправильный, организован выход из программы обработки события button1_Click с помощью оператора return. На рис. 1.8 показан фрагмент работы программы.

Как видно из рисунка, функция TryParse не восприняла введенные символы "2,3" как число, поскольку автор специально для демонстрации данного примера указал на вкладке Региональные параметры точку в качестве разделителя целой и дробной частей.

Если пользователь ввел все-таки число, то будет выполняться следующий опе­ратор извлечения квадратного корня Math.Sqrt(x). Математические функции Vis­ual Studio 2010 являются методами класса Math. Их можно увидеть, набрав Math и поставив точку (.).



Рис 1.8. Фрагмент работы программы

В выпадающем списке вы увидите множество математических функций: Abs. sin, cos, Min и т. д. и два свойства— две константы E = 2.71... (основание натуральных логарифмов) и PI = 3,14... (число диаметров, уложен­ных вдоль окружности). Функция Math.Sqrt (х) возвращает значение типа double (двойной точности с плавающей запятой), которое приводим с помощью неявного преобразования (single) к переменной одинарной точности.

Последней строчкой обработки события button1_Click является формирование строки label1.Text с использованием метода string.Format. Использованный формат "Корень из {0} равен {i:F5}" означает: взять нулевой выводимый эле­мент, т. е. переменную х, и записать эту переменную вместо фигурных скобок; по­сле чего взять первый выводимый элемент, т. е.
y, и записать его вместо вторых фигурных скобок в формате с фиксированной точкой и пятью десятичными знака­ми после запятой.

Нажав клавишу <F5>, проверяем, как работает программа.



Рис. 1.9. Извлечение квадратного корня

Если появились ошибки, то работу программы следует проверить отладчи­ком— клавиши <F8> или <F11>. В этом случае управление останавливается на каждом операторе, и вы можете проверить значение каждой переменной, наводя указатель мыши на переменные. Можно выполнить программу до определенной программистом точки (точки останова), используя, например, клавишу <F9> или оператор stop, и в этой точке проверить значения необходимых переменных.

Убедиться в работоспособности этой программы можно, открыв соответст­вующее решение в папке Корень

Пример 4. Ввод пароля в текстовое поле и изменение шрифта

Это очень маленькая программа для ввода пароля в текстовое поле, причем при вводе вместо вводимых символов некто, "находящийся за спиной пользователя" увидит только звездочки. Программа состоит из формы, текстового поля TextBox метки Label, куда для демонстрации возможностей мы будем копировать пароль (паспорт, т. е. секретные слова) и командной кнопки ButtonПокажи паспорт.

Перемещаем в форму все названные элементы управления. Текст программы приведен в листинге 1.3.

Листинг 1.3. Ввод пароля

// Программа для ввода пароля в текстовое поле, причем при вводе вместо

// вводимых символов некто, "находящийся за спиной пользователя",

// увидит только звездочки
using System;

using System.Drawing;

using System. Windows. Forms ;

// Другие директивы using удалены, поскольку они не используются

// в данной программе
namespace Passport

{

public partialI class Form1 : Form
{ \

public Form1()

{

InitializeComponent();

base.Text = "Введи пароль";

textBox1.Text = null; textBox1.Tablndex = 0;

textBox1. PasswordChar = ' * ' ;

textBox1.Font = new Font("Courier New", 9.0F);

// или textBox1.Font = new Font(FontFamily.GenericMonospace, 9.OF);

Label1.Text = string.Empty;

Label1.Font = new Font("Courier New", 9.0F);

Button1.Text = "Покажи паспорт";

}

private void button1_Click(object sender, EventArgs e)

{ // Обработка события "щелчок на кнопке"

Label1.Text = textBox1.Text;

}

}

}

Как видно из текста программы, сразу после инициализации компонентов формы, т е. после вызова процедуры
InitializeComponent, очищаем текстовое поле и делаем его "защищенным от посторонних глаз" с помощью свойства textBox1. PasswordChar, каждый введенный пользователем символ маскируется символом звездочки (*). Да­лее мы хотели бы для большей выразительности и читабельности программы, чтобы вводимые звездочки и результирующий текст имели одинаковую длину. Все симво­лы шрифта Courier New имеют одинаковую ширину, поэтому его называют моноши­ринным шрифтом. Кстати, используя именно этот шрифт, удобно программировать таблицу благодаря одинаковой ширине букв этого шрифта. Еще одним широко ис­пользуемым моноширинным шрифтом является шрифт Consola. Задаем шрифт, ис­пользуя свойство Font обоих объектов: textBox1 и label1. Число 9.0 означает раз­мер шрифта. Свойство текстового поля Tablndex = 0 обеспечивает передачу фокуса при старте программы именно в текстовое поле.

Осталось обработать событие button1_Click— щелчок на кнопке. Здесь — банальное присваивание текста из поля тексту метки. Программа написана, нажи­маем клавишу <F5>. На рис. 1.10 приведен вариант работы данной программы.



Рис 1.10. Вариант работы программы

При необходимости используйте отладчик (клавиша <F11> или <F10>) для пошагового выполнения программы и выяснения всех промежуточных значений пе­ременных путем "зависания" указателя мыши над переменными.

Убедиться в работоспособности программы можно, открыв решение Passport.sin в папке Passport.

Пример 5. Управление стилем шрифта с помощью элемента управления CheckBox

Кнопка CheckBox (Флажок) также находится на панели элементов управления Toolbox. Флажок может быть либо установлен (содержит "галочку"), либо сброшен (пустой). Напишем программу, которая управляет стилем шрифта текста, выведен­ного на метку Label. Управлять стилем будем посредством флажка CheckBox.

Используя панель элементов Toolbox, в форму поместим метку label1 и фла­жок checkBox1. В листинге 1.4 приведен текст программы управления этими объ­ектами.

Листинг 1.4. Управление стилем шрифта

// Программа управляет стилем шрифта текста, выведенного на метку

// Label, посредством флажка CheckBox

using System;

using System.Drawing;

using System. Windows. Forms ;

// Другие директивы using удалены, поскольку они не используются

//в данной программе