Приветствую всех, сегодня напишем программу секундомер, на основе паттерна MVP. Данный урок так же позволит вам лучше понять и усвоит материал по событиям. Так как паттерн mvp построен на основе событийной модели.
Для начала нам надо создать проект WindowsForm, назовите его как хотите, у меня имя проекта StopWatch. Разместите на главной форме три кнопки и переименуйте их так что бы у вас было похоже как на рисунке, так же ниже кнопок расположите TextBox. Не обходимо еще добавить компонент Timer и установить ему интервал в 1000 миллисекунд, так же изменит доступ на public это же надо сделать и с TextBox.
Далее нам необходимо создать 2 класса это Model в этом классе у нас будет храниться значения переменной времени. И класс Presenter в котором будет происходить взаимодействие с классом формы и Model, а так же реализована логика программы. Класса View с таким именем нет, у нас он Form1 заменяет его. И так для начало создадим события по клику на кнопки с формы.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
}
}
В конструкторе формы создаем экземпляр класса Presenter и передаем ему ссылку Form1. Теперь создадим события Start Stop Reset и перевызовим и с параметрами в событий на кнопках. В итоге у нас должно получить вот так:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
new Presenter(this);
}
public event EventHandler Start;
public event EventHandler Stop;
public event EventHandler Reset;
private void button1_Click(object sender, EventArgs e)
{
Start(sender,e);
}
private void button2_Click(object sender, EventArgs e)
{
Stop(sender,e);
}
private void button3_Click(object sender, EventArgs e)
{
Reset(sender, e);
}
}
Теперь перейдем к классу Model здесь заведем переменную хранящую время в секундах и метод который будет вызываться каждую секунду и возвращать значения с переменной.
class Model
{
internal int s;
public string Time()
{
s++;
return (s >= 60)? "мин. "+s/60+" сек. "+s%60 :s.ToString();
}
}
Теперь перейдем к классу Presenter в котором будет происходить логика программы:
class Presenter
{
private readonly Form1 view;
Model model;
public Presenter(Form1 form1)
{
model = new Model();
view = form1;
view.Start += View_Start;
view.Stop += View_Stop;
view.Reset += View_Reset;
view.timer1.Tick += TimerTick;
view.timer1.Start();
view.timer1.Enabled = false;
}
private void TimerTick(object sender, EventArgs e)
{
view.textBox1.Text=model.Time();
}
private void View_Reset(object sender, EventArgs e)
{
model.s = 0;
view.timer1.Stop();
view.textBox1.Text = "0";
}
private void View_Stop(object sender, EventArgs e)
{
view.timer1.Stop();
view.timer1.Enabled = false;
}
private void View_Start(object sender, EventArgs e)
{
view.timer1.Start();
view.timer1.Enabled = true;
}
}
На этом завершили создание нашего приложения, по ссылке ниже можете скачать мою версию программы:
