Главная страница

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


Скачать 7.39 Mb.
НазваниеСправочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Анкорлекция
Дата13.04.2023
Размер7.39 Mb.
Формат файлаdoc
Имя файлаЗиборов.doc
ТипСправочник
#1060897
страница3 из 31
1   2   3   4   5   6   7   8   9   ...   31

Листинг 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 удалены, поскольку они не используются

//в данной программе
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 В = С

  1. Xor 0=0

  2. Xor 0=1




  1. Xor 1=1

  2. 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 Applica­tion С# из панели 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 пункты меню Вставка | Символ. Здесь в таблице следует найти, этот символ и соответствующий ему код знака в шестнадцатеричном представлении. Чтобы перевести шестнадцатеричное представление в десятичное, следует перед шестнадцатеричным числом поставить . Например, после выполнения оператора 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.

1   2   3   4   5   6   7   8   9   ...   31


написать администратору сайта