
oop4_2
.docxМинистерство науки и высшего образования Российской Федерации
Федеральное государственное бюджетное
образовательное учреждение высшего образования
«Уфимский университет науки и технологий»
Факультет информатики и робототехники
Кафедра вычислительной математики и кибернетики
Лабораторная работа №4.2
“MVC”
По дисциплине “Объектно-ориентированное программирование”
Выполнил:
Студент группы ПРО-232Б
Шарипов А.С.
Проверил:
доцент кафедры ВМиК
Котельников В.А.
Уфа-2023
Цель работы:
Реализовать приложение WindowsForms, демонстрирующее работу MVC.
Задание:
Создать простейшее приложение с GUI, содержащее:
три целых числа A, B и C со значением в пределах от 0 до 100;
каждое из чисел должно отображаться и редактироваться в 3 разных
компонентах: в textBox, numericUpDown, trackBar (или аналогичных в других языках), при этом редактирование числа в одном поле должно приводить к изменению отображения этого числа во всех других полях;
второе число всегда должно быть не меньше первого и не больше третьего;
приложение должно сохранять значения чисел между запусками (запоминать при закрытии и восстанавливать значения при открытии);
Разработанное приложение должно быть реализовано в стиле MVC:
хранение трёх чисел должно быть организовано в виде отдельного объекта-модели;
все пересчёты, проверки и сохранение должны выполняться в объекте- модели;
изменение A и C должно реализовывать разрешающее поведение (при
нарушении ограничений порядка модель сама перестраивается, чтобы их выполнить, введённое пользователем значение A и C сохраняется)
изменение B должно реализовывать запрещающее поведение (при нарушении ограничений порядка модель откатывает внесённые пользователем изменения) или ограничивающее поведение (при нарушении ограничений порядка модель корректирует введённое значение так, чтобы оно было как можно ближе к заданному пользователем).
Ход работы:
Внешний вид программы (рис. 1).
Рис 1 – внешний вид формы
На форме числам A, B, C соответствуют расположенным под ними элементами формы (textbox, numericupdown, trackbar). Для чисел A и C реализовано разрешающее поведение, при выходе их значений из условий модели, модель перестраивается до тех пор, пока это возможно (рис. 2 и рис. 3).
Рис 2 – реализация разрешающего поведения для числа A
Рис 3 – реализация разрешающего поведения для C
Для числа B в модели реализовано запрещающее поведение, при попытке выхода за правила установленные моделью все изменения числа B сбрасываются до последних (рис. 4 и рис.5).
Рис 4 – попытка ввода ошибочного Рис 5 – откат B до прошлого значения
значения в B
При закрытии формы, значения A и C сохраняются в программе, и отображаются при следующем запуске (рис. 6 и рис.7).
Рис 6 – форма перед закрытием Рис 7 – форма после открытия
Вывод: в результате выполнения работы были получены навыки работы с MVC, а также создан пример программы, показывающий работу MVC. Репозиторий работы на GitHub: KittenKiller29/oop4_2 (github.com).
Приложение 1
Листинг программы
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 oop4_2
{
public partial class Form1 : Form {
Model model;//объявление модели
public Form1()
{
InitializeComponent();
model = new Model();//инициализация модели
model.observers += new System.EventHandler(this.UpdateFromModel);//подписка на обновления модели
}
private void Form1_Load(object sender, EventArgs e)
{
UpdateFromModel(this, e);
}
private void numericUpDown1_ValueChanged(object sender, EventArgs e)//метод смены значения numeric1
{
model.SetA(Decimal.ToInt32(numericUpDown1.Value));
}//конец метода
private void numericUpDown2_ValueChanged(object sender, EventArgs e)//метод смены значения numeric2
{
model.SetB(Decimal.ToInt32(numericUpDown2.Value));
}//конец метода
private void numericUpDown3_ValueChanged(object sender, EventArgs e)//метод смены значения numeric3
{
model.SetC(Decimal.ToInt32(numericUpDown3.Value));
}//конец метода
private void trackBar1_Scroll(object sender, EventArgs e)//метод смены значения track1
{
model.SetA(trackBar1.Value);
}//конец метода
private void trackBar2_Scroll(object sender, EventArgs e)//метод смены значения track2
{
model.SetB(trackBar2.Value);
}//конец метода
private void trackBar3_Scroll(object sender, EventArgs e)//метод смены значения track3
{
model.SetC(trackBar3.Value);
}//конец метода
private void UpdateFromModel(object sender,EventArgs e)//метод обновления модели
{
textBox1.Text = model.GetA().ToString();
textBox2.Text = model.GetB().ToString();
textBox3.Text = model.GetC().ToString();
numericUpDown1.Value = model.GetA();
numericUpDown2.Value = model.GetB();
numericUpDown3.Value = model.GetC();
trackBar1.Value = model.GetA();
trackBar2.Value = model.GetB();
trackBar3.Value = model.GetC();
}//конец метода
private void textBox1_KeyDown(object sender, KeyEventArgs e)//метод изменения значения tb1
{
if(e.KeyCode==Keys.Enter)
model.SetA(Int32.Parse(textBox1.Text));
}//конец метода
private void textBox2_KeyDown(object sender, KeyEventArgs e)//метод смены значения tb2
{
if (e.KeyCode == Keys.Enter)
model.SetB(Int32.Parse(textBox2.Text));
}//конец метода
private void textBox3_KeyDown(object sender, KeyEventArgs e)//метод смены значени tb3
{
if (e.KeyCode == Keys.Enter)
model.SetC(Int32.Parse(textBox3.Text));
}//конец метода
private void Form1_FormClosing(object sender, FormClosingEventArgs e)//метод сохранения значений A и C при закрытии формы
{
Properties.Settings.Default.value_A = trackBar1.Value;
Properties.Settings.Default.value_C = trackBar3.Value;
Properties.Settings.Default.Save();
}//конец метода
}
class Model//модель
{
private int A, B, C;//объявление элементов модели
public System.EventHandler observers;
public Model()
{
A = Properties.Settings.Default.value_A;
B = 0;
C = Properties.Settings.Default.value_C;
}
public int GetA()//геттер для А
{
return A;
}//конец метода
public int GetB()//геттер для B
{
return B;
}//конец метода
public int GetC()//геттер для С
{
return C;
}//конец метода
public void SetA(int a)//сеттер для А
{
if (a>C)
{
observers.Invoke(this, null);
return;
}
if (a > B && a <= C)
B = a;
A = a;
observers.Invoke(this, null);
}//конец метода
public void SetB(int b)//сеттер для В
{
if (b > C || b < A)
{
observers.Invoke(this, null);
return;
}
B = b;
observers.Invoke(this, null);
}//конец метода
public void SetC(int c)//сеттер для С
{
if (c < A)
{
observers.Invoke(this, null);
return;
}
if (c<B)
B = c;
C = c;
observers.Invoke(this, null);
}//конец метода
}
}