Jump to content

C# Ile Numeric Textbox Bileşeni 1


wmismail

Recommended Posts

C# ile Numeric TextBox Bileşeni 1

Merhabalar, bu makalemizde C# ile bir bileşen yaratacağız, ve bu bileşeni diğer Windows uygulamalarımızda kullanacak şekilde düzenleyeceğiz, ben uygulamayı WhidBey Beta 1 (Visual Studio 2005) ile yaptım, ama Vs.Net 2003 dede aynı kodları rahatlıkla çalıştırabilirsiniz.

İlk önce bu uygulamanın bağımsız bir şekilde çalışabilmesi için bir ClassLibrary oluşturalım, ben bu Class Librarynin adına NumericTextBox dedim

1.gif

Böylece varsayılan olarak oluşturulan NameSpace nin adı NumericTextBox oldu, şimdi Classımızın adını düzeltelim ben bu Classın adına NumericTB yazdım. Esas önemli olan konu ise bu Classımızı hangi Classdan türeteceğimiz, .Net ile bir bileşen oluşturmanın 3 yöntemi vardır,

Windows Control Library tarzında bir proje oluşturarak birden çok kontrolü bir arayüzde (GUI) toplamak, buna kullanıcı kontrolüde deniliyor

Sıfırdan bir kontrolü komple yazmak, ancak bu çok kolay olan bir iş değildir, zira bir görsellik kazandırmak gibi işlemler oldukça çok vakit alır

Daha önceden oluşturulmuş bir kontrolü türeterek oluşturmak,

Biz üçüncü olan yöntemi kullanacağız, zaten TextBox gibi bir kontrol var, oturup bir daha TextBox tarzında bir kontrol yazmaya gerek yok, ben bu kontrolü türeterek istediğim gibi hükmedebilirim, işte .Net in gücü. Bunu yapmak için Class tanımımızdan hemen sonra “:” yi yerleştirip ondan hemen sonrada TextBox yazmamız gerekiyor, Ancak biz başlangıçta bir ClassLibrary şablonu seçip bundan projemizi oluşturduğumuz için TextBox un yer aldığı Classı burada kullanamayacağız, bunun için Referanslara System.Windows.Forms NameSpace sini eklememiz gerekiyor, en yukarıyada using deyimini yazmayı unutmayın. using System.Windows.Forms

2.gif

public class NumericTB:TextBox

{}

Şimdi ilk olarak bu class ımızın kurucu metodu olan metodu oluşturalım. Biliyoruzki C# da kurucu metot Class ile aynı isimde olan metottur. Şimdi oluşturduğumuz bu kurucu metodu bizim inherit ettiğimiz (base) class ın base classını çağırarak kullanalım,

public NumericTB():base()

{}

Ben bu kodu yazmakla Class ımı türettiğim classın, kurucu metodunu çağırıyorum. Kurucu metotlar genellikle Class lar ın ilk instance ları alındığında çalışarak, Class ların içindeki değişkenlere (data member) başlangıç değerlerini atamak için kullanılırlar. Ben TextBox classından türettiğim kendi Classım için de bu işleri yapmak zorundaydım ancak ben Base classımdaki kurucu metodu çağırarak bu işi yapmıyorum, benim yerime Base class taki metot bu işi yapıyor.

şimdi yapacağımız iş TextBox ın en çok kullandığımız özelliklerinden birisi olan Text Properties ini ezip onun yerine kendi yeni Text properties imizi yazmak olacak. Bunun için Visual Studio 2005 de public override yazdıktan sonra otomatik olarak property ler listeleniyor Text i seçip entere bastığınızdada aşağıdaki gibi bir kod ekranı oluşuyor.

3.gif

public override string Text

{

get

{

throw new global::System.NotImplementedException();

}

set

{

throw new global::System.NotImplementedException();

}

}

Public bir Access Modifier yani bir erişim denetleyici, override ise daha önceden yazılmış bir metodun ezilmesini sağlayan bir keyword, yani benim Inherit ettiğim Class da bu isimli bir Property var ve eğer bu property çağarılır ise benim yazdığım property çalışsın Inherit ettiğim Class ın propertysi çalışmasın demek. Eğer siz bir değer girmezseniz yada burada oluşturulan throw new deyimlerini kaldırmazsanız otomatik olarak hata üretilmesini sağlayacak, bu yüzden bu oluşturulmuş olan throw new deyimlerini comment leyip aşağıdakı şekilde düzenleyin.

public override string Text

{

get

{

return base.Text + " TL.";

//throw new global::System.NotImplementedException();

}

set

{

base.Text = value;

//throw new global::System.NotImplementedException();

}

}

Bu kodları yazmakla şu işi yapmış oldum, bu kendi özel TextBox ım olduğu için Text değerini görmek istediklerinde otomatik olarak sonuna “TL.” yazısının eklenmesini sağladım, buradaki amaç aslında sadece bir property nin nasıl ezildiğini anlatmaktı. Daha farklı şeyler kullanabilirsiniz, örneğin bu benim özel olarak geliştirdiğim sadece Rakam girilebilecek bir TextBox olduğu için ben varsayılan olarak arka plan rengini açık mavi yapmak istiyorum, böylece kullanıcılar benim programımlarımı kullanırken açık mavi gördükleri TextBox lara sadece rakam girilebileceğini anlayacaklar, bu işi yapabilmek için aslında bu TextBox ilk oluşturulduğunda bu işlemin yapılmasını sağlamak gerekiyor bu yüzden ben bu işlemin kurucu metotta yapılmasını sağlamalıyım, Renkleri kullanabilmek için uygulamanıza System.Drawing i referans olarak eklemeniz gerekiyor, deminki yöntemle refenraslara System.Drawing i ekleyin. Ve kurucu metodu aşağıdaki gibi düzenleyin.

public NumericTB():base()

{

base.BackColor = System.Drawing.Color.LightBlue;

}

4.gif

Böylece her bu TextBox ı kullandığınızda TextBox ınızın arka plan rengi açık mavi olarak gelecek, beyaz değil.

Şimdi esas işimizi yapıp TextBox ın sadece rakamları kabul etmesini sağlamalıyız, bunun için ilk mantık olarak klavyenin tuşlarına basılma olaylarını bilmek gerekiyor, temel olarak üç adet klavyenin tuşlarını dinleyen olay var,

  • KeyUp
  • KeyDown
  • KeyPress

KeyUp olayı, klavyenin tuşuna siz basar basmaz tetiklenir ve çalışmaya klavyenin tuşuna siz basar basmaz başlar.

KeyDown olayı, klavyeden bir tuşa bastığınızda çalışmaz, tuştan parmağınızı çektiğinizde çalışmaya başlar. KeyUp ile farkı, birisi basılır basılmaz çalışır, diğeri basılıp tuşu bırakınca çalışır

KeyPress olayı, bu iki durumun sağlanması durumunda çalışır, yani basıp kaldırma işlemi gerçekleştiğinde çalışır.

Kategorize etmek gerekirse, KeyUp ile KeyDown aynı türden argümanlar türetirler, KeyPress ise bu ikisine göre daha farklı türden bir argüman üretir.

Biz uygulamamızda KeyPress i kullanacağız çünkü bize gönderdiği argüman (olay prosedürlerinde gelen iki argümandan birisi olan e argümanı) bizim işlerimizi daha kolay yapmamıza yarayacak, yapacağımız işi şöyle düşünelim, ben 0 ile 9 arasında bazı rakamların girilmesini istiyorum bunun dışındaki rakamlar girilmesin istiyorum tek tek bütün rakamları kontrol edeceğime bu rakamların ASCII kodlarını kontrol ederek bu işi çok kolay bir şekilde yapabilirim, çünkü ASCII kodlar belli bir mantıkta sıralanmış şekilde bulunurlar ve rakamsal olarak tutulurlar, örneğin 0 ın ASCII kodu 48, 9 un ASCII kodu 57 dir, diğer rakamlarda bu sırada yer alacak şekilde tasarlanmışlardır. Bunun dışında örneğin BackSpace nin ASCII karşılığı 8, Enter ın ASCII karşılığı ise 13 dür.

Hangi Karakterin karşılığının ne olduğunu öğrenmek istiyorsanız, formunuza bir TextBox yerleştirip aşağıdaki kodu yazarak denemelerinizi yapabilirsiniz.

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

{

MessageBox.Show(((int)e.KeyChar).ToString());

}

Böylece benim ihtiyacım olan aralığı bulmuş oldum, benim istediğim kullanıcı sadece ASCII kodu 48 ile 57 arasındaki karakterleri girebilsin ve birde silmek isterse ASCII kodu 8 olan tuşa basabilsin.

Şimdi aslında yapacağımız iş bizim yeni oluşturduğumuz TextBox ın bir olayını ezmek, bunu yapabilmek için ise protected override void OnKeyPress metodunu ezmemiz gerekiyor, buradaki önemli nokta, temelde her olayın aslında en az bir tane metodu tetiklediği, bizim KeyPress olayımız ise OnKeyPress metodunu tetikler ve olay gerçekleştiğinde bu metodu çalıştırır. Aşağıdaki kodları NumericTB classınıza ekleyin.

protected override void OnKeyPress(KeyPressEventArgs e)

{

if ((int)e.KeyChar >= 47 && (int)e.KeyChar <= 58)

{

e.Handled = false;

}

else if ((int)e.KeyChar == :dribble:

{

e.Handled = false;

}

else

{

e.Handled = true;

}

//throw new NotImplementedException();

}

Burada yaptığım iş e ile gelen karakterin ASCII koduna bakıp bu ASCII karakterin 48 ile 57 arasında olup olmadığını inceliyorum, eğer bu aralıktaysa e.Handled özelliğini false yapıyorum böylece girilen rakam TextBox a yazılıyor, else if bölümü ilede girilen karakterin backspace (silme tuşu) olup olmadığına bakıyorum, silme tuşunun ASCII kodunun 8 olduğunu az önce bulmuştuk. Eğer 8 ise bu karakterinde TextBox a yazılmasını yani yazılan rakamın solundaki rakamın silinmesini sağlıyorum. Bunun dışında basılan karakter ne olursa olsun e.Handled ı true yapıyorum ve bu karakterin TextBox a girilmemesini sağlıyorum. Bu yazının ikinci bölümünde ise bu bileşeni strong name ile işaretleyip bir shared assembly yapıp istediğimiz uygulamalarda nasıl kullanabileceğimizi, toolBox daki görüntüsünü nasıl düzenleyebileceğimizi, propertylerini nasıl oturtabileceğimizi inceleyeceğiz.

5.gif

Link to comment
Share on other sites

C# ile Numeric TextBox Bileşeni 2

Önceki makalede sadece rakam girilebilecek bir TextBox oluşturmuştuk, varolan TextBox classını türeterek kendi istediğimiz ekstra yetenekleri yazmıştık, bir property, bir event ve birde metot ezerek bu işlerimizi gerçekleştirdik, şimdi ise bir olay yaratacağız ve bu olayın çalışmasını sağlayacağız, daha sonra Attribute leri kullanarak bu TextBox ile ilgili bazı genel tanımlamalar yapacağız ve projemize nasıl ekleyebileceğimizi inceleyeceğiz.

Bu TextBox a yapacağımız ilk işlem yeni bir olay (event) oluşturmak, bu olay kullanıcı Entere bastığında tetiklenecek ve TextBox ı kullan kullanıcı bu olaya bir kod yazabilecek, bizim istediğimiz kullanıcının TextBox dayken Entere basması durumu olduğu için ben kullanıcının Entere basıp basmadığını takip etmeliyim

Daha önceki kodu aşağıdaki gibi düzenleyin

protected override void OnKeyPress(KeyPressEventArgs e)

{

if ((int)e.KeyChar >= 47 && (int)e.KeyChar <= 58)

{

e.Handled = false;

}

else if ((int)e.KeyChar == :dribble:

{

e.Handled = false;

}

else if ((int)e.KeyChar == 13)

{

EntereBasti(new object(), e);

}

else

{

e.Handled = true;

}

//throw new NotImplementedException();

}

Bu kod aslında sadece bir Event in tetiklenmesini sağlıyor, eğer kullanıcının bastığı tuş ASCII kodu 13 olan tuş ise yani Enter Tuşu ise EntereBasti olayını tetikliyor, EntereBasti olayı ise bütün event lar gibi iki parametre alıyor, bunlardan bir tanesi Sender olan parametre ben bu parametre için yeni bir object oluşturuyorum, ancak e için bir KeyPressEventArgs türünden değişken vermem gerekiyor, onuda sınıftan oluşturabilirdim ancak gelen bir e değişkenim var ben o e değişkenimi kullanarak işlemlerin bu e ile yürümesini sağladım. Peki bu olay nerede ? bu olayı aynı Class ın içinde aşağıdaki şekilde tanımlayabilirsiniz

public event KeyPressEventHandler EntereBasti;

6.gif

event Keywordu bir olay tanımlamanıza yarıyor ve bu Event in türü aslında Klavyenin tuşlarını düzenlediği için KeyPressEventHandler türünde, burada standart olarak EventHandler veri türünüde kullanabilirsiniz. Böylece artık benim numericTextBox ımın kendisine ağit bir olayıda olmuş oldu ve kullanıcı bu olayı istediği gibi kullanabilir. Biraz sonra bir Windows Forma bu kontrolü nasıl ekleyeceğimizi göreceğiz, orada çok daha anlam kazanacak yaptığımız bu iş.

Şimdi bu bileşenimiz için bazı özel tanımlamalar yapalım, bu tanımlamalara Attribute deniliyor, Attribute derleyiciye işlemlerini yaparken klavuzluk etmesi için tasarlanmış bir yapıdır. Böylece derleyiciye bazı işlerin özelliklerini belirtebiliriz. İlk iş olarak demin tanımladığımız event i bu bileşen için default event yapalım, .Net ile programcılığa başlayanların özellikle sorduğu bir soru vardır, örneğin Button için “neden dizayn zamanında bir buttona iki kere kliklediğimizde hem Button_Click olayı oluşuyor” bunun nedeni button için varsayılan olay olarak Click olayı seçilmiştir, TextBox lar için ise varsayılan olay olarak genellikle TextChange olayı seçilmiştir ancak ben şimdi kendi yazdığım bileşenimde varsayılan olayı EntereBasti olarak tanımlayacağım, bu yapacağım işlemin mantığını şöyle kurabilirsiniz, bu varsayılan olay bu bileşenin varsayılan olayı o yüzden bileşende tanımlamak gerekiyor, bundan dolayı Classınızın en başına gidip Classınızın tanımlanması aşağıdaki gibi düzenleyin.

[system.ComponentModel.DefaultEvent("EntereBasti")]

public class NumericTB : TextBox

Böylece varsayılan olay benim demin tanımladığım EntereBasti olayı olarak atandı, şimdide varsayılan property i ayarlayalım, deminki mantığı buradada düşünebilirsiniz, yine aynı mantıkla bu bileşenimin varsayılan olayı olduğu için Classımda tanımlayacağım. Bunun için demin tanımladığımız class değişkenini aşağıdaki şekilde tekrar düzenleyin. Her seferinde System.ComponentModel yazmamak için en yukarıya using System.ComponentModel yazın.

[system.ComponentModel.DefaultEvent("EntereBasti"), DefaultProperty("Text")]

public class NumericTB : TextBox

böylece siz nesneyi seçip Properties penceresine baktığınızda seçili olarak gelecek olan Property i de tanımlamış oluyoruz, şimdi bu Text Property sine bazı özel işlemler daha yapalım, örneğin bu Text propertysinin tanımlamasını ve kategorisini değiştirelim. Property tanımlamasını aşağıdaki şekilde düzenleyin.

[Description("Lütfen Rakam Giriniz."),Category("Numeric Text Box")]

public override string Text

7.gif

Böylece nesneyi formun üstüne ekledikten sonra Properties ekranında aşağıda yazan tanımlamayı ve Text in kategorisini değiştirmiş oldum.

Şimdi insanların çok dikkatini çeken bir iş daha yapalım, bu bileşenimizin ToolBox da daha gösterilmesi için bileşenimize bir simge oluşturalım. Aslında çok kolay bir işlem ancak bunun için bir tane simge dosyasına ihtiyacımız var. Class Librarymizin proje dosyasına sağ tuş tıklayın ve Add – New Item a basın, açılacak olan seçeneklerden ise Icon File ı seçin ve adına NumericTB yazın, NumericTB.ico dosyanız oluşacak, Icon lar farklı farklı boyutlarda olabilirler ancak Visual Studio 16X16 lık simgeleri kullanıyor bu yüzden sizin 16X16 lık bir simge dosyası hazırlamanız gerekiyor. Siz bir simge dosyası oluşturduğunuzda Visual Studio iki tipte getirir 16X16 ve 32X32 şeklinde bize 16X16 lık gerektiği için simgenin 16X16 lık haline geçmemiz gerekiyor bunun için ise Image menüsünden Current Icon Image Type a basın ve yanda açılan menüden 16X16 lık bölümü seçin (farklı renk çözünürlüklerinide ekleyebilirsiniz bunun için yine Image menüsünden New Image Type a basın ve eklemek istediğiniz büyüklüğü ve renk paletini seçin.) simge dosyanızı istediğiniz bir biçimde oluşturun ve kaydedin.

8.gif

Şimdi bu simge dosyasının bu bileşenin simge dosyası olduğunu anlatmamız gerekiyor, Simge dosyamız projenin dosyalarının içindedir, ancak projenin oluşturduğu DLL dosyası bu dosyalara göre iki klasör içeridedir, bu yüzden simge dosyasını çağırırken ../../ deyimini kullanmanız gerekiyor bu sizi iki klasör aşağı indirecektir. Class ın tanımlanmasını aşağıdaki şekilde düzenleyin.

[system.ComponentModel.DefaultEvent("EntereBasti"), DefaultProperty("Text"), System.Drawing.ToolboxBitmap(@"../../NumericTB.ico")]

public class NumericTB : TextBox

9.gif

Böylece artık ToolBox da bileşeniniz sizin oluşturduğunuz şekilde görüntülenecek. Şimdi gelelim bu bileşenimizi istediğimiz bir projede naısl kullanacağımıza. Aslında yapmanız gereken iş çok basit bu solutiona yeni bir Windows Application ekleyin Visual Studio 2005 de bu işlem File Add bölümünden yapılıyor, Visual Studio .Net 2003 de ise bu işlem Solution Explorer daki Solutiona sağ tuş Add – New Project adımıyla yapılıyor. Ben bu Windows Application ın ismine NumericTBWindows dedim. Eğer Visual Studio 2005 kullanıyorsanız aynı Solution da olan Class Library eğer bir bileşen ise (yani temelinde Component class ı varsa) otomatik olarak ToolBox da gösteriyor, ancak Visual Studio .Net 2003 de bu işlemi sizin kendinizin yapması gerekiyor bunun için ToolBox a sağ tuş Add / Remove Item ı seçmeniz gerekiyor ve bu projenizin DLL dosyasını göstermeniz gerekiyor.

Visual Studio 2005 de ise bu işlem için ToolBox a sağ tuş Choose Items ile yapılıyor, projenizin DLL ini göstermeniz yine yeterli.

10a.gif

10.gif

11.gif

Şimdi normal bir bileşenmiş gibi istediğiniz projenizde istediğiniz gibi uygulayabilirsiniz bu kontrolü. Hatta bu bileşeninize iki kere kliklediğinizde varsayılan olarak EntereBasti olayına gidecek ve sizden bu olay için bir kod yazmanızı isteyecek, ben aşağıdaki kodu yazdım.

private void numericTB1_EntereBasti(object sender, KeyPressEventArgs e)

{

MessageBox.Show("Entere Basmayin");

}

12.gif

“Ben yazamam şimdi bu kadar kodu, keşke yazılmışı olsa...” diyenler için ise

Please register to see this content.
kodun yazılmış halini indirebilirsiniz.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...