Приветствую всех, сегодня напишем программу секундомер, на основе паттерна MVP. Данный урок так же позволит вам лучше понять и усвоит материал по событиям. Так как паттерн mvp построен на основе событийной модели.
Для начала нам надо создать проект WindowsForm, назовите его как хотите, у меня имя проекта StopWatch. Разместите на главной форме три кнопки и переименуйте их так что бы у вас было похоже как на рисунке, так же ниже кнопок расположите TextBox. Не обходимо еще добавить компонент Timer и установить ему интервал в 1000 миллисекунд, так же изменит доступ на public это же надо сделать и с TextBox.
Далее нам необходимо создать 2 класса это Model в этом классе у нас будет храниться значения переменной времени. И класс Presenter в котором будет происходить взаимодействие с классом формы и Model, а так же реализована логика программы. Класса View с таким именем нет, у нас он Form1 заменяет его. И так для начало создадим события по клику на кнопки с формы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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 и перевызовим и с параметрами в событий на кнопках. В итоге у нас должно получить вот так:
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 |
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 здесь заведем переменную хранящую время в секундах и метод который будет вызываться каждую секунду и возвращать значения с переменной.
1 2 3 4 5 6 7 8 9 10 |
class Model { internal int s; public string Time() { s++; return (s >= 60)? "мин. "+s/60+" сек. "+s%60 :s.ToString(); } } |
Теперь перейдем к классу Presenter в котором будет происходить логика программы:
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 |
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; } } |
На этом завершили создание нашего приложения, по ссылке ниже можете скачать мою версию программы: