12 Eylül 2012 Çarşamba

C# ile ProgressBar

Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# .NET Framework 4 ile Windows Forms uygulamalarımızda uzun süren işlemlerin ilerlemesini kullanıcıya görsel olarak sunmak için kullandığımız ProgressBar kontrolünü yakından inceleyeceğiz. ProgressBar, bir dosya indirme, bir rapor oluşturma veya bir veritabanı işlemi gibi zaman alıcı görevlerin ne kadarının tamamlandığını göstererek kullanıcı deneyimini iyileştirir. Gelin, ProgressBar'ın temel özelliklerini, metotlarını ve kullanım senaryolarını birlikte keşfedelim.

ProgressBar Kontrolü Nedir?

ProgressBar kontrolü, bir işlemin tamamlanma yüzdesini veya genel ilerlemesini gösteren dikdörtgen bir çubuktur. Çubuğun içindeki dolgu, işlemin ne kadar ilerlediğini görsel olarak temsil eder. Kullanıcılara uygulamanın donmadığı ve bir işlem gerçekleştirdiği hissini vererek bekleme sürelerini daha katlanılabilir hale getirir.

ProgressBar Kontrolünün Temel Özellikleri

ProgressBar kontrolü, ilerleme çubuğunun davranışını ve görünümünü özelleştirmek için basit ama etkili özelliklere sahiptir:

  • Minimum: İlerleme çubuğunun alabileceği en küçük değeri belirler. Genellikle 0 olarak ayarlanır.
  • Maximum: İlerleme çubuğunun alabileceği en büyük değeri belirler. Genellikle 100 olarak ayarlanır, bu da yüzde bazlı ilerleme için idealdir.
  • Value: İlerleme çubuğunun mevcut değerini alır veya ayarlar. Bu değer Minimum ve Maximum arasında olmalıdır.
  • Step: PerformStep() metodu çağrıldığında Value özelliğinin ne kadar artırılacağını belirler.
  • Style: İlerleme çubuğunun görsel stilini belirler.
    • Blocks: Varsayılan stildir. İlerleme, bloklar halinde gösterilir.
    • Continuous: İlerleme, sürekli bir çubuk olarak gösterilir.
    • Marquee: Belirsiz ilerleme durumlarında kullanılır. İlerleme çubuğu içinde sürekli hareket eden bir blok gösterir, bu da bir işlemin devam ettiğini ancak tamamlanma yüzdesinin bilinmediğini belirtir.

ProgressBar Kontrolünün Temel Metotları

ProgressBar kontrolü, ilerlemeyi güncellemek için iki temel metot sunar:

  • PerformStep(): Value özelliğini Step özelliği kadar artırır. Bu metot, ilerlemeyi önceden tanımlanmış adımlarla güncellemek için kullanışlıdır.
  • Increment(int value): Value özelliğini belirtilen value kadar artırır. Bu metot, Step özelliğine bağlı kalmadan değeri doğrudan artırmak istediğimizde kullanılır.

ProgressBar Kullanım Senaryoları

1. Basit Bir İlerleme Gösterme (Manuel Artırma)

Bu örnekte, bir buton tıklamasıyla ProgressBar'ın değerini manuel olarak artıracağız.

using System;
using System.Windows.Forms;
using System.Threading; // Thread.Sleep için

public partial class Form1 : Form
{
    private ProgressBar progressBar1; // Tasarımcıda eklenen ProgressBar bileşeni
    private Button buttonBaslat;     // Tasarımcıda eklenen Başlat butonu

    public Form1()
    {
        InitializeComponent();

        // Tasarımcıda progressBar1 ve buttonBaslat'ın eklenmiş olduğunu varsayalım.

        // ProgressBar'ın minimum ve maksimum değerlerini ayarla
        this.progressBar1.Minimum = 0;
        this.progressBar1.Maximum = 100;
        this.progressBar1.Value = 0; // Başlangıç değeri

        // Butonun Click olayını bağla
        this.buttonBaslat.Click += new EventHandler(buttonBaslat_Click);
    }

    private void buttonBaslat_Click(object sender, EventArgs e)
    {
        this.progressBar1.Value = 0; // Her başlatmada sıfırla
        MessageBox.Show("İşlem başlatıldı. Lütfen bekleyiniz...");

        // Uzun süren bir işlemi simüle edelim
        for (int i = 0; i <= 100; i += 5) // Her adımda 5 birim artır
        {
            this.progressBar1.Value = i; // ProgressBar'ın değerini güncelle
            Thread.Sleep(100); // Küçük bir gecikme ekle (gerçek bir işlem simülasyonu)
            // UI'ın donmaması için (basit durumlarda) DoEvents kullanabiliriz, ancak threading daha iyidir.
            Application.DoEvents(); 
        }

        MessageBox.Show("İşlem tamamlandı!");
        this.progressBar1.Value = 0; // İşlem bitince sıfırla
    }
}
2. PerformStep() Metodu ile İlerleme

Step özelliğini ayarlayarak ve PerformStep() metodunu çağırarak ilerlemeyi daha düzenli bir şekilde yönetebiliriz.

using System;
using System.Windows.Forms;
using System.Threading;

public partial class Form1 : Form
{
    private ProgressBar progressBar1;
    private Button buttonBaslatStep;

    public Form1()
    {
        InitializeComponent();
        this.progressBar1.Minimum = 0;
        this.progressBar1.Maximum = 100;
        this.progressBar1.Value = 0;
        this.progressBar1.Step = 10; // Her PerformStep() çağrıldığında 10 birim artır

        this.buttonBaslatStep.Click += new EventHandler(buttonBaslatStep_Click);
    }

    private void buttonBaslatStep_Click(object sender, EventArgs e)
    {
        this.progressBar1.Value = 0;
        MessageBox.Show("İşlem başlatıldı (PerformStep ile).");

        for (int i = 0; i < 10; i++) // 10 adımda tamamlanacak
        {
            this.progressBar1.PerformStep(); // Value özelliğini Step kadar artır
            Thread.Sleep(200);
            Application.DoEvents();
        }

        MessageBox.Show("İşlem tamamlandı!");
        this.progressBar1.Value = 0;
    }
}
3. Belirsiz İlerleme (Marquee Style)

Eğer bir işlemin tamamlanma yüzdesini önceden bilmiyorsak, Marquee stilini kullanarak kullanıcının işlemin devam ettiğini anlamasını sağlayabiliriz.

using System;
using System.Windows.Forms;
using System.Threading;

public partial class Form1 : Form
{
    private ProgressBar progressBarMarquee; // Marquee stilinde ProgressBar
    private Button buttonBaslatBelirsiz;   // Belirsiz işlemi başlat butonu
    private Button buttonDurdurBelirsiz;   // Belirsiz işlemi durdur butonu
    private Thread arkaPlanThread;         // Arka plan işlemi için thread

    public Form1()
    {
        InitializeComponent();
        this.progressBarMarquee.Style = ProgressBarStyle.Marquee; // Stili Marquee olarak ayarla
        this.progressBarMarquee.MarqueeAnimationSpeed = 30; // Animasyon hızı (milisaniye)
        this.progressBarMarquee.Enabled = false; // Başlangıçta devre dışı

        this.buttonBaslatBelirsiz.Click += new EventHandler(buttonBaslatBelirsiz_Click);
        this.buttonDurdurBelirsiz.Click += new EventHandler(buttonDurdurBelirsiz_Click);
    }

    private void buttonBaslatBelirsiz_Click(object sender, EventArgs e)
    {
        // ProgressBar'ı etkinleştir ve animasyonu başlat
        this.progressBarMarquee.Enabled = true;
        this.progressBarMarquee.Visible = true; // Görünür yap

        // Arka plan thread'ini başlat
        arkaPlanThread = new Thread(new ThreadStart(BelirsizIslem));
        arkaPlanThread.Start();

        this.buttonBaslatBelirsiz.Enabled = false;
        this.buttonDurdurBelirsiz.Enabled = true;
    }

    private void buttonDurdurBelirsiz_Click(object sender, EventArgs e)
    {
        // Arka plan thread'ini durdur (güvenli bir yöntemle)
        if (arkaPlanThread != null && arkaPlanThread.IsAlive)
        {
            // Thread'i güvenli bir şekilde sonlandırmak için bir bayrak kullanmak daha iyidir.
            // Ancak basit örnek için Abort() kullanıyoruz (genellikle önerilmez).
            try
            {
                arkaPlanThread.Abort(); 
            }
            catch (ThreadAbortException)
            {
                // Thread sonlandırıldı
            }
        }
        this.progressBarMarquee.Enabled = false;
        this.progressBarMarquee.Visible = false; // Gizle
        this.buttonBaslatBelirsiz.Enabled = true;
        this.buttonDurdurBelirsiz.Enabled = false;
        MessageBox.Show("Belirsiz işlem durduruldu.");
    }

    private void BelirsizIslem()
    {
        // Uzun süren ve ilerlemesi bilinmeyen bir işlemi simüle et
        try
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(1000); // 1 saniye bekle
                // UI'ı güncellemek için Invoke kullanmalıyız eğer bu bir Windows Forms uygulamasıysa
                if (this.InvokeRequired)
                {
                    this.Invoke((MethodInvoker)delegate { Console.WriteLine("Arka plan işlemi devam ediyor..."); });
                }
                else
                {
                    Console.WriteLine("Arka plan işlemi devam ediyor...");
                }
            }
        }
        catch (ThreadAbortException)
        {
            // Thread sonlandırıldığında bu hata yakalanır
            Console.WriteLine("Arka plan işlemi sonlandırıldı.");
        }
    }

    // Form kapanırken thread'i durdurmayı unutmayın
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (arkaPlanThread != null && arkaPlanThread.IsAlive)
        {
            try
            {
                arkaPlanThread.Abort();
            }
            catch (ThreadAbortException) { }
        }
    }
}

Dikkat Edilmesi Gerekenler

  • UI Donması: ProgressBar'ın değerini güncellediğiniz kod, uygulamanın ana (UI) thread'inde çalışıyorsa ve bu kod uzun sürüyorsa, uygulamanız donacaktır. Bu durumu önlemek için uzun süren işlemleri ayrı bir iş parçacığında (thread) çalıştırmalı ve ProgressBar'ı UI thread'inden güvenli bir şekilde güncellemelisiniz (örneğin, Control.Invoke() veya BackgroundWorker kullanarak). Yukarıdaki Marquee örneğinde basit bir Thread kullanımı gösterilmiştir.
  • Application.DoEvents(): Basit durumlarda, bir döngü içinde Application.DoEvents() çağırarak UI'ın güncellenmesini sağlayabilirsiniz. Ancak bu, karmaşık senaryolarda sorunlara yol açabilir ve genellikle uzun süren işlemler için önerilen bir yöntem değildir. Threading daha sağlam bir çözümdür.
  • Minimum/Maximum Değerler: ProgressBar'ın Value özelliği her zaman Minimum ve Maximum değerleri arasında kalmalıdır. Bu sınırların dışına çıkmaya çalışmak hata fırlatabilir.
---

Evet sevgili Webkolog.net okurları, bu yazımızda C# .NET Framework 4 ile ProgressBar kontrolünün temel özelliklerini, metotlarını ve kullanım senaryolarını detaylı bir şekilde inceledik. ProgressBar, uygulamalarınızda uzun süren işlemlerin ilerlemesini kullanıcıya görsel olarak sunarak daha iyi bir kullanıcı deneyimi sağlar. Özellikle arka plan işlemleriyle birlikte kullanıldığında uygulamanızın daha akıcı ve tepkisel görünmesini sağlar. Umarım bu rehber, C# .NET Framework 4 ile uygulamalar geliştirirken size yardımcı olur. Bir sonraki yazımda, C# dilinin diğer önemli yapı taşlarını keşfetmeye devam edeceğiz. Webkolog.net'i takipte kalın!

Hepinize ilerleme dolu ve başarılı geliştirme süreçleri dilerim!

0 yorum:

Yorum Gönder