КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Endregion
Else Console.WriteLine("Здравствуй, " + name + "!"); } } } Я изменил текст в тэгах <summary>, удалил атрибут и аргументы процедуры Main, добавил в ее тело операторы ввода-вывода. Благодаря предложению using мне не требуется при вызове методов класса Console каждый раз писать System. Console. Надеюсь, что программный текст понятен без дальнейших пояснений. В завершение первого проекта построим его XML-отчет. Для этого в свойствах проекта необходимо указать имя файла, в котором будет храниться отчет. Установка этого свойства проекта, также как и других свойств, делается в окне Property Pages, открыть которое можно по-разному. Я обычно делаю это так: в окне Solution Explorer выделяю строку с именем проекта, а затем в окне Properties нажимаю имеющуюся там кнопку Property Pages. Затем в открывшемся окне свойств, показанном на рис. 2.3, устанавливается нужное свойство. В данном случае я задал имя файла отчета –– 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-проект, рассмотрим, как выглядит он по умолчанию, а затем дополним его до проекта " Приветствие ". Повторяя уже описанные действия, в окне нового проекта (см. рис. 2.1) я выбрал тип проекта 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"; } /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } } } Начну с того, что теперь пространству имен предшествует 6 предложений using, что говорит о том, что используются не менее 6 классов, находящихся в разных пространствах имен библиотеки FCL. Одним из таких используемых классов является класс Form из глубоко вложенного пространства имен System.Windows.Forms. Построенный по умолчанию класс Form1 является наследником класса Form и автоматически наследует его функциональность – свойства, методы, события. При создании объекта этого класса, характеризующего форму, одновременно Visual Studio создает визуальный образ объекта – окно, которое можно заселять элементами управления. В режиме проектирования эти операции можно выполнять руками, при этом автоматически происходит изменение программного кода класса. Появление в проекте формы, автоматически открываемой при запуске проекта, означает переход к визуальному, управляемому событиями программированию. Сегодня такой стиль является общепризнанным, а стиль консольного приложения следует считать анахронизмом, правда весьма полезным при изучении свойств языка.
В класс Form1 встроено закрытое свойство – объект 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, к завершению работы приложения. Проект WindowsHello Давайте расширим приложение по умолчанию до традиционного приветствия в Windows-стиле, добавив окошки для ввода и вывода информации. Как уже говорилось, при создании Windows-приложения по умолчанию создается не только объект класса Form1 – потомка класса Form, но и его видимый образ – форма, с которой можно работать в режиме проектирования, населяя ее элементами управления. Добавим в форму следующие элементы управления: Текстовое окно и метку. По умолчанию они получат имена textBox1 и label1. Текстовое окно предназначается для ввода имени пользователя, метка, визуально связанная с окном, позволит указать назначение текстового окна. Я установил свойство Multiline для текстового окна как true, свойство Text у метки – Ваше Имя. Аналогичная пара элементов управления – textBox2 и label2 – предназначены для вывода приветствия. Поскольку окно textBox2 предназначено для вывода, то я включил его свойство ReadOnly. Я посадил на форму командную кнопку, обработчик события Click которой и будет организовывать чтение имени пользователя из окна textBox1 и вывод приветствия в окно textBox2. Взгляните, как выглядит наша форма в результате проектирования: Рис. 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); }
Дата добавления: 2014-12-25; Просмотров: 424; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |