лекция. Зиборов. Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Скачать 7.39 Mb.
|
Листинг 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 удалены, поскольку они не используются //в данной программе namespace CheckBox { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Text = "Флажок CheckBox"; checkBox1.Text = "Полужирный"; checkBox1.Focus(); label1.Text = "Выбери стиль шрифта"; label1.TextAlign = ContentAlignment.MiddleCenter; label1.Font = new System.Drawing.Font("Courier New", 14.0F); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { // Изменение состояния флажка на противоположное if (checkBox1.Checked == true) label1.Font = new Font("Courier New", 14.0F, FontStyle.Bold); if (checkBox1.Checked == false) label1.Font = new Font("Courier New", 14.0F, FontStyle.Regular); } } } Сразу после вызова процедуры InitializeComponent задаем начальные значения некоторых свойств объектов Form1 (посредством ссылки this), label1 и checkBox1. Так, тексту флажка, выводимого с правой стороны, присваиваем значение "Полужирный". Кроме того, при старте программы фокус должен находиться на флажке (checkBox1.Focus(),;), в этом случае пользователь может изменять установку флажка даже клавишей <Пробел>. Текст метки — "Выбери стиль шрифта", выравнивание метки TextAlign задаем посередине и по центру (MiddleCenter) относительно всего того места, что предназначено для метки. Задаем шрифт метки Courier New (в этом шрифте все буквы имеют одинаковую ширину) размером 14 пунктов. Изменение состояния флажка соответствует событию CheckedChanged. Чтобы получить пустой обработчик события CheckedChanged, следует дважды щелкнуть на элементе checkBox1 вкладки Form1.cs [Design]. Между соответствующими строчками следует записать (см. текст программы): если флажок установлен (т. е. содержит "галочку") Checked = true, то для метки label1 устанавливается тот же шрифт Courier New, 14 пунктов, но Bold, т. е. полужирный. Далее — следующая строчка кода: если флажок не установлен, т. е. checkBox1.Checked = false, то шрифт устанавливается Regular, Т.е. обычный. Очень часто эту ситуацию программируют, используя ключевое слово else (иначе), однако это выражение будет выглядеть более выразительно и понятно так, как написали мы. Программа написана, нажмите клавишу <F5>. Проверьте работоспособность программы. В рабочем состоянии она должна работать примерно так, как показано на рис. 1.11. Рис. 1.11. Фрагмент работы программы управления стилем шрифта Убедиться в работоспособности программы можно, открыв решение CheckBox1.sin в папке CheckBox1. Пример 6. Побитовый оператор "исключающее ИЛИ" Несколько изменим предыдущую программу в части обработки события checkedchanged (Изменение состояния флажка). Вместо двух условий if () напишем один оператор: Label1.Font = new Font("Courier New", 14.0F, Label1.Font.Style ^ FontStyle.Bold); Здесь каждый раз при изменении состояния флажка значение параметра label1.Font.style сравнивается с одним и тем же значением Fontstyle.Bold. Поскольку между ними стоит побитовый оператор ^ (исключающее ИЛИ), он будет назначать Bold, если текущее состояние lаЬеl1.Font.style "не Bold". А если label1. Font. style пребывает в состоянии "Bold", то оператор ^ будет назначать состояние "не Bold". Этот оператор еще называют логическим xor. Таблица истинности логического xor такова: A Xor В = С Xor 0=0 Xor 0=1 Xor 1=1 Xor 1=0 В нашем случае мы имеем всегда B = 1 (Fontstyle.Bold), а A (label1.Font.style) попеременно то Bold, то Regular (т. е. "не Bold"). Таким образом, оператор ^ всегда будет назначать противоположное тому, что записано в label1.Font.Style. Как видно, применение побитового оператора привело к существенному уменьшению количества программного кода. Использование побитовых операторов может значительно упростить написание программ со сложной логикой. Посмотрите, как работает программа, нажав клавишу <F5>. Теперь добавим в форму еще один элемент управления CheckBox. Мы собираемся управлять стилем шрифта FontStyle двумя флажками. Один, как и прежде, задает полужирный стиль Bold или обычный Regular, а второй задает наклонный italic или возвращает в Regular. Текст новой программы приведен в листинге 1.5. Листинг 1,5. Усовершенствованный программный код // Побитовый оператор "^" - исключающее ИЛИ using System; using System.Drawing; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются // в данной программе namespace CheckBox2 { public partial class Form1: Form { public Form1 () { InitializeComponent(); this.Text = "Флажок CheckBox"; checkBox1.Text = "Полужирный"; checkBox2.Text = "Наклонный"; label1.Text = "Выбери стиль шрифта"; label1.TextAlign = contentAlignment .MiddleCenter ; label1.Font = new Font("Courier New", 14.0F); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { Label1.Font = new Systerm.Drawing.Font( "Courier New", 14.0F, label1.Font.Style^ Fontstyle.Bold); } private void checkBox2_CheckedChanged(object sender, EventArgs e) { Label1.Font = new System.Drawing.Font( "Courier New", 14.0F, label1.Font.Style ^ FontStyle.Italic); } } } Как видно, здесь принципиально ничего нового нет, только лишь добавлена обработка события изменения состояния флажка checkedchanged для checkBox2. фрагмент работы программы можно увидеть на рис. 1.12. Рис. 1.12. Фрагмент работы усовершенствованной программы Убедиться в работоспособности программы можно, открыв решение CheckBox2.sIn в папке CheckBox2. Пример 7. Вкладки TabControlи переключатели RadioButton Вкладки используются для организации управления и оптимального расположения экранного пространства. Выразительным примером использования вкладок является диалоговое окно Свойства обозревателя Internet Explorer. То есть если требуется отобразить большое количество управляемой информации, то весьма уместно использовать вкладки TabControl. Поставим задачу написать программу, позволяющую выбрать текст из двух вариантов, задать цвет и размер шрифта этого текста на трех вкладках TabControl с использованием переключателей RadioButton. Фрагмент работы программы приведен на рис. 1.13. Рис. 1.13. Программа с переключателями и вкладками Программируя поставленную задачу, создадим новый проект Windows Forms Application С#, назовем его, например, ВкладкиTabControl, получим стандартную форму. Затем, используя панель элементов Toolbox, в форму перетащим мышью элемент управления TabControl. Как видно, по умолчанию имеем две вкладки, а поусловию задачи, как показано на рис. 1.13, три вкладки. Добавить третью вкладку можно в конструкторе формы, а можно программно. Вначале покажем, как добавить третью вкладку в конструкторе. Для этого в свойствах (окно Properties) элемента управления TabControl1 выбираем свойство TabPages, в результате попадаем в диалоговое окно TabPage Collection Edit, где добавляем (кнопка Add) третью вкладку (первые две присутствуют по умолчанию) Эти вкладки нумеруются от нуля, т. е. третья вкладка будет распознаваться как TabPages(2). Название каждой вкладки" будем указывать в программном коде. Для того чтобы читатель в большей степени мог управлять всем процессом, мы покажем, как добавить третью вкладку не в конструкторе, а в программном коде сразу после вызова процедуры InitializeComponent (листинг 1.6). Однако, прежде чем перейти на вкладку программного кода, для каждой вкладки выбираем из панели Toolbox по два переключателя RadioButton, а в форму перетаскиваем метку Label. Теперь через щелчок правой кнопкой мыши в пределах формы переключаемся на редактирование программного кода. Листинг 1.6. Использование вкладок и переключателей // Программа, позволяющая выбрать текст из двух вариантов, задать цвет //и размер шрифта для этого текста на трех вкладках TabControl // с использованием переключателей RadioButton using System; using System. Drawing; us ing System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются //вданной программе namespace ВкладкиTabControl { public partial class Form1 : Form { public Form1() { InitializeComponent(); // Создание третьей вкладки "программно": System.Windows.Forms.TabPage tabPage3 = new System.Windows.Forms.TabPage(); tabPage3.UseVisualStyleBackColor = true; // Добавление третьей вкладки в существующий набор // вкладок tabControl1: this. tabControl1.Controls. Add (tabPage3); //this.Visible = false; // Добавление переключателей 5 и 6 на третью вкладку: tаbРаgеЗ .Controls.Add(this.radioButton5); tabPage3.Controls.Add(this.radioButton6); // Расположение переключателей 5 и 6: this.radioButton5.Location = new System.Drawing.Point(20, 15); this.radioButton6.Location = new System.Drawing.Point(20, 58); this.Text = "Какая улыбка Вам ближе"; // Задаем названия вкладок: tabControl1.TabPages[0].Text = "Текст"; tabControl1.TabPages[1].Text = "Цвет"; tabControl1.TabPages[2].Text = "Размер"; // Эта пара переключателей изменяет текст: radioButton1.Text = "Восхищенная, сочувственная,\nскромно-смущенная"; radioButton2.Text = "Нежная улыбка, ехидная, бес" + "стыжая,\nподленькая, снисходительная"; // или //radioButton.2. Text = "Нежная улыбка, бесстыжая," + //Environment.NewLine + "подленькая, снисходительная"; // Эта пара переключателей изменяет цвет текста: radioButton3.Text = "Красный"; radioButton4.Text = "Синий"; // Эта пара переключателей изменяет размет шрифта: radioButton5.Text = "11 пунктов"; radioButton6.Text = "13 пунктов"; label1.Text = radioButton1.Text; } // Далее - обработка событий изменения состояния шести переключателей private void radioButton1_CheckedChanged(object sender, EventArgs e) { Label1. Text = radioButton1 .Text; } private void radioButton2_CheckedChanged(object sender, EventArgs e) , { label1.Text = radioButton2.Text; } private void radioButton3_CheckedChanged(object sender, EventArgs e) { label1.ForeColor = Color.Red; } private void radioButton4_CheckedChanged(object sender, EventArgs e) { label1.ForeColor = Color.Blue; } private void radioButton5_CheckedChanged(object sender, EventArgs e) { label1.Font = new Font(label1.Font.Name, 11); } private void radioButton6_CheckedChanged(object sender, EventArgs e) { label1.Font = new Font(label1.Font.Name, 13); } } } Как видно из текста программы, сразу после вызова процедуры InitializeComponent (этот программный код можно было бы задать при обработке события загрузки формы Form1_Load) создаем "программно" третью вкладку и добавляем ее в набор вкладок tabControl1, созданный в конструкторе. Далее "привязываем" пятый и шестой переключатели к третьей вкладке. Дальнейшие установки очевидны и не требуют дополнительных комментариев. Заметим, что каждая пара переключателей, расположенных на каком-либо элементе управления (в данном случае на различных вкладках), "отрицают" друг друга, т. е. если пользователь выбрал один, то другой переходит в противоположное состояние. Отслеживать изменения состояния переключателей удобно с помощью обработки событий переключателей checkchanged (см. листинг 1.6). Чтобы получить пустой обработчик этого события в конструкторе формы, следует дважды щелкнуть на соответствующем переключателе и таким образом запрограммировать изменения состояния переключателей. Убедиться в работоспособности программы можно, открыв решение ВкладкиTabControl.sln в папке ВкладкиTabControl. Пример 8. Свойство Visibleи всплывающая подсказка ToolTipв стиле Balloon Продемонстрируем возможности свойства visible (Видимый). Программа пишет в метку Label некоторый текст, а пользователь с помощью командной кнопки делает этот текст невидимым, а затем опять видимым и т. д. При зависании мыши над кнопкой появляется подсказка "Нажми меня". Запускаем Visual Studio 2010, далее выбираем пункты меню File | New | Project | Windows Forms Application C# и нажимаем кнопку ОК. Затем из панели элементов управления Toolbox в форму перетаскиваем метку Label, кнопку Button и всплывающую подсказку ToolTip. Только в этом случае каждый элемент управления в форме (включая форму) получает свойство ToolTip on Tip. Убедитесь в этом, посмотрев свойства (окно Properties) элементов управления. Для кнопки button1 напротив свойства ToolTip on Tip мы могли бы написать "Нажми меня". Однако я предлагаю написать это непосредственно в программном коде. В этом случае программист не будет долго искать соответствующее свойство, когда станет применять данный фрагмент в своей новой программе! Перейдем на вкладку программного кода— щелчок правой кнопкой мыши в пределах формы и выбор команды View Code. Окончательный текст программы представлен в листинге 1.7. Листинг 1.7. Свойство visible и всплывающая подсказка ToolTip II Программа пишет в метку Label некоторый текст, а пользователь // с помощью командной кнопки делает этот текст либо видимым, либо //невидимым. Здесь использовано свойство Visible. При зависании мыши // над кнопкой появляется подсказка "Нажми меня" (свойство ToolTip). Using System; Using System.Drawing; Using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются // в данной программе namespace Visible { public partial class Form1 : Form { public Form1() { InitializeComponent(); base.Text = "Житейская мудрость"; label1.Text = "Сколько ребенка не учи хорошим манерам,\n" + "он будет поступать так, как папа с мамой"; Label1.TextAlign = ContentAlignment.MiddleCenter; button1.Text = "Кнопка"; toolTip1.SetToolTip(button1, "Кнопка\r\nсчастья"); // Должна ли всплывающая подсказка использовать всплывающее окно: toolTip1.isBalloon = true; // Если IsBalloon = false, то используется стандартное // прямоугольное окно } private void button1_Click(object sender, EventArgs e) { // Обработка события "щелчок на кнопке". // Можно программировать так: // if (label1.Visible == true) label1.Visible = false; // else label1.Visible = true; // или так: // label1.Visible = label1.Visible ^ true; // здесь ^ - логическое исключающее ИЛИ, // или совсем просто: Label1.Visible = !label1.Visible; } } } Сразу после вызова процедуры InitializeComponent свойству Text метки присваиваем некоторый текст, "склеивая" его с помощью знака "плюс" (+) из отдельных фрагментов. Использование в текстовой строке символов "\n" (или "\r\n") означает перенос текста на новую строку (это так называемый перевод каретки). Можно переводить каретку с помощью строки Environment.NewLine. В перечислении Environment можно выбрать и другие управляющие символы. Свойство метки TextAlign располагает текст метки по центру и посередине (MiddleCenter). Выражение, содержащее ToolTip1, устанавливает (set) текст всплывающей подсказки для кнопки button1 при "зависании" над ней указателя мыши (рис. 1.14). По умолчанию свойство isBalloon пребывает в состоянии false, и при этом во всплывающей подсказке используется стандартное прямоугольное окно, установка isBalloon = true переводит подсказку в стиль комиксов (в стиль Balloon), см. рис. 1.14. Чтобы в программном коде получить пустой обработчик события "щелчок мышью на кнопке", следует в дизайнере (конструкторе) формы (т. е. на вкладке Form1.cs[Designer]) дважды щелкнуть на кнопке button1. При обработке этого события, как видно, закомментированы пять строчек, в которых записана логика включения видимости метки или ее выключение. Логика абсолютно понятна: если свойство видимости (visible) включено (true), то его следует выключить (false); иначе (else) — включить. Рис. 1.14. Фрагмент работы программы Несколько путано, но разобраться можно. И все работает. Проверьте! Кнопку можно нажимать мышью, клавишей <Enter> и клавишей <Пробел>. Однако можно пойти другим путем. Именно поэтому пять строчек этой сложной логики переведены в комментарий. Мы уже встречались с побитовым оператором ^(исключающее ИЛИ). Напоминаю, что этот оператор, говоря кратко, выбирает "да" (true), сравнивая "нет" и "да", и выбирает "нет" (false), сравнивая "да" и "да". Однако можно еще более упростить написание программного кода: label1.visible = ! label1.Visible; To есть при очередной передаче управления на эту строчку свойство label1.visible будет принимать противоположное значение. Вы убедились, что можно по-разному программировать подобные ситуации. Как видно, мы использовали много закомментированных строчек программного кода. Очень удобно комментировать строки программного кода в редакторе Visual Studio, вначале выделяя их, а затем использовать комбинацию клавиш <Ctrl>+<K> | <С> (Comment). Чтобы убрать с нескольких строк знак комментария, можно аналогично вначале отметить их, а затем пользоваться уже дугой комбинацией клавиш <Ctrl>+<K> | <U> (Uncomment). Текст программы можно посмотреть, открыв решение Visible.sln в папке Visible. Пример 9. Калькулятор на основе комбинированного списка ComboBox Элемент управления ComboBox служит для отображения вариантов выбора в выпадающем списке. Продемонстрируем работу этого элемента управления на примере программы, реализующей функции калькулятора. Здесь для отображения вариантов выбора арифметических операций используется комбинированный список ComboBox. После запуска Visual Studio 2010 и выбора шаблона Windows Forms Application С# из панели Toolbox перетащим в форму два текстовых поля TextBox, метку Label и комбинированный список ComboBox. Текст программы представлен в листинге 1.8. Листинг 1.8. Суперкалькулятор // Программа, реализующая функции калькулятора. Здесь для отображения // вариантов выбора арифметических действий используется комбинированный // список ComboBox using System; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются // в данной программе namespace ComboBox_Calc { public partial class Form1 : Form { public Form1() { InitializeComponent(); comboBox1.Text = "Выбери операцию"; comboBox1.Items.AddRange(new string[] {"Прибавить", "Отнять", "Умножить", "Разделить", "Очистить"}); comboBox1.Tablndex = 2; textBox1.Clear(); textBox2.Clear(); textBox1.Tablndex = 0; textBox2.Tablndex = 1; this.Text = "Суперкалькулятор"; label1.Text = "Равно: "; } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { // Обработка события изменения индекса выбранного элемента label1.Text = "Равно: "; // Преобразование из строковой переменной в Single: Single X, Y, Z = 0; bool Число_ли1 = single.TryParse(textBox1.Text, Systern.Globalization.NumberStyles.Number, System.Globalization.NumberFormatlnfo.Currentlnfo, out X); bool Число_ли2 = Single.TryParse(textBox2.Text, System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatlnfo.Currentlnfo, out Y) ; if (Число_ли1 == false || Число_ли2 == false) { MessageBox.Show("Следует вводить числа!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } // Оператор множественного выбора: switch (comboBox1.Selectedlndex) // Выбор арифметической операции: case 0: // Выбрали "Прибавить": Z = X + Y; break; case 1: // Выбрали "Отнять": Z = X - Y; break; case 2: // Выбрали "Умножить": Z = X * Y; break; case 3: // Выбрали "Разделить": Z = X / Y; break; case 4: // Выбрали "Очистить": textBoxl.Clear(); textBox2.Clear(); label1.Text = "Равно: "; return; } Label1.Text = string.Format("Равно {0:F5}", Z) ; } } } В данной программе сразу после вызова процедуры InitializeComponent присваиваем начальные значения некоторым свойствам, в том числе задаем коллекцию элементов комбинированного списка: "Прибавить", "Отнять" и т. д. Здесь также задаем табличные индексы Tabindex для текстовых полей и комбинированного списка. Табличный индекс определяет порядок обхода элементов. Так, при старте программы фокус будет находиться в первом текстовом поле, поскольку мы назначили textBox1. Tablndex = 0. Далее при нажатии пользователем клавиши <ТаЬ> будет происходить переход от элемента к элементу соответственно табличным индексам (рис. 1.15). Рис. 1.15. Переход от одного текстового поля к другому При обработке события "изменение индекса выбранного элемента" comboBox1_SelectedIndexChanged помощью функции TryParse проверяем, можно ли текстовые поля преобразовать в число. Первым параметром метода TryParse является анализируемое поле. Второй параметр — это разрешаемый для преобразования стиль числа, в данном случае типа Number, т. е. десятичное число, которое имеет целую и дробную части. Третий параметр указывает, на какой основе формируется допустимый формат, в нашем случае мы использовали CurrentInfо, т. е. на основе текущего языка и региональных параметров. По умолчанию при инсталляции руссифицированной версии Windows разделителем целой и дробной частей числа является запятая. Однако эту установку можно изменить, если в Панели управления выбрать значок Язык и региональные стандарты, а затем на вкладке Региональные параметры щелкнуть на кнопке Настройка и на появившейся новой вкладке указать в качестве разделителя целой и дробной частей точку вместо запятой. В обоих случаях (и для запятой, и для точки) метод TryParse будет работать так, как указано на вкладке Региональные параметры. Четвертый параметр метода TryParse возвращает результат преобразования. Кроме того, функция TryParse возвращает булеву переменную true или false, которая сообщает, успешно ли выполнено преобразование. Как видно из текста программы, если хотя бы одно поле невозможно преобразовать в число, то программируем сообщение "Следует вводить числа!" и выход из процедуры обработки события с помощью оператора return. Далее оператор switch осуществляет множественный выбор арифметической операции в зависимости от индекса выбранного элемента списка selectedindex. Оператор switch передает управление той или иной "метке case". Причем, как говорят программисты, оператор множественного выбора в С-подобных языках в отличие от других языков, например Basic, "проваливается", т. е. управление переходит на следующую метку case, поэтому приходится использовать оператор break для выхода из switch. Последний оператор в процедуре осуществляет формирование строки с поморю метода string.Format для вывода ее на метку label1. Формат " {0:F5}" означает, что значение переменной z следует выводить по фиксированному формату с „пятью знаками после запятой (или точки). Заметьте, в этом примере даже не пришлось программировать событие деления на ноль. Система Visual Studio сделала это за нас (см. рис. 1.15). Убедиться в работоспособности программы можно, открыв решение ComboBox_Calc.sln в папке ComboBox_Calc. Пример 10. Вывод греческих букв, символов математических операторов. Кодовая таблица Unicode Немного ликбеза. Хранение текстовых данных в памяти ЭВМ предполагает кодирование символов по какому-либо принципу. Таких кодировок несколько. Каждой кодировке соответствует своя таблица символов. В этой таблице каждой ячейке соответствуют номер в таблице и символ. Мы упомянем такие кодовые таблицы: ASCII, ANSI Cyrillic (другое название этой таблицы— Windows 1251), а также Unicode. Первые две таблицы являются однобайтовыми, т. е. каждому символу соответствует 1 байт данных. Поскольку в 1 байте — 8 битов, байт может принимать 28 = 256 различных состояний, этим состояниям можно поставить в соответствие 256 разных символов. Так, в таблице ASCII от 0 до 127 — базовая таблица — есть английские буквы, цифры, знаки препинания, управляющие символы. От 128 до 255 — это расширенная таблица, в ней находятся русские буквы и символы псевдографики. Некоторые из этих символов соответствуют клавишам IBM-совместимых компьютеров. Еще эту таблицу называют "ДОСовской" по имени операционной системы MS-DOS, где она применяется. Эта кодировка используется также в Интернете. В операционной системе Windows используется преимущественно ANSI (Windows 1251). Базовые символы с кодами от 0 до 127 в этих таблицах совпадают, а расширенные — нет. То есть русские буквы в этих таблицах находятся в разных местах таблицы. Из-за этого бывают недоразумения. В ANSI нет символов псевдографики. ANSI Cyrillic — другое название кодовой таблицы Windows 1251. Существует также двухбайтовый стандарт Unicode. Здесь один символ кодируется двумя байтами. Размер такой таблицы кодирования — 216 = 65 536 ячеек. Кодовая таблица Unicode включает в себя практически все современные письменности. Разве что здесь нет старославянских букв. Когда в текстовом редакторе MS Word мы выполняем команду Вставка | Символ, то вставляем символ из таблицы Unicode. Также в Блокноте можно сохранять файлы в кодировке Unicode: Сохранить как | Кодировка Юникод. В этом случае в Блокноте будут, например, греческие буквы, математические операторы ∏, ∆, ∑ и проч. Кстати, греческая буква Σ и математический оператор ∑ занимают разные ячейки в Unicode. Размер файла при сохранении в Блокноте будет ровно в два раза большим. Напишем программу, которая приглашает пользователя ввести радиус R, чтобы вычислить длину окружности. При программировании этой задачи длину окружности в метке Label назовем греческой буквой β, приведем формулу для вычислений с греческой буквой π = 3,14. Результат вычислений выведем в диалоговое окно MessageBox также с греческой буквой. После традиционного запуска Visual Studio 2010 и выбора шаблона Windows Forms Application С# перетащим в форму две метки Label, текстовое поле TextBox и командную кнопку Button. Посмотрите на рис. 1.16, так должна выглядеть форма после программирования этой задачи. Рис. 1.16. Фрагмент работы программы, использующей символы Unicode Вывод греческих букв на метку label1 и в диалоговое окно MessageBox можно осуществить, например, таким путем. В текст программы через буфер обмена вставляем греческие буквы из текстового редактора MS Word. Поскольку по умолчанию Visual Studio 2010 сохраняет cs-файлы в формате Unicode, в принципе таким образом можно программировать вывод греческих букв и других символов на форму и на другие элементы управления. Более технологично пойти другим путем, а именно будем вставлять подобные символы с помощью функции convert.ToChar, а на вход этой функции будем подавать номер символа в таблице Unicode. В этом случае, даже если cs-файл будет сохранен в традиционной для Блокнота кодировке ANSI, программа будет работать корректно. Номер символа в таблице Unicode легко выяснить, выбрав в редакторе MS Word пункты меню Вставка | Символ. Здесь в таблице следует найти, этот символ и соответствующий ему код знака в шестнадцатеричном представлении. Чтобы перевести шестнадцатеричное представление в десятичное, следует перед шестнадцатеричным числом поставить 0х. Например, после выполнения оператора n = 0хЗВ2 в переменной n будет записано десятичное число 946. На этом месте в таблице Unicode расположена греческая буква β. Именно таким образом запрограммирована данная задача (листинг 1.9). Листинг 1.9. Использование символов Unicode // Программа демонстрирует возможность вывода в текстовую метку, а также // в диалоговое окно MessageBox греческих букв. Программа приглашает //пользователя ввести радиус R, чтобы вычислить длину окружности using System; using System.Windows.Forms; IIдругие директивы using удалены, поскольку они не используются //в данной программе namespace Unico { public partial class Form1 : Form { public Form1() { // Инициализация нового экземпляра класса System.Windows.Forms.Form InitializeComponent(); base.Font = new System.Drawing.Font("Times New Roman", 12.0F); base.Text = "Греческие буквы"; button1.Text = "Вычислить"; // бета = 2 x Пи x R Label1.Text = string.Format( "Найдем длину окружности:\n {0} = 2{1}{2}{1}R,\nгде {2} = {3}", Convert.ToChar(0x3B2), Convert.ToChar(0x2219), // 0=бета 1 - точка Convert.ToChar(ОхЗСО), Math. PI) ; // 2 - Пи 3 - число Пи label2.Text = "Введите радиус R:"; textBox1.Clear() ; } private void button1_Click(object sender, EventArgs e) { // Проверка - число ли введено: Single R; // - радиус bool Число_ли = Single.TryParse(textBox1.Text, System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatlnfo.Currentlnfo, out R); if (Число_ли == false) { MessageBox.Show("Следует вводить числа!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Single beta = 2 * (Single)Math.PI * R; // 0x3B2 - греческая буква бета MessageBox.Show(String.Format("Длина окружности {0} = {1:F4}", Convert.ToChar(0x3B2), beta), "Греческая буква"); } } } I Как видно из программного кода, сразу после вызова процедуры InitializeComponent мы задали шрифт Times New Roman, 12 пунктов для формы, этот шрифт будет распространяться на все элементы управления на форме, т. е. натекстовое поле, метку и командную кнопку. Далее, используя метод string.Format, инициализировали свойство Text метки label1. Различные шестнадцатеричные номера соответствуют греческим буквам и арифметической операции "умножить", в инициализации строки участвует также константа π = 3,14. Ее болев точное значение получаем из Math.PI. Escape-последовательность "\n" используем для переноса текста на новую строку. Так называемый перевод каретки можно осуществить также спомощью строки NewLine из перечисления Environment. Обрабатывая событие button1_click (щелчок на кнопке), мы проверяем с помощью метода TryParse, число ли введено в текстовое поле. Если пользователь ввел число (true), то метод TryParse возвращает значение радиуса R. При вычислении длины окружности beta приводим значение константы Math.PI из типа Double к типу Single посредством неявного преобразования. После вычисления длины окружности beta выводим ее значение вместе с греческой буквой β— Convert.ToChar(0хЗВ2) В диалоговое окно MessageBox. Здесь используем метод string.Format. Выражение "{0:F4}" означает, что значение переменной beta следует выводить по фиксированному формату с четырьмя знаками после запятой. Данная программа будет корректно отображать греческие буквы, даже если от крыть файл Form1.cs текстовым редактором Блокнот и сохранить его в кодировке ANSI. Убедиться в работоспособности программы можно, открыв решение Unico.sln в папке Unico. |