Pomodoro Tekniğiyle Kronometre Yapımı C#

Herkese merhaba! Uzun süredir sayısal analiz yazılarına zaman ayırdık. Bugün biraz uygulama geliştirme zamanı diyelim. Bana göre çalışmalarda pomodoro oldukça etkili bir yöntem. Bu yüzden bende neden pomodoro tekniğiyle kronometre geliştirimini C# kullanarak yapmayalım diye düşündüm 🙂 Aslında bakarsınız C# üzerinde kronometre yapımı oldukça kolay biz buna bir de pomodoro güncellemesi getiriyor olacağız 🙂 O zaman hadi visual studiolarınızda C# windows form proje isminizi verin, pomodoro bilen kronometre , tamam tamam siz daha iyi bir isim bulabilirsiniz 🙂

Beni en çok motive eden şey kendi kullanabildiğim uygulamaları yazmak oldu. Sırf bunun için iki satır android studio kodu öğrenip kendime telefonda hesap makinesi yapmıştım. Aynı durum bilgisayar uygulamaları içinde geçerli. Bana göre windows üzerinde uygulama geliştirmesi açısından en güzel ve zevkli dil C#. Bunun en büyük sebebi de DevExspresstir. Sağladığı araçlar gerçekten çok fazla. Eğer C# diline hakimseniz kesinlikle DevExpress kurmanızı öneririm. Bu sayede form uygulamalarınızdaki görsel güzelliği arttırabilirsiniz. Nasıl edinebilirim derseniz internet üzerinde birçok crack dosyasını bulabilirsiniz. Veya direkt satın alarak profesyonel sürümünü de kullanabilirsiniz.

Bugün geliştireceğimiz bu uygulama aslında benim bir ihtiyacım doğrultusunda ortaya çıktı. Ben çalışırken pomodoro tekniğine uyarak çalışmaya dikkat ediyorum. Ve bazen telefondan açtığım sayacı unutabiliyorum. Uzun lafın kısası bununla ilgili bir uygulama yapmak istedim. Kesinlikle takip etmenizi önerdiğim Sen de kod yaz youtube kanalında bu uygulamanın geliştirildiğini gördüm. Küçük değişiklikler yaparak bugün bu uygulamayı geliştireceğiz. Haydi başlayalım 🙂


Uygulamada yapacaklarımız

Öncelikle uygulamamız bir kronometre görevi görecek. Fakat pomodoro tekniğinin isterlerine sahip olacak. Yani sayacı başlattığımızda 25 dakika olana kadar normal bir kronometre gibi sayım yapacak. Dakika 25’e geldiğinde ise sayaç duracak ve bir seansın tamamlandığını söyleyecek. Ardından bize 5 dakikalık mola süresini başlatıp başlatmamamız hakkında mesaj gelecek. Seçtiğimiz işleme göre uygulamamız devam edecek. Hemen form tasarımımızı yapalım ve ardından kodumuzun üstüne konuşalım.


Form Tasarımı

Ben aşağıdaki formu tasarladım. Biraz daha kod kısmına ağırlık vermeyi tercih ettim. Bu uygulamada en önemli nokta form araçlarından “Timer” aracını kullanmayı bilmeliyiz. Bu araç sayesinde geçen zamanı hesaplayıp ekranda “__________” şeklinde belirtilen yerlere yazdırabiliyoruz.

Kronometre Uygulaması Form 1.1
Kronometre Uygulaması Form 1.1

Tasarımımızı yaptığımıza göre kodlama bölümüne geçebiliriz.


Kodlama Bölümü

Bir önceki yazıdan yola çıkarak tüm kodları açıklamak yerine takılabileceğiniz kısımları açıklamayı tercih edeceğim. Ve kodu parçalayarak izah etmeye çalışacağım. Zaten bu projenin kaynak kodlarını yine drive linki ile paylaşacağım. Hadi vakit kaybetmeden başlayalım 🙂

Bu Projenin Kaynak Kodlarını Buradan İndirebilirsiniz!

Öncelikle inceleyeceğimiz kodun tamamına bir bakalım

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 KronometreYapımı
{
    public partial class Form1 : Form
    {
        int dakika = 0, saniye = 0, salise = 0;
        bool molaVaktiMi = false;
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start(); timer2.Start(); timer3.Start();
            button1.Enabled = false;
            button2.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            dakika++;
            label4.Text = dakika.ToString();
            
            if(molaVaktiMi == false && dakika == 25)
            {
                timer1.Stop(); timer2.Stop(); timer3.Stop();
                MessageBox.Show("Tebrikler ! Pomodoro'da bir seansı başarıyla tamamladın!", "Tebrikler!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                if(MessageBox.Show("5 Dakikalık Mola sayacını başlatmamı ister misin?","Mola Vakti",MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    molaVaktiMi = true;
                    button3.PerformClick();
                    button1.PerformClick();
                }
                else
                {
                    if(MessageBox.Show("Sayacı tekrardan başlatman ister misin? (Aksi takdirde uygulamadan çıkış yapılacaktır!)", "Soru", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        Application.Restart();
                    }
                    else
                    {
                        MessageBox.Show("Uygulamadan Çıkış Yapılıyor..", "Çıkış", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        Application.Exit();
                    }
                }
            }
            if(molaVaktiMi == true && dakika == 5)
            {
                timer1.Stop(); timer2.Stop(); timer3.Stop();
                MessageBox.Show("Mola Süren doldu!", "Bilgilendirme!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                if (MessageBox.Show("Pomodoro'da yeni bir seansı başlatmak ister misin? (Aksi takdirde uygulamadan çıkış yapılacaktır!)", "Mola Vakti", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Application.Restart();
                }
                else
                {
                    MessageBox.Show("Uygulamadan Çıkış Yapılıyor..", "Çıkış", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    Application.Exit();
                }
            }
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            if(saniye == 59)
            {
                saniye = 0;
            }
            saniye++;
            label5.Text = saniye.ToString();
           
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            if(salise == 59)
            {
                salise = 0;
            }
            salise++;
            label6.Text = salise.ToString();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop(); timer2.Stop(); timer3.Stop();
            button2.Enabled = false;
            button1.Enabled = true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            timer1.Stop(); timer2.Stop(); timer3.Stop();
            button1.Enabled = true;
            button2.Enabled = false;
            label4.Text = "______";
            label5.Text = "______";
            label6.Text = "______";
            dakika = 0;
            saniye = 0;
            salise = 0;
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 60000;
            timer2.Interval = 1000;
            timer3.Interval = 10;
            button2.Enabled = false;
        }
    }
}

Şimdi sırasıyla bakalım.

int dakika = 0, saniye = 0, salise = 0;
bool molaVaktiMi = false;

En başta gördüğümüz bu iki satır tüm fonksiyon bloklarının dışında yani class’ımızın bir özelliği gibi tanımladık. Formumuzda gördüğünüz üzere 3 adet değişken tutuyorduk. Bunlar sırasıyla dakika saniye ve salise. Öncelikle üç butonumuza tanımladığımız işlemlere bakalım ardından bu dakika, saniye ve salise kavramlarını nasıl kullandığımızı inceleyelim.


~ Button Kodları ~
 private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start(); timer2.Start(); timer3.Start();
            button1.Enabled = false;
            button2.Enabled = true;
        }

Butonlarımız ise “Başla,Duraklat,Sıfırla” sırasıyla “button1,button2,button3” şeklinde tanımlanmıştır. “Başla” butonu için oluşturduğumuz bu bölümde yukarıda sırasıyla yazdığımız dakika saniye ve salise değerlerini temsil eden timer araçlarını başlatıyoruz. Ve başlat butonuna bastıktan sonra, pasif durumda olan “Duraklat” butonunu aktif hale getiriyoruz. Başlangıçta aktif olan “Başla” butonunu ise pasif hale getiriyoruz.


private void button2_Click(object sender, EventArgs e)
        {
            timer1.Stop(); timer2.Stop(); timer3.Stop();
            button2.Enabled = false;
            button1.Enabled = true;
        }

Yukarıdakinin tam tersini ise button2 yani “Duraklat” butonu için yazıyoruz. Başlat butonu için yazdığımız tüm özellikleri tersine alıyoruz da diyebiliriz.


private void button3_Click(object sender, EventArgs e)
        {
            timer1.Stop(); timer2.Stop(); timer3.Stop();
            button1.Enabled = true;
            button2.Enabled = false;
            label4.Text = "______";
            label5.Text = "______";
            label6.Text = "______";
            dakika = 0;
            saniye = 0;
            salise = 0;
        }

Son olarak “Sıfırla” butonumuzu inceleyelim. Yine “Duraklat” butonundaki gibi timer araçlarını durduruyoruz. Ardından “Başla” butonunu aktif hale getirip, “Duraklat” butonunu pasif hale getiriyoruz. Ve formda bulunan “Dakika: ______” şeklinde gördüğünüz “_________” olan labelları eski haline döndürüyoruz. Son olarak ise dakika saniye ve salise değişkenlerimizi sıfıra eşitliyoruz.


~ Timer_Tick Kodları~

Timer araçlarımızın tick eventine yazdığımız kodlara geçmeden önce formun load bölümünde yaptığımız tanımlamaya değinmek istiyorum.

 private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 60000;
            timer2.Interval = 1000;
            timer3.Interval = 10;
            button2.Enabled = false;
        }

Burada görmüş olduğunuz tanımlamalar aslında geçen süreyi temsil etmekte. Örneğin “timer1.Interval = 60000;” tanımlamasında timer1’in 1 artması için geçmesi gerek süreyi tanımlamış oluyoruz. Timer nesnesinde interval ile tanımlama yaparken 1000tick = 1 saniyeye denk gelmekte. Bu yüzden bir dakika geçmesi için “1 dakika = 60 sn = 60000 tick” şeklinde olacaktır. Şimdi sırasıyla timer_tick event’larının kodlarını inceleyelim.


private void timer1_Tick(object sender, EventArgs e)
        {
            dakika++;
            label4.Text = dakika.ToString();
            
            if(molaVaktiMi == false && dakika == 25)
            {
                timer1.Stop(); timer2.Stop(); timer3.Stop();
                MessageBox.Show("Tebrikler ! Pomodoro'da bir seansı başarıyla tamamladın!", "Tebrikler!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                if(MessageBox.Show("5 Dakikalık Mola sayacını başlatmamı ister misin?","Mola Vakti",MessageBoxButtons.YesNo,MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    molaVaktiMi = true;
                    button3.PerformClick();
                    button1.PerformClick();
                }
                else
                {
                    if(MessageBox.Show("Sayacı tekrardan başlatman ister misin? (Aksi takdirde uygulamadan çıkış yapılacaktır!)", "Soru", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        Application.Restart();
                    }
                    else
                    {
                        MessageBox.Show("Uygulamadan Çıkış Yapılıyor..", "Çıkış", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        Application.Exit();
                    }
                }
            }
            if(molaVaktiMi == true && dakika == 5)
            {
                timer1.Stop(); timer2.Stop(); timer3.Stop();
                MessageBox.Show("Mola Süren doldu!", "Bilgilendirme!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                if (MessageBox.Show("Pomodoro'da yeni bir seansı başlatmak ister misin? (Aksi takdirde uygulamadan çıkış yapılacaktır!)", "Mola Vakti", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    Application.Restart();
                }
                else
                {
                    MessageBox.Show("Uygulamadan Çıkış Yapılıyor..", "Çıkış", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    Application.Exit();
                }
            }
        }

Kodumuzun neredeyse yarısını oluşturan dakikayı temsil eden timer aracının Tick eventine bakalım. Formumuzun load bölümünde tanımladığımız 60000tick gerçekleştiği anda dakika sayacımızı 1 arttırıyoruz. Ve bunu “Dakika: 1” olacak şekilde yazdırmış oluyoruz. Burada 2 adet birbirinden bağımsız if yapısı görüyoruz. İlk if yapımızda eğer molaVaktiMi değerimiz false ise VE dakika değerimiz 25’e eşitlendiyse bu if bloğumuz çalışıyor. İçerisine girince öncelikle tüm sayaçların durdurulduğunu görüyoruz. Ardından bir seansı tamamladığımızı belirtiyor. Bir message.box daha kullanarak “Mola sayacını başlatmamı ister misin?” şeklinde bize soru soruyor (Yes No question şeklinde” ve eğer burada “Yes” butonuna basılırsa “molaVaktiMi” değişkenimizi true yapıyoruz. Ve PerfomClick metodunu kullanarak önce sıfırla butonuna sonrasında da başla butonuna basmış oluyoruz. Eğer “No” butonuna basılırsa pomodoro sayacını tekrardan başlatmak istermisin diye soruyoruz. Burada yeniden Yes,No question ortaya çıkmış oluyor. Eğer “Yes” butonuna basarsa Application.Restart metodunu kullanarak yeniden başlatıyoruz. Eğer “No” butonuna basarsa uygulamamızı kapatıyoruz.

İlk başta belirttiğimiz iki if yapısından diğerinde ise molaVaktiMi değişkenimizi tekrardan false yapmak için kullanıyoruz. Aslında bu sayede aralarında tek değişkenle basit bir döngüye sokmuş oluyoruz.


private void timer2_Tick(object sender, EventArgs e)
        {
            if(saniye == 59)
            {
                saniye = 0;
            }
            saniye++;
            label5.Text = saniye.ToString();
           
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            if(salise == 59)
            {
                salise = 0;
            }
            salise++;
            label6.Text = salise.ToString();
        }

Timer2 ve timer3 için yazdığımız kodları bir arada inceleyelim istedim çünkü birbirinin aynısı. Saniye ve salise değerlerini her 1 kere döndüğünde 1 arttırıyoruz. Sonrasında da eğer 59 olduysa 0 a eşitliyoruz. Burada kodlarımızı bitiriyoruz.


Son olarak..

Kafa karışıklığı yaratabileceğini düşündüğüm için son kodu bir daha açıklama gereği duydum. Eğer kodları anladıysanız bu bölümü geçebilirsiniz. Neden 60 değil de 59 diye düşünebilirsiniz. Şöyle bir örnek verebilirim. Örneğin sırasıyla dakika, saniye ve salise değerleri 24:59:59 olsun 1 salise geçtiğinde, 1 saniye geçmiş olacak. Aynı zamanda 1 dakika da geçmiş olacak. 25:60:60 şeklinde yazmasını istemediğimiz için eğer 59 olduysa bir diğerinde sıfıra eşitliyoruz.


Uygulamamızı kullanalım 🙂

Emin olun en zevkli kısmı burası bakalım neler yapmışız 🙂

Kronometremizi başlattıktan sonra 25 dakika dolunca
Kronometremizi başlattıktan sonra 25 dakika dolunca
Seans sonunda 5 dakikalık mola sayacını başlatma sorusu geliyor
Seans sonunda 5 dakikalık mola sayacını başlatma sorusu geliyor
Eğer Evete basarsak sayaç otomatik başlıyor ve 5 dakika olunca gelen mesaj
Eğer Evete basarsak sayaç otomatik başlıyor ve 5 dakika olunca gelen mesaj
Molanın sonunda yeni bir seans başlatmak isteyip istemediğimizi soruyor
Molanın sonunda yeni bir seans başlatmak isteyip istemediğimizi soruyor
Eğer başlatmazsak uygulama kapatılıyor
Eğer başlatmazsak uygulama kapatılıyor

Bu şekilde çalışmalarımızda kullanabileceğimiz bir uygulama yapmak istedim. Hem yeni şeyler öğrenip hem de kendiniz kullanabileceğiniz bu uygulamayı mutlaka geliştirmelisiniz. Eğer anlamadığınız takıldığınız bir yer olursa bana ulaşabilirsiniz.

Bir sonraki yazıda görüşünceye dek herkese sağlıklı günler dilerim! ❤