Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Когда следует использовать наследование

Наследование возможностей работы с окнами

Предположим, вам нужно написать программу, выполняемую в обычном окне, и понадобятся возможности изменения размера окна, его разворачивания, сворачивания, перетаскивания и некоторые другие. Имеет смысл, чтобы ваш класс "наследовал" возможности класса, который уже работает с подобным типом интерфейса. Обычным выбором родительского класса становится класс System.Windows.Forms.Form.

В таком случае пишем:

class MyFancyClass: Form

{

...

}

Фактически мы говорим: "Я создаю собственный класс, но он должен автоматически наследовать все возможности класса Form ".

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

Строительный блок: Наследование
Класс может наследовать свойства и действия другого класса. public class Musician { public string name; public int age; public bool canSing; }
Класс "Guitarist" наследует все поля из класса "Musician", а кроме того, имеет два собственных поля. Имя класса Musician, написанное после двоеточия, сообщает компьютеру, что новый класс "Guitarist" наследует поля и методы родительского класса "Musician". public class Guitarist: Musician { public string guitarType; public string guitarBrand; }
Создав объект класса Guitarist, можно установить его свойства, если они являются открытыми для доступа. Guitarist g = new Guitarist(); g.name = "Jimbo van Helsdingen"; g.age = 28; g.canSing = false; g.guitarType = "Acoustic"; g.guitarBrand = "Gibson";

 

© INTUIT.ru, 2003-2013. Все права защищены.

Интернет-Университет Информационных Технологий

http://www.INTUIT.ru

C# для школьников
5. Лекция: Программирование в.NET Framework: версия для печати и PDA В лекции подробно рассматривается среда программирования.Net Framework. Приведены примеры программ с использованием формы и компонентов.
Что такое.NET Framework? Программировать на языке C# без.NET Framework — это все равно что писать ручкой без чернил. Сколько ни води ею по бумаге, написать ничего не удастся. Так что же такое.NET Framework? Это платформа программирования, разработанная корпорацией Microsoft, и язык C# создавался специально для нее. Платформа.NET Framework состоит из двух частей.
  1. Во-первых, она содержит огромную библиотеку классов, которые можно вызывать из программ, созданных на C#. Такая возможность избавляет от необходимости писать все заново.
  2. Во-вторых, в ее состав входит среда выполнения, управляющая запуском и работой готовых программ (это происходит абсолютно незаметно для вас и не вызывает никаких затруднений).
Итак, при написании программы на языке C# (или на любом другом языке.NET) наряду с созданием собственного кода используются классы, хранящиеся в библиотеке.   Библиотека.NET framework содержит огромное количество классов, и некоторые из них настолько сложны, что мы даже не будем пытаться рассмотреть все сразу. Расскажем лишь о тех, которые, на наш взгляд, наиболее полезны для начинающих программистов. Со временем вы станете запоминать классы, которыми пользуетесь чаще, чем другими, и постепенно хорошо их освоите. Ведь когда часто берешь в библиотеке любимую книгу, то легко запоминаешь, на какой полке ее искать. Обращаю ваше внимание: в этой части курса приведено много примеров программ, которые вы должны сначала испытать в работе, а затем попытаться изменить их, чтобы добиться новых результатов. Ранее мы уже рассказывали, как запускать примеры, представленные на сайте http://intuit.ru/software/school/cs2kids/examples.zip. Как изменять примеры программ и расширять их возможности Я слышу ваше возмущение: "Легко сказать: измени программу! Но откуда мне знать, в каком направлении двигаться? В приведенных примерах используются лишь некоторые методы и классы.NET Framework, но ведь их очень много! Как о них узнать?" Для этого есть несколько способов:
  • Просмотреть библиотеку классов.NET Framework SDK (Software Development Kit – набор средств разработки), которая включена в справочную систему Visual C# Express.
  • Воспользоваться интеллектуальной подсказкой Visual C# Express. Как только вы введете в ее окошко имя пространства имен или класса и поставите точку, автоматически раскроется список всех доступных классов, методов, полей. Достаточно выбрать нужный элемент списка. Например, после ввода "Console." вы увидите список методов и других элементов класса Console.
увеличить изображение Подсказка работает и для методов. Если поставите открывающую скобку после имени метода, то увидите типы параметров, которые он может принимать. Зачастую в C# используются одноименные методы с различными наборами параметров — в таком случае список надо "прокручивать" (перемещаться по нему) вверх и вниз при помощи клавиш с изображенными на них стрелками. В следующем примере показано, что произойдет, если набрать Console.WriteLine(. Visual C# Express подскажет о существовании 19 различных способов вызова метода WriteLine. Мы прокрутили список вниз до 11-й позиции (см. рисунок ниже). увеличить изображение   Консольные приложения Понятие "консоль" пришло к нам из тех времен, когда были популярны большие компьютеры, их называли мейнфреймами. Компания размещала в каком-нибудь помещении один гигантский компьютер, а на рабочих местах служащих устанавливалась только клавиатура и простенький монитор, называвшийся консолью. Клавиатура и монитор подключались к тому самому "монстру", спрятанному от посторонних глаз в отдельной комнате. Такие мониторы не умели отображать графику — только текст. Информация передавалась в мейнфрейм при помощи клавиатуры – основного устройства ввода, а консоль – основное устройство вывода – позволяла компьютеру представлять информацию пользователю.   Сегодня мониторы большинства компьютеров имеют гораздо более совершенные возможности и способны отображать не только текст, но и, например, фотографии. Однако при выполнении многих задач никаких графических изысков не требуется. Например, программа, получающая какие-либо данные с сервера в Интернете и сохраняющая их в файле на вашем компьютере, должна уметь выводить только два сообщения: "идет получение данных" и "готово". Зачем тратить время на разработку затейливого пользовательского интерфейса, который занимает много памяти? Именно по этой причине в библиотеку.NET включен класс для быстрого написания консольных приложений. Не стоит относиться снисходительно к консольным приложениям и считать их слишком примитивными. Опытные программисты предпочитают не тратить усилия на интерфейсные ухищрения и работают в основном с консольными приложениями. Конечно, если вашей программой будет пользоваться кто-то еще, то вы, вероятно, окажете ему большую услугу, сделав интерфейс чуть более дружественным, чем в стандартном консольном приложении. Некоторые полезные методы:
  1. Console.ReadLine — считывает строку символов, введенную с клавиатуры (или иного устройства ввода).
  2. Console.WriteLine — выводит текст на экран (или иное устройство вывода) начиная с новой строки.
  3. Console.Write — выводит на экран ряд символов без перехода на новую строку.
Пример программы 3.1 Следующая программа выводит на экран слово "Ура!" и после этого ожидает нажатия клавиши ВВОД. using System; class PleaseSayUra { static void Main() { // Выводим слово на экран Console.Write("Ура!"); // Ожидаем нажатия клавиши ВВОД Console.ReadLine(); } } Листинг 3.1.   Пример программы 3.2 Следующая программа:
  • просит пользователя ввести слово при помощи клавиатуры;
  • спрашивает, сколько раз это слово должно быть выведено на экран;
  • выводит слово на экран указанное количество раз, причем в каждом случае с новой строки.
using System; class WriteAFewLines { static void Main() { Console.WriteLine("Введите Ваше любимое слово: "); // Сохраняем в строковой переменной введенное пользователем слово string favouriteWord = Console.ReadLine(); Console.WriteLine("Сколько раз его напечатать? "); // Сохраняем в целочисленной переменной введенное число // (При неправильном вводе числа произойдет ошибка) int numberOfTimes = Convert.ToInt32(Console.ReadLine());   // Выводим на экран слово указанное количество раз for (int i = 0; i < numberOfTimes; i++) { Console.WriteLine(favouriteWord); }   // Ожидаем нажатия клавиши ВВОД Console.ReadLine(); } } Листинг 3.2.   Приложения Windows Forms Если вы захотите писать программы, похожие на привычные приложения Windows, то наверняка воспользуетесь классами из пространства имен System.Windows.Forms. Они позволяют задействовать кнопки, списки, текстовые поля, меню, окна сообщений и множество других "элементов управления". Элементы управления — это то, что вы помещаете в форму. Они нужны для вывода информации, например, текстовой (элемент управления Label) или графической (элемент управления PictureBox), либо для выполнения определенных действий, например, выбора значения или перехода к другой форме после нажатия кнопки. Все элементы управления помещаются на форму. Понятие "форма", принятое в программировании, родственно понятию "форма анкеты" или "форма документа" из обычной жизни. На форме можно в определенном порядке расположить различные элементы (текст, картинки, поля для заполнения и т. д.). Когда нам дают готовую форму документа и просят ее заполнить, мы обычно читаем содержащуюся в ней типовую информацию, а затем вписываем недостающие данные в определенные строки.   В программировании понятие формы во многом похоже: форма позволяет размещать текст, изображения, поля ввода, кнопки и т. п., добиваясь их точного расположения на экране. В консольном приложении на экран выводятся только строки текста. Компания Майкрософт предоставила в составе библиотеки классов.NET Framework огромное количество "элементов управления", которые можно помещать на формы. Освоив этот инструмент, вы сможете быстро создавать эффектные приложения. Некоторые полезные классы из пространства имен System.Windows.Forms Вот некоторые элементы управления, которые можно размещать на формах:
  • Label (Надпись).
  • Button (Кнопка).
  • ListBox (Список).
  • CheckBox (Флажок).
  • RadioButton (Переключатель).
  • MessageBox (Окно сообщений).
  • Menu (Меню).
  • TabControl (Управление вкладками).
  • Toolbar (Панель инструментов).
  • TreeView (Дерево).
  • DataGrid (Сетка данных).
  • PictureBox (Изображение).
  • RichTextBox (Текстовое поле с поддержкой формата RTF).
Работа с примерами программ Windows Forms в Visual C# Express Возможно, вы предпочтете не использовать уже заготовленные примеры проектов, а разрабатывать их "с нуля". В таком случае нужно учесть, что для каждого проекта C# Express сразу же создает два файла (с именами Form1.cs и Program.cs) и наполняет их исходным кодом на языке C#, то есть вы изначально получаете простейшую, но полноценную программу. Предлагаемый нами способ работы с уже полученным проектом состоит в выполнении следующих действий:
  • Удалите файл Form1.cs.
  • Замените код в файле Program.cs на код примера, с которым вы работаете.
Оба этих действия не понадобятся, если вы открываете программы с помощью команды "Открыть проект" в меню "Файл" и находите нужный проект в той папке, куда его поместили после разархивации. Пример программы 3.3 Рассмотрим пример простейшего приложения Windows Forms. Оно всего лишь создает новую форму и выводит определенный текст в заголовок окна формы. using System.Windows.Forms; class SimpleWindowsForm: Form { // Метод-конструктор нашего класса public SimpleWindowsForm() { // Указываем заголовок окна this.Text = "Это простая форма с заголовком"; } static void Main() { // Создаем новый экземпляр класса //и запускаем его на выполнение // В результате на экране дисплея откроется форма Application.Run(new SimpleWindowsForm()); } } Листинг 3.3.   Пример программы 3.4 Следующий пример тоже достаточно прост, но мы делаем шаг вперед — размещаем на форме кнопку. using System.Windows.Forms; class SimpleWindowsFormWithButton: Form { Button button1;   // Метод-конструктор нашего класса public SimpleWindowsFormWithButton() { // Указываем заголовок окна this.Text = "Форма с командной кнопкой";   // Добавляем кнопку в коллекцию элементов управления формы // Хотя на кнопке написано: "Нажми меня!", // пока при нажатии ничего не происходит! button1 = new Button(); button1.Text = "Нажми меня!"; button1.Top = 100; button1.Left = 100; button1.Height = 50; button1.Width = 70; this.Controls.Add(button1); }   static void Main() { // Создаем и запускаем форму Application.Run(new SimpleWindowsFormWithButton()); } } Листинг 3.4.   Пример программы 3.5 Кнопку на форму мы поместили, но при нажатии на нее ничего не происходит. Это скучно. Нам нужно описать метод, который будет выполнять какое-либо действие при нажатии на кнопку. Пусть при этом текст в заголовке окна будет меняться. Поскольку такой метод отслеживает наступление некоторого события (в нашем случае – нажатие на кнопку) и затем каким-то образом обрабатывает его, он, напомним, называется "обработчик события". Кроме того, надо привязать обработчик события к соответствующему событию, то есть к нажатию на кнопку. using System; using System.Windows.Forms; using System.Drawing;   class FormWithWorkingButton: Form { Button mrButton; // Метод-конструктор нашего класса public FormWithWorkingButton() { // Указываем заголовок окна this.Text = "Форма с работающей кнопкой!"; // Добавляем кнопку и привязываем ее к обработчику события mrButton = new Button(); mrButton.Text = "Нажми меня"; mrButton.Top = 100; mrButton.Left = 100; mrButton.Height = 50; mrButton.Width = 70; mrButton.Click += new System.EventHandler(mrButton_Click); this.Controls.Add(mrButton); }   static void Main() { // Создаем и запускаем форму Application.Run(new FormWithWorkingButton()); }   // Обработчик события, срабатывающий при нажатии кнопки void mrButton_Click(object sender, EventArgs e) { // Изменяем текст mrButton.Text = "Кнопка была нажата!"; } } Листинг 3.5.   Пример программы 3.6 Мы добились успеха: наша программа умеет выполнять основные действия. Теперь добавим на форму несколько новых элементов управления, аккуратно разместим их и немного поработаем с ними. Возьмем элементы управления 4-х типов: Button, ListBox, MessageBox и PictureBox. Обратите внимание: кроме System.Windows.Forms в этом примере упоминается пространство имен System.Drawing. Дело в том, что мы используем элемент управленияPictureBox, а для работы с изображениями требуются классы Drawing. using System.Windows.Forms; using System.Drawing;   class MyForm: Form { // Объявим элемент ListBox как поле класса: // нам придется обращаться к нему из разных методов ListBox listBox1;   // Метод-конструктор нашего класса public MyForm() { //Размеры формы this.Size = new Size(400, 400); // Создадим элемент PictureBox, поместим в него изображение, // добавим его на форму PictureBox pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; Bitmap image1 = new Bitmap ("..//..//images//Zakat.jpg"); pictureBox1.ClientSize = new Size(this.Width, 150); pictureBox1.Image = (Image)image1; this.Controls.Add(pictureBox1); // Создаем объект Button, определяем некоторые из его свойств Button button1 = new System.Windows.Forms.Button(); button1.Location = new Point(150, 160); button1.Size = new Size(100, 30); button1.Text = "Нажми меня"; button1.Click += new System.EventHandler(button1_Click); this.Controls.Add(button1);   // Создаем ListBox, определяем свойства и добавляем на форму listBox1 = new System.Windows.Forms.ListBox(); listBox1.Location = new System.Drawing.Point(20, 200); listBox1.Size = new Size(100, 100); listBox1.Items.Add("Лес"); listBox1.Items.Add("Степь "); listBox1.Items.Add("Озеро"); listBox1.Items.Add("Море"); listBox1.Items.Add("Океан"); listBox1.SelectedIndex = 2; this.Controls.Add(listBox1); }   // Обработчик события, срабатывающий при нажатии кнопки void button1_Click(object sender, System.EventArgs e) { // Выводим сообщение с указанием выбранного в списке пункта MessageBox.Show(this, "Вы выбрали " + listBox1.SelectedItem, "Уведомление", MessageBoxButtons.OK); }   static void Main() { // Создаем и запускаем форму Application.Run(new MyForm()); }   private void InitializeComponent() { this.SuspendLayout(); // // MyForm // this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(292, 273); this.Name = "MyForm"; this.ResumeLayout(false); } } Листинг 3.6.   Пример программы 3.7 Итак, настала пора испытать свои силы. Попробуем написать одну действительно большую программу, используя целый ряд полезных элементов управления. Объем кода может показаться пугающе большим, но программа вам пригодится, когда нужно будет вспомнить, для чего нужен тот или иной элемент управления. Программа весьма интересна и стоит того, чтобы вы тщательно с ней поработали. После ее запуска открывается форма, в которой меню построено при помощи элемента управления TreeView. Пункты меню представлены в виде листьев на ветке дерева. Выбор того или иного листочка приводит к тому, что обработчик события заселяет форму новыми элементами управления. Поскольку эти элементы задаются определенным пунктом меню, их тип зависит от того, какой именно пункт выбран. С добавляемыми элементами тоже можно работать. Благодаря этому проекту появляется возможность познакомиться с самыми разными элементами управления, а главное — понять, как они создаются и как их использовать в собственных проектах. Досконально разбирать текст всей программы необязательно, но когда у вас возникнут вопросы по использованию, например, элемента CheckBox, вы можете просмотреть ту ее часть, которая касается этого элемента. Напоминаем: для того чтобы использовать элементы управления PictureBox и DataGridView, требуются пространства имен System.Drawing, System.Data и System.Xml. using System; using System.Windows.Forms; using System.Drawing; using System.Data; using System.Xml;   class FormWithManyControls: Form { TreeView treeView1; Panel panel1; CheckBox checkBox1, checkBox2; RadioButton radioButton1, radioButton2; ListBox listBox1;   // Метод-конструктор нашего класса public FormWithManyControls() { // Указываем размеры и заголовок окна   this.Text = "Форма, включающая различные элементы управления!"; this.Height = 800; this.Width = 900; // Добавляем элемент TreeView в качестве своеобразного меню   treeView1 = new TreeView(); treeView1.BackColor = Color.BurlyWood; treeView1.Dock = DockStyle.Left; treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(treeView1_AfterSelect);   TreeNode tn = new TreeNode("Элементы"); tn.Expand();   tn.Nodes.Add(new TreeNode("[Очистить]")); tn.Nodes.Add(new TreeNode("Label")); tn.Nodes.Add(new TreeNode("Button")); tn.Nodes.Add(new TreeNode("CheckBox")); tn.Nodes.Add(new TreeNode("RadioButton")); tn.Nodes.Add(new TreeNode("ListBox")); tn.Nodes.Add(new TreeNode("TextBox")); tn.Nodes.Add(new TreeNode("TabControl")); tn.Nodes.Add(new TreeNode("DataGridView")); tn.Nodes.Add(new TreeNode("MainMenu")); tn.Nodes.Add(new TreeNode("ToolBar")); tn.Nodes.Add(new TreeNode("PictureBox")); tn.Nodes.Add(new TreeNode("RichTextBox"));   treeView1.Nodes.Add(tn);   this.Controls.Add(treeView1);   // Добавляем панель для размещения остальных элементов управления   panel1 = new Panel(); panel1.Dock = DockStyle.Right; panel1.BorderStyle = BorderStyle.Fixed3D; panel1.Width = this.Width - treeView1.Width;   this.Controls.Add(panel1); }   // Обработчик событий, срабатывающий при выборе одного из узлов дерева // TreeView private void treeView1_AfterSelect (object sender, System.Windows.Forms.TreeViewEventArgs e) { // Выполнение соответствующего действия при выборе любого из узлов   if (e.Node.Text == "[Очистить]") { // Удаляем с панели все элементы управления panel1.Controls.Clear(); } else if (e.Node.Text == "Button") { // Добавляем на панель кнопку   Button button1 = new Button(); button1.Text = "Нажми меня!"; button1.Location = new Point(300, 20); button1.Width = 120; button1.Height = 40; button1.Click += new EventHandler(button1_Click);   panel1.Controls.Add(button1); } else if (e.Node.Text == "Label") { // Добавляем на панель метку   Label label1 = new Label(); label1.Text = "Это надпись. Используется для вывода текста на экран!";   label1.Location = new Point(180, 70); label1.Width = 400; label1.Click += new EventHandler(label1_Click); panel1.Controls.Add(label1); } else if (e.Node.Text == "CheckBox") { // Добавляем на панель несколько флажков   checkBox1 = new CheckBox(); checkBox1.Text = "Я способный!"; checkBox1.Location = new Point(20, 40); checkBox1.Width = 150; checkBox1.CheckedChanged += new EventHandler(CheckBox_CheckedChanged); panel1.Controls.Add(checkBox1);   checkBox2 = new CheckBox(); checkBox2.Text = "Я скромный!"; checkBox2.Location = new Point(20, 80); checkBox2.Width = 150; checkBox2.CheckedChanged += new EventHandler(CheckBox_CheckedChanged); panel1.Controls.Add(checkBox2); } else if (e.Node.Text == "RadioButton") { // Добавляем на панель несколько переключателей   radioButton1 = new RadioButton(); radioButton1.Text = "Я добрый!"; radioButton1.Location = new Point(20, 120); radioButton1.Width = 150; radioButton1.Height = 30; //radioButton1.Size = new Size(20, 100);   radioButton1.CheckedChanged += new EventHandler(RadioButton_CheckedChanged);   panel1.Controls.Add(radioButton1);   radioButton2 = new RadioButton(); radioButton2.Text = "Я трудолюбивый!"; radioButton2.Location = new Point(20, 160); radioButton2.Width = 150; radioButton2.Height = 30; //radioButton2.Size = new Size(20, 100);   radioButton2.CheckedChanged += new EventHandler(RadioButton_CheckedChanged);   panel1.Controls.Add(radioButton2); } else if (e.Node.Text == "ListBox") { // Добавляем на панель список   listBox1 = new ListBox(); listBox1.Items.Add("Зеленый"); listBox1.Items.Add("Желтый"); listBox1.Items.Add("Голубой"); listBox1.Items.Add("Серый");   listBox1.Location = new Point(20, 250); listBox1.Width = 100; listBox1.Height = 100; listBox1.SelectedIndexChanged += new EventHandler(listBox1_SelectedIndexChanged);   panel1.Controls.Add(listBox1); } else if (e.Node.Text == "TextBox") { // Добавляем на панель текстовое поле   TextBox textBox1 = new TextBox(); textBox1.Multiline = true; textBox1.Text = "Это текстовое окно. Сюда можно вводить текст!" + "\r\n" + " Сотрите этот текст и введите свой!"; textBox1.Location = new Point(180, 100); textBox1.Width = 400; textBox1.Height = 40;   panel1.Controls.Add(textBox1); } else if (e.Node.Text == "DataGridView") { // Добавляем на панель таблицу, заполненную данными из файла xml   DataSet dataSet1 = new DataSet("Пример DataSet"); dataSet1.ReadXml("..//..//images//marks.xml");   DataGridView dataGridView1 = new DataGridView(); dataGridView1.Width = 250; dataGridView1.Height = 150; dataGridView1.Location = new Point(20, 500); dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = dataSet1; dataGridView1.DataMember = "предметы"; //dataGridView1.DataMember = "оценка";   //dataGridView1.ColumnCount = 2; panel1.Controls.Add(dataGridView1); } else if (e.Node.Text == "TabControl") { // Добавляем на панель элемент управления вкладками // и наполняем каждую вкладку содержимым   TabControl tabControl1 = new TabControl(); tabControl1.Location = new Point(190, 150); tabControl1.Size = new Size(300, 300);   TabPage tabPage1 = new TabPage("Вадик"); PictureBox pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.Image = new Bitmap("..//..//images//Vadik.jpg");   pictureBox1.Size = new Size(300, 200); tabPage1.Controls.Add(pictureBox1); Label labelV = new Label(); labelV.Top = 200; labelV.Size = new Size(300, 50); labelV.Text = "Это Вадик! Он любит купаться и работать на компьютере!"; tabPage1.Controls.Add(labelV); tabControl1.TabPages.Add(tabPage1);   TabPage tabPage2 = new TabPage("Его компьютер"); PictureBox pictureBox2 = new PictureBox(); pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox2.Image = new Bitmap("..//..//images//comp.jpg"); pictureBox2.Size = new Size(300, 200); tabPage2.Controls.Add(pictureBox2); Label labelС = new Label(); labelС.Top = 200; labelС.Size = new Size(300, 50); labelС.Text = "Это компьютер Вадика! Пока Вадик купается, " + "он разрешает работать на компьютере ящерице!"; tabPage2.Controls.Add(labelС); tabControl1.TabPages.Add(tabPage2);   TabPage tabPage3 = new TabPage("Компьютерия"); PictureBox pictureBox3 = new PictureBox(); pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox3.Image = new Bitmap("..//..//images//terra.jpg"); pictureBox3.Size = new Size(300, 200); tabPage3.Controls.Add(pictureBox3); Label labelT = new Label(); labelT.Top = 200; labelT.Size = new Size(300, 50); labelT.Text = "Это страна Компьютерия!" + " Она расположена на берегу реки Тверца в Тверской области!"; tabPage3.Controls.Add(labelT); tabControl1.TabPages.Add(tabPage3);   panel1.Controls.Add(tabControl1); } else if (e.Node.Text == "PictureBox") { // Добавляем на панель изображение   PictureBox pictureBox1 = new PictureBox(); pictureBox1.Image = new Bitmap("..//..//images//Zakat.jpg"); pictureBox1.BorderStyle = BorderStyle.Fixed3D; pictureBox1.Location = new Point(500, 250); pictureBox1.Size = new Size(250, 200);   panel1.Controls.Add(pictureBox1); } else if (e.Node.Text == "RichTextBox") { // Добавляем поле для ввода текста с форматированием // Загружаем в него данные из файла XML   RichTextBox richTextBox1 = new RichTextBox(); richTextBox1.LoadFile("..//..//images//marks.xml", RichTextBoxStreamType.UnicodePlainText); richTextBox1.WordWrap = false; richTextBox1.BorderStyle = BorderStyle.Fixed3D; richTextBox1.BackColor = Color.Beige; richTextBox1.Size = new Size(250, 150); richTextBox1.Location = new Point(300, 500); // panel1.Height - richTextBox1.Height - 5);   panel1.Controls.Add(richTextBox1); } else if (e.Node.Text == "MainMenu") { // Добавляем классическое "меню" (появляется в верхней части окна) MainMenu mainMenu1 = new MainMenu();   MenuItem menuItem1 = new MenuItem("File"); menuItem1.MenuItems.Add("Exit", new EventHandler(mainMenu1_Exit_Select)); mainMenu1.MenuItems.Add(menuItem1);   MenuItem menuItem2 = new MenuItem("Background"); menuItem2.MenuItems.Add("Choose", new EventHandler(mainMenu1_ColorOwn_Select)); menuItem2.MenuItems.Add("White", new EventHandler(mainMenu1_ColorWhite_Select)); mainMenu1.MenuItems.Add(menuItem2);   this.Menu = mainMenu1;   MessageBox.Show("Главное меню добавлено в окно " + "Испытайте его после нажатия OK."); } else if (e.Node.Text == "ToolBar") { // Добавляем на панель элемент "панель управления" с кнопками // быстрого вызова ToolBar toolBar1 = new ToolBar(); toolBar1.Size = new Size(100, 100); toolBar1.Dock = DockStyle.Right; ImageList imageList1 = new ImageList(); imageList1.Images.Add(new Bitmap("../../images/new.gif")); imageList1.Images.Add(new Bitmap("../../images/open.gif")); imageList1.Images.Add(new Bitmap("../../images/copy.gif")); toolBar1.ImageList = imageList1;   ToolBarButton toolBarbutton1 = new ToolBarButton("New"); toolBarbutton1.ImageIndex = 0; toolBar1.Buttons.Add(toolBarbutton1);   ToolBarButton toolBarbutton2 = new ToolBarButton("Open"); toolBarbutton2.ImageIndex = 1; toolBar1.Buttons.Add(toolBarbutton2);   ToolBarButton toolBarButton3 = new ToolBarButton("Copy"); toolBarButton3.ImageIndex = 2; toolBar1.Buttons.Add(toolBarButton3); toolBar1.ButtonClick += new ToolBarButtonClickEventHandler(toolBar1_Click);   panel1.Controls.Add(toolBar1); } } /* Обработчики событий для добавленных выше элементов управления */   // Обработчик события, срабатывающий при щелчке мышью на метке void label1_Click(object sender, System.EventArgs e) { MessageBox.Show ("Да, у меток тоже есть событие Click. Но для них включение событий - редкость."); }   // Обработчик события, срабатывающий при нажатии кнопки void button1_Click(object sender, System.EventArgs e) { MessageBox.Show("Пора, наконец-то вы нажали меня!"); } // Обработчик события, срабатывающий при установке или снятии флажка void CheckBox_CheckedChanged(object sender, System.EventArgs e) { if (checkBox1.Checked && checkBox2.Checked) { MessageBox.Show("У Вас все получится!"); } else if (checkBox1.Checked) { MessageBox.Show("Не здорово быть умным и не скромным!"); } else if (checkBox2.Checked) { MessageBox.Show("Скромность украшает. Хорошо бы еще быть умным!"); } else { MessageBox.Show("Ни скромности, ни таланта?"); } }   // Обработчик события, срабатывающий при нажатии переключателя void RadioButton_CheckedChanged(object sender, System.EventArgs e) { if (radioButton1.Checked) { MessageBox.Show("Доброту все любят!"); } else if (radioButton2.Checked) { MessageBox.Show("Это замечательно!"); } }   // Обработчик события, срабатывающий при выборе одного из пунктов списка void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) { switch (listBox1.SelectedItem.ToString()) { case ("Зеленый"): treeView1.BackColor = Color.Green; break; case ("Желтый"): treeView1.BackColor = Color.Yellow; break; case ("Голубой"): treeView1.BackColor = Color.Blue; break; case ("Серый"): treeView1.BackColor = Color.Gray; break; } }   // Обработчик события, срабатывающий при выборе в меню пункта "White" void mainMenu1_ColorWhite_Select(object sender, System.EventArgs e) { treeView1.BackColor = Color.White; }   // Обработчик события, срабатывающий при выборе в меню цвета void mainMenu1_ColorOwn_Select(object sender, System.EventArgs e) { ColorDialog colorDialog1 = new ColorDialog(); colorDialog1.Color = treeView1.BackColor; colorDialog1.ShowDialog(); treeView1.BackColor = colorDialog1.Color; }   // Обработчик события, срабатывающий при выборе в меню пункта "exit" void mainMenu1_Exit_Select(object sender, System.EventArgs e) { if ( MessageBox.Show("Вы уверены, что хотите закончить работу?", "Exit confirmation", MessageBoxButtons.YesNo) == DialogResult.Yes ) { this.Dispose(); } }   // Обработчик события, срабатывающий при нажатии кнопки на панели инструментов void toolBar1_Click (object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e) { if (e.Button.Text == "Open") { MessageBox.Show("Здесь мог бы открываться файл!"); } else if (e.Button.Text == "New") { MessageBox.Show("Здесь мог бы создаваться файл!"); } else if (e.Button.Text == "Copy") { MessageBox.Show("Здесь мог бы копироваться файл!"); } } static void Main() { // // Создаем и запускаем форму Application.Run(new FormWithManyControls()); } } Листинг 3.7. увеличить изображение Рисование Классы, объединенные в пространство имен Drawing, позволяют работать с различными изображениями. Существует два основных типа компьютерных изображений. Растровые представляют собой набор точек. Примером могут служить фотографии и значки. Векторная графика — это изображения, составленные из геометрических фигур: линий, окружностей, прямоугольников и т. д. Например, план дома удобно представлять в виде векторного изображения. Для начала продемонстрируем работу с растровой графикой. На компьютере часто приходится выполнять обработку изображений, например, фотографий. Для этого в библиотеке классов.NET Framework имеется немало полезных средств. Пример программы 3.8 Для создания программы, отображающей на форме рисунок, хранящийся в файле, нам понадобится специальный элемент управления. Для этой цели прекрасно подходитPictureBox. using System; using System.Windows.Forms; using System.Drawing;   class PictureDisplayer: Form { Bitmap image1; PictureBox pictureBox1;   // Метод-конструктор нашего класса public PictureDisplayer() { // Указываем размеры и заголовок окна   this.Text = "Искусство аборигенов"; this.Size = new Size(302, 240);   // Подготавливаем поле для размещения изображения   pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.BorderStyle = BorderStyle.Fixed3D; pictureBox1.ClientSize = new Size(300, 196);   // Добавляем изображение в элемент PictureBox   image1 = new Bitmap(@"../../images/Iskusstvo.jpg"); pictureBox1.Image = (Image)image1;   // Добавляем PictureBox (с изображением) на форму   this.Controls.Add(pictureBox1); } static void Main() { // Создаем и запускаем форму Application.Run(new PictureDisplayer()); } } Листинг 3.8.   Пример программы 3.9 Следующая программа загружает фотографию с диска и после нажатия кнопки " flip " (Перевернуть) позволяет получить ее зеркальное отражение, расположенное по горизонтали: using System; using System.Windows.Forms; using System.Drawing;   class PictureFlipper: Form { Button button1; Bitmap image1; PictureBox pictureBox1;   // Метод-конструктор нашего класса public PictureFlipper() { // Указываем размеры и заголовок окна   this.Text = "Поворот рисунка"; this.Size = new Size(302, 240);   // Добавляем на форму кнопку   button1 = new Button(); button1.Text = "Поворот рисунка"; button1.Location = new Point(100, 150); button1.Size = new Size(70, 40); button1.Click += new System.EventHandler(button1_Click); this.Controls.Add(button1);   // Добавляем элемент PictureBox на форму   pictureBox1 = new PictureBox(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox1.BorderStyle = BorderStyle.Fixed3D; pictureBox1.ClientSize = new Size(300, 196);   // Добавляем изображение в элемент PictureBox   image1 = new Bitmap(@"../../images/Giraf.jpg"); pictureBox1.Image = (Image)image1;   // Добавляем на форму элемент PictureBox   this.Controls.Add(pictureBox1); } static void Main() { // Создаем и запускаем форму Application.Run(new PictureFlipper()); }   // Обработчик события, срабатывающий при нажатии кнопки void button1_Click(object sender, EventArgs e) { // Отображает изоражение относительно оси X (горизонтально) image1.RotateFlip(RotateFlipType.RotateNoneFlipX);   // Повторно вставляем изображение в элемент PictureBox pictureBox1.Image = (Image)image1;   // Обновляем заголовок окна this.Text = "Рисунок после поворота!"; } } Листинг 3.9.   Теперь перейдем к примерам работы с векторной графикой — изображениям, составленным из геометрических фигур. Во всех примерах будут создаваться кнопка и обработчик событий, отвечающий за то, чтобы работа с графикой начиналась только после нажатия кнопки. Необходимо усвоить несколько важных принципов. Они вполне логичны, но все-таки следует уяснить их, чтобы избежать возможных затруднений.
  1. В обычном мире, прежде чем нарисовать линию, окружность, прямоугольник или иную фигуру, необходимо выбрать карандаш нужного цвета с грифелем определенной толщины. Для отрисовки на компьютере простейших фигур надо сначала создать объект Pen (Перо). Например, с помощью данного фрагмента кода создается объект Pen, который рисует зеленую линию толщиной 3 пикселя:
Pen myGreenPen = new Pen(Color.Green, 3);
  1. Для рисования фигур с заливкой потребуется нечто вроде кисти с красками. Предварительно следует создать объект Brush (Кисть), а затем выбрать цвет заливки и один из многочисленных типов кисти. В следующем фрагменте кода создается объект SolidBrush (Сплошная кисть) голубого цвета:
SolidBrush myBlueBrush = new SolidBrush(Color.Blue); Пример программы 3.10 В этой программе в методе, названном DrawSomeShapes, рисуется линия, прямоугольник и эллипс. using System; using System.Windows.Forms; using System.Drawing;   class SimpleShapeMaker: Form { // Метод-конструктор нашего класса public SimpleShapeMaker() { // Меняем цвет фона формы на белый   this.BackColor = Color.White;   // Добавляем на форму кнопку и привязываем ее к обработчику событий   Button button1 = new Button(); button1.Text = "Будем рисовать!"; button1.Location = new Point(110, 10); button1.Size = new Size(70, 40); button1.BackColor = Color.LightGray; button1.Click += new System.EventHandler(button1_Click); this.Controls.Add(button1); }   // Обработчик события, срабатывающий при нажатии кнопки void button1_Click(object o, System.EventArgs e) { // Вызов метода DrawSomeShapes(); }   // Метод для отрисовки на поверхности формы нескольких фигур void DrawSomeShapes() { // Подготовка области рисования на форме Graphics g = this.CreateGraphics();   // Подготавливаем перо, рисующее красную линию толщиной 3 пикселя Pen redPen = new Pen(Color.Red, 3);   // С помощью пера рисуем прямую линию, прямоугольник и эллипс g.DrawLine(redPen, 140, 170, 140, 230); g.DrawRectangle(redPen, 50, 60, 50, 60); g.DrawEllipse(redPen, 150, 100, 100, 60);   // Очистка g.Dispose(); } static void Main() { // Создаем и запускаем форму Application.Run(new SimpleShapeMaker()); } } Листинг 3.10.   Пример программы 3.11 Теперь попробуем поиграть с мышкой – работать с графикой удобнее при помощи мыши, а не клавиатуры. Мы будем обрабатывать как растровые, так и векторные изображения, используя некоторые события мыши. Постараемся освоить некоторые новые действия, а именно — действия с точечными рисунками. Тратить время на подробное описание мы не будем, но небольшое вступление необходимо, чтобы рассказать о принципах работы приведенного ниже кода.
  • Компьютерные программы формируют изображение на экране монитора, управляя цветом и яркостью маленьких точек, которые называются пикселями.
  • Цвет пикселя определяется тремя цветовыми компонентами: красной (red), зеленой (green) и синей (blue) – в языках программирования часто используется сокращение RGB. Цвет и яркость пикселя можно изменять, регулируя интенсивность компонентов RGB, в пределах от 0 до 255 единиц. Например:
    • если red=255, green=0, blue=0 — цвет пикселя будет ярко-красным;
    • если red=255, green=255, blue=0 — цвет пикселя желтый.
  • Компьютер может отслеживать положение курсора мыши, определяемое координатами X и Y (горизонтальная и вертикальная координаты). Так, верхний левый угол экрана имеет координаты X=0 и Y=0.
using System; using System.Windows.Forms; using System.Drawing;   class FunWithTheMouse: Form { // Объявляем объекты, доступные для разных методов   PictureBox pictureBox1; Label label1; Point spotClicked;   // Метод-конструктор нашего класса public FunWithTheMouse() { // Задаем размеры окна   this.Size = new Size(640, 480);   // Загружаем рисунок в элемент PictureBox и вставляем в форму   pictureBox1 = new PictureBox(); pictureBox1.Image = (Image)new Bitmap(@"../../images/Dog.bmp"); pictureBox1.SizeMode = PictureBoxSizeMode.Normal; pictureBox1.Dock = DockStyle.Fill; this.Controls.Add(pictureBox1);   // Добавляем метку с инструкциями в нижнюю часть экрана   label1 = new Label(); label1.BackColor = Color.Wheat; label1.Dock = DockStyle.Bottom; label1.Text = "При нажатой левой кнопке мыши можно рисовать прямоугольники. " + "Нажатая правая кнопка изменяет яркость прямоугольника " + "Нажав SHIFT и перемещая мышь, рисуем желтые кружки."; label1.TextAlign = ContentAlignment.MiddleCenter; this.Controls.Add(label1);   // Привязываем PictureBox к обработчикам событий мыши   this.pictureBox1.MouseDown += new MouseEventHandler(MouseButtonIsDown); this.pictureBox1.MouseUp += new MouseEventHandler(MouseButtonIsUp); this.pictureBox1.MouseMove += new MouseEventHandler(TheMouseMoved); } // Обработчик событий, срабатывающий при ПЕРЕМЕЩЕНИИ мыши public void TheMouseMoved(object sender, MouseEventArgs e) { // Если на клавиатуре нажата клавиша SHIFT if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) { // Подготовка области рисования на изображении System.Drawing.Graphics g = this.pictureBox1.CreateGraphics();   // Используем желтое перо System.Drawing.Pen yellowPen = new System.Drawing.Pen(Color.Yellow, 3);   // Рисуем окружность (эллипс, вписанный в квадрат) // Верхний левый угол квадрата имеет координаты X и Y // текущего положения мыши. g.DrawEllipse(yellowPen, e.X, e.Y, 40, 40);   // Очистка g.Dispose(); } }   // Обработчик событий, срабатывающий при НАЖАТИИ кнопки мыши public void MouseButtonIsDown(object sender, MouseEventArgs e) { // Запоминаем точку, в которой произошло нажатие кнопки мыши. // Когда кнопка будет отпущена, нам понадобятся ее координаты   spotClicked.X = e.X;// горизонтальная координата spotClicked.Y = e.Y;// вертикальная координата }   // Обработчик событий, срабатывающий при ОТЖАТИИ кнопки мыши public void MouseButtonIsUp(object sender, MouseEventArgs e) { /* Пользователь отпустил кнопку мыши! */   // Создаем прямоугольник (пока он еще не виден), ограничивающий // область изображения, с которой пользователь будет работать   Rectangle r = new Rectangle();   // Левый верхний угол прямоугольника соответствует точке, // в которой была нажата кнопка мыши. // Мы сохранили ее координаты.   r.X = spotClicked.X; r.Y = spotClicked.Y;   // Ширина и высота прямоугольника вычисляется // путем вычитания координат мыши в точке нажатия // из текущих координат (в точке отжатия кнопки).   r.Width = e.X – spotClicked.X; r.Height = e.Y – spotClicked.Y;   if (e.Button == MouseButtons.Left) { /* Если была нажата и отпущена левая кнопка мыши, рисуем видимый контур прямоугольника */   // Подготовка области рисования на изображении Graphics g = this.pictureBox1.CreateGraphics();   // Рисуем красный контур прямоугольника   Pen redPen = new Pen(Color.Red, 2); g.DrawRectangle(redPen, r); } else { // Если была нажата другая кнопка, вызываем // метод, подсвечивающий область изображения   ChangeLightness(r); } }   // Метод, увеличивающий яркость выбранного участка изображения // путем увеличения яркости каждого пикселя этого участка public void ChangeLightness(Rectangle rect) { int newRed, newGreen, newBlue; Color pixel;   // Копируем изображение, загруженное в PictureBox   System.Drawing.Bitmap picture = new Bitmap(this.pictureBox1.Image);   // Операция увеличения яркости может занять много времени, // пользователя предупреждают, если выбран большой участок.   if ((rect.Width > 150) || (rect.Height > 150)) {   DialogResult result = MessageBox.Show( "Выделенная область велика! " + "Изменение яркости может требовать значительного времени!", "Warning", MessageBoxButtons.OKCancel);   // При нажатии кнопки Cancel (Отмена) выходим из метода // и возвращаемся к месту его вызова   if (result == DialogResult.Cancel) return; } /* Перебираем последовательно все пиксели данного участка и удваиваем значение яркости компонент RGB пикселей */   // Перебор по горизонтали слева направо...   for (int x = rect.X; x < rect.X + rect.Width; x++) { // и по вертикали сверху вниз...   for (int y = rect.Y; y < (rect.Y + rect.Height); y++) { // Считываем текущий пиксель   pixel = picture.GetPixel(x, y);   // Увеличиваем яркость цветовых компонент пикселя   newRed = (int)Math.Round(pixel.R * 2.0, 0); if (newRed > 255) newRed = 255; newGreen = (int)Math.Round(pixel.G * 2.0, 0); if (newGreen > 255) newGreen = 255; newBlue = (int)Math.Round(pixel.B * 2.0, 0); if (newBlue > 255) newBlue = 255;   // Присваиваем пикселю новые цветовые значения   picture.SetPixel (x, y, Color.FromArgb( (byte)newRed, (byte)newGreen, (byte)newBlue)); } } // Помещаем измененную копию изображения в PictureBox, // чтобы изменения отобразились на экране   this.pictureBox1.Image = picture; } static void Main() { // Создаем экземпляр класса формы Application.Run(new FunWithTheMouse()); } } Листинг 3.11.

 

© INTUIT.ru, 2003-2013. Все права защищены.

Интернет-Университет Информационных Технологий

http://www.INTUIT.ru

C# для школьников
6. Лекция: Базы данных и XML: версия для печати и PDA В лекции рассматривается работа с базами данных на SQL и применение XML в базах данных. Рассматриваются особенности разных СУБД.
Введение в работу с базами данных Большинство приложений работают с базами данных. Любой программист из крупной компании подтвердит, что роль баз данных в мире вычислительных технологий очень велика. Обладая умением оперировать с базами данных, можно создавать самые разнообразные и действительно полезные приложения. Возможно, у вас на компьютере уже установлена система управления базами данных, например, Microsoft Access. Лучшая альтернатива – это Microsoft SQL Server Express Edition, с помощью которого вы научитесь работать с базами данных SQL Server, используемыми во многих крупнейших компаниях по всему миру. SQL Server Express включен в пакет установки Visual C# Express, так что, скорее всего, на вашем компьютере он уже установлен. Для работы с базами данных в библиотеке.NET Framework предусмотрены классы пространства имен System.Data. База данных в корне отличается от таких объектов, как изображения или документы текстовых редакторов, которые часто называют неструктурированными. Информация в базе данных структурирована и обычно хранится втаблицах, а каждая таблица состоит из строк и столбцов. В программировании строки называют записями, а столбцы задают поля записи. Столбец таблицы определяет тип данных, хранимых в поле записи. Ниже представлена таблица базы данных, содержащая информацию о планетах. Она имеет следующие столбцы: PlanetName (название планеты), DistanceFromSun(расстояние до Солнца) и Inhabitants (обитатели).
Таблица. Planet
PlanetName DistanceFromSun (единица измерения – тысяча километров) Inhabitants
Меркурий   Меркуриане
Венера   Венериане
Земля   Земляне
Марс   Марсиане
Юпитер   Юпитериане
Знок   Знокиане
Сатурн   Сатурниане
Уран   Ураниане
Нептун   Нептуниане
Плутон   Плутониане

Из таблицы видно, что, например, Венера находится на расстоянии 108 200 тысяч километров от Солнца, а существа, ее населяющие, называются венериане.

Вот еще одна таблица, в которой содержатся сведения о ежегодной численности обитателей разных планет.

Эта совершенно секретная информация, нигде ранее не обнародованная, была получена с инопланетного звездолета, потерпевшего крушение в самой глубине пустыни Гоби. Иметь возможность ознакомиться с ней – большая честь. Очевидно, представители инопланетной цивилизации тоже используют базы данных SQL Server, что и позволило нам привести эти сведения в качестве примера.

Таблица. Population
PlanetName Year Population
Меркурий    
Венера    
Земля    
Марс    
Юпитер    
Знок    
Сатурн    
Уран    
Нептун   <NULL>
Плутон   <NULL>
Меркурий    
Венера    
Земля    
Марс    
Юпитер    
Знок    
Сатурн    
Уран    
Нептун   <NULL>
Плутон   <NULL>

Если продолжить разговор о Венере, то, обратите внимание, что в 2008 г. на Венере обитало 25 венериан, а через год, вероятно, в результате извержений вулканов, их осталось всего трое.

Не следует путать базы данных с электронными таблицами. Хотя способ представления данных в электронных таблицах внешне похож на тот, что использовался в приведенных выше примерах, обработка данных происходит в них иначе.

<== предыдущая лекция | следующая лекция ==>
Наследование кода | Язык SQL
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 620; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.024 сек.