Язык C# является наиболее известной новинкой в области создания языков программирования. В отличие от 60-х годов XX века - периода бурного языкотворчества - в нынешнее время языки создаются крайне редко. За последние 15 лет большое влияние на теорию и практику программирования оказали лишь два языка: Eiffel, лучший, по моему мнению, объектно-ориентированный язык, и Java, ставший популярным во многом благодаря технологии его использования в Интернете и появления такого понятия как виртуальная Java-машина. Чтобы новый язык получил признание, он должен действительно обладать принципиально новыми качествами. Языку C# повезло с родителями. Явившись на свет в недрах Microsoft, будучи наследником C++, он с первых своих шагов получил мощную поддержку. Однако этого явно недостаточно для настоящего признания достоинств языка. Попробуем разобраться, имеет ли он большое будущее?
Создателем языка является сотрудник Microsoft Андреас Хейлсберг. Он стал известным в мире программистов задолго до того, как пришел в Microsoft. Хейлсберг входил в число ведущих разработчиков одной из самых популярных сред разработки - Delphi. В Microsoft он участвовал в создании версии Java - J++, так что опыта в написании языков и сред программирования ему не занимать. Как отмечал сам Андреас Хейлсберг, C# создавался как язык компонентного программирования, и в этом одно из главных достоинств языка, направленное на возможность повторного использования созданных компонентов. Из других объективных факторов отметим следующие:
Как уже отмечалось, Visual Studio .Net для языков C#, Visual Basic и J# предлагает 12 возможных видов
Давайте разберемся, как создаются
С точки зрения программиста, компилятор создает
Дальнейшие объяснения лучше сочетать с реальной работой над
У себя на компьютере я открыл установленную лицензионную версию Visual Studio .Net 2003, выбрал из предложенного меню - создание нового ConsoleHello, указал, где будет храниться
(рис 2.1) Окно создания нового проектаЕсли принять эти установки, то компилятор создаст
(рис 2.2) Среда разработки и консольное приложение, построенное по умолчаниюИнтегрированная среда разработки IDE (Integrated Development Environment) Visual Studio является многооконной, настраиваемой, обладает большим набором возможностей. Внешний вид ее достаточно традиционен, хотя здесь есть новые возможности; я не буду заниматься ее описанием, полагаясь на опыт читателя и справочную систему. Обращаю внимание лишь на три окна, из тех, что показаны на рис. 2.2. В окне Solution Explorer представлена структура построенного ConsoleHello.Class1. Заметьте, в этом окне можно отображать и другие документы, список которых показан в верхней части окна.
Построенное ConsoleHello. Наш cs. Файл AssemblyInfo содержит информацию, используемую в Class1 является построенным по умолчанию классом, который задает точку входа - процедуру Main, содержащую для данного типа
Заметьте, класс
Помимо понимания структуры
System - основное NameA, поскольку в этом случае не требуется каждый раз задавать полное имя класса с указанием имени Console пространства System. Заметьте, полное имя
может потребоваться, если в нескольких используемых
Все языки допускают "//любой текст" ) воспринимается как /*, а концом - */. Заметьте, тело процедуры Main содержит три однострочных
Здесь же, в Class1 и описанию метода Main предшествует заданный в строчном <summary>. Этот тэг распознается специальным инструментарием, строящим <summary> возможны и другие тэги, включаемые в отчеты. Некоторые
Еще одна новинка C#, встречающаяся в начальном [STAThread], который предшествует описанию процедуры Main. Так же, как и тэги документирования, [STAThread] (Single Thread Apartment) задает однопоточную модель выполнения. Об
Скажем еще несколько слов о точке входа - процедуре Main. Ее заголовок можно безболезненно упростить, удалив аргументы, которые, как правило, не задаются. Они имеют смысл, когда
Таков консольный Debug нашего
Слегка изменим Console, среди многочисленных методов которого есть методы ReadLine и WriteLine с очевидной семантикой. Вот код
using System;
namespace ConsoleHello
{
/// <summary>
/// Первый консольный проект - Приветствие
/// </summary>
class Class1
{
/// <summary>
/// Точка входа. Запрашивает имя и выдает приветствие
/// </summary>
static void Main()
{
Console.WriteLine("Введите Ваше имя");
string name;
name = Console.ReadLine();
if( name == "" )
Console.WriteLine ("Здравствуй, мир!");
else
Console.WriteLine("Здравствуй, " + name + "!");
}
}
}
Я изменил текст в <summary>, удалил Main, добавил в ее using, мне не требуется при вызове методов класса Console каждый раз писать System.Console. Надеюсь, что программный текст понятен без дальнейших пояснений.
В завершение первого hello.xml.
(рис 2.3) Окно Property Pages проекта и задание имени XML-отчетаПосле перестройки
<?xml version="1.0"?> <doc> <assembly> <name>ConsoleHello</name> </assembly> <members> <member name="T:ConsoleHello.Class1"> <summary> Первый консольный проект - Приветствие </summary> </member> <member name="M:ConsoleHello.Class1.Main"> <summary> Точка входа. Запрашивает имя и_выдает приветствие </summary> </member> </members> </doc>
Как видите, отчет описывает наш <summary>. Класс содержит лишь один элемент - точку входа Main с заданной спецификацией в <summary>.
Проделаем аналогичную работу: построим Windows- "Приветствие". Повторяя уже описанные действия, в окне нового Windows Application, дав WindowsHello.
Как и в консольном случае, по умолчанию строится Form1, но это уже далеко не столь простой класс, как ранее. Вначале приведу его код, а потом уже дам необходимые пояснения:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsHello
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
// Required for Windows Form Designer support
InitializeComponent();
// TODO: Add any constructor code after
// InitializeComponent call
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#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.components = new
System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
Начну с того, что теперь Form из глубоко вложенного System.Windows.Forms. Построенный по умолчанию класс Form1 является наследником класса Form и автоматически наследует его функциональность - свойства, методы, события. При создании объекта этого класса, характеризующего форму, одновременно Visual Studio создает визуальный образ объекта - окно, которое можно заселять элементами управления. В режиме проектирования эти операции можно выполнять вручную, при этом автоматически происходит изменение программного кода класса. Появление в
В класс Form1 встроено закрытое ( private ) свойство - объект components класса Container. В классе есть конструктор, вызывающий закрытый метод класса InitializeComponent. В классе есть деструктор, освобождающий занятые ресурсы, которые могут появляться при добавлении элементов в контейнер components. Наконец, в классе есть точка входа - процедура Main с непустым телом.
Основной операцией, инициирующей вычисления в объектно-ориентированных приложениях, является вызов метода F некоторого класса x, имеющий вид:
x.F(arg1, arg2, ..., argN);
В этом вызове x называется целью вызова, и здесь возможны три ситуации:
x - имя класса. В этом случае метод F должен быть статическим методом класса, объявленным с static, как это имеет место, например, для точки вызова - процедуры Main ;x - имя объекта или объектное выражение. В этом случае F должен быть обычным, не статическим методом. Иногда такой метод называют x - не указывается при вызове. Такой вызов называется неквалифицированным, в отличие от двух первых случаев. Заметьте, неквалифицированный вызов вовсе не означает, что цель вызова отсутствует, - она просто задана по умолчанию. Целью является текущий объект (текущий класс для статических методов). Текущий объект имеет зарезервированное имя this. Применяя это имя, любой неквалифицированный вызов можно превратить в квалифицированный вызов. Иногда без этого имени просто не обойтись.Но как появляются объекты? Как они становятся текущими? Как реализуется самый первый вызов метода, другими словами, кто и где вызывает точку входа - метод Main? С чего все начинается?
Когда CLR получает Main. Некоторый объект исполнительной среды CLR и вызывает этот метод, так что первоначальный вызов метода осуществляется извне приложения. Это и есть точка "большого взрыва" - начало зарождения мира объектов и объектных вычислений. Дальнейший сценарий зависит от содержимого точки входа. Как правило, в ней создаются один или несколько объектов, а затем вызываются методы и/или обработчики событий, происходящих с созданными объектами. В этих методах и обработчиках событий могут создаваться новые объекты, вызываться новые методы и новые обработчики. Так, начиная с одной точки, разворачивается целый мир объектов приложения.
Давайте посмотрим, что происходит в Main начала работать. Процедура Main содержит всего одну строчку:
Application.Run(new Form1());
Прокомментируем этот квалифицированный вызов. Целью здесь является класс Application из System.Windows.Forms. Класс вызывает статический метод Run, которому в качестве фактического аргумента передается объектное выражение new Form1(). При вычислении этого выражения создается первый объект - экземпляр класса Form1. Этот объект становится текущим. Для создания объекта вызывается конструктор класса. В процессе работы конструктора осуществляется неквалифицированный вызов метода InitializeComponent(). Целью этого вызова является текущий объект - уже созданный объект класса Form1. Ни в конструкторе, ни в вызванном методе новые объекты не создаются. По завершении работы конструктора объект класса Form1 передается методу Run в качестве аргумента.
Метод Run класса Application - это знаменитый метод. Во-первых, он открывает форму - видимый образ объекта класса Form1, с которой теперь может работать пользователь. Но главная его работа состоит в том, что он создает настоящее Windows-приложение, запуская цикл обработки сообщений о происходящих событиях. Поступающие сообщения обрабатываются операционной системой согласно очереди и приоритетам, вызывая обработчики соответствующих событий. Поскольку наша форма по умолчанию не заселена никакими элементами управления, то поступающих сообщений немного. Все, что может делать пользователь с формой, так это перетаскивать ее по экрану, сворачивать и изменять размеры. Конечно, он может еще закрыть форму. Это приведет к завершению цикла обработки сообщений, к завершению работы метода Run, к завершению работы метода Main, к завершению работы приложения.
Давайте расширим приложение по умолчанию до традиционного приветствия в Windows-стиле, добавив окошки для ввода и вывода информации. Как уже говорилось, при создании Windows-приложения по умолчанию создается не только объект класса Form1 - потомка класса Form, но и его видимый образ - форма, с которой можно работать в режиме проектирования, населяя ее элементами управления. Добавим в форму следующие элементы управления:
textBox1 и label1. Текстовое окно предназначается для ввода имени пользователя, метка, визуально связанная с окном, позволит указать назначение текстового окна. Я установил свойство Multiline для текстового окна как true, свойство Text у метки - Ваше Имя;textBox2 и label2 - предназначены для вывода приветствия. Поскольку окно textBox2 предназначено для вывода, то я включил его свойство ReadOnly;Click которой и будет организовывать чтение имени пользователя из окна textBox1 и вывод приветствия в окно textBox2.На рис. 2.4 показано, как выглядит наша форма в результате проектирования.
(рис 2.4) Форма "Приветствие"Я не буду далее столь же подробно описывать действия по проектированию интерфейса форм, полагая, что все это интуитивно ясно и большинству хорошо знакомо. Более важно понимать то, что все действия по проектированию интерфейса незамедлительно транслируются в программный код, добавляемый в класс Form1. Мы вручную сажаем элемент управления на форму, тут же в классе появляется закрытое свойство, задающее этот элемент, а в процедуре InitailizeComponent выполняется его инициализация. Мы меняем некоторое свойство элемента управления, это незамедлительно находит отражение в программном коде указанной процедуры.
Вот как выглядит автоматически добавленное в класс описание элементов управления:
private System.Windows.Forms.Label label1; private 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.
В заключение приведу текст обработчика событий командной кнопки. Как задается обработчик того или иного события для элементов управления? Это можно делать по-разному. Есть стандартный способ включения событий. Достаточно выделить нужный элемент в форме, в окне свойств нажать кнопку событий (со значком молнии) и из списка событий выбрать нужное событие и щелкнуть по нему. В данной ситуации все можно сделать проще - двойной щелчок по кнопке включает событие, и автоматически строится заготовка обработчика события с нужным именем и параметрами. Вот как она выглядит:
private void button1_Click(object sender,System.EventArgs e)
{
}
Нам остается добавить свой текст. Я добавил следующие строки:
string temp;
temp = textBox1.Text;
if( temp == "")
textBox2.Text = "Здравствуй, мир!";
else
textBox2.Text = "Здравствуй, " + temp + " !";
И вот как это работает.
(рис 2.5) Форма "Приветствие" в процессе работыНа этом мы закончим первое знакомство с
Язык C# является наиболее известной новинкой в области создания языков программирования. В отличие от 60-х годов XX века - периода бурного языкотворчества - в нынешнее время языки создаются крайне редко. За последние 15 лет большое влияние на теорию и практику программирования оказали лишь два языка: Eiffel, лучший, по моему мнению, объектно-ориентированный язык, и Java, ставший популярным во многом благодаря технологии его использования в Интернете и появления такого понятия как виртуальная Java-машина. Чтобы новый язык получил признание, он должен действительно обладать принципиально новыми качествами. Языку C# повезло с родителями. Явившись на свет в недрах Microsoft, будучи наследником C++, он с первых своих шагов получил мощную поддержку. Однако этого явно недостаточно для настоящего признания достоинств языка. Попробуем разобраться, имеет ли он большое будущее?
Создателем языка является сотрудник Microsoft Андреас Хейлсберг. Он стал известным в мире программистов задолго до того, как пришел в Microsoft. Хейлсберг входил в число ведущих разработчиков одной из самых популярных сред разработки - Delphi. В Microsoft он участвовал в создании версии Java - J++, так что опыта в написании языков и сред программирования ему не занимать. Как отмечал сам Андреас Хейлсберг, C# создавался как язык компонентного программирования, и в этом одно из главных достоинств языка, направленное на возможность повторного использования созданных компонентов. Из других объективных факторов отметим следующие:
Как уже отмечалось, Visual Studio .Net для языков C#, Visual Basic и J# предлагает 12 возможных видов
Давайте разберемся, как создаются
С точки зрения программиста, компилятор создает
Дальнейшие объяснения лучше сочетать с реальной работой над
У себя на компьютере я открыл установленную лицензионную версию Visual Studio .Net 2003, выбрал из предложенного меню - создание нового ConsoleHello, указал, где будет храниться
(рис 2.1) Окно создания нового проектаЕсли принять эти установки, то компилятор создаст
(рис 2.2) Среда разработки и консольное приложение, построенное по умолчаниюИнтегрированная среда разработки IDE (Integrated Development Environment) Visual Studio является многооконной, настраиваемой, обладает большим набором возможностей. Внешний вид ее достаточно традиционен, хотя здесь есть новые возможности; я не буду заниматься ее описанием, полагаясь на опыт читателя и справочную систему. Обращаю внимание лишь на три окна, из тех, что показаны на рис. 2.2. В окне Solution Explorer представлена структура построенного ConsoleHello.Class1. Заметьте, в этом окне можно отображать и другие документы, список которых показан в верхней части окна.
Построенное ConsoleHello. Наш cs. Файл AssemblyInfo содержит информацию, используемую в Class1 является построенным по умолчанию классом, который задает точку входа - процедуру Main, содержащую для данного типа
Заметьте, класс
Помимо понимания структуры
System - основное NameA, поскольку в этом случае не требуется каждый раз задавать полное имя класса с указанием имени Console пространства System. Заметьте, полное имя
может потребоваться, если в нескольких используемых
Все языки допускают "//любой текст" ) воспринимается как /*, а концом - */. Заметьте, тело процедуры Main содержит три однострочных
Здесь же, в Class1 и описанию метода Main предшествует заданный в строчном <summary>. Этот тэг распознается специальным инструментарием, строящим <summary> возможны и другие тэги, включаемые в отчеты. Некоторые
Еще одна новинка C#, встречающаяся в начальном [STAThread], который предшествует описанию процедуры Main. Так же, как и тэги документирования, [STAThread] (Single Thread Apartment) задает однопоточную модель выполнения. Об
Скажем еще несколько слов о точке входа - процедуре Main. Ее заголовок можно безболезненно упростить, удалив аргументы, которые, как правило, не задаются. Они имеют смысл, когда
Таков консольный Debug нашего
Слегка изменим Console, среди многочисленных методов которого есть методы ReadLine и WriteLine с очевидной семантикой. Вот код
using System;
namespace ConsoleHello
{
/// <summary>
/// Первый консольный проект - Приветствие
/// </summary>
class Class1
{
/// <summary>
/// Точка входа. Запрашивает имя и выдает приветствие
/// </summary>
static void Main()
{
Console.WriteLine("Введите Ваше имя");
string name;
name = Console.ReadLine();
if( name == "" )
Console.WriteLine ("Здравствуй, мир!");
else
Console.WriteLine("Здравствуй, " + name + "!");
}
}
}
Я изменил текст в <summary>, удалил Main, добавил в ее using, мне не требуется при вызове методов класса Console каждый раз писать System.Console. Надеюсь, что программный текст понятен без дальнейших пояснений.
В завершение первого hello.xml.
(рис 2.3) Окно Property Pages проекта и задание имени XML-отчетаПосле перестройки
<?xml version="1.0"?> <doc> <assembly> <name>ConsoleHello</name> </assembly> <members> <member name="T:ConsoleHello.Class1"> <summary> Первый консольный проект - Приветствие </summary> </member> <member name="M:ConsoleHello.Class1.Main"> <summary> Точка входа. Запрашивает имя и_выдает приветствие </summary> </member> </members> </doc>
Как видите, отчет описывает наш <summary>. Класс содержит лишь один элемент - точку входа Main с заданной спецификацией в <summary>.
Проделаем аналогичную работу: построим Windows- "Приветствие". Повторяя уже описанные действия, в окне нового Windows Application, дав WindowsHello.
Как и в консольном случае, по умолчанию строится Form1, но это уже далеко не столь простой класс, как ранее. Вначале приведу его код, а потом уже дам необходимые пояснения:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace WindowsHello
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
// Required for Windows Form Designer support
InitializeComponent();
// TODO: Add any constructor code after
// InitializeComponent call
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#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.components = new
System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
}
}
Начну с того, что теперь Form из глубоко вложенного System.Windows.Forms. Построенный по умолчанию класс Form1 является наследником класса Form и автоматически наследует его функциональность - свойства, методы, события. При создании объекта этого класса, характеризующего форму, одновременно Visual Studio создает визуальный образ объекта - окно, которое можно заселять элементами управления. В режиме проектирования эти операции можно выполнять вручную, при этом автоматически происходит изменение программного кода класса. Появление в
В класс Form1 встроено закрытое ( private ) свойство - объект components класса Container. В классе есть конструктор, вызывающий закрытый метод класса InitializeComponent. В классе есть деструктор, освобождающий занятые ресурсы, которые могут появляться при добавлении элементов в контейнер components. Наконец, в классе есть точка входа - процедура Main с непустым телом.
Основной операцией, инициирующей вычисления в объектно-ориентированных приложениях, является вызов метода F некоторого класса x, имеющий вид:
x.F(arg1, arg2, ..., argN);
В этом вызове x называется целью вызова, и здесь возможны три ситуации:
x - имя класса. В этом случае метод F должен быть статическим методом класса, объявленным с static, как это имеет место, например, для точки вызова - процедуры Main ;x - имя объекта или объектное выражение. В этом случае F должен быть обычным, не статическим методом. Иногда такой метод называют x - не указывается при вызове. Такой вызов называется неквалифицированным, в отличие от двух первых случаев. Заметьте, неквалифицированный вызов вовсе не означает, что цель вызова отсутствует, - она просто задана по умолчанию. Целью является текущий объект (текущий класс для статических методов). Текущий объект имеет зарезервированное имя this. Применяя это имя, любой неквалифицированный вызов можно превратить в квалифицированный вызов. Иногда без этого имени просто не обойтись.Но как появляются объекты? Как они становятся текущими? Как реализуется самый первый вызов метода, другими словами, кто и где вызывает точку входа - метод Main? С чего все начинается?
Когда CLR получает Main. Некоторый объект исполнительной среды CLR и вызывает этот метод, так что первоначальный вызов метода осуществляется извне приложения. Это и есть точка "большого взрыва" - начало зарождения мира объектов и объектных вычислений. Дальнейший сценарий зависит от содержимого точки входа. Как правило, в ней создаются один или несколько объектов, а затем вызываются методы и/или обработчики событий, происходящих с созданными объектами. В этих методах и обработчиках событий могут создаваться новые объекты, вызываться новые методы и новые обработчики. Так, начиная с одной точки, разворачивается целый мир объектов приложения.
Давайте посмотрим, что происходит в Main начала работать. Процедура Main содержит всего одну строчку:
Application.Run(new Form1());
Прокомментируем этот квалифицированный вызов. Целью здесь является класс Application из System.Windows.Forms. Класс вызывает статический метод Run, которому в качестве фактического аргумента передается объектное выражение new Form1(). При вычислении этого выражения создается первый объект - экземпляр класса Form1. Этот объект становится текущим. Для создания объекта вызывается конструктор класса. В процессе работы конструктора осуществляется неквалифицированный вызов метода InitializeComponent(). Целью этого вызова является текущий объект - уже созданный объект класса Form1. Ни в конструкторе, ни в вызванном методе новые объекты не создаются. По завершении работы конструктора объект класса Form1 передается методу Run в качестве аргумента.
Метод Run класса Application - это знаменитый метод. Во-первых, он открывает форму - видимый образ объекта класса Form1, с которой теперь может работать пользователь. Но главная его работа состоит в том, что он создает настоящее Windows-приложение, запуская цикл обработки сообщений о происходящих событиях. Поступающие сообщения обрабатываются операционной системой согласно очереди и приоритетам, вызывая обработчики соответствующих событий. Поскольку наша форма по умолчанию не заселена никакими элементами управления, то поступающих сообщений немного. Все, что может делать пользователь с формой, так это перетаскивать ее по экрану, сворачивать и изменять размеры. Конечно, он может еще закрыть форму. Это приведет к завершению цикла обработки сообщений, к завершению работы метода Run, к завершению работы метода Main, к завершению работы приложения.
Давайте расширим приложение по умолчанию до традиционного приветствия в Windows-стиле, добавив окошки для ввода и вывода информации. Как уже говорилось, при создании Windows-приложения по умолчанию создается не только объект класса Form1 - потомка класса Form, но и его видимый образ - форма, с которой можно работать в режиме проектирования, населяя ее элементами управления. Добавим в форму следующие элементы управления:
textBox1 и label1. Текстовое окно предназначается для ввода имени пользователя, метка, визуально связанная с окном, позволит указать назначение текстового окна. Я установил свойство Multiline для текстового окна как true, свойство Text у метки - Ваше Имя;textBox2 и label2 - предназначены для вывода приветствия. Поскольку окно textBox2 предназначено для вывода, то я включил его свойство ReadOnly;Click которой и будет организовывать чтение имени пользователя из окна textBox1 и вывод приветствия в окно textBox2.На рис. 2.4 показано, как выглядит наша форма в результате проектирования.
(рис 2.4) Форма "Приветствие"Я не буду далее столь же подробно описывать действия по проектированию интерфейса форм, полагая, что все это интуитивно ясно и большинству хорошо знакомо. Более важно понимать то, что все действия по проектированию интерфейса незамедлительно транслируются в программный код, добавляемый в класс Form1. Мы вручную сажаем элемент управления на форму, тут же в классе появляется закрытое свойство, задающее этот элемент, а в процедуре InitailizeComponent выполняется его инициализация. Мы меняем некоторое свойство элемента управления, это незамедлительно находит отражение в программном коде указанной процедуры.
Вот как выглядит автоматически добавленное в класс описание элементов управления:
private System.Windows.Forms.Label label1; private 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.
В заключение приведу текст обработчика событий командной кнопки. Как задается обработчик того или иного события для элементов управления? Это можно делать по-разному. Есть стандартный способ включения событий. Достаточно выделить нужный элемент в форме, в окне свойств нажать кнопку событий (со значком молнии) и из списка событий выбрать нужное событие и щелкнуть по нему. В данной ситуации все можно сделать проще - двойной щелчок по кнопке включает событие, и автоматически строится заготовка обработчика события с нужным именем и параметрами. Вот как она выглядит:
private void button1_Click(object sender,System.EventArgs e)
{
}
Нам остается добавить свой текст. Я добавил следующие строки:
string temp;
temp = textBox1.Text;
if( temp == "")
textBox2.Text = "Здравствуй, мир!";
else
textBox2.Text = "Здравствуй, " + temp + " !";
И вот как это работает.
(рис 2.5) Форма "Приветствие" в процессе работыНа этом мы закончим первое знакомство с
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.