Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.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 | Environment | 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). Математические функции Visual 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 удалены, поскольку они не используются
//в данной программе
При этом управляющая среда Visual С# 2010 сгенерировала тот самый пустой обработчик события button1_click:
private void buttonl_Click(object sender, EventArgs e) { }
Рис. 1.4. Свойства кнопки button1
в фигурных скобках которого мы можем написать команды, подлежащие выполнению после щелчка на кнопке. Вы видите, что у нас теперь две вкладки: Form1.cs и Form1.cs [Design], т. е. вкладка программного кода и вкладка визуального проекта программы (другое название этой вкладки — дизайнер формы). Переключаться между ними можно мышью или нажатием комбинации клавиш
Напомню, что после щелчка на кнопке должно появиться диалоговое окно, в котором написано: "Всем привет!" Поэтому в фигурных скобках обработчика события напишем:
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 | Environment | 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). Математические функции Visual 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 удалены, поскольку они не используются
//в данной программе