Листинг 1.1

rivate System.Windows.Forms.TextBox textBox1;

private System.Windows.Forms.Button button1;

private System.Windows.Forms.TextBox textBox2;

private System.Windows.Forms.Label label2;

//А вот фрагмент текста процедуры InitailizeComponent:

#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not

/// modify the contents of this method with the code

/// editor.

/// </summary>

private void InitializeComponent()

{

this.label1 = new System.Windows.Forms.Label();

this.textBox1 = new System.Windows.Forms.TextBox();

this.button1 = new System.Windows.Forms.Button();

this.textBox2 = new System.Windows.Forms.TextBox();

this.label2 = new System.Windows.Forms.Label();

this.SuspendLayout();

// label1

this.label1.Location = new System.Drawing.Point(24, 40);

this.label1.Name = "label1";

this.label1.Size = new System.Drawing.Size(152, 32);

this.label1.TabIndex = 0;

this.label1.Text = "Ваше имя";

this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;

//... аналогично задаются описания свойств всех элементов управления...

//... далее задаются свойства самой формы...

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);

this.ClientSize = new System.Drawing.Size(528, 268);

this.Controls.AddRange(new

System.Windows.Forms.Control[]

{

this.textBox2,

this.label2,

this.button1,

this.textBox1,

this.label1

}

this.Name = "Form1";

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

this.Load += new System.EventHandler(this.Form1_Load);

this.ResumeLayout(false);

}

#endregion

}

}

}

Заметьте, в теге < summary > нас предупреждают, что этот метод требуется специальному инструментарию - Дизайнеру формы - и он не предназначен для редактирования пользователем; добавление и удаление кода этого метода производится автоматически. Обращаю внимание, что после заполнения свойств элементов управления заключительным шагом является их добавление в коллекцию Controls, хранящую все элементы управления. Здесь используется метод AddRange, позволяющий добавить в коллекцию одним махом целый массив элементов управления. Метод Add позволяет добавлять в коллекцию по одному элементу. Позже нам придется добавлять элементы управления в форму программно, динамически изменяя интерфейс формы. Для этого мы будем выполнять те же операции: объявить элемент управления, создать его, используя конструкцию new, задать нужные свойства и добавить в коллекцию Controls.

В заключение приводится текст обработчика событий командной кнопки. Как задается обработчик того или иного события для элементов управления? Это можно делать по-разному. Есть стандартный способ включения событий. Достаточно выделить нужный элемент в форме, в окне свойств нажать кнопку событий (со значком молнии ) и из списка событий выбрать нужное событие и щелкнуть по нему. В данной ситуации все можно сделать проще - двойной щелчок по кнопке включает событие, и автоматически строится заготовка обработчика события с нужным именем и параметрами. Вот как она выглядит (см. рис.1.31):

private void button1_Click(object sender, System.EventArgs e)

{

}

Нам остается добавить свой текст. Добавляются следующие строки:

string temp;

temp = textBox1.Text;

if (temp == "")

textBox2.Text = "Здравствуй, мир!";

else

textBox2.Text = "Здравствуй, " + temp + "!";

И вот как это работает.

Рис. 1.31. Форма "Приветствие" в процессе работы.

Обработка событий в Windows Forms

GUI управляется событиями. Приложение выполняет действия в ответ на события, вызванные пользователем, например, на щелчок кнопкой мыши или выбор пункта меню. В Windows Forms применяет­ся модель обработки событий.NET, в которой делегаты используются для того, чтобы связать события с обрабатывающими их методами. В классах Windows Forms используются групповые делегаты. Группо­вой делегат содержит список связанных с ним методов. Когда в приложении происходит событие, управляющий элемент возбуждает событие, вызвав делегат для этого события, который вызывает связан­ные с ним методы. Для того чтобы добавить делегат к событию, ис­пользуется перегруженный оператор +=. Например:

this.MouseClick += new MouseEventHandler(this. Form1_MouseClick);

Объявление обработчика для этого события:

private void Form1_MouseClick(object sender, MouseEventArgs e)

{ }

В качестве параметра обработчик событий получает объект класса МоuseEventArgs (производный от класса EventArgs). Свойства этого объекта содержат информацию, связанную с данным событием.

• Button (Кнопка) определяет, какая кнопка была нажата;

• Clicks (Щелчки) определяет, сколько раз была нажата и отпуще­на кнопка;

• свойство Delta (Дельта) является счетчиком оборотов колесика мыши;

• X и Y - координаты точки, в которой находился указатель в мо­мент нажатия кнопки мыши.

Внесем изменения в FirstForm, чтобы при щелчке кнопкой мыши строка с приветствием перемещалась на место щелчка.

Листинг 1.2. Отображает перемещение приветствия по щелчку мыши.

public partial class Forml: Form {

float x, y; // координаты

Brush pStdBrush; // Кисть

Graphics poGraphics; public Form1() {

InitializeComponent();

x=10; y=20;

pStdBrush = new SolidBrush(Color.Black); poGraphics = this.CreateGraphics(); this.Text = "Программа 1"; this.Show();

poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y); }

private void Form1_MouseClick(object sender, MouseEventArgs e) {

// координаты точки щелчка мыши x = (float)e.X; y = (float)e.Y;

poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y); }

}

Параметры метода DrawString:

• выводимая строка;

• шрифт (Font— свойство класса Form, которое определяет шрифт, по умолчанию применяемый для вывода текста в форму);

• используемая кисть; координаты в пикселях.

Метод Form1_MouseClick устанавливает координаты текста х и у, равными координатам точки, в которой находился указатель в момент щелчка.

Несколько обработчиков для события. Реализуем два обработчи­ка события Mouse Click. Второй обработчик по щелчку кнопкой мыши просто отображает окно сообщения. Метод ShowClick подключается к событию вручную аналогично методу Form1_MouseClick в файле Form1.Designer.cs.

Листинг 1.3. Два обработчика событий для MouseClick public partial class Form1: Form {

private void Form1_MouseClick(object sender, MouseEventArgs e) {

x = (float)e.X; y = (float)e.Y;

poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y); }

void ShowClick (object pSender, MouseEventArgs e) MessageBox.Show("Mouse clicked!!'");

}

Введем в пример обработку события KeyPress, а также покажем, как в событии MouseDown различать, какая кнопка была нажата: левая или правая.

Обработка событий от правой и левой кнопки мыши. Для того чтобы определить, какая кнопка мыши была нажата, используем свой­ство Button параметра MouseEventArgs. Перепишем методы обработ­чика событий:

Листинг 1.3.

private void Form1_MouseClick(object sender, MouseEventArgs e) { // если левая кнопка if (e.Button == System.Windows.Forms.MouseButtons.Left) { x = (float)e.X; y = (float)e.Y; poGraphics.DrawString("Hello, Window Forms", this.Font, pStdBrush, x, y);

}

}

void ShowClick (object pSender, MouseEventArgs e) { // если правая кнопка

if (e.Button == System.Windows.Forms.MouseButtons.Right) MessageBox.Show("Mouse clicked!!'");

Событие Keypress. При нажатии пользователем на клавишу кла­виатуры в конец строки приветствия будет добавлен соответствующий символ. Вместо класса String используется класс StringBuilder, кото­рый более эффективен в этой ситуации.

public partial class Forml: Form { StringBuilder pStr; String s;

public Forml() {

pStr = new StringBuilder("Hello, Window Forms"); s = pStr.ToString();

poGraphics.DrawString(s, this.Font, pStdBrush, x, y);

}

private void Forml_KeyPress(object sender, KeyPressEventArgs e) { pStr.Append(e.KeyChar); // Добавляем в конец s = pStr.ToString();

poGraphics.DrawString(s, this.Font, pStdBrush, x, y);

}

}


Листинг 1.4. Создадим шуточную программу, представляющую собой диалоговое окно с двумя кнопками. Назовем его SocOpros. Из окна Toolbox перетаскиваем на форму две кнопки Button и надпись Label и устанавливаем следующие свойства элементов управления и формы (табл. 3.4).


Щелкаем дважды по кнопке "Да". В обработчике этой кнопки вставляем следующий код:

void btnyes_Click(object sender, EventArgs e){ MessageBox.Show("Mbi и не сомневались, что Вы так думаете!");

}

Выделяем кнопку "Нет". Открываем окно Properties. Переключаем­ся в окно событий и дважды щелкаем в поле MouseMove.

В обработчике связываем движение мыши с координатами кнопки и устанавливаем координаты, куда она будет возвращаться, если во время своего движения выйдет за указанную область:

private void Btnno_MouseMove(object sender, MouseEventArgs e) { Btnno.Top -= e.Y; Btnno.Left += e.X;

if (Btnno.Top < -10 || Btnno.Top > 100) Btnno.Top = 60;

if (Btnno.Left < -80 || Btnno.Left > 250) Btnno.Left = 120;

}

Событие — это автоматическое извещение о каком-либо произошедшем действии. События являются членами класса и объявляются с использованием ключевого слова event. Механизм событий основан на использовании делегатов.

Синтаксис: event имя делегата имя объекта;

Широковещательные события

События могут активизировать несколько обработчиков, в том числе те, что определены в других объектах. Такие события называются широковещательными. Широковещательные события создаются на основе многоадресных делегатов.

Пример:

// Объявление делегата, на основе которого будет // определено событие. delegate void MyEventHandler ();

// Объявление класса, в котором инициируется событие. class MyEvent

{

public event MyEventHandler activate; // В этом методе инициируется событие.

public void fire()

{ if (activate!= null) activate(); }

class X

{

public void Xhandler() {

Console.WriteLine("Co6biTMe получено объектом класса X."); }

}

class Y

{

public void Yhandler()

{

Console.WriteLine("Coбытие получено объектом класса Y.");

}

}

class EventDemo

{

static void handler()

{

Console.WriteLine("Coбытие получено объектом класса EventDemo.")

}

public static void Main()

{

MyEvent evt = new MyEvent();

X xOb = new X(); Y yOb = new Y();

// Добавление методов handler (), Xhandler() // и Yhandler() в цепочку обработчиков события.

evt.activate += new MyEventHandler(handler); evt.activate += new MyEventHandler(xOb.Xhandler); evt.activate += new MyEventHandler(yOb.Yhandler);

evt.fire(); Console.WriteLine();

evt.activate -= new MyEventHandler(xOb.Xhandler); evt.fire();

}

}

Исключительные ситуации

Исключение представляет собой ошибку, происходящую во время выполнения программы. С помощью подсистемы обработки исключений для С# можно обрабатывать такие ошибки, не вызывая краха программы.

Обработка исключений в С# выполняется с применением четырех ключевых слов: try, catch, throw и finally. Эти ключевые слова образуют взаимосвязанную подсистему, в которой использование одного из ключевых слов влечет за собой использование других.

Основа обработки исключений основана на использовании блоков try и catch.

Синтаксис: try {

Блок кода для которого выполняется мониторинг ошибок
catch (ExcepTypel ехОЬ) {


Обработчик исключений ExcepTypel } catch (ЕхсерТуре2 ехОЬ) { Обработчик исключений ЕхсерТуре2 }

Возврат из исключения

Так как оператор catch не вызывается из программы, то после выполнения блока catch управление не передается обратно оператору программы, при выполнении которого возникло исключение. Выполнение программы продолжается с операторов, находящихся после блока catch.

С целью предотвращения этой ситуации возможно указание блока кода, который вызывается после выхода из блока try/catch, с помощью блока finally в конце последовательности try/catch. Общая форма конструкции try/catch, включающей блок finally, показана ниже:

try {

// Блок кода, выполняющий мониторинг ошибок }

catch (ExcepTypel ехОЫ) {

/I Обработка исключения ExcepTypel. }

catch (ЕхсерТуре2 ехОЬ2) {

II Обработка исключения ЕхсерТуре2.

finally {

// Код блока finally. }

Блок finally будет вызываться независимо от того, появится исключение или нет, и независимо от причин возникновения такового.

Генерация исключений

Исключения автоматически генерируются системой. Однако исключение может быть сгенерировано и посредством оператора throw.

Синтаксис:

throw exceptOb;

Исключение, перехваченное одним оператором catch, может генерироваться повторно, благодаря чему оно может перехватываться внешним оператором catch. Для этого указывается ключевое слово throw без имени исключения.

Наследование классов исключений:

Можно создавать заказные исключения, выполняющие обработку ошибок в пользовательском коде. Генерирование исключений не представляет особых сложностей. Просто определите класс, наследуемый из класса Exception. В качестве общего правила руководствуйтесь тем, что определенные пользователем исключения наследуются из класса АрplicationException, так как они представляют собой иерархию зарезервированных исключений, связанных с приложениями. Наследуемые классы не нуждаются в фактической реализации в каком-либо виде, поскольку само их существование в системе типов данных позволяет воспользоваться ими в качестве исключений.

Создаваемые пользователем классы исключений автоматически получают доступные для них свойства и методы, определенные в классе

Exception.

Задания к лабораторной работе 1:

1. Изучить предлагаемую теорию.

2. Записать и откомпилировать программы листинг 1.1 – листинг 1.4.

3. Выполнить домашние задания (тема 1, тема 10, тема 12), согласно номеру варианта.


Лабораторная работа № 2. Типы данных в C#

• Среда разработки Visual Studio - это уже проверенный временем программный продукт

Открытость

Среда разработки теперь является открытой языковой средой. Это означает, что наряду с языками программирования, включенными в среду фирмой Microsoft - Visual C++.Net (с управляемыми расширениями), Visual C#.Net, J#.Net, Visual Basic.Net, - в среду могут добавляться любые языки программирования, компиляторы которых создаются другими фирмами-производителями. Таких расширений среды Visual Studio сделано уже достаточно много, практически они существуют для всех известных языков -Fortran и Cobol, RPG и Component Pascal, Oberon и SmallTalk. Я у себя на компьютере включил в среду компилятор одного из лучших объектных языков - языка Eiffel.

Открытость среды не означает полной свободы. Все разработчики компиляторов при включении нового языка в среду разработки должны следовать определенным ограничениям. Главное ограничение, которое можно считать и главным достоинством, состоит в том, что все языки, включаемые в среду разработки Visual Studio.Net, должны использовать единый каркас - Framework.Net. Благодаря этому достигаются многие желательные свойства: легкость использования компонентов, разработанных на различных языках; возможность разработки нескольких частей одного приложения на разных языках; возможность бесшовной отладки такого приложения; возможность написать класс на одном языке, а его потомков -на других языках. Единый каркас приводит к сближению языков программирования, позволяя вместе с тем сохранять их индивидуальность и имеющиеся у них достоинства. Преодоление языкового барьера - одна из важнейших задач современного мира. Благодаря единому каркасу, Visual Studio.Net в определенной мере решает эту задачу в мире программистов.

Framework.Net - единый каркас среды разработки

В каркасе Framework.Net можно выделить два основных компонента:

• статический - FCL (Framework Class Library) - библиотеку классов каркаса;

• динамический - CLR (Common Language Runtime) - общеязыковую исполнительную среду.

Библиотека классов FCL - статический компонент каркаса

Понятие каркаса приложений - Framework Applications - появилось достаточно давно; по крайней мере оно широко использовалось еще в четвертой версии Visual Studio. Важна роль библиотеки классов MFC (Microsoft Foundation Classes) как каркаса приложений Visual C. Несмотря на то, что каркас, первоначально был представлен только статическим компонентом, уже тогда была очевидна его роль в построении приложений. Уже в то время важнейшее значение в библиотеке классов MFC имели классы, задающие архитектуру строящихся приложений. Когда разработчик выбирал один из возможных типов приложения, например, архитектуру Document-View, то в его приложение автоматически встраивались класс Document, задающий структуру документа, и класс View, задающий его визуальное представление. Класс Form и классы, задающие элементы управления, обеспечивали единый интерфейс приложений. Выбирая тип приложения, разработчик изначально получал нужную ему функциональность, поддерживаемую классами каркаса. Библиотека классов поддерживала и более традиционные для программистов классы, задающие расширенную систему типов данных, в частности, динамические типы данных - списки, деревья, коллекции, шаблоны.

Основа языка C#

Объявление и инициализация переменных:

Типпеременной имяпеременной [=значение]; Примеры:

int x; //обьявление переменной x

x=100; //инициализация переменной x

long w,z=100; //обьявление переменных w и z и


//инициализация z long q=100*z; //обьявление переменной с динамической

//инициализацией

Область видимости переменной в C#- блок кода (заключенный в фигурные скобки {}). Переменная создается при входе в область видимости и

уничтожаются при выходе из нее.

Пространство имен:

Пространство имен определяет область объявления, что позволяет хранить каждый набор имен отдельно от других наборов. В С# имена, объявленные в одном пространстве имен, не конфликтуют с такими же именами, объявленными в другом пространстве имен. Библиотекой.NET Framework (библиотекой С#) используется пространство имен System.

Пространство имен:

Пространство имен определяет область объявления, что позволяет хранить каждый набор имен отдельно от других наборов. В С# имена, объявленные в одном пространстве имен, не конфликтуют с такими же именами, объявленными в другом пространстве имен. Библиотекой.NET Framework (библиотекой С#) используется пространство имен System.

Для того, чтобы сделать видимыми пространства имен без указания полного имени (через '.') используется директива using

Синтаксис:

using имя_пространства имен;

также возможно использование псевдонимов для имен using псевдоним = имя;

Пространство имен объявляется с помощью ключевого слова namespace.

Синтаксис:

namespace имя {

члены пространства имен}

Пример программы на C#

Программа 'Hello, World' на языке C# выглядит следующим образом: using System;

class HelloWorld01

{

public static void Main() {

Console.Write("Hello, World!"); Console.ReadLine();

}

}

Платформа.NET Framework определяет среду для поддержки создания и выполнения платформонезависимых гетерогенных приложений. Основными особенностями данной платформы являются не зависящая от языка среда исполнения (Common Language Runtime, CLR) и библиотека классов.NET

Основа языка C#

Обьявление и инициализация переменных:

Тип переменной имя переменной [=значение]; Примеры:

int x; //объявление переменной x

x=100; //инициализация переменной x

long w,z=100; //объявление переменных w и z и

//инициализация z long q=100*z; //объявление переменной с динамической

// инициализацией

Область видимости переменной в C#- блок кода (заключенный в фигурные скобки {}). Переменная создается при входе в область видимости и уничтожаются при выходе из нее.

Для того, чтобы чтобы сделать видимыми пространства имен без указания полного имени (через '.') используется директива using

Синтаксис:

using имя пространства имен;

также возможно использование псевдонимов для имен using псевдоним = имя;

Пространство имен объявляется с помощью ключевого слова

namespace.

Синтаксис: namespace имя {

члены пространства имен}

С# является типизированным языком. Необходимо всегда объяв­лять тип каждого объекта, который создаете.

C# подразделяет типы на два вида: встроенные типы, которые определены в языке, и определяемые пользователем типы, которые создает программист. Также все типы разделяются на две основные разновидности: размерные (структурные) типы (value-based) и ссы­лочные типы (reference-based). К структурным типам относятся все числовые типы данных (int, float и др.), а также перечисления и струк­туры. К ссылочным типам относятся массивы, строки и классы.

Встроенные типы


Для каждого встроенного типа существует соответствующий тип в CRL (Common Language Runtime). Это означает, что каждый тип имеет два названия - полный (из CLR) и сокращенный, используемый в C# (см. табл. 2.1).

В языке C# сглажено различие между типом и классом. Все типы одновременно являются классами, связанными отношением наследо­вания. Родительским, базовым, классом является класс Object. Все ос­тальные типы являются его потомками, наследуя методы этого класса. У класса Object есть четыре наследуемых метода:

- bool Equals(object obj) - проверяет эквивалентность текущего объекта и объекта, переданного в качестве аргумента;

- System.Type GetType() - возвращает системный тип текущего объекта;

- string ToStringO - возвращает строку, связанную с объектом. Для арифметических типов возвращается значение, преобразованное в строку;

- int GetHashCode() - служит как хэш-функция в соответствующих алгоритмах поиска по ключу при хранении данных в хэш-таблицах.

Естественно, что все встроенные типы нужным образом переопре­деляют методы родителя и добавляют собственные методы и свойства.

//определение целой переменной встроенного типа int x=11, v = new Int32(); v = 007;

//определение строковой переменной string s1 = "Agent";

Преобразования типов. Преобразования в строковый тип всегда определены, поскольку все типы наследуют метод ToString(). Метод можно вызывать явно или он вызывается неявно, когда по контексту требуется преобразование к строковому типу: public void ToStringTest(){

string s ="Владимир Петров ", s1 =" Возраст: ";

int ux = 27;

s = s + s1 + ux.ToString(); Console.WriteLine (s);

s1 =" Зарплата: ";

float dy = (float)2700.50;

s = s + s1 + dy; Console.WriteLine (s); }

Преобразования строк в число. Класс Convert пространства имен System обеспечивает необходимые преобразования между раз­личными типами. Класс содержит 15 статических методов вида

To<Type> (ToBoolean(),...ToUInt64()). Все методы многократно пе­регружены.

public void FromStringTest() { s - 'Введите возраст ";

Console.WriteLine(s); s1 = Console.ReadLine();

ux = Convert.ToUInt32(s1); Console.WriteLine("Возраст: "+ ux);

Console.WriteLine("Введите зарплату ");

dy = Convert.ToDouble(Console.ReadLine());

Console.WriteLine("Зарплата: "+ dy);

}

Данные, читаемые с консоли методом ReadLine или Read, всегда представляют собой строку, которую затем необходимо преобразовать в нужный тип.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: