Работа с классами c windows forms

Как реализовать класс на форме C# Решение и ответ на вопрос 1533146

monawenka

0 / 0 / 0

Регистрация: 08.04.2015

Сообщений: 5

1

Как реализовать класс на форме

18.09.2015, 11:19. Показов 3135. Ответов 1

Метки нет (Все метки)


Можете помочь!есть класс и не понимаю как его реализовать на форме…Может кто объяснить или кинуть код как будет выглядеть на форме?
Вот сам код

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Threading;
using System.Diagnostics;
 
namespace Системный_монитор
{
   public class Class1
    {
        public static int UsersCount { get; set; }
    }
    public class Program1
    {
        // Вспомогательный метод для создания категории счетчика
        public static void CreateCounterCategory()
        {
            if (PerformanceCounterCategory.Exists("MyUsers"))
                PerformanceCounterCategory.Delete("MyUsers");
 
            CounterCreationDataCollection counters = new CounterCreationDataCollection();
 
            CounterCreationData usersAtWork = new CounterCreationData("# Пользователи онлайн",
                "Количество пользователей, работающих в данный момент с вашим приложением",
                PerformanceCounterType.NumberOfItems32);
 
            counters.Add(usersAtWork);
 
            PerformanceCounterCategory.Create("MyUsers", "Информация о пользователях онлайн", counters);
        }
 
        // Этот метод нужно использовать для запуска счетчика
        public static void StartUpdatingCounters()
        {
            PerformanceCounter usersAtWork = new PerformanceCounter("MyUsers",
                "# Пользователи онлайн", false);
 
            Timer updateTimer = new Timer(_ =>
            {
                // Обновляем значение счетчика
                usersAtWork.RawValue = Class1.UsersCount;
            },
            null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
        }
    }
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Zhavoronkov5

52 / 48 / 23

Регистрация: 27.07.2015

Сообщений: 144

18.09.2015, 22:41

2

1. В следующих сообщениях проставляйте теги.
2. Используйте вменяемые имена (никаких Class1, Program1).
3. Русские буквы в namespace — зло.

Дальше создаете WindowsFormApplication. Либо добавляйте класс отдельным файлом *.cs, либо в файл с формой, если он небольшой. Дальше в коде формы создавайте экземпляр класса, и с ним уже работаете.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace WindowsFormsApplication4
{
    //  Ваш класс.
    public class MySystemMonitor
    {
        //  Здесь весь Ваш код.
 
    }
    
    //  Форма.
    public partial class Form1 : Form
    {
        //  Создаем экземпляр класса MySystemMonitor.
        MySystemMonitor mySystemMonitor1 = new MySystemMonitor();
 
        //  Дальше работаем с экземпляром, не с классом.
        public Form1()
        {
            InitializeComponent();
        }
    }
}



1



Практическое занятие № 20. Создание классов

1        Цель занятия

Получить практические навыки создания классов в приложении Windows Forms

2        Перечень оборудования и программного обеспечения

Персональный компьютер

Microsoft Office (Word)

Microsoft Visual Studio

3        Краткие теоретические сведения

Классы и объекты

Класс является основой для создания объектов. Объекты являются экземплярами класса.

При определении класса объявляются данные, которые он содержит, и код (методы), работающие с этими данными. Данные и методы, составляющие класс, называются членами класса. Данные содержатся в переменных экземпляра, которые определены классом, а код содержится в методах. В С# определены несколько специфических разновидностей членов класса. Это — переменные экземпляра, статические переменные, константы, методы, конструкторы, деструкторы, индексаторы, события, операторы и свойства.

Непосредственно инициализация данных в объекте (переменных экземпляра) происходит в конструкторе. В классе могут быть определены несколько конструкторов.

Синтаксис класса:

class имя_класса{

тип_доступа тип имя_переменной1;

тип_доступа тип имя_переменной2;

тип_доступа возвращаемый_тип

имя_метода1(список_параметров) {тело_метода}

}

где тип_доступа может быть public, private, protected, internal.

Члены класса с типом доступа public доступны везде за пределами данного класса, с типом доступа protected – внутри членов данного класса и производных, с типом доступа private — только для других членов данного класса. Тип доступа internal применяется для типов, доступных в пределах одной сборки.

Пример 1:

class Animal

{

public string Name;

private double Weight;

protected string Type;

public void Animal(double W, string T, string N)

{

Weight = W;

Type = T;

Name = N;

}

public int GetWeight() { return Weight; }

}

Создание объекта

имя_класса имя_объекта = new имя_класса();

При создании объекта класса происходит вызов соответствующего конструктора класса.

Конструктор и деструктор

Конструктор класса – метод для инициализации объекта при его создании. Он имеет то же имя, что и его класс. В конструкторах тип возвращаемого значения не указывается явно. Конструкторы используются для присваивания начальных значений переменным экземпляра, определенным классом, и для выполнения любых других процедур инициализации, необходимых для создания объекта. Все классы имеют конструкторы независимо от того, определен он или нет. По умолчанию в С# предусмотрено наличие конструктора, который присваивает нулевые значения всем переменным экземпляра (для переменных обычных типов) и значения null (для переменных ссылочного типа). Но если конструктор явно определен в классе, то конструктор по умолчанию использоваться не будет.

имя_класса(список_параметров) {тело_конструктора}

Деструктор – метод, вызывающийся автоматически при уничтожении объекта класса (непосредственно перед “сборкой мусора”). Деструктор не имеет параметров и возвращаемого значения.

~имя_класса() {тело_деструктора}

Пример 2. Создание класса «Животное» с полями: название, вес и прежний вес.

Решение.

Форма Windows-приложения с элементами, позволяющими отображать и обрабатывать значения полей заданного класса:

Описание созданного класса (после класса Form1):

Метод button1_Click() класса Form0, осуществляющий обращение к методам созданного класса:

4        Порядок выполнения работы

4.1        Изучить теоретические сведения и задание к работе.

4.2        В соответствии с вариантом задания создать класс с необходимыми данными (полями) и методами.

4.3        Создать метод обработки данных, осуществляющий обращение к методам созданного класса.

5        Содержание отчета

5.1        Название работы

5.2        Цель работы

5.3        Листинг и скрины отлаженной программы в соответствии с вариантом задания

6        Варианты заданий

6.1        Класс «Квадрат» с полями: центр квадрата и его сторона.

6.2        Класс «Время» с полями: часы, минуты и секунды.

6.3        Класс «Прямоугольник» с полями: верхняя левая и правая нижняя точки.

6.4        Класс «Конус» с полями: радиус окружности основания и высота.

6.5        Класс «Куб» с полями: координаты центра и сторона.

6.6        Класс «Компьютер» с полями: тактовая частота процессора, объем ОЗУ, емкость диска.

6.7        Класс «Служащий» с полями: табельный номер, номер подразделения и оклад.

6.8        Класс «Накладная» с полями: номер, дата отпуска и сумма.

6.9        Класс «Проект» с полями: номер проекта, сумма, дата исполнения.

6.10        Класс «Здание» с полями: количество этажей, подъездов и квартир на этаже.

6.11        Класс «Студент» с полями: ФИО, номер группы, номер зачетки.

6.12        Класс «Дата» с полями: число, номер месяца и две последние цифры года.

6.13        Класс «Вектор на плоскости» с данными проекция вектора на оси X и Y.

6.14        Класс «Окружность» с полями: центр и радиус окружности.

6.15        Класс «Дробь» с полями: числитель и знаменатель.

7        Используемая литература

7.1        Г. Гагарина, Е. В. Кокорева, Б. Д. Виснадул Технология разработки программного обеспечения. Форум, Инфра-М, 2009

7.2        Эндрю Троелсен Язык программирования С# 2010 и платформа .NET 4.0, М., ВИЛЬЯМС, 2011

7.3        А. Марченко C#. Введение в программирование, М, Вильямс, 2009

7.4        http://msdn.microsoft.com/ru-ru/library/67ef8sbd.aspx.

Работа с формами

Основы форм

Последнее обновление: 31.10.2015

Внешний вид приложения является нам преимущественно через формы. Формы являются основными строительными блоками. Они предоставляют
контейнер для различных элементов управления. А механизм событий позволяет элементам формы отзываться на ввод пользователя, и, таким образом,
взаимодействовать с пользователем.

При открытии проекта в Visual Studio в графическом редакторе мы можем увидеть визуальную часть формы — ту часть, которую мы видим после запуска приложения и куда мы переносим
элементы с панели управления. Но на самом деле форма скрывает мощный функционал, состоящий из методов, свойств, событий и прочее. Рассмотрим
основные свойства форм.

Если мы запустим приложение, то нам отобразится одна пустая форма. Однако даже такой простой проект с пустой формой имеет несколько компонентов:

Все файлы в Windows Forms

Несмотря на то, что мы видим только форму, но стартовой точкой входа в графическое приложение является класс Program, расположенный в
файле Program.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HelloApp
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Сначала программой запускается данный класс, затем с помощью выражения Application.Run(new Form1()) он запускает форму
Form1. Если вдруг мы захотим изменить стартовую форму в приложении на какую-нибудь другую, то нам надо изменить в этом выражении Form1 на соответствующий
класс формы.

Сама форма сложна по содержанию. Она делится на ряд компонентов. Так, в структуре проекта есть файл Form1.Designer.cs, который выглядит
примерно так:

namespace HelloApp
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (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.SuspendLayout();
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(284, 261);
            this.Name = "Form1";
            this.Text = "Привет мир!";
            this.ResumeLayout(false);

        }

        #endregion

    }
}

Здесь объявляется частичный класс формы Form1, которая имеет два метода: Dispose(), который выполняет роль деструктора объекта, и
InitializeComponent(), который устанавливает начальные значения свойств формы.

При добавлении элементов управления, например, кнопок, их описание также добавляется в этот файл.

Но на практике мы редко будем сталкиваться с этим классом, так как они выполняет в основном дизайнерские функции — установка свойств объектов, установка переменных.

Еще один файл — Form1.resx — хранит ресурсы формы. Как правило, ресурсы используются для создания однообразных форм сразу для
нескольких языковых культур.

И более важный файл — Form1.cs, который в структуре проекта называется просто Form1, содержит код или программную логику формы:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HelloApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}

По умолчанию здесь есть только конструктор формы, в котором просто вызывается метод InitializeComponent(), объявленный в файле дизайнера
Form1.Designer.cs. Именно с этим файлом мы и будем больше работать.

Приложения 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.

Содержание

  • Условие задачи
  • Математическая постановка задачи
  • Выполнение
    • 1. Создание нового проекта.
    • 2. Размещение элементов управления на форме.
    • 3. Настройка свойств элементов управления.
    • 4. Классы, необходимые для решения задачи.
    • 5. Реализация конструкторов класса Point.
    • 6. Реализация конструкторов класса Circle.
    • 7. Реализация методов класса Point.
    • 8. Реализация методов класса Circle.
    • 9. Примеры использования конструкторов и методов классов Point и Circle.
    • 10. Предварительный исходный код классов.
    • 11. Реализация свойств класса Point.
    • 12. Реализация свойств класса Circle.
    • 13. Реализация методов интерфейса ICloneable в классах.
    • 14. Реализация методов интерфейса IEquatable.
    • 15. Реализация метода вычисления площади круга в классе Circle.
    • 16. Сокращенный листинг класса Point.
    • 17. Сокращенный листинг класса Circle.
    • 18. Программирование обработчика события клика на кнопке «Вычислить«.
  • Связанные темы

Поиск на других ресурсах:

Условие задачи

В разработанных классах необходимо реализовать такие концепции ООП как «наследование» и «полиморфизм«.

Нужно описать базовый класс (класс-предок) и унаследовать (наследовать) от него. Часть функциональности классов нужно реализовать с использованием свойств.

Каждый класс должен содержать реализацию по крайней мере:

  • двух конструкторов;
  • двух методов;
  • двух свойств;
  • двух интерфейсов.

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

Реализовать интерфейсы ICloneable, IEquatable.


Математическая постановка задачи

На рисунке 1 изображена окружность на плоскости.

окружность плоскость рисунок

Рис. 1. Изображение окружности на плоскости

Как видно из рисунка 1, для обозначения окружности на плоскости нужно иметь:

  • координаты (x, y) точки середины окружности;
  • радиус окружности R.

Площадь окружности исчисляется по формуле:

Площадь окружности Формулагде S — площадь окружности; R — радиус окружности; π– константа, которая равняется 3.1415.

  ⇑


Выполнение

1. Создание нового проекта.

Запустить Microsoft Visual Studio. Создать новый проект как Windows Forms Application. Пример создания нового проекта приведен здесь.

Автоматически будет создана новая форма приложения.

  ⇑


2. Размещение элементов управления на форме.

Разместить на форме следующие элементы управления (рисунок 2):

  • два элемента управления типа Label. Автоматически будут созданы объекты с именами label1 и label2;
  • элемент управления типа TextBox. Создается новый объект с именем textBox1;
  • элемент управления типа Button. Создается объект с именем button1.

C# Windows Forms Размещение элемент управления форма

Рис. 2. Размещение элементов управления на форме

  ⇑


3. Настройка свойств элементов управления.

Настроить следующие свойства элементов управления (рисунок 3):

  • в элементе управления label1 свойство Text = «R = «;
  • в элементе управления label2 свойство Text = «S = «;
  • в элементе управления button1 свойство Text = «Вычислить«;
  • в элементе управления Form1 свойство Text = «Площадь круга«.

C# Windows Forms Форма приложения

Рис. 3. Форма приложения после настройки элементов управления

После настройки формы нужно заняться созданием классов.

  ⇑


4. Классы, необходимые для решения задачи.

В соответствии с условием задачи, нужно создать два класса:

  • класс Point, отображающий точку на плоскости. Этот класс должен быть базовым;
  • класс Circle, отображающий круг. Этот класс должен унаследовать данные и методы класса Point (в соответствии с условием задачи).

В данной задаче класс Point называется базовым, а класс Circle – производным.

Итак, возникает иерархия с 2-х классов. Схема иерархии классов и отображение данных (полей) в классах изображенная на рисунке 4.

C# Иерархия классов рисунок

Рис. 4. Иерархия классов в соответствии с условием задачи

По ходу решения задачи в классы будут вноситься изменения: свойства и методы.

Опишем класс Point, содержащий только данные. На языке C# листинг класса Point будет следующий:

class Point
{
    // поля класса объявлены как protected
    protected float x; // координата x точки
    protected float y; // координата y точки
}

В классе Point данные класса описываются как protected. Это означает, что эти данные есть видимыми в производных классах и невидимыми извне (скрытые для доступа через объект класса).

Для доступа к данным будут использоваться свойства и специальные методы.

Таким же образом создается класс Circle. Пока что листинг класса Circle следующий:

class Circle:Point // наследует данные из класса Point
{
    // поля класса
    private float R; // радиус окружности
}

В описании класса Circle, начало строки

class Circle:Point

означает, что класс Circle наследует данные и методы класса Point.

Таким образом, на данный момент, в классе Circle есть доступными три поля:

  • поле x из унаследованного класса Point;
  • поле y из унаследованного класса Point;
  • поле R, которое есть внутренним полем класса Circle.

  ⇑


5. Реализация конструкторов класса Point.

В соответствии с условием задачи, каждый из классов должен содержать минимум два конструктора.

Последовательно в текст класса Point нужно добавить два конструктора. Первый конструктор без параметров инициализирует данные нулевыми значениями.

Второй конструктор – параметризованный. Этот конструктор получает входящими 2 параметра и устанавливает новые значения для внутренних переменных x и y.

Ниже приведен текст программного кода обоих конструкторов:

// конструктор 1 - без параметров
public Point()
{
    x = 0f; // обнуление значений координат
    y = 0f;
}

// конструктор 2 - с двумя параметрами
public Point(float nx, float ny)
{
    x = nx;
    y = ny;
}

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

  ⇑


6. Реализация конструкторов класса Circle.

Таким же образом нужно добавить два конструктора в класс Circle.

// конструктор 1 - инициализирует поля нулевыми значениями
public Circle()
{
    x = 0f; // 0f - означает, что это значение имеет тип float
    y = 0f;
    R = 0f;
}

// конструктор 2 - с тремя параметрами
public Circle(float nx, float ny, float nR)
{
    x = nx;
    y = ny;
    R = nR;
}

  ⇑


7. Реализация методов класса Point.

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

  • метод GetPoint(), возвращающий точку типа Point;
  • метод SetXY(), устанавливающий новые значения внутренних переменных класса Point.

Тип доступа для методов выбран как public.



Листинг методов следующий.

public Point GetPoint()
{
    Point p; // описывается переменная (объект), для которой память еще не выделена
    p = new Point(x,y); // выделяется память, создается новый экземпляр класса
    return p;
}

// метод, который устанавливает новые значения внутренних переменных
public void SetXY(float nx, float ny)
{
    x = nx;
    y = ny;
}

  ⇑


8. Реализация методов класса Circle.

Подобным образом создаются методы класса Circle. В классе Circle реализуются два метода. Первый метод GetCircle() возвращает объект (с выделением памяти) типа Circle.

Второй метод SetXYR() устанавливает новые значения внутренних переменных. Этот метод получает входными 3 параметра (координаты x, y и радиус R окружности). В методе продемонстрировано использование ключевого слова this для доступа к полям класса. В этом случае имена локальных переменных-параметров совпадают с именами полей класса и скрывают их видимость внутри метода.

Листинг методов следующий:

// методы класса Circle в соответствии с условием задачи
// метод, который получает новый экземпляр класса типа Circle
public Circle GetCircle()
{
    Circle c;
    c = new Circle(x, y, R);
    return c;
}

// метод, который устанавливает новые значения во внутренние поля класса Circle

public void SetXYR(float x, float y, float R)
{
    // пример использования ключевого слова this
    // во внутреннюю переменную x класса заносится значение локальной переменной x метода SetXYR()
    this.x = x;
    // так же заполняются внутренние переменные y и R класса Circle
    this.y = y;
    this.R = R;
}

  ⇑


9. Примеры использования конструкторов и методов классов Point и Circle.

Приведем несколько примеров использования конструкторов и методов классов Point и Circle.

Демонстрация методов GetPoint() и SetXY():

// класс Point
// вызов конструктора без параметров класса Point()
Point p = new Point();
Point p1 = null, p2 = null;
p1 = new Point(4.5f, 3.2f); // вызов конструктора с двумя параметрами
p2 = p1.GetPoint();
p2.SetXY(3.3f, -2.8f); // установить новые значения

// класс Circle
Circle c = new Circle(); // конструктор без параметров
Circle c1, c2;
c1 = new Circle(3.3f, -2.8f, 12f); // выделение памяти
c2 = c1.GetCircle(); // метод GetCircle()
c2.SetXYR(3.8f, -1.9f, 8f); // метод SetXYR()

  ⇑


10. Исходный код классов.

На данный момент классы Point и Circle имеют следующий вид:

// описание класса Point
class Point
{
    // поля класса объявлены как protected
    protected float x; // координата x точки
    protected float y; // координата y точки

    // конструктор 1 - без параметров
    public Point()
    {
        x = 0f;
        y = 0f;
    }

    // конструктор 2 - с двумя параметрами
    public Point(float nx, float ny)
    {
        x = nx;
        y = ny;
    }

    public Point GetPoint()
    {
        Point p; // описывается переменная (объект), для которой память еще не выделена
        p = new Point(x,y); // выделяется память, создается новый экземпляр класса
        return p;
    }

    // метод, который устанавливает новые значения внутренних переменных
    public void SetXY(float nx, float ny)
    {
        x = nx;
        y = ny;
    }
}

// описание класса Circle
class Circle:Point // наследует данные класса Point
{
    // поля класса
    private float R; // радиус окружности
    // конструктор 1 - инициализирует поля нулевыми значениями
    public Circle()
    {
        x = 0f;
        y = 0f;
        R = 0f;
    }

    // конструктор 2 - с тремя параметрами
    public Circle(float nx, float ny, float nR)
    {
        x = nx;
        y = ny;
        R = nR;
    }

    // методы класса Circle в соответствии с условием задачи
    // метод, который получает новый экземпляр класса типа Circle
    public Circle GetCircle()
    {
        Circle c; // создается новый объект типа класс Circle
        c = new Circle(x, y, R); // выделяется память для объекта c, создается экземпляр класса
        return c;
    }

    // метод, который устанавливает новые значения во внутренние поля класса Circle
    public void SetXYR(float x, float y, float R)
    {
        // пример использования ключевого слова this
        this.x = x; // во внутреннюю переменную x класса заносится значение локальной переменной x метода SetXYR()
        this.y = y; // так же заполняются внутренние переменные y и R класса Circle
        this.R = R;
    }
}

  ⇑


11. Реализация свойств класса Point.

Следующим шагом нужно создать два свойства класса Point.

Первое свойство возвращает или устанавливает значение координат точки x. Второе свойство возвращает/устанавливает значение координаты y.

Имя первого свойства XX. Имя второго свойства YY.

Листинг свойств XX и YY следующий:

// свойство, которое возвращает/устанавливает координату x
public float XX
{
    get { return x; }
    set { x = value; }
}

// свойство, которое возвращает/устанавливает координату y
public float YY
{
    get { return y; }
    set { y = value; }
}

После такого описания свойства XX и YY можно использовать. Далее приведен пример использования свойств XX и YY.

...

Point p = new Point(5.2f, 6.35f); // создание объекта типа Point
float x,y;

x = p.XX; // x = 5.2
y = p.YY; // y = 6.35

// переопределить значения
p.XX = 2.33f;
p.YY = -3.8f;

x = p.XX; // x = 2.33
y = p.YY; // y = -3.8

...

  ⇑


12. Реализация свойств класса Circle.

Аналогичным образом описываются свойства класса Circle. Первое свойство читает/устанавливает значение радиуса R. Второе свойство читает/устанавливает значение точки, которая есть центром кола (класс Point).

// свойства класса Circle
// свойство, которое возвращает значение радиуса окружности R
public float RR
{
    get { return R; }
    set { R = value; }
}

// свойство, которое возвращает значение точки типа Point, которая есть центром окружности
public Point PP
{
    get
    {
        Point p;
        p = new Point(x, y);
        return p;
    }

    set
    {
        x = value.XX;
        y = value.YY;
    }
}

В нижеследующем листинге описывается пример использования свойств PP и RR.

// создание объекта, в котором значение полей x = 5.5; y = -2.3; R = 12.8
Circle c = new Circle(5.5f, -2.3f, 12.8f);
float x, y, R;

// доступ к свойству PP класса Circle
x = c.PP.XX; // x = 5.5
y = c.PP.YY; // y = -2.3

// доступ к свойству RR
R = c.RR; // R = 12.8
c.RR = -20.85f;

  ⇑


13. Реализация методов интерфейса ICloneable в классах.

Если реализовать интерфейс ICloneable, то можно обеспечить глубокое копирование объектов.

В нижеследующем примере осуществляется поверхностное копирование объектов:

Point p1 = new Point(5.3f, -6.8f);
Point p2;

// поверхностное копирование
p2 = p1; // оба объекта указывают на один участок памяти

Интерфейс ICloneable представляет один метод для реализации. Этот метод называется Clone(). Этот метод нужно реализовать в классах Point и Circle. Реализация метода работает по одинаковому принципу.

Прежде всего нужно изменить заголовок класса Point. Вместо текста

class Point

нужно набрать

class Point:ICloneable

Это означает, что в классе Point нужно реализовать единственный метод Clone(). Листинг метода следующий:

// реализация метода Clone() в интерфейсе ICloneable
public object Clone()
{
    Point p = new Point(x, y);
    return p;
}

Так как класс Circle наследует класс Point, который наследует интерфейс ICloneable, то в классе Circle также можно реализовать метод Clone() (но не обязательно).

// Реализация интерфейса ICloneable в классе Circle
public object Clone()
{
    Circle c = new Circle();
    return c;
}

Пример использования метода Clone().

Point p1 = new Point(5.2f, 6.35f); // создание объекта
Point p2;

// глубокое копирование, так как реализован метод Clone()
p2 = (Point)p1.Clone();// для p2 отдельно выделяется память

// класс Circle
Circle c1 = new Circle(3.2f, -8.3f, 11f);
Circle c2 = null;
c2 = (Circle)c1.Clone(); // для c2 отдельно выделяется оперативная память

  ⇑


14. Реализация методов интерфейса IEquatable.

Интерфейс IEquatable реализуется в тех классах, где нужно определить порядок сравнения двух объектов на равенство их значений. В этом интерфейсе определяется только один метод Equals(). Этот метод возвращает значение true, если значение вызывающего объекта есть равным значению другого объекта, который является параметром в методе Equals().

Для класса Point реализуем метод Equals(), который сравнивает на равенство значения переменных x и y.

Листинг метода Equals() для класса Point следующий:

// реализация метода Equals() из интерфейса IEquatable
public bool Equals(Point p2)
{
    if ((this.x == p2.x) && (this.y == p2.y))
        return true;
    else
        return false;
}

Листинг метода Equals() для класса Circle следующий:

// Реализация метода Equals() из интерфейса IEquatable
public bool Equals(Circle c2)
{
    if ((this.x == c2.x) && (this.y == c2.y) && (this.R == c2.R))
        return true;
    else
        return false;
}

В программе метод Equals() для классов можно использовать следующим образом:

// демонстрация метода Equals() для класса Point
Point p1 = new Point(3f, -5.5f);
Point p2;
bool f;

p2 = (Point)p1.Clone();
f = p1.Equals(p2); // f = true

// демонстрация метода Equals() для класса Circle
Circle c1 = new Circle(3.2f, -8.3f, 11f);
Circle c2 = new Circle(3.2f, -8.3f, 11f);
f = c1.Equals(c2); // f = true

  ⇑


15. Реализация метода вычисления площади круга в классе Circle.

Название метода – GetSquare(). Для вычисления площади круга нужно иметь только радиус R. Радиус получается с внутренней переменной R. Результат вычисления есть тип float.

В тексте класса Circle нужно добавить следующий метод:

// Метод, который вычисляет площадь круга
public float GetSquare()
{
    const float pi = 3.1415f;
    float s;
    s = pi * R * R;
    return s;
}

  ⇑


16. Сокращенный листинг класса Point.

Итак, создание классов завершено.

Сокращенный листинг класса Point следующий (детали реализации описываются в предыдущих пунктах):

class Point:ICloneable,IEquatable<Point>
{
    // поля класса объявленные как protected
    protected float x; // координата x точки
    protected float y; // координата y точки

    // конструктор 1 - без параметров
    public Point() { ... }

    // конструктор 2 - с двумя параметрами
    public Point(float nx, float ny) { ... }

    // метод, который возвращает точку с координатами
    public Point GetPoint() { ... }

    // метод, который устанавливает новые значения внутренних переменных
    public void SetXY(float nx, float ny) { ... }

    // свойство, которое возвращает/устанавливает координату x
    public float XX
    {
        get { ... }
        set { ... }
    }

    // свойство, которое возвращает/устанавливает координату y
    public float YY
    {
        get { ... }
        set { ... }
    }

    // реализация метода Clone() в интерфейсе ICloneable
    public object Clone() { ... }

    // реализация метода Equals() из интерфейса IEquatable
    public bool Equals(Point p2) { ... }
}

  ⇑


17. Сокращенный листинг класса Circle.

Низшее приведен листинг класса Circle, в котором скрыты детали реализации. Реализация методов, свойств, конструкторов описывается в предыдущих пунктах.

class Circle:Point // наследует данные класса Point
{
    // поля класса
    private float R; // радиус окружности

    // конструктор 1 - инициализирует поля нулевыми значениями
    public Circle() { ... }

    // конструктор 2 - с тремя параметрами
    public Circle(float nx, float ny, float nR) { ... }

    // методы класса Circle в соответствии с условием задачи
    // метод, который получает новый экземпляр класса типа Circle
    public Circle GetCircle() { ... }

    // метод, который устанавливает новые значения во внутренние поля класса Circle
    public void SetXYR(float x, float y, float R) { ... }

    // свойства класса Circle
    // свойство, которое возвращает значение радиуса окружности R
    public float RR
    {
        get { ... }
        set { ... }
    }

    // свойство, которое возвращает значение точки типа Point, которая есть центром окружности
    public Point PP
    {
        get { ... }
        set { ... }
    }

    // Реализация интерфейса ICloneable
    public object Clone() { ... }

    // Реализация метода Equals() из интерфейса IEquatable
    public bool Equals(Circle c2) { ... }

    // Метод, который вычисляет площадь круга
    public float GetSquare() { ... }
}

  ⇑


18. Программирование обработчика события клика на кнопке «Вычислить«.

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

private void button1_Click(object sender, EventArgs e)
{
    Circle c = new Circle();
    float s;

    // заполнить значения R
    c.RR = (float)Double.Parse(textBox1.Text);

    // вызвать метод определения площади круга
    s = c.GetSquare();
    label2.Text = "S = " + s.ToString();
}

Результат работы программы изображен на рисунке 5.

C# Windows Forms Выполнение программы

Рис. 5. Выполнение программы

  ⇑


Связанные темы

  • Интерфейсы. Использование интерфейсов в программах на C#

 


Содержание

  1. Python
    1. tkinter Стандратный модуль для создания приложений с GUI интерфейсом.
  2. VBA
    1. VBA GUI в среде MS Excel.
  3. HTML
    1. HTML book Обзор GUI в HTML.
  4. Pascal
    1. Windows Forms Интерфейс (API) для создания GUI-приложений.

Windows Forms — фреймворк для работы с формами.

Общая структура программы[править]

Любая программа, использующая Wondows Forms может иметь следующий вид:

{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
 
uses
  System.Windows.Forms,
  System.Drawing;
  
var
  MainForm: System.Windows.Forms.Form;

begin
  MainForm := new Form;
  Application.Run(MainForm);
end.

MainForm — главная форма.

Основные классы[править]

Windows Forms содержит следующие классы:

  1. System.Windows.Forms.Button или Button (кнопка)
  2. System.Windows.Forms.Label или Label (метка)
  3. System.Windows.Forms.CheckBox или CheckBox (флажок)
  4. System.Windows.Forms.RadioButton или RadioButton (радио-кнопка)
  5. System.Windows.Forms.TrackBar или TrackBar (ползунок)
  6. System.Windows.Forms.ListBox или ListBox (список)
  7. System.Windows.Forms.ComboBox или ComboBox (выпадающий список)
  8. System.Windows.Forms.Form или Form (форма)
  9. System.Windows.Forms.GroupBox или GroupBox (фрейм)
  10. System.Windows.Forms.SplitContainer или SplitContainer (элемент разделения окна)
  11. System.Windows.Forms.MenuStrip или MenuStrip (главное меню)
  12. System.Windows.Forms.ToolStripMenuItem или ToolStripMenuItem (подменю)

Button[править]

System.Windows.Forms.Button — класс кнопки. Синтаксис ее создания:

name — имя кнопки.

Свойство Значение
Width Ширина кнопки.
Height Высота кнопки.
Text Текст на кнопке.
BackColor Цвет фона кнопки.
ForeColor Цвет текста кнопки.
Location Позиция кнопки на форме.

В качестве значения должна быть точка System.Drawing.Point.

AutoSize Будет ли меняться размер кнопки, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на кнопке.
Parent Родительский виджет.
Visible Видна ли кнопка.
Событие Значение
Click Хранит ссылку на процедуру, которая выполниться при нажатии на кнопку.

Для установки его значения используйте вместо := +=.

Label[править]

System.Windows.Forms.Label — класс метки. Синтаксис ее создания:

name — имя метки.

Свойство Значение
Width Ширина метки.
Height Высота метки.
Text Текст на метки.
BackColor Цвет фона метки.
ForeColor Цвет текста метки.
Location Позиция метки на форме.
AutoSize Будет ли меняться размер метки, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на метке.
Parent Родительский виджет.
Visible Видна ли метка.

CheckBox[править]

System.Windows.Forms.CheckBox — класс флажка. Синтаксис его создания:

name — имя флажка.

Свойство Значение
Width Ширина флажка.
Height Высота флажка.
Text Текст на флажка.
BackColor Цвет фона флажка.
ForeColor Цвет текста флажка.
Location Позиция флажка форме.
AutoSize Будет ли меняться размер флажка, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на флажка.
Parent Родительский виджет.
Visible Виден ли флажок.
Checked Определяет установлен ли флажок или нет.

RadioBox[править]

System.Windows.Forms.RadioBox- класс радио-кнопки. Синтаксис ее создания:

name — имя радио-кнопки.

Свойство Значение
Width Ширина радио-кнопки.
Height Высота радио-кнопки.
Text Текст на радио-кнопки.
BackColor Цвет фона радио-кнопки.
ForeColor Цвет текста радио-кнопки.
Location Позиция радио-кнопки форме.
AutoSize Будет ли меняться размер радио-кнопки, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на радио-кнопке.
Parent Родительский виджет.
Visible Видна ли радио-кнопка.
Checked Определяет установлена ли радио-кнопка или нет.

TrackBar[править]

System.Windows.Forms.TrackBar — класс ползунка. Синтаксис его создания:

name — имя ползунка.

Свойство Значение
Width Ширина ползунка.
Height Ширина ползунка.
Location Позиция ползунка на форме.
Parent Родительский виджет.
Visible Виден ли ползунок.
Minimum Минимальное значение ползунка.
Maximum Максимальное значение ползунка.
Value Текущее значение ползунка.
Orientation Ориентация ползунка.

  • System.Windows.Forms.Orientation.Horizontal — горизонтальная
  • System.Windows.Forms.Orientation.Vertical — вертикальная
TickStyle Контролирует как отображаются деления.

  • System.Windows.Forms.TickStyle.Both — с двух сторон
  • System.Windows.Forms.TickStyle.BottomRight — деления либо снизу (для горизонтального ползунка) или справа (для вертикального полузнка)
  • System.Windows.Forms.TickStyle.TopLeft — деления либо сверху (для горизонтального ползунка) или слева (для вертикального полузнка)
  • System.Windows.Forms.TickStyle.None — не отображаются
TickFrequency Расстояние между делениями.

ListBox[править]

System.Windows.Forms.ListBox- класс списка. Синтаксис его создания:

name — имя списка.

Свойство Значение
Width Ширина списка.
Height Высота списка.
Location Позиция списка на форме.
Parent Родительский виджет.
Visible Виден ли список.
ItemHeight Высота элемента списка.
Items.Count Количество элементов списка.
Items.Item[k] K-ый элемент списка.
IntegralHeight Указывает будет ли подгоняться размер списка под размер элементов, чтобы был видны названия всех элементов полностью.
Событие Описание
Click Хранит ссылку на процедуру, которая выполнится при щелчке по списку.
SelectedIndexChanged Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента списка.

Ниже a — список.

Процедура Значение
a.Items.Add(t) Добавляет в список элемент с текстом t.
a.Items.Clear Очищает список.

ComboBox[править]

System.Windows.Forms.ComboBox — класс выпадающего списка. Для его создания пишите:

name — имя выпадающего списка.

Свойство Значение
Width Ширина выпадающего списка.
Height Высота выпадающего списка.
Parent Родительский виджет.
Visible Виден ли выпадающий список.
Count Количество элементов в выпадающем списке.
SelectedIndex Индекс выбранного элемента выпадающего списка.
SelectedItem Выбранный элемент выпадающего списка.
Items.Item[k] K-ый элемент выпадающего списка.
IntegralHeight Указывает будет ли подгоняться размер выпадающего списка под размер элементов, чтобы был видны названия всех элементов полностью.
Событие Описание
Click Хранит ссылку на процедуру, которая выполнится при щелчке по выпадающему списку.
SelectedIndexChanged Хранит ссылку на процедуру, которая выполнится при смене выбранного элемента выпадающего списка.

Ниже a — выпадающий список.

Функция Описание
a.Items.Add Добавляет в выпадающий список элемент.
a.Items.Clear Удаляет все элементы выпадающего списка.

GroupBox[править]

System.Windows.Forms.GroupBox- класс фрейма. Синтаксис его создания:

name — имя кнопки.

Свойство Значение
Width Ширина фрейма.
Height Высота фрейма.
Text Текст на в заголовке фрейма.
Location Позиция фрейма на форме.

В качестве значения должна быть точка System.Drawing.Point.

AutoSize Будет ли меняться размер фрейма, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на кнопке.
Parent Родительский виджет.
Visible Виден ли фрейм.

SplitContainer[править]

System.Windows.Forms.SplitContainer — класс элемента разделения окна. Синтаксис его создания:

name := new SplitContainer();

name — имя элемента разделения окна.

Свойство Значение
Width Ширина элемента разделения окна.
Height Высота элемента разделения окна.
Location Позиция элемента разделения окна на форме.

В качестве значения должна быть точка System.Drawing.Point.

AutoSize Будет ли меняться размер элемента разделения окна, подгоняясь под размер содержимого, или будет отображаться лишь та часть содержимого, умещающаяся на элементе разделения окна.
Visible Виден ли элемент разделения окна.
Orientation Ориентация элемента разделения окна.

  • System.Windows.Forms.Orientation.Horizontal — горизонтальная
  • System.Windows.Forms.Orientation.Vertical — вертикальная
Parent Родительский виджет.
Panel1 Имя виджета, входящего в левую или верхнюю часть элемента разделения окна.
Panel2 Имя виджета, входящего в правую или нижнюю часть элемента разделения окна.

[править]

System.Windows.Forms.MenuStrip — класс главного меню. Синтаксис его создания:

name := new MenuStrip ();

name — имя главного меню.

Свойство Значение
BackColor Цвет фона главного меню.
ForeColor Цвет текста меню.
GripStyle Видим ли объект для перемещения меню, находящийся слева.

  • объект перемещения меню спрятан — System.Windows.Forms.ToolStripGripStyle.Hidden
  • объект перемещения меню виден- System.Windows.Forms.ToolStripGripStyle.Visisble

Ниже a — главное меню.

Процедура Значение
a.Items.Add(k) Добавляет подменю k в главное меню.

[править]

System.Windows.Forms.ToolStripMenuItem — класс подменю. Синтаксис его создания:

name := new ToolStripMenuItem ();

name — имя подменю.

Свойство Значение
BackColor Цвет фона заголовка подменю.
ForeColor Цвет текста заголовка подменю.

Ниже b — подменю.

Процедура Значение
b.DropDownItems.Add(t,i,act) Добавляет пункт в подменю b.

  • t — текст, отображаемый на пункте подменю; i — иконка пункта подменю (чтобы ее не было пишите nil); act — процедура, выполняющаяся при нажатии на этот пункт меню.
  • иконка зугружается следующим образом: new System.Drawing.Bitmap(GetResourceStream(путь_к_изображению))

Форма[править]

System.Windows.Forms.Form — класс формы. Общий синтаксис ее создания:

Свойство Описане
Text Заголовок формы.

Ниже a — форма.

Свойство Описане
a.Controls.Add(виджет) Добавляет виджет на форму.

Курсор[править]

Cursor — объект курсора в Windows Forms.

Свойство Значение
System.Windows.Forms.Cursor.Position.X Позиция курсора по X.
System.Windows.Forms.Cursor.Position.Y Позиция курсора по Y.

Обработка событий[править]

Любая процедура, являющаяся обработчиком события должна иметь вид:

procedure p(sender:object; args:System.EventArgs);
begin
   //тело процедуры
end;

p — имя процедуры.

Стили[править]

Подключить визуальные стили для более красивого отображения виджетов можно так:

Application.EnableVisualStyles;

Примеры программ[править]

  • Вывод сообщения по нажатию кнопки:
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
  
uses System, System.Windows.Forms;
 
var
  f : Form;
  btn : Button;
 
procedure ButtonClick(sender: object; e: EventArgs);
begin
  MessageBox.Show('Hello world!');
end;    
 
begin
  f := new Form;
  btn := new Button;
  btn.Text := 'Click me';
  btn.Click += ButtonClick;
  f.Controls.Add(btn);
  Application.Run(f);
end.

I have a windows forms application with some controls added to the designer. When I want to change something (LIKE) enabling a text box from inside the Form1.cs, I simply use:

textBox1.Enabled = true;

but now I have a separated class called class1.cs.

How could I enable textBox1 from a static function class1.cs?

NOTE: I did not try any code because I am totally clueless about doing this.

Oriol Roma's user avatar

Oriol Roma

3011 gold badge4 silver badges9 bronze badges

asked Oct 19, 2012 at 22:42

Roman Ratskey's user avatar

Roman RatskeyRoman Ratskey

5,0597 gold badges43 silver badges67 bronze badges

3

EDIT: Lot of edit.

public partial class Form1 : Form
{
    // Static form. Null if no form created yet.
    private static Form1 form = null;

    private delegate void EnableDelegate(bool enable);

    public Form1()
    {
        InitializeComponent();
        form = this;
    }

    // Static method, call the non-static version if the form exist.
    public static void EnableStaticTextBox(bool enable)
    {
        if (form != null)
            form.EnableTextBox(enable);
    }

    private void EnableTextBox(bool enable)
    {
        // If this returns true, it means it was called from an external thread.
        if (InvokeRequired)
        {
            // Create a delegate of this method and let the form run it.
            this.Invoke(new EnableDelegate(EnableTextBox), new object[] { enable });
            return; // Important
        }

        // Set textBox
        textBox1.Enabled = enable;
    }
}

answered Oct 19, 2012 at 22:45

LightStriker's user avatar

LightStrikerLightStriker

19.3k3 gold badges23 silver badges27 bronze badges

15

This is just another method:

TextBox t = Application.OpenForms["Form1"].Controls["textBox1"] as TextBox;

answered Aug 11, 2016 at 13:44

vr_driver's user avatar

3

You shouldn’t really change UI controls in your Form from your class1, but instead create a method or a property in class1 that would tell if the textbox should be enabled or not.

Example:

// I changed the name class1 to MySettings
public class MySettings
{
    public bool ShouldTextBoxBeEnabled()
    {
        // Do some logic here.
        return true;
    }

    // More generic
    public static bool SetTextBoxState(TextBox textBox)
    {
        // Do some logic here.
        textBox.Enabled = true;
    }

    // Or static property (method if you like)
    public static StaticShouldTextBoxBeEnabled { get { return true; } }
}

Then in your form:

MySettings settings = new MySettings();
textBox1.Enabled = settings.ShouldTextBoxBeEnabled();

// Or static way
textBox1.Enabled = MySettings.StaticShouldTextBoxBeEnabled;

// Or this way you can send in all textboxes you want to do the logic on.
MySettings.SetTextBoxState(textBox1);

answered Oct 19, 2012 at 22:50

Mario S's user avatar

Mario SMario S

11.6k24 gold badges38 silver badges47 bronze badges

0

You can pass the instance of your Form to the class

 MyForm frm = new MyForm();

 MyClass c = new MyClass(frm);

Then your class can take that instance and access the textbox

 public class MyClass
 {

   public MyClass(MyForm f)
   {
      f.TextBox1.Enabled = false;
   }
 }

The design does not look OK

It is better to call the class in your form and based on the value returned, manipulate the textbox

//MyForm Class

 MyClass c = new MyClass();
 c.DoSomethings();
 if(c.getResult() == requiredValue)
   textBox1.enabled = true;
 else
   textBox1.enabled = false;

//MyForm Class ends here

UPDATE

public class Class1
{
   public static int SomeFunction()
   {
      int result = 1;
      return result;
   }

   public static void SomeFunction(out int result)
   {
      result = 1;
   }
}

Usage

if(Class1.SomeFunction() == 1)
   textBox1.Enabled = true;
else
   textBox1.Enabled = false;

OR

int result = 0;
Class1.SomeFunction(out result);

if(result == 1)
   textBox1.Enabled = true;
else
   textBox1.Enabled = false;

answered Oct 19, 2012 at 22:50

codingbiz's user avatar

codingbizcodingbiz

25.9k8 gold badges55 silver badges94 bronze badges

3

You could let your class1 have an event to enable the Textbox.

public class Class1
{
  public event Action<object, EventArgs> subscribe ;
  private void raiseEvent()
  {
     var handler = subscribe ;
     if(handler!=null)
     {
        handler(this,EventArgs.Empty);//Raise the enable event.
     }
  }
}

Let the class containing the TextBox subscribe to it somehow. In TextBox wrapper class

 public class TextBoxWrapper
       public void EnablePropertyNotification(object sender, EventArgs args) 
       {
          TextBox1.Enabled = true ; //Enables textbox when event is raised.
       }
       public TextBoxWrapper()
       {
         class1Instance.subscribe+=EnablePropertyNotification ;
       }

answered Oct 19, 2012 at 22:50

Lews Therin's user avatar

Lews TherinLews Therin

10.9k4 gold badges46 silver badges71 bronze badges

4

To access/modify a Form Element property, just write this in your outside Class.

Form1.ActiveForm.Controls["textBox1"].Enabled = true;

Where textBox1 is the variable name of TextBox.

What this actually does: Gets the active Form object’s control specified by the name in string.

WARNING: Active form means the form which is currently open and focused on. If you do something else on your computer, with your minimized WindowsForm application, the Form1.ActiveForm will not get the form, instead, it will give null, which can lead to errors later. Be careful!

answered Nov 16, 2019 at 15:36

Ali Sajjad's user avatar

Ali SajjadAli Sajjad

2,94325 silver badges35 bronze badges

based on the answer from @vr_driver you can do that to avoid problems with other containers like groupbox, panels…

TextBox t = Application.OpenForms["Form1"].Controls.Find("textBox1", true)[0] as TextBox;

answered Oct 16, 2020 at 19:35

AlejandroAlis's user avatar

1

In this example you have a form called Main.cs and a class called MyClass:

In MyClass (Note: the name of my Form Class = ‘Main’):

Main ui = new Main();
ui.toolStripProgressBarStickers.PerformStep();

In (FormName).Designer.cs so in my case Main.designer.cs change the appropriate control from ‘private’ to ‘public’:

public System.Windows.Forms.ToolStripProgressBar toolStripProgressBarStickers;

This solved it for me.
Thanks, Ensai Tankado

answered Apr 23, 2021 at 11:46

Dikkie Dik's user avatar

I had to do this at work and didn’t find that any of these answers matched what I ended up doing, so I’m showing how I made it work.

First, initialize a copy of your class in your load event.

NameOfClass newNameofClass;

Then you want to bind to your class (in the load event):

textBox1.DataBindings.Add(new Binding("Enabled", newNameofClass, "textBox1Enabled"));

In your class, do the following:

private bool textBox1Enabled = false;
public bool TextBox1Enabled
{
    get
        {
            return textBox1Enabled;
        }
        set
        {
            textBox1Enabled = value;
        }
}
  • The false setting will initialize your textbox to being disabled
  • Set textBox1Enabled to true if you want to enable by default.
  • If you have other logic to enable/disable the textbox, simply modify the value of textBox1Enabled accordingly.

answered Oct 3, 2018 at 18:36

noel's user avatar

noelnoel

3833 silver badges17 bronze badges

Very easy:

Create an Instance of your Form Object where want to access the Elements from.

Form1 ui = new Form1();

and now change the Form Elements to «public» — like this in the Designer Code:

...
public System.Windows.Forms.TextBox textBox6;
...

Now you can access them like this in your Code:

ui.textBox6 ...

Dharman's user avatar

Dharman

29.3k21 gold badges80 silver badges131 bronze badges

answered Mar 25, 2021 at 21:18

Ensai Tankado's user avatar

I had the same problem. I used windows forms & Visual Studio to generate a UI in a utility with textbox, checkbox, and button controls but ALL the code was in the same class.

I’m rewriting the utility now that I know «more» OOP concepts and created actual objects and separate classes. I too had problems getting the separate classes to be able to access the form controls and any shared methods that are in the form class. I tried the various suggestions in this thread as well as other threads but none of those solutions worked for me.

What worked for me (not sure if its the right thing to do or not) was I had each class that needed to access the controls and forms methods inherit from the Form.
Here is the relevant part of the Form.cs file:

namespace Utility
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void WriteNote(string noteText, bool asHeading = false)
        {
            //Writes Messages to the Message box in the UI
            Font font1 = new Font(this.ResultsTB.Font, FontStyle.Bold);
            Font font2 = new Font(this.ResultsTB.Font, FontStyle.Regular);
            if (asHeading)
                this.ResultsTB.Font = font1;
            else
                this.ResultsTB.Font = font2;
            this.ResultsTB.AppendText(noteText + "rn");
        }

My Form contains a textbox called DirTB and a method called «WriteNote» that writes info to another textbox called ResultsTB. Here is the class (at least as far down as the first successful call of the WriteNote method from the Form:

namespace Utility
{
    public class AppServerDTO : Form1
    {
        #region App Server attributes
//attributes listed here
        #endregion App Server attributes

        #region AppServerDTO Constructor
        public AppServerDTO()
        {
            //These methods verify and set all the attributes
            VerifyInstallFolder();
        }//end of constructor AppServer
        #endregion AppServerDTO Constructor

        #region AppServerDTO class methods 

        public void VerifyInstallFolder()
        {
            string keypath = string.Empty;
            string locationVerification = DirTB.Text + @"SomeText";
            for (int i = 0; i < 4; i++) //allows 3 attempts to get the install folder right
            {
                if (Directory.Exists(locationVerification))
                {
                    i = 4;//Kills the loop
                }
                else if (!Directory.Exists(locationVerification))
                {
                    locationVerification = DirTB.Text + @"SomeMoreText";
                }
                else if (!Directory.Exists(locationVerification))
                {
                    WriteNote("The directory listed in the Install Directoy box is not reachable.");
                    WriteNote("Please select the correct directory.");
                    WriteNote("The correct directory is the folder that contains the ApplicationUpdates & UpdateManager folders.");
                    WriteNote(@"i.e. C:Somewhere or D:SomeplaceSomewhere");
                    var folderpath = FolderPrompt(@"C:");
                    DirTB.Text = folderpath; //updates the install folder textbox to the new location
                    keypath = folderpath;
                    i++;
                }
            }//end for loop

        }//end VerifyInstallFolder

As long as you are very careful with what you mark as public vs private, it should be ok.

answered Sep 22, 2022 at 0:21

MariaNex's user avatar

MariaNexMariaNex

31 silver badge4 bronze badges

This is how you should do :
I wrote the code below in my form class :

public static Form1 form = null;

    private delegate void SetImageDelegate(Image image);

    public Form1()
    {
        InitializeComponent();
        form = this;
    }

    public static void SetStaticImage(Image image)
    {
        if (form != null)
            form.pic1.Image = image;
    }

    private void setImage(Image img)
    {
        // If this returns true, it means it was called from an external thread.
        if (InvokeRequired)
        {
            // Create a delegate of this method and let the form run it.
            this.Invoke(new SetImageDelegate(setImage), new object[] { img });
            return; // Important
        }

        // Set textBox
        pic1.Image = img;
    }

and the code below should be in anouther class :

Form1 frm= Form1.form;
frm.pic1.Image = image;

Note that i changed private static Form1 form = null; to public static Form1 form = null;

Good Luck … Written by Hassan Eskandari :)

answered Dec 1, 2014 at 8:33

Hassan Eskandari's user avatar

I have a windows forms application with some controls added to the designer. When I want to change something (LIKE) enabling a text box from inside the Form1.cs, I simply use:

textBox1.Enabled = true;

but now I have a separated class called class1.cs.

How could I enable textBox1 from a static function class1.cs?

NOTE: I did not try any code because I am totally clueless about doing this.

Oriol Roma's user avatar

Oriol Roma

3011 gold badge4 silver badges9 bronze badges

asked Oct 19, 2012 at 22:42

Roman Ratskey's user avatar

Roman RatskeyRoman Ratskey

5,0597 gold badges43 silver badges67 bronze badges

3

EDIT: Lot of edit.

public partial class Form1 : Form
{
    // Static form. Null if no form created yet.
    private static Form1 form = null;

    private delegate void EnableDelegate(bool enable);

    public Form1()
    {
        InitializeComponent();
        form = this;
    }

    // Static method, call the non-static version if the form exist.
    public static void EnableStaticTextBox(bool enable)
    {
        if (form != null)
            form.EnableTextBox(enable);
    }

    private void EnableTextBox(bool enable)
    {
        // If this returns true, it means it was called from an external thread.
        if (InvokeRequired)
        {
            // Create a delegate of this method and let the form run it.
            this.Invoke(new EnableDelegate(EnableTextBox), new object[] { enable });
            return; // Important
        }

        // Set textBox
        textBox1.Enabled = enable;
    }
}

answered Oct 19, 2012 at 22:45

LightStriker's user avatar

LightStrikerLightStriker

19.3k3 gold badges23 silver badges27 bronze badges

15

This is just another method:

TextBox t = Application.OpenForms["Form1"].Controls["textBox1"] as TextBox;

answered Aug 11, 2016 at 13:44

vr_driver's user avatar

3

You shouldn’t really change UI controls in your Form from your class1, but instead create a method or a property in class1 that would tell if the textbox should be enabled or not.

Example:

// I changed the name class1 to MySettings
public class MySettings
{
    public bool ShouldTextBoxBeEnabled()
    {
        // Do some logic here.
        return true;
    }

    // More generic
    public static bool SetTextBoxState(TextBox textBox)
    {
        // Do some logic here.
        textBox.Enabled = true;
    }

    // Or static property (method if you like)
    public static StaticShouldTextBoxBeEnabled { get { return true; } }
}

Then in your form:

MySettings settings = new MySettings();
textBox1.Enabled = settings.ShouldTextBoxBeEnabled();

// Or static way
textBox1.Enabled = MySettings.StaticShouldTextBoxBeEnabled;

// Or this way you can send in all textboxes you want to do the logic on.
MySettings.SetTextBoxState(textBox1);

answered Oct 19, 2012 at 22:50

Mario S's user avatar

Mario SMario S

11.6k24 gold badges38 silver badges47 bronze badges

0

You can pass the instance of your Form to the class

 MyForm frm = new MyForm();

 MyClass c = new MyClass(frm);

Then your class can take that instance and access the textbox

 public class MyClass
 {

   public MyClass(MyForm f)
   {
      f.TextBox1.Enabled = false;
   }
 }

The design does not look OK

It is better to call the class in your form and based on the value returned, manipulate the textbox

//MyForm Class

 MyClass c = new MyClass();
 c.DoSomethings();
 if(c.getResult() == requiredValue)
   textBox1.enabled = true;
 else
   textBox1.enabled = false;

//MyForm Class ends here

UPDATE

public class Class1
{
   public static int SomeFunction()
   {
      int result = 1;
      return result;
   }

   public static void SomeFunction(out int result)
   {
      result = 1;
   }
}

Usage

if(Class1.SomeFunction() == 1)
   textBox1.Enabled = true;
else
   textBox1.Enabled = false;

OR

int result = 0;
Class1.SomeFunction(out result);

if(result == 1)
   textBox1.Enabled = true;
else
   textBox1.Enabled = false;

answered Oct 19, 2012 at 22:50

codingbiz's user avatar

codingbizcodingbiz

25.9k8 gold badges55 silver badges94 bronze badges

3

You could let your class1 have an event to enable the Textbox.

public class Class1
{
  public event Action<object, EventArgs> subscribe ;
  private void raiseEvent()
  {
     var handler = subscribe ;
     if(handler!=null)
     {
        handler(this,EventArgs.Empty);//Raise the enable event.
     }
  }
}

Let the class containing the TextBox subscribe to it somehow. In TextBox wrapper class

 public class TextBoxWrapper
       public void EnablePropertyNotification(object sender, EventArgs args) 
       {
          TextBox1.Enabled = true ; //Enables textbox when event is raised.
       }
       public TextBoxWrapper()
       {
         class1Instance.subscribe+=EnablePropertyNotification ;
       }

answered Oct 19, 2012 at 22:50

Lews Therin's user avatar

Lews TherinLews Therin

10.9k4 gold badges46 silver badges71 bronze badges

4

To access/modify a Form Element property, just write this in your outside Class.

Form1.ActiveForm.Controls["textBox1"].Enabled = true;

Where textBox1 is the variable name of TextBox.

What this actually does: Gets the active Form object’s control specified by the name in string.

WARNING: Active form means the form which is currently open and focused on. If you do something else on your computer, with your minimized WindowsForm application, the Form1.ActiveForm will not get the form, instead, it will give null, which can lead to errors later. Be careful!

answered Nov 16, 2019 at 15:36

Ali Sajjad's user avatar

Ali SajjadAli Sajjad

2,94325 silver badges35 bronze badges

based on the answer from @vr_driver you can do that to avoid problems with other containers like groupbox, panels…

TextBox t = Application.OpenForms["Form1"].Controls.Find("textBox1", true)[0] as TextBox;

answered Oct 16, 2020 at 19:35

AlejandroAlis's user avatar

1

In this example you have a form called Main.cs and a class called MyClass:

In MyClass (Note: the name of my Form Class = ‘Main’):

Main ui = new Main();
ui.toolStripProgressBarStickers.PerformStep();

In (FormName).Designer.cs so in my case Main.designer.cs change the appropriate control from ‘private’ to ‘public’:

public System.Windows.Forms.ToolStripProgressBar toolStripProgressBarStickers;

This solved it for me.
Thanks, Ensai Tankado

answered Apr 23, 2021 at 11:46

Dikkie Dik's user avatar

I had to do this at work and didn’t find that any of these answers matched what I ended up doing, so I’m showing how I made it work.

First, initialize a copy of your class in your load event.

NameOfClass newNameofClass;

Then you want to bind to your class (in the load event):

textBox1.DataBindings.Add(new Binding("Enabled", newNameofClass, "textBox1Enabled"));

In your class, do the following:

private bool textBox1Enabled = false;
public bool TextBox1Enabled
{
    get
        {
            return textBox1Enabled;
        }
        set
        {
            textBox1Enabled = value;
        }
}
  • The false setting will initialize your textbox to being disabled
  • Set textBox1Enabled to true if you want to enable by default.
  • If you have other logic to enable/disable the textbox, simply modify the value of textBox1Enabled accordingly.

answered Oct 3, 2018 at 18:36

noel's user avatar

noelnoel

3833 silver badges17 bronze badges

Very easy:

Create an Instance of your Form Object where want to access the Elements from.

Form1 ui = new Form1();

and now change the Form Elements to «public» — like this in the Designer Code:

...
public System.Windows.Forms.TextBox textBox6;
...

Now you can access them like this in your Code:

ui.textBox6 ...

Dharman's user avatar

Dharman

29.3k21 gold badges80 silver badges131 bronze badges

answered Mar 25, 2021 at 21:18

Ensai Tankado's user avatar

I had the same problem. I used windows forms & Visual Studio to generate a UI in a utility with textbox, checkbox, and button controls but ALL the code was in the same class.

I’m rewriting the utility now that I know «more» OOP concepts and created actual objects and separate classes. I too had problems getting the separate classes to be able to access the form controls and any shared methods that are in the form class. I tried the various suggestions in this thread as well as other threads but none of those solutions worked for me.

What worked for me (not sure if its the right thing to do or not) was I had each class that needed to access the controls and forms methods inherit from the Form.
Here is the relevant part of the Form.cs file:

namespace Utility
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void WriteNote(string noteText, bool asHeading = false)
        {
            //Writes Messages to the Message box in the UI
            Font font1 = new Font(this.ResultsTB.Font, FontStyle.Bold);
            Font font2 = new Font(this.ResultsTB.Font, FontStyle.Regular);
            if (asHeading)
                this.ResultsTB.Font = font1;
            else
                this.ResultsTB.Font = font2;
            this.ResultsTB.AppendText(noteText + "rn");
        }

My Form contains a textbox called DirTB and a method called «WriteNote» that writes info to another textbox called ResultsTB. Here is the class (at least as far down as the first successful call of the WriteNote method from the Form:

namespace Utility
{
    public class AppServerDTO : Form1
    {
        #region App Server attributes
//attributes listed here
        #endregion App Server attributes

        #region AppServerDTO Constructor
        public AppServerDTO()
        {
            //These methods verify and set all the attributes
            VerifyInstallFolder();
        }//end of constructor AppServer
        #endregion AppServerDTO Constructor

        #region AppServerDTO class methods 

        public void VerifyInstallFolder()
        {
            string keypath = string.Empty;
            string locationVerification = DirTB.Text + @"SomeText";
            for (int i = 0; i < 4; i++) //allows 3 attempts to get the install folder right
            {
                if (Directory.Exists(locationVerification))
                {
                    i = 4;//Kills the loop
                }
                else if (!Directory.Exists(locationVerification))
                {
                    locationVerification = DirTB.Text + @"SomeMoreText";
                }
                else if (!Directory.Exists(locationVerification))
                {
                    WriteNote("The directory listed in the Install Directoy box is not reachable.");
                    WriteNote("Please select the correct directory.");
                    WriteNote("The correct directory is the folder that contains the ApplicationUpdates & UpdateManager folders.");
                    WriteNote(@"i.e. C:Somewhere or D:SomeplaceSomewhere");
                    var folderpath = FolderPrompt(@"C:");
                    DirTB.Text = folderpath; //updates the install folder textbox to the new location
                    keypath = folderpath;
                    i++;
                }
            }//end for loop

        }//end VerifyInstallFolder

As long as you are very careful with what you mark as public vs private, it should be ok.

answered Sep 22, 2022 at 0:21

MariaNex's user avatar

MariaNexMariaNex

31 silver badge4 bronze badges

This is how you should do :
I wrote the code below in my form class :

public static Form1 form = null;

    private delegate void SetImageDelegate(Image image);

    public Form1()
    {
        InitializeComponent();
        form = this;
    }

    public static void SetStaticImage(Image image)
    {
        if (form != null)
            form.pic1.Image = image;
    }

    private void setImage(Image img)
    {
        // If this returns true, it means it was called from an external thread.
        if (InvokeRequired)
        {
            // Create a delegate of this method and let the form run it.
            this.Invoke(new SetImageDelegate(setImage), new object[] { img });
            return; // Important
        }

        // Set textBox
        pic1.Image = img;
    }

and the code below should be in anouther class :

Form1 frm= Form1.form;
frm.pic1.Image = image;

Note that i changed private static Form1 form = null; to public static Form1 form = null;

Good Luck … Written by Hassan Eskandari :)

answered Dec 1, 2014 at 8:33

Hassan Eskandari's user avatar

Понравилась статья? Поделить с друзьями:
  • Работа с жесткими дисками в windows 10 объединить диски
  • Работа с драйверами для ft232rl под ос windows
  • Работа с документами скачать бесплатно для windows 10
  • Путь к панели управления windows 10
  • Работа с usb устройствами в windows