C# İçin Programcılık Dersleri (Bölüm 6)

Daha önceki derslerde önde C# için hazırlanmış Express Edition sonra da Visual Studio hakkında ön bilgi verdik. Bu derste ise Express Edition ile Windows Forms hazırlayacağız. Bu derste yazılanlar itibarı ile Express Edition kullanmak ile Visual Studio kullanmak arasında pek bir fark yoktur.

Windows Forms Uygulamaları

Daha önceki derslerde önde C# için hazırlanmış Express Edition sonra da Visual Studio hakkında ön bilgi verdik. Bu derste ise Express Edition ile Windows Forms hazırlayacağız. Bu derste yazılanlar itibarı ile Express Edition kullanmak ile Visual Studio kullanmak arasında pek bir fark yoktur. Başka bir deyişle bilgisayarlarına Visual Studio kurmuş olanlar bu derste yazılanları zorluk çekmeden uygulayabilirler. İlk derslerde konsol uygulaması hazırlamamızın nedeni C# uygulamaları hakkında adım adım bilgi vermekti. Yoksa konsol uygulamalarına çok özel durumlarda ihtiyaç duyulmaktadır. Bu nedenle bundan sonra Windows Forms denilen normal uygulamalara odaklanacağız. Bu nedenle Express Edition'ı başlatıp File menüsünden komut verip New Project diyalog kutusunu ekrana getirip Windows Application şablonunu seçtim



C# için hazırlanan Express Edition ile hazırlanan projelerde New Project diyalog kutusunda projeye verilen ad sonradan değiştirilebilmektedir. Projeye vermek istediğim adı Name kutusuna yazıp OK düğmesini tıklayınca aşağıdaki gibi bir Visual C# 2008 Express Edition penceresi ile karşılaştım.



Windows Application şablonu ile hazırlanan projeye bir form dahil edilmekte ve bu formun görsel yapısı Express Edition penceresine getirilmektedir. Bu formun üzerine hemen düğmeler, TextBox'lar ve ListBox'lar yerleştirmek yerine Windows Forms Application şablonu ile hazırlanan projenin özelliklerine bir bakalım. Bu amaçla Solution Explorer penceresini açtım.



C# için hazırlanmış Express Edition ile C# projesi hazırlandığı zaman çok kullanılan bazı sınıfları içeren referanslar yani DLL dosyaları projeye dahil edilmektedir. Daha doğrusu Express Edition'a bazı referanslardaki sınıflardan yararlanılmak istendiği söylenmektedir. Hatırlarsanız yukarıdaki sayfalarda konsol uygulaması dahilinde ekrana form veya pencere getirmek için System.Windows.Forms'deki Form adlı sınıftan yararlanmıştık. Bakmayın siz yerli yabancı birçok kaynakta bu konunun farklı anlatılmasına. Solution Explorer penceresinde listelenen Assembly'leri Assembly kavramından bağımsız anlatanlar kafanızı karıştırırlar.

Üzerinde çalışılan projede .NET Framework ile gelen sınıflardan birisinden yararlanmak için o sınıfın yer aldığı namespace'i içeren DLL dosyasının veya referansın Solution Explorer penceresinde listelenmesi gerektiği için Solution Explorer penceresinden yararlanıp Add Reference diyalog kutusunu ekrana getirmiştik. Benzer durum Express Edition ile hazırlanan Windows Forms uygulamaları için de geçerlidir. Express Edition en çok gerek duyulan referansları kendiliğinden Solution Explorer penceresinde listelemektedir.

Üzerinde çalışılan proje hakkında bilgi edinilmek istendiği zaman başvurulan Solution Explorer penceresine dikkatlice bakarsanız projedeki formla ilgili olarak 3 dosyanın hazırlanmış olduğunu görürsünüz. Burada dikkatinizi öncelikle 'Program.cs' dosyasına çekmek istiyorum. Yukarıdaki sayfalarda işaret edildiği C# projelerinin başlangıç noktası Main() metodudur. Express Edition veya Visual Studio ile hazırlanan projelerde Main() metodu 'Program.cs' adlı kod dosyasına konulduğu için bu dosya önemlidir.

Solution Explorer penceresinde 'Program.cs' dosyasını çift tıklarsanız bu kod dosyasının içeriği görüntülenir. Hemen belirtmek gerekir ki Main() metodunun Program.cs dosyasında olması şart değildir. Microsoft firması Main() metodunun 'Program.cs' dosyasında olmasını tercih ettiği için bu tercihe bağlı kalmanız önerilir.



Express Edition tarafından hazırlanan bu kodu dikkatlice incelerseniz System, System.Collections.Generic, System.Windows.Forms gibi namespace'lerdeki sınıfları direk kullanabilmeniz, yani sınıf adından önce namespace adını yazmak zorunda kalmamanız için using deyimi ile ayarlama yapılmış olduğunu görürsünüz. 'Program.cs' dosyasındaki Main() metodundaki son satırı yukarıdaki sayfalarda görmüştük.


Application.Run(new Form1());



Windows Forms uygulamalarında System.Windows.Forms'deki sınıfları direk kullanabilmeniz için Express Edition tarafından using deyimi ile ayarlama yapıldığı için sınıf adından önce namespace adı yazılmamış. Bu satırı daha önce görmüş olanlar şöyle bir açıklamayı okumuş olabilirler: 'Uygulama Run() metodu ile başlatılmaktadır'. Aslında bu tek cümlelik tanım yanlış değildir. Ne var ki bu tanım bu satırda nelerin yapıldığını, geri planda nelerin geliştiğini açıklamaya yetmiyor.

Konunun devamında anlatılacağı gibi Express Edition ile Windows Forms uygulaması hazırlandığında System.Windows.Forms adlı namespace'teki Form adlı Class'ın mirasçısı 'Form1' adında bir Class hazırlanmaktadır. İşte bu satırda 'Form1' adlı Class'ın örneği alınıp Application sınıfının Run() metoduna parametre olarak verilmektedir. Konu üzerinde düşünmenizi sağlamak için Windows Forms uygulamasının 'Program.cs' dosyasındaki Main() metodunu aşağıdaki gibi düzenledim.


static void Main()

 {

   string mesaj = "Proje başlatıldı, Form1 ekrana getirilecek";

   MessageBox.Show(mesaj);

   Application.Run(new Form1());

 }



Express Edition tarafından hazırlanan Main() metodundan sildiğim 2 satır mutlaka gerekli olan satırlar değildir. Kod kısalsın diye sildim. Main() metodunun bu halinde önce string tipte bir değişken tanımlayıp bilgi aktardım. Değişken tanımlama ile tanımlanan değişkene bilgi aktarma işlemini ayrı satırlarda yapabilirdim. İleri de bir gün yerli bir yazarın 'Memik Yanık değişkenimizin adını çalmış' suçlamasından kendimi kurtamak için bu kodu bir de aşağıdaki gibi düzenledim. Sizler bu değişkene "msg" yerine "tomruk" adını verebilirsiniz.


static void Main()

 {

   string msg = "Proje başlatıldı, Form1 ekrana getirilecek";

   MessageBox.Show(msg);

   Application.Run(new Form1());

 }



Bu şekilde String tipteki değişkeni tanımlayıp bilgi aktardıktan sonra .NET Framework ile gelen MessageBox sınıfının Show() metodu ile bu değişkenin içeriğini bir diyalog kutusu içinde ekrana getirdim. Dolayısıyla Main() metodu bu şekilde düzenlenen proje çalıştırıldığı zaman ekrana önce aşağıdaki gibi bir diyalog kutusu gelir.



Bu diyalog kutusu kapatıldığında ise sıra Application sınıfının Run() metodunun kullanıldığı satıra gelir ve ekrana projendeki ilk form gelir. Run() metodunun kullanıldığı satırı incelerseniz Form1 sınıfının örneğinin new anahtar kelimesi kullanılarak parantezlerin içinde alındığını görürsünüz. Bir sınıfın örneğini alma yani nesne hazırlama işleminin anlaşılmasına katkı olması için bu projenin Main() metodunu aşağıdaki gibi düzenledim.


static void Main()

 {

   string msg = "Proje başlatıldı, Form1 ekrana getirilecek";

   MessageBox.Show(msg);

   Form1 Baslangic_formu;

   Baslangic_formu = new Form1();

   Baslangic_formu.Text = "İlk Form";

   Application.Run(Baslangic_formu); 

 }



Şimdi gelin bu 6 satırlık kodu yorumlayalım. Express Edition veya Visual Studio ile Windows Forms uygulaması hazırlandığı zaman .NET Framework ile gelen ve System.Windows.Forms'de yer alan 'Form' sınıfının mirasçısı 'Form1' adında bir sınıf hazırlanmakta ve bu sınıfla ilgili kodlar Form1.cs ve Form1.Designer.cs adındaki 2 kod dosyasına yazılmaktadır. Burada yani bu Main() metodunda yaptığım, önce Express Edition tarafından Windows Forms uygulaması için otomatik olarak hazırlanan Form1 tipinde(sınıf) bir değişken tanımlamak, sonra bu sınıfın örneğini new anahtar kelimesi ile hazırlayıp(nesne hazırlamak) tanımladığım değişkene aktarmaktır. En son satırda ise Form1 tipindeki nesneyi Application sınıfının Run() metoduna parametre olarak verdim. Ne zaman ki Application sınıfının Run() metoduna parametre olarak verilen form kapatılır o zaman projenin çalışması sona ermiş olur.

Formlar İçin Hazırlanan Kodlar

Express Edition veya Visual Studio ile yeni bir proje hazırlandığında projeye 'Form1' adında bir formun dahil edildiğini biliyorsunuz. Formu oluşturan kodları görüntülemek için Solution Explorer penceresinde söz konusu form seçili iken View menüsünden Code komu­tunu verebilirsiniz. Aşağıdaki ekran görüntüsünü incelediğinizde projedeki her form için hazırlanan CS dosyalarının ilkinde en başta kullanılması muhtemel sınıfların yer aldığı namespace'ler işaret edilmektedir. Ardından form ile aynı ada sahip bir Class hazırlanmaktadır.



Bu sınıf Form sınıfının mirasçısı olduğu için çok sayıda özellik ve metoda sahip olur. Bu koda dikkat ederseniz önce namespace bloğu bulunmaktadır ve projenin adı namespace adı olarak kullanılmaktadır. Devamında public ve partial olarak işaret edilen class bloğu gelmektedir. Hazırlanan Class'a Form1 adı verilmiş.

Hazırlanmak istenen Class'ın adından sonra mirasçı(bu sınıfa bazı programcılar ana sınıf-base class diyorlar) pozisyonundaki 'Form' sınıfının adı yazılmış. Hazırlanmak istenen Class ile mirasçı Class'ın adını birbirinden ayırmak için ':' kullanılmaktadır. Form sınıfı System.Windows.Forms'de yer aldığı ve bu namespace using bloğunda işaret edildiği için 'Form' sınıfının adının önüne namespace adı yazılmaya gerek duyulmamış.

Devamında 'Form1' sınıfının yapıcı metoduna yer verilmiş. Class ile aynı ada sahip me­totlara yapıcı veya constructor metot adı verilmektedir. Form1 adı verilen Class'ın yapıcı metodunda yalnızca InitializeComponent() metodu işletilmektedir. Form1 sınıfıyla ilgili InitializeComponent() metodu 'Form1.Designer.cs' adlı ikinci kod dosyasında yer almaktadır.

Formların ve formların üzerine yerleştirilen nesnelerin özellikleri Form1.Designer.cs dosyasında ayarlanmaktadır. Designer.cs dosyasında da 'Form1' adında bir Class bulunmaktadır. Başka bir deyişle 'Form1' adlı Class'ın bir kısmı Form1.cs'de diğer kısmı 'Form1.Designer.cs' dosyasında bulunmaktadır.



Class'ların birden fazla kod dosyası veya parça şeklinde düzenlenmesine Partial Class denilmektedir. Bu nedenle Form1.cs veya Form1.Designer.cs dosyalarındaki partial anahtar kelimeleri silinirse hata meydana gelir. 'Form1' adlı Class için Visual Studio tarafından hazırlanan 'Form1.Designer.cs' dosyasına bakarsanız Dispose() adında bir metodun olduğunu görürsünüz. Bu metot, sınıfla ilgili olarak hazırlanan nesnelerin zamanı gelince bellekten silmesiyle ilgilidir.

Şimdi 'Form1' için Visual Studio tarafından hazırlanan satırları ve bu satırlarda kullanılan metot ve anahtar kelimelerin bazılarından söz edeceğim. Visual Studio her form için Form1.Designer.cs dosyasında yukarıda verilen satırlardan daha fazlasını hazırlamaktadır. Tasarım anında Properties penceresinde yapılan değişiklilere programcı doğrudan müdahale etmeyi tercih etmeyeceği için bu satırlar Windows Form Designer generated code adlı altında gruplanıp gizlenmektedir. Aşağıda verilen kodda bu bölgeye yazılan satırları görebilirsiniz.


namespace Project1

{

 partial class Form1

  {

   private System.ComponentModel.IContainer components=null;

   protected override void Dispose(bool disposing)

    {

      if (disposing && (components != null))

       {

        components.Dispose();

      }

    base.Dispose(disposing);

  }

 private void InitializeComponent()

  {

   this.components = new System.ComponentModel.Container();

   this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

   this.Text = "Form1";

  }

 }

}



IntializeComponent metodundaki satırlar Toolbox'tan yararlanılarak formun üzerine yerleştirilen nesnelere göre artabilmektedir. Bu sırada Toolbox'tan yararlanıp forma nesne yerleştirir veya Properties penceresinden yararlanıp formun özelliklerini değiştirseniz 'Windows Form Designer generated code' bölgesine yeni satırlar eklenir veya mevcut satırlarda değişiklik meydana gelir.

Formlara Nesne Yerleştirmek

Yukarıdaki sayfalarda Express Edition veya Visual Studio ile hazırlanan C# projeleri hakkında biraz bilgi sahibi olduktan sonra şimdi sırada forma button nesnesi yani düğme yerleştirmek var. Tabii bazılarınız hemen bunu bilmeyecek ne var diye sorabilirler. Siz yine de okumaya devam edin. Formlara nesne yerleştirip bunlar için kod yazabilmek için yeni bir proje hazırladım ve projenin ilk(aynı zamanda başlangıç) formuna button nesnesi yerleştirebilmek için Toolbox'ı açtım.



Toolbox'ta listelenen seçeneklere Component adı verilmektedir. Bu seçeneklere kontrol da denilebilir. Bu kontroller gerçekte .NET Framework ile birlikte gelen birer Class'tır. Express Edition formlara yerleştirilebilinen class'ların örneklerini alıp kullanmanız konusunda size yardımcı olmaktadır. Daha açık bir anlatımla Toolbox'tan Button adlı kontrolü seçip formu tıklarsanız Button sınıfından yola çıkıp 'button1' adında bir nesne hazırlamış olursunuz.



Forma bu şekilde button1 adında bir Button nesnesi yerleştirince Express Edition bizim için gidip bu formun 'Form1.Designer.cs' adlı kod dosyasına bazı satırlar ekledi. Bu satırların sayesinde button1 nesnesi formun üzerinde görünmeye başladı. Başka bir anlatımla, forma Button nesnesi yerleştirmekle biz gerçekte Express Edition'a diyoruz ki 'formun üzerinde şu özelliklere sahip bir düğmenin olması için git Form1.Designer.cs dosyasında bazı ayarlamalar yap, button nesnesi hazırlayan satırlar ekle'.

Şimdi gidip bakalım Express Edition bizim için projedeki ilk formun Form1.Designer.cs dosyasına neler yazmış? Form1.Designer.cs dosyasında aşağıda verilen ekran görüntüsünde görülenlerden daha fazla satır olmasına rağmen ekran görüntüsü küçük olsun diye yalnızca button1 nesnesiyle ilgili satırların görünmesine izin verdim.



Toolbox'tan yararlanıp forma button nesnesi yerleştirildiği zaman Express Edition(aynı şeyler Visual Studio içinde söylenebilir) ilk olarak 'button1' adında ve System.Windows.Forms.Button tipinde bir değişken tanımlıyor. Bu sırada forma 2. bir button nesnesi yerleştirmeniz halinde Express Edition buna button2 adını verir. Tabi forma yerleştirmiş olduğunuz nesnelere sonradan istediğiniz adı verebilirsiniz. Siz siz olun bu nesnelere 'aktar' gibi yerli yazarlar tarafından sık kullanılan adlar vermeyin. Bakarsınız yarın bir gün yerli yazarın birisi düğme adımı çalmışsınız diye sizden şikayetçi olur. Bu nedenle düğmelere argo isimler vermeniz önerilir.

Express Edition veya Visual Studio, System.Windows.Forms.Button tipindeki değişkeni tanımladıktan sonra form için daha önce hazırlanan InitializeComponent() adlı metotta önce new anahtar kelimesi ile button nesnesi hazırlıyor. Devamında bu nesnenin Name, Location, Size, Text gibi birkaç özelliğini ayarlıyor. Bu sırada Form1.Designer.cs dosyasından button nesnesi ile ilgili satırları silerseniz button nesnesini formun üzerinden kaldırmış olursunuz. Çünkü formun üzerinde button nesnesinin olmasına neden olan satırlar bunlardır. Bu satırlarla oynayıp button nesnesinin özelliklerinde değişiklik yapabilirsiniz. Formların ve forma yerleştirilen nesnelerin özelliklerini fare ile ayarlamak daha kolay olduğu için programcılar çok gerekmedikçe nesnelerin özelliklerini ayarlamak için Designer.cs dosyasına başvurmazlar.

Forma düğme yerleştirmenin geri planında nelerin olduğu konusunda biraz bilgi sahibi olduktan sonra şimdi button1 adlı düğmenin başlık metnini yani Text özelliğini değiştireceğim. Bu amaçla Form1.cs(Design) sekmesini tıklayıp Express Edition penceresi içinde Form1.Designer.cs adlı kod dosyası yerine Form1'in görsel yapısının görüntülenmesini sağladım.

Formların ve forma yerleştirilen nesnelerin özelliklerini ayarlarken Properties penceresinden yararlanılmaktadır. Properties penceresini görüntülemek için View menüsünden komut vermek gerekmektedir. Aşağıda verdiğim ekran görüntüsünü 'button1' nesnesinin Text özelliğini değiştirdikten sonra aldım. Aslında button1 adlı nesnenin Text özelliğini bu şekilde değiştirmekle risk almış oldum. Çünkü yarın bir gün yerli bir yazar ortaya çıkıp 'Göster'i benim kitaptan çalmışsın' diye beni dava edebilir.



Properties penceresinde button1 adlı nesnenin Text özelliğinde değişiklik yapılırsa Express Edition bu değişikliği anında Form1.Designer.cs dosyasına yansıtır. Bu button nesnesinin adını değiştirmek istemiş olsaydım Properties penceresinde Name özelliğinde değişiklik yapardım.

Şimdi öyle bir ayarlama yapacağım ki kullanıcı çalışma anında Form1'deki düğmeyi tıkladığı zaman bir diyalog kutusu içinde kullanıcıya mesaj verilmesini sağlayacağım. Bu işlem için yerli yabancı diğer kitapların aksine size hemen button1'in üzerinde çift tıklama yapın sonra da şu satırı yazın demeyeceğim.

İşin özünü anlatmak için Form1'in görsel yapısı görüntülenirken View menüsünden Code komutunu verip Form1'e ait 'Form1.cs' adlı kod dosyasının görüntülenmesini sağladım. Ekran görüntüsü küçük olsun diye using bloğundan şu anda gerekli olmayan bazı satırları sildim.



Kafanızın karışmaması için baştan alayım: Express Edition veya Visual Studio ile Windows Forms uygulaması hazırlanıp uygulamaya dahil edilen her form için 2 kod dosyası hazırlanmaktadır. Form1.cs dosyasında programcının yazdığı kodlar yer alırken formun görsel yapısı ile ilgili satırlar Form1.Designer.cs dosyasında yer olmaktadır. Derleme sırasında bu 2 dosya bir araya getirilmektedir.

Bu şekilde bir sınıfa ait kodların birden fazla kod dosyası arasında paylaşılmasına Partial Class(parçalı sınıf) denilmektedir. Form1.cs dosyasına dikkatli baktığınızda InitializeComponent() metodunun işletildiğini görebilirsiniz. Bu metodun yani InitializeComponent metodunun Form1.Designer.cs dosyasında olduğunu biliyorsunuz.

Şimdi bu kod dosyasında yani Form1.cs dosyasındaki Form1 sınıfının sınırları içinde button1 nesnesi tıklandığında işletilmek üzere bir metot hazırlayacağım. Hazırladığım metot Object ve EventArgs tipinde 2 parametreye sahiptir. Çünkü herhangi bir button nesnesinin Click olayını ancak Object ve EventArgs tipinde 2 parametreye sahip metotlar temsil edebilmektedir.


public partial class Form1 : Form

 {

   public Form1()

    {

      InitializeComponent();

    }

  private void ilk_button_Click(object sender, EventArgs e)

   {

    MessageBox.Show('Düğmeyi tıkladınız');

   }

}



Kendi hazırladığım metoda ilk_button_Click() adını verdim. Doğrusu, metoda, ilgili nesnenin adını çağrıştıracak bir adın verilmesidir. Çalışma anında projenin formundaki düğme tıklansa bile bu metot işletilmez. Bizim yapmamız gereken button1 nesnesinin Click olayı ile, bu metodu ilişkilendirmek olmalıdır. Bu ilişkilendirmeyi yapmaya en uygun yer "Form1.Designer.cs" dosyasındaki InitializeComponent() metodudur. Bu metodun içine yazdığım satırı aşağıda görebilirsiniz.



Bu satırda eşitliğin sol tarafındaki 'button1' düğmenin adıdır. Eşitliğin sol tarafındaki Click ise button1 nesnesinin tıklama olayını işaret etmektedir. Tabii bu satırdaki 'this' gözünüzden kaçmamıştır: this, kendisi için metot yazılan 'Form1' sınıfını temsil etmektedir. Eşitliğin sağ tarafında ise parantezin içine yazılanın Form1.cs adlı kod dosyasında hazırladığım metodun adı olduğunu söylemekle yetineceğim.

Bu ayarlamadan sonra çalışma anında ne zaman Form1'deki düğme tıklanırsa Form1.cs'deki ilk_button_Click() metodu işletilir. Dikkat ettiyseniz yukarıda Form1'deki düğme için metot hazırlama ve bu metodu Click olayı ile ilişkilendirme konusunda Express Edition'dan yararlanmadım.

Şimdi hem Form1.cs dosyasındaki metodu hem de Form1.Designer.cs dosyasına yazıp yukarıda işaret ettiğim satırı sileceğim. Ardından metot hazırlama ve bu metodu Click olayı ile ilişkilendirme işlemini yaparken Express Edition'dan yararlanacağım. Tasarım anında forma yerleştirdiğiniz button nesnesini çift tıklamanız halinde Express Edition sizin için hem bir metot hazırlar hem de yukarıda verilen satırın benzerini hazırlayıp Form1.Designer.cs dosyasındaki InitializeComponent() metoduna ekler. Aşağıda verdiğim ekran görüntüsünü yukarıda kendi hazırladığım metodu silip tasarım anında 'button1' nesnesini çift tıkladıktan sonra aldım.



Bu metot button1 nesnesinin Click olayını temsil etmesi için hazırlandığı için Express Edition metoda ad seçerken nesnenin ve olayın adını kullandı. Tabii bu şart değildir. Anlatılan şekilde hazırladığınız metoda istediğiniz adı verebilirsiniz.

Bu andan itibaren çalışma anında Form1'e yerleştirdiğim düğme çalışma anında tıklandığında bu metot işletilir. Tabi bu metot henüz işletilebilir herhangi bir satır içermediği için çalışma anında düğme tıklanıp Click olayının meydana gelmesi sağlansa bile tepki vermez.

Tahmin edeceğiniz gibi tasarım anında formdaki düğme çift tıklandığında bu metodun hazırlanmasından başka Form1.Designer.cs dosyasında bulunan InitializeComponent() metoduna yukarıda verdiğim satır eklenerek bu metot ile button1 nesnesinin Click olayı ilişkilendirildi.

Forma yerleştirilen button ve diğer nesnelerin ilgili olayıyla metotların ilişkisi istenirse Properties penceresinde kurulabilir. Aşağıda verdiğim ekran görüntüsünü aldığım sırada Properties penceresinde button1 nesnesinin özellikleri listeleniyordu.



Properties penceresi 2 amaca yönelik olarak işlev görmektedir. Birincisi, form ve Toolbox'tan yararlanılarak formlara yerleştirilen nesnelerin özellikleri hakkında bilgi edinmek ve gerekirse bu özelliklerde değişiklik yapmaktır. Bu pence­redeki Events düğmesi tıklandığında ise o sırada seçili durumdaki nesneye kaynak­lık eden Class'ın olayları listelenmektedir. Aşağıda verilen ekran görüntüsünü button1 nesnesinin özellikleri listelenirken Events düğmesini tıkladıktan sonra aldım.



Bu button nesnesinin Click olayı Express Edition(veya Visual Studio) tarafından daha önceden Form1.cs dosyasındaki button1_Click() metoduyla ilişkilendirildiği için Click olayının karşısında bu metodun adı yazılıdır. Bu sırada Click olayının karşısındaki metodun adını silerseniz Express Edition gider Form1.Desing.cs dosyadaki metot ile olayı ilişkilendiren satırı siler.

Konu üzerinde düşünmenizi sağlamak için forma button2 adında 2. bir düğme yerleştirip Properties penceresinden yararlanıp bu düğmenin Click olayına button1_Click adını vermiş olduğum metodun adını aktardım.



Bu şartlarda çalışma anında formdaki 2. düğme tıklandığında Express Edition'den yararlanıp button1 için hazırlayıp button1_Click() adını verdiğim metot işletilir. Bu şartlarda button1_Click() metodu ile, hem button1'in hem de button2'nin Click olayı ilişkilendirildiği için çalışma anında ister button1 ister button2 tıklansın aynı metot işletilir. Hem button1 hem de button2 için Properties penceresinde Click olayı için aynı metodu seçmenin etkisiyle "Form1.Designer.cs" dosyasına aşağıda verdiğim 2 satır eklenir.


this.button1.Click += new System.EventHandler(this.button1_Click);

this.button2.Click += new System.EventHandler(this.button1_Click);



Şimdi ise forma bir TextBox yerleştireceğim. Öncelikle forma daha önce yerleştirdiğim button1 ve button2 adlı düğmeleri sileceğim. Forma yerleştirdiğiniz düğmeleri seçip Delete tuşuna basarsanız Express Edition gider Form1.Designer.cs dosyasında bu düğmelerle ilgili ne var ne yok her şeyi siler. Ancak tasarım anında düğmeyi çift tıklayarak veya kendi hazırladığınız bir metot varsa Form1.cs dosyasından silinmez. Söz konusu metoda gerek duymuyorsanız kendiniz silebilirsiniz.

Forma yerleştirmiş olduğunuz TextBox'ı tasarım anında çift tıklarsanız Express Edition TextBox'ın TextChanged olayı için metot hazırlamak istediğinizi varsaymaktadır. Bu nedenle TextBox'ı çift tıklarsanız hem Form1.cs dosyasının içeriği görüntülenir hem de aşağıdaki gibi bir metot hazırlanır.


public partial class Form1 : Form

 {

   public Form1()

    {

     InitializeComponent();

    }

  private void textBox1_TextChanged(object sender, EventArgs e)

   {

   }

 }



Bu metot çalışma anında TextBox'ın içeriği değiştirildikçe otomatik olarak işletilir. Ancak kendim bu TextBox'ın TextChanged olayı için değil KeyPress olayı için metot hazırlamak istiyorum. Şimdi bir tekrar yapalım: Tasarım anında formu çift tıklarsanız Express Edition ve Visual Studio sizin formun Load olayı için bir metot hazırlamak istediğinizi, Button nesnesini çift tıkladığınızda button nesnenin Click olayı için metot hazırlamak istediğinizi ve TextBox'ı çift tıkladığınızda ise TextChanged olayını temsil edecek bir metot hazırlamak istediğinizi varsaymaktadır. Madem forma yerleştirdiğim TextBox'ın KeyPress olayını temsil edecek bir metot hazırlamak istiyorum o halde söz konusu TextBox seçili iken Properties penceresinde TextBox'a ait olaylarının listelenmesini sağlamalıyım.



Bu TextBox'la ilgili olarak KeyPress olayı meydana geldiğinde(yani imleç TextBox'ın içinde iken kullanıcı klavyenin herhangi bir tuşuna bastığında) işletilmek üzere daha önce hazırladığınız bir metot varsa bu olaya ait liste kutusunu açıp bu metodu KeyPress olayıyla ilişkilendirebilirsiniz.

Bu amaçla kullanabileceğimiz herhangi bir metodumuz olmadığı için KeyPress olayının üzerinde çift tıklama yapmalıyız. KeyPress olayını çift tıkladığınızda Express Edition hem bir metot hazırlar hem de Form1.Designer.cs dosyasına müdahale edip bu metot ile KeyPress olayını ilişkilendirir.


public partial class Form1 : Form

 {

  public Form1()

   {

     InitializeComponent();

   }

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

  {

  }

           }



Express Edition tarafından hazırlanan bu metotta, metot adından sonra parantezlerin içinde (object sender, KeyPressEventArgs e) bilgisi var. Başka bir deyişle TextBox1'in KeyPress olayını temsil etmek üzere hazırlanan bu metot Object ve KeyPressEventArgs tipinde 2 parametreye sahiptir. Basılan tuşu temsil eden bilgi metoda KeyPressEventArgs tipindeki 'e' adındaki parametre ile gönderilir. TextBox'ın içinde iken Enter tuşuna basıldığı zaman o zamana kadar TextBox'a girilmiş bilgileri bir diyalog kutusu içinde ekrana getirmek için bu metodu aşağıdaki gibi düzenledim.


private void textBox1_KeyPress(object sender,KeyPressEventArgs e)

 {

  if (e.KeyChar == 13)

          MessageBox.Show(textBox1.Text);   

 }



Bu metotta 'if' deyimi ile en son basılan tuşun ASCII kodu 13 olan Enter olup olmadığı araştırılıyor. En son basılan tuşun kodu 13 ise MessageBox sınıfının Show() metodu ile TextBox'ın 'Text' özelliğinin içeriği ekrana getiriliyor. En son basılan tuşun kodu 13 değilse imleç TextBox'ın içinde bilgi girişi için beklemeye devam eder.

Forma yerleştirilen TextBox ve Button gibi nesnelerin değişik olaylarını temsil etmek üzere metot hazırlama işleminin kavranmasına katkı olması için TextBox'ların Enter ve Leave olaylarından söz edeceğim. Formdaki herhangi bir nesneden TextBox'ın üzerine gittiğinizde veya imlecin TextBox'a yerleşmesine neden olduğunuzda Enter olayı meydana gelir. Bu olayın nasıl kullanıldığına örnek olması için forma birden fazla TextBox yerleştirip ilk TextBox'ın Enter olayını temsil etmek üzere aşağıda verdiğim metodu hazırladım.

Tabii yarın bir gün yerli yazarın birisi ortaya çıkıp TextBox'ların Enter olayını temsilen metot hazırlamayı ilk ben akıl ettim, dolayısıyla fikri haklarıma tecavüz ettiniz diye buyrun mahkemeye derse hiç şaşırmamak gerekir. Zira bu memlekette bu böyle bir iddiayı onaylayacak çok sayıda bilim(sizlik) eri vardır.


private void textBox1_Enter(object sender, EventArgs e)

 {

   textBox1.BackColor = Color.GreenYellow;

 }



Bu metoda yazılan satır sayesinde textBox1'in üzerine gidildiğinde zemin rengi değişikliği olur. Kullanıcı TextBox'a bilgi girip başka bir kontrolün yani nesnenin üzerine gittiğinde ise zemin rengini eski halinde çevirmek istiyorsanız aynı TextBox'ın Leave olayını temsil eden(yani Leave olayı meydana geldiğinde işletilen) metodu aşağıdaki gibi düzenleyebilirsiniz.


private void textBox1_Leave(object sender, EventArgs e)

 {

   textBox1.BackColor = Color.White;

 }



Bazen istenen miktarda bilgi girmediği için kullanıcının TextBox'tan ayrılmasına izin verilmek istenmez. Bu gibi durumlarda Validated olayından yararlanılır. Kullanıcı TextBox'ı boş geçmek istediğinde buna izin vermemek için TextBox'ın Validated olayını temsil eden metodu aşağıdaki gibi düzenledim. Bu metotta kullanılan Focus() metodu ile formdaki istenen nesnenin üzerine gidilebilmektedir.


private void textBox1_Validated(object sender, EventArgs e)

 {

   if (textBox1.Text == "")

     {

       MessageBox.Show("Bu alanı boş geçemezsiniz");

       textBox1.Focus();  

     }

  }



Projeler İçin 2. Form Hazırlamak

Yukarıdaki sayfalarda işaret edildiği gibi Express Edition ile gelen Windows Forms Application şablonu ile hazırlanan projeler 'Form1' adında bir forma sahip olmakta ve bu form projenin başlangıç formu olmaktadır. Projenizde 2. bir formun olmasını istiyorsanız Express Edition'nın Project menüsünden Add Windows Form komutunu verip ekrana aşağıda verilen Add New Item diyalog kutusu getirmelisiniz.



Bu diyalog kutusunda üzerinde çalıştığınız projeye kod dosyaları, formlar vs eklerken kullanabileceğiniz şablonlar listelenmektedir. Projeye normal bir form eklemek istediğim için Windows Form şablonunu seçtim. Bu diyalog kutusunda kod dosyasına vereceğiniz ad aynı zamanda hazırlanacak sınıfın yani formun adı olarak kullanılmaktadır. Üzerinde çalıştığım projeye Form2 adında ikinci bir form ekleyince Express Edition penceresi aşağıda verilen şekle dönüştü.



Add New Item diyalog kutusundaki Windows Form şablonundan yararlanıp üzerinde çalıştığım projeye Form2 adında 2. form dahil edince bu formu temsilen ikisi kod dosyası olmak üzere toplam 3 dosya hazırlandı. Form2.Designer.cs dosyasında formun görsel yapısı ile ilgili kodlar bulunurken 'Form2.cs' dosyasında ise programcının yazdığı satırlar olmaktadır.

Şimdi projedeki 2. formu başlangıç formu olarak ayarlayacağım. Başka bir deyişle proje çalıştırıldığı zaman ekrana 2. formun gelmesini sağlayacağım. Bu amaçla Program.cs dosyasındaki Main() metodunda Applicaiton sınıfının Run() metoduna parametre olarak "Form1" sınıfının örneği yerine Form2'nin örneğini parametre olarak verdim.


static void Main()

{

  Application.EnableVisualStyles();

  Application.SetCompatibleTextRenderingDefault(false);

  Application.Run(new Form2());

}



Projeki 2. Formu Ekrana Getirmek

Projenizdeki ikinci formu yani başlangıç formu olarak kullanılmayan formu ekrana getirmek istiyorsanız bazı hazırlıkları yapmanız gerekir. Üzerinde çalıştığım projedeki 2. formu ekrana getirirken kullanmak üzere ilk forma bir düğme yerleştirdim ve bu düğmenin Click olayını temsil etmek üzere aşağıda verdiğim metodu hazırladım. Bu metoda yazdığım satır ile Form2 sınıfından yola çıkılarak 'ikinci_Form' adında bir nesne hazırlanmaktadır. Bakmayın siz başka kitaplarda bu işleme 'yavru(m) değişken tanımlama' demelerine burada Form2 sınıfının örneği hazırlanmaktadır, yani nesne hazırlanmaktadır.


private void button1_Click(object sender, EventArgs e)

 {

   Form2 ikinci_form = new Form2();

 }



Yukarıdaki sayfalarda belirtildiği gibi herhangi bir Class'ın(burada Form2) örneği hazırlanırken new anahtar kelimesi kullanılmaktadır. new anahtar kelimesinden sonra ilgili sınıfın yapıcı yani constructor metodunu kullanmak gerekiyor. Yukarıdaki sayfalarda belirtildiği gibi sınıfların yapıcı metoduna sınıfın adı verilmektedir. Buna göre Form2 sınıfının yapıcı metodunun adı 'Form2()' olmaktadır. C# programlama dilinde metotlar kullanılırken metot adına '()' eklenmektedir.

Bazı yazarlar bir sınıfın örneğini almaya yavru değişken tanımlama diyorlar. Tabii bazılarınızın aklına yavru değişken olduğuna göre torun değişken nasıl tanımlanır sorusu gelmiş olabilir. Size bir tiyo: Dünyanın en zor işlerinden birisi nesneye yönelik programcılık kavramlarına sahip olmadan C# gibi %100 nesneye yönelik programlama dilini anlatmaya soyunmaktır.

Bu metoda yazdığım satırda gerçekte 2 işlem yapılmaktadır. İlk işlemde Form2 tipinde değişken tanımlanmaktadır. 2. işlemde ise new anahtar kelimesi ile Form2 sınıfının yapıcı metodu işletilip bu metodun geriye gönderdiği nesne örneği(daha doğrusu nesnenin referansı) tanımlanan değişkene aktarılmaktadır.

Bu şekilde hazırlanan Form2 tipindeki nesne Show() metodu ile ekrana getirilir. 'Form' sınıfının Show() metodunun nasıl kullanıldığını aşağıda görebilirsiniz. 2 form içeren proje başlatıldığında projenin ilk formunun kendiliğin­den ekrana geldiğini biliyorsunuz.


private void button1_Click(object sender, EventArgs e)

 {

   Form2 ikinci_form = new Form2();

   ikinci_form.Show();  

 }



Bu kodda Form2 sınıfının örneğinin referansını tutacak değişkene ikinci_form adını verdim. Olur ya yerli yazarın birisi de kitabında ikinci_form adında bir değişken tanımlamıştır. Tedbir almazsam değişken adı çalmakla suçlanabilirim. 'değişken adı çalmış mı' sorusuna cevap aramak amacıyla bu metni okuyacaklara rehber olması bakımından yukarıda verdiğim kodu bir de aşağıdaki gibi düzenledim. Yani böylece değişkenlere ad seçerken çaresiz kalıp başka kitaplardan değişken adı çalmayı tercih etmediğimi bilgisayar tahsili yapmış öğretim üyelerine, bilen kişilere ve yerli yazarlara kanıtlamış oluyorum.


private void button1_Click(object sender, EventArgs e)

 {

   Form2 ikinci_kazma = new Form2();

   ikinci_kazma.Show();  

 }



Böylece değişkenlere ad bulabildiğimi kanıtladıktan sonra konumuza devam edebiliriz. Ekranda 2. form varken yukarıda verilen kod işletildiğinde, yani formdaki düğme tekrar tıklandığında aynı formun 2. veya 3. kopyası ekrana getirilir. Projedeki 2. formun 2. ve 3. kopyasının aynı anda ekrana gelmesini engellemek için kullanılabilinecek değişik teknikler olmakla birlikte ilk aklıma geleni yazacağım. Bu amaçla yukarıda hazırladığım kodu değiştirip Show() metodu yerine ShowDialog() metodunu kullandım.


private void button1_Click(object sender, EventArgs e)

 {

   Form2 ikinci_form = new Form2();

   ikinci_form.ShowDialog();  

 }



ShowDialog() metodu ile ekrana getirilen form kapatılmadan projenin ana formuna geçilemez. Formları ShowDialog() metodu ile ekrana getirmenin bir diğer özelliği ise şudur: ShowDialog() metodu ile ekrana getirilen form normal bir şekilde yani Kapat düğmesi tıklanarak kapatıldığında bellekten yok edilmeyip gizlenmektedir.

Bu sorunun önüne geçmek, başka bir deyişle hem 2. formu Show() metodu ile ekrana getirmek hem de ekranda aynı anda 2. kopyasının olmasını engellemek için değişken tanımlama satırı düğmeye ait Click() metodunun dışına alınabilinir. Aşağıda verilen kodda bu işlemi nasıl yaptığımı görebilirsiniz.

Yukarıda verdiğim kodda 'ikinci_form' adındaki değişkeni button1_Click() metodu sınırları içinde tanımladığım için bu değişken yani nesne ancak bu metodun sınırları içinde yaşar. Aşağıda verdiğim kodda ise bu değişkeni metodun sınırları dışına, başka bir Class bloğuna aldığım için bu nesne bu Class'ın her yerinde yaşar.


Form2 ikinci_form = new Form2();

private void button1_Click(object sender, EventArgs e)

 {

   ikinci_form.Show();  

 }



Bu şartlarda formdaki düğmeyi tekrar tıklasanız bile projedeki 2. form tekrar ekrana getirilmez. Ancak bu şekilde ekrana getirdiğiniz 2. formu kapattıktan sonra Show() metodu ile tekrar ekrana getirmek istemeniz halinde hata meydana gelir. Çünkü bu şekilde hazırlanıp Show() metodu ile ekrana getirilen form normal bir şekilde kapatıldığında otomatik olarak bellekten silinir. Dolayısıyla yok edilen form tekrar ekrana getirilemez.

Projedeki 2. formun ekrana getirilmesi sırasında yaşanan bütün sorunların önüne geçmek için formu oluşturan ve Show() metodu ile ekrana getiren satırları aynı metoda yazdım ama form nesnesini new anahtar kelimesi ile tekrar oluştururken mevcut olup olmadığını araştır­dım. Söz konusu form henüz oluşturulmadıysa null olmaktadır.


Form2 ikinci_form;

private void button1_Click(object sender, EventArgs e)

 {

  if (ikinci_form == null || ikinci_form.IsDisposed)

   {

     ikinci_form = new Form2();

     ikinci_form.Show();

   }

 }



Yukarıdaki sayfalarda yazılanlara göre projede kaç form olursa olsun 'Program.cs' dosyasında bu formlardan birisinin örneği new anahtar kelimesi ile hazırlanıp Application nesnesinin Run() metoduna parametre olarak verilmektedir. Program.cs dosyasında new anahtar kelimesini birden fazla kez kullanıp farklı sonuçlar elde edebilirsiniz. Bu konuda bilgi vermek için 2 forma sahip yeni bir proje hazırladım ve "Program.cs" dosyasındaki Main() metodunu aşağıdaki gibi düzenledim.


static void Main()

     {

       Application.EnableVisualStyles();

       Application.SetCompatibleTextRenderingDefault(false);

       Application.Run(new Form1());

                  Application.Run(new Form2());

     }



Bu şartlarda proje çalıştırılırsa Run() metodunun kullanıldığı ilk satırda projenin ilk formu ekrana getirilir. İlk form kapatıldığında Run() metodunun 2. kez kullanıldığı satır işletilir ve 2. form ekrana getirilir. Bu şartlarda Form2 kapatıldıktan sonra projenin çalışması sona erer.

Formları Kapatmak ve Projelerin Çalışmasını Sona Erdirmek

Projenizin başlangıç formunu kapattığınızda ister o sırada açık olan başka form olsun ister olmasın projenin çalışması sona erer. İster projenin başlangıç formu ister diğer formlar kapatılmak istensin kapatılma öncesi FormClosing olayı meydana gelmektedir. Bu olay meydana geldiği zaman işletilecek bir metot hazırlayarak kullanıcıyı uyarabilir veya formun kapatılmasını engelleyebilirsiniz.

Bu amaçla Properties penceresinde projenin ilk formunun özellikleri listelenirken Events sekmesine geçtim ve FormClosing olayını çift tıklayıp Express Edition'nın aşağıdaki gibi bir metot hazırlamasını sağladım.


private void Form1_FormClosing(object sender, FormClosingEventArgs e)

 {

 }



Metodun yapısı incelendiğinde birisi object tipinde diğeri FormClosingEventArgs tipinde 2 parametreye sahip olduğu görülür. Kullanıcı formu kapatmak isteyip FormClosing olayının meydana gelmesine neden olduğunda metotta 'e' adı verilen FormClosingEventArgs tipindeki parametreden yararlanıp formun kapatılmasını kullanıcının onayına bağlayabilirsiniz. Bu işlemin nasıl yapıldığını anlatmak için bu metodu aşağıdaki gibi düzenledim.


private void Form1_FormClosing(object sender, FormClosingEventArgs e)

 {

   DialogResult Sonuc;

   Sonuc=MessageBox.Show("Pencere kapatılsın mı?",

       Kapatma", MessageBoxButtons.YesNoCancel);

   if (Sonuc == DialogResult.No || Sonuc == DialogResult.Cancel)

    {

      e.Cancel = true;  

    }

 }



Bu kodda önce DialogResult tipinde bir değişken tanımladım. Çünkü kullanıcıdan onay alınırken kullanılan MessageBox sınıfının Show() metodu geriye DialogResult tipinde bilgi göndermektedir. Bu metotta MessageBox sınıfının Show() metodunun 3 parametreli sürümünü kullandım. 3. parametre olarak MessageBoxButtons.YesNoCancel kullanarak ekrana getirilecek diyalog kutusunda Evet, Hayır ve İptal düğmelerinin olmasını sağladım.

MessageBox sınıfının Show() metodu ile ekrana getirmek istediğim diyalog kutusunda Durdur, Yeniden Dene ve Yoksay düğmelerinin olmasını istemiş olsaydım 3. parametre olarak MessageBoxButtons.AbortRetryIgnore sabitini kullanırdım. MessageBox sınıfının Show() metodu, tıklanan düğmeye bağlı olarak geriye DialogResult tipinde bir değer göndermektedir. Geriye gönderilen bilgiyi öğrenmek için 'Sonuc' değişkenin içeriğini kontrol edip kullanıcı hayır veya iptal düğmesini tıkladıysa metodun FormClosingEventArgs tipindeki 2. parametresinin Cancel özelliğini True yapıp formun kapatılmasını engelledim.

Kullanıcı MessageBox sınıfının Show() metodu ile ekrana getirilen diyalog kutusunda Evet düğmesini tıklarsa 'if' deyimi ile yapılan karşılaştırma doğru değerini vermeyeceği için 'e' adlı parametrenin Cancel özelliği false olarak kalmaya devam edeceği için formun kapatılmasının önüne geçilmemiş olunur.

Yukarıda işaret edildiği gibi projenizin başlangıç formunu kapatmanız halinde projenin çalışması sona ermektedir. Varsayalım ki karşınızda projenizin başlangıç formu yok ve siz projenin çalışmasını sona erdirmek istiyorsunuz. Bu durumda önce başlangıç formunu aktif form yapıp sonra kapatırsınız. Projenizin çalışmasını sona erdirirken Application sınıfının Exit() metodundan yararlanabilirsiniz. Bu metodun nasıl kullanıldığını anlatmak için forma 'Cikis' adında bir düğme yerleştirip bu düğmenin Click olayını temsil eden metodu aşağıdaki gibi düzenledim.


private void Cikis_Click(object sender, EventArgs e)

 {

   DialogResult onay;

   onay = MessageBox.Show("Projeden Çıkılsın mı?",

         "Onay Kutusu", MessageBoxButtons.YesNo);

   if (onay == DialogResult.Yes)

    {

      Application.Exit();  

    }

 }



Bu metotta önce DialogResult tipinde bir değişken tanımladım. Ardından kullanıcıdan programdan çıkılıp çıkılmayacağı konu­sunda MessageBox sınıfının Show() metodu sayesinde onay alınmaktadır. Show metodu bu şekilde kullanıldığında ekrana getirilecek diyalog kutusunda Evet veya Hayır düğmeleri olur.



Kullanıcı bu diyalog kutusundaki Evet düğmesini tıklarsa 'onay' değişkenine 'DialogResult.Yes' bilgisi, Hayır düğmesini tıkladığında ise 'DialogResult.No' bilgisi aktarılır. 'onay' adını verdiğim değişkenine "DialogResult.Yes" sabiti aktarılmışsa if deyimine parametre olarak verilen karşılaştır­manın sonucu doğru olur ve '{' ile '}' işaretleri arasında bulu­nan satır işletilir ve Application.Exit(); satırı ile projenin işletimi sona erdirilir

PictureBox Konrolü

.NET Framework ile gelip Visual Studio ve Express Edition'nın Toolbox'ında yer alan çok sayıda kontrol bulunmaktadır. Gerçekte birer sınıf olan bu kontrollerin her birisinin farklı işlevleri vardır. Bu kitapçıkta ancak birkaç kontrolden söz edebildik. Programcılığa henüz adım atanların ilgisini çeken kontrollerden birisi PictureBox olduğu için kısaca PictureBox'tan söz edeceğiz. Bu amaçla Toolbox'tan yararlanıp üzerinde çalıştığım projenin formuna PictureBox nesnesi yerleştirdim.



Forma PictureBox nesnesini yerleştirdikten sonra PictureBox tarafından sınırlanan alanda istediğiniz resim dosyasının içeriğini görüntüleyebilirsiniz. Bu işlemi Properties penceresinde yapmak yerine kod yazarak yapacağım. Bu amaçla forma Button nesnesi yerleştirip bu düğmenin Click olayı ile ilişkilendirdiğim metodu aşağıdaki gibi düzenledim.


private void resim_sec_Click(object sender, EventArgs e)

 {

   pictureBox1.Image= System.Drawing.Bitmap.FromFile("C:jazz.jpg");

 }



Bu metoda yazdığım satırda System.Drawing'de bulunan Bitmap sınıfının FromFile() metodu ile ilgilendiğim jpg dosyasını okuyup PictureBox nesnesinin Image özelliğine aktardım. Express Edition ve Visual Studio ile hazırlanan projelerde System.Drawing adlı namespace kod dosyasının başında using deyimi ile kullanılacak sınıfların aranacağı listeye dahil edildiği için Bitmap sınıfından önce namespace adını yazmayabilirdim. Burada dikkat edilmesi gereken bir nokta var: C#'ta '' karakteri özel bir karakter olduğu için çift '' kullanmak gerekiyor.

PictureBox'ta görüntülenecek dosyayı çalışma anında seçebilmek için forma ayrıca bir OpenFileDialog nesnesi yerleştirdim. OpenFileDialog nesnesi çalışma anında formun üzerinde görünmediği, başka bir deyişle görsel bir kontrol olmadığı için formun altında hazırlanan panele yerleştirilmektedir.



Çalışma anında kullanıcı formdaki düğmeyi tıkladığında ekrana dosya seçimi yapılan diyalog kutusunu getirmek ve seçilen dosyayı PictureBox'ta görüntülemek için yukarıda verdiğim kodu aşağıdaki gibi düzenledim.


private void resim_sec_Click(object sender, EventArgs e)

 {

   System.Windows.Forms.DialogResult Sonuc;

   openFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF";

   Sonuc = openFileDialog1.ShowDialog();

   if (Convert.ToString(Sonuc) == "OK")

    {

     string Dosya = openFileDialog1.FileName;

     pictureBox1.Image = System.Drawing.Bitmap.FromFile(Dosya);

    }

 }



Bu kodda tanımladığım değişken ve nesnelere verdiğim adlar(resim_sec, Sonuc ve Dosya) herkesin aklına gelebilecek birer değişken adı olduğu için 'değişken adı hırsızı' olarak anılmam an meselesidir. Bu nedenle yani bu kodda tanımlanan değişkenlere başka adlar verilse bile kodun çalışacağını kanıtlamak için bu kodu bir de aşağıdaki gibi düzenledim.


private void adam_sec_Click(object sender, EventArgs e)

 {

   System.Windows.Forms.DialogResult hatice_netice;

   openFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF";

   hatice_netice = openFileDialog1.ShowDialog();

   if (Convert.ToString(hatice_netice) == "OK")

    {

     string kutuk_oglu_kutuk = openFileDialog1.FileName;

     pictureBox1.Image=System.Drawing.Bitmap.FromFile(kutuk_oglu_kutuk);

    }

 }



Bu metotta önce System.Windows.Forms.DialogResult tipinde bir değişken tanımladım. Bu değişkenden dosya seçilen diyalog kutusunu kullanıcının hangi düğme ile kapattığını öğrenirken yararlanacağım. Devamında OpenFileDialog nesnesinin Filter özelliğini ayarladım. Bu ayarlama sayesinde OpenFileDialog nesnesi ile ekrana getirilecek diyalog kutusunda yalnızca geçerli klasördeki JPG, BMP ve GIF uzantılı dosyaların listelenmesini sağladım.

FromFile() metodunun işlevi üzerinde düşünmenizi sağlamak için önce bir Bitmap tipinde bir değişken tanımladım. Devamında FromFile() metodu ile okuduğum resim dosyasını Bitmap nesnesine, oradan da PictureBox'a aktarmaya çalıştım.


private void resim_sec_Click(object sender, EventArgs e)

 {

   Bitmap resim; 

   resim = Bitmap.FromFile("C:jazz.jpg");

   pictureBox1.Image = resim;  

 }



İlk bakışta bu 3 satırlık koddan sonuç alınabileceği sanılabilir. Gerçekte bu kod hataya neden olur. Çünkü Bitmap sınıfının FromFile() metodu geriye Image tipinde nesne göndermesine rağmen Bitmap tipindeki değişkene aktarmaya çalıştık. Yukarıda FromFile() metodunun geriye gönderdiği nesneyi direk PictureBox'ın Image tipindeki Image özelliğine aktardığımız için sorun yaşamamıştık. Bu 3 satırlık kod aşağıdaki gibi düzenlenirse hata meydana gelmez.


private void resim_sec_Click(object sender, EventArgs e)

 {

   Image resim; 

   resim = Image.FromFile("C:jazz.jpg");

   pictureBox1.Image = resim;  

 }



Programcıların en çok gerek duydukları işlemlerden birisi tipler arasında dönüştürme yapmaktır. Image tipindeki nesneyi Bitmap tipindeki nesneye aktarmak için bu kodu değiştirip Bitmap tipinde değişken tanımlayıp FromFile() metodunun geriye gönderdiği Image tipindeki nesneyi dönüştürüp Bitmap tipindeki değişkene aktardım.


private void resim_sec_Click(object sender, EventArgs e)

 {

   Bitmap resim; 

   resim = (Bitmap)Bitmap.FromFile("C:jazz.jpg");

   pictureBox1.Image = resim;  

 }



Burada 2. satırdaki '(Bitmap)' ile söz konusu bilgi Bitmap tipine dönüştürülmektedir. İlgilenilen nesne hangi tipe dönüştürülmek isteniyorsa o tip parantezlerin içinde dönüştürülmek istenen nesnenin önüne yazılmalıdır. Burada kafaların karışmasına neden, Bitmap sınıfının FromFile() metodunun geriye Bitmap yerine Image tipinde bilgi göndermesidir. Bitmap sınıfının FromFile() metodu yerine Image sınıfının FromFile() metodunu kullansaydım dönüştürme yapmaya gerek kalmazdı.


private void resim_sec_Click(object sender, EventArgs e)

 {

   Image resim; 

   resim = Image.FromFile("C:jazz.jpg");

   pictureBox1.Image = resim;  

 }



Dönüştürme işleminin anlaşılmasına katkı olması için şimdi de ICO uzantılı bir dosyayı PictureBox'ta görüntüleyeceğim. Bu amaçla hazırladığım kodu aşağıda görebilirsiniz. System.Drawing'de yer alan Icon sınıfının Bitmap ve Image sınıflarında olduğu gibi FromFile() gibi bir metodu olmadığı için ilgilendiğim ico uzantılı dosyayı Icon sınıfının yapıcı metoduna parametre olarak verdim.


private void resim_sec_Click(object sender, EventArgs e)

 {

   Icon ikon = new Icon("C:kapat.ico");

   pictureBox1.Image = (Image)ikon ;

 }



İlk bakışta bu kodun hatasız çalışıp Icon tipindeki nesnenin Image tipine dönüştürülüp PictureBox'ta görüntüleneceği sanılabilir. Ne ki burada yapıldığı gibi icon tipindeki nesneyi Image nesnesine dönüştürmek mümkün olmadığı için Icon sınıfının ToBitmap() metodundan yararlanmak gerekiyor. Bu metodun nasıl kullanıldığını aşağıda görebilirsiniz.


private void resim_sec_Click(object sender, EventArgs e)

 {

   Icon ikon = new Icon("C:kapat.ico");

   pictureBox1.Image = ikon.ToBitmap() ;

 }

  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

tesekkürler...
arkadaşlar merhaba ben yeni üyeyim umarım burada c# ile ilgili soru sormam yasak falan değildir. Neyse uzatmadan soruma geçeyim. streamReader ile önceden not defterine kaydettiğim bilgileri tekrar okutup oradaki bilginin programdaki aynı ilişkili satırda görünmesini istiyorum. Ama bir türlü yapamıyorum. Örneğin bir puan hesaplama tablosu yaptık, bir öğrencinin matematik-1 neti 23,25 fen-1 neti de 20,5 olsun diyelim. StreamWriter ile bunları çok güzel not defterine kaydettim ancak onu oradan çıkarıp tekrar mat-1 netini 23,25 fen-1 netini de 20,5 yapmayı beceremedim. Ya da başka bir örnek soru daha; not defterinde yazılı bir metin olsun elimizde ve içinde de örneğin: "Şimdi de sosyal bilgiler öğretmeni olan ayşe akdağ'ı kürsüye davet ediyorum." olsun. Benim yazılımım ise oradaki derslerin de öğretmenin isminin de değişmesine imkan verebilmek için aynı satırdaki(yani readline dersem tek başına bu satırı alacak komple) 'sosyal bilgiler' ve 'ayşe akdağ' isimlerinin okunmasını ve gerekirse oraların da değiştirilebilmesini istiyorum. Galiba bu daha açık oldu. Bana bu konuda yardımcı olabilirseniz sevinirim. Pazartesi'ye kadar vaktim var ve sınavda ders hocasının nasıl bir metin vereceğini bilmediğim için yardımlarınızı bekliyorum. Bana kalsa her kelimeyi bir satıra yazarım ve okurken de oradan sadece readline ile okuturum. Neyse çok uzattım. Şimdiden hepinize teşekürler.
hocam formların köşelerini nasıl ovalleştiriyoruz

Yukarı Git