Öncelikle Visual Studio IDE'sini açıp yeni bir proje oluşturuyoruz. Proje türü olarak da "Windows Form Control Library" seçip bileşenimize bir isim veriyoruz. Bu isim bileşenimizi diğer uygulamalardan çağıracağımız isim olacaktır.

Daha sonra tasarım alanına bir tane Label ve bir tane de ProgressBar nesnesi taşıyoruz. Label nesnesinin ismini "lblBaslik", ProgressBar nesnesinin ismini ise "prgIslem" şeklinde değiştiriyoruz. lblBaslik nesnesinin özelliklerini şu şekilde değiştiriyoruz.
AutoSize = False
BackColor = WhiteSmoke
Font Size = 14,25
ForeColor = Desktop
TextAlign = MiddleCenter
Bunları değiştirdikten sonra lblBaslik nesnesinin text özelliğinde yazan yazıyı siliyoruz. prgIslem nesnesinin özelliklerini ise şu şekilde değiştiriyoruz.
BackColor = MistyRose
ForeColor = DarkSeaGreen
Ben renkleri görmeniz için value değerini değiştiriyorum. Sizin değiştirmenize gerek yok.
Son olarak tasarım alanında boş bir alana tıklayıp UserControl1 nesnesinin özelliklerini değiştiriyoruz.
BackColor = WhiteSmoke
BorderStyle=FixedSingle
Cursor = WaitCursor
Şimdi biraz kod yazalım. Bildiğiniz gibi lblBaslik nesnesinin Text özelliğini boş bırakmıştık. Çünkü bu kısmı hem iki satır halinde tasarlamak istiyorum hemde bileşeni kullanacak kişilerin program içerisinden kod kullanarak kendilerine göre özelleştirebilmelerini sağlayacağız.Öncelikle baslik yazımız için bir özellik tanımlayalım. Buraya yazılanlar lblBaslik nesnesinin üzerinde gösterilecek. Bunun için class içinde kullanılacak string bir değişken tanımlıyoruz.
private string baslik = "İşleminiz devam ediyor. \r\nLütfen Bekleyiniz";
daha sonra lblBaslik nesnesine class dışından da yani bu bileşeni kullanacak diğer programcıların erişebilmeleri için bir özellik tanımlıyoruz.
public string Baslik
{
get { return baslik; }
set { baslik = value; }
}Daha sonra lblBaslik nesnesinin Text'ini değiştirecek bir fonksiyon yazıyoruz.
private void Ayarlar()
{
lblBaslik.Text = baslik;
}Bu fonksiyonu tam olarak istediğimiz gibi çalışması için 2 yere yazıyoruz.
1- oluşturduğumuz Baslik özelliğinin "set" kısmına "baslik = value;"' den sonraki satıra. Her güncellemeden sonra değişikliklerin lblBaslik nesnesinde anında güncellenmesini istiyoruz.
2- Nesne ilk oluşturulduğunda bizim belirlediğimiz metnin Text özelliğinde yer almasını istiyoruz bunun için "UserControl1()" yapıcı fonksiyonunda "InitializeComponent();" satırından sonra "Ayarlar();" satırını ekliyoruz. Şimdi uygulamamızı çalıştıralım ve görelim nasıl olmuş


Şimdi sıra bileşenimizin iş yapacak olan kısımlarını kodlamaya geldi. Yukarıda başlık bilgisi için bir özellik tanımlamıştık. Aynı şekilde 2 tane daha özellik tanımlayacağız. Bunlardan biri prgIslem nesnesinin hangi miktarlarda artacağını belirleyecek diğeri ise bu artışların ne kadar süre aralıkla yapılacağını belirleyecek. Ayrıca varsayılan olarak bir değerde biz veriyoruz. Yine set kısmına "Ayarlar();" satırını ekliyoruz. Artış miktarını değiştireceğimiz özelliği şu şekilde tanımlıyoruz.
private int artismiktari = 5;
public int ArtisMiktarı
{
get { return artismiktari; }set { artismiktari = value; Ayarlar(); }
} Artış hızını değiştireceğimiz özelliği ise şu şekilde tanımlıyoruz.
private int hiz=100;
public int Hiz
{
get { return hiz; }
set { hiz = value; Ayarlar(); }
}
Özellikleri tanımladığımıza göre "Ayarlar()" fonksiyonumuzu güncellemeliyiz. Fonksiyonun son hali
private void Ayarlar()
{
lblBaslik.Text = baslik;
timer1.Interval = hiz;
prgIslem.Step = artismiktari;
}
Şimdi de timer nesnesinin Tick olayını şu kodları yazıyoruz.
private void timer1_Tick(object sender, EventArgs e)
{
if (prgIslem.Value <= prgIslem.Maximum-artismiktari)
{
prgIslem.Value += artismiktari;
}
else
{
prgIslem.Value = 0;
}
}
Bu kısımdaki kodlar hiz özelliği ile belirlenen aralıklarda çalışacak ve her çalışmasında prgIslem nesnesinin Value değerinin maksimum değere ulaşıp ulaşmadığını kontrol edecek. Eğer maksimum değere ulaşılmışsa değeri sıfırlayıp herşeye yeniden başlayacak. Biz durdurana kadar bir döngü halinde devam edecek.
Şimdi bileşenimizi kullanacak olan kişilerin, bileşenimizin çalışmasını başlatabilmesi ve durdurabilmesi için birer fonksiyon oluşturalım.
public void Baslat()
{
this.Visible = true;
}
public void Durdur()
{
this.Visible = false;
}
Bu haliyle bileşenimiz neredeyse tamamlanmış oldu. Birkaç küçük kısım daha kaldı. Yine tasarım alanında boş bir alana tıklıyoruz. UserControl1 nesnesi aktif olması gerekiyor. "Events" kısmında "VisibleChanged" olayını ekliyoruz ve şu şekilde değiştiriyoruz.
private void UserControl1_VisibleChanged(object sender, EventArgs e)
{
if (this.Visible == true)
{
timer1.Enabled = true;
}
else
{
timer1.Enabled = false;
}}
Şimdi yapmamız gereken kullanıcıların bileşenimiz ekrana çıktığında başka bir işlem yapmalarını önlemek. Bunu yapmak için bileşenimiz görünür olduğu sürece başka bir bileşenin aktif olmasını önlemektir. Bu işlemi 2 adımda gerçekletireceğiz.
1.Adım : Başlat fonksiyonu çağırıldığında Focus() fonksiyonunu kullanarak bileşenimizin aktif olmasını sağlamak.
2.Adım : Kullanıcı TAB tuşuna bastığında veya fare ile aynı formda başka bir bileşene tıkladığında (TextBox gibi) o bileşenin aktif olmasını engellemek. Bunu yapmak için tasarım alanında boş bir alana tıklıyoruz ve UserControl1 bileşeninin aktif olmasını sağlıyoruz. Events bölümünde "Leave" event'ını kullanıyoruz. Bu event bileşen üzerindeki Focus() komutuyla sağlanan odaklanma kaybolduğu zaman çalışır. Bizde odaklanma kaybolduğunda tekrar Focus() komutunu kullanarak yeniden bileşenimiz üzerine odaklanma sağlayacağız.
private void UserControl1_Leave(object sender, EventArgs e)
{
this.Focus();
}
Şimdi kodlarımızı tekrar derleyelim. Bileşenimiz gayet güzel bir şekilde çalışıyor. Oluşturduğumuz tüm özellikler (Hiz, Baslik, ArtisMiktarı) üzerinde değişiklik yaptığımızda anında bileşen üzerinde etkili oluyor bir eksiklik var.

Resimde gördüğünüz gibi bizim oluşturduğumuz özellikler seçildiğinde o özelliğin ne işe yaradığı ile ilgili bir açıklama yok. Zorunlu değiliz açıklama eklemek güzel olur. Bunun için özel classlar var onlardan yararlanacağız. Kendi oluşturduğumuz özelliklere açıklama eklemek veya bu özelliklerle ilgili diğer işlemler için "System.ComponentModel" namespace'i içinde bulunun "Description" sınıfını kullanıyoruz. Bu sınıf özellik tanım satırının hemen üstünde kullanılır. "[]" arasında yazılır ve string türde bir parametre alır. Özellik tanımlarımız şu şekilde oldu.
[Description("Bileşenin üzerinde görünecek metni belirler")]
public string Baslik
{
get { return baslik; }
set { baslik = value; Ayarlar(); }
}
[Description("Bileşenin hangi miktarlarda değişeceğini belirler")]
public int ArtisMiktarı
{
get { return artismiktari; }
set { artismiktari = value; Ayarlar(); }
}
[Description("Bileşenin değişim hızını milisaniye cinsinden belirler")]
public int Hiz
{
get { return hiz; }
set { hiz = value; Ayarlar(); }
}
İsterseniz farklı türde ayarlarda var. Bunlardan bazıları şunlar :
[Browsable(false)] : Bu özellik tanımladığınız özelliğin VS.NET IDE sinde Properties tablosunda görünüp görünmeyeceğini belirler.
[Category("YazilimGrubu")] : Bu özellik tanımlanan özelliğin hangi kategori altında görüntüleneceğini belirler. İsterseniz kendiniz bir kategori adı verebilirsiniz.
[DisplayName("YGBaslik")] : Bu özellik tanımlanan özelliğin farklı bir isimle görünmesini sağlar.
Dilerseniz bileşenimize geri dönelim. Tekrar derleyelim ve yaptıklarımızın gerçekten çalışıp çalışmadığını görelim. Evet herşey çok güzel çalışıyor. Dilerseniz özellik tanımlama satırında kullanıcı özelliklere bir değer ataması yaptığında sizin istediğiniz kriterlere uyup uymadığını kontrol edebilirsiniz. VS.NET değer türü bakımından kontrol yapıyor mesela "Hiz" özelliğine rakam içermeyen bir değer girdiğinizde bunu kabul etmiyor. Peki ya siz belirli aralıklar içinde değer girilmesini istiyorsanız mesela "ArtisMiktarı" 0(Sıfır) olarak girilirse ne olacak? işte bunun kontrolünü bizim yapmamız gerekiyor. Bunun için özellik içinde set {} içerisinde bu kontrolü yapmamız gerekiyor. ArtisMiktarı özelliğimizin tanımını şu şekilde değiştiriyoruz.
public int ArtisMiktarı
{
get { return artismiktari; }
set
{
if (value > 0 && value <= 50)
{
artismiktari = value;
}
Ayarlar();
}
}
Bu şekilde bir kontrolle artis miktarının değerini 1-50 arası olacak şekilde sınırladık. Dilerseniz bunu özellik için belirlediğimiz açıklama içinde belirtebilirsiniz. Artık bileşenimiz yayınlanmak için hazır. Umarım faydalı bir makale olmuştur.

Gerçekten çok yararlı bir konu kaç gündür bunu araştırıyordum sonunda buldum. Teşekkür ederim.
YanıtlaSil