Memik Yanık - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS RSS | İletişim

Visual Basic 6. Ders : Windows Forms Uygulamaları


Daha önceki derslerde önce Visual Basic için hazırlanmış Express Edition sonra da Visual Studio hakkında ön bilgi verdik. Bu derste ise Express Edition ile Windows Forms uygulaması hazırlayacağız. Bu dersin içeriği itibarı ile Express Edition kullanmak ile Visual Studio kullanmak arasında pek 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 Visual Basic uygulamaları hakkında adım adım bilgi vermekti. Yoksa konsol uygulamalarına çok özel durumlarda ihtiyaç duyulmaktadır. Bundan sonra Windows Forms denilen normal uygulamalara odaklanacağız. Yeni uygulama hazırlamak üzere Express Edition’ı başlatıp File menüsünden komut verip New Project diyalog kutusunu ekrana getirip Windows Application şablonunu seçtim.



Visual Basic için hazırlanan Express Edition ile oluşturulan 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 Basic 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.



Visual Studio ve Express Edition o sırada açık olan proje ile ilgili bütün dosya ve klasörleri Solution Explorer penceresinde listelemiyor. Solution Explorer penceresinde proje veya Solution ile ilgili her şeyi görmek istiyorsanız bu pencereye ait araç çubuğundaki Show All Files düğmesini tıklamanız gerekir. Bütün dosyaların Solution Explorer penceresinde listelenmemesi normal bir tercihtir. Çünkü gizlenen dosyaların bazıları programcının içeriğini sık inceleyip değiştirdiği dosyalar değildir.



Başlangıçta gizlenip Show All Files düğmesi tıklandığı zaman görüntülenen My Project klasöründe, üzerinde çalışılan proje hakkında bilgi alınabilinen ve proje ilgili kaynakların organize edildiği çok sayıda dosya bulunmaktadır. Proje çalıştırıldığı zaman hazırlanan EXE dosya “bin” klasörüne konulmaktadır. 

Solution Explorer penceresinde ister projenin bütün dosyaları görüntülensin ister görüntülenmesin My Project seçeneğini çift tıklarsanız ekrana Project Properties penceresi gelir. Project Properties penceresini isterseniz Visual Studio’nun Project menüsünden Properties komutunu vererek ekrana getirebilirsiniz.

Visual Basic için hazırlanmış Express Edition veya Visual Studio ile Visual Basic 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 daha önceki derslerde konsol uygulaması dahilinde ekrana form veya pencere getirmek için System.Windows.Forms’deki Form adlı sınıftan yararlanmıştık. Bu namespace'in yer aldığı referanstan yani DLL dosyasından derleme sırasında derleyiciyi haberdar etmiştik.

Ü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.

Formlar İçin Hazırlanan Kodlar 

Visual Studio veya Visual Basic için hazırlanmış Express Edition ile yeni bir proje hazırlandığında projeye “Form1” adında bir formun dahil edilip bu formun projenin başlangıç formu yapıldığını biliyorsunuz. Daha doğrusu proje için Form1.vb ve Form1.Designer.vb adında 2 kod dosyası hazırlanıp bu 2 kod dosyası içinde .NET Framework ile gelen Form sınıfının mirasçısı Form1 adında bir sınıf hazırlanmaktadır.

Formu daha doğrusu Form1 sınıfını oluşturan kodları görmek istiyorsanız View menüsünden Code komutunu verebilirsiniz. Aşağıda verilen ekran görüntüsünü incelediğinizde projedeki her form için hazırlanan ilk kod dosyasında yalnızca form ile aynı ada sahip bir Class bloğunun bulunduğunu fark edersiniz.



Projedeki ilk formu yani Form1 adındaki Class’ı temsil eden bu kod dosyasında yalnızca Class deklare edilmektedir. Projedeki ilk formun mevcut özellikleri ise formla aynı ada sahip Form1.Designer.vb dosyasında ayarlanmaktadır. Başka bir deyişle “Form1” adlı Class’ın bir kısmı Form1.vb dosyasında, diğer kısmı ise Form1.Designer.vb dosyasında bulunmaktadır. Form1 sınıfının hazırlandığı 2. kod dosyasının içeriğini aşağıda görebilirsiniz.



Visual Studio tarafından otomatik olarak hazırlanan ve adında Designer eki olan bu kod dosyasındaki IntializeComponent() metodundaki satırlar forma yerleştirilen nesnelere göre artabilmektedir. Bu sırada Toolbox’tan yararlanıp forma herhangi bir nesne yerleştirir veya Properties penceresinden yararlanıp formun özelliklerinde değişiklik yaparsanız IntializeComponent() metoduna yeni satırlar eklenir veya mevcut satırlarda değişiklik meydana gelir. Çünkü bu metotta, form ve forma yerleştirilen nesneler hazırlanıp özellikleri ayarlanmaktadır. Projenin ilk formuna bir Button nesnesi yerleştirince “Form1” adlı class’ın 2. kısmının saklandığı “Form1.Designer.vb” dosyasındaki InitializeComponent() metodu aşağıda verilen şekle dönüştü. 

<System.Diagnostics.DebuggerStepThrough()> _
 Private Sub InitializeComponent()
   Me.Button1 = New System.Windows.Forms.Button
   Me.SuspendLayout()
   Me.Button1.Location = New System.Drawing.Point(75, 113)
   Me.Button1.Name = "Button1"
   Me.Button1.Size = New System.Drawing.Size(75, 23)
   Me.Button1.TabIndex = 0
   Me.Button1.Text = "Button1"
   Me.Button1.UseVisualStyleBackColor = True
   Me.AutoScaleDimensions=New System.Drawing.SizeF(6.0!, 13.0!)
   Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
   Me.ClientSize = New System.Drawing.Size(292, 273)
   Me.Controls.Add(Me.Button1)
   Me.Name = "Form1"
   Me.Text = "Form1"
   Me.ResumeLayout(False)
 End Sub

“Form1.Designer.vb” dosyasındaki InitializeComponent() metodunda Button nesnesi ile ilgili satırları silerseniz Button nesnesini formun üzerinden uzaklaştırmış olursunuz. Başka bir deyişle; Visual Studio veya Express Edition tasarım anında formun görsel yapısını InitializeComponent() metodunun içeriğine bakarak oluşturmaktadır. Yani Visual Studio ve Express Edition tasarım anında InitializeComponent metodundaki satırları işletip ona göre formun görsel yapısını hazırlamaktadır.

Konu üzerinde düşünmenizi sağlamak için forma bir TextBox yerleştirip Designer.vb dosyasına müdahale edip bu TextBox’ın Text özelliğini değiştiren bir satır ekledim.



Bu değişiklikten sonra tasarım anında formun görsel yapısının görüntülendiği pencereye döndüğünüzde TextBox’ın içeriğinin değiştiğini görürsünüz. Çünkü Visual Studio ve Express Edition tasarım anında sürekli olarak Form1.Designer.vb dosyasındaki InitializeComponent() metodunu gözetlemekte ve bu metodun içeriğine göre formun görsel yapısını oluşturmaktadır. Bu metodun adını değiştirmeniz veya tümden silmeniz halinde formun tasarım ve çalışma anındaki görünümü Form sınıfından türetildiği ilk hali gibi olur. 

Toolbox’tan yararlanarak forma yerleştirdiğim Button nesnesi ile ilgili olarak Form1.Designer.vb dosyasındaki InitializeComponent() metoduna yazılan satırlara dikkat ederseniz Button nesnesinin Add() metodu ile formun Controls koleksiyonuna eklendiğini görebilirsiniz. Express Edition ve Visual Studio tasarım anında ancak ilgili formun Controls koleksiyonuna eklenebilinen nesneleri formun üzerinde görüntülemektedir. Button nesnesinin Controls koleksiyonuna eklendiği satırı InitializeComponent() metodundan silerseniz button nesnesi hem tasarım anında hem de çalışma anında formun üzerinde görünmez.

Toolbox’tan yararlanıp forma yerleştirilen bazı kontroller görsel kontroller olmadıkları, yani çalışma anında formun üzerinde görünmedikleri için formun altındaki panele yeştiriliyor. OpenFileDialog ve SaveFileDialog görsel olmayan kontrollere örnek olarak gösterilebilir.




OpenFileDialog gibi görsel olmayan nesneler formun Controls koleksiyona dahil edilemezler.
InitializeComponent() metoduna ekleme yapıp OpenFileDialog nesnesini formun Controls koleksiyonuna Add() metodu ile eklemek isterseniz hata meydana gelir. 

Formlara Nesne Yerleştirmek

Yukarıdaki sayfalarda Express Edition veya Visual Studio ile hazırlanan Visual Basic 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. Beni dinlerseniz 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 ve Visual Studio 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.vb” adlı kod dosyasına bazı satırlar ekler. Bu satırların sayesinde Button1 nesnesi formun üzerinde görünmeye başlar. 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.vb 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.vb dosyasına neler yazmış? Form1.Designer.vb 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 vermeyiniz. 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 New anahtar kelimesi ile button nesnesini hazırlıyor. Devamında bu nesnenin Name, Location, Size, Text gibi birkaç özelliğini ayarlıyor. Bu sırada Form1.Designer.vb 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 Properties penceresinde veya fare ile ayarlamak daha kolay olduğu için programcılar çok gerekmedikçe nesnelerin özelliklerini ayarlamak için Designer.vb 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.vb(Design) sekmesini tıklayıp Express Edition penceresi içinde Form1.Designer.vb 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 genellikle 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” adlı nesnenin 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.vb 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.vb” adlı kod dosyasının görüntülenmesini sağladım.

 

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.vb dosyasında programcının yazdığı kodlar yer alırken formun görsel yapısı ile ilgili satırlar Form1.Designer.vb 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. 

Şimdi bu kod dosyasında yani Form1.vb 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
Class Form1
   PrivateSub ilk_button_Click(ByVal sender As Object, ByVal e As EventArgs) 
      MessageBox.Show("Düğmeyi Tıkladınız")
   End Sub
EndClass

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.vb" dosyasındaki InitializeComponent metodudur. Bu metodun içine yazdığım satırı aşağıda görebilirsiniz.

 

Bu satırda AddHandler deyiminden sonra yazılan “Button1” düğmenin adıdır. Düğme adından sonra yazılan Click ise Button1 nesnesinin tıklama olayını işaret etmektedir. Tabii bu satırdaki “Me” gözünüzden kaçmamıştır: Me, kendisi için metot yazılan “Form1” sınıfını temsil etmektedir. AddressOf deyiminden sonra yazılanın ise Form1.vb 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.vb’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.vb dosyasındaki metodu hem de Form1.Designer.vb 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ırla aynı işleve sahip bir ayarlamayı otomatik olarak yapar. 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. Express Edition tarafından hazırlanan metodu yakından incelerseniz metot adının sonunda Handles deyimine(anahtar kelime) yer verildiğini görürsünüz. Handles anahtar kelimesi yukarıda kullandığımız AddHandler deyimiyle benzer işleve sahiptir ve burada bu metodun “Button1” nesnesinin Click olayını temsil etmesini sağlamaktadır.

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 herhangi bir tepki vermez.

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 penceredeki Events düğmesi tıklandığında ise o sırada seçili durumdaki nesneye kaynaklı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.vb dosyasındaki Button1_Click() metoduyla Handles deyimi sayesinde 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.vb dosyadaki metot ile olayı ilişkilendiren Handles deyimi 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’dan yararlanıp Button1 için hazırlayıp Button1_Click() adını verdiğim metot işletilir. Yan 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 metot adının sonunda Handles deyimiyle birlikte 2 farklı nesnenin Click olayı işaret edilir. 

Private
Sub Button1_Click(ByVal sender As Object, _
        ByVal e As EventArgs) Handles Button1.Click, Button2.Click
EndSub

Visual Basic’te kod sayırları alt tire(_) ile bölünür. Bu derslerde genişliği sayfanın genişliğimden fazla olan kod satırlarını ”_” ile böldüm. Bu metoda bakarak satır bölme işlemini nasıl yapıldığını görebilirsiniz. 

Ş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.vb 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.vb dosyasından bu metot 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 bir metot hazırlamak istediğinizi varsaymaktadır. Bu nedenle TextBox’ı çift tıklarsanız hem Form1.vb dosyasının içeriği görüntülenir hem de aşağıdaki gibi bir metot hazırlanır.

Public
Class Form1
   Private Sub TextBox1_TextChanged(ByVal sender As Object,  _
                            ByVale As EventArgs) Handles TextBox1.TextChanged
   End Sub
EndClass

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, 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 sırada 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 Handles deyimiyle bu metot ile KeyPress olayını ilişkilendirir. 

Public
Class Form1
   Private Sub TextBox1_KeyPress(ByVal sender As Object, _
                    ByVale As KeyPressEventArgs) Handles TextBox1.KeyPress
   End Sub
EndClass

Express Edition tarafından hazırlanan bu metotta, metot adından sonra parantezlerin içinde
ByValsender As System.Object, ByVal e As KeyPressEventArgsbilgisi 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 ana kadar TextBox’a girilmiş bilgileri bir diyalog kutusu içinde ekrana getirmek için bu metodu aşağıdaki gibi düzenledim. 

Private
Sub TextBox1_KeyPress(ByVal sender As Object, _
                        ByVale As KeyPressEventArgs) Handles TextBox1.KeyPress
   If (e.KeyChar = Chr(13)) Then
        MessageBox.Show(TextBox1.Text)
   End If
EndSub 

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 söz konusu TextBox’la ilgili olarak 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 programcılık kitabı yazarlarından 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
Sub TextBox1_Enter(ByVal sender As Object, ByVale As EventArgs) Handles TextBox1.Enter
   TextBox1.BackColor = Color.GreenYellow
EndSub 

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 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
Sub TextBox1_Leave(ByVal sender As Object, ByVale As EventArgs) Handles TextBox1.Leave
   TextBox1.BackColor = Color.White
EndSub

Bazen istenen miktarda bilgi girmediği için kullanıcının TextBox’tan ayrılmasına izin verilmek istenmez. Bu gibi durumlarda TextBox sınıfının 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
Sub TextBox1_Validated(ByVal sender As Object, _
                                ByVale As EventArgs) Handles TextBox1.Validated
  If (TextBox1.Text = "") Then
     MessageBox.Show("Bu alanı boş geçemezsiniz")
     TextBox1.Focus()
  End If
EndSub 

Projeler İçin 2. Form Hazırlamak

Yukarıdaki sayfalarda işaret edildiği gibi Visual Studio ve 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 kutusunu 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 verilen 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. bir form dahil edince bu formu temsilen ikisi kod dosyası olmak üzere toplam 3 dosya hazırlandı. Form2.Designer.vb dosyasında formun görsel yapısı ile ilgili kodlar bulunurken “Form2.vb” dosyasında ise programcının yazdığı kod 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. Başlangıç formu ile ilgili ayarlamayı Project menüsündeki Properties komutu ile ekrana getirilen penceredeki Startup form liste kutusunda yapabilirsiniz.



Projenin başlangıç formunun Form2 olmasını istiyorsanız bu liste kutusunda Form2’yi seçmeniz yeterlidir. Project Properties penceresinde Startup form liste kutusunda başlangıç formu değişikliği yapıldığında Visual Studio projenin Application.Designer.vb dosyasındaki OnCreateMainForm() adlı metotta değişiklik yapıp seçilen formun adını MainForm özelliğine aktarmaktadır. Dolayısıyla projenin başlangıç formunu Application.Designer.vb kod dosyasında değişiklik yaparak seçebilirsiniz.

 

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 bazı programcılık kitaplarında bu işleme “yavru(m) değişken tanımlama” denilmesine burada Form2 sınıfının örneği alınmaktadır, yani nesne hazırlanmaktadır. 

Private Sub Button1_Click(ByVal sender As Object,
ByVal e As EventArgs) Handles Button1.Click
    Dim ikinci_form As New Form2()
End Sub

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. Visual Basic 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 Visual Basic ve 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ğinden ekrana geldiğini biliyorsunuz. 

Private Sub Button1_Click(ByVal sender As Object,
ByVal e As EventArgs) Handles Goster.Click
    Dim ikinci_form As New Form2()
    ikinci_form.Show()
End Sub 

Bu kodda Form2 sınıfının örneğinin referansını tutacak değişkene “ikinci_form” adını verdim. Olur ya yerli programcılık kitabı yazarlarından birisi de kitabında “ikinci_form” adında bir değişken tanımlamıştır. Tedbir almazsam değişken adı çalmakla tekrar suçlanabilirim. “Memik Yanık değişken adı çalmış mı” sorusuna cevap aramak amacıyla bu metni okuyacak yerli programcılık kitabı yazarlarına rehber olması bakımından yukarıda verdiğim kodu bir de aşağıdaki gibi düzenledim. Yani 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 Sub Button1_Click(ByVal sender As Object,
ByVal e As EventArgs) Handles Goster.Click
    Dim ikinci_kazma As New Form2()
    ikinci_kazma.Show()
End Sub 

Böylece değişkenlere ve nesnelere ad bulabildiğimi kanıtladıktan sonra konumuza devam edebiliriz. Ekranda 2. form varken yukarıda verilen kod işletildiğinde, yani ilk formdaki düğme tekrar tıklandığında aynı formun 2. veya 3. kopyası ekrana getirilir. Aşağıda verilen ekran görüntüsünü Form1’deki düğmeyi 2. kez tıkladıktan sonra aldım.



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 Sub Button1_Click(ByVal sender As Object,
ByVal e As EventArgs) Handles Goster.Click
    Dim ikinci_form As New Form2()
    ikinci_form.ShowDialog()
End Sub

S
howDialog() 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 olayını temsil eden metodunun dışına yani Class bloğunun içine 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. 

Public Class Form1
  Dim Yeni_form As New Form2()
  Private Sub Button1_Click(ByVal sender As Object, _
                            ByVal e As System.EventArgs) Handles Goster.Click
     Yeni_form.Show()
  End Sub
End Class

Bu şartlarda Form1’deki düğmeyi tekrar 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ü Show() metodu ile ekrana getirilen formlar kapatıldığında otomatik olarak Dispose edilmekte yani bellekten silinmektedir. Bu sorunun önüne geçmek için Windows’un FindWindow() adlı API fonksiyonundan yararlanma yoluna gideceğim. Bu amaçla Form1’e ait Class bloğu içinde FindWindow() fonksiyonunu aşağıdaki gibi deklare ettim. 

Public
Class Form1
  Declare Function FindWindow Lib "user32" Alias _
        "FindWindowA" (ByVal lpClassName As String, _
                ByVal lpWindowName As String) As Integer
End Class

Windows’un FindWindow() fonksiyonu 2 parametreye sahiptir ve geriye kendisine 2. parametre olarak başlığı verilen pencerenin handle yani numarasını geriye göndermektedir. Ardından Form1’deki düğmenin Click olayını temsil eden metodu aşağıdaki düzenledim. 

Private
Sub Button1_Click(ByVal sender As Object, ByVale As EventArgs) Handles Goster.Click
   Dim Yeni_form As Form2
   Dim pencere_no As Integer
   Pencere_no = FindWindow(Nothing, "Form2")
   If pencere_no = 0 Then
      Yeni_form = New Form2()
      Yeni_form.Show()
   End If
End Sub 

Diğer yandan Visual Studio ile hazırlanan Visual Basic projesindeki her form için global yani projedeki her Class’ta yaşayan bir form nesnesi hazırlanmaktadır. Dolayısıyla projedeki 2. formu ekrana getirmek için herhangi bir hazırlık yapmaya gerek olmadan direk Form2.Show() demek yeterli olmaktadır. Bu şekilde ekrana getirilen 2. form ekranda iken bu kod tekrar çalıştırılırsa 2. formun 2. kopyası ekrana gelmez. 

Private
Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Goster.Click
    Form2.Show()
End Sub

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 işlemin nasıl yapıldğını anlatmak için 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 Sub Form1_FormClosing(ByVal sender As Object, _
         ByVal FormClosingEventArgs) Handles MyBase.FormClosing

End Sub

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 “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 Sub Form1_FormClosing(ByVal sender As Object, _
                    ByVal e As FormClosingEventArgs) Handles MyBase.FormClosing
    Dim Cevap As System.Windows.Forms.DialogResult
    Cevap=MessageBox.Show("Form kapatılacak", "Kapatma", MessageBoxButtons.YesNo)
    If Cevap = Windows.Forms.DialogResult.No Then
       e.Cancel = True
    End If
End Sub 

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.YesNo kullanarak ekrana getirilecek diyalog kutusunda Evet ve Hayır 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 “Cevap” değişkenin içeriğini kontrol edip kullanıcı Hayır 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
Sub Cikis_Click(ByVal sender As Object, ByVale As EventArgs) Handles Cikis.Click
    Dim onay As System.Windows.Forms.DialogResult
    onay = MessageBox.Show("Frojeden Çıkılsın mı?""Onay Kutusu", MessageBoxButtons.YesNo)
    If onay = Windows.Forms.DialogResult.Yes Then
       Application.Exit()
    End If
End Sub 

Bu metotta önce DialogResult tipinde bir değişken tanımladım. Ardından kullanıcıdan programdan çıkılıp çıkılmayacağı konusunda 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ırmanın sonucu doğru olur ve “Application.Exit()” satırı ile projenin işletimi sona erdirilir.

PictureBox Kontrolü

.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 derslerde 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
Sub dosya_sec_Click(ByVal sender As Object, ByVale As EventArgs) Handles dosya_sec.Click
      PictureBox1.Image = System.Drawing.Bitmap.FromFile("C:\jazz.jpg")
End Sub

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 Imports 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.

 

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
Sub dosya_sec_Click(ByVal sender As Object, ByVale As EventArgs) Handles dosya_sec.Click
    Dim sonuc As System.Windows.Forms.DialogResult
    OpenFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF"
    sonuc = OpenFileDialog1.ShowDialog()
     If (sonuc = Windows.Forms.DialogResult.OK) Then
       Dim dosya As String = OpenFileDialog1.FileName
       PictureBox1.Image = System.Drawing.Bitmap.FromFile(dosya)
    End If
End Sub 

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
Sub adam_sec_Click(ByVal sender As Object, ByVale As EventArgs) Handles dosya_sec.Click
    Dim hatice_netice As System.Windows.Forms.DialogResult
    OpenFileDialog1.Filter = "Resim Dosyaları |*.JPG;*.BMP;*.GIF"
    hatice_netice = OpenFileDialog1.ShowDialog()
    If (hatice_netice = Windows.Forms.DialogResult.OK) Then
      Dim kutuk_adam As String = OpenFileDialog1.FileName
      PictureBox1.Image = System.Drawing.Bitmap.FromFile(kutuk_adam)
   End If
End Sub

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
Sub dosya_sec_Click(ByVal sender As Object,  ByVale As EventArgs) Handles dosya_sec.Click
    Dim resim As Bitmap
    resim = Bitmap.FromFile("C:\jazz.jpg")
    PictureBox1.Image = resim
End Sub

İ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
Sub dosya_sec_Click(ByVal sender As Object, ByVale As EventArgs) Handles dosya_sec.Click
    Dim resim As Image
    resim = Image.FromFile("C:\jazz.jpg")
    PictureBox1.Image = resim
End Sub

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
Sub dosya_sec_Click(ByVal sender As Object, ByVale As EventArgs) Handles dosya_sec.Click
    Dim resim As Bitmap
    resim = CType(Bitmap.FromFile("C:\jazz.jpg"), Bitmap)
    PictureBox1.Image = resim
End Sub 

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
Sub dosya_sec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dosya_sec.Click
    Dim ikon As New Icon("C:\kapat.ico")
    PictureBox1.Image = CType(ikon, Image)
End Sub

İ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
Sub dosya_sec_Click(ByVal sender As Object, ByVale As EventArgs) Handles dosya_sec.Click
    Dim ikon As New Icon("C:\kapat.ico")
    PictureBox1.Image = ikon.ToBitmap()
End Sub

Biraz Reklam

Visual Basic hakkında ayrıntılı bilgi edinmek istiyorsanız aşağıda resmini verdiğim C# 3.0 kitabıma bakabilirsiniz. En kapsamlı C# kitabı iddiası ile hazırlanan bu kitabı kitapçılardan, Seçkin Yayıncılıktan, HepsiBurada.com'dan veya Kitapyurdu.com'undan temin edebilirsiniz. Orada burada Memik Yanık ve bu kitap aleyhine yazılan bir şeyler görürseniz inanmayın ve kitabın nasıl bir içeriğe sahip olduğunu görmek istiyorsanız bu kitaptan alınma şu bölüme bakabilirsiniz.

Programcılık Dersleri 06.07.2009 19:36:10

YORUM YOK


YorumlarYorum Yaz
Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS | İletişim
Memik Yanık 2004-2009 © Tüm Hakları Saklıdır.
Hazırlayan www.semgoksu.com