BİLGİSAYARLI KONTROL SİSTEMLERİ İçindekiler GÖRSEL ... · yönelimli bir programlama dili...

119
1 BİLGİSAYARLI KONTROL SİSTEMLERİ İçindekiler 1. GÖRSEL PROGRAMLAMA ............................................................................................................................ 5 1.1. Programlamaya GiriĢ .......................................................................................................................................... 5 1.2. Programlama Dilleri ........................................................................................................................................... 6 1.2.1. Programlama Dillerinin Tarihçesi ........................................................................................................................... 6 1.3. Programın Derlenmesi ........................................................................................................................................ 7 1.4. Microsoft .NET Platformu.................................................................................................................................. 7 1.4.1. Yazılım GeliĢtirme Dünyası .................................................................................................................................... 7 1.4.2. Sorunun Temeli ....................................................................................................................................................... 8 1.5. Microsoft Visual Studio Arayüzü ....................................................................................................................... 9 1.5.1. Solution Explorer Paneli ......................................................................................................................................... 9 1.5.2. Toolbox(Araç Kutusu) Paneli ................................................................................................................................. 9 1.5.3. Properties (Özellikler) Paneli .................................................................................................................................. 9 1.6. Visual Basic.NET ile Windows Tabanlı Programlama .................................................................................... 10 1.6.1. Ġlk Uygulama (Merhaba!. ġu anda tarih ve saat…) ............................................................................................... 10 1.7. Özellikler, Metotlar ve Olaylar ......................................................................................................................... 10 1.7.1. Özellikler ............................................................................................................................................................... 11 1.7.2. Metotlar ................................................................................................................................................................. 12 1.8. Visual Basic .NET'e Kontrollerin Eklenmesi ................................................................................................... 13 1.8.1. Form ...................................................................................................................................................................... 14 1.8.2. Button .................................................................................................................................................................... 14 1.8.3. TextBox................................................................................................................................................................. 15 1.8.4. Label ..................................................................................................................................................................... 15 1.8.5. ComboBox ............................................................................................................................................................ 15 1.8.6. ListBox .................................................................................................................................................................. 16 1.8.7. Timer ..................................................................................................................................................................... 16 1.8.9. Yazı iĢlemleri: ....................................................................................................................................................... 19 1.9. KULLANICIDAN VERĠ ALMAK VE KULLANICIYA BĠLGĠ GÖSTERMEK (Inputbox() ve Messagebox()).................................................................................................................. 19 1.9.1. Inputbox: ............................................................................................................................................................... 19 1.9.2. MessageBox .......................................................................................................................................................... 20 1.10. DeğiĢken Ve Sabitler .................................................................................................................................... 20 1.10.1. DeğiĢkenler: .......................................................................................................................................................... 20 1.10.2. Sabitler .................................................................................................................................................................. 22 1.11. Veri Tipleri ................................................................................................................................................... 23 1.12. Structure (Kullanıcı tanımlı) veri tipi ........................................................................................................... 24 1.13. Diziler ........................................................................................................................................................... 24 1.14. Debug ............................................................................................................................................................ 26 1.15. Operatörler .................................................................................................................................................... 27

Transcript of BİLGİSAYARLI KONTROL SİSTEMLERİ İçindekiler GÖRSEL ... · yönelimli bir programlama dili...

1

BİLGİSAYARLI KONTROL SİSTEMLERİ

İçindekiler 1. GÖRSEL PROGRAMLAMA ............................................................................................................................ 5

1.1. Programlamaya GiriĢ .......................................................................................................................................... 5

1.2. Programlama Dilleri ........................................................................................................................................... 6

1.2.1. Programlama Dillerinin Tarihçesi ........................................................................................................................... 6

1.3. Programın Derlenmesi ........................................................................................................................................ 7

1.4. Microsoft .NET Platformu .................................................................................................................................. 7

1.4.1. Yazılım GeliĢtirme Dünyası .................................................................................................................................... 7

1.4.2. Sorunun Temeli ....................................................................................................................................................... 8

1.5. Microsoft Visual Studio Arayüzü ....................................................................................................................... 9

1.5.1. Solution Explorer Paneli ......................................................................................................................................... 9

1.5.2. Toolbox(Araç Kutusu) Paneli ................................................................................................................................. 9

1.5.3. Properties (Özellikler) Paneli .................................................................................................................................. 9

1.6. Visual Basic.NET ile Windows Tabanlı Programlama .................................................................................... 10

1.6.1. Ġlk Uygulama (Merhaba!. ġu anda tarih ve saat…) ............................................................................................... 10

1.7. Özellikler, Metotlar ve Olaylar ......................................................................................................................... 10

1.7.1. Özellikler ............................................................................................................................................................... 11

1.7.2. Metotlar ................................................................................................................................................................. 12

1.8. Visual Basic .NET'e Kontrollerin Eklenmesi ................................................................................................... 13

1.8.1. Form ...................................................................................................................................................................... 14

1.8.2. Button .................................................................................................................................................................... 14

1.8.3. TextBox ................................................................................................................................................................. 15

1.8.4. Label ..................................................................................................................................................................... 15

1.8.5. ComboBox ............................................................................................................................................................ 15

1.8.6. ListBox .................................................................................................................................................................. 16

1.8.7. Timer ..................................................................................................................................................................... 16

1.8.9. Yazı iĢlemleri: ....................................................................................................................................................... 19

1.9. KULLANICIDAN VERĠ ALMAK VE KULLANICIYA BĠLGĠ GÖSTERMEK

(Inputbox() ve Messagebox()).................................................................................................................. 19

1.9.1. Inputbox: ............................................................................................................................................................... 19

1.9.2. MessageBox .......................................................................................................................................................... 20

1.10. DeğiĢken Ve Sabitler .................................................................................................................................... 20

1.10.1. DeğiĢkenler: .......................................................................................................................................................... 20

1.10.2. Sabitler .................................................................................................................................................................. 22

1.11. Veri Tipleri ................................................................................................................................................... 23

1.12. Structure (Kullanıcı tanımlı) veri tipi ........................................................................................................... 24

1.13. Diziler ........................................................................................................................................................... 24

1.14. Debug ............................................................................................................................................................ 26

1.15. Operatörler .................................................................................................................................................... 27

2

1.15.1. Aritmetiksel Operatörler ....................................................................................................................................... 27

1.15.2. KarĢılaĢtırma Operatörleri ..................................................................................................................................... 28

1.15.3. String Operatörleri ................................................................................................................................................ 28

1.16. Karar Yapıları ve Döngüler .......................................................................................................................... 29

1.16.1. If ............................................................................................................................................................................ 29

1.16.2. If Then Else ........................................................................................................................................................... 30

1.16.3. ElseIf ..................................................................................................................................................................... 31

1.17. KoĢul Operatörleri (And, Or, Not, AndAlso, OrElse) .................................................................................. 31

1.17.1. And ........................................................................................................................................................................ 31

1.17.2. Or .......................................................................................................................................................................... 31

1.17.3. XOr ....................................................................................................................................................................... 31

1.17.4. Not......................................................................................................................................................................... 32

1.17.5. AndAlso ................................................................................................................................................................ 32

1.17.6. OrElse ................................................................................................................................................................... 32

1.18. Select Case .................................................................................................................................................... 32

1.18.1. To Kullanımı ......................................................................................................................................................... 33

1.18.2. Is Kullanımı........................................................................................................................................................... 33

1.18.4. Hangi Karar Cümlesi Nerede Kullanılır? .............................................................................................................. 34

1.19. Döngüler ....................................................................................................................................................... 35

1.19.1. For Next ................................................................................................................................................................ 35

1.19.2. For Döngülerinin Ġç Ġçe Kullanımı ........................................................................................................................ 36

1.19.3. While ..................................................................................................................................................................... 37

1.19.4. Do - Loop .............................................................................................................................................................. 37

1.19.5. Do While ............................................................................................................................................................... 38

1.19.6. Do Until ................................................................................................................................................................ 38

1.19.7. Sonsuz Döngüler ................................................................................................................................................... 38

1.19.8. Hangi Döngü Nerede Kullanılır? .......................................................................................................................... 38

1.20. Hata Yakalama .............................................................................................................................................. 39

1.20.1. Try Catch Finally .................................................................................................................................................. 40

1.21. Fonksiyonlar ve Yordamlar .......................................................................................................................... 41

1.21.1. Sub ........................................................................................................................................................................ 42

1.21.2. Parametre Kullanımı ............................................................................................................................................. 43

1.21.3. ParamArray ........................................................................................................................................................... 45

1.21.4. Function ................................................................................................................................................................ 46

1.21.5. ByVal ve ByRef Ġncelemesi .................................................................................................................................. 47

1.22. Windows Programlama ................................................................................................................................. 48

1.22.1. Form Nesnesi ........................................................................................................................................................ 48

1.22.2. Label ..................................................................................................................................................................... 50

1.22.3. TextBox ................................................................................................................................................................. 51

1.22.4. Button .................................................................................................................................................................... 53

1.22.5. CheckBox .............................................................................................................................................................. 53

1.22.6. RadioButton .......................................................................................................................................................... 55

3

1.22.7. GroupBox .............................................................................................................................................................. 55

1.22.8. ListBox .................................................................................................................................................................. 55

1.22.9. ComboBox ............................................................................................................................................................ 56

1.22.10. NumericUpDown .................................................................................................................................................. 57

1.22.11. TabControl ............................................................................................................................................................ 59

1.22.12. DateTimePicker .................................................................................................................................................... 60

1.22.13. MonthCalendar ...................................................................................................................................................... 61

1.22.14. Timer ..................................................................................................................................................................... 62

1.22.15. ProgressBar ........................................................................................................................................................... 63

1.22.16. ErrorProvider ........................................................................................................................................................ 64

1.22.17. PictureBox ............................................................................................................................................................. 65

1.22.18. ImageList .............................................................................................................................................................. 66

1.22.19. ListView ................................................................................................................................................................ 67

1.22.20. Dinamik Kontroller ............................................................................................................................................... 69

1.22.21. UYGULAMA: Hesap Makinesi............................................................................................................................ 70

1.23. Menü Tasarımı ve MDI Formlar ................................................................................................................... 72

1.23.1. Menü Tasarımı ...................................................................................................................................................... 72

1.23.2. MenuStrip ............................................................................................................................................................. 72

1.23.3. ContextMenu ......................................................................................................................................................... 73

1.23.4. ToolStrip ............................................................................................................................................................... 74

1.23.5. ToolTip ................................................................................................................................................................. 74

1.23.6. StatusStrip ............................................................................................................................................................. 75

1.23.7. NotifyIcon ............................................................................................................................................................. 75

1.23.8. RichTextBox ......................................................................................................................................................... 75

1.23.9. Notepad Uygulaması ............................................................................................................................................. 77

1.23.10. MDI Formlar ......................................................................................................................................................... 84

1.23.11. Fare Olayları ......................................................................................................................................................... 84

2. BÖLÜM: Veri Yapıları ........................................................................................................................................ 84

2.1. Access' e GiriĢ .................................................................................................................................................. 85

2.1.1. Access Ortamı ....................................................................................................................................................... 85

2.1.2. Tablo ..................................................................................................................................................................... 86

2.1.3. Tabloya yeni alan ekleme veya tabloda yeni alan oluĢturma ................................................................................ 88

2.1.4. Veri türleri ............................................................................................................................................................. 88

2.2. SQL (Structured Query Language) ................................................................................................................... 90

2.2.1. SELECT Sorgusu .................................................................................................................................................. 90

2.2.2. Hesaplama Fonksiyonları ...................................................................................................................................... 92

2.2.3. INSERT ................................................................................................................................................................. 93

2.2.4. UPDATE ............................................................................................................................................................... 93

2.2.5. DELETE ............................................................................................................................................................... 93

2.2.6. Aritmetiksel ĠĢlemler ............................................................................................................................................. 93

3. BÖLÜM: VERĠTABANI ĠLE ÇALIġMAK ........................................................................................................ 94

3.1. Tablodan özel veri çekmek için sorgu çalıĢtırmak ........................................................................................... 99

4

3.2. Bindingsource ................................................................................................................................................. 100

3.2.1. BindingSource metotları: .................................................................................................................................... 100

3.2.2. BindingSource 'ta Navigasyon(Gezinme iĢlemleri) ............................................................................................ 101

3.2.3. BindingSource "Position" yöntemi ..................................................................................................................... 101

3.2.4. BindingSource'ta index kullanımı: ...................................................................................................................... 101

3.2.5. BindingSource "RemoveCurrent" Yöntemi: ....................................................................................................... 102

3.2.6. BindingSource "RemoveFilter" Yöntemi: ........................................................................................................... 102

3.2.7. BindingSource "Sort" ve "RemoveSort" Yöntemleri: ......................................................................................... 102

3.3. Tabloya yeni kayıt ekleme silme düzenleme .................................................................................................. 102

4. BÖLÜM: VISUAL BASIC .NET ĠLE RAPORLAMA ..................................................................................... 103

5. BÖLÜM: SERĠ ĠLETĠġĠM ................................................................................................................................ 107

5.1. ASENKRON SERĠ ĠLETĠġĠM ÖZELLĠKLERĠ ............................................................................................ 107

5.2. SFR‟SĠZ SERĠ ĠLETĠġĠM .............................................................................................................................. 107

5.3. RS232 SEVĠYE ÇEVĠRĠCĠSĠ ........................................................................................................................ 108

5.4. DONANIM ÖZELLĠKLERĠ .......................................................................................................................... 108

5.5. SERĠ HABERLEġME PORTLARI ............................................................................................................... 108

5.6. RS232 ASENKRON SERĠ ĠLETĠġĠM VE DALGA FORMLARI ................................................................ 110

5.7. USART (UNĠVERSAL SYNCRONOUS / ASYNCRONOUS RECEĠVER / TRANSMĠTTER) Modülü Ve

Özellikleri ................................................................................................................................................................. 110

5.8. ÖZEL YAZMAÇLAR VE BĠTLERĠ ............................................................................................................. 111

5.8.1. TXSTA YAZMACI ............................................................................................................................................ 111

5.8.2. RCSTA YAZMACI ............................................................................................................................................ 111

5.9. USART iletiĢim hızı (BRG: Baud Rate Generator) ....................................................................................... 111

5.10. USART‟ın Kullanımı .................................................................................................................................. 112

5.10.1. USART ile asenkron veri göndermek ................................................................................................................. 112

5.10.2. UYGULAMA 1- USART Kullanılarak PIC‟den PC‟ye doğru tek yönlü Asenkron Seri veri transferi .............. 113

5.10.3. USART ile Asenkron veri almak ........................................................................................................................ 114

5.10.4. UYGULAMA 2- USART Kullanılarak PC‟den PIC‟e doğru tek yönlü Asenkron Seri veri transferi ................ 115

5.10.5. UYGULAMA – 3: USART Kullanılarak iki yönlü Asenkron Seri iletiĢim........................................................ 116

5.10.6. UYGULAMA – 4: PIC kartında LM35 ısı sensörü ile ölçülen sıcaklık bilgisini USART Kullanılarak PC‟ye

aktaran Asenkron Seri iletiĢim ............................................................................................................................................... 117

5.11 UYGULAMA – 5: PIC – PC Arası HaberleĢme Programı ........................................................................ 118

5

1. GÖRSEL PROGRAMLAMA

1.1. Programlamaya Giriş

Program Nedir? : Program, bilgisayarın belli bir iĢi yapması için tasarlanan komutların tümüdür. Kullanım

amaçları ve yerlerine göre birçok değiĢik program türü vardır:

Sistem programları: Her program, bir iĢletim sistemi üzerinde çalıĢır. ĠĢletim sistemi, diğer

programların çalıĢması için gerekli olan kaynakları ve ortamı sağlar.

Sürücüler (Driver): ĠĢletim sistemi ile donanım aygıtları arasında iletiĢim sağlayan programlardır.

Klavye ile yazılan yazıların algılanması için, klavyenin sürücü programı kullanılır.

Uygulamalar: ĠĢletim sistemi üzerinde çalıĢan, kullanıcıların ihtiyaç duyduğu iĢlevleri sağlayan

programlardır.

Bir Internet sitesini gezmek istediğimizde, Internet Explorer tarayıcısı kullanılabilir. Bu uygulama, iĢletim

sisteminden sitenin istenen sayfasındaki yazı ve resimleri almasını ister. ĠĢletim sistemi, ağ kartıyla

(Ethernet) sürücü programı sayesinde Internet sitesinin sunucusuna isteği gönderir.

Programların Çalışma Modeli

Programların kullanılmasındaki amaç, girilen bilgilerin

iĢlenip sonuçların istenen Ģekilde üretilmesidir.

Veri girişi: Program, kullanıcıların veri girmesi ile

baĢlar. Girilen veriler daha sonra iĢlenmek üzere hafızada

saklanır.

İşlem: Veriler, programın yazılma Ģekline göre bir

dizi iĢlemden geçirilir.

Sonuç: ĠĢlenen veriler kullanıcıya aktarılır.

Programlar, belli kurallar çerçevesinde yazılır. Bu yazım kuralları sayesinde bilgisayar, programın iĢleyiĢini

anlar ve gerekli sonuçları çıkartır. Yazılan programlar, belirtilen yazım kuralları kontrol edilerek derlenir.

Bu derleme iĢlemi sonunda, yazılan kaynak kodlar bilgisayarın anlayacağı tek dile çevrilir. Makine dili

denilen bu dil, sadece 1 ve 0 sayılarından oluĢur.

Programcı Kimdir? Programcı, belirli iĢlevlere sahip programlar geliĢtirebilen bir uzmandır. Bir

programcının, üzerinde çalıĢtığı platformu, kullandığı teknolojileri iyi tanıması ve bilgisayarın anlayacağı

mantıksal dilde düĢünebilmesi gerekir. Programcıların çoğu genellikle aynı iĢi gerçekleĢtirse de,

üstlendikleri görevlere göre programcılar üç gruba ayrılabilir:

Mimar. Programların yazılması için gerekli teknolojileri belirleyen, gerekli durumlarda programın

daha kolay yönetilmesi için küçük parçalara ayıran programcıdır.

Geliştirici. Programı yazan kiĢidir.

Test mühendisi. Programın geliĢtirilmesi aĢamasında, hataların kaynaklarını bulan ve geliĢtiricilere

raporlayan programcıdır.

6

1.2. Programlama Dilleri

Dünyada konuĢulan her dilin amacı iletiĢim sağlamaktır. Farklı kültürlerden insanların anlaĢabilmesi için

ortak konuĢtukları bir dil gerekir. Programlama dillerinin amacı da bilgisayar ile programcının

haberleĢmesidir. Programcı, bilgisayara hangi komutların çalıĢtırması gerektiğini bilgisayarın anlayacağı dil-

den konuĢarak söyler.

Bilgisayarda, programlar makine diline çevrildikten sonra çalıĢır. 1 ve 0 sayılarından oluĢan bu makine dili,

en alt seviye dildir. Dolayısıyla programların bu dilde yazılması oldukça zordur. Programcılar konuĢma

diline daha yakın, kolay anlaĢılabilecek diller kullanır. Bu dillere yüksek seviye programla dilleri denir.

Programlama dillerinin seviyeleri, makine diline yakın olup olmamaları ile ölçülür.

ġu ana kadar 2500'den fazla programlama dili yazılmıĢtır. Bunlardan bazıları Pascal, Basic, C, C++, Java,

JavaScript, Cobol, Perl, Python, Ada, Fortran, Visual Basic .NET, Microsoft Visual C# programlama

dilleridir.

Yüksek seviye programlama dillerine Visual Basic .NET ve Microsoft Visual C++ dillerini örnek

verebiliriz. C ile iĢletim sistemi yazılabildiğinden, daha alt seviye bir dil olarak değerlendirilir.

1.2.1. Programlama Dillerinin Tarihçesi

Bilgisayarlar, icat edilmeleriyle birlikte belli bir iĢi yapmak için bir dizi komuta ihtiyaç duymuĢlardır. En

baĢta çok basit iĢlemler yapan bu komutlar, zamanla nesne yönelimlilik (object orientation) gibi ileri

seviyede özellikler kazanmıĢtır.

Ġlk programlama dilleri, bilgisayarların üzerinde bazı araçların yerlerini değiĢtirerek veya yeni bileĢenler

eklenerek yapılıyordu. Programın iĢlemesi için bir devinime ihtiyaç vardı. Eskiden programlar fiziksel

olarak yazılıyordu. Daha sonra, fiziksel programlama yerini elektrik sinyallerine bıraktı. Artık, kurulan

elektronik devrelere düĢük ya da yüksek voltajda akım gönderilerek bilgisayarın davranıĢı belirlenmeye

baĢlanmıĢtı. Yüksek voltaj 1, düĢük voltaj 0 sayılarını ifade ediyordu. Böylelikle bugün de kullanılan

makine dilinin ortaya çıkması için ilk adımlar atılmıĢ oldu.

Ancak bu Ģekilde programlar yazmak, sistemi oluĢturan elektronik devrelerin her program için baĢtan

kurulmasını gerektiriyordu. Böylelikle programlar bazı kavramlar çerçevesinde yazılmaya baĢlandı.

Öncelikle bilgisayar donanımı her program için baĢtan kurulmamalı, bunun yerine basit bir donanımın

üzerine yazılan komutlar kullanılmalıdır. Daha sonra, programlar tek bir komutlar zinciri yerine, küçük

parçalar halinde yazılmalıdır. Bu parçaların programın içinde defalarca kullanılabilmesi yordam (subroutine)

kavramını ortaya çıkarmıĢtır. Bu modelin kullanılması ise mantıksal karĢılaĢtırmaları, döngülerin

kullanılmasını ve yazılan kodlar tekrar kullanıldığı için kütüphane (library) mantığını ortaya çıkarmıĢtır.

1957 yılında IBM, düĢük seviye (makine diline yakın) bir programlama dili olan FORTRAN dilini ortaya

çıkardı. FORTRAN ile beraber basit mantıksal karĢılaĢtırmalar, döngüler, lojik (true-false) ve sayısal

(integer, double) değiĢkenler kullanılmaya baĢlandı.

1959 yılında, bu programlama dilinin özelliklerini alıp, giriĢ çıkıĢ (Input/Output - IO) gibi yeni iĢlevler

sağlayan COBOL dili ortaya çıktı. Daha sonra 1968 yılında, COBOL ve FORTRAN dillerinin en iyi

özelliklerini alarak Pascal ortaya çıktı. Ayrıca Pascal dili, hafızadaki adresler üzerinde iĢlem yapmaya

olanak veren iĢaretçi (pointer) kavramını da beraberinde getirdi.

1972 yılında C, Pascal dilindeki birçok hatayı gidererek ortaya çıktı. C dili ilk defa Unix iĢletim sistemini

yazmak için kullanılmaya baĢlanmıĢtır. C, düĢük seviye bir dil olması, kuvvetli giriĢ çıkıĢ iĢlemleri

sağlaması gibi birçok özelliği ile iĢletim sistemlerinin yazılmasında tercih edilmiĢtir.

7

Bütün programlama dilleri birçok özelliğe sahip olmasına rağmen, modüler programlamanın birçok eksiğini

gidermek amacıyla, yeni bir programlama modeli olan nesne yönelimli programlama (Object Oriented

Programming - OOP) ortaya çıkarıldı. C dilinin ve OOP modelinin tüm özellikleriyle C++ dili oluĢturuldu.

C++ dilini, Sun Microsystems tarafından çıkartılan Java takip etti. Java dilinin kullanım alanları, nesneye

yönelimli bir programlama dili olması ve beraberinde getirdiği artık toplama (Garbage Collection - GC) gibi

performans artırıcı özellikleri ile büyük ölçüde geniĢledi.

Microsoft, 2000 yılında .NET platformunu sunarak, otuzdan fazla programlama dilini aynı çatı altına

topladı. VisualBasic.NET ve Visual C# günümüzde .NET platformunu kullanan en güçlü yüksek seviyeli

programlama dilleri arasında yer alır.

Programlar yazıldıktan sonra, çalıĢmaya uygun hale

getirilene kadar bir dizi iĢlemden geçer. Bu iĢlemi

gerçekleĢtiren, programlama dilinin derleyicisidir.

(Compiler)

Programlar bir programlama dilinin gramer ve söz dizimi

yapısına uygun bir Ģekilde yazılır.

Yaz ılan kodlar o dilin derleyicisi tarafından kontrol

edilir.

Kontrol iĢleminden sonra, bu kodlar bilgisayarın

anlayacağı makine diline çevrilir. Ancak bir yazım veya

mantık hatası varsa, programcıya gerekli hata mesajı verilerek derleme iĢlemi iptal edilir.

1.3. Programın Derlenmesi

Programlar yazıldıktan sonra, çalıĢmaya uygun hale getirilene kadar bir dizi iĢlemden geçer. Bu iĢlemi

gerçekleĢtiren, programlama dilinin derleyicisidir. (Compiler)

■ Programlar bir programlama dilinin gramer ve söz dizimi yapısına uygun bir Ģekilde yazılır.

■ Yazılan kodlar o dilin derleyicisi tarafından kontrol edilir.

■ Kontrol iĢleminden sonra, bu kodlar bilgisayarın anlayacağı makine diline çevrilir. Ancak bir yazım

veya mantık hatası varsa, programcıya gerekli hata mesajı verilerek derleme iĢlemi iptal edilir.

■ Makine diline çevrilen kodlar çalıĢtırılır.

1.4. Microsoft .NET Platformu

Microsoft .NET, uygulama geliĢtiricilerin yazılım geliĢtirme sürecinde altyapı iĢlemleri için harcadığı eforu

en aza indirgemek ve daha güvenli, güvenilir ve sağlıklı uygulamalar geliĢtirebilmelerini sağlamak için

geliĢtirilmiĢ bir altyapıdır.

1.4.1. Yazılım Geliştirme Dünyası

Microsoft 1975 yılında Bill Gates ve Paul Allen tarafından kurulduğunda, vizyonu "Her eve, her masaya bir

PC" idi. Donanım ve yazılım alanlarındaki geliĢmelerin hızı ve birbirlerini sürekli tetiklemesinin sonucunda

bilgisayar kullanıcılarının sayısı hızla arttı. Artan kullanıcı sayısı beraberinde yeni gereksinim ve talepleri

getirdi. Bu taleplerin doğal sonucu olarak da farklı platformlar ve farklı servis sağlayıcıları ortaya çıktı.

ĠletiĢim, finansal hizmetler, ticaret ve eğlence kullanıcıların (özellikle Internet'in yaygınlaĢmasıyla birlikte)

en yoğun talep gösterdiği hizmetler halini aldı. Günümüze baktığımızda, Microsoft'un çıkıĢ noktasındaki

hedefine büyük oranda ulaĢtığını görebiliyoruz. Ancak geldiğimiz noktada hızla artan bilgisayar ve Internet

kullanıcısı sayısı, beraberinde güvenlik, iletiĢim ve entegrasyon gibi alanlarda çeĢitli engelleri de getirdi.

8

GeliĢmelere kendi açımızdan, yani yazılım geliĢtiriciler açısından baktığımızda iĢlerin çok daha zor ve

zahmetli durumda olduğunu görürüz. Kurumsal uygulamaların geliĢtirilmesinde performans, güvenlik ve

süreklilik gibi konularda belirli bir seviyeyi yakalamak için oldukça fazla efor sarf etmemiz gerekiyor.

Örneğin, elektronik cihazlarla soket iletiĢimi kuracak uygulamaları geliĢtirebilmek için iki alternatifimiz var.

Birincisi, 3. parti firmalar tarafından geliĢtirilmiĢ olan bileĢenler satın almak ve uygulamamıza entegre

etmektir. Diğer alternatifimiz ise, oldukça uzun sürecek bir kodlama ile benzer bir iletiĢim katmanını

geliĢtirmektir. Her ikisi de firmaların birinci tercihi olmayacaktır. Sorunumuz, sadece soket iletiĢimi

noktasında değil elbette. Bölümün baĢında da belirttiğimiz gibi uygulama geliĢtiriciler, güvenlik, performans

ve yetkilendirme gibi pek çok konuda oldukça zahmetli altyapı kodlarını geliĢtirmekle uğraĢmak zorunda

kalıyor. ĠĢin kötü yanı, geliĢtirilen bu altyapı kodlarının çoğu zaman istenen verimliliği sunmaktan oldukça

uzak kalmasıdır. Kabul etmemiz gereken Ģey, bu altyapı kodlarını geliĢtirecek bilgiye sahip olmadığımız;

sahip olsak bile, altyapı kodlarını yazacak zamana ve iĢgücüne sahip olmadığımız; zaman ve iĢgücü

konusundaki ihtiyaçlarımızı karĢılayabilsek bile, bu kodların testi, güvenliği, güvenilirliği, performansı ve

uygulamalara entegrasyonu konusunda hiçbir zaman istenen düzeye ulaĢamayacağımızdır. KeĢke ihtiyaç

duyduğumuz tüm altyapı iĢlemleri için hazır, kullanımı kolay ve esnek bir platform olsaydı.

Hayalini kurduğumuz, aslında Ģöyle bir sistem:

"Bir sanal mağazada cep telefonlarından sorumlu departmanda satıĢ müdürü olarak çalıĢıyorsunuz. ĠĢ

dıĢındasınız ve akıllı cihazınıza bir mesaj geliyor: 'Piyasaya henüz çıkmıĢ olan telefonumuz inanılmaz

satıĢlar yapıyor, telefon çok popüler ve stoklarımız da oldukça azalmıĢ durumda.' Bu mesajın hemen

ardından, akıllı cihazınız üzerinden, Ģirketiniz için fiyat ve teslim zamanı açısından en uygun olan

tedarikçiyi bulup, ihtiyacınız kadar telefonu sipariĢ edebiliyorsunuz. Peki ya bu koĢullar altında çalıĢmıyor

olsaydınız? ġirketiniz, sizi cep telefonunuzdan arayacak ve problemi iletecekti. Sonra da siz ancak

Ģirketinize dönebildiğiniz zaman tedarikçilerle teker teker irtibata geçerek hangisinin Ģirketiniz için en

yararlı olduğuna karar verecektiniz. SipariĢ ve teslimat bilgileri üzerinde anlaĢtıktan sonra iĢleminizi

tamamlamıĢ olacaktınız. Yani sadece birkaç dakikada yapabileceğiniz basit bir iĢlem için, belki de bütün bir

gününüzü kaybedecektiniz. Verimliliğiniz düĢerken, zamanınızı etkili Ģekilde kullanamayacaktınız. Oysa

akıllı cihazınız üzerinden tüm bu iĢlemleri kısa bir Ģekilde çözebildiğinizden, iĢe gitmenize bile gerek

kalmadan çok kısa bir zamanda Ģirketiniz için en iyi olan seçimi yapabilirsiniz."

ĠĢler kesinlikle çok daha verimli ve kolay ilerlerdi. Elbette bu, kurulabilecek hayallerin sadece mobil

platforma yönelik bölümünden bir kesit.

1.4.2. Sorunun Temeli

Microsoft, vizyonu doğrultusunda attığı adımların yazılım geliĢtiricilere yansıyan sonuçlarını sürekli

izliyordu ve yazılım geliĢtiricilerin sorunlarını Ģu baĢlıklar altında ele alıyordu.

Uygulamalar, sistemler ve kurumdaki birimler arasındaki ve farklı kurumlar arasındaki iletiĢim

sorunu.

ÇalıĢanların ihtiyaç duydukları verilere, ihtiyaç duydukları anda, kesintisiz, hatasız ve güvenli bir

Ģekilde ve istedikleri platformdan eriĢebilmeleri gereksinimi.

Uygulama geliĢtirme sürecinde, geliĢtiricilerin altyapı kodları ile uğraĢması ve bunun sonucunda,

uygulama geliĢtirme ve test süresinin uzaması.

Bir uygulamanın farklı platformlarda çalıĢtırılabilmesi için, aynı iĢlemleri gerçekleĢtirecek kodların

tekrar tekrar yazılması gereksinimi.Çözüm Platformu

Microsoft 1990 yılında, yaĢanacak 10 yılı da öngörerek, bu ve benzeri sorunlara çözüm sunacak, uygulama

geliĢtiricilerin ve son kullanıcıların iĢlerini kolaylaĢtıracak bir platform geliĢtirmeye baĢladı. Microsoft bu

platforma öylesine inanıyordu ki, kaynaklarının %80'inden daha fazlasını, yani kaderini bu platforma

9

bağlamıĢtı. Çok geniĢ bir analiz ve geliĢtirme ekibinin çalıĢmaları sonucunda ortaya çıkan ürün 2000 yılında

dünyaya sunulduğuna, insanların karĢılarında gördükleri yapı karĢısında hissettiklerini tanımlamak için

kullanılabilecek en uygun kelime "hayranlık" idi.

Microsoft.NET platformu, her türlü yazılım geliĢtirme ihtiyacına yönelik hazır bir altyapı sunarak, uygulama

geliĢtiricilerin Windows, Web ve mobil platformlara yönelik uygulamaları çok daha hızlı, kolay ve güçlü bir

Ģekilde geliĢtirebilmelerine olanak tanıyordu. Uygulama geliĢtiriciler Ģifreleme, kimlik doğrulama, yetki-

lendirme, soket iletiĢimi, her türlü veri kaynağına yönelik veritabanı iĢlemleri, XML ve Web servisi

teknolojilerine kadar burada saymadığımız (editörler bir modülün 100 sayfayı geçmesine pek sıcak

bakmıyorlar) pek çok teknolojiyi ve hatta milyonlarca hazır sınıf ve fonksiyonu karĢılarında gördüler.

Bugüne kadar günler, haftalar ve hatta aylar harcayarak geliĢtirmeye çalıĢtıkları bu yapıların hepsini,

karĢılarında kullanıma hazır bir Ģekilde görmekten de son derece memnunlardı.

1.5. Microsoft Visual Studio Arayüzü

1.5.1. Solution Explorer Paneli

Visual Studio çalıĢma ortamında projeler bir çözüm (solution) altında açılır. Bir çözüm içine farklı dilde ve

tipte projeler dahil edilebilir. Visual Studio ile bir çözüm açıldığında, Solution Explorer panelinde çözüm

içinde bulunan tüm projelerle, ilgili dosya ve klasörler görüntülenir. Panelde koyu yazı tipinde gözüken

proje, çözüm içindeki baĢlangıç projesidir.

1.5.2. Toolbox(Araç Kutusu) Paneli

Toolbox (Araç kutusu) paneli, projelerde kullanılan çeĢitli bileĢenlerin listelendiği paneldir. Buradaki öğeler,

sekmeler içinde gruplanmıĢtır. Her sekme, ortak platformlarda çalıĢan veya

benzer iĢlevleri olan nesnelere sahiptir. Örneğin, Data sekmesinde veritabanı

iĢlemlerinde kullanılan bileĢenler vardır. Windows Forms bileĢenleri

Windows platformunda çalıĢan projelerde, Web Forms bileĢenleri ise Web

tabanlı projelerde kullanılan nesnelerdir. Nesnenin silik gözükmesi, o anda

çalıĢılan sayfada kullanılamayacağı anlamına gelir.

Toolbox panelinde nesneler, sık kullanılmasına göre ya da alfabetik olarak sıralanabilirler. Nesneler, yerleri

ve sıraları taĢınarak değiĢtirilebilir, ayrıca baĢka bir sekmeye de taĢınılabilir. Visual Studio çalıĢma ortamı,

Toolbox panelindeki nesnelere yeni isim verme, nesneleri silme veya panele yeni sekmeler ve nesneler

ekleme imkânlarını da sağlar.

1.5.3. Properties (Özellikler) Paneli

Properties (Özellikler) paneli, seçilen bir nesnenin özelliklerini görüntüler. Paneldeki görünüm, "Özellik adı

- değeri" Ģeklindedir. Silik olarak gözüken özellikler salt okunurdur ve

değiĢtirilemez. Panelin üzerindeki açılır liste, çalıĢma sayfasındaki nesneleri

listeler. Buradan istenen nesne seçilerek özellikleri görüntülenir.

Paneldeki özellikler kategorilere göre gruplanmıĢtır, ancak alfabetik olarak da

dizilebilir. Panelin üstünde bulunan araç kutusundan Categorized

(KategorileĢtirilmiĢ) veya Alphabetic (Alfabetik) seçenekleri iĢaretlenerek

özelliklerin görünümleri değiĢtirilebilir.

10

Panelin en altında bulunan bölümde, her özelliğin açıklaması bulunur.

ĠPUCU Bir nesnenin üzerindeyken F4 tuĢuna basınca, Properties paneli görüntülenir.

1.6. Visual Basic.NET ile Windows Tabanlı Programlama

Windows tabanlı uygulamalar, Windows iĢletim sistemi üzerinde çalıĢan uygulamalardır. Windows

uygulamaları Windows formları ve kontrollerinden oluĢur. Visual Studio bu formların ve üzerindeki

kontrollerin tasarımını ve kodların yazılmasını büyük ölçüde kolaylaĢtırarak, uygulama geliĢtirme sürecini

daha hızlı ve kolay hale getirir.

1.6.1. İlk Uygulama (Merhaba!. Şu anda tarih ve saat…)

Visual Basic .NET ile yazacağımız Windows uygulaması ekrana, "Merhaba " yazısını ve o anki zamanı

gösteren bir bilgi mesajını çıkartır.

1. Visual Studio çalıĢma ortamını açın.

2. Dosya menüsünden, Yeni Proje… komutunu seçin.

3. Açılan iletiĢim kutusu, yazılacağı dile, çalıĢacağı ortama göre değiĢen proje tiplerini listeler. Proje

tiplerinden Visual Basic Project ve Windows Application tipinin seçili olduğunu kontrol edin.

4. Name özelliğine Merhaba yazın ve OK düğmesini tıklayın. Açılan Windows projesinde baĢlangıç

olarak bir adet Windows Form, tasarım görünümünde açılır.

5. Toolbox panelinden Button kontrolünü formun üzerine sürükleyip bırakın. Properties panelini açarak

Button kontrolünün Text özelliğine "Merhaba" yazın.

6. Eklenen Button kontrolünü çift tıklayarak kod sayfasına geçin. Button kontrolü tıklandığında

çalıĢtırılacak kodu yazın: MsgBox("Merhaba! ġu anda tarih ve saat: " & Now)

NOT: Yazdığınız kodun ne anlama geldiğini belirtmek için yorum satırları kullanmak, kodları okumayı

kolaylaĢtırır. Yorum satırları tek tırnak ' ile baĢlayarak yazılmalıdır.

7. MsgBox metodunun yazıldığı kodun üstüne, yapılmak isteneni belirten bir yorum satırı yazın.

8. F5 tuĢuna basarak projeyi çalıĢtırın.

İPUCU: ÇalıĢma sayfaların isimlerinin yanında yıldız iĢaretinin gözükmesi, o sayfada değiĢiklik

yapıldığını, ancak henüz kaydedilmediğini belirtir. Proje dosyalarınızı CTRL+S tuĢlarına basarak sıkça

kaydedin.

1.7. Özellikler, Metotlar ve Olaylar

.NET kontrolleri üç temel kavramdan oluĢur.

11

1.7.1. Özellikler

Özellikler, kontrollerin görünümü, yerleĢimi veya davranıĢlarına özgü niteliklerdir. Örneğin, bir Button

kontrolünün Text özelliği, üzerinde yazan yazıya eriĢmemizi sağlar.

Kontrollerin özellikleri, tasarım anında Properties panelinden ulaĢılabileceği gibi, kod tarafında da okunup

değiĢtirilebilir.

Kontrollerin birçok özelliği hem okunabilir, hem de değiĢtirilebilir. Ancak bazı özellikler salt okunur

(ReadOnly) ve salt yazılır (WriteOnly) olabilir. Bu tip özellikler Properties panelinde gözükmezler.

Kontrollerin birçok ortak özellikleri vardır.

Text (Yazı): Kontrollerin Text özelliği, üzerinde görüntülenen yazıdır. Bu özellik, çalıĢma anında

sıkça okunup değiĢtirilerek kullanıcıyla iletiĢim sağlanır.

TextBox kontrolüne girilen bir değerin okunup Label kontrolüne yazılması için, kontrollerin Text özellikleri

kullanılır.

Name (İsim): Name özelliği kontrollere ulaĢmak için kullanılan özelliktir. Birçok kontrolün Text

özelliği aynı olabilir. Ancak her biri ayrı birer nesne olduğu için, Name özelliklerinin benzersiz

olması gerekir.

TextBox2.Text = TextBox1.Text

Ġki TextBox kontrolünün yazıları aynı, fakat isimleri farklıdır.

Size (Büyüklük): Kontrollerin büyüklük özelliğidir. Height (yükseklik) ve Width (geniĢlik)

özelliklerinden oluĢur. Genellikle tasarım anında belirlenen bu özellik, çalıĢma anında da

değiĢtirilebilir.

Label1.Height = 10

Label1.Width = 20

BackColor (Arka plan rengi): Kontrollerin arka plan renginin ayarlandığı özelliktir. Bu özelliğin

değeri, Color (renk) nesnesinde tanımlı değerlerle belirlenir.

ForeColor (Önalan rengi): Kontrollerin üzerindeki yazıların rengini belirler.

Visible (Görünür): Kontrollerin ekranda görünüp görünmediklerini belirleyen özelliktir. True ve

False olmak üzere iki değer alabilir.

12

1.7.2. Metotlar

Metotlar kontrollerin yaptığı iĢlemlerdir. Metotlar parametreyle veya parametresiz çağrılabilir. Parametreyle

çağırmak, metodun girilen değere göre iĢlem yapacağını belirtir. Örneğin Focus (Odaklan) metodu,

parametre beklemeden çalıĢır ve kontrolün seçilmesini sağlar.

Kontrollerin bazı ortak metotları vardır.

Select (Seç): Select metodu Focus ile aynıdır, ama TextBox kontrolünün Select metodunun

diğerlerinden bir farkı vardır. TextBox içindeki yazının belli bir kısmını ya da tamamını, verilen

parametrelere göre seçer (Resim 4.3).

BringToFront (Öne Getir): Kontrolü, üst üste duran kontroller arasından en öne getirir.

SendToBack (Arkaya Gönder). Kontrolü, üst üste duran kontrollerin en arkasına gönderir.

Hide (Sakla): Kontrolün gözükmesini engeller.

Show (Göster): Kontrolün gözükmesini sağlar.

1.7.3. Olaylar

Olaylar kontrollerin baĢına gelen iĢlemlerdir. Olayların metotlardan farkı, bu iĢlemlerin kontrollerin elinde

olmadan gerçekleĢmesidir. Örneğin bir Button kontrolünün tıklanması, o kontrolün isteği dıĢında

yapılmıĢtır. Bu olayın tetiklenmesinde kontrolün bir rolü yoktur. Bu olaylar gerçekleĢtiği zaman yapılması

gereken iĢlemler, ilgili olayın yordamına yazılır. Button1 isimli kontrol tıklandığı zaman gerçekleĢtirmek

istenen eylemler Button1_Click yordamına yazılır.

Visual Studio ortamı, kontrollerin olaylarını kolay bir Ģekilde seçmeyi sağlar. Kod sayfalarında kontrollerin

bulunduğu listeden, istenen kontrol seçilir. Kontrolün olaylarının listelendiği diğer listeden de istenen olay

seçilir.

13

RESĠM: Kontrollerin olaylarının seçilmesi.

Visual Studio, olayların yordam isimlerini Kontrolİsmi_Olayİsmi biçiminde yazar.

Kontrollerle çalıĢırken benzer olaylar kullanılır.

Click (Tıklandığında). Kontrol tıklandığı zaman tetiklenen olaydır. Windows tabanlı

programlamada en sık kullanılan olaylardan biridir.

MouseDown (Fare düğmesi basıldığında). Fare, kontrolün üzerindeyken herhangi bir düğmesine

basıldığı zaman gerçekleĢen olaydır. Bu olay, Click olayından önce çalıĢır.

MouseUp (Fare düğmesi bırakıldığında). Fare, kontrolün üzerindeyken basılan düğme bırakıldığı

zaman çalıĢır.

Enter (Girildiğinde). Kontrol seçildiği veya üzerine odaklanıldığı zaman gerçekleĢen olaydır.

Leave (Çıkıldığında). BaĢka bir kontrol seçilmek üzere çıkıldığında, bu kontrolün Leave olayı

tetiklenir.

VisibleChanged (Görünürlüğü değiştiğinde). Kontrolün görünüp görünmediğini belirten Visible

özelliği değiĢtiği zaman tetiklenir.

İPUCU: Olayların çalıĢma sıralarını test etmek için tüm olay yordamlarına, mesaj kutusu çıkaran (MsgBox)

kod yazın. Daha sonra projeyi çalıĢtırıp kontroller üzerinde yapılan değiĢikliklere göre olayların çalıĢma

sıralarına bakın

1.8. Visual Basic .NET'e Kontrollerin Eklenmesi

Windows tabanlı uygulamalar geliĢtirirken sıkça

kullanacağımız bir grup kontrol vardır. Form kontrolü hariç

diğer bütün kontroller Toolbox panelinden seçilir. Bu

kontroller sürüklenip form üzerinde istenen pozisyona

bırakılır

RESĠM: Kontrollerin eklenmesi.

Kontroller, Toolbox panelinde çift tıklanarak da eklenebilir.

Kontrollerin tasarım anında büyüklükleri ve yerleri Size ve Location özellikleri ile değiĢtirilebileceği gibi,

fare ile de istenen Ģekilde ayarlanabilir.

14

1.8.1. Form

Windows uygulamaları, Windows kontrollerinin tutulduğu pencereler olan formlardan oluĢur. Bir Windows

projesi açıldığı zaman Form kontrolü otomatik olarak eklenir. Ġkinci bir form eklemek için Proje (Project)

menüsünden Windows Formu Ekle… (Add Windows Form) komutunu seçilir. Proje çalıĢtığı zaman

baĢlangıç formu görüntülenir. BaĢlangıç formu projenin özelliklerinden değiĢtirilir. Projenin özellikler

penceresi, çözüm gezgininde proje üstüne sağ klik yapılarak açılan menüden özellikler seçilerek

ulaĢılabildiği gibi, proje menüsünden de ulaĢılabilir.

RESĠM: BaĢlangıç formunun değiĢtirilmesi.

Visual Studio ortamında formlar, tasarım sayfası ve kod sayfası olmak üzere iki farklı sayfada görüntülenir.

Tasarım sayfası, formun ve üzerindeki kontrollerin görünümlerini kolay bir Ģekilde değiĢtirmeyi sağlar.

Visual Studio bu sayfada yapılan değiĢiklikleri kod sayfasında eĢzamanlı olarak günceller. Örneğin, bir

Button kontrolünün geniĢliğini fare ile değiĢtirdiğimiz zaman, kod sayfasında bu kontrolün Width özelliği

yapılan değiĢikliğe göre güncellenir. Aynı değiĢiklikler Properties panelinde de görülebilir.

Formların, diğer kontrollerin özelliklerinden farklı bazı özellikleri vardır.

ControlBox (Denetim kutusu): Form üzerindeki simge durumuna küçültme, ekranı kaplama ve

formu kapatma (Minimize / Maximize / Close) kutularının görünümünü ve eriĢilebilirliğini kontrol

eder.

NOT: Formun ControlBox özelliği False iken uygulama, Hata Ayıkla (Debug) menüsünden Hata

Ayıklamayı Durdur (Stop Debugging) komutu seçilerek kapatılabilir.

StartPosition (Başlangıç pozisyonu): Form açıldığı zaman nerede gözükeceğini belirler.

CenterScreen seçeneği formu ekranın ortasında gösterir.

Formlar açıldığı zaman Load olayı gerçekleĢir. Eğer form, baĢlangıç formu olarak seçilmiĢse, proje baĢladığı

zaman çalıĢtırılmak istenen kodlar bu olayın yordamına yazılır.

1.8.2. Button

Bir Windows düğmesini temsil eder. Button kontrolü tıklandığında Click olayı tetiklenir. Bu olay

gerçekleĢtiği zaman yapılacak iĢlemler, ButtonĠsmi_Click yordamında yazılır.

15

1.8.3. TextBox

Bir Windows metin kutusunu temsil eder. Kullanıcıların değer girerek programla haberleĢmesini sağlamak

amacıyla kullanılır. TextBox kontrolündeki yazı değiĢtiği zaman TextChanged olayı gerçekleĢir.

1.8.4. Label

Bir Windows etiketini temsil eder. Kullanıcıya, form üzerinde bir yazıyı göstermek amacıyla kullanılır. Bu

yazının görünümü, Label kontrolünün bazı özellikleri ile değiĢtirilir.

TextAlign (Yazı hizalama): Yazının Label kontrolü üzerinde nerede duracağını belirler

RESĠM: TextAlign özelliği.

Font (Yazı Tipi): Font özelliği birçok alt özellik taĢır. Bunlardan bazıları en sık kullanılan

özelliklerdir.

Name: Yazı tipinin ismini belirler. Varsayılan durumda

Microsoft Sans Serif seçilidir.

Size: Karakterlerin büyüklüğünü belirler. Varsayılan büyüklük

8,5 değerindedir.

Bold (Kalın): Yazının kalın tipte olmasını belirler.

Italic (İtalik): Yazının italik tipte olmasını belirler.

UnderLine (Altı çizgili): Yazının altı çizgili olmasını belirler.

RESİM: Font özelliği.

1.8.5. ComboBox

Bir Windows açılan kutusunu temsil eder. ComboBox kontrolü, kullanıcıların bazı değerleri açılan bir

listeden seçmesini sağlar. Listeye tasarım anında veya çalıĢma anında öğe eklenebilir. Listeye öğe eklemek

için kontrolün Items özelliğinden faydalanılır.

Tasarım anında öğe eklemek için Properties panelinden Items özelliği

seçilir. String Collection Editor penceresinde, her öğenin değeri tek bir

satırda yazılır.

RESİM: String Collection Editor penceresi.

ÇalıĢma anında öğe eklemek için kod sayfasında, kontrolün Items özelliğinin Add metodu kullanılır.

16

RESĠM: ComboBox kontrolünün çalıĢması.

1.8.6. ListBox

Bir Windows liste kutusunu temsil eder. Kontroldeki öğeler sabit bir liste olarak görüntülenir. ListBox

kontrolüne öğe ekleme iĢlemi, ComboBox kontrolündeki iĢlemlerle aynıdır. ListBox kontrolünün

ComboBox kontrolünden farkı, birden fazla öğenin seçilebilir olmasıdır.

RESĠM: ListBox kontrolünün çalıĢması.

1.8.7. Timer

Bir Windows sayacını temsil eder. Sayaç çalıĢmaya baĢladığı zaman, belirli zaman aralıklarında Tick olayı

gerçekleĢir. Timer kontrolünün Interval değeri, Tick olayının kaç milisaniyede bir gerçekleĢeceğini

belirler. Örneğin, Interval değeri 2000 olan bir sayaç, Tick olayında yazılan kodları iki saniyede bir çalıĢtırır.

Sayacı baĢlatmak için kontrolün Start metodu, durdurmak için ise Stop metodu kullanılır. Enabled özelliği,

sayacın aktif olup olmadığını belirler.

17

UYGULAMA: Kronometre Uygulaması

"Kronometre" isminde yeni bir Windows projesi açın.

Properties panelinden, Form1 nesnesinin BackColor özelliğini "Menu" olarak seçin. Font özelliğini,

yanındaki + simgesini tıklayarak geniĢletin. Font özelliğinin alt özellikleri listelenir.

o Yazı Tipi özelliğini Tahoma,

o Text özelliğini "Kronometre Uygulaması",

o Size özelliğini 10 olarak ayarlayın.

Form görünüm özellikleri, eklenecek kontrollerin (değiĢtirilmedikleri sürece) görünümlerini de etkiler.

Toolbox panelinden form üzerine bir Label ekleyin. Özelliklerini atayın:

o Text: Kronometrem

o Font - Name: Forte, Font - Size:28

o Dock: Top

o TextAlign: BottomCenter

o Autosize: False

Bir Label kontrolü ekleyin. Özelliklerini atayın:

o Text:0

o Font - Size: 30

o TextAlign: MiddleCenter

o Name: lblSure

Forma bir Timer kontrolü ekleyin. Name özelliğini tmrKronometre olarak değiĢtirin.

İPUCU Kod tarafında kullanacağınız kontrollerin isimlerini değiĢtirmek, daha sonra ulaĢmak istediğinizde

zaman kazandıracaktır.

Bir ComboBox ekleyin. Text özelliğini "Hız Seçin" olarak, Name özelliğini de cmbInterval olarak

değiĢtirin. Items Collection içine sırayla 1000, 2000, 3000, 4000 değerlerini girin.

Bu kontrol, çalıĢma anında Timer kontrolünün Interval özelliğini değiĢtirmeyi, dolayısıyla kronometrenin

hızını ayarlamayı sağlayacaktır.

Text özellikleri birinde "Dur", diğerinde "BaĢla"

olan iki Button ekleyin. Kontrollerin Name özelliklerini

sırayla btnDur ve btnBasla olarak değiĢtirin.

Bir ListBox kontrolü ekleyin ve Name özelliğini

lbKayit olarak değiĢtirin. Bu kontrol kronometrenin baĢlama

ve durma zamanlarını kaydetmeyi sağlayacaktır.

Bir TextBox kontrolü ekleyin. Name özelliğini

txtSure olarak değiĢtirin ve Text özelliğinde yazan yazıyı

silin.

Eklenen kontrolleri, Resimde görünen Ģekilde düzenleyin.

Kodların yazılması

Form üzerinde sağ tıklayın ve Kodu Görüntüle komutunu seçin.

Açılan kod sayfasında, KalanSure isimli bir değiĢken tanımlayın.

Dim KalanSure As Integer

18

Formun tasarım görünümüne dönün ve BaĢla isimli Button kontrolünü çift tıklayın. btnBasla_Click

yordamı içine Timer kontrolünü ayarlayıp baĢlatan, ListBox kontrolüne kayıtları giren, kalan süreyi

Label kontrolünde görüntüleyen kodları yazın.

Dur isimli Button kontrolünü çift tıklayın. btnDur_Click yordamı içine Timer kontrolünü durduracak

ve ListBox kontrolüne kayıtları ekleyecek kodları yazın.

Tasarım görünümünde tmrKronometre isimli Timer kontrolünü çift tıklayın. tmrKronometre_Tick

yordamı içine kalan süreyi azaltacak ve süre sıfırlandığında kronometreyi durduracak kodları yazın.

Projeyi baĢlatın, metin kutusuna 5 değerini girin. Hız Seçin açılan kutusundan 1000 değerini seçin ve

BaĢla düğmesini tıklayın.

o Süre baĢladıktan ve bittikten sonra ListBox kontrolündeki değiĢiklikler nelerdir?

o Hız 3000 olarak seçildiğinde baĢlama ve bitiĢ zamanları arasındaki süre ne kadardır?

Hazır Fonksiyonlar

Visual Basic.NET dilindeki hazır fonksiyonlar, program yazarken en çok kullanılan iĢlemleri programcılara

sunar. Bu fonksiyonlar Microsoft. VisualBasic isimuzayı (namespace) altında gruplanmıĢtır. Örneğin, metin

kutusuna girilen bir yazının soldan ilk üç karakterini almak için Microsoft.VisualBasic.Left hazır fonksiyonu

kullanılır.

Label1.Text = Microsoft.VisualBasic.Left(TextBox1.Text, 3) Farklı iĢlemler için hazırlanmıĢ birçok fonksiyon vardır.

1.8.8. Tarih işlemleri:

Verilen tarihin gününü almak: MsgBox(Day(Now))

19

Verilen tarihin ayını almak: MsgBox(Month(Now)) Verilen ay numarasının ismini almak: MsgBox(MonthName(7)) Verilen tarihin saatini almak: MsgBox(Hour(Now)) Verilen tarihe, ilk parametrede belirtilen zaman cinsinden bir değer eklemek:

MsgBox(DateAdd(DateInterval.Day, 20, Now)) Günün saat, dakika, saniyesini almak: MsgBox(TimeOfDay)

1.8.9. Yazı işlemleri:

Yazının baĢındaki ve sonundaki boĢlukları atmak:

Label1.Text = Trim(" Arapgir MYO ") 'sonuç: Arapgir MYO

Tüm yazıyı küçük harfe çevirmek: Label1.Text = LCase("ARAPGİR myo") ' Sonuç: arapgir myo

Tüm yazıyı büyük harfe çevirmek: Label1.Text = UCase("arapgir MYO") ' Sonuç: ARAPGİR MYO

Yaz ının belirli bir bölümünü almak. Ġkinci parametrede verilen pozisyondan baĢlayarak, üçüncü

parametredeki değer kadar karakter alınır:

Label1.Text = Mid("Arapgir MYO ", 9, 3) ' Sonuç: MYO Yaz ının parametrede belirtilen sıradaki karakteri almak:

Label1.Text = GetChar("Arapgir MYO", 9) ' Sonuç: M Verilen karakter koduna karĢılık gelen karakteri almak: Label1.Text = Chr(65) ' Sonuç: A

1.8.10. Sayı işlemleri:

Rasgele sayı üretmek:

'Maximimum 400 değerini alan bir sayı üretir Rnd() * 400

Parametrede verilen bir değerin sayı olup olmadığını kontrol etmek. Geriye dönen değer True ya da

False mantıksal değeridir:

IsNumeric(TextBox1.Text)

1.9. KULLANICIDAN VERİ ALMAK VE KULLANICIYA BİLGİ GÖSTERMEK (Inputbox() ve Messagebox())

1.9.1. Inputbox:

InputBox, kullanıcının veri girmesi için açılan bir mesaj kutusudur. Formlarda TextBox kontrolüne ihtiyaç

duymadan veri almayı sağlar.

InputBox("Bir sayı giriniz: ", "Sayı Girişi", 1, 350, 350)

InputBox metodunun ilk parametresi, mesaj kutusunun gövdesinde gözükecek yazıdır (Prompt). Diğer tüm

parametreler isteğe bağlıdır.

Title (Başlık): Mesaj kutusunun baĢlığıdır

20

DefaultResponse (Varsayılan cevap): Kullanıcı veri girmediğinde varsayılan değerdir.

XPos (X pozisyonu): Mesaj kutusunun sol kenarının, ekranın sol kenarına olan uzaklığıdır.

YPos (Y pozisyonu): Mesaj kutusunun üst kenarının, ekranın üst kenarına olan uzaklığıdır.

RESĠM: InputBox.

1.9.2. MessageBox

MessageBox, kullanıcıya bilgi göstermek için açılan mesaj kutusudur. Bu mesaj kutusu dört öğeden oluĢur.

Text (Yazı): Mesaj kutusunda verilmek istenen bilgiyi tutan yazıdır.

Caption (Başlık): Mesaj kutusunun baĢlığıdır.

Buttons (Düğmeler): Mesaj kutusunda hangi düğmelerin gösterileceğini belirler.

Icon (Simge): Mesaj kutusunda gösterilecek olan simgeyi ve açıldığı zaman çıkartılacak sesi

belirler.

MessageBox.Show("Devam etmek istiyor musunuz?", "Uyarı", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)

RESĠM: MessageBox.

Mesaj kutusu, kapanırken hangi düğmenin tıklandığını DialogResult nesnesi ile programcıya bildirir.

1.10. Değişken Ve Sabitler

1.10.1. Değişkenler:

Program yazarken, bazı verilerin daha sonra kullanılmak üzere bir yerde tutulması gerekebilir. Örneğin, bir

hesaplama yapılırken, önceden hesaplanmıĢ verilerin kullanılması istenirse, bu verileri tekrar hesaplamak

yerine hafızada tutmak performansı artırır. Veya veritabanından alınan bir kullanıcı isminin hafızada

tutulması, bu değer her istendiğinde veritabanına bağlanıp alınmasına tercih edilmelidir. Verilerin bu Ģekilde

hafızada tutulması değiĢkenlerle sağlanır.

DeğiĢkenler farklı türlerde verileri tuttukları için, farklı tiplere sahip olabilir. Bir negatif veya pozitif sayıyı

tutan değiĢken ile yazı tutan bir değiĢken farklı tiplere sahiptir.

21

DeğiĢkenler Dim anahtar kelimesi ile tanımlanır.

Dim sayi

NOT Dim sözcüğü, "boyut" anlamına gelen Dimension kelimesinin kısaltmasıdır.

Bu Ģekilde tanımlanan değiĢkenler Object (nesne) tipindedir, yani her türden veriyi tutabilirler. Nesne

tipindeki değiĢkenler, tanımlanmalarının kolay olması ve istenen tipte değer tutabilmeleri açısından avantajlı

olsa da, performansı önemli ölçüde düĢürürler. Tuttukları değerlerin tipleri biliniyorsa, değiĢkenleri ta-

nımlarken tiplerini belirlemek gerekir.

Dim sayi As Integer Dim kelime As String Tanımlanan değiĢkenlerin tipleri As anahtar kelimesinden sonra belirtilir. DeğiĢken isimlerini belirlerken

bazı noktalara dikkat etmek gerekir:

BoĢluk, nokta, soru iĢareti, noktalı virgül, çift tırnak, tek tırnak, aritmetik operatörler, karĢılaĢtırma

operatörleri ve atama operatörleri ile parantezler kullanılamaz.

Sayı ile baĢlayamaz.

Visual Basic.NET dilinde tanımlı anahtar kelimeler kullanılamaz.

Dim DeğişkenAdı As VeriTipi kuralına uyulmalıdır.

İPUCU DeğiĢken isimlerinde Türkçe karakter kullanılırsa, farklı dil seçenekli iĢletim sistemlerinde çalıĢma

anında hata üretecektir.

Hatalı bazı değişken tanımları:

Dim dim As Double Dim (sayi) As Short Dim 333sayisi As Integer Dim "kelime" As String Dim <isim> As String Aynı tipteki değiĢkenler tek bir satır içinde tanımlanabilir.

Dim sayi1, sayi2 As Integer DeğiĢkenlere değer atamak = operatörü ile yapılır. EĢitliğin sağ tarafındaki değer, sol tarafta bulunan

değiĢkene atanır. Dolayısıyla sağ taraftaki ifadenin değeri değiĢmez.

sayi1 = 10 sayi2 = sayi1 DeğiĢkenler tanımlandıkları sırada baĢlangıç değeri alabilirler.

Dim isim As String = "Ahmet METIN" Uygulama geliĢtirirken, değiĢkenlerin tanımlanarak kullanılması, yazım yanlıĢlarından kaynaklanan

karıĢıklıkları engeller. DeğiĢkenlerin tanımlanmadan kullanılması için Option Explicit seçeneğinin kapalı

olması gerekir. Option Explicit seçeneğini projenin özelliklerindeki Build sekmesinden değiĢtirilebileceği

gibi, kod sayfalarının en üstünde de değiĢtirilebilir.

ġekilden de görüleceği gibi; sayı isimli değiĢken, daha önce tanımlanmadığı

halde, msgbox fonksiyonuna parametre olarak verildiğinde derleyici hata

vermeden programı derliyor ancak, değiĢkenin içeriği NULL olduğundan

mesaj penceresinde herhangi bir bilgi görünmemektedir.

RESĠM: Option Explicit seçeneği kapalı.

22

Option Explicit seçeneğinin On olması, tanımlanmamıĢ değiĢkenlerin kullanılmasına izin vermez, tasarım

anında hata üreterek programcıya bildirir. Varsayılan

durumda On değeri seçilidir.

Yukarıdaki uygulamada, option explicit on (varsayılan

durum) yapıldığında derleyicinin verdiği hata, yandaki

Ģekilde görülmektedir.

DeğiĢkenler program içinde, tuttukları verilere ulaĢmak için kullanılır. Ancak değiĢkenlere ulaĢmak,

tanımlandıkları yerde veya alt bloklarda mümkündür. Bu kavrama değiĢkenlerin kapsam alanı (Scope) denir.

Kapsam alanı dıĢındaki bir yerden değiĢkene ulaĢılamaz.

Namespace NameSpace1 Module Module1 Dim ModulDegiskeni As Integer Class Class1 Dim SinifDegiskeni As Integer Sub Sub1() Dim YordamDegiskeni As Integer Do Dim DonguDegiskeni As Integer Loop End Sub Sub Sub2() Dim YordamDegiskeni2 As Integer End Sub End Class End Module End Namespace AĢağıdakitabloda kod bloklarından hangi değiĢkenlere ulaĢılabildiği görülüyor.

Module1 Class1 Sub1 Sub2 Loop

ModulDegiskeni Evet Evet Evet Evet Evet

SinifDegiskeni Evet Evet Evet Evet

YordamDegiskeni Evet Evet

YordamDegiskeni2 Evet Evet

DonguDegiskeni Evet

Uygulamanın çalıĢması değiĢkenlerin kapsam alanlarındayken, bu değiĢkenler bellekte tutulur. Dolayısıyla

değiĢkenlerin tanımlandıkları yer, kullanılacağı amaca göre seçilmelidir. Örneğin bir değiĢken birden fazla

yordamda kullanılacaksa, bir üst düzeyde (sınıf düzeyinde) tanımlanmaları gerekir. Ancak sadece bir

yordam içinde kullanılan değiĢkenler sınıf düzeyinde tanımlanırsa, bellekte fazladan yer tutar ve performans

düĢer.

1.10.2. Sabitler

Sabit, sürekli aynı değeri tutan değiĢkendir. Uygulamanın çalıĢması boyunca değiĢmeyen bir değer

kullanılıyorsa, sabit kullanılması kodun kolay okunmasını sağlayacaktır.

Sabitler tanımlandıktan sonra değiĢtirilemeyeceği için, tanımlandıkları anda değerlerinin verilmesi gerekir.

Const PI As Double = 3.14

Sabitlerin kapsam alanları değiĢkenler ile aynıdır.

23

1.11. Veri Tipleri

Veri tipi, değiĢkenlerin tuttukları değerlerin türünü ve bellekte tutulacak büyüklüğünü tanımlar. DeğiĢkenleri

veri tipleri ile tanımlarken verinin büyüklüğüne göre bir veri tipi seçilmelidir.

Visual Basic.NET veri tipleri Tabloda listelenmiĢtir.

Veri

Tipi Büyüklük Değer

Boolean 2 Bayt True - False

Byte 1 Bayt 0 - 255

Char 2 Bayt Tek bir Unicode karakteri tutar

Date 8 Bayt 01.01.0001 tarihi 00:00:00 saati - 31.12.9999 tarihi 23:59:59 saati

Decimal 16 Bayt Maksimum 29 haneli sayı tutar. +/-79,228,162,514,264,337,593,543,950,335

arasında değer alır

Double 8 Bayt Negatif sayı aralığı: -1.79769E+308 ile -4.94065E-324 Pozitif sayı aralığı:

4.94065E-324 ile 1.79769E+308

Int32 4 Bayt -2,147,483,648 - 2,147,483,647

Int16 2 Bayt 32,768 - 32,767

Int64 8 Bayt -9,223,372,036,854,775,808 - 9,223,372,036,854,775,807.

Single 4 Bayt Negatif sayı aralığı: -3.4028235E+38 ile -1.401298E-45 Pozitif sayı aralığı:

1.401298E-45 ile 3.4028235E+38

String Maksimum 2,147,483,647 Unicode karakter tutar

Double ve Single veri tiplerinin aralığında belirtilen "E + sayı" ifadesi, 10 ^ sayı ile çarpılacağını belirtir.

Örneğin 12 E-3 ifadesi, 12x10-3

= 12 * 0.001 anlamına gelir.

-1.7E-5 = -0.000017

-1.7E+10 = -17000000000.0

0.7432E+2 = 74.32

7432E-3 = 7.432

NOT Int16, Int32, Int64 .NET veri tipleridir. Visual Basic dilindeki karĢılıkları

Short, Integer, Long veri tipleridir.

Dim yazi As String = "Veri tipleri örnekleri" Dim bool As Boolean = True Dim karakter As Char = "A" Dim tarih As Date = #4/23/2005# Dim numerik As Decimal = -123456789 Dim cift As Double = -1.234E-120 Dim tek As Single = 3.32E+100 Dim bayt As Byte = 255 Dim kisaSayi As Short = -32000 Dim tamSayi As Integer = 2000000000 Dim uzunSayi As Long = -123456789123456789 Uygulamalar çalıĢırken, çoğu zaman veri tipleri birbirlerine otomatik olarak dönüĢtürülür. Örneğin InputBox

geriye String tipinde bir değer döndürür. Ancak kullanıcı mesaj kutusuna sayı girerse ve biz bu değeri

Integer tipinde bir değiĢkene atarsak, veri dönüĢtürme iĢlemi yapılır. Buna Implicit Conversion (kapalı

dönüĢtürme) denir.

24

Dim rakam As Integer

rakam = InputBox("Rakam giriniz")

Büyük veri tiplerinden küçük veri tiplerine dönüĢüm sırasında, değer kayıpları meydana gelebilir. Örneğin

Single tipinden Short tipine yapılacak bir dönüĢümde virgülden sonraki sayılar kaybedilecektir.

Dim virgullu As Single = 1.12

Dim kisaSayi As Short = virgullu ' kisaSayi değişkenin son

değeri 1 olur

NOT Option Strict seçeneği On olarak ayarlanırsa, Implicit Conversion iĢlemine izin verilmez.

Veri dönüĢtürme iĢlemlerinin kapalı olarak yapılması sisteme bırakılmıĢtır. Bu iĢlemde kodların tekrar

okunması sırasında dönüĢtürme iĢlemleri gözden kaçabilir ve değer kayıpları fark edilmez. Bu durumda

dönüĢtürme iĢlemleri hazır fonksiyonlar ile açık olarak yapılmalıdır. Buna Explicit Conversion (açık dö-

nüĢtürme) denir.

Dim rastgeleSayi As Double = Rnd() * 30

MsgBox(rastgeleSayi)

Dim rastgeleTamSayi As Integer = CInt(rastgeleSayi)

MsgBox(rastgeleTamSayi)

Dim rastgeleTamSayi As Integer = CInt(rastgeleSayi) MsgBox(rastgeleTamSayi)

Explicit Conversion fonksiyonları:

CStr. Verilen değeri String tipine dönüĢtürür.

CInt. Integer veri tipinin alabileceği değerler arasında girilen sayıları Integer tipine dönüĢtürür.

CDbl. Double veri tipinin alabileceği değerler arasında girilen sayıları Double tipine dönüĢtürür.

CDate. Doğru tarih ve saat biçimde yazılmıĢ herhangi bir ifadeyi Date tipine dönüĢtürür.

CLng. Long veri tipinin alabileceği değerler arasında girilen sayıları Long tipine dönüĢtürür.

CSng. Single veri tipinin alabileceği değerler arasında girilen sayıları Single tipine dönüĢtürür.

CDec. Decimal veri tipinin alabileceği değerler arasında girilen sayıları Decimal tipine dönüĢtürür.

Sayı dönüĢtürme fonksiyonları, True Boolean tipini -1, False Boolean tipini 0 olarak dönüĢtürürler. Ayrıca

tüm fonksiyonlar, düzgün biçimde verilmiĢ String tipinde değiĢkenleri de ilgili veri tipine değiĢtirirler.

Dim sayı As Integer = CInt("12345abc") 'InvalidCastException hatası fırlatılır. 1.12. Structure (Kullanıcı tanımlı) veri tipi

Structure veri tipleri, programcıların kendilerinin tanımladığı veri tipleridir. Structure, birkaç veri tipinin bir

araya getirilmesiyle oluĢturulan bileĢik bir tiptir. Structure veri tiplerinde yordam tanımları da yapılabilir.

Structure Nokta Dim x As Integer Dim y As Integer End Structure

Structure Ucgen

Dim n1 As Nokta Dim n2 As Nokta Dim n3 As Nokta End Structure

1.13. Diziler

Dizi değiĢkenleri, aynı tipte birçok veriyi bir arada tutmayı sağlar. Benzer iĢlemlerde kullanılan değiĢkenler

bir dizi altında listelenebilir. Örneğin kullanıcıdan alınan isimler String tipinde bir dizi içinde toplanabilir.

Dim isimler(3) As String

25

Diziler tanımlanırken, ismi verildikten sonra parantez içinde kaç eleman içereceğini belirtmek gerekir.

Dizilerin indisleri sıfırdan baĢlar. Örnekteki isimler dizisinin String tipinde 4 tane elemanı vardır.

Dizilerin elemanlarına ulaĢmak için, istenen elemanın indisinin verilmesi gerekir.

isimler(0) = "Ali" isimler(1) = "Ahmet" isimler(2) = "Mehmet" isimler(3) = "Ayşe"

MsgBox(isimler(3)) Dizilere tek tek değer atanabildiği gibi, tanımlarken de değer atanabilir.

Dim isimler() As String = {"Ali","Ahmet","Mehmet","Ayşe"} Diziler tek boyutlu olduğu gibi, birkaç boyutlu diziler de tanımlanabilir.

'İlk boyutunda 5, İkinci boyutunda 6 Integer değeri olan 2 boyutlu dizi Dim matris(4, 5) As Integer

Burada, dizinin ilk boyutunda 5 tane eleman vardır. Ġlk boyuttaki her eleman için Ġkinci boyutta 6 eleman

bulunur. Dolayısıyla dizinin toplam 30 elemanı vardır. Bu dizide bir boyut daha olsaydı, o boyutun her

elemanı için diğer boyutlardaki 30 eleman bulunacaktı.

Çok boyutlu dizilerin eleman sayıları boyutlarındaki eleman sayıları çarpılarak hesaplanabilir.

Dim dizi(boyut1,boyut2,boyut3,... ,boyutn) As VeriTipi ' Eleman sayısı: (boyut1 + 1) * (boyut2 + 1) * ... * (boyutN + 1) Çok boyutlu dizilere baĢlangıç değerleri, dizinin boyutu dikkate alınarak verilmelidir. Boyutlardaki

elemanlar küme parantezleri ile gruplanmalıdır.

' İlk boyutunda 2, ikinci boyutunda 4 eleman olan 2 boyutlu dizi Dim matris(,) As Integer = {{1, 2, 3, 4}, {5, 6, 7, 8}} Çok boyutlu dizilerin elemanlarına ulaĢmak için, her boyut için indis göstermek gerekir.

matris(0, 0) = 1 Dizileri tanımladıktan sonra, eğer boyutun büyüklüğü (eleman sayısı) yetmiyorsa tekrar boyutlandırmaya

ihtiyaç duyarız. Aynı Ģekilde boyutun büyüklüğünü azaltmak için de tekrar boyutlandırma kullanılır.

Dim dizi() As Double = {0.1, 0.2, 0.3} ReDim dizi(4) ReDim, yeniden boyutlandır anlamına gelir. Burada dizininin boyutu beĢ eleman alacak Ģekilde ayarlanır.

Ancak ReDim, dizileri boyutlandırırken değerleri korumaz. Preserve anahtar kelimesi kullanılmadan tekrar

boyutlandırılan diziler, içerdiği verileri kaybeder.

' (3,0) boyutlu olan bir dizi, ' değerlerini koruyarak (3,1) boyutlu yapılır Dim dizi(,) As Double = {{1.0}, {2.0}, {3.0}, {4.0}} ReDim Preserve dizi(3, 1)

1.13.1. Bazı Dizi Özellikleri ve Metotları

Diziler, .NET Framework içinde tanımlı Array sınıfı ile temsil edilir. Tüm diziler Array sınıfında tanımlı

özellikleri ve metotları kullanırlar.

Length. Dizinin bütün boyutlarındaki toplam eleman sayısını veren özelliktir.

Dim ComboBoxDizisi(19) As ComboBox MsgBox(ComboBoxDizisi.Length) 'Sonuç = 20

26

Dim dizi(1, 4, 4, 5, 6) As Integer MsgBox(dizi.Length()) 'Sonuç = 2 * 5 * 5 * 6 * 7 = 2100

Rank. Dizinin boyut sayısını veren özelliktir.

MsgBox(dizi.Rank) 'Sonuç = 5 GetLength. Ġndisi verilen boyutun kaç elemanlı olduğunu gösterir. Burada indisin sıfırdan

baĢladığına dikkat edilmelidir.

Dim dizi(10, 40, 50, 80, 90) As Integer MsgBox(dizi2.GetLength(4)) 'Sonuç = 91

Clear, Reverse ve IndexOf metotları Array sınıfında Shared (paylaĢtırılmıĢ) olarak tanımlı metotlardır.

ĠĢlemin yapılacağı dizi parametre olarak verilmelidir.

Clear. Parametre olarak verilen dizinin, belirtilen indis aralığındaki tüm değerlerini temizler.

Temizleme iĢleminde atanan değer, dizi elemanlarının tiplerine göre değiĢir. Örneğin Integer tipinde

tanımlı bir dizinin elemanları temizlenirse 0 değerini alacaktır. Buna karĢın String tipindeki

elemanlar "" (boĢ yazı) değerini alır.

Dim dizi() As Integer = {12, 13, 14, 15} ' 1. indisten baĢlayarak, 3 elemanı temizle

Array.Clear(dizi, 1, 3) MsgBox(dizi(2)) 'Sonuç = 0 ' Dizinin tüm elemanlarını temizler Array.Clear(dizi, 0, dizi.Length)

Reverse. Parametre olarak verilen dizinin eleman sırasını tersine çevirir. Dizinin tüm elemanlarının

veya belirli indis aralığındaki elemanlarının sırası tersine çevrilebilir.

Dim harfler() As String = {"A", "B", "C"} Array.Reverse(harfler) MsgBox(harfler(2)) 'Sonuç = A Dim harfler() As String = {"A", "B", "C"} Array.Reverse(harfler, 0, 1) MsgBox(harfler(2)) 'Sonuç = C

IndexOf. Ġlk parametrede verilen dizide, ikinci parametrede verilen değeri arar. Aranan değer dizide

bulunursa indisi, bulunamazsa -1 döndürür.

Dim notlar() As Single = {78.1, 99.9, 100, 12.2} Dim maxNot As Single = 100 MsgBox(Array.IndexOf(notlar, maxNot)) ' Aranan maxNot değerinin indisi = 2

1.14. Debug

Visual Studio Debug aracı, çalıĢma anında kodlar arasında satır satır ilerleyerek hataları bulmayı sağlar.

Ġncelemeye baĢlamak istenen kod satırı üzerinde bir BreakPoint (durma noktası) konarak, hata ayıklayıcının

bu satır çalıĢtırılmadan önce orada durması sağlanır.

RESĠM: Durma noktası.

27

Uygulama çalıĢtırıldığında, BreakPoint konulan kod satırına kadar durmaz. Belirtilen satıra sıra

gelindiğinde, kod sayfasında, o an üzerinde bulunan satır ok ile gösterilir. Visual Studio ile hata ayıklarken,

tanımlanan değiĢkenlerin o andaki değerleri incelenerek mantıksal hatalar bulunabilir.

Hata ayıklama sırasında bazı Visual Studio panelleri, değiĢkenlerin, kontrollerin ve nesnelerin değerlerini

listelemek için kullanılabilir. Bu paneller Debug menüsünde Windows alt menüsünden gösterilir.

Autos Paneli. ÇalıĢmakta olan satırdaki ifade ile bir önceki ifadede bulunan değiĢken ve kontrollerin

değerlerini listeler.

Locals Paneli. Ġçinde bulunulan kapsam alanındaki tüm değiĢkenlerin değerlerini listeler.

Watch Paneli. Değeri incelenmek istenen değiĢken veya kontroller bu panele elle yazılmalıdır.

Kodlar arasında ilerlemek ve hata ayıklamaya devam etmek için dört yol vardır. Bu komutlara Debug

menüsünden veya Debug araç çubuğundan ulaĢılabilir.

Step Into. Kod satırında bir yordam çalıĢtırılacaksa, bu yordamın içine girer. Bu yordam farklı bir

yerde ise, ilgili sayfa açılır ve hata ayıklamaya devam edilir.

Step Over. Herhangi bir yordam içine girmeden, içindeki kapsam alanında çalıĢmaya devam eder.

Step Out. Bulunan yordamdan çıkarak hata ayıklamaya devam eder.

Continue. Birden fazla durma noktası yerleĢtirilmiĢse, bir sonraki noktaya kadar çalıĢmaya devam

eder.

Hata ayıklama, çalıĢtırılacak hiçbir satır kalmadığında durur ve uygulama normal çalıĢmasına devam eder.

Durma noktaları kaldırılarak ya da pasif hale getirilerek uygulamanın durması engellenebilir.

Bütün durma noktalarını kaldırmak için Debug menüsünden Clear All Break- Points komutu, pasif hale

getirmek için Disable All BreakPoints komutu verilmelidir. Durma noktalarını aktif hale getirmek için tekrar

aynı komut seçilmelidir.

1.15. Operatörler

Visual Basic .NET dilinde çalıĢırken, değiĢkenler üzerinde birçok iĢlem yapılır. Hesaplamalarda aritmetik

iĢlemler, kontrollerde karĢılaĢtırma iĢlemleri veya mantıksal iĢlemler yapılır. Bu iĢlemler için Visual Basic

.NET dilinde tanımlı operatörler kullanılır.

1.15.1. Aritmetiksel Operatörler

Bu operatörler aritmetik iĢlemlerinde, sayılarla veya sayı tutan ifadelerle kullanılır.

Çarpma

28

Dim sayi As Integer = 100 sayi = 200 * 2

Bölme

Dim bolum As Double bolum = sayi / 23

Çıkarma

Dim sonuc As Integer = bolum - 100 Toplama

Dim toplam As Integer toplam += sonuc 'Bu ifade, "toplam = toplam + sonuc" ile aynı anlama gelir İPUCU Aritmetik operatörleri, eĢittir ifadesi ile beraber kullanılırsa, iĢlem değiĢkenin kendisi ile yapılır.

Üs alma

toplam ^= 2 Mod alma

Dim kalan As Integer = toplam Mod 42 'Sonuç, toplam değişkenindeki değerin 42 ile bölümünden kalan sayıdır.

1.15.2. Karşılaştırma Operatörleri

Bu operatörler veri tiplerini birbirleriyle karĢılaĢtırmak için kullanılır. Bu operatörler ile yapılan iĢlemlerin

sonucunda True ya da False değeri döner. KarĢılaĢtırma operatörleri yalnızca sayı tipleri üzerinde yapılmaz.

String tipleri birbirleriyle alfabetik sıraya göre karĢılaĢtırılabilir.

Küçük

"A ile başlayan yazı" < "B ile başlayan yazı" 'Sonuç: True

Küçük Eşit

Dim sayi As Double = 1.5 Dim sayi2 As Single = 1.3 sayi2 <= sayi 'Sonuç: True

Büyük

sayi2 > sayi1 'Sonuç: False

Büyük Eşit

sayi2 >= sayi1 'Sonuç: False

Eşit

"Yazı" = "yazı" 'Sonuç: False

Eşit Değil

"Yazı" <> "yazı" 'Sonuç: True

1.15.3. String Operatörleri

String tipleri üzerinde gerçekleĢtirilen iĢlemler için tanımlı operatörlerdir.

String tipindeki değiĢkenleri birbirine bağlama iĢlemi & operatörü ile gerçekleĢir.

Dim isim As String Dim soyad As String Dim IsimSoyad As String = isim & " " & soyad

29

1.16. Karar Yapıları ve Döngüler

Karar yapıları ve döngüler, algoritmaların akıĢını yönlendirir. If ve Select Case karar yapıları ile gerekli

kontroller yapılarak, uygulama istenen Ģekilde yönlendirilir. Döngüler ile belli bir yol izelenerek birçok kez

tekrarlanacak iĢlemler bir defa yazılır. Bu iĢlem, döngü sonlanana kadar gerçekleĢtirilir.

Uygulamalar çalıĢtırılırken, yazılan kodların çalıĢma sırası, satırların teker teker iĢlenmesi ile

gerçekleĢir. Ancak çoğu zaman, bazı kodların sadece belli durumlarda çalıĢması istenir. Örneğin uygulama

açılırken kullanıcı adı ve parola sorulması, kullanıcıların seviyelerine göre eriĢim izinlerinin tanımlanması

gibi durumlarda kontrol iĢlemleri yapılmalıdır. Bu kontroller de karar yapıları ile gerçekleĢtirilir.

Algoritmaların akıĢını kontrol etmekte en büyük rol, karar yapılarınındır. Visual Basic .NET dilinde farklı

Ģekillerde kullanılan, ancak benzer görevlere sahip karar yapıları tanımlıdır.

1.16.1. If

If karar yapısı, bir koĢul sağlandığı zaman yapılacak iĢlemleri kapsar. Kontrol edilecek koĢul ifadesinin

sonucu True değerini alırsa, If EndIf bloğu arasındaki kodlar çalıĢtırılır.

If Koşul Then End If Örnek: Vize ve final notunu kullanıcıdan aldıktan sonra, geçme notunu hesaplayan ve notun 50'den büyük

olması durumunda ekrana "geçtiniz" mesajını çıkartan program kodları aĢağıdaki gibidir.

Dim gecmeNotu As Single

Dim finalNotu As Short = InputBox("Final Notunu girin:")

Dim vizeNotu As Short = InputBox("Vize Notunu girin:")

gecmeNotu = finalNotu * 0.7 + vizeNotu * 0.3

If gecmeNotu > 50 Then

MsgBox("Geçtiniz tebrikler...")

End If

Örnek: InputBox ile çoğunlukla sayı tipinde bir değer almak istenir. InputBox metodundan dönen değer her

zaman String tipinde olacağı için, bu değer Implicit Conversion ile istenen sayı tipine çevrilir.

Dim sayi As Integer = InputBox("Sayi giriniz") Ancak InputBox kutusunda Cancel düğmesi tıklandığında ya da sayı tipinde bir Ģey girilmediğinde Resimde

görülen hata mesajı alınır.

Bu durumda, girilen değerin sayı tipinde olup olmadığı kontrol edilmek zorundadır.

Dim sayi As Integer Dim gecici As String = InputBox("Sayi giriniz:") If IsNumeric(gecici) Then sayi = gecici

End If If yapısında geçen koĢul ifadelerinin sonucu Boolean tipinde bir değerdir. Eğer If deyimindeki bir

karĢılaĢtırma ifadesi kullanılmazsa, buradaki değer Implicit Conversion ile Boolean tipine çevrilir.

30

Dim sayi As Integer = InputBox("Sayi girin:") If sayi Mod 2 Then MsgBox(sayi & " tek sayıdır.") End If sayi Mod 2 ifadesinin değeri, girilen sayıya göre 1 ya da 0 olabilir. Bu değerler If kontrolünde Boolean

tipine çevrilir. 1 değeri True olarak çevrileceği için, girilen sayı tek ise If bloğunun içine girilir.

If blokları içinde iç içe If kontrolleri yapılabilir.

Dim SinifKodu As String = InputBox("Açılacak Sınıf Kodunu Girin:") If SinifKodu.Length = 6 Then 'Sınıf kodlarının son 4 harfi ise sayı tipindedir 1 ve sınıf numarasını belirtir

Dim sinifNumarasi As String = Mid(SinifKodu, 3, 4) If IsNumeric(sinifNumarasi) Then 'Sınıf kodlarının ilk iki harfi, 1 sınıfın türünü belirler Dim sinifTuru As String = Mid(SinifKodu, 1, 2) If sinifTuru = "YM" Then Label1.Text = "YM sınıfı açılıyor" End If If sinifTuru = "YU" Then Label1.Text = "YU sınıfı açılıyor" End If End If End If

1.16.2. If Then Else

Else ifadesi, If yapısındaki koĢulun sağlanmadığı bütün durumlarda devreye girer.

If Koşul Then 'Kodlar Else 'Diğer kodlar End If KoĢul True ise If - Else arasındaki kodlar, koĢul False ise Else - End If arasındaki kodlar çalıĢır.

Örnek: Her 100 milisaniyede bir, formun renginin siyahken beyaz olması, beyazken de siyah olması için,

formun renginin kontrolü yapılması gerekiyor.

Dim Beyaz As Boolean = True Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If Beyaz Then Me.BackColor = Color.Black Beyaz = False Else Me.BackColor = Color.White Beyaz = True End If End Sub If kontrolünde formun beyaz olup olmadığı Boolean tipindeki bir değiĢkende tutulur. KoĢulda eğer Beyaz

adlı değiĢken True ise, formun arka planı siyah yapılır. Bu koĢulun sağlanmadığı durumda, yani Beyaz

değiĢkeninin False olduğu durumda, Else içindeki kodlar çalıĢır ve formun arka planı beyaz yapılır. Her

kontrolden sonra Beyaz değiĢkeninin değiĢtirilmesinin nedeni, formun bir siyah, bir beyaz olmasının

istenmesidir.

31

1.16.3. ElseIf

If deyimindeki koĢul sağlanmadıysa Else deyimindeki kodlar çalıĢıyordu. Ancak bazı durumlarda Else

içinde de kontrol yapmak gerebilir.

If Koşul Then ElseIf Koşul2 Then ElseIf Koşul3 Then End If

1.17. Koşul Operatörleri (And, Or, Not, AndAlso, OrElse)

Veri tipleri ve değiĢkenler üzerinde kontrol yapılırken birden fazla koĢula ihtiyaç duyulabilir. Bu

durumda, koĢulları birbirleriyle karĢılaĢtıracak operatörler kullanılır. Bu kontrollerden dönen değerler

Boolean tipinde olduğu için, koĢul operatörleri de bu değerler üzerinde iĢlem yaparlar.

1.17.1. And

Bu operatör, verilen koĢulların kesiĢimini alır. Eğer tüm koĢulların değeri True ise sonuç da True olur. En az

bir tane False değeri olan koĢul varsa, sonuç False olur.

TABLO: And Operatörü

KoĢul 1 KoĢul 2 KoĢul 1 And KoĢul 2

True True True

True False False

False True False

False False False

1.17.2. Or

Or operatörü, verilen koĢulların birleĢimini alır. Eğer tüm koĢulların değeri False ise sonuç False

olur. En az bir tane True değeri varsa sonuç True olur.

TABLO: Or Operatörü

KoĢul 1 KoĢul 2 KoĢul 1 Or KoĢul 2

True True True

True False True

False True True

False False False

1.17.3. XOr

XOr operatörü, verilen koĢulların farklarını kıyaslar. Eğer her iki data aynı ise False değerini üretir. Eğer iki

data birbirinden farklı ise True değerini üretir.

TABLO: XOr Operatörü

KoĢul 1 KoĢul 2 KoĢul 1 XOr KoĢul 2

True True False

True False True

False True True

False False False

Dim x As String = "1111111" Dim y As String = "1111110" MessageBox.Show(x Xor y) 'Sonuç: 1 ya da True

32

1.17.4. Not

Bir koĢulun değerini tersine çevirir. KoĢul False ise True, True ise False olur.

1.17.5. AndAlso

KoĢullardan biri False ise, diğerleri kontrol edilmeden False değeri döndürülür. Bu tip bir kullanım, birçok

koĢulun kontrol edilmesi gerektiğinde performansı artırır.

Dim dizi() As String = {} 'Diziye eleman ekleme işlemleri If dizi.Length > 0 AndAlso dizi(1).EndsWith(".") Then Label1.Text = "Cümle sonundaki kelime: " & dizi(1) End If Bu örnekte, dizinin ilk elemanı üzerinde bir kontrol yapılmak isteniyor. Ancak diziye eleman eklenmemiĢse,

ilk elemana ulaĢırken hata üretilecektir. Dolayısıyla dizinin uzunluğunu da kontrol etmek gerekir. Kontrol

And ifadesi ile yapılsaydı, dizi elemanın noktayla bitip bitmediği ve dizinin uzunluğu kontrol edilecekti. Bu

durumda iç içe If ifadeleri ile uzun bir kod yazılacaktı. Pek çok kıyaslama gerekecek ve performans

düĢecekti. Ancak burada, dizi uzunluğu koĢulu sağlanmazsa, diğer koĢula geçilmeden If kontrolünden

çıkılır.

1.17.6. OrElse

KoĢullardan biri True ise, diğerleri kontrol edilmeden True değeri döndürülür.

Dim Rol As String 'Veritabanından, kullanıcının rolü alınır. Sadece Administrator, Moderator ve Power User rolündeki 'kullanıcılar dosya silme işlemi yapabilirler. If Rol = "Administrator" OrElse Rol = "Moderator" OrElse Rol = "Power User" Then

Kill("C:\VeriTabani.mdb") End If

Dosya silme iĢlemi için, kullanıcının rolü veritabanından alındıktan sonra, kontrol iĢlemi yapılır. Eğer bir

kullanıcın rolü Administrator, Moderator veya Power User rollerinden biriyse, diğer kontrollerin yapılması

gerekmez. Bu örnekte Rol değiĢkeni Administrator değerine eĢitse, diğer iki koĢul kontrol edilmeden True

ifadesi döner.

1.18. Select Case

Select deyimi ElseIf ile benzer iĢlevi görür, ancak okunması daha kolaydır. Select ile seçilen bir değerin

kontrol edilmesi Case ifadelerinde yapılır.

Dim dosya As String = TextBox1.Text Select Case ComboBox1.Text Case "Kopyala" Dim yeniYer As String yeniYer = InputBox("Kopyalanacak yeri girin:") FileCopy(dosya, yeniYer) Case "Ad Değiştir" Dim yeniAd As String yeniAd = InputBox("Dosyanın yeni adını girin:") Rename(dosya, yeniAd) Case "Sil" Kill(dosya) Case Else MessageBox.Show("Hatalı seçim") End Select

33

Buradaki Select Case kullanımı, ComboBox kontrolünden seçilen öğeye göre bir iĢlemin

gerçekleĢtirilmesini sağlar.. Seçilen öğenin yazısı Case ifadelerinde verilen değerlere eĢitse, ilgili kodlar

çalıĢtırılır. Case Else ise, diğer koĢulların sağlanmadığı tüm durumlarda devreye girer.

Case ifadelerindeki kontroller, sadece bir tek değere "eĢitlik" ile sınırlı değildir. Select ile kontrol edilecek

değerin birden fazla olması durumunda, aynı kodların çalıĢması istenebilir veya değerlerin belirli aralıklarda

olması gibi durumlarla da karĢılaĢılabilir.

1.18.1. To Kullanımı

To ile değerlerin belirli aralıklarda olup olmadığı kontrol edilir. String tipindeki değerlerin kontrolü alfabetik

olarak yapılır.

Dim durum As String Select Case UrunStokSayisi Case 0 durum = "Ürün Tükenmiş" Case 1 To 10 durum = "Çok Az" Case 10 To 25 durum = "Az" Case 25 To 50 durum = "Yeterli" Case 50 To 75 durum = "Fazla" Case Else durum = "Çok Fazla" End Select

1.18.2. Is Kullanımı

Is ifadesi karĢılaĢtırma operatörleri ile kullanılır.

Dim sayi As Integer = Rnd() * 1000 Select Case sayi1 Case Is < 10 MsgBox(sayi & " sayısı tek basamaklıdır") Case Is < 100 MsgBox(sayi & " sayısı iki basamaklıdır") Case Is < 1000 MsgBox(sayi & " sayısı üç basamaklıdır") End Select Burada sayi değiĢkeninin kontrolü, küçüktür karĢılaĢtırma operatörü ile yapılıyor.

Burada dikkat edilmesi gereken bir durum da, sayi değiĢkeninin tek basamaklı olduğu zamanki durumdur.

Örneğin, sayı değiĢkeni 6 değerini aldığında, Case ifadelerindeki bütün koĢulların sağlandığı görülür. Birden

fazla Case içine girilemediğinden, koĢulun sağlandığı ilk Case içindeki kodlar çalıĢtırılır. Bu örnekte

Case Is < 1000

ifadesi en baĢa alınsaydı, girilen bütün sayıların üç basamaklı olduğu gösterilirdi.

34

1.18.3. Birden Fazla Koşulun Kontrolü

Bir Case ifadesine birden fazla koĢul kullanılmak isteniyorsa, bu koĢullar virgülle ayrılır. Bu koĢullardan

herhangi biri sağlandığı zaman Case içine girilir. Dolayısıyla virgül, OrElse koĢul operatörü görevini görür.

Select Case ifade Case Koşul1, Koşul2, Koşul3 Case Koşul4, Koşul5 End Select Örnek:

Select MsgBox("Devam etmek istiyor musunuz?", MsgBoxStyle.YesNoCancel) Case MsgBoxResult.No, MsgBoxResult.Cancel Label1.Text = "İşlem iptal edildi" Case MsgBoxResult.Yes Label1.Text = "Kayıt işlemi gerçekleştirildi." End Select Dim UzmanlikAlani As String Select Case ProgramlamaDili Case "PHP", "ASP" UzmanlikAlani = "Web" Case "T-SQL" UzmanlikAlani = "Veri Tabanı" End Select

1.18.4. Hangi Karar Cümlesi Nerede Kullanılır?

If ve Select karar yapıları benzer iĢlevler görseler de, kullanım yerlerine ve birbirlerine göre değiĢik

avantajları vardır. If Else If karar yapılarında, kontrol edilen değiĢkenlerin ya da değerlerin her seferinde

tekrar yazılması gerekir. Bu durumda Select karar yapısı, kodların yazılıĢını ve okunuĢunu kolaylaĢtırması

açısından tercih edilmelidir.

Ayrıca, bir Case ifadesinde kontrol edilen koĢullar virgülle ayrıldığında OrElse iĢlemi yapılır. Select Case

karar yapısında And kullanımı yapılamaz.

Dim sayi As Integer = 90 Select Case sayi Case Is > 20, Is < 40 MsgBox(sayi & " sayısı, 20 ile 40 arasındadır.") Case Is > 40 MsgBox(sayi & " sayısı, 40 tan büyüktür.") End Select

Bu örnekte ilk Case ifadesindeki ilk koĢul gerçekleĢtiği için diğer koĢullar göz ardı edilir. Verilen sayının 20

ile 40 arasında olmasının kontrolü, Case 20 To 40 ifadesi ile ya da If karar yapısı kullanılarak yapılması

gerekir.

If sayi > 20 And sayi < 40 Then MsgBox(sayi & " sayısı, 20 ile 40 arasındadır.") ElseIf sayi > 40 Then MsgBox(sayi & " 40 tan büyüktür.") End If Bir grup RadioButton kontrolü içinden sadece bir tanesi seçilebildiği için, seçilen kontrolü bulmak için

ElseIf yapısının kullanımı yeterli olacaktır.

35

If RadioButton1.Checked Then …

ElseIf RadioButton2.Checked Then … ElseIf RadioButton3.Checked Then … End If Ancak bu kontroller, CheckBox kontrolünün kullanım yapısına uymaz. Formlarda birden fazla CheckBox

kontrolü seçilebildiği için, seçilen kontrolleri bulmak için If EndIf blokları kullanılmalıdır.

If CheckBox1.Checked Then …

End If If CheckBox2.Checked Then … End If If CheckBox3.Checked Then … End If

End If

1.19. Döngüler

Algoritmalarda bazı iĢlemlerin tekrar çalıĢması için, bu iĢlemlerin her seferinde yazılması gerekir. Ancak bu

çözüm, çok fazla tekrar için hem yazmayı, hem de

okumayı zorlaĢtırır. Örneğin, yüz elemanlı bir diziye

rasgele sayı atanması için iĢlemin yüz defa yazılması

gerekir. Döngüler ile iĢlem sadece bir defa yazılır ve

tekrar sayısına göre bu iĢleme geri dönülür.

RESĠM: Döngü.

1.19.1. For Next

For döngüsü bir iĢlemin belirli sayıda yapılması için kullanılır.

Dim sayac As Byte For sayac = 0 To 10 MsgBox("Merhaba") Next DeğiĢken tanımlamaları, For döngüsünün içinde de yapılabilir. Bu durumda, değiĢkenin kapsam alanı bu

döngüyle sınırlı kalır.

36

For sayac As Byte = 0 To 10 MsgBox("Merhaba") Next Bu döngünün avantajı, sayacın tekrar sayısı ile kontrolünü ve artırılmasını kendisi yapmasıdır. Next ifadesi

sayac değiĢkenini varsayılan durumda bir artırır. For döngüsü içinde kullanılan sayac değiĢkeni sayısal bir

değer olmalıdır. Döngülerde kullanılan sayaçlar, sadece belli bir sayıda iĢlem yapmayı sağlamaz. Sayaçların

artma veya azalma adımları belirli olduğu için, kod içinde çoğu zaman bu avantajdan yararlanılır.

ListBox1.Items.Add("Karakter - ASCII kod karşılığı") Dim i As Integer For i = 0 To 255 ListBox1.Items.Add(Chr(i) & " - " & i) Next

Örneğin dizi iĢlemlerinde, dizinin her elamanına ulaĢmak için sayaç kullanılabilir. Sayacın artma hızı bir

olduğu için dizi(sayac) ifadesi, sırayla dizinin elemanlarına ulaĢmayı sağlar.

Dim i As Integer Dim dizi(10) As Integer For i = 0 To dizi.Length - 1 dizi(i) = Rnd() * 100 Next DİKKAT Döngüler içinde dizi kullanılırken, sayaç sıfırdan baĢlamıĢsa döngünün biteceği nokta "dizi

uzunluğu -1" olmalıdır.

DİKKAT DeğiĢken tanımlamaları For döngüsünün içinde de yapılabilir. Bu durumda, değiĢkenin kapsam

alanı bu döngüyle sınırlı kalır.

Döngülerde sayaç değiĢkeninin artma veya azalma adımları Step ifadesi ile belirlenir.

Dim fahr, derece As Integer For derece = 0 To 100 Step 10 fahr = derece * 1.8 + 32 Label1.Text &= fahr & " Fahrenheit= " Label1.Text &= derece & " Celcius" & vbCrLf Next

1.19.2. For Döngülerinin İç İçe Kullanımı

Çoğu zaman For döngülerindeki her etap için baĢka bir döngünün kurulması gerekir. Örneğin, bir müĢterinin

birden fazla telefon numarası bir dizi içinde tutuluyorsa, bütün müĢterilerin telefonlarını listelemek için iki

döngü kullanılması gerekir. Ġlk döngü tek tek müĢterileri almak için, alt döngü ise her müĢterinin

telefonlarını almak için kullanılmalıdır.

Birden fazla boyutlu dizilerde iĢlem yaparken de For döngüsü iç içe kullanılabilir. Örneğin, iki boyutlu bir

tabloda, ilk boyut için bir For döngüsü, diğer boyut için de baĢka bir For döngüsü kullanılarak dizinin tüm

elemanlarına ulaĢılabilir.

Exit For ifadesi, o anda bulunan For döngüsünden çıkmayı sağlar.

37

1.19.3. While

While döngüsü bir koĢul gerçekleĢtiği sürece çalıĢan döngüdür. For döngüsüne göre avantajı, sayı dıĢında

herhangi bir veri tipi üzerinde karĢılaĢtırma yapılabilir olmasıdır. Ancak For döngüsünde otomatik yapılan

sayaçların artırılması ve kontrol edilmesi iĢlemleri bu döngüde yapılmaz. Bunun için kod yazılması gerekir.

While Koşullar … End While While döngüsünde koĢul kontrolleri döngünün içinde yapılır ve gerektiğinde Exit While ifadesi ile

döngüden çıkılır.

Birden ona kadar olan sayıların toplamını hesaplamak için, bir ve on arasındaki sayılar tek tek yazılıp

toplanabilir. Bu, iyi bir yöntem olmasa da sonuç verir. Ancak kullanıcının girdiği bir sayıya kadar toplam

almak için bir döngü gerekir.

Dim toplam As Integer = 0 Dim sayac As Short = InputBox("Bir sayı girin") While sayac > 0 toplam += sayac sayac -= 1 End While Burada kullanıcının girdiği sayıdan itibaren sıfıra kadar giden bir döngü kurulur. Döngü sayacın sıfırdan

büyük olduğu her durum için çalıĢır. Sayaç sıfırlandığında ise döngüden çıkılır.

AĢağıdaki gibi birden fazla koĢul, gene birden fazla mantıksal iĢleme sokulabilir. Ancak, hatalı sonuçlar

çıkmaması için koĢulların parantezle gruplandırılması tavsiye edilir.

While koşul1 and koşul2 or koşul3 End While

1.19.4. Do - Loop

Do ifadesi ile baĢlayan döngülerin söz dizimi Loop ifadesi ile sonlanacak Ģekilde yazılır. Loop anahtar

kelimesinin görevi, Do ifadesine geri dönmektir. Dolayısıyla koĢul kontrolü yapılmayan bir Do Loop

döngüsü sonsuza kadar çalıĢır.

Do Label1.Text = "Bu döngüden çıkılamaz." Loop Do Loop döngüsünde koĢul kontrolleri döngünün içinde yapılır ve gerektiğinde Exit Do ifadesi ile

döngüden çıkılır.

Do Dim kullanici, parola As String kullanici = InputBox("Kullanıcı Adı: ") parola = InputBox("Parola: ") If LCase(kullanici) = "ogrenci" And parola = "MYO" Then Exit Do MsgBox("Hatalı giriş!", MsgBoxStyle.Critical) Loop Label1.Text = "Giriş başarılı." & vbCrLf

Exit Do ifadesi ile karĢılaĢıldığı zaman döngüden çıkılacağı için, If içinde kontrol edilen koĢul doğru ise

mesaj kutusunun gösterildiği kod bölümüne geçilmez.

38

1.19.5. Do While

KoĢullar, Do Loop döngüsünün içinde kontrol edilebildiği gibi, döngüye girmeden de kontrol edilebilir.

Dim i As Integer = 0 Do While i < 10 i += 1 Loop Döngünün bu Ģekilde kullanımının While - End While döngüsünden farkı yoktur. Ancak Do While

döngüsünün yapısı daha esnektir ve kontrol Loop ifadesinde de yapılabilir.

Dim yanit As String Do MsgBox("İşlem yapılıyor...") yanit = InputBox("Devam etmek istiyor musunuz?") Loop While (yanit = "e" Or yanit = "E")

Buradaki fark, döngü içinde tanımlanan iĢlem bir defa yapıldıktan sonra koĢulun kontrol edilmesidir. Yani

en az bir defa yapılması istenen bir iĢlem Do - Loop While yapısı içersinde kullanılabilir.

1.19.6. Do Until

Do Loop döngüsünün, kontrol edilen koĢul gerçekleĢene kadar devam etmesi isteniyorsa, Do Until yapısı

kullanılır. Do While döngüsü, koĢul True olduğu sürece devam ederken; Do Until döngüsü, koĢul True

olduğu zaman sonla nır.

Dim dizi(9) As Integer Dim i As Integer = 0 Do Until i = 10 dizi(i) = i * i i += 1 Loop

1.19.7. Sonsuz Döngüler

While döngüsü sayaç ile kullanılırken, sayacın değiĢtirilmesine dikkat edilmesi gerekir. Eğer sayaç

değiĢtirilmezse, While ifadesindeki koĢul hep True değerini alacağı için sonsuz döngüye girilir.

Sadece sayacın kontrol edilmediği durumlar değil, koĢulların yazılmalarındaki mantık hataları da sonsuz

döngüye sebebiyet verir.

Dim i As Short = 0 While i < 10 Or i > 5 Label1.Text = "Sonsuz döngüye girildi" i += 1 End While

1.19.8. Hangi Döngü Nerede Kullanılır?

Visual Basic .NET dilinde While ve Until döngüleri, koĢul kontrollerine izin verdiği için For döngüsüne

göre daha esnek yapıdadır. For döngüsünde sayacın belli bir değere ulaĢmıĢ olup olmadığı kontrol edilir. Bu

kontrol döngünün içinde otomatik olarak yapıldığı için yazılması daha kolaydır. Örneğin, istenen bir iĢlemin

sadece belli sayıda yapılması ise, sayaçlar ile uğraĢmamak için For döngüsü tercih edilmelidir.

39

Dim i As Integer = 0 While i <= TekrarSayisi ' TekrarSayisi + 1 kadar işlem yapılır. i += 1 End While For i As Integer = 0 To TekrarSayisi ' TekrarSayisi + 1 kadar işlem yapılır. Next Döngülerin belli koĢullar sağlandığı sürece ya da sağlanana kadar çalıĢması, karar yapılarının kullanılmasını

gerektirir. For döngüsünde koĢul kontrolleri If veya Select karar yapıları ile yapılır. Ancak bu tip

durumlarda While ve Until döngülerinin kullanılması kodun yazılımını kolaylaĢtırır.

For i As Integer = 0 To 0 ' Yapılacak işlemler Dim cevap As String cevap = InputBox("Durmak için Cancel düğmesine basın") If cevap <> "" Then i -= 1 End If Next Do ' Yapılacak işlemler Loop Until InputBox("Durmak için Cancel düğmesine basın") = ""

1.20. Hata Yakalama

Bir uygulama geliĢtiricisi program yazarken çok çeĢitli hatalarla karĢılaĢabilir. Visual Basic .NET, ortaya

çıkan hata durumlarında uygulama geliĢtiricisine çok detaylı hata mesajları verir. Bu hata mesajları,

hataların nerede ve nasıl yapıldığını çok detaylı bir Ģekilde gösterir. Hataların en ince ayrıntısına kadar

iĢlenmesi, uygulama geliĢtirmede büyük kolaylık sağlar.

Visual Basic .NET hata mesajları, çalışma zamanı (Run Time) ve tasarım zamanı (Design Time) hataları

olarak ayrılabilir.

Tasarım zamanı hataları, kodların yazılması sırasında derleyici tarafından bulunan ve Task List panelinde

gösterilen hatalardır.

RESĠM: Tasarım zamanı hataları.

Task List panelinde hatanın açıklaması, hatanın projenin hangi dosyasında ve dosyanın kaçıncı satırında

bulunduğu gösterilir.

40

RESĠM: Task List paneli.

ÇalıĢma zamanı hataları, uygulama çalıĢırken yapılması imkânsız bir iĢlemin gerçekleĢtirilmesi sırasında

meydana gelir. Örneğin InputBox metodu ile bir sayının alınması sırasında, kullanıcı String tipinde bir değer

girerse çalıĢma zamanında bir hata oluĢur. AĢağıdaki resimdeki hata mesajı, dizinin büyüklüğünün dıĢında

bir indis verildiğini belirtir.

Visual Basic .NET dilinde uygulama geliĢtirirken oluĢabilecek tüm hatalar .NET Framework altındaki

Exception sınıfları halinde tanımlanır. Örneğin dizinin büyüklüğünden farklı bir indis verildiğinde

IndexOutOfRangeException hatası ortaya çıkar. Tüm hatalar gibi bu hata da Exception taban sınıfından

türetilmiĢtir.

1.20.1. Try Catch Finally

ÇalıĢma zamanında ortaya çıkan hatalar uygulamanın beklenmedik bir Ģekilde sonlanmasına neden olur.

Uygulamanın devam etmesi için bu hataların yakalanıp iĢlenmesi gerekir. Try – Catch - Finally blokları

içinde, çalıĢma zamanı hataları meydana geldiği durumlarda çalıĢması istenen kodlar yazılır. Try bloğu

içine, çalıĢırken hata üretebilecek kodlar yazılırken, Catch bloğu içine, hata oluĢtuğunda yapılması gereken

iĢlemler yazılır.

Dim sayi As Byte Dim sonuc As Integer Try sayi = Rnd() * 3 sonuc = 100 / sayi MsgBox("Bölme işlemi başarılı, sonuç: " & sonuc) Catch ex As Exception MsgBox("Bölme işlemi başarısız. Hata Mesajı: " & ex.Message) End Try Bu örnekte üretilen rasgele bir sayı ile bölme iĢlemi yapılıyor. Sayı sıfır değerini aldığında, bölme iĢlemi

hata üretir. Dolayısıyla bu iĢlem Try bloğu içine yazılmalıdır. Catch bloğunda, iĢlemin baĢarısız olduğunu

41

belirten bir mesaj yazılır. Exception nesnesinin Message özelliği, hatanın oluĢtuğu zaman üretilen mesajı

tutar. Exception nesnesinin özellikleri Catch içinde kullanılmayacaksa, tanımlanmasına gerek yoktur.

Try ... Catch Label1.Text = "Exception kullanılmıyor." End Try Finally bloğunda, Try Catch içinde yapılan tüm iĢlemlerden sonra çalıĢtırılacak kodlar yazılır. Finally

bloğunda yazılan kodlar hata meydana gelse de, gelmese de çalıĢtırılacaktır.

'Dosyayı açmak için kullanılan dosya numarası Dim dosya As Integer = FreeFile() Try Dim kayit As String = "Kayıt Zamanı: " & Now kayit &= vbCrLf & "Uygulama kayıtları..." FileOpen(dosya, "C:\Log.txt", OpenMode.Binary, OpenAccess.Write) FilePut(dosya, kayit) Catch ex As Exception MsgBox(ex.Message) Finally FileClose(dosya) End Try MsgBox("Uygulama akışı buradan devam edecek") Finally bloğunda genellikle, kullanılan kaynaklar serbest bırakılır. Örnekte, bir dosya açılır. Dosya açma

veya dosyaya veri yazma iĢlemlerinde bir hata meydana geldiğinde, Catch ifadesinde bu hata yakalanıp ilgili

mesaj kullanıcıya gösterilir. Finally bloğu her durumda çalıĢacağı için, dosya kapatma iĢlemi burada yapılır.

Uygulama End Try ifadesinden sonra iĢlemeye devam eder.

Try ve Catch içinde uygulamadan çıkılması belirtilse dahi Finally bloğu içinde yazılan kodlar çalıĢtırılır.

Ancak End Try ifadesinden sonra uygulama sonlanır.

1.21. Fonksiyonlar ve Yordamlar

Uygulama geliĢtirirken, bir iĢlemin birçok yerde kullanıldığı zamanlar olur. Bu gibi durumlarda bir kere

yazılan kodlar, farklı yerlerde tekrar yazılır. Uygulama üzerinde bir değiĢiklik yapılmak istenirse, tekrar

yazılan kodların tek tek bulunup değiĢtirilmesi gerekir. Böylece hem uygulamanın yazımı zorlaĢır, hem de

değiĢik yapmak giderek imkânsız hale gelir. Bu problemler, birçok yerde yapılması istenen iĢlemlerin

fonksiyonlar ve yordamlar içinde yazılması ile çözülür. Sadece fonksiyon ve yordamların isimleri

kullanılarak, istenen yerlerde kodlar çalıĢtırılır.

Yapılan iĢlemin sonucunda oluĢan değer isteniyorsa fonksiyonlar kullanılır. Örneğin, veritabanına yeni bir

kullanıcı ekledikten sonra, kullanıcının ID numarası isteniyorsa fonksiyon kullanılmalıdır. Eğer yapılan

iĢlemlerin sonunda bir değer döndürülmüyorsa yordamlar kullanılır. Örneğin bir ComboBox kontrolüne öğe

ekleme iĢlemi yordam içine yazılabilir.

.NET çatısındaki nesnelerin birçok fonksiyon ve yordamları vardır. Tüm fonksiyon ve yordamların kaç

parametre aldığı, geriye dönüĢ değerinin ne olduğu, hangi nesneye ait oldukları ezberlenemez. Dolayısıyla

Visual Studio yardımının kullanılması kaçınılmazdır.

42

1.21.1. Sub

Sub yordamları dönüĢ değeri olmayan kod bloklarıdır. Bu kodlar Sub ve End Sub ifadeleri arasına yazılır.

Sub YordamIsmi() … End Sub Uygulama içinde birçok yerde çalıĢacak olan kodlar Sub yordamı içinde yazılır. Bu kodlar, içine yazıldıkları

yordamın ismi ile çağırılarak, istenen yerde tekrar çalıĢtırılabilir. Örneğin, bir uygulama baĢlarken form

üzerindeki kontrollerin temizlenmesi gerekiyorsa, bu kodları bir daha yazmamak için yordam kullanılabilir.

Sub Temizle() Label1.Text = "" ListBox1.Items.Clear() End Sub Yordamı tanımlarken parantezler içine, alabileceği parametreler yazılır. Eğer yordam parametre almıyorsa

parantezlerin içi boĢ bırakılır.

Sub YazilimUrunleriEkle() ComboBox1.Items.Add("Yazılım Uzmanlığı") ComboBox1.Items.Add("Yazılım Mühendisliği") Label1.Text = "Yazılım paketleri eklendi..."

End Sub Yordamlar, tanımlandıktan sonra baĢka bir yordam veya fonksiyon içinde kullanılır. Yordamı kullanmak

için, gerekli yere isminin yazılması yeterlidir. Ayrıca Call ifadesi de tercihe bağlı olarak kullanılabilir.

Sub DersleriListele() Select Case ComboBox1.SelectedIndex Case 0 Call Temizle() ListBox1.Items.Add("Access - İlişkisel Veritabanları") ListBox1.Items.Add("Programlamaya Giriş Ve Algoritma") ListBox1.Items.Add(".NET Framework") ListBox1.Items.Add("VB.NET ile Windows Tabanlı Programlama") ListBox1.Items.Add("ASP.NET ile Web Tabanlı Programlama") Label1.Text = "Yazılım Uzmanlığı dersleri yüklendi." Case 1 Call Temizle() ListBox1.Items.Add("SQL Server Veritabanı Yönetimi") ListBox1.Items.Add("Visual Studio .NET ile Uygulama Geliştirme") ListBox1.Items.Add("ADO.NET ile Veri Yönetimi ve XML") ListBox1.Items.Add("XML Web Services, .NET Remoting ve COM+") ListBox1.Items.Add("Proje Yönetimi") Label1.Text = "Yazılım Mühendisliği dersleri yüklendi." Case Else Temizle() Label1.Text = "Yazılım paketi seçiniz." End Select End Sub Burada ComboBox kontrolünden seçilen değerin kontrolün indisi üzerinden yapılması,

YazilimUrunleriEkle yordamında eklenen elemanların sırası değiĢirse problem yaratır. Liste kutusuna

eklenen dersler yanlıĢ paketlerde gözükür. Ancak ComboBox kontrolünün seçili metni üzerinden kontrol

yapılırsa da, eklenen isimler değiĢtiği zaman bir problem ortaya çıkar. Bu durumda iki yordamın birbirine

43

bağımlılığı görülür. Bu örnekte, bir yordamda değiĢiklik yapıldığı zaman diğer yordamın çalıĢma Ģekli de

kontrol edilmelidir.

Label ve ListBox kontrollerini temizleyen kodlar sadece iki satır olduğu için Temizle yordamında

yazılmayabilirdi. Ancak bu kodlar DersleriListele yordamında üç defa kullanıldığı için, her değiĢiklikte

kodun yazıldığı üç yer bulunup gerekli düzeltmeler yapılacaktı. Örneğin, temizleme iĢlemi, liste kutusunda

"Dersler" metni gözükecek Ģekilde değiĢtirebilir. Bu durumda, değiĢikliği sadece Temizle yordamında

yapmak yeterli olur.

Sub Temizle() Label1.Text = "" ListBox1.Items.Clear() ListBox1.Items.Add("Dersler: ") End Sub

1.21.2. Parametre Kullanımı

Yordamların bazı değerlere göre farklı iĢlem yapması istenebilir. ĠĢlemin bağlı olduğu bu değerlere

parametre veya argüman denir. Yordamlar parametre alacak Ģekilde tanımlanıp, çağırıldıkları sırada

istedikleri parametreler verilerek kullanılır.

Sub YordamIsmi(Parametre1 As VeriTipi, Parametre2 As VeriTipi, ...) ... End Sub

Örneğin, uygulamanın birçok yerinde kullanıcıya bilgi vermek amaçlı mesaj kutuları kullanılır. Eğer bu

mesajlar bir yordam içine yazılırsa, daha sonra mesajlar bir Label üzerinde gösterilecek Ģekilde kodu

değiĢtirmek kolay olacaktır. Yordamın göstereceği mesajların parametre olarak verilmesi gerekir.

Sub MesajGoster(ByVal mesaj As String) Label1.Text = mesaj End Sub Sub Yordam1() '... MesajGoster("1. Yordam içinden çağılır.") End Sub Sub Yordam2() '... MesajGoster("2. Yordam içinden çağılır.") End Sub Sub Yordam3() '... MesajGoster("3. Yordam içinden çağılır.") End Sub

Yordamları çağırırken tüm parametrelerin belirtilen veri tipinde verilmesi gerekir. Farklı tipte verilen

parametreler Implicit Conversion ile, ilgili veri tipine çevrilir.

Yordamları tanımlarken parametrelerin isimleri ve veri tipleri belirtilmelidir. Ayrıca parametrelerin

değer tipi olarak mı, yoksa referans tipi olarak mı geçileceği belirtilmelidir. ByVal olarak geçilen

parametrelerin değerleri kullanılabilir, ancak değiĢtirilemez. ByRef, parametrelerin hafızadaki adreslerine

ulaĢmayı sağlar. Dolayısıyla parametrelerin değerleri değiştirilebilir.

Yordamlar çağırıldıklarında, kodlar End Sub ifadesi görülene kadar çalıĢtırılır. Yordamın normal

akıĢından çıkılmak istenirse Exit Sub veya Return ifadeleri kullanılır.

44

Sub MusteriBilgisi(ByVal MusteriId As Integer) If Not MusteriId > 0 Then Return End If ' MusteriId değerine göre ' müşteri bilgileri veritabanından çekilir. End Sub

Return ifadesi Exit Sub ile aynı iĢlevi görür.

Sub MusteriBilgisi(ByVal MusteriId As Integer) If Not MusteriId > 0 Then Exit Sub End If End Sub Parametre olarak diziler kullanıldığında bu dizilerin büyüklükleri verilmez. Fakat parantezler kullanılarak,

verilen parametrenin dizi olduğu belirtilmelidir.

Sub MatrisTopla(ByVal matris1(,) As Integer, ByVal matris2(,) As Integer) Dim x As Integer = matris1.GetLength(0) Dim y As Integer = matris1.GetLength(1) If x <> matris2.GetLength(0) OrElse y <> matris2.GetLength(1) Then MsgBox("Matris boyutlarının büyüklükleri birbiriyle aynı olmalıdır.") Exit Sub End If Dim sonuc(x - 1, y - 1) As Integer For i As Integer = 0 To x - 1 For j As Integer = 0 To y - 1 sonuc(i, j) = matris1(i, j) + matris2(i, j) Next Next End Sub Diziler yordamlara parametre olarak geçilirken, sadece isimleri verilir.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim m1(,) As Integer = {{1, 3, 5}, {7, 9, 11}} Dim m2(,) As Integer = {{0, 2, 4}, {6, 8, 10}} MatrisTopla(m1, m2) End Sub Opsiyonel Parametreler: Yordamlara parametre verilmesi opsiyonel olabilir. Parametre tanımlarken

Optional anahtar kelimesi kullanılırsa, yordam çağırıldığında bu parametrenin girilmesi zorunlu olmaz.

Opsiyonel parametreler tanımlanırken baĢlangıç değerleri verilmelidir, çünkü bu alan boĢ bırakıldığı zaman

hangi değerin iĢleneceği bilinmelidir.

Örneğin, MsgBox kullanımında bazı parametrelerin isteğe bağlı girilebildiği görülür. Girilmeyen

parametreler için varsayılan değerler kullanılır.

MsgBox("Mesaj") MsgBox("Mesaj", MsgBoxStyle.YesNoCancel) MsgBox("Mesaj", MsgBoxStyle.MsgBoxRight, "Uyarı") MsgBox("Mesaj", , ) MsgBox("Mesaj", , "Dikkat")

45

Opsiyonel parametreler, yordamların son argümanları olmalıdır. Bir opsiyonel parametreden sonra ancak

baĢka bir opsiyonel parametre gelebilir.

RESĠM: Opsiyonel parametre.

Bir yordamda veya fonksiyonda birçok opsiyonel parametre kullanılıyorsa, istenen parametreler boĢ

bırakılabilir. BoĢ bırakılan parametrelerin sırası önemli değildir, ancak virgüller ile ayrılarak yerleri

belirtilmelidir.

Sub Yordam(Optional ByVal param1 As String = "Merhaba", Optional ByVal param2 As Date = #1/1/2005#, Optional ByVal param3 As Boolean = True) ' Çalışacak kodlar... End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Yordam("Hoşgeldiniz", , ) Yordam(, , ) Yordam(, Now, ) End Sub

1.21.3. ParamArray

Yordamları ve fonksiyonları çağırırken parametrelerin mutlaka girilmesi gerekir. Ancak bazı durumlarda

yordamlara ve fonksiyonlara girilecek parametrelerin sayısı tasarım zamanında belli olmaz. ParamArray

anahtar kelimesi ile yordamlara, aynı veri tipinde bir parametre dizisi verilebilir. ParamArray ile verilen dizi,

yordamın son parametresi olarak tanımlanmalıdır.

Sub YasOrtalamasi(ByVal sinif As String, ByVal ParamArray Yaslar() As Byte) Dim toplam As Integer = 0 Dim ortalama As Double = 0.0 Dim i As Integer For i = 0 To Yaslar.Length - 1 toplam += Yaslar(i) Next ' Parametre verilmezse i = 0 olur If i > 0 Then ortalama = toplam / i End If MsgBox(sinif & " sınıfının yaş ortalaması: " & ortalama) End Sub

46

1.21.4. Function

Fonksiyonlar bir iĢlem yaptıktan sonra geriye değer döndürürler. Örneğin, bir çarpma fonksiyonunun dönüĢ

değeri, parametre olarak verilen iki sayının çarpımı olacaktır. Fonksiyonların tanımları değiĢkenler gibidir.

Function FonksiyonAdı(ByVal Param1 As VeriTipi, ...) As DönüşVeriTipi ... End Function

Fonksiyonların geriye dönüĢ değerleri Return ifadesi ile ya da fonksiyonun ismi verilerek yapılır.

Function Kontrol() As Boolean If TextBox1.Text.Length > 0 And ComboBox1.SelectedIndex > -1 Then Return False End If Return True End Function

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not Kontrol() Then MsgBox("Seçiminizi yaptıktan sonra devam edebilirsiniz.") Exit Sub End If 'Kontrol tamamlandıktan sonra yapılacak işlemler End Sub

Bu fonksiyonun çalıĢması Return ifadesinden sonra yazılan değerin döndürül mesiyle sonlanır. Burada dikkat

edilmesi gereken nokta, fonksiyon değer döndürdükten sonra sonlandığı için Return ifadesinden sonra gelen

hiçbir kodun çalıĢtırılmamasıdır. Eğer dönüĢ değerini belirledikten sonra baĢka bir iĢlemin yapılması

isteniyorsa, fonksiyonun ismi kullanılır. Fonksiyonun ismi bir değiĢken gibi gözükse de, temsil ettiği değer

fonksiyonun dönüĢ değeridir.

Function GunlukKur(ByVal Cinsi As String) As Single Select Case Cinsi Case "d", "D" Return 1.43 Case "e", "E" Return 1.81 Case "s", "S" Return 2.91 End Select End Function

Function KurHesapla(ByVal Miktar As Single, Optional ByVal Cinsi As String = "d") As Double KurHesapla = Miktar * GunlukKur(Cinsi) If KurHesapla < 0 Then ' Pozitife çevrilir. KurHesapla = 0 - KurHesapla MsgBox("Miktar negatif girilmiş.") End If End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = KurHesapla(-1000) End Sub

47

Bu örnekte, fonksiyonun ismi bir değiĢken olarak kullanılır ve hesaplanan değer bu değiĢkene atanır. Daha

sonra bu değiĢkenin değeri, yani fonksiyonun dönüĢ değeri üzerinde iĢlem yapılabilir. Eğer Return ifadesi

kullanılsaydı, kontrol yapılan kodlar çalıĢtırılmadan fonksiyondan çıkılacaktı.

Function KurHesapla(ByVal Miktar As Single, Optional ByVal Cinsi As String = "d") As Double Return Miktar * GunlukKur(Cinsi) ' Bu satırdan sonra yazılan kodlar işlenmez. End Function

Örnek: Sınıf geçme notunun hesaplanması iĢleminin, geriye bir sonuç döndürüleceği için fonksiyon ile

yazılması gereklidir. Parametre olarak final ve vize notları alınır ve bu değerlerle hesaplanan geçme notu sonuç

olarak döndürülür. Vize notlarının girilmesi zorunlu değildir, dolayısıyla bu değerler ParamArray olarak

verilebilir.

Function NotHesapla(ByVal Final As Integer, ByVal VizeKatSayisi As Single, ByVal ParamArray vizeler() As Integer) As Integer Dim vizeToplam As Integer = 0 Dim vizeOrtalama As Double = 0.0 Dim i As Integer For i = 0 To vizeler.Length - 1 vizeToplam += vizeler(i) Next If i > 0 Then vizeOrtalama = vizeToplam / i End If Dim finalKatSayisi As Single = 1 - VizeKatSayisi Return finalKatSayisi * Final + VizeKatSayisi * vizeOrtalama End Function

Fonksiyonun ilk parametresi final notudur. Final notu bir tane olacağı için girilmesi zorunludur. Daha sonra

vize notlarının ortalaması hesaplanarak final notu ile toplanır. Parametre olarak verilen vize katsayısı, vize

notlarının ortalamadaki ağırlıklarını belirler.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim gecmeNotu As Integer gecmeNotu = NotHesapla(70, 0.6, 90, 80, 86, 75, 90) MsgBox(gecmeNotu) End Sub

1.21.5. ByVal ve ByRef İncelemesi

Fonksiyon ve yordamlara parametre verilirken, varsayılan durumda değiĢkenlerin değerleri verilir. Parametre

olarak verilen değiĢkenler üzerinde değiĢiklik yapılması için, bu parametrelerin bulunduğu adres bilgilerine

ihtiyaç vardır. Referans tipindeki değerler parametre olarak geçildiklerinde, referansları verilir. Ancak değer

tipleri parametre olarak verildiklerinde bu değerler kopyalanır ve asıl değiĢkenin tuttuğu değere ulaĢılamaz. Bu

karıĢıklıkları çözmek için, yordamlarda parametreler ByVal ve ByRef olarak belirtilir.

ByVal, parametre olarak verilecek değiĢkenin değeri ile iĢlem yapılacağını belirtir. Dolayısıyla bu parametrenin

değeri değiĢtirilemez.

' Değişecek olan kelime ByVal olarak verilmiştir Sub Ekle(ByVal Kelime As String, ByVal eklenecek As String) Kelime = Kelime.Insert(0, eklenecek) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim mesaj As String = "Hello"

48

Ekle(mesaj, " World") MsgBox(mesaj) End Sub mesaj değiĢkenin değeri, yordama değer olarak verilmiĢtir. Dolayısıyla yordamın üzerinde çalıĢtığı değer,

mesaj'ın bir kopyasıdır. Bellek alanında fiziksel olarak farklı yerlerde dururlar. Yani değiĢiklik yapılan değer,

sadece bir kopyadır. Yordam sonlandığında kopya olarak oluĢturulan değer silinecek ve asıl değer değiĢmemiĢ

olarak kalacaktır. Bu durumda parametre olarak mesaj değiĢkeninin adresi verilmelidir. Dolayısıyla yordamdaki

parametrenin ByRef olarak tanımlanması gerekir.

Sub Ekle(ByRef Kelime As String, ByVal eklenecek As String) Kelime = Kelime.Insert(0, eklenecek) End Sub

1.22. Windows Programlama

Daha önce Windows formlarına ve kontrollerine giriĢ yapılmıĢtı. .NET Framework'te, Windows

uygulamalarının görünüm ve kullanım zenginliğini artırmak için birçok kontrol vardır. Visual Studio ile

varsayılan durumda gelen kontrollerin dıĢında birçok kontrol de Windows uygulamalarına eklenebilir.

Formlar ve Windows Forms Kontrolleri

Windows uygulamalarının temelini Windows Form nesneleri oluĢturur. Windows kontrolleri, kullanıcıya

zengin uygulamalar geliĢtirmek için kolaylık sağlar. Bu kontroller, bir uygulamanın tüm ihtiyacını karĢılayacak

Ģekilde tasarlanmıĢtır. Listeleme kontrolleri, kullanıcıya bir dizi öğeyi değiĢik biçimlerde listelemeyi sağlar.

Resim ve düzenleme kontrollerinin, forma görsel zenginlik sağlayan birçok özelliği vardır. Zaman ve tarih

kontrollerinin yapısı, zaman ve tarih seçme iĢlemlerini kolaylaĢtırır. Bu Windows kontrolleri, tasarım anında

eklenebileceği gibi, çalıĢma anında da eklenebilir.

1.22.1. Form Nesnesi

Windows uygulamaları, kullanıcı ile iletiĢimi Form nesneleri ile sağlar. Formlar, görünüm özellikleri, pencere

stili değiĢtirilerek ve üzerine kontroller eklenerek özelleĢtirilir. Ayrıca birden çok Form nesnesi kullanılarak,

uygulamalar zenginleĢtirilir.

Birden Fazla Form Oluşturmak

Windows uygulamaları birden fazla Form nesnesinden oluĢtuğu için, projelere form eklemek her zaman

gereklidir. Bir Windows projesine yeni bir form eklemek için aĢağıdaki adımları izleyin:

1. Çözüm gezgini (Solution Explorer) panelinden projeyi sağ tıklayarak ya da proje (Project) menüsünden

Windows formu ekle (Add Windows Form) komutunu seçin.

2. Açılan menüden Windows Form öğesinin seçili olduğunu kontrol edin ve bir isim vererek formu

ekleyin.

BaĢlangıç formlarının ayarlanmasının yanı sıra, uygulamada bir formdan baĢka bir formun açılması ve

ayarlanması sık karĢılaĢılan bir durumdur. Form nesneleri, System.Windows.Forms ad uzayı içinde

bulunan Form sınıfından türetilmiĢ sınıflardır. Dolayısıyla yeni bir form oluĢturmak için, istenen Form sını-

fından bir nesne oluĢturulması yeterlidir.

Dim yeniForm As New frmYeni Yeni oluĢturulan formların gösterilmesi, formun Show ve ShowDialog metotları ile yapılır. ShowDialog

metodu, form gösterildikten sonra, kapanana kadar diğer formlara eriĢimi engeller. ShowDialog metodundan

sonra yazılan kodlar, form kapandıktan sonra çalıĢtırılır.

Dim yeniForm As New frmYeni yeniForm.ShowDialog() ' Bu kodlar yeniForm kapandıktan sonra çalıştırılır MsgBox("Form kapandı...")

ShowDialog ile gösterilen formlar, hangi durum ile kapandıklarını belirten bir DialogResult sonucu

döndürürler. Bu kullanım MsgBox hazır fonksiyonu ile aynıdır.

49

Dim frm As New frmSatis If frm.ShowDialog = DialogResult.Yes Then ' Verileri kaydet End If Formun hangi diyalog sonucu ile döneceğini, üzerindeki Button kontrollerinin DialogResult özelliği ile

belirlenir. Eğer düğmenin bu özelliği Yes olarak ayar lanmıĢsa, bu düğme tıklanıp form kapatıldığı zaman,

DialogResult.Yes değerini döndürür.

Formların üzerlerindeki kontroller, form sınıflarının birer üyesi oldukları ve Friend eriĢim seviyesinde

tanımlandıkları için, aynı projeden ulaĢılabilirler. Böylece, aynı Windows projesi içinde açılan formlar

açılmadan önce kontrollerinin özellikleri değiĢtirilebilir. Örneğin, hata formu gösterilmeden önce, üzerindeki

Label kontrolünün Text özelliği ilgili hata mesajını gösterecek Ģekilde ayarlanabilir.

Form Özellikleri

Özellik Değer Tipi Açıklama

AcceptButton Button Form üzerinde Enter tuĢuna basıldığı zaman "tıklanacak" Button

kontrolü

CancelButton Button Form üzerinde Esc tuĢuna basıldığı zaman "tıklanacak" Button

kontrolü

Opacity Double Formun Ģeffaflık oranı (0 -1 arası)

MaximizeBox Boolean Maximize düğmesinin görünürlüğü

MinimizeBox Boolean Minimize düğmesinin görünürlüğü

ControlBox Boolean Close, Maximize ve Minimize düğmelerinin tümünün görünürlüğü

StartPosition FormStartPosition Form açıldığı zaman, ekran üzerindeki konumu

TopMost Boolean Formun tüm pencerelerin üzerinde gözükmesi

FormBorderStyle FormBorderStyle Formun kenar stili

MaximumSize Size Formun alabileceği maksimum büyüklük

MinimumSize Size Formun alabileceği minimum büyüklük

TABLO: Form Özellikleri

Form Olayları

Olay Açıklama

Click Form üzerine tıklandığı zaman gerçekleĢir

Closing Form kapanmadan hemen önce gerçekleĢir

Closed Form kapandıktan sonra gerçekleĢir

Load Form yüklenirken gerçekleĢir

KeyDown Form üzerindeyken bir tuĢun basılması ile gerçekleĢir

KeyUp Basılan tuĢun kaldırılması ile gerçekleĢir

TABLO: Form Olayları

Form Metotları

Metot Açıklama

Hide Visible özelliğini False yaparak formu gizler

Close Formu kapatır. Eğer form baĢlangıç formuysa uygulama sonlanır

Show Formu gösterir. Hide ile gizlenmiĢse, Visible özelliği True yapılır.

ShowDialog Formu iletiĢim kutusu olarak gösterir.

TABLO: Form Metotları

Örnek: Bir Windows formunun kapanmasını yönetmek için, o formun Closing olayına ve Close metoduna

ihtiyaç vardır. Kapanmasını yavaĢlatmak için bir Timer kontrolü kullanılır ve formun Ģeffaflığı yavaĢça

azaltılır.

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

50

Me.Text = "Hoşgeldiniz... " & TimeOfDay End Sub

Private Sub Form3_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) ' Kapanma olayı gerçekleşmeden önce iptal edilir e.Cancel = True Timer1.Start() End Sub Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) ' Shift+Ctrl+F3 tuşlarına basıldığında uygulama kapanır If e.Shift And e.Control And e.KeyCode = Keys.F3 Then Me.Close() End If End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick ' Form görünmez hale gelince uygulama kapanır If Me.Opacity = 0 Then Application.Exit() Else Me.Opacity -= 0.1 End If End Sub

1.22.2. Label

Label kontrolü form üzerinde kullanıcıya bilgi vermek amacıyla kullanılan etikettir.

Label Özellikleri

Özellik Değer Tipi Açıklama

TextAlign ContentAlignment Yazının etiket üzerindeki pozisyonu belirler.

BorderStyle BorderStyle Kontrolün kenar stilidir. FixedSingle değeri, kontrolün kenar çizgilerini

gösterir. Fixed3D değeri, kenarların üç boyutlu olmasını sağlar.

Image Drawing.Image Etiket üzerinde görüntülenmek istenen resmi tutar.

ImageAlign ContentAlignment Etiket üzerindeki resmin nerede duracağını belirler.

RightToLeft RightToLeft Etiket üzerindeki yazının yönünü belirler. Eğer Yes değerini alırsa, yazılar

sağdan sola gösterilir

TABLO: Label Özellikleri

Label1.BorderStyle = BorderStyle.Fixed3D ' Visual Studio klasörü altındaki simgeler kullanılabilir Label1.Image = Image.FromFile("C:\Flags\FLGTURK.ICO") Label1.ImageAlign = ContentAlignment.MiddleRight Label1.RightToLeft = RightToLeft.Yes Label1.Text = "Türkçe"

RESĠM: Label kontrolü örneği.

NOT Resmin bulunduğu yer kontrolün sağ tarafında bulunacak Ģekilde ayarlanmasına rağmen, sol tarafta

gözükür. Bu durum, RightToLeft özelliğinin Yes olarak atanmasından kaynaklanır

51

1.22.3. TextBox

Metin kutuları, kullanıcıdan bilgi almak için kullanılır.

TextBox Özellikleri

Özellik Değer Tipi Açıklama

MultiLine Boolean Metin kutusuna birden fazla satırda değer girilebilmesini sağlar. False

durumunda ise, metin kutusunun yüksekliği değiĢtirilemez

ScrollBars ScrollBars Metin kutusunda kaydırma çubuklarının görünmesini kontrol eder.

Varsayılan durumda kaydırma çubuğu görüntülenmez, ancak Horizontal,

Vertical kaydırma çubukları ya da ikisi birden gösterilebilir.

PasswordChar Char Metin kutusuna parola girilecekse, girilen karakterlerin hangi karakter

olarak görüneceğini belirler.

WordWrap Boolean Metin kutusuna girilen değerlerin, satır sonlandığında bir alt satıra

geçmesini belirtir. Eğer MultiLine özelliği False ise, alt satırlar tanımlı

olmayacağı için bu özelliğin bir etkisi görülmez.

MaxLength Integer Metin kutusunun alabileceği maksimum karakter sayısını belirtir.

ReadOnly Boolean Metin kutusunun yazmaya karĢı korumalı olduğunu belirtir.

CharacterCasing CharacterCasing Metin kutusuna karakterler girilirken büyük veya küçük harfe

çevrilmesini sağlar. Upper değeri büyük, Lower değeri küçük harfe

çevrimi sağlar.

TABLO: TextBox Özellikleri

TextBox Olayları

Olay Açıklama

TextChanged Metin kutusundaki yazı değiĢtiği zaman gerçekleĢir.

TABLO: TextBox Olayları

TextBox Metotları

Metot Açıklama

Cut Seçilen karakterleri siler, ancak hafızada tutar.

Copy Seçilen karakterleri kopyalar.

Paste Hafızaya alınan karakterleri metin kutusuna yapıĢtırır.

Clear Metin kutundaki yazıları temizler.

SelectAll Metin kutusundaki tüm yazıyı seçer.

TABLO: TextBox Metotları

Uygulama: Form üzerinde girilen değerlere göre tek sayıların hesaplanması ve gö rüntülenmesi iĢlemi için

TextBox kontrolünün birçok olayından ve özelliğinden yararlanılır.

RESĠM: TextBox kontrolü örneği.

52

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Form yüklenirken kontrollerin ayarlanması: txtAltSayi.MaxLength = 2 txtUstSayi.MaxLength = 4 txtSayilar.Multiline = True txtSayilar.ScrollBars = ScrollBars.Vertical txtClipBoard.ReadOnly = True txtClipBoard.Multiline = True End Sub ' Bu olay hem txtUstSayi hem de txtAltSayi kontrolünün ' TextChanged olayında gerçekleşir. ' Handles ifadesinden sonra kontroller virgülle ayrılmıştır Private Sub txtUstSayi_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtUstSayi.TextChanged TekSayiYazdir() End Sub Function Kontrol() As Boolean ' Metin kutularına sayı girildiyse If IsNumeric(txtUstSayi.Text) And IsNumeric(txtAltSayi.Text) Then ' ve alt limit 0'dan büyük, ve üst limitten küçükse Dim ust As Integer = txtUstSayi.Text Dim alt As Integer = txtAltSayi.Text If ust > alt And alt > 0 Then ' giriş doğru yapılmıştır Return True End If End If ' Kod buraya gelirse, giriş yanlış yapılmıştır Return False End Function Sub TekSayiYazdir() If Not Kontrol() Then Exit Sub txtSayilar.Clear() Dim alt As Integer = txtAltSayi.Text Dim ust As Integer = txtUstSayi.Text ' Sayılar metin kutusuna, tek sayıların yazdırılması For i As Integer = alt To ust If i Mod 2 = 1 Then txtSayilar.Text &= i & vbCrLf End If Next End Sub ' Sayıların txtClipboard isimli metin kutusuna kaydedilmesi: Private Sub btnKaydet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKaydet.Click txtClipBoard.Text = txtSayilar.Text ' Sayıların kopyalanması için, önce seçilmesi gerekir txtSayilar.SelectAll() txtSayilar.Cut() End Sub ' Cut yordamı çağrıldıktan sonra veriler kopyalanır. ' Paste ile bu kopyalanan veriler geri yazdırılır.

53

Private Sub btnYukle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnYukle.Click txtSayilar.Clear() txtSayilar.Paste() End Sub

1.22.4. Button

Windows uygulamalarında, form üzerinde komut düğmeleri olarak kullanılır.

Button Özellikleri

Özellik Değer Tipi Açıklama

DialogResult DialogResult Ait olduğu form ShowDialog metodu ile çağrıldığı zaman, dönüĢ değerini

belirler

FlatStyle FlatStyle Düğme tıklandığında ve düğmenin üzerine gelindiğinde görünen formatı

belirler

TABLO: Button Özellikleri

Button Olayları

Olay Açıklama

Click Düğme üzerine tıklandığı zaman gerçekleĢir

Örnek: Bir formun üzerindeki düğmelerin DialogResult özellikleri değiĢtirilerek, özel bir mesaj kutusu

tasarlanabilir.

RESĠM: Button kontrolü örneği.

Private Sub btnIslemYap_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIslemYap.Click Dim onay As New OnayFormu With onay.btnHayir .DialogResult = DialogResult.No .FlatStyle = FlatStyle.Flat End With With onay.btnEvet .DialogResult = DialogResult.Yes .FlatStyle = FlatStyle.Flat End With If onay.ShowDialog = DialogResult.Yes Then ' Kayıt işlemleri... End If End Sub

1.22.5. CheckBox

Kullanıcıya seçenekler sunup birden çok seçeneği aynı anda seçebilmesi için kullanılır.

54

CheckBox Özellikleri

Özellik Değer Tipi Açıklama

Checked Boolean Kontrolün seçili olup olmadığını belirler.

CheckAlign ContentAlignment Seçme kutusunun ve üzerinde yazan metnin birbirlerine göre konumlarını

belirler.

Appearance Appearance Kontrolün seçme kutusu ya da düğme Ģeklinde olmasını belirler.

ThreeState Boolean Seçili olup olmaması dıĢında, Intermediate durumu da eklenir. Eğer

kontrol Intermediate durumun- daysa Checked özelliği True olur.

AutoChecked Boolean Kontrolün tıklandığı zaman seçili duruma geçileceğini belirtir. Eğer bu

özellik False ise, kontrolün durumunu değiĢtirmek için, Click olayında,

Checked özelliğini güncellemek gerekir.

TABLO: CheckBox Özellikleri

CheckBox Olayları

Olay Açıklama

CheckChanged Seçme kutusunun durumu değiĢtiği zaman gerçekleĢir.

TABLO: CheckBox Olayları

Örnek: Bir GSM Ģebekesinden faturalı hat açılıĢında toplam tutar hesaplanırken, bazı seçenekler CheckBox

kontrolleri ile sunulabilir.

RESĠM: CheckBox kontrolü örneği.

' Form üzerindeki tüm seçme kutularının durumu değiştiği zaman, toplam fiyat tekrar hesaplanır Private Sub txtAcilisTutari_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtAcilisTutari.TextChanged, cbKDV.CheckedChanged, cbOzelIletisim.CheckedChanged, cbOzelIletisimIlkFatura.CheckedChanged Dim toplam As Double = txtAcilisTutari.Text ' İlk faturada 22 YTL açılış bedeli eklenir If cbOzelIletisimIlkFatura.Checked Then toplam += 22 End If ' KDV eklenir If cbKDV.Checked Then toplam *= 1.18 End If ' Özel İletişim vergisi eklenir If cbOzelIletisim.Checked Then toplam *= 1.25 End If txtToplam.Text = toplam End Sub

55

1.22.6. RadioButton

RadioButton kontrolleri, kullanıcıya sunulan seçeneklerden sadece bir tanesinin seçilmesine izin verir. Form

üzerinde birden fazla RadioButton konulduğunda, bu kontrollerin sadece bir tanesi seçili olabilir. Fakat bazı

durumlarda, farklı seçenek grupları kullanılarak kullanıcının birden fazla seçim yapması istenebilir. Bu

durumda, bazı seçenekler GroupBox kontrolü ile gruplanmalıdır.

Bu kontrolün özellikleri ve olayları CheckBox kontrolü ile aynıdır. Sadece bir seçenek iĢaretlenebildiği için,

kontrollerin yapılması CheckBox kontrolüne göre daha kolaydır.

1.22.7. GroupBox

Bu kontrol, kontrollerin mantıksal bir düzende gruplanması için kullanılır. Ġçinde bulunan kontrollerin

iĢleyiĢlerinde bir farklılık görünmez. Bir grup RadioButton kontrolünün, diğer RadioButton kontrollerinden

etkilenmemesi için kullanılır.

1.22.8. ListBox

Kullanıcıya sunulan seçeneklerin bir liste halinde görünmesini sağlar. Liste kutusundan istenen sayıda öğe

seçilebilir.

ListBox Özellikleri

Özellik Değer Tipi Açıklama

Items ListBox.ObjectCollection Liste kutusuna eklenen öğelerin tutulduğu koleksiyon

nesnesidir.

Selectedltem Object Liste kutusundan seçilen öğeyi alır.

Selectedltems SelectedObjectCollection Liste kutusundan seçilen öğeleri alır. Seçilen öğeler dinamik

bir dizide tutulur.

SelectedIndex Integer Liste kutusundan seçilen öğenin indisini alır.

Selectedlndices SelectedIndexCollection Liste kutusundan seçilen öğelerin indislerini bir koleksiyon

nesnesinde tutar.

DataSource Object Listenin öğelerinin tutulduğu veri kaynağıdır. Veri kaynağı

boĢ geçilirse Items koleksiyonuna eklenen öğeler görüntülenir.

TABLO: ListBox Özellikleri

TABLO: ListBox Özellikleri

Özellik Değer Tipi Açıklama

DisplayMember String Veri kaynağından gelen öğelerin, kullanıcıya gösterilecek özelliğidir.

ValueMember String Veri kaynağından gelen öğelerin, dönüĢ değerini belirleyen özelliğidir.

SelectedValue Object Seçilen öğenin, liste kutusunun ValueMember

ile belirtilen özelliğidir.

SelectionMode SelectionMode Liste kutusundan kaç tane öğe seçilebileceğini belirtir. None değeri 0, One

değeri 1, MultiSimple ve MultiExtended değerleri birden fazla öğenin

seçilebileceğini belirtir.

MultiColumn Boolean Liste kutusundaki öğelerin biden fazla kolonda görüntülenmesini belirler.

ListBox Olayları

Olay Açıklama

SelectedIndexChanged Liste kutusunda bir öğe seçildiği zaman gerçekleĢir.

TABLO: ListBox Olayları

56

ListBox Metotları

Metot Açıklama

GetItemText Parametre olarak verilen nesnenin liste kutusunda gösterilen yazısını döndürür.

GetSelected Parametre olarak verilen indisteki öğenin seçili olup olmadığını döndürür.

FindString Parametredeki String ifadesini liste kutusunda arayarak, bul- duğu ilk öğenin indisini

döndürür

TABLO 9.14: ListBox Metotları

RESĠM 9.6: ListBox kontrolü örneği.

1.22.9. ComboBox

Liste kutusu ile aynı özelliklere sahiptir, ancak listelenen öğeler açılan bir kutuda görüntülenir ve listeden en

fazla bir tane öğe seçilebilir. Liste kutusuna göre bir baĢka farklılığı ise, isteğe bağlı olarak, kullanıcının açılan

kutu üzerinde değer girebilmesidir. Dolayısıyla bir TextBox kontrolü gibi de davranabilir.

ComboBox Özellikleri

Özellik Değer Tipi Açıklama

DropDownStyle ComboBoxStyle Kontrolün listeleme stilini belirler. Simple stili, listedeki sadece bir

öğeyi görüntüler. DropDown stili, listenin tüm elemanlarını

görüntüleyerek seçilmelerini ve kullanıcının değer girmesini sağar.

DropDownList kullanıcının değer girmesini engeller.

DropDownWidth Integer ComboBox kontrolünün açılan listesinin geniĢliğini belirler.

MaxDropDownItems Integer Kontrole eklenebilecek maksimum öğe sayısını belirler.

MaxLength Integer Kullanıcının girebileceği maksimum karakter sayısını belirler.

SelectedText String Seçilen öğenin görüntülenen yazısını belirler.

TABLO 9.17: ComboBox Özellikleri

Örnek: Tarih ve sayı formatlarını, kullanıcının seçimine bırakarak bir sayı veya tarih yazdırma iĢlemi

ComboBox kontrolleri ile yapılabilir.

RESĠM: ComboBox kontrolü örneği.

ComboBox kontrollerinin özelliklerinin ayarlanması ve format tiplerine öğe eklenmesi.

57

Private Sub Form1_Load_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load cmbFormat.DropDownStyle = ComboBoxStyle.DropDownList cmbFormatString.DropDownStyle = ComboBoxStyle.DropDownList cmbFormat.Items.Add("Tarih Formatı") cmbFormat.Items.Add("Sayı Formatı") End Sub

Tarih ya da sayı formatlarından biri seçildiği zaman, ikinci ComboBox kontrolüne değiĢik format

seçenekleri eklenir.

Private Sub cmbFormat_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbFormat.SelectedIndexChanged() cmbFormatString.Items.Clear() Select Case cmbFormat.SelectedIndex Case 0 cmbFormatString.Items.Add("dd - MM - yyyy") cmbFormatString.Items.Add("yyyy*MM*dd hh:mm") cmbFormatString.Items.Add("dddd dd.MM.yy.hh:mm:ss") Case 1 cmbFormatString.Items.Add("C") cmbFormatString.Items.Add("P") cmbFormatString.Items.Add("N") End Select End Sub

Format seçildikten sonra metin kutusuna girilen değer alınır ve ilgili formatta gösterilir.

Private Sub btnGoster_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGoster.Click Select Case cmbFormat.SelectedIndex Case 0 Dim d As Date = txtYazi.Text lblSonuc.Text = d.ToString(cmbFormatString.Text) Case 1 Dim i As Integer = txtYazi.Text lblSonuc.Text = i.ToString(cmbFormatString.Text) End Select End Sub

1.22.10. NumericUpDown

Bu kontrol kullanıcının, sayısal bir değeri girmesini veya yukarı aĢağı okları ile seçmesini sağlar.

NumericUpDown Özellikleri

Özellik Değer Tipi Açıklama

HexaDecimal Boolean Sayıların onaltılık tabanda görüntülenmesini belirler.

Increment Decimal AĢağı yukarı oklar kullanıldığında, sayıların artma ve azalma adımlarını

belirler.

Maximum Decimal Kontrolde gösterilen sayıların alabileceği maksimum değeri belirler.

Minimum Decimal Kontrolde gösterilen sayıların alabileceği minimum değeri belirler.

ThousandSeparators Boolean Sayıların basamak ayracının gösterilmesini belirler.

Value Decimal Kontrolün gösterdiği sayı değerini belirler.

ReadOnly Boolean True değerini alırsa kullanıcının giriĢ yapmasını engeller.

TABLO 9.18: NumericUpDown Özellikleri

58

NumericUpDown Olayları

Olay Açıklama

ValueChanged Kontrolün sayı değeri değiĢtiği zaman gerçekleĢir

TABLO 9.19: NumericUpDown Olayları

NumericUpDown Metotları

Metot Açıklama

DownButton AĢağı düğmesine basar ve sayı değerini düĢürür.

UpButton Yukarı düğmesine basar ve sayı değerini artırır.

TABLO 9.20: NumericUpDown Metotları

Örnek: Alarm kurarken, tarih ve zaman değerlerinin ayarlanması NumericUpDown kontrolü ile yapılabilir.

RESĠM: NumericUpDown kontrolü örneği.

Tarih ve zaman değerlerinin alabileceği maksimum ve minimum değerler ayarlanır.

Private Sub Form1_Load(ByVal …) Handles MyBase.Load nYil.Minimum = 1 nAy.Minimum = 1 nGun.Minimum = 1 nYil.Maximum = 2099 nAy.Maximum = 12 nGun.Maximum = 31 nSaat.Minimum = 0 nDakika.Minimum = 0 nSaat.Maximum = 23 nDakika.Maximum = 59 nYil.Value = Now.Year nAy.Value = Now.Month nGun.Value = Now.Day nSaat.Value = Now.Hour nDakika.Value = Now.Minute End Sub

Bu değerlerden herhangi biri değiĢtiği zaman, doğru tarih ve zaman değerinin girilmesi kontrol edilir.

Private Sub nGun_ValueChanged(ByVal …) Handles nGun.ValueChanged, nAy.ValueChanged, nYil.ValueChanged, nSaat.ValueChanged, nDakika.ValueChanged Dim tarih As String tarih = nGun.Value & "." & nAy.Value & "." & nYil.Value If Not IsDate(tarih) Then MsgBox(tarih) End If Dim zaman As String zaman = nSaat.Value & ":" & nDakika.Value If Not IsDate(zaman) Then MsgBox(zaman) End If End Sub

59

1.22.11. TabControl

TabControl nesnesi, içinde sekme sayfaları tutan yapıdır. Bu sayfalar, TabPage nesneleri olarak oluĢturulup

yapılandırıldıktan sonra TabControl nesnesinin TabPages koleksiyonuna eklenir. Ekleme iĢlemi, Properties

paneli ile tasarım anında da yapılabilir.

TabControl Özellikleri

Özellik Değer Tipi Açıklama

HotTrack Boolean Fare ile sekme sayfalarının üzerine gelindiğinde, isimlerinin görsel

olarak değiĢmesini belirler.

ItemSize Size Sekme sayfalarının büyüklüğünü belirler.

Multiline True Eklenen sekmelerin birden fazla satırda üst üste gözükmesini belirler.

ShowToolTips Boolean Fare sekme sayfalarının üzerindeyken bilgi mesajının gösterilmesini

belirler.

SelectedTab TabPage Seçilen sekme sayfasını belirler.

SelectedIndex Integer Seçilen sekme sayfasının indisini belirler.

TabCount Integer Sekme sayısını belirler.

TabPages TabPageCollection Kontrolün içinde bulunduğu sekme sayfalarının koleksiyonudur.

TABLO: TabControl Özellikleri

TabControl nesnesine TabPage sayfaları eklemek için tasarım anında

Tab- Page Collection Editor penceresinden yararlanılabilir.

RESĠM: TabPage Collection Editor penceresi.

TabPage Özellikleri

Sekme sayfaları, normal form tasarımları gibi kontroller eklenerek yapılır. TabPage kontrolü Panel

kontrolünden türetilir ve Panel kontrolünün tüm özelliklerini alır.

Özellik Değer Tipi Açıklama

ToolTipText String Bu özelliğin değeri, fare sayfanın üzerindeyken,

bilgi mesajı olarak gösterilir. Ait olduğu

TabControl nesnesinin ShowToolTip özelliği

True olmalıdır.

TABLO: TabPage Özellikleri

Örnek: Bir kullanıcı kaydının tek bir formda görüntülenmesi isteniyorsa, bu form TabControl ile küçük

sayfalara bölünebilir.

RESĠM: TabControl örneği

RESĠM 9.13: TabPage eklemek.

60

1.22.12. DateTimePicker

Bir açılan kutudan zaman değeri seçmeyi sağlar. Seçilen değer Date tipinde olur.

DateTimePicker Özellikleri

Özellik Değer Tipi Açıklama

CalendarTrailing

ForeColor

Color Bir önceki ve bir sonraki ayın gün lerinin görüntülenme rengidir.

CalendarTitle ForeColor Color Takvim baĢlığının ön plan rengidir.

CalendarTitle

BackColor

Color Takvim baĢlığının arka plan rengidir.

CalendarMonth

Background

Color Takvim arka plan rengidir.

CalendarForeColor Color Takvimdeki yazıların ön plan rengidir.

CalendarFont Font Takvimin gösterileceği yazı tipi ayarlarıdır.

ShowCheckBox Boolean Tarih değerinin yanında seçme kutusunun gösterilmesi.

Checked Boolean Seçme kutusu görüntülendiği zaman, tarihin seçili olup olmadığını

gösterir

Format DateTime

PickerFormat

Kontrolün görüntüleneceği formatı belirler. Long, Short değerleri

uzun ve kısa tarih formatını, Time sadece zamanı gösterir. Custom

değeri, CustomFormat özelliğine girilen formatta gösterileceğini

belirler.

CustomFormat String Tarihin hangi formatta gösterileceğini belirler.

Value Date Seçilen tarih değerini belirler.

MaxDate Date Kontrolün alabileceği maksimum tarih değeridir.

MinDate Date Kontrolün alabileceği minimum tarih değeridir.

ShowUpDown Boolean Kontrolün formunu açılan kutu ya da yukarı aĢağı okları

formatında gösterir. Bu özellik True olduğunda, kontrolün formatı,

NumericUpDown kontrolünün

TABLO: DateTimePicker Özellikleri

Örnek: Veritabanından bir kaydın belli tarih aralıkları ile sorgulanması sırasında, kullanıcının baĢlangıç ve bitiĢ

tarihlerini seçmesi için bu kontrol kullanılabilir.

RESĠM: DateTimePicker kontrolü örneği.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load TarihAyarla(dtBaslangic) TarihAyarla(dtBitis) End Sub ' Tarih kontrollerinin ayarlanması Sub TarihAyarla(ByVal dtTarih As DateTimePicker) dtTarih.Format = DateTimePickerFormat.Custom dtTarih.CustomFormat = "dd - MM - yyyy" dtTarih.MaxDate = Now.AddYears(2) dtTarih.MinDate = Now.AddYears(-2) End Sub ' Gerekli kontroller yapıldıktan sonra

61

' Sql cümlesi seçilen tarihlere göre oluşturulur Private Sub btnAra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAra.Click Dim basTarih, sonTarih As Date basTarih = dtBaslangic.Value sonTarih = dtBitis.Value If Date.Compare(basTarih, sonTarih) = 1 Then Exit Sub Dim Sql As String Sql = "Select * From Siparisler Where SiparisTarih Between " Sql &= basTarih & " And " & sonTarih ' Sql komutunu çalıştır End Sub

1.22.13. MonthCalendar

DateTimePicker kontrolünün açılan takvimi biçimindedir. Bu kontrol kullanıcıya, tarih alanları üzerinde daha

esnek çalıĢma olanağı sağlar.

MonthCalendar Özellikleri

DateTimePicker kontrolünün birçok özelliğini almasına rağmen, bazı özelliklerinde değiĢiklikler görülür.

Örneğin Value özelliği bu kontrolde yoktur. Bu kontrolden seçilen değerler, bir tarih aralığıdır. Dolayısıyla tek

bir Date tipini tutan bir özellik yoktur.

Özellik Değer Tipi Açıklama

MaxSelect ionCount Integer Bir seferde maksimum kaç gün seçileceğini belirler.

SelectionRange SelectionRange BaĢlangıç ve bitiĢ tarihlerinden oluĢan bir seçim aralığı nesnesidir.

SelectionBegin Date Seçilen tarih aralığının hangi tarihten itibaren baĢladığını belirler.

SelectionEnd Date Seçilen tarih aralığının hangi tarihte bittiğini belirler.

ScrollChange Integer Ġleri geri düğmeleri tıklandığı zaman kaç ay atlanacağını belirler.

MonthlyBoldedDates Date() Takvimde hangi günlerin kalın yazı tipinde gösterileceğini belirler.

ĠĢaretlenen günler, her ay için kalın gösterilir.

ShowToday Boolean Takvimin alt kısmında, sistem takvi-mine göre hangi günde olduğunu

gösterir.

ShowTodayCircle Boolean Takvimde, o günün seçili olmasını belirler.

ShowWeekNumbers Boolean Takvimin sol tarafında, yılın hafta numaralarını gösterir.

TABLO: MonthCalendar Özellikleri

MonthCalendar Olayları

Olay Açıklama

DateChanged Seçilen tarihten farklı bir tarih seçildiğinde gerçekleĢir.

DateSelected Yeni bir tarih seçildiği zaman gerçekleĢir. DateChanged olayı gerçekleĢtikten hemen sonra bu

olay gerçekleĢir.

TABLO: MonthCalendar Olayları

Örnek: Yapılacak görevlerin tutulduğu bir Windows uygulamasında, görevin baĢlangıç ve bitiĢ tarihleri tek bir

MonthCalendar kontrolünden kolaylıkla seçilebilir.

RESĠM: MonthCalendar kontrolü örneği.

62

Görevlerin tanımlanması için bir Gorev sınıfı oluĢturulur.

Public Class Gorev Public GorevIsmi As String Public BaslangicTarihi As Date Public BitisTarihi As Date ' Liste kontrollerinde görevin isminin görüntülenmesi ' için, ToString metodunu tekrar yazmak gerekir. Public Overrides Function ToString() As String Return GorevIsmi End Function Public Sub New(ByVal Isim As String, ByVal basTarihi As Date, ByVal bitTarihi As Date) Me.GorevIsmi = Isim Me.BaslangicTarihi = basTarihi Me.BitisTarihi = bitTarihi End Sub End Class

Görevler ekleneceği zaman, yeni bir Gorev nesnesi oluĢturulur ve görevin baĢlangıç-bitiĢ tarihleri

ayarlanır.

Private Sub Form1_Load(ByVal …) Handles MyBase.Load ' Maksimum iki hafta seçilsin MonthCalendar1.MaxSelectionCount = 14 End Sub Private Sub btnEkle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEkle.Click Dim baslangicTarihi As Date = MonthCalendar1.SelectionStart Dim bitisTarihi As Date = MonthCalendar1.SelectionEnd Dim gorevIsmi As String = txtYeniGorev.Text Dim yeniGorev As New Gorev(gorevIsmi, baslangicTarihi, bitisTarihi) ListBox1.Items.Add(yeniGorev) End Sub Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged() Dim secilen As Gorev secilen = ListBox1.SelectedItem MonthCalendar1.SelectionStart = secilen.BaslangicTarihi MonthCalendar1.SelectionEnd = secilen.BitisTarihi txtYeniGorev.Text = secilen.GorevIsmi End Sub

1.22.14. Timer

Zaman değeri ayarlanabilen sayaçtır. Interval özelliği ile, kaç milisaniyede bir çalıĢacağı belirlenir. Windows

uygulamalarında sayaç görevini görür.

Timer Özellikleri

Özellik Değer Tipi Açıklama

Enabled Boolean Kontrolün aktif olup olmadığını belirler.

Interval Integer Sayacın hangi zaman aralığında bir çalıĢması rektiğini belirler. Milisaniye cinsindedir.

TABLO: Timer Özellikleri

63

Timer Olayları

Olay Açıklama

Tick Interval özelliğinde belirtilen zaman değeri geçtiğinde gerçekleĢir.

TABLO: Timer Olayları

Timer Metotları

Metot Açıklama

Start Sayacı baĢlatır

Stop Sayacı durdurur

TABLO: Timer Metotları

1.22.15. ProgressBar

ProgressBar, belli bir andaki değerin, alabileceği değer aralığına göre yüzdesini gösterir. Yapılan bir iĢlemin

ilerleyiĢini göstermesi açısından oldukça kullanıĢlı bir kontroldür.

ProgressBar Özellikleri

Özellik Değer Tipi Açıklama

Minimum Integer Kontrolün alabileceği minimum değeri belirler.

Maximum Integer Kontrolün alabileceği minimum değeri belirler.

Value Integer Kontrolün verilen değer aralığındaki pozisyonunu belirler.

TABLO: ProgressBar Özellikleri

Örnek: ProgressBar bir sayım iĢleminde kalan durumu göstermek için kullanılabilir.

ProgressBar ile durumun gösterileceği ayrı bir form eklenir. Burada sayma iĢleminin hızı için bir Timer

bulunur. Sayaç her iĢlediğinde yeni değer ProgressBar kontrolünde gösterilir.

Dim kalan As Integer Private Sub Durum_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load kalan = ProgressBarl.Maximum Timerl.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timerl.Tick If kalan = 0 Then Timerl.Stop() Me.Close() End If Dim aralik As Integer aralik = ProgressBarl.Maximum - ProgressBarl.Minimum 'Kalan sayım işleminin yüzdesi hesaplanır Dim oran As Integer = (aralik - kalan) / aralik * 100 Labell.Text = oran & "% tamamlandı" ProgressBarl.Value = ProgressBarl.Maximum - kalan kalan -= 1 End Sub

64

RESĠM: ProgressBar kontrolü örneği.

OluĢturulan bu form, baĢlangıç formundan çağırılarak durum gösterilir.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load CheckBox1.Checked = True End Sub Private Sub btnBaslat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBaslat.Click Dim frmDurum As New Durum frmDurum.Timer1.Interval = TextBox1.Text If CheckBox1.Checked Then frmDurum.ShowDialog() End If End Sub

1.22.16. ErrorProvider

Form üzerindeki kontrollerin yanında hata mesajları gösterilmesini sağlar.

ErrorProvider Özellikleri

Özellik Değer Tipi Açıklama

BlinkRate Integer Hata simgesinin kaç milisaniyede bir yanıp söneceğini belirler.

BlinkStyle ErrorBlinkSytle Hata simgesinin yanıp sönme stilini belirler.

Icon Icon Hata mesajlarının gösterilmesi sırasında çıkan simgeyi belirler.

TABLO : ErrorProvider Özellikleri

ErrorProvider Metotları

Metot Açıklama

SetError Kontrollerin hata mesajlarının belirlenmesi için kullanılır.

TABLO: ErrorProvider Metotları

ErrorProvider kontrolü forma eklendiği zaman, Properties panelinde, kontrollerin ekstra özellikleri görünür. Bu

özellikler, forma eklenen her ErrorProvider için oluĢturulur.

Özellik Açıklama

IconAlignment On ErrorProviderlsmi Hata simgesinin, kontrolün üzerinde nerde bulunacağını belirler.

IconPadding On ErrorProviderIsmi Hata simgesinin, kontrolden kaç piksel uzakta duracağını belirler.

Error On ErrorProviderIsmi Varsayılan hata mesajını belirler

TABLO: ErrorProvider Ekstra Özellikleri

65

Örnek: Kayıt iĢlemlerinin yapıldığı sırada, isim soyadı ve TC kimlik numaralarının giriĢleri ErrorProvider

kontrolü ile denetlenebilir.

RESĠM: ErrorProvider kontrolü örneği.

Metin kutularının Validating olayında, girilen verilerin kontrolleri yapılır ve gerektiği durumlarda

ErrorProvider ile hata mesajları gösterilir.

Private Sub txtIsim_Validating(ByVal …) Handles txtIsim.Validating If txtIsim.Text = "" Then ErrorProvider1.SetError(txtIsim, "İsim alanı boş girilemez") ' Bu komut olayın gerçekleşmesini engeller ' Dolayısıyla veri girilmeden bu alandan çıkılamaz e.Cancel = True Else ' Eğer beri doğru girilmişse, Error simgesini ' gizlemek için, hata mesajı boş girilir ErrorProvider1.SetError(txtIsim, "") End If End Sub Private Sub txtSoyad_Validating(ByVal …) Handles txtSoyad.Validating If txtSoyad.Text = "" Then ErrorProvider1.SetError(txtSoyad, "Soyad alanı boş girilemez") e.Cancel = True Else ErrorProvider1.SetError(txtSoyad, "") End If End Sub Private Sub txtTCKimlik_Validating(ByVal …) Handles txtTCKimlik.Validating If Not IsNumeric(txtTCKimlik.Text) Then ErrorProvider1.SetError(txtTCKimlik, "Kimlik numarası yanlış girildi") e.Cancel = True Else ErrorProvider1.SetError(txtTCKimlik, "") End If End Sub

1.22.17. PictureBox

Form üzerinde bir resim görüntülemek için kullanılır.

PictureBox Özellikleri

Özellik Değer Tipi Açıklama

Image Image Kontrolün resim kaynağını belirler.

SizeMode PictureBoxSizeMode Kontrolün, resmi nasıl görüntüleye ceğini belirler.

TABLO: PictureBox Özellikleri

66

Örnek: Form üzerinde bir resmin değiĢik boyutlarda gösterilmesi için PictureBox kontrolü tercih edilir.

RESĠM: PictureBox kontrolü örneği.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ComboBox1.Items.Add("Normal") ComboBox1.Items.Add("Ortala") ComboBox1.Items.Add("Sığdır") ComboBox1.Items.Add("Otomatik Boyutlandır") End Sub ' ComboBox kontrolünden resmin görüntülenme modu seçilir Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Select Case ComboBox1.SelectedIndex Case 0 PictureBox1.SizeMode = PictureBoxSizeMode.Normal Case 1 PictureBox1.SizeMode = PictureBoxSizeMode.CenterImage Case 2 PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage Case 3 PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize End Select End Sub Private Sub btnGoster_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGoster.Click PictureBox1.Image = Image.FromFile(txtResimYeri.Text) End Sub

1.22.18. ImageList

ImageList kontrolü, form kontrolleri ve içinde bulunan öğeleri için arka plan resmi sağlayan bir listesi görevini

görür.

ImageList Özellikleri

Özellik Değer Tipi Açıklama

Images ImageCollection Kontrolün içinde bulunan resimlerin listelendiği dinamik bir koleksiyondur. Bu

özellik bir koleksiyon olduğu için, diğer liste kontrollerinin öğelerinin resmini

belirleme iĢlemi büyük ölçüde kolaylaĢır.

ImageSize Size Kontrolün tuttuğu resimlerin büyüklüğünü belirler

TransparentColor Color Listedeki resimlerin bu özellikte belirtilen renkteki bölgeleri saydam olur.

TABLO: ImageList Özellikleri

67

Windows uygulamalarında ImageList kontrolünün kullanımı, diğer kontrollerin ImageList özelliği olarak

belirlendikten sonra gerçekleĢir. Bu kontrollerin listelediği öğelerin arka plan resimleri ImageList kontrolü ile

belirlenir.

Örnek: ImageList kontrolünde tutulan resimler bir sayı oyununda rasgele resim göstermek için kullanılabilir.

RESĠM 9.20: ImageList kontrolü örneği.

Private Sub btnYerlestir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnYerlestir.Click Dim max As Integer = ImageList1.Images.Count - 1 Randomize() PictureBox1.Image = ImageList1.Images(Rnd() * max) PictureBox2.Image = ImageList1.Images(Rnd() * max) PictureBox3.Image = ImageList1.Images(Rnd() * max) PictureBox4.Image = ImageList1.Images(Rnd() * max) End Sub

1.22.19. ListView

Kullanıcıya değiĢik listeleme seçenekleri sunan bir kontroldür. Ġçinde bulunan öğeler, tek bir nesne olarak veya

detayları ile gösterilebilir. Dolayısıyla öğeler ListViewItem nesnesi, detayları ise ListViewSubItem nesnesi

olarak tanımlanır.

ListView Özellikleri

TABLO 9.47: ListView Özellikleri

Özellik Değer Tipi Açıklama

View View Listenin görünümünü belirler. LargeIcons değeri listedeki öğelerin büyük

resimle, SmallIcons küçük resimle görünmesini sağlar. List değeri,

öğelerin küçük resimle, fakat alt alta görünmesini sağlar. Details değeri,

alt öğelerin kolonlar altında görüntülendiği detay görünümü sağlar.

AllowColumn

Reorder

Boolean Detay görünümünde, kolonların kullanıcı tarafından düzenlenebilmesini

belirler.

Activation ItemActivation Öğelerin ne zaman etkinleĢtirileceğini belirler. OneClick değeri, öğenin

tek tıklamayla, Standard değeri, öğenin çift tıklamayla aktif hale

geleceğini belirler. TwoClick değeri seçiliyken, ilk tıklandığında öğe

seçilir, daha sonra ikinci defa tıklandığında ise öğe aktif hale gelir.

CheckBoxes Boolean Öğelerin yanında seçme kutularının bulunmasını belirler.

Columns ColumnHeader

Collection

Detay görünümündeyken, öğelerin alt öğelerinin gösterileceği kolonları

tutan koleksiyondur.

FullRowSelect Boolean Detay görünümde, öğenin tüm detay satırının seçilmesini belirler.

GridLines Boolean Kolonlar ve satırlar arasında ayırıcı çizgilerin gözükmesini belirler.

LabelEdit Boolean ÇalıĢma anında, kullanıcın, liste öğelerinin yazısını değiĢtirmesini

belirler. Bu özelliğin kullanılması için, Activation özelliğinin Standard

olması gerekir.

68

ListView Olayları

Olay Açıklama

AfterLabelEdit Öğenin yazısı değiĢtikten sonra gerçekleĢir

BeforeLabelEdit Öğenin yazısı değiĢmeden önce gerçekleĢir

TABLO: ListView Olayları

Örnek: Windows Explorer ile dosya görünümleri, ListView ile gerçekleĢtirilir.

RESĠM: ListView kontrolü örneği.

Form yüklenirken ListView kontrolüne kolon ve öğeler eklenir. Ayrıca ComboBox kontrolüne görünüm

seçenekleri eklenir.

Private Sub Form1_Load(ByVal …) Handles MyBase.Load ComboBox1.Items.Add("Detay") ComboBox1.Items.Add("Büyük Simgeler") ComboBox1.Items.Add("Küçük Simgeler") ComboBox1.Items.Add("Liste") ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList ListView1.Columns.Add("Adı", 100, HorizontalAlignment.Left) ListView1.Columns.Add("Boyut", 50, HorizontalAlignment.Left) ListView1.Columns.Add("Tür", 170, HorizontalAlignment.Left) ListView1.View = View.Details Dim oge As New ListViewItem("bin") oge.SubItems.Add("") oge.SubItems.Add("Dosya Klasörü") oge.ImageIndex = 0 ListView1.Items.Add(oge) oge = New ListViewItem("Form1.vb") oge.SubItems.Add("11 KB") oge.SubItems.Add("Visual Basic Source") oge.ImageIndex = 2 ListView1.Items.Add(oge) oge = New ListViewItem("WindowsApplication1.sln") oge.SubItems.Add("1 KB") oge.SubItems.Add("Microsoft Visual Studio Solution Object") oge.ImageIndex = 1 ListView1.Items.Add(oge)

69

ComboBox kontrolünde seçilen değer değiĢtiği zaman, ListView görünümü değiĢir.

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged Select Case ComboBox1.SelectedIndex Case 0 ListView1.View = View.Details Case 1 ListView1.View = View.LargeIcon Case 2 ListView1.View = View.SmallIcon Case 3 ListView1.View = View.List End Select End Sub

1.22.20. Dinamik Kontroller

Kontroller tasarım anında eklenip ayarlanabildiği gibi, çalıĢma anında da oluĢturulup forma eklenebilir.

Kontrollerin, Properties panelinde gözüken tüm özelliklerine kod tarafından ulaĢılabildiği için, çalıĢma anında

önceden oluĢturulmuĢ bir kontrolün özelliği değiĢtirilebilir. Bununla birlikte, yeni bir form oluĢturup gösterme

iĢlemi gibi, çalıĢma anında yeni bir kontrol oluĢturulup özellikleri atanarak form üzerinde gösterilebilir.

Yeni eklenen kontrollerin olaylarına eriĢmek için AddHandler anahtar kelimesi kullanılır. Kontrolün olayı

gerçekleĢtiği zaman çalıĢtırılacak kodlar ise AddressOf anahtar kelimesi ile belirtilmelidir.

AddHandler b.Click, AddressOf ButonaBasildi Bu Ģekilde tanımlanan yordamların, kontrolün olay tanımlayıcısı ile aynı parametrelere sahip olmalıdır.

Private Sub ButonaBasildi(ByVal sender As System.Object, ByVal e As System.EventArgs)

… End Sub Örnek: Form üzerinde sürekli düğme eklenen ve düğmelerin tıklandıklarında yok edildiği bir oyunun yazılması

için, bu düğmelerin dinamik bir Ģekilde oluĢturulması gerekir.

RESĠM: Dinamik kontrol örneği.

Form üzerindeki bir Timer kontrolü, iki saniyede bir düğme oluĢturup forma ekler.

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick ' Yeni bir düğme oluşturulur. Dim b As New Button b.Height = 30

70

b.Width = 30 b.Text = "X" Dim maxLocation_Y, maxLocation_X As Integer ' Yeni düğmenin yeri form dışında bir yerde olamaz maxLocation_X = Me.Width - b.Width maxLocation_Y = Me.Height - b.Height Randomize() ' Düğmenin bulunacağı yer rasgele ayarlanır. b.Location = New Point(Rnd() * maxLocation_X, Rnd() * maxLocation_Y) AddHandler b.Click, AddressOf ButonaBasildi ' Oluşturulan kontrol, Formun kontroller ' listesine eklenmelidir. Me.Controls.Add(b) End Sub

OluĢturulan kontroller tıklandığı zaman çalıĢtırılacak yordam yazılır.

Private Sub ButonaBasildi(ByVal sender As System.Object, ByVal e As System.EventArgs) ' Kontrolün, üzerine basıldığı zaman yok edilmesi sender.Dispose() End Sub

Form yüklendiği zaman Timer nesnesi çalıĢmaya baĢlar.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Timer1.Interval = 500 Timer1.Start() End Sub

1.22.21. UYGULAMA: Hesap Makinesi

Bu uygulamada, bir hesap makinesinde kullanılan genel fonksiyonlar gerçekleĢtirilecektir.

Kullanılan kontroller ve teknikler:

Button. Hesap makinesindeki her iĢlem ve sayı için bir düğme kullanılır.

Try Catch Finally. Hesaplamalar yapılırken, kullanıcın yanlıĢ bir değer girmesi durumunda çıkacak

hataları yakalamak için kullanılır.

RESĠM: Hesap makinesi.

Kodların Yazılması

ĠĢlemin türünü ve seçildiğini belirleyen, girilen bir önceki sayıyı tutan global değiĢkenleri yazın.

71

Private IslemSecildi As Boolean = False Private Sayi As Double Private Islem As String

Sayı düğmelerinden herhangi biri tıklandığı zaman, metin kutusunun görünümünü değiĢtiren iĢlemi

yazın.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button0.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click If Not IslemSecildi Then txtSayi.Text &= sender.Text Else txtSayi.Text = sender.Text IslemSecildi = False End If End Sub

ĠĢlem seçildiği zaman, bir önceki girilen sayıyı tutan kodları yazın.

Private Sub btnCarp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarp.Click, btnBol.Click, btnCikar.Click, btnTopla.Click Islem = sender.Text Try Sayi = txtSayi.Text IslemSecildi = True Catch ex As Exception MsgBox("Sayı düzgün formatta girilmedi") Finally txtSayi.Text = "" txtSayi.Focus() End Try End Sub

EĢittir düğmesi tıklandığı zaman aritmetik operasyonu yapan kodları yazın.

Private Sub btnEsit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEsit.Click Select Case Islem Case "*" Sayi *= txtSayi.Text Case "/" Sayi /= txtSayi.Text Case "-" Sayi -= txtSayi.Text Case "+" Sayi += txtSayi.Text End Select txtSayi.Text = Sayi End Sub

C (temizle) düğmesi tıklandığı zaman, metin kutusunu temizleyen ve global değiĢkenleri baĢlangıç

değerlerine getiren kodları yazın.

72

Private Sub btnTemizle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTemizle.Click Sayi = 0 IslemSecildi = False txtSayi.Text = "" txtSayi.Focus() End Sub

1.23. Menü Tasarımı ve MDI Formlar

1.23.1. Menü Tasarımı

Windows uygulamalarında en çok kullanılan tasarım araçları menülerdir. Dosya, Düzen, Görünüm gibi menüler

neredeyse tüm Windows uygulamalarında, belli baĢlı iĢlerin yapılmasında kullanıcıya kolay eriĢim sağlar.

Uygulamalarda, menülerde tanımlanan iĢlemlere görsel kısayollar sunulur. Bu iĢlem araç kutuları ile sağlanır.

Windows uygulamalarında kullanılan iki tip menü vardır. MenuStrip, formların baĢında duran sabit

menüdür. ContextMenuStrip, fare ile sağ tıklandığında çıkan menüdür.

1.23.2. MenuStrip

Windows uygulamasına bir menü eklemek için, Toolbox panelinden bir MenuStrip kontrolünü forma

sürükleyin. Eklenen menü bir bileĢen olarak formun alt bölümünde gözükecektir. Ancak üstüne gelindiğinde

formun baĢlığının hemen altında belirir. Menü öğesi eklemek veya ismini değiĢtirmek için üstüne gelinir ve

baĢlık yazısı yazılır. Properties panelinde bu menünün ToolStripMenuItem olarak eklendiği görülür.

RESĠM: MenuItem.

Menüye MenuItem eklendiğinde hemen altında ve yanında, menü eklemek için bir yer açılır. Bu açılan yere de

menü ismi girilip, alt menü öğeleri oluĢturulabilir.

Menü öğeleri tıklandığı zaman bir iĢlemin gerçekleĢmesi için, kontrol çift tıklanarak bu öğenin Click olayına

geçilir. ÇalıĢtırılmak istenen kodlar buraya yazılır.

Private Sub YeniToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles YeniToolStripMenuItem.Click End Sub

Menü öğelerine isim verirken & iĢareti kullanılarak, kullanıcın klavyenin alt tuĢuyla bu öğeyi çalıĢtırması

sağlanabilir. & iĢareti hangi karakter ile kullanılırsa, kısayol olarak o karakter kullanılır (Resim 10.2).

73

RESĠM: Kısayol tuĢunun belirlenmesi.

ToolStripMenultem Özellikleri

Özellik Değer Tipi Açıklama

Checked Boolean Menü öğesinin yanında seçili olduğuna dair bir iĢaretin gözükmesini

sağlar.

Enabled Boolean Menü öğesinin aktif durumda olup olmadığını belirler.

RadioCheck Boolean Öğenin seçilme stilinin RadioButton düğmesi olarak gözükmesini

sağlar.

ShortCut ShortCut Menüye ulaĢım için bir kısayol tanımlar.

ShowShortCut Boolean Menünün kısayolunun, isminin yanında gözükmesini belirler.

Menultems MenultemCollection Alt menülerin tutulduğu koleksiyondur.

TABLO: Menultem Özellikleri

RESĠM: Menü örneği.

1.23.3. ContextMenu

ContextMenu, bir kontrol sağ tıklandığı zaman açılan menüdür.

RESĠM: ContextMenu özelliği. RESĠM: ContextMenu

kullanımı.

Bu menü uygulamaya eklendiği zaman Properties panelinde, kontrollerin ContextMenu özelliği olarak bu menü

atanabilir.

Kontrolün ContexMenu Özelliğini kullanmak için çalıĢma zamanında kontrol üzerine sağ tıklanır.

74

1.23.4. ToolStrip

ToolStrip kontrolü menülerin altında kullanıcıya kısayollar ve kullanım kolaylığı sunan bir kontroldür.

Kontroldeki öğeler çoğu zaman ImageList kontrolünün sağladığı resimlerle gösterilir. Resim yerine yazı da

gösterilebilir, ancak yazı ile iĢlemlerin listelenmesi menülerle sağlanır.

ToolStrip kontrolüne pek çok baĢka kontrol eklenebilir. Bunu farklı yöntemleri vardır ama en kolay ve dolaysız

olanı, forma eklenen ToolStrip kontrolünün üzerine tıklayarak açılan

listeden seçmektir. Ġstenirse, ToolStrip kontrolüne sağ tıklanarak açılan

menüden insert standart items seçilerek araç çubuğuna standart düğmeler

eklenebilir. Ġsimlendirmesi ve imaj eklemesi yapılmıĢ bu standart

düğmeleri daha sonra istenildiği gibi düzenlenebilir. (istenen silinip,

istenirse baĢka kontrol eklenebilir)

Resim: Standart Düğmeler seçilmiĢ ToolStrip kontrolü

Seçilen kontrolün özellikleri, özellikler penceresinden düzenlenebilir.

Düğmeler tıklandığı zaman çalıĢması istenen kodlar, ToolStrip kontrolünün Click olayına yazılır.

1.23.5. ToolTip

Bu kontrol, form üzerindeki kontrollerin üzerine gelindiği zaman ipucu göstermek için kullanılır. ToolTip

forma eklendiği zaman, kontrollerin özelliklerinde ToolTip on [ToolTip kontrolünün ismi] Ģeklinde bir

özellik belirir. Bu özelliğe verilen yazılar, çalıĢma anında kontrollerin ipucunu belirler.

ÇalıĢma zamanı Mouse kontrolün üzerinde bekletildiğinde ipucu metni belirli bir süre görünür ve kaybolur.

RESĠM: ToolTip kontrolü örneği.

75

ToolTip Özellikleri

Özellik Değer

Tipi

Açıklama

Active Boolean Kontrolün aktif olup olmadığını belirler. False değerini alırsa, form üzerinde

ipuçları görüntülenmez.

AutomaticDelay Integer AutoPopDelay, InitialDelay, ReshowDelay değerleri için otomatik süreleri

ayarlar.

AutoPopDelay Integer Ġpucunun görüntülenme süresini belirler.

InitialDelay Integer Ġpucunun gözükmesi için, fare imlecinin kontrol üzerinde durması gereken

süreyi belirler

ReshowDelay Integer Yeni bir kontrolün üzerine gelindiği zaman, bu kontrole ait ipucunun

gösterilmesi için gereken süreyi belirler.

ShowAlways Boolean Seçilen kontrol aktif olmadığı zamanlarda dahi ipucunun gösterilmesini sağlar.

TABLO: ToolTip Özellikleri

1.23.6. StatusStrip

Bu kontrol, Windows uygulamalarında formların altında bulunan durum çubuğunu temsil eder. Durum

çubuklarında sadece bir yazı görüntülenebildiği gibi, içindeki

paneller ile birden fazla durum yazısı görüntülenebilir.

StatusStrip kontrolüne panel eklemenin en kolay yolu, kontrole

tıklayarak açılan seçeneklerden seçmektir. Seçilen kontrolün

özellikleri daha sonra değiĢtirilebilir.

RESĠM: StatusBar kontrolü örneği.

1.23.7. NotifyIcon

Windows uygulamalarının Windows görev çubuğunda görüntülenen simgesini belirler.

RESĠM: NotifyIcon kontrolü örneği.

NotifyIcon Özellikleri

Özellik Değer Tipi Açıklama

Icon Icon Görev çubuğunda gözükecek simgeyi belirler.

ContextMenu Menu Simge sağ tıklandığı zaman açılacak menüyü belirler.

Text String Simge üzerine gelindiğinde görüntülenecek yazıyı belirler.

TABLO: NotifyIcon Özellikleri

1.23.8. RichTextBox

Normal bir metin kutusundan daha geliĢmiĢ özelliklere sahip bir kontroldür. TextBox kontrolünde yazının yazı

tipi, büyüklüğü gibi ayarlar yapılabilir. Ancak seçilen yazının rengi, yazı

tipi, satır baĢı geniĢliği ve madde iĢaretleri kullanımı gibi ayarlar yapmak

mümkün değildir. RichTextBox kontrolü, bu tip zengin özelliklerin

kullanılmasını sağlar.

RESĠM: RichTextBox kontrolü örneği.

76

RichTextBox Özellikleri

RichTextBox kontrolü kullanıcıya birçok seçenek sunar; dolayısıyla tasarım ve çalıĢma sırasında eriĢilebilen

birçok özelliği bulunur.

Tasarım sırasında ulaşılabilen özellikler:

Özellik Değer Tipi Açıklama

ZoomFactor Single Metnin büyüklüğünü belirler. 1 - 64 ara bir değer alır.

WordWrap Boolean Uzun yazıların bir sonraki satıra geçerek görüntülenmesini sağlar.

DetectUrls Boolean Bağlantı olarak girilen yazıların LinkLabel Ģeklinde algılanmasını

belirler.

Lines String() Satırları String dizisi olarak tutar.

BulletIntend Integer Satırların madde iĢaretinden kaç piksel açıkta duracağını belirler.

AcceptsTab Boolean Tab tuĢunun bir karakter olarak algılanmasını, dolayısıyla bu tuĢa

basıldığında kontrolden çıkılmasının engellenmesini belirler.

ShowSelectionMargin Boolean Satır baĢındaki boĢluğun gösterilmesini belirler.

RightMargin Integer Satırların maksimum uzunluğunu pikse cinsinden belirler.

TABLO: RichTextBox Tasarım Sırasında UlaĢılabilen Özellikler

Çalışma sırasında ulaşılabilen özellikler:

Özellik Değer

Tipi

Açıklama

Capture Boolean Kontrol içine yazı yazarken farenin gizlenmesini belirler.

UndoActionName String En son yapılabilecek Undo iĢleminin tipini tutar.

RedoActionName String Undo iĢlemi yapıldıktan sonra, en son yapılabilecek Redo iĢleminin ismini

tutar.

SelectedText String Seçilen metni belirler.

SelectionBullet Boolean Seçilen satırın madde iĢaretli olarak görüntülenmesini belirler.

SelectionAlignment Boolean Seçilen satırın hizalanmasını belirler.

SelectionColor Color Seçilen metnin rengini belirler.

SelectionFont Font Seçilen metnin yazı tipini belirler.

SelectionIntend Integer Seçilen satırın, sol kenara olan uzaklığını belirler.

SelectionLength Integer Seçilen metnin uzunluğunu belirler.

TABLO: RichTextBox ÇalıĢma Sırasında UlaĢılabilen Özellikler

RichTextBox Metotları

Metot Açıklama

Find Metin kutusu içinde, parametre olarak verilen bir yazıyı arar. Yazıyı ilk gördüğü yerin

indisini döndürür.

LoadFile Bir dosyadan alınan metni yükler.

SaveFile Parametre olarak verilen konumdaki dosyaya, metni yazar. Dosyanın*.rtf veya *.doc

uzantılarında kaydedilmesi, zengin içeriğin görüntülenmesi açısından önemlidir.

Undo Yapılan iĢlem geriye alınır.

Redo Geri alınan iĢlem tekrar yapılır.

TABLO: RichTextBox Metotları

RichTextBox Olayları

Olay Açıklama

TextChanged Metin kutusundaki yazı değiĢtiği zaman gerçekleĢir.

LinkClicked Metin içindeki bir bağlantıya tıklandığı zaman gerçekleĢir.

TABLO: RichTextBox Olayları

77

1.23.9. Notepad Uygulaması

Bu uygulamada, RichTextBox kontrolünün sağladığı kolaylıklarla bir metin editörü uygulaması geliĢtirilecektir.

Bu uygulamanın kullanımını kolaylaĢtırmak için menüler, araç çubuğu ve durum çubuğundan faydalanılır.

RESĠM: Notepad uygulaması.

Bu uygulamada kullanılan kontroller ve teknikler:

MenuStrip. Dosya, düzen, görünüm ve yardım iĢlemleri için kullanılır.

ContextMenu. Araç çubuğunu gizlemek ve kopyala, yapıĢtır, kes gibi metin iĢlemleri için kullanılır.

RichTextBox. Yaz ılan metnin tutulması için kullanılır.

Notifylcon. Uygulamanın simgesinin görev çubuğunda gözükmesini sağlar.

ToolStrip. Kaydetme, dosya açma, hizalama gibi iĢlemlere kısayollar sağlamak için kullanılır.

SaveFileDialog. Dosyaların kaydedilmesi sırasında kullanılır.

OpenFileDialog. Dosyaları açmak için kullanılır.

FontDialog. Yazı tipini değiĢtirmek için kullanılır.

Kontrollerin Eklenmesi

Form üzerine Tablo 10.12'deki kontrolleri ekleyin ve belirtilen özellikleri ayarlayın.

Kontrol Kontrol İsmi Özellik

ContextMenuStrip ContextMenuStrip1 Geri Al, Kes, Kopyala, YapıĢtır, Sil, Tümünü Seç değerlerini

içeren menü öğeleri ekleyin.

ContextMenuStrip ContextMenuStrip2 Gizle değerini içeren bir menü öğesi ekleyin.

ToolStrip ToolStrip1 Kaydet, Aç, Kopyala, Kes, YapıĢtır, Undo, Redo, Madde

ĠĢaretle, Sola Hizala, Sağa Hizala, Ortala komutları için

düğmeler ekleyin. Her düğmenin Image özelliğine yaptıkları

iĢi ifade eden görseller tanımlayın.

OpenFileDialog OpenFileDialog1

SaveFileDialog SaveFileDialog1

FontDialog FontDialog1

NotifyIcon NotifyIcon1 Text: "Notepad Uygulaması"

Icon: Uygulamanız için bir simge seçin

RichTextBox RichTextBox1

Uygulamaya son olarak bir MenuStrip ve ilgili alanlara aĢağıdaki öğelerini ekleyin. Parantez içinde belirtilen

tuĢlar, menü öğelerine eriĢmek için kullanılacak kısayollardır. Bu değerleri, menü öğelerinin ShortCutKeys

özelliğinden ayarlayınız.

78

Dosya Düzen Görünüm Yardım

Yeni (Ctrl+ N)

Aç (Ctrl+O)

Kaydet (Ctrl+ S)

Farklı Kaydet

ÇıkıĢ

Geri Al (Ctrl+ Z)

Kes (Ctrl+X)

Kopyala (Ctrl+C)

YapıĢtır (Ctrl+V)

Sil

Bul

Yazı Tipi

Tümünü Seç

Sola Hizala

Sağa Hizala

Ortala

Madde ĠĢaretle

Araç çubuğunu gizle

Hakkında

Uygulamaya frmBul isminde yeni bir form ekleyin. Bu form, metin kutusunda aranan değeri bulmak için

kullanılacaktır.

Forma, arama iĢlemleri için gereken kontrolleri ekleyin.

TABLO 10.13: Eklenecek Kontroller

Kontrol Kontrol İsmi Özellik Değer

Button Buttonl DialogResult DialogResult.OK

Text "Bul"

Button Button2 Text "Ġptal"

CheckBox cbTumKelimeyiSec Text "Bulduktan sonra tüm kelimeyi seç"

Checked True

TextBox txtAranan

Kontrolleri ekledikten sonra Buttonl ve Button2 düğmelerinin Click olayına, formu kapatan kodları yazın:

Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub

RESĠM: Notepad Bul iĢlemi.

Uygulamaya frmHakkinda isminde yeni bir form ekleyin. Bu form, uygulama bilgilerini içerir.

RESĠM: Notepad Hakkında penceresi.

79

Kodların Yazılması

Dosya ismini ve dosyanın kaydedilip edilmediğini tutan değiĢkenleri tanımlayın.

Private Kaydedildi As Boolean = True Private DosyaIsmi As String

Menü öğelerine kod eklemeden önce, yapılacak iĢlemler yordamlar içine yazılır. Menülerin Click olayları

içinden bu yordamlar çağrılır. Böylece kodun karmaĢıklığı azalır ve değiĢiklik yapmak kolaylaĢır.

Dosyaya kaydetme ve farklı kaydetme iĢlemlerini yazın.

Sub Kaydet() ' Kaydetme işlemi If DosyaIsmi = "" Then FarkliKaydet() Else RichTextBox1.SaveFile(DosyaIsmi) Kaydedildi = True End If End Sub ' Farklı kaydetme işlemi Sub FarkliKaydet() Dim dosya As String ' Kaydedilecek yeri seçmek için SaveFileDialog kutusu gösterilir ' Dosya yoksa otomatik olarak oluşturulması sağlanır SaveFileDialog1.CreatePrompt = True If SaveFileDialog1.ShowDialog = DialogResult.OK Then dosya = SaveFileDialog1.FileName() RichTextBox1.SaveFile(dosya) DosyaIsmi = dosya Kaydedildi = True End If End Sub

Yeni bir dosya veya var olan bir dosyayı açma iĢlemlerini tanımlayın.

Sub DosyaAc(ByVal yeniDosya As Boolean) If Not Kaydedildi Then Select Case MsgBox("Dosya kaydedilsin mi?", MsgBoxStyle.YesNoCancel) Case MsgBoxResult.Ok ' Kaydetme işlemi yapılır Kaydet() Case MsgBoxResult.Cancel ' İşlem iptal edildi Exit Sub End Select End If If Not yeniDosya Then ' Varolan bir dosya açılır. Dim dosya As String If OpenFileDialog1.ShowDialog = DialogResult.OK Then dosya = OpenFileDialog1.FileName RichTextBox1.LoadFile(dosya) DosyaIsmi = dosya End If Else

80

' Yeni bir dosya açılır RichTextBox1.Clear() DosyaIsmi = "" End If Kaydedildi = True End Sub

Bulma iĢlemlerini gerçekleĢtiren kodları yazın. Burada yeni bir form açılıp, orda girilen değerlere göre

arama iĢlemi yapılır.

Sub Bul() ' Bulma formu görüntülenir, iptal tuşuna basıldıysa çıkılır Dim bul As New frmBul If Not bul.ShowDialog = DialogResult.OK Then Exit Sub Dim aranan As String = bul.txtAranan.Text If aranan = "" Then Exit Sub ' Bulduktan sonra kelimenin tümünü işaretlenmesi bilgisi alınır Dim TumKelimeyiSec As Boolean = bul.cbTumKelimeyiSec.Checked ' Bulunan ilk indis alınır. Dim start As Integer = RichTextBox1.Find(aranan) If Not TumKelimeyiSec Then ' Sadece aranan kelime seçilir. RichTextBox1.Select(start, aranan.Length) Else Dim son As Integer = start Dim bas As Integer = start While son < RichTextBox1.Text.Length - 1 AndAlso RichTextBox1.Text.Substring(son, 1) <> " " son += 1 End While While bas > -1 AndAlso RichTextBox1.Text.Substring(bas, 1) <> " " bas -= 1 End While RichTextBox1.Select(bas + 1, son - bas - 1) End If End Sub

ToolBar düğmeleri tıklandığı zaman gerçekleĢecek kodları yazın. (Bazı Toolbar öğelerinin yaptıkları

iĢler, MenuStrip ve ContexMenuStrip öğeleri tarafından da yapılmaktadır. Bu durumda aynı kodları

sürekli tekrarlamak yerine, bir tek yordam altında Handles ifadesinden sonra iki menü öğesinin Click

olayı yazılır.

Private Sub SaveToolStripButton_Click(ByVal …) Handles SaveToolStripButton.Click, KaydetToolStripMenuItem.Click 'Kaydet Kaydet() End Sub Private Sub OpenToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenToolStripButton.Click, AçToolStripMenuItem.Click 'Aç DosyaAc(False) End Sub

81

Private Sub CopyToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CopyToolStripButton.Click, KopyalaToolStripMenuItem1.Click, KopyalaToolStripMenuItem.Click 'Kopyala RichTextBox1.Copy() End Sub Private Sub CutToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CutToolStripButton.Click, KesToolStripMenuItem1.Click, KesToolStripMenuItem.Click 'Kes RichTextBox1.Cut() End Sub Private Sub PasteToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PasteToolStripButton.Click, YapıştırToolStripMenuItem1.Click, YapıştırToolStripMenuItem.Click 'Yapıştır RichTextBox1.Paste() End Sub Private Sub UndoToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UndoToolStripButton.Click, GeriAlToolStripMenuItem1.Click, GeriAlToolStripMenuItem.Click 'Geri al RichTextBox1.Undo() End Sub Private Sub RedoToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RedoToolStripButton.Click 'Tekrarla RichTextBox1.Redo() End Sub Private Sub MaddeisaretleToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MaddeisaretleToolStripButton.Click, MaddeİşaretleToolStripMenuItem.Click 'Madde işaretle RichTextBox1.SelectionBullet = Not RichTextBox1.SelectionBullet End Sub Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click, SOlaHizalaToolStripMenuItem.Click ' Sola Hizala RichTextBox1.SelectionAlignment = HorizontalAlignment.Left End Sub Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click, OrtalaToolStripMenuItem.Click ' Ortala RichTextBox1.SelectionAlignment = HorizontalAlignment.Center End Sub

82

Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click, SağaHizalaToolStripMenuItem.Click ' Sağa Hizala RichTextBox1.SelectionAlignment = HorizontalAlignment.Right End Sub

Dosya içinde bulunan bir bağlantı tıklandığı zaman, bu bağlantıyı ilgili tarayıcıda açan kodları yazın.

' Linke git Private Sub RichTextBox1_LinkClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.LinkClickedEventArgs) Handles RichTextBox1.LinkClicked System.Diagnostics.Process.Start(e.LinkText) End Sub

Dosya içine yazılan yazı değiĢtiği zaman gereken kodları yazın.

Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged Kaydedildi = False End Sub

Uygulama kapanırken dosyanın kaydedilip kaydedilmeyeceğini soran kodları yazın.

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing ' Kapanırken dosyanın kaydedilmesi kontrol edilir. If Not Kaydedildi Then Select Case MsgBox("Dosya kaydedilsin mi?", MsgBoxStyle.YesNoCancel) Case MsgBoxResult.Ok ' Kaydetme işlemi yapılır Kaydet() Case MsgBoxResult.Cancel ' İşlem iptal edildi e.Cancel = True End Select End If End Sub

ÇalıĢmayı farklı kaydetmek için gerekli prosedur

Private Sub FarklıKaydetToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FarklıKaydetToolStripMenuItem.Click 'Farklı Kaydet FarkliKaydet() End Sub

ÇıkıĢ düğmesi iĢlevi

Private Sub ÇıkışToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÇıkışToolStripMenuItem.Click 'Çık Application.Exit() End Sub

83

Yazı silme alt programı

Private Sub SilToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SilToolStripMenuItem1.Click, SilToolStripMenuItem.Click 'Yazı Sil ' silinecek kelime RichTextBox kontrolünde seçilen kelimedir Dim silinecek As String = RichTextBox1.SelectedText ' secilen kelimenin indisi bulunur Dim i As Integer = RichTextBox1.SelectionStart RichTextBox1.Text = RichTextBox1.Text.Remove(i, silinecek.Length) End Sub

Tümünü seç alt programı

Private Sub TümünüSeçToolStripMenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TümünüSeçToolStripMenuItem1.Click, TümünüSeçToolStripMenuItem.Click 'Tüm yazıyı Seç RichTextBox1.SelectAll() End Sub

Yazı tipi seç alt programı

Private Sub YazıTipiToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles YazıTipiToolStripMenuItem.Click 'Yazı tipi seç ' Font seçerken, renklerin de görünmesi sağlanır. FontDialog1.ShowColor = True If FontDialog1.ShowDialog = DialogResult.OK Then RichTextBox1.SelectionFont = FontDialog1.Font End If End Sub

Hakkında formunun gösterilmesi

Private Sub HakkındaToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HakkındaToolStripMenuItem.Click Dim hakkinda As New frmHakkinda hakkinda.ShowDialog() End Sub

' Araç çubuğunun gizlenmesi, MainMenu ve Toolbar kontrolüne atanan ContextMenu yapılır. Private Sub GizleToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GizleToolStripMenuItem.Click ToolStrip1.Visible = Not ToolStrip1.Visible End Sub

Sözcük bul alt programı

Private Sub BulToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BulToolStripMenuItem.Click Bul() End Sub

84

1.23.10. MDI Formlar

Multiple Document Interface formları, içinde birden fazla form barındıran formlardır. Bu sayfalar ana forma

bağlıdır. Ana form kapandığı zaman bu sayfalar da kapanır. MDlParent olarak nitelendirilen bu ana formların,

MDlChild formlarını açmak ve yönetmek için menülere ihtiyaçları vardır.

Formları MDI olarak tanımlamak için IsMdiContainer özelliğinin True olarak ayarlanması gerekir.

RESĠM: isMDIcontainer özelliği.

MDI formlara alt formlar eklemek için, form oluĢturma iĢlemleri aĢağıdaki Ģekilde yapılır. Ancak formun

MDIParent özelliği belirlenmelidir.

Dim f As New AltForm ' Oluşturulan form, ana forma bağlanır. f.MdiParent = Me f.Show()

Alt formlar geniĢletildiklerinde alt formda tanımlı bir menü, ana formun menüsü ile birleĢir. Bu menü birleĢim

iĢlemine Merge denir. Alt Form üzerinde yazan baĢlığın ana forma taĢınması isteniyorsa, aktif alt formun

ActiveMdiChild özelliğiyle text özelliği (baĢlığındaki text) Ana Formun Text özelliğine aĢağıdaki gibi atanır

If Not Me.ActiveMdiChild Is Nothing Then Me.Text = Me.ActiveMdiChild.Text End If

1.23.11. Fare Olayları

Fare olayları, formlar üzerinde farenin bir tuĢunun tıklanması ya da bir kontrolün üzerine gelinmesi gibi

olaylardır. Bu olayla ilgili parametreler, olay gerçekleĢtiği zaman MouseEventArgs nesnesi ile kullanıcıya

bildirilir.

MouseEventArgs özellikleri:

Button. Hangi fare düğmesinin tıklandığını gösterir.

Click. Olay gerçekleĢene kadar, düğmeye kaç defa tıklandığını belirler. Örneğin fareye çift tıklanmıĢsa

2 değerini alacaktır.

Delta. Farenin ortadaki düğmesinin dönme oranını gösterir.

X. Kontrole göre, farenin tıklandığı pozisyonun x koordinatını gösterir.

Y. Kontrole göre, farenin tıklandığı pozisyonun y koordinatını gösterir.

NOT Fare olayları MDI formlar üzerinde gerçekleĢmez.

MouseDown olayı: Farenin herhangi bir düğmesine basıldığı zaman gerçekleĢir. Kontrolün Click

olayından önce çalıĢır.

MouseUp olayı: Farenin basılan düğmesi kaldırıldığı zaman gerçekleĢir.

MouseMove olayı: Farenin, kontrol üzerinde hareket etmesi ile gerçekleĢir.

2. BÖLÜM: Veri Yapıları

Birçok Ģirket, kurum ve kayıtlarını tutan yapılar için verilerin önemi çok büyüktür. Verilerin kâğıt üzerinde tutulması,

hem aramaların yapılması, hem de kayıt düzeni açısından çok zor bir yöntemdir. Bilgisayarların iĢ yaĢamında kullanıl-

85

maya baĢlanması ile verilen yönetimi daha da kolaylaĢtı. Ancak bu teknoloji ilerledikçe kullanılması zorlaĢmaya baĢladı.

Verilerin tutulması metin dosyalarından tablolara aktarıldı. Günümüzde veri ve tablo yapılarının yönetimi artık veritabanı

yöneticilerin eline bırakılmıĢ durumdadır.

Windows ve Web uygulamaların çoğu veri üzerine yoğunlaĢır. Uygulamalarda veriye hızlı bir Ģekilde ulaĢmak ve veriyi

yönetmek için tablo yapılarının iyi bir Ģekilde modellenmesi gerekir. Bu kısımda Microsoft Access veritabanı üzerinde

veri yapılarının kullanılması iĢlenecektir.

2.1. Access' e Giriş

Access Microsoft'un iliĢkisel veritabanı uygulamasıdır. Ġçindeki birçok sihirbaz yardımı ile kullanım kolaylığı ve tablo

tasarımlarının hızlı bir Ģekilde yapılabilmesini sağlar. Access tasarım görünümlerinde, tabloların yapısını analiz etmek

için kullanılan sorguların kolay bir Ģekilde oluĢturması sağlanır. KarmaĢık bir dosya yapısı olmaması, veritabanının

taĢınabilirliğini kolaylaĢtırır ve her platformda çalıĢabilmesini sağlar.

2.1.1. Access Ortamı

Access ortamı, veritabanı geliĢtirirken kullanıcıya birçok kolaylık sunar. Access açıldığı zaman kullanıcıyı aĢağıdaki gibi

bir ekran karĢılar. Bu panel birçok iĢleme kısayol sağlar. ÇeĢitli amaçlar için hazırlanmıĢ pek çok hazır Ģablondan biri

seçilebilir. Ya da üstte yer alan boĢ veritabanı seçilebilir. Sayfanın sağında görülen dosya yolu ve ismi ayarlanarak

çalıĢma diske kaydedilir.

Office 2003 üyesi bir Access dosyasının uzantısı mdb iken, Office 2007‟den itibaren uzantı accdb olarak

değiĢmiĢtir. Yeni veritabanı dosyasını oluĢturur oluĢturmaz ekrana, henüz kaydedilmemiĢ, varsayılan ismi

Tablo1 olan bir tablo gelir.

86

Ġlk tabloyu oluĢturmak için kaydet düğmesine tıklanır ve açılan pencerede tabloya uygun bir isim verilir.

Tablodaki kayıtlara bu isimle ulaĢılacağından ve bir veritabanı dosyasında birden fazla tablo olabileceğinden

isimlendirmeye dikkat etmek gerekir.

Tablo adını KiĢiler olarak belirleyip Tamam düğmesiyle onaylanır. Sadece kimlik varsayılan alanına sahip

KiĢiler tablosu aĢağıdaki gibi görünür.

2.1.2. Tablo

Tablo, çalıĢanlar veya ürünler gibi belirli bir konuyla ilgili veriler içerir. Tablodaki her kayıt, belirli bir

çalıĢan gibi tek öğe hakkında bilgiler içerir.

Kayıtlar ad, adres ve telefon numarası gibi

alanlardan oluĢur.

Kayıt genellikle satır olarak,

Alan da genellikle sütun olarak bilinir

1. Kayıt veya satır

2. Alan veya sütun

Veritabanı, her biri farklı bir konu hakkında bilgiler depolayan birçok tabloyu içerebilir. Her tablo, metin, sayı,

tarih ve resimler dâhil olmak üzere farklı türde birçok alan içerebilir.

AĢağıdaki listede, oluĢturulabilecek bazı genel tablo örnekleri gösterilmektedir.

ġirketinizin müĢterilerini ve onların adreslerini listeleyen bir müĢteri tablosu

87

Sattığınız ürünlerin, her öğenin fiyatını ve resmini içeren bir kataloğu

Görevleri ve son tarihleri izleyen bir görevler tablosu

Donanım stoğu veya eldeki stok

Doğruluğunu sağlamak ve sonradan çok fazla değiĢiklik yapmak zorunda kalmamak için veritabanını dikkatle

planlamak ve tasarlamak gerekir.

Tabloda sütunları saptamak için, tabloda kayıtlı konuyu izlemek üzere hangi bilgiye gerek duyduğunuza

karar verin. Örneğin, MüĢteriler tablosu için Ad, Adres, Telefon No, E-posta adresi baĢlangıç olarak iyi bir

sütun listesi oluĢturur. Tablodaki kayıtlarda aynı sütun kümesi vardır; böylece her kayıt için Ad, Adres, Telefon

No, E-posta bilgileri depolanabilir. Örneğin, adres sütununda müĢteri adresleri vardır. Her kayıtta tek müĢteri

hakkında veri bulunur, adres alanında ise bu müĢteriye ait adres vardır.

Her tablo için baĢlangıç sütun kümesini saptadıktan sonra sütunları daha fazla ayrıntılandırabilirsiniz.

Örneğin, müĢteri adını iki ayrı sütunda depolamak anlamlı olabilir: Ad ve soyadı; böylece bu sütunlara göre

sıralayabilir, arayabilir ve dizin oluĢturabilirsiniz. Benzer olarak, adres de adres, Ģehir, posta kodu ve ülke/bölge

öğelerini içeren bileĢenlerden oluĢur; bunları da ayrı sütunlarda depolamak akıllıca olabilir. Bir arama

gerçekleĢtirmek istiyorsanız, örneğin Ģehir bilgilerinin ayrı bir sütunda depolanmasına gerek duyduğunuzda

iĢleme Ģehire göre filtre ve sıralama uygulayın.

AĢağıdaki listede sütunları saptama için ipuçları veriliyor.

Hesaplanan verileri dâhil etmeyin

Çoğu durumda, tablolarda hesaplama sonucunu depolamanız gerekmez. Bunun yerine, bu sonucu görmek

istediğinizde Access'in hesapları gerçekleĢtirmesini sağlayabilirsiniz. Örneğin, bu veritabanında her ürün

kategorisi için sipariĢteki birimlerin bir alt toplamını görüntüleyen SipariĢteki Ürünler raporu olduğunu

düĢünelim. Ancak, tablolarda SipariĢteki Birimler alt toplamı sütunu olmasın. Bunun yerine, Ürünler

tablosunda her ürün için sipariĢteki birimleri depolayan SipariĢteki Birimler sütunu olsun. Bu verileri

kullanarak, raporu her yazdırıĢınızda Access alt toplamı hesaplar. Alt toplamın kendisinin tabloda depolanması

gerekmez.

Bilgileri en küçük mantıksal parçalar halinde depolama

Tam ürün adları veya ürün tanımlamaları ile birlikte ürün adları için tek alanınız olmasını isteyebilirsiniz.

Birden fazla bilgi türünü tek alanda birleĢtirirseniz, daha sonra birbirinden bağımsız olguları almanız zor

olacaktır. Bilgileri mantıksal parçalara bölmeyi deneyin; örneğin ad ve soyadı için veya ürün adı, kategori ve

tanım için ayrı alanlar oluĢturun.

Veri sütunlarını her tabloda ayrıntılandırdıktan sonra, artık her tablonun birincil anahtarını seçmeye hazırsınız.

Birincil anahtarları belirtme

Her tabloda, tabloda depolanan her satırı benzersiz bir Ģekilde tanımlayan bir sütun veya sütun kümesi olması

gerekir. Bu çoğunlukla, çalıĢan no veya seri numarası gibi benzersiz bir kimlik numarasıdır. Veritabanı

terminolojisinde bu bilgi tablonun birincil anahtarı olarak adlandırılır. Access birincil anahtar alanlarını birden

fazla tablodaki verileri hemen iliĢkilendirmek ve verileri sizin adınıza bir araya getirmek için kullanır.

Kataloğunuzdaki her ürünü benzersiz olarak tanımlayan ürün numarası gibi tanımlayıcılar tablonuzda zaten

varsa, bu tanımlayıcıyı tablonuzun birincil anahtarı olarak kullanabilirsiniz; ancak bu sütundaki değerlerin her

zaman, her kayıt için farklı olması gerekir. Birincil anahtarda, yinelenen değerleriniz olamaz. Örneğin, adlar

benzersiz olmadığından kiĢi adlarını birincil anahtar olarak kullanmayın. Aynı adda iki kiĢinin tablonuzda yer

alma olasılığı çok yüksektir.

88

Birincil anahtarda her zaman bir değer olması gerekir. Bazı noktalarda sütun değeri atanmamıĢ veya

bilinmeyense (eksik değer), birincil anahtarda bileĢen olarak kullanılamaz.

Her zaman değeri değiĢmeyen bir birincil anahtar seçmeniz gerekir. Birden fazla tablonun kullanıldığı

veritabanında, bir tablonun birincil anahtarı diğer tablolarda baĢvuru olarak kullanılabilir. Birincil anahtar

değiĢirse, anahtarın baĢvuru olarak alındığı her yerde de değiĢikliğin uygulanması gerekir. DeğiĢmeyecek

birincil anahtar kullanılması, birincil anahtarın, kendisine baĢvuran diğer tablolarla uyumsuzlaĢma olasılığını

azaltır.

Çoğunlukla, rasgele benzersiz bir sayı birincil anahtar olarak kullanılır. Örneğin, her sipariĢe benzersiz bir

sipariĢ numarası atayabilirsiniz. SipariĢ numarasının tek amacı sipariĢi tanımlamaktır. Atandıktan sonra, bir

daha değiĢmez.

Aklınızda iyi bir birincil anahtar olacak sütun veya sütun kümesi yoksa Otomatik Sayı veri türüne sahip sütun

kullanmayı dikkate alın. Otomatik Sayı veri türünü kullandığınızda Access otomatik olarak size bir değer atar.

Böyle bir tanımlayıcının gerçekliği yoktur; kendisini temsil eden satırları açıklayan gerçek bilgileri yoktur.

Gerçekliği olmayan tanımlayıcılar değiĢmeyeceklerinden birincil anahtar olarak kullanılmak için idealdir. Satır

hakkında olguların (telefon numarası veya müĢteri adı gibi) yer aldığı birincil anahtar, gerçekliği olan bilgilerin

kendileri değiĢebileceğinden değiĢmeye daha yakındır.

2.1.3. Tabloya yeni alan ekleme veya tabloda yeni alan oluşturma

Veriler tablolarda (konuya dayalı satır ve sütun listeleri) depolanır. Sütunlar, izlemek istenen bilgi öğeleri olan

alanlar olarak da adlandırılır. Tabloya yeni alan eklemenin çeĢitli yolları vardır ancak en sık kullanılan iki yolu;

veri sayfası görünümü ya da tasarım görünümü sayfalarını kullanmaktır.

Tasarım görünümü, Veri Sayfası görünümüne göre daha fazla esneklik sağlar; çünkü Tasarım görünümünden

çıkmak zorunda kalmadan kullanılabilir tüm veri türlerini ayarlayabilir ve arama alanı oluĢturabilirsiniz.

Tasarım görünümünde sütun ekleme

Alan Adı sütununda boĢ bir satır seçin ve yeni alan için yeni bir ad yazın.

Veri Türü sütununda, yeni alan adının yanında, yeni sütun için veri türü seçin.

2.1.4. Veri türleri

Veritabanlarında tüm veriler aynı tipte tutulmaz. Bu durum, küçük veriler için fazla yer alanları açmayı

engellediği gibi, değiĢik formatlardaki verilerin yönetilebilirliğini de artırır.

Bir veritabanını ilk kez tasarlar ve oluĢtururken, bir veya daha fazla tablo planlarsınız, her tablo için

alanları (sütunları) planlar ve her alan için bir veri türü ayarlarsınız. Örneğin, tarih ve saatleri depolamanız

gerekiyorsa, bir alanı Tarih/Saat veri türüne ayarlarsınız. Ad ve adresleri depolamanız gerekiyorsa, bir veya

daha fazla alanı Metin veri türüne ayarlarsınız ve bu Ģekilde devam eder.

89

Office Access 2007 10 farklı veri türü sağlar (Access'in önceki sürümleri dokuz tür sağlamaktaydı) ve

bu türlerin her birinin belirli bir amacı vardır. AĢağıdaki tabloda veri türleri listelenmekte, her birinin

depoladığı veri türü gösterilmekte ve her tür için söz konusu sınırlamalar açıklanmaktadır.

Veri

Türü

Kullanımı Sınırlamalar/Kısıtlamalar

Metin Alfa sayısal veriler

(metin ve sayılar)

En fazla 255 karakter depolar.

Not Alfa sayısal veriler

(metin ve sayılar)

Alanı programla dolduracaksanız en çok 2GB veri depolar (tüm

Access veritabanlarındaki boyut sınırıdır). 2GB veri eklendiğinde

veritabanınızın yavaĢ çalıĢacağını unutmayın.

Verileri el ile girecekseniz, tablo alanında ve alanla bağlantılı

kıldığınız tüm denetimlerde en fazla 65.535 karakter girebilir ve

görüntüleyebilirsiniz.

Office Access 2007 dosya biçiminde veritabanı oluĢturduğunuzda,

Not alanları zengin metin düzenlemeyi de destekler.

Sayı Sayısal veriler Sayı alanları, alanın içerebileceği değerin boyutunu belirleyen bir

Alan Boyutu ayarı kullanır. Alan boyutunu 1, 2, 4, 8 veya 16 bayt

olarak ayarlayabilirsiniz.

Tarih/Saat Tarih ve saatler Access tüm tarihleri 8 baytlık çift duyarlıklı tamsayılar halinde

depolar.

Para

Birimi

Parasal veriler Verileri dört ondalık basamak duyarlığıyla 8 baytlık sayılar olarak

depolar. Parasal veriler depolamak isterseniz ve Access'in değerleri

yuvarlamasını istemezseniz, bu veri türünü kullanın.

Otomatik

Sayı

Yeni kayıt

oluĢturduğunuz zaman

Access tarafından

oluĢturulan benzersiz

değerler

Verileri 4 baytlık değerler halinde depolar; genellikle birincil

anahtarlarda kullanılır.

Evet/Hayır Boole (doğru veya

yanlıĢ) verileri.

Access tüm Evet değerleri için -1 ve tüm Hayır değerleri için 0

kullanır.

OLE

Nesnesi

Office ve Windows

tabanlı programlardan

gelen görüntü, belge,

grafik ve diğer nesneler

En çok 2GB veri depolar (tüm Access veritabanları için boyut

sınırıdır). 2GB veri eklendiğinde veritabanınızın yavaĢ çalıĢacağını

unutmayın. OLE Nesnesi alanları özgün belgenin veya baĢka

nesnenin bit eĢlem görüntülerini oluĢturur ve veritabanınızdaki

tablo alanlarında ve form veya rapor denetimlerinde bu bit eĢlemi

görüntüler.

Köprü Web adresleri En çok 1 gigabayt veri depolar. Web sitelerine bağlantıları, bir

intranet veya Yerel Ağ'da (LAN) bulunan siteleri ve dosyaları ve

bilgisayarınızda bulunan siteleri veya dosyaları depolayabilirsiniz.

Ek Desteklenen türde tüm

dosyalar

Office Access 2007 .accdb dosyalarında yenidir. E-posta iletilerine

dosya eklemeye çok benzer Ģekilde, veritabanınızdaki kayıtlara

görüntü, veri sayfası dosyası, belge, grafik ve desteklenen diğer

türlerde dosyalar ekleyebilirsiniz. Veritabanı tasarımcısının Ek

alanını ne Ģekilde ayarladığına bağlı olarak, eklenen dosyaları

ayrıca görüntüleyebilir ve düzenleyebilirsiniz. Ek alanları OLE

Nesnesi alanlarına göre çok daha fazla esneklik sağlar ve özgün

dosyanın bit eĢlem görüntüsünü üretmedikleri için depolama

alanını daha verimli kullanırlar.

90

2.2. SQL (Structured Query Language)

SQL (Structured Query Language) dili, veritabanları üzerinde sorgu yapmak için kullanılan bir dildir. Sorgular,

analiz aĢamalarında, veri eklerken, güncellerken ve silerken kullanılır. Sorgular tek bir tablo üzerinde

yapılabileceği gibi, birçok tablodan veri okunmasını da sağlar. Sorgular üzerinde konan kriterler, detaylı veri

analizi yapmak için kullanılır.

2.2.1. SELECT Sorgusu

SELECT sorgusu tablolardan veri kümesi çekmek için kullanılan sorgudur. Sorgunun yapısı SELECT Alanlar

FROM Tabloismi WHERE Kriterler Ģeklindedir.

Bu cümlede SELECT kelimesinden sonra gelen alanlar, tabloları oluĢturulan kolonlardır. Sonuç kümesinde,

tablonun hangi alanlarının olacağını gösterir. Burada yapılan, kolon bazında filtrelemedir.

FROM ifadesi, sorgunun hangi tablo veya tablolar üzerinde yapılacağını gösterir.

where ifadesinden sonra, sorgu kümesinde, verilen kritere uyan satırlar görüntülenir. Burada yapılan, satır

bazında filtrelemedir.

SELECT * FROM Kişiler

Buradaki yıldız ifadesi, tüm alanların listeleneceği anlamına gelir.

SELECT Kişiler.Adı, Kişiler.Soyadı FROM Kişiler

select ifadesinde alanların ismi verilirken, hangi tabloya ait olduğu da yazılır. Ancak bu durum tek tablo

üzerinden yapılan iĢlemler için gerekli değildir. Birkaç tablo üzerinde sorgu yapıldığı zaman, alanları tablo

ismiyle belirtmek gerekir.

SELECT Adı, Soyadı FROM KiĢiler

where ifadesinden sonra yazılan kriterler mantıksal karĢılaĢtırmalardır. Bu karĢılaĢtırmalar alanlardaki değerler

üzerinde yapılır. KarĢılaĢtırmalar aritmetik olabildiği gibi metinsel de olabilir.

Büyük. Alandaki değerin verilen bir değerden veya baĢka bir alandan büyük olup olmadığını kontrol eder.

SELECT Urunler.* FROM Urunler WHERE Urunler.IncelenmeSayisi > 100

Büyük Eşit. Verilen bir alanın veya değerin, kontrol edilen alandan büyük veya alana eĢit olup olmadığını

kontrol eder.

SELECT Urunler.* FROM Urunler WHERE Urunler.IncelenmeSayisi >= 100

Küçük. Alandaki değerin verilen bir değerden veya baĢka bir alandan büyük olup olmadığını kontrol eder.

SELECT Urunler.* FROM Urunler WHERE Urunler.IncelenmeSayisi < 100

Küçük Eşit. Verilen bir alanın veya değerin, kontrol edilen alandan küçük veya alana eĢit olup olmadığını

kontrol eder.

SELECT Urunler.* FROM Urunler WHERE Urunler.IncelenmeSayisi <= 100

between - AND. Alandaki değerin iki değer arasında olup olmadığını kontrol eder. Değerlere eĢit oldukları

durumlar da sonuç kümesine dahil edilir.

SELECT Urunler.* FROM Urunler WHERE Urunler.IncelenmeSayisi BETWEEN 100 AND 200

91

NOT. Verilen kritere uymayan kayıtları döndürür.

SELECT Urunler.* FROM Urunler WHERE NOT Urunler.IncelenmeSayisi = 0

LIKE. Alandaki değerin belirli bir metin biçimde olup olmadığını kontrol eder.

SELECT Alanlar FROM Tablo WHERE AlanIsmi LIKE 'Pattern'

'Pattern' ifadesinde yazılan karakterler, alanların içinde kesin olarak geçecek karakterlerdir. Örneğin Isim LIKE

'Enis'. Ancak bazı özel karakterler farklı anlam ifade ederler. Örneğin, * karakteri sıfır veya daha fazla karakteri

temsil eder. Isim LIKE '*ni*' ifadesi sıfır veya daha fazla karakter ile baĢlayan, ni ile devam eden ve yine sıfır

veya daha fazla karakter ile biten kelimeleri kontrol eder. Örneğin Deniz, Nil, Seni, Ni değerleri bu biçime

uyacaktır

Örnek: Microsoft Studio ürünlerin listelenmesi

SELECT Urunler.Isim FROM Urunler WHERE Urunler.Isim LIKE '*Studio*'

Is null. Bazı alanların değerleri boĢ bırakılmıĢ olabilir. BoĢ bırakılan alanların değerleri null olarak geçer.

Sorgularda boĢ alanların kontrolü Is NULL ifadesi ile yapılır.

SELECT Urunler.* FROM Urunler WHERE Urunler.Ozellikler Is NULL

Bir sorguda birden fazla kriter kullanılabilir. Ancak bu kriterlerin AND veya OR ifadeleri ile ayrılmaları

gerekir. and ifadesi ile ayrılan kriterlerin hepsinin sağlandığı satırlar sonuca dahil edilir. OR ifadesi ile ayrılan

kriterlerin herhangi biri sağlandığı satırlar sonuca dahil edilir.

Örnek: 12.12.2002'den sonra kaydolmuĢ, ismi E ile baĢlayan kullanıcılar:

SELECT * FROM Kullanicilar WHERE Kullanicilar.KayitTarihi > #12/12/2002#

AND Kullanicilar.Isim Like 'E*'

E-posta adresi veya Web adresi olan firmalar:

SELECT Isim, Email, WebSayfasi FROM Firmalar WHERE ((Not (Email) Is Null))

OR ((Not (WebSayfasi) Is Null));

DISTINCT (Tekrarsız)

Bir tablo içinde birbirinin aynı datalar bulunabilir. Aynı satırların listeleme esnasında bir kez yazılması için

Distinct sözcüğü kullanılır.

ÖRNEK: personel tablosundan soyad'lar tekrarsız olarak listelensin. Aynı soyada sahip birden fazla kiĢi varsa

sadece ilk kiĢi listelenir:

SELECT DISTINCT soyad FROM personel;

ORDER BY (Sırasıyla)

Tablodaki sütunları, belirli bir sütuna göre listelemek için SELECT komutuna, ORDER BY eklenir.

ÖRNEK: Personel dosyasından, sicil, ad, soyad ve brüt sütunlarını seç ve brüt(maaĢa) göre büyükten küçüğe

sırala.

SELECT sicil,ad,soyad,brüt FROM personel ORDER BY brüt ASC;

DESC: Küçükten büyüğe sırala (A-Z)

92

ASC: Büyükten küçüğe sırala (Z-A)

DESC yazılmazsa varsayılan (DEFAULT) olarak ASC kabul edilir

BİRDEN ÇOK ALANA GÖRE SIRALAMA:

Bir tablo içinde, birden fazla sütundan aynı anda sıralamak için kullanılır.

ÖRNEK: Personel dosyasından seçilen sütunlarını aynı anda hem ad hem de brüt alanına göre sırala.

SELECT sicil, ad, soyad, brüt FROM personel ORDER BY ad, brüt;

ÖRNEK Personel tablosundan seçili sütunları öncelik adda olmak üzere (Z-A) adı bozmadan soyadı (A-Z)

sıralı listele.

SELECT sicil, ad, soyad, brüt FROM personel ORDER BY ad ASC, soyad DESC,

brüt ASC;

veya;

SELECT sicil, ad, soyad, brüt FROM personel ORDER BY ad, soyad DESC, brüt;

2.2.2. Hesaplama Fonksiyonları

Alanlar üzerinde sayma, toplama, ortalama alma gibi aritmetik iĢlemlerin yanı sıra minimum ve maksimum

değerlerin alınması gibi iĢlemler de yapılabilir. Bu iĢlemlerin sonucunda sayısal bir sonuç ortaya çıkar. Bu sayı,

sonuç tablosunda gösterilirken herhangi bir alan ismi ifade etmez. Dolayısıyla, sonuç tablosunda sayısal

değerler gösterilirken mantıksal bir isim verilmesi gerekir. Bu ifade ise AS anahtar kelimesi ile belirtilir.

Sum. Kriterlerin sağlandığı alanlar üzerinde toplama iĢlemi yapar.

SELECT Sum(IncelenmeSayisi) AS [Toplam Incelenme Sayisi] FROM Urunler

WHERE Uretiliyormu = -1;

Avg. Kriterlerin sağlandığı alanların ortalama değerini alır.

SELECT Avg(BirimFiyat) AS [Ortalama Fiyat] FROM Urunler WHERE Uretiliyormu

= -1;

Max. Kriterlerin sağlandığı alanların maksimum değerini alır. Metinsel değerlerde alfabetik olarak

sıralama yapar.

SELECT Max(Isim) AS [En son geçen kullanıcı] FROM Kullanicilar;

SELECT Max(KayitTarihi) AS [En son kaydolan kullanıcı] FROM Kullanicilar;

Min. Kriterlerin sağlandığı alanların minimum değerini alır.

SELECT Min(Isim) AS [En başta geçen kullanıcı] FROM Kullanicilar;

SELECT Min(KayitTarihi) AS [İlk kaydolan kullanıcı] FROM Kullanicilar;

Count. Değeri null olmayan satırların kaç tane olduğunu verir. Genellikle tablolardaki satır sayısı

istendiğinde bu fonksiyon kullanılır. Ancak bu tip bir sorguda, sayılan alanın boĢ bir değer almaması

gerekir. Birincil Anahtar alanının üzerinden bir sayım yapılabilir.

SELECT Count(KullaniciId) AS [Toplam Kullanıcı Sayısı] FROM Kullanicilar;

93

2.2.3. INSERT

INSERT sorguları tablolara kayıt eklemek için kullanılır. Bu kayıtlar eklenirken tablo isimi, alan adı ve hangi

değerlerin ekleneceği belirtilmelidir. INSERT sorgularında, gerekli olan (null kabul etmeyen) alanlara değer

eklenmesi unutulmamalıdır.

Sözdizimi:

INSERT INTO Tablo (Alan1, Alan2,...) VALUES (Değer1, Değer2...)

values ifadesinde verilen değerlerin, tablonun yazılan alanlarıyla aynı sırada olması gerekir.

INSERT INTO Siparisler ( KullaniciId, NakliyeUcreti, SiparisTarihi,

SonOdemeTarihi, Adres ) VALUES (1, 3, '20.05.2005', '25.05.2005',

'Beşiktaş Istanbul')

2.2.4. UPDATE

UPDATE sorguları tablolarda varolan kayıtların belirli alanlarının güncellenmesi iĢlemini yapar. Bu sorguda

da tablo, alan ve yeni değerlerin belirtilmesi gerekir.

Sözdizimi:

UPDATE Tablo SET Alan1 = Değer1, Alan2 = Değer2, ...

Bu sorguda dikkat edilmesi gereken en önemli nokta, belli kayıtlarda güncelleme iĢlemi yapılıyorsa where

kriterinin unutulmamasıdır. Aksi halde tablodaki tüm kayıtlar, sorguda belirlenen değerleri alacaktır.

Örnek:

UPDATE Kullanicilar SET ParolaSorusu = 'Yeni Soru', ParolaCevabi = 'Yeni

Cevap' WHERE KullaniciId = 23

2.2.5. DELETE

Tablodan veri silmek için kullanılır. Bu sorguda alan isimleri belirtilmez, ancak where kriterinin unutulmaması

gerekir.

Sözdizimi:

DELETE FROM Tabloİsmi

Örnek:

DELETE FROM Sepetim Where KullaniciId = 12

2.2.6. Aritmetiksel İşlemler

Sorgular sırasında, alanlar üzerinde toplama, çıkarma, çarpma, bölme gibi aritmetiksel iĢlemler yapılabilir. Bu

iĢlemler sabit değerler ile yapılabildiği gibi baĢka alanlardaki değerler ile de yapılabilir.

Örnek: Birim fiyatlarının KDV eklenmiĢ halini gösteren sorgu.

SELECT Urunler.Isim, BirimFiyat * 1.18 AS [KDV Dahil Fiyat] FROM Urunler

SELECT Sum(BirimFiyat) * 1.18 AS [Toplam Ürünler Fiyatı KDV Dâhil] FROM Urunler

94

3. BÖLÜM: VERİTABANI İLE ÇALIŞMAK

Uygulamalardan veritabanına bağlanma için çeĢitli yöntemler vardır. Biz, grafiksel araçları (görsel nesneleri) kullanarak

bağlantı yapacağız. Bu iĢlemi pratik bir örnek üzerinde açıklayalım:

Adres defteri adında yeni bir Windows projesi oluĢturalım. Veri menüsündeki seçeneklerden “veri kaynağını göster” i

seçelim. ġekilden de göründüğü gibi Veri Kaynakları penceresi açılacaktır. Projede henüz veri kaynağı kaydı

olmadığından yeni veri kaynağı ekleme linki görünmektedir.

Bu linke tıklandığında veri kaynağı yapılandırma sihirbazı penceresi açılır. Bu sihirbaz, bir veritabanına bağlantı

yapmamız için gerekli iĢlemleri adım adım karĢımıza getirir. Veritabanı seçeneğini seçerek pencere altındaki Next

düğmesine tıklanır.

1. Adım 2. Adım

2. Adımda Veri kümesi seçilerek Next‟e tıklanır.

3. Adım

3. Adımda Yeni Bağlantı… düğmesine tıklanır.

95

Açılan pencerede, varsayılan veri kaynağı Microsoft Access

Veritabanı Dosyası içindir. DeğiĢtir…düğmesine tıklanarak

aĢağıda da görülen farklı veritabanlarına bağlantı seçeneği

seçilebilir.

4. Adım

Biz uygulamamızda veritabanı olarak Microsoft Access Veritabanı Dosyası kullanacağımızdan, pencerede herhangi bir

değiĢiklik yapmadan Gözat… düğmesine tıklanarak 4. Adımda açılan pencereden, daha önce oluĢturduğumuz veritabanı

dosyasını diskten bularak seçeriz, aç düğmesiyle onaylarız

5. Adım

Böylece tekrar 4. Adımdaki pencereye dönmüĢ oluruz.

Tamam düğmesine tıklayarak 3. Adımdaki

pencereye döneriz. Next düğmesine

tıkladığımızda aĢağıdaki gibi bir uyarı

penceresi gelir.

96

Pencereyi evet butonuna tıklayarak devam

ederiz.

Bu pencereyi de değiĢiklik yapmadan ilerlediğimizde, veritabanındaki tablolardan seçim yapacağımız pencere ekrana

gelir. Ġstediğimiz tablo ya da tabloları seçerek finish butonuyla sihirbazı tamamlamıĢ oluruz. Veri Kaynakları penceremiz

artık aĢağıdaki gibi görünmektedir.

Veritabanı ile ilgili pek çok iĢlemi bu pencere aracılığıyla yaparız. Örneğin, tek satır kod yazmadan verileri form üzerinde

görüntülemek için aĢağıdaki Ģu iĢlem adımlarını uygularız:

Veritabanımızdaki tek tablo olan kiĢiler tablosunu sürükleyip form üzerine bırakalım.

97

Resimden de görüleceği gibi tablodaki verileri gösterecek DataGridView adında çok faydalı bir kontrolün yanında

formun en üstüne yuvalanan BindingNavigatör adında gene çok faydalı bir bar, form alanının altına birer adet DataSet,

BindingSource, TableAdapter ve TableAdapterManager nesneleri otomatik olarak eklenir. Ayrıca aĢağıdaki kodlar da

otomatik olarak eklenir.

Otomatik eklenen ve uygulamalarımızda dakullanacağımız yeni kontrolleri kısaca açıklayalım:

Dataset: Veritabanı dosyasındaki verilerimizin, RAM hafızadaki karĢılığı. Uygulamalarda bağlantısız katmanda

yapacağımız tüm ekleme-silme-güncelleme iĢlemleri hafızada gerçekleĢtirilir ve tableadapter aracılığıyla

güncellenmedikçe gerçek veritabanı dosyasına aktarılmaz ve enerji kesintilerinde kaybolur.

BindingSource: Formumuzun üzerine yerleĢtirdiğimiz ve veritabanına bağlantı içerme özelliği bulunan

(TextBox, ComboBox, ListViev, DataGridViev… gibi) kontrolleri veritabanına bağlamamıza yarayan kontrol.

TableAdapter: Diskte kayıtlı gerçek veritabanı dosyası ile hafızadaki karĢılığı olan DataSet arasında veri

transferi sağlayan kontrol

TableAdapterManager: Birden fazla TableAdapterManager ile çalıĢılıyorsa, hepsini organize eden kontrol

BindingNavigator: Dataset‟e ait, Form üzerinde görüntülenen veriler arasında gezinme, yeni kayıt ekleme, kayıt

silme, kaydı güncelleme iĢlemlerine ait butonları üzerinde bulunduran bir araç çubuğu.

DataGridView: Excel benzeri uygulamalar yapmamıza olanak sağlayan, özellikle DataBase uygulmalarında

çok çeĢitli özellikleriyle uygulamaları zenginleĢtiren bir kontrol.

98

KiĢilerDataGridView nesnesinin Dock özelliğini Fill olark ayarlayıp programı çalıĢtıralım.

Resimden de görüleceği gibi hiç kod yazmadan verileri form üzerindeki bir tabloda görüntüleyebiliyoruz. Ayrıca

BindingNavigator aracılığıyla tablodaki veriler arasında gezinip, tabloya veri ekleyip, tablodan veri silip, değiĢiklikleri

kaydedebiliyoruz.

KiĢilerDataGridView kontrolü, varsayılan ayarlarla ekrana gelmiĢtir. Diğer kontrollerde olduğu gibi, bu kontrolün de pek

çok özelleĢtirme seçenekleri vardır. Sütun baĢlıklarını değiĢtirmek, bazı sütunların görünümünü değiĢtirmek… gibi

özelleĢtirmeler için, diğer pek çok kontrolde de olan, kontrolün sağ üst köĢesindeki oku tıklarız.

Bu pencerede Edit Columns tıklandığında veritabanı kolonlarını düzenleyebileceğimiz aĢağıdaki sayfa açılır.

99

Veritabanı dosyamızdaki KiĢiler tablosundaki KiĢi_ID sütunu, sadece birincil anahtarı tutan ve benzersiz bir alan

sağlayan otomatik sayı bilgisini tuttuğundan, bu sütunun form üzerinde görüntülenmesi gereksizdir. Bu nedenle Selected

Columns kısmından bu alanı seçip, alttaki Remove butonuna tıklayınca bu alan artık KiĢilerDataGridView tablosunda

görüntülenmez. Diğer alanlarda düzenleme gerekiyorsa yapıp, OK butonuna tıklayarak düzenleme penceresini kapatırız.

3.1. Tablodan özel veri çekmek için sorgu çalıştırmak

Bu noktaya gelene kadar yapılan iĢlemler, tablodaki tüm kayıtları ekranda gösterir. Ancak çoğu zaman belli kriterlere

göre filtre edilmiĢ verileri ekranda görmek isteriz. Bunun için tabloya sorgu ekleme iĢlemini aĢağıdaki gibi

gerçekleĢtiririz.

KiĢilerTableAdapter nesnesinin sağ üst köĢesindeki oku tıklayarak açılan menüden Sorgu ekle…linkine tıklarız

Açılan pencerede Yeni Sorgu Adını FillByAdaGöre yazar ve Sorgu OluĢturucu düğmesine tıklarız.

Açılan yeni pencere, sorgu cümlesi düzenleyeceğimiz araçlar sağlar. Varsayılan sorgu cümlesi, tüm veri

alanlarındaki tüm verileri getiren aĢağıdaki cümledir.

SELECT [Kişi_ID], Soyadı, Adı, [E-postaAdresi], Telefon, Adres, Şehir,

DogumTarihi FROM Kişiler

Bu cümlenin sonuna ; WHERE Adı = ? yazarak pencereleri onaylayıp kapattığımızda,

formumuzun üstüne (BindingNavigator‟un altına) bir araç çubuğu eklenir. Bu çubuk üzerinde bir Label (Text

özelliği Adı olan), bir textbox (text özelliği boĢ), ve bir button (text özelliği FillByAdaGöre) vardır.

Butona çift tıklayıp kod sayfasına gittiğimizde, aĢağıdaki gibi bir kod kümesinin otomatik olarak

eklendiğini görürüz.

Private Sub FillByAdaGöreToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FillByAdaGöreToolStripButton.Click Try Me.KişilerTableAdapter.FillByAdaGöre(Me.AdresDefteriDataSet.Kişiler, AdıToolStripTextBox.Text)

Catch ex As System.Exception System.Windows.Forms.MessageBox.Show(ex.Message) End Try End Sub

Butonun Text özelliği olan FillByAdaGöre yazısını daha anlamlı olan Ada göre filtrele yazısıyla

değiĢtirip programı çalıĢtıralım

100

Textbox kutusuna veritabanındaki isimlerden birini (örneğin YAHYA) yazıp ada göre filtrele butonuna

tıklayalım.

Görüldüğü gibi yazılan kritere göre filtreleme

yapılarak tablo tekrar dolduruldu.

Veritabanıyla iletiĢim kurmanın bir baĢka yolu da BindingSource nesnesini kullanmaktır.

3.2. Bindingsource

BindingSource nesnesi tablolardaki alanları form üzerindeki nesneler ile iliskilendirmek için kullanılır.

TableAdapter, hangi tablodan veri çekilecegini belirtir. Dataset ise hangi database den veri çekilecegini belirtir.

dim bs as BindingSource

bs=new BindingSource

ġeklinde oluĢturulup kaynak tanımlanabilir;(Örneğin bir dataset'i kaynak gösterelim)

bs.datasource=AdresDefteriDataSet

bs.datamember="Kişiler"

Yukarıdaki tanımlamayı aĢağıdaki gibi tek satırda da yapabiliriz:

dim bs as new bindingsource(AdresDefteriDataSet, " Kişiler ")

3.2.1. BindingSource metotları:

BindingSource "Current" Methodu:

BindingSource' un current methodu; Üzerinde bulunulan mevcut satırı iĢaret eder, yani o an, hangi datarow

aktifse, ya da kendine liste olarak seçtiği kaynağın hangi satırı seçiliyse o satırı anlatır.

bs.current("Adı") ‘bize Adı sütununun değerini döndürür.

sütunların indexleri ile de o sütunun değerine aĢağıdaki gibi ulaĢılabilinir:

bs.current(3)

BindingSource "Count" Methodu:

bs.count tablodaki satır sayısını döndürür.

101

BindingSource "AddNew" Methodu:

Veritabanına yeni bir satır eklemek için kullanılır;

bs.AddNew ‘düzenlemeye hazır yeni bir satır.(satır henüz dataset

üzerinde değildir)

BindingSource "EndEdit" Methodu:

Bu yöntem, bindingsource‟ un listesinde yapılan değiĢikliklerin dataset'e iletilip dataset bazında

kaydedilmesini sağlar. Satır düzenleme bittiğinde endedit kullanmak gerekir.

BindingSource "Filter" Methodu:

Ekranda listelenen veriler üzerinde filtreleme yapar.

bs.filter="sütun1='ahmet' and sütun2=123"

BindingSource "Find" Methodu:

Bu yöntem de arama, bulma iĢlemleri yapar ancak geriye dönen değer aranan değerin kendisi değil bilginin

bulunduğu satırın satır numarasıdır. (integer tipinde bir değer)

bs.find("sütun adı",değer) ‘şeklinde kullanılır

3.2.2. BindingSource 'ta Navigasyon(Gezinme işlemleri)

bs.movefirst ‘ilk kayıta gider

bs.movelast ‘son kayıta gider

bs.movenext ‘bir sonraki satır

bs.moveprevious ‘bir önceki satır

3.2.3. BindingSource "Position" yöntemi

posiziton yöntemi hem 'get' hemde 'set' özelliklidir yani bindingsource‟u istediğimiz satıra gönderebilir,

hem de bulunduğu satırı öğrenebiliriz, (integer tipinde bir değer döndürür)

bs.position=3 ‘3.Satıra gider

dim a as integer=bs.position ‘a değeri 3 olarak bize bulunduğu satır indexini döndürür.

yukarıda bahsedilmiĢ olan find methodu iĢte burada iĢe yaramaktadır;

bs.position=bs.find("sütunadı",değer)’Ģeklinde kullanıldığı zaman artık current

methoduyla bulmuĢ olduğumuz satırdan sadece aradığımız sütun değerlerini değil diğer tüm sütunlarında o

satırdaki değerlerini alabiliriz

3.2.4. BindingSource'ta index kullanımı:

bs(4)("yaşı") ‘bu örnek bize 4.satırdaki 'yaĢı' isimli sütunun değerini döndürür.

find methodunun kullanım alanlarından biri de burada ortaya çıkar:

dim a as string=bs(bs.find("sütun adı",değer)).tostring ’bu ifade istediğimiz

ifadeyi arayıp ,bize döndüren tek satırlık bir ifadedir .

102

3.2.5. BindingSource "RemoveCurrent" Yöntemi:

Üzerinde bulunulan mevcut satırı silebiliyoruz (Bellekten)

3.2.6. BindingSource "RemoveFilter" Yöntemi:

Daha önce "Filter" yöntemi ile filtrelenen kayıttan tüm filtreleri temizleyip listesini orijinal hale döndürür.

3.2.7. BindingSource "Sort" ve "RemoveSort" Yöntemleri:

sort sıralama yapar ve removesort bu sıralamyı iptal eder:

bs.sort="sütunadı desc" ‘sütunadı alanı sıralandı

bs.removesort ‘sıralama iptal edildi.

3.3. Tabloya yeni kayıt ekleme silme düzenleme

Her ne kadar “Veri Kaynakları” sekmesinden çalıĢma alanına sürükle-bırak yöntemiyle form üzerinde

oluĢturulan bir veri bağlantılı kontrolle birlikte otomatik olarak oluĢan BingNavigator nesnesi üzeindeki çeĢitli

butonlar bu amaçla pek çok iĢlevi yerine getirse de, bazen programcılar kendi araç çubuklarını kullanarak

veritabanı üzerinde iĢlem yapan kodları düzenlemek isterler. Bu nedenle, baĢlıkta verilen iĢlemleri yapan

kodları bilmek gerekir. AĢağıda açıklanan kodlar, bizim de uyguladığımız Adres Defteri uygulamasındaki

veritabanı nesnelerine aittir.

Değişiklikleri iptal etmek: DataSet üzerinde yapılmıĢ ama henüz veritabanına aktarılmamıĢ

değiĢiklikleri iptal etmek isteyebiliriz. Bu iĢi yapan kod:

AdresDefteriDataset.RejectChanges

Kodu daha fonksiyonel hale getirelim: DataSet‟te herhangi bir değiĢiklik varsa değiĢiklik yapılsın, değiĢiklik

yoksa kullanıcıya, veritabanı tablosunda hiçbir değiĢiklik yapılmadığı mesajını veren kodlar:

If AdresDefteriDataset.HasChanges Then AdresDefteriDataset.RejectChanges() lblmesaj.Text = "Değişiklikler İptal Edildi" Else lblmesaj.Text = "Yapılmış Bir Değişiklik Yok " End If

Seçili kaydı silmek:

If KişilerBindingSource.Position >= 0 Then KişilerBindingSource.RemoveAt(KişilerBindingSource.Position) lblmesaj.Text = "Kayıt Silindi." Else MsgBox("Silinecek Kayıt Yok") End If

Yeni kayıt eklemek: Bu kod, DataSet‟e, boĢ bir satır ekler. Hemen arkasından alanlara veri girip

kaydedilir.

KişilerBindingSource.AddNew()

103

Kaydetmek: Bu kodlar, DataSet üzerindeki verileri, veritabanı dosyasına kaydeder.

KişilerBindingSource.EndEdit() 'BindingSource'daki düzenleme modunu sonlandırıp gerçekleşen değişiklikleri DataSet'e aktarır

KişilerTableAdapter.Update(Me.AdresDefteriDataSet.Kişiler) lblmesaj.Text = "Kayıt Gerçekleşti"

Veritabanına yeni bilgileri kod ile girmek:

Form üzerindeki bindingsource nesnesi ile veritabanına bağlı kontroller aracılığıyla veri girmek oldukça

kolaydır ama bazen kod ile veri girmek gerekebilir. Bunu bir yolu aĢağıdaki gibidir:

Dim yenikayit As DataRow yenikayit = AdresDefteriDataSet.Kişiler.NewRow yenikayit.Item("Adı") = “Ahmet” yenikayit.Item("Soyadı") = “Mete”

… AdresDefteriDataSet.Kişiler.Rows.Add(yenikayit) KişilerTableAdapter.Update(AdresDefteriDataSet.Kişiler)

4. BÖLÜM: VISUAL BASIC .NET İLE RAPORLAMA

Günümüzdeki uygulamaların birçoğu veritabanı kullanılmasını gerektiren, çok fazla verinin kullanıldığı

programlardır. Bu verilerin görüntülenmesi, bir sonuç raporu oluĢturulması, veriye uygun grafik çizdirilmesi

hiç süphesizki, uygulamanın temel taĢlarından, olmazsa olmazlarından birisidir.

Basit bir sekilde, temel form elemanlarını (Button, TextBox, ListBox vs.) kullanarak veriler sorgular

kullanılarak değiĢik yöntemlerle formlarda görüntülenip rapor sunulabilir. Fakat profesyonel bir programda

uzman bir raporlama sistemi, istenen ilk bileĢendir.

Bu amaçla kullanılan araçlardan biri de Crystal Reports‟tur. Crystal Reports ile raporlamanın pek çok faydası

vardır. Crystal Reports For Visual Studio.Net ile;

Hızlı rapor oluĢturulabilir.

Normal raporlardan karmaĢık raporlara kadar tüm raporlar oluĢturulabilir.

Raporların Web desteği oldugundan dolayı Web uygulamalarında da sorunsuz kullanılabilir.

Veriler hem grafik hem de düz tablo biçiminde gösterilebilir.

Olusturulan raporlar porgramlama destegi ile .PDF, .DOC, .XLS ve .RTF formatlarına export edilebilir.

Bu raporlama aracının kullanımını, veritabanı konusunda yaptığımız Adres Defteri uygulamasındaki tek

tablomuz olan KiĢiler tablosunu raporlama üzerinde anlatalım:

AdresDefteri Projemize, Proje menüsü altında Yeni Öğe Ekle…

menü öğesini tıklayarak açılan pencerede Reporting altında bulunan

“Crystal Reports” seçeneğini seçerek bir rapor nesnesi ekleyelim.

(rapor nesnesinin varsayılan adı CrystalReport1 olup istenirse bu isim

değiĢtirilebilir)

Açılan ilk pencerede raporu nasıl oluĢturmak istediğimizi soran

seçenekler içinden Rapor sihirbazı seçeneğiyle, ardıĢıl pencereler

aracılığıyla rapor oluĢturulabilir ancak biz, bütün ayarlarını

kendimizin yapacağı “BoĢ Rapor Olarak” seçeneğini seçerek devam

edelim.

104

Sol kenarda, sadece crystal reports düzenlenirken kullanılacak araç çubuğunda, aĢağıdaki kontroller bulunur:

Rapor üstbilgisi kısmında bir metin nesnesi oluĢturup içine uygun bir ifade yazalım (Örneğin: ADRES

DEFTERİM gibi)

Crystal reports ile rapor düzenlerken kullanılacak araç çubuklarını eklemek için aĢağıdaki resimden

yararlanabilirsiniz.

105

Crystal Reports – Ana araç çubuğundan yararlanarak rapor üstbilgisini düzenleyebilirsiniz. (Yazı tipi, boyutu,

kalın, italik, ortala…v.b.)

ġu ana kadar hazırladığımız Crystal Reports nesnesini henüz hiçbir veritabanı nesnesiyle iliĢkilendirmedik.

Bunu yapmak için Alan Gezgini penceresinde bulunan

Veritabanı Alanları seçeneğine sağ tıklayıp açılan

pencereden Veritabanı Uzmanı’nı seçeriz.

Açılan pencereden, projemizde tanımlı DataSet ve tablo ya da tabloları seçeriz

a- Projemizde tanımlı DataSet ve tablo b- Bu tablolardan, raporda kullanmak için seçimimiz.

Bu iĢlemden sonra artık eklediğimiz tabl ya da tabloların alanlarını raporumuzda kullanabiliriz

Raporumuzda görünmesini istediğimiz veritabanı alanlarını sürükleyip Ayrıntılar

kısmına bırakarak çok hızlı bir Ģekilde raporumuzu tasarlayabiliriz. Bunu

yaptığımızda, alan adlarının otomatik olarak sayfa üst bilgisi olarak etiketlendiğini

görürüz. Bu yazıları, istersek değiĢtirebiliriz.

Rapor alt bilgisi ve (veya) sayfa altbilgisi kısımlarına da istediğimiz yazıları yazdırabiliriz. Bu amaçla özel

alanlar kısmından çeĢitli hazır alanları kullanabiliriz. Sayfa altbilgisi kısmına

sayfa numarasını, Rapor Altbilgisi kısmına toplam sayfa sayısını yazdıralım.

OluĢturduğumuz rapor, AdresDefteri veritabanı dosyasındaki KiĢiler Tablosundaki Tüm kayıtların tasarımla

belirlediğimiz alanlarını raporlamak için yeterlidir.

106

Raporu görüntülemek için projemize CrystalReportViewer nesnesi eklememiz gerekir. Bu nesneyi bir form

üzerine yerleĢtirebiliriz. Bu nedenle projemize adı Rapor olan yeni bir form ekleyip, bir CrystalReportViewer

sürükleyip forma bırakalım. Eklenen CrystalReportViewer1 varsayılan isimli nesne, formumuzun içini

tümüyle kaplar (Dock özelliği Fill olur). CrystalReportViewer1 kontrolünün sağ üst köĢesindeki oku tıklayarak

buradan “Bir Crystal Report Seç” linkine tıklayarak gelen penceredeki açılır liste kutusundan daha önce

oluĢturduğumuz CrystalReport1 seçeneğini seçer ve tamam düğmesiyle onaylarız.

Projemizden bu rapor sayfasına ulaĢmak için bir menü tasarlıyalım. (Aynı Ģey, bir araç çubuğundan da

yapılabilir)

Menüdeki Rapor seçeneğine tıklandığında çalıĢacak kodları aĢağıdaki gibi

yazalım. Daha sonra programı çalıĢtırıp raporu çağırdığımızda sayfa altındaki gibi

görünür.

Private Sub RaporToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RaporToolStripMenuItem.Click Dim RptAdresDefteri As New CrystalReport1 RptAdresDefteri.SetDataSource(AdresDefteriDataSet.Tables("Kişiler")) Dim FrmRapor As New Rapor FrmRapor.CrystalReportViewer1.ReportSource = RptAdresDefteri FrmRapor.Show() End Sub

107

5. BÖLÜM: SERİ İLETİŞİM

Veri iletiĢimi temelde A noktasındaki bir veriyi hatasız bir Ģekilde B noktasına aktarma iĢlemidir. Buna tek

yollu veri iletiĢimi denir. Eğer B noktası da A noktasına veri gönderebiliyorsa buna da iki yollu veri iletiĢimi

denir. Veri iletiĢimi, seri ve paralel olmak üzere iki Ģekilde gerçekleĢtirilebilir. Bu ders notunda sadece seri veri

aktarma üzerinde durulacaktır.

Seri iletiĢim; gönderilecek ve alınacak olan verinin tek bir hat üzerinden (gönderme iĢlemi için bir hat, alma

iĢlemi için ayrı bir hat) bit‟lerin belli bir protokol esasına göre gönderilmesi veya alınması iĢlemidir. Paralel

iletiĢime göre daha yavaĢ gerçekleĢse de, donanımlarının daha basit olması ve paralel iletiĢimde fazlaca

kullanılan pin sayısının (dolayısıyla veriyi aktaracak iletken hat sayısının) azalması avantajlarından dolayı

yaygın bir kullanım alanı vardır. Bu avantajlarına karĢın seri haberleĢmede yazılım daha zordur. Seri hattan

gelen datayı hatasız olarak alıp tekrar paralele dönüĢtürmek gerekir.

Seri haberleĢme, senkron ve asenkron olmak üzere iki yöntemle gerçekleĢtirilir. Senkron iletiĢimde bir veri

bloğu, saat palsleri ile senkronize edilerek iletilirken, asenkron iletiĢimde bir byte‟lık veri, belirlenmiĢ zaman

dilimlerinde bit‟ler halinde iletilir.

Her iki iletiĢim yöntemi de donanım desteği olmadan sadece yazılımla gerçekleĢtirilebildiği gibi,

donanımsal destekle de gerçekleĢtirilebilir. Ġster senkron ister asenkron yöntem kullanılsın, donanım desteği

olmadan yapılan seri iletiĢim yöntemine SFR‟siz (Special Function Register) seri iletiĢimi denir. Bu yöntemle

yapılan seri veri iletiĢiminde yazılım zor ve uzun olacaktır. Bu nedenle seri haberleĢmenin kolay

gerçekleĢtirilmesi için donanım modülü desteği olan mikrodenetleyici (16F628A, 16F877A…) kullanmak

gerekir.

5.1. ASENKRON SERİ İLETİŞİM ÖZELLİKLERİ

RS232 standardı, cihaz / Sistemlerin seri haberleĢmesinde kullanılan standart bir arabirimdir. BaĢlangıçta bu

standart, yazıcı ve telgraf cihazları için tanımlanıp kullanılırken, 1987‟de geliĢtirilen yeni versiyonuyla pek çok

cihaz ve sistemin haberleĢmesinde kullanılmaya baĢlanmıĢtır. Birçok bilgisayar üzerinde bir veya daha fazla

seri port, RS232C standardının bir bileĢeni olarak kullanılır.

RS232C standardı, aĢağıdaki elektriksel parametrelere sahiptir.

LOJĠK 0 değeri (+3V) – (+25V) arasında (“space”)

LOJĠK 1 değeri (-3V) – (-25V) arasında (“Mark”)

(-3V) – (+3V) arasındaki bölge tanımsızdır.

Bir açıkdevre voltajı toprağa göre asla 25V‟u geçmemelidir.

Kısa devre akımı asla 500 mA akım değerini aĢmamalıdır.

Bunlar dıĢında; hat kapasitansları, maksimum haberleĢme hızları (max baud rate) gibi daha pek çok özellik,

standartlar halinde belirlenmiĢtir.

5.2. SFR’SİZ SERİ İLETİŞİM

Mikrodenetleyicinin donanım modülleri (USART, SPI, I2C) kullanılmadan yalnızca yazılım ile yapılan iletiĢim

metodudur. Bu yöntemin avantajı, donanım modüllerinin kullanacağı pinleri kullanma zorunluluğu

olmamasıdır. Ayrıca donanım desteği olmayan denetleyiciler ile seri haberleĢme yapılmak istendiğinde bu

yöntemin uygulanması zorunludur. Programcının seri haberleĢme kural ve protokollerini çok iyi bilme

gerekliliği ise dezavantajıdır. Ayrıca yazılımda yapılması istenen iĢlerin zamanlamasında problem yaĢanabilir.

Donanım (USART, MSSP) modülü kullanılarak yapılan seri haberleĢmede zaman gecikmesi yaĢanmaz.

108

5.3. RS232 SEVİYE ÇEVİRİCİSİ

Pek çok dijital sistem, TTL veya CMOS lojik seviyelerde çalıĢmaktadır. Bu cihazların RS232 portuna

bağlanması için 0 – 5 volt gerilim değerlerinin RS232 seviyelerine dönüĢtürülmesi gerekir. Bu amaç için

tasarlanmıĢ entegre devre çözümleri vardır. Bunlardan en çok kullanılanlarından biri; Maxim Semicondictor

firmasının sürücü entegresi olan MAX232‟dir. Bu entegre, TTL Lojik 0 (0 Volt) seviyeyi +10 Volta, Lojik 1

(+5 Volt) seviyeyi de -10 Volt‟a dönüĢtürür.

MAX232 entegresi iki seri haberleĢme kanalını destekler. (2 verici ve 2 alıcı kanala sahiptir) ayrıca

tiplerine göre harici olarak bağlanması gereken elektrolitik kondansatöre gereksinim duyar.

5.4. DONANIM ÖZELLİKLERİ

Cihazlar arası seri haberleĢmede iki tür kategoride seri kablolar kullanılır. Veri haberleĢme gereçleri (Data

Communications Equipment: DCE) ve veri terminal gereçleri (Data Terminal Equipment: DTE)

DTE; PC veya terminal iken, DCE‟ler; modem, plotter gibi cihazlardır. Buna göre PIC ile PC arasındaki seri

haberleĢmede PIC kartı bir DCE cihazdır.

DTE‟den DCE‟ye olan iletiĢim hızı, “terminal hızı” olarak adlandırılır ve iki modem arasındaki hat hızı (Line

Speed) olarak bilinen DCE-DCE arasındaki hızdan daha hızlı olmalıdır.

DTE – DCE arası veri akıĢ kontrolü; donanım ve yazılım kontrolü olarak iki Ģekilde yapılır. Yazılım akıĢ

kontrolü, XON / XOFF karakterleri ile yapılır XON karakteri ASCII 17 ve XOFF karakteri ASCII 19 ile gösterilir.

Bir gönderme ve alma iĢleminde bilgisayar tamponu (buffer) dolduğunda modem, bilgisayara XOFF iĢareti

göndererek veri gönderme iĢlemini durdurmasını ister. Modemde bir oda boĢalır boĢalmaz bilgisayara XON

iĢareti göndererek bilgisayardan yeniden veri göndermesini talep eder. Bu tip kontrol, karakter gönderme (TxD)

ve alma (RxD) hatlarınd daha fazla kablo gerektirmemesi avantajına sahiptir.

Donanım akıĢ kontrolü, RTS (Request To Send) / CTS (Clear To Send) akıĢ kontrolü olarak bilinir. Veri; TxD

ve RxD hatları tarafından gönderilir ve alınır. Böylece donanım akıĢ kontrolü XON ve XOFF „ta olduğu gibi

gönderme zamanlarını yavaĢlatmaz. Bilgisayar veri göndermek istediğinde RTS hattı aktiftir. Eğer modem bu

veriyi tutacak odalara sahipse CTS‟yi aktif hale getirerek cevap verir ve bilgisayar veri göndermeye baĢlar.

Modem bilgisayarın gönderdiği veriyi tutacak hafıza alanına sahip değilse, CTS göndermez. Böylece bilgisayar

modeme veri gönderemez.

5.5. SERİ HABERLEŞME PORTLARI

Seri portlar iki veya üç farklı tür ve boyutta bulunmaktadır. DB-9, DB-25 VE RJ-45 (Registered Jack 45)

RJ-45 daha çok telefon ve network (ağ) kablosu olarak kullanılmaktadır. Özel durumlarda seri bağlantı için de

kullanılabilir.

109

DB-9 DB-25 RJ-45

Bu konektör PC üzerinde erkek

(male) soket türünde olduğu için PIC

kartı üzerinde bunun tersi olan diĢi

(female) soket bulunmalıdır. Erkek ve

diĢi soketlerin "ayna görünümünde"

olduğuna dikkat ediniz.

D-Tipi 25 pin No. D-Tipi 9 pin No. Kısaltma Adı

Pin 2 Pin 3 TD Transmit Data ( Veri Gönder )

Pin 3 Pin 2 RD Receive Data ( Veri Al )

Pin 4 Pin 7 RTS Request To Send ( Gönderme Ġsteği )

Pin 5 Pin 8 CTS Clear To Send (Göndermeye Müsait )

Pin 6 Pin 6 DSR Data Set Ready ( Veri Paketi Hazır )

Pin 7 Pin 5 SG Signal Ground ( Sinyal Topraklama )

Pin 8 Pin 1 CD Carrier Detect ( TaĢıyıcı Tanımlandı)

Pin20 Pin 4 DTR Data Terminal Ready ( Veri Terminali Hazır )

Pin 22 Pin 9 RI Ring Indicator ( Çevrim Göstergesi )

5.5.1. Pin Fonksiyonları

Kısaltma Adı Fonksiyonu

TD Transmit Data Seri Veri ÇıkıĢı (TxD)

RD Receive Data Seri Veri GiriĢi (RxD)

CTS Clear To Send Bu hat seri portun veriyi göndermek için hazır olup olmadığını belirler.

DCD Data Carrier Detect Seri port telefon hattının diğer ucundaki portta bir taĢıyıcı (Carrier) tespit

ettiğinde hat aktif olur.

DSR Data Set Ready UART‟a modemin bağlantı için hazır olduğunu belirtir.

DTR Data Terminal

Ready

DSR‟nin tersini yapar. Modeme UART‟ın bağlantı için hazır olduğunu

belirtir.

RTS Request To Send Modeme, UART‟ın veriyi göndermek için hazır olduğunu belirtir.

RI Ring Indicator Modem, PSTN‟den bir çevrim sinyali tespit ettiğinde aktif duruma geçer. Uygulamalarımızda, db-9 konnektör ve PIC – PC arasında seri haberleĢme için TXD, RXD VE SG pinlerini

kullanılacaktır.

PC‟den herhangi bir veri gönderildiğinde DB-9 konnektörünün TxD pini tarafından MAX232 entegresinin R1IN

(ya da R2IN hangi bacağı kullanılmıĢsa. Burada 1 nolu giriĢ ve çıkıĢ kullanıldığı varsayılıyor.) pinine uygulanır.

Ardından lojik seviye düzenlemesi yapılarak MAX232 R1OUT çıkıĢı yoluyla 16F877‟nin RX giriĢine

(RC7/RX/DT; 26 Nolu Pin) uygulanır. Benzer Ģekilde PIC kartından PC‟ye veri göndermek için PIC TX pini

(RC6/TX/CK; 25 Nolu Pin) tarafından herhangi bir veri MAX232‟nin T1IN giriĢine uygulanır. RS232 seviye

dönüĢümünden sonra T1OUT çıkıĢı üzerinden DB-9 soketi 2 nolu Pin (RxD) üzerinden PC Com portuna

uygulanır. Hem PIC hem de PC tarafındaki her bir DB-9 konnektörünün 5 nolu SG (Signal Ground) pini Ģaseye

bağlanır.

110

5.6. RS232 ASENKRON SERİ İLETİŞİM VE DALGA FORMLARI

Bu iletiĢim yönteminde gönderilen verinin baĢında START, sonunda STOP biti bulunmaktadır.

Start (baĢlangıç) biti, bilginin gönderilmeye baĢlandığını alıcı tarafa bildirmek için kullanılır. Stop biti de benzer Ģekilde

karakterin aktarılmasının tamamlandığını belirtir.

Start ve stop bitleri iletiĢim hızını senkron seri haberleĢmeye nazaran biraz düĢürdüğü halde daha az iletim hattı

kullanıldığı için asenkron seri haberleĢme pek çok sistemde yaygın olarak kullanılmaktadır. (klavye, fare, modem…)

asenkron veri iletiĢiminde karakterler ortak bir kod ile gönderilirler. Bu kod genellikle ASCII koddur. ASCII kodunda

start ve stop biti ilave edilip gönderilen 1 byte (8 bit) lık verinin dalga formu ve gönderiliĢ sırası aĢağıdaki gibidir.

DATA

START BİTİ BİT 0 BİT 1 BİT 2 BİT 3 BİT 4 BİT 5 BİT 6 BİT 7 STOP BİTİ

0 0 1 1 0 0 1 1 0

Hattan bilgi gönderilmediği sürece hat sürekli “1” seviyesinde tutulmaktadır. Bir karakterin gönderilmeye

baĢlanması (Start) bir “0” biti gönderilerek karĢı tarafa bildirilir. Start bitinin hemen ardından gelen 8 bit, verinin

kendisini oluĢturur. Veri gönderilirken önce LSB bitinden baĢlanır. 8 bitlik veri paketinin gönderilmesi bitince bir bit “1”

seviyesinde stop biti gönderilir. Hat, yeni bir bilgi gelene kadar “Lojik 1” seviyesinde kalır. Bu iĢlemler, her bir

karakterlik veri aktarımında tekrarlanır.

Asenkron seri veri iletiĢiminin temel özellikleri Ģunlardır:

1- Transfer edilecek veriler karakter bazında yapılır.

2- Gönderilecek her bir karakter verinin baĢlangıç ve bitiĢinde START ve STOP bitleri bulunmalıdır.

3- KarĢılıklı olarak haberleĢecek cihazların iletiĢim parametreleri (iletiĢim protokolleri; hız, kodlama seti…) aynı

olmalıdır.

Yukarıdaki zaman diyagramında PIC tarafından gönderilen ya da alınan iĢaretlerin lojik seviyeleri ve kullanılan 8N1

protokolü (formatı) görülmektedir.

Bu formatın anlamı; 8 Data biti, Parity (hata tesbit) biti yok (No Parity) ve 1 stop biti.

START + LSB + ……………………. + MSB + STOP

5.7. USART (UNİVERSAL SYNCRONOUS / ASYNCRONOUS RECEİVER /

TRANSMİTTER) Modülü Ve Özellikleri

USART modül, verilerin senkron veya asenkron seri iletiĢimi için kullanılan belli bir protokol dahilinde iĢlem yapan bir

birimdir. Bu modül, seri giriĢ ve seri çıkıĢ biriminden oluĢmaktadır. Bu modül aynı zamanda SCI (Serial Communication

Interface) olarak da bilinir.

USART modülünün yapılandırılması ve iĢletilmesi, birkaç SFR yazmacı tarafından kontrol edilir. Bunlar;

RCSTA (ReCeive STAtus and control register)

TXSTA (Transmit STAtus and control register)

SPBRG (Baud Rate Genarator control register)

PIR1 (Peripheral Interrupt Register 1)

Bunun yanında PIC16F877A mikrodenetleyicisi için iki seri port pini;

TX: (RC6; PORTC 6. Pin: veri gönderme)

RX: (RC7; PORTC 7. Pin: Veri alma)

veri gönderme ve alma amacıyla kullanılır.

USART modülünü ve RC6 ile RC7 pinlerini kullanarak seri haberleĢme yapabilmek için RCSTA yazmacının 7. Biti

(SPEN: Serial Port Enable) set edilmeli ve TRISC aracılığıyla RC6 çıkıĢ, RC7 ise giriĢ olarak yönlendirilmelidir.

111

5.8. ÖZEL YAZMAÇLAR VE BİTLERİ

5.8.1. TXSTA YAZMACI

USART biriminin senkron ve asenkron veri gönderme modunda çalıĢmasındaki koĢulları belirleme bit‟lerinin

bulunduğu özel amaçlı registerdir. Saklayıcı içerisinde ayrıca veri gönderme modunun durum bitleri de bulunmaktadır.

AĢağıda bu saklayıcının bitleri ve görevleri açıklanmıĢtır:

R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R-1 R/W-0

CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D

bit 7 6 5 4 3 2 1 bit 0 CSRC : Senkron modda, (1: Master, 0: Slave)

TX9 : ĠletiĢim modu seçme biti (1: 9 Bitlik ĠletiĢim, 0: 8 Bitlik ĠletiĢim)

TXEN : Transfere izin verme biti (1: Transfere izin ver, 0: Transfere izin verme)

SYNC : 1: Senkron mod, 0: Asenkron mod

BRGH : Hızlı/yavaĢ boudrate seçme biti (1: Hızlı mod, 0: YavaĢ mod)

TRMT: Ġletim kaydedicisi boĢ/dolu biti (1: Dolu, 0: BoĢ)

TX9D : 9 bitlik modda parity veya 9. bit

5.8.2. RCSTA YAZMACI

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R-0 R-0 R-X

SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

bit 7 6 5 4 3 2 1 bit 0 SPEN : 1: Seri port açık, 0: Seri port kapalı

RX9 : Alım modu seçme biti (1: 9 bitlik iletiĢim, 0: 8 bitlik iletiĢim)

SREN :Senkron modda (1: Tek alım açık, 0: Tek alım kapalı)

CREN :Asenkron modda (1: Devamlı almaya izin ver, 0: Devamlı almaya izin verme)

Senkron modda (1: CREN sıfırlanıncaya kadar alıma izin ver, 0: Almayı kes)

ADDEN: Asenkron modda RX9=1 ise (1: 8bit yüklemede kesmeye git, 0: 9. bit parity olarak kullanılabilir)

FERR :Alımda hata algılaması biti (1: Hata var, 0: Hata yok)

OERR :Üst üste yazım hatası kontrolü (1: Hata var, 0: Hata yok)

RX9D :9 bitlik modda parity veya 9. bit

5.9. USART iletişim hızı (BRG: Baud Rate Generator)

USART modülünün hem senkron hem de asenkron modunda çalıĢmasındaki veri transfer hızını belirler. Bit / Saniye

olarak ifade edilen seri iletiĢim hızına Baud oranı (Baud Rate) adı verilir. Örneğin 1 bitin gönderilme süresi 104,166µsn

ise baud rate 1𝑠𝑛

104,166µ𝑠𝑛= 9600 𝑏𝑎𝑢𝑑 olur. Yani 1 saniyede 9600 bit transfer edilir demektir.

Seri iletiĢim baud oranları; 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200 olarak çeĢitli değerlerdedir.

BRG; 8 bit bir zamanlayıcı üretecidir. SPBRG yazmacıyla kontrol edilir. Buna göre BRG; 0-255 arasında (0-FFh)

değerler alır. Asenkron moda BRGH (TXSTA Registeri 2. Bit) sinyal hızının modunu (yüksek veya düĢük hız) belirler.

Yüksek hızda BRGH=1, alçak hızda BRGH=0 yapılır. BRGH saklayıcısına herhangi bir değer yazıldığında BRG

zamanlayıcı resetlenir.

PIC‟in clock hızına ve SPBRG saklayıcısı değerine bağlı olarak Baud Rate, tablodaki formüllerle hesaplanabilir.

MOD DÜġÜK HIZ (BRGH=0) YÜKSEK HIZ (BRGH=1)

ASENKRON (SYNC=0) 𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒 =𝐹𝑜𝑠𝑐

64(𝑋 + 1) 𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒 =

𝐹𝑜𝑠𝑐

16(𝑋 + 1)

SENKRON (SYNC=1) 𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒 =𝐹𝑜𝑠𝑐

4(𝑋 + 1)

Fosc: PIC saat sinyal frekansı (Hz cinsinden)

X: SPBRG saklayıcı içindeki değer (0 – 255 arasında)

112

Baud oranı bilinince SPBRG yazmacına yüklenecek sayı da aĢağıdaki formüllerle bulunabilir:

MOD DÜġÜK HIZ (BRGH=0) YÜKSEK HIZ (BRGH=1)

ASENKRON (SYNC=0) 𝑋 =𝐹𝑜𝑠𝑐

𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 64− 1 𝑋 =

𝐹𝑜𝑠𝑐

𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 16− 1

SENKRON (SYNC=1) 𝑋 =𝐹𝑜𝑠𝑐

𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 4− 1

ÖRNEK: 4 MHz‟lik saat sinyaliyle çalıĢan bir PIC‟in asenkron seri iletiĢim modunda 2400 Baud Rate hızı ile veri iletmek

için yüksek hız modunda (BRGH=1) SPBRG yazmacına yazılması gereken değer ne olmalıdır?

𝑋 =𝐹𝑜𝑠𝑐

𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 16− 1 =

4. 106

2400.16− 1 = 103,16 → 𝑆𝑃𝐵𝑅𝐺 = 103

ĠĢlemden de görüldüğü gibi bulunan sayıya en yakın tamsayı değeri alınır.

USART‟ın çalıĢması için Baud Rate son derece önem taĢımaktadır. Ġstenilen Baud oranının SPBRG yazmacına

yüklenmesi gerekir. 4 MHz kristal osilatör ve BRGH=1 iken çeĢitli standart Baud oranları için SPBRG yazmacına

yüklenecek sayılar aĢağıdaki tabloda verilmiĢtir.

BAUD ORANI SPBRG DEĞERĠ

1200 207

2400 103

9600 25

19200 12

28800 8

33600 6

57600 3

5.10. USART’ın Kullanımı

SPBRG değerini belirledikten sonra RCIF ile alım, TXIF ile de gönderim kesme bayrakları kontrolleri ile gönderim

veya alım iĢinin bittiği kontrol edilerek RCREG kaydedicisi ile alınan bilgi, TXREG ile de gönderilmek istenen

bilgiler istenilen Ģekilde kullanılabilir.

Gönderilecek veri TXREG yazmacına yüklenir. Gelen veri ise RCREG yazmacından okunur.

5.10.1. USART ile asenkron veri göndermek

USART ile asenkron veri gönderiminde RCSTA registerinin SPEN adlı 7. biti “1” yapılarak RC6 TX ucu olarak

kullanılmaya hazırlanıĢ olur.

Gönderilecek olan veri TXREG registerine yüklendiğinde bu veri donanım tarafından TSR‟ye (Transmit Shift

Register – Gönderici kaydırmalı kaydedicisi) transfer edilir ve TX ucundan gönderilir. Verinin gönderilme iĢlemi TXSTA

registerinin TXEN adlı 5. Biti “1” yapılarak aktif edilir. En düĢük değerlikli bir (LSB) ilk olarak gönderilir.

113

TXREG saklayıcısının içeriği TSR kaydırmalı kaydedicisine gönderildiğinde PIR1 registerinin TXIF adlı 4. Biti 1

olur ve ilgili kesme aktif edilmiĢse bir kesme oluĢur. (Bu kesmenin algılanabilmesi için PIE1 saklayıcısının TXIE biti “1”

yapılmıĢ olmalıdır) Bu kesme, TXREG saklayıcısının içeriğinin TSR‟ye gönderildiğini ve yeni bir verinin TXREG

saklayıcısına yüklenebilecek duruma geldiğini belirtir. TXIF bitini yazılımsal olarak sıfırlamak mümkün değildir. Sadece

TXREG saklayıcısına yeni veri yüklendiğinde otomatik olarak sıfırlanır.

TSR registerindeki verinin seri olarak gönderilmesi bittiğinde TXSTA saklayıcısının TRMT biti 1 olur. Bu

durum, TSR saklayıcısının boĢaldığını gösterir. Verinin gönderilme iĢleminin bittiğini belirten herhangi bir kesme

olmadığından, TSR saklayıcısının boĢ olup olmadığını anlamak için TRMT biti kontrol edilir.

TSR registeri veri belleği üzerinde bulunmadığından direkt eriĢim (okuma veya yazma için) mümkün değildir.

Asenkron veri gönderimi için aĢağıda sıralanan iĢlemler yapılmalıdır:

1- Ġstenen BAUD RATE değeri için gereken değer SPBRG‟ye yüklenir. Yüksek hızda BAUD RATE isteniyorsa

BRGH=1 yapılır.

2- Asenkron seri iletiĢim portunu aktif etmek için TXSTA adlı registerin SYNC adlı 4. Biti “0”, RCSTA

saklayıcısının SPEN adlı 7. Biti 1 yapılır.

3- Kesme kullanımı isteniyorsa PIE1 saklayıcısının TXIE adlı 4. Biti 1 yapılmalıdır.

4- 9 bitlik veri gönderimi (9. Bit olarak hata tesbit (parity) biti) isteniyorsa TXSTA saklayıcısının TX9 adlı 6. Biti 1

yapılır.

5- Göndermeyi aktif yapmak için TXSTA saklayıcısının TXEN adlı 5. Biti 1 yapılır. Bu anda TXREG saklayıcısına

veri yazmak mümkün duruma gelir ve PIR1 saklayıcısının TXIF biti 1 olur.

6- 9 bitlik veri gönderme seçilmiĢse, 9. Bit, TXSTA saklayıcısının TX9D adlı 0. Bitine yazılmalıdır.

7- 8 bitlik veri TXREG saklayıcısına yüklenerek gönderme iĢlemi baĢlatılır.

5.10.2. UYGULAMA 1- USART Kullanılarak PIC’den PC’ye doğru tek yönlü Asenkron Seri veri transferi

Bu uygulama, USART‟ı kullanarak seri iletiĢimin nasıl yapıldığını göstermektedir. Denetleyici olarak PIC16F877A,

PC‟de ise Hyperterminal (veya benzeri bir program) kullanılmıĢtır. Uygulamada seri porttan “USARTTAN MERHABA “

mesajı gönderilmektedir. ĠletiĢim tek yönlü olup PIC‟den PC‟ye doğrudur.

//PIC'den PC'ye tek yönlü karakter gönderme uygulaması

#include <htc.h>

#include <delay.c>

__CONFIG(UNPROTECT & DPROT & WDTDIS & XT & PWRTDIS & BORDIS & WRTEN & LVPDIS & DEBUGDIS);

//USART'a karakter gönderen fonksiyon.

karakter_gonder(unsigned char c)

{

while(!TXIF); //TXIF = 1 olana kadar bekle

TXREG=c;

}

//*********************************************************************************

void text_gonder(const char * s) // USART'a string ifade gönderiliyor

{

while(*s)

karakter_gonder(*s++);

}

//**********************************************************************************

/*ana program. İlk olarak USART konfigürasyonu yapılır. Daha sonra istenen karakter

dizisi USART'a gönderilir. */

main(void)

{

SPBRG=25; //baud oranı 9600

//********TXSTA registerinin bitleri konfigüre ediliyor.***************

TXEN=1; // TX'i aktif yap

TX9=0; //8 Bit TX Çalışma

114

SYNC=0; //Asenkron çalışma

BRGH=1; //Yüksek hız seçildi

//Yukarıdaki 4 satır yerine TXSTA=0b10010000; ya da TXSTA=0x90; Yazılabilirdi.

SPEN=1; //RCSTA registeri konfigüre ediliyor. Seri port aktif

TRISC6=0; //RC6 (MİKRODENETLEYİCİ TX UCU) ÇIKIŞ

TRISC7=1; //RC7 (MİKRODENETLEYİCİ RX UCU) Giriş

while (1)

{

text_gonder("USARTDAN MERHABA ");

while(1); //sonsuz döngü

}

}

5.10.3. USART ile Asenkron veri almak

RX ucundan seri olarak alınan veri, RSR‟ye (Receive Shift Register – Alıcı kaydırmalı kaydedicisi) transfer edilir. Bu

transferin hızı; BAUD RATE değerine (SPBRG saklayıcısına yazılan değere ) ve BRGH bitine bağlıdır.

Seri hattan gelen verinin sonundaki stop biti algılandığında RSR registerindeki veri, RCREG registerine transfer

edilir. Bu transfer tamamlandığında PIR1 registerinin RCIF adlı 5. Biti 1 olur. Bu anda bir kesme olayı meydana gelmiĢ

demektir. Bu kesmenin algılanabilmesi için PIE1 saklayıcısının RCIE adlı 5. Biti 1 yapılmalıdır. RCIF sadece okunabilir

bit‟tir, RCREG registeri okunduğunda veya boĢ olduğunda donanım tarafından sıfırlanır.

RCREG registerinde 8 bitlik 2 kademeli tampon bulunur. Ġlk gelen veri 1. Kademede tutulurken yeni bir veri

geldiğinde eskisi 2. Kademeye itilir. Bu yolla yazılım tarafından okumada bir gecikme oluĢtuğunda üstüne yazma hatası

önlenmiĢ olur.

Kaydırılarak RSR registerine gönderilen 8 bitlik verinin gönderimi tamamlandığında RCREG registerinin her iki

tamponu da doluysa RCSTA saklayıcısının OERR adlı 1. Biti 1 olur. Bu durum, üstüne yazma hatası oluĢtuğunu belirtir.

Bu anda RSR registerine yazılmıĢ olan veri de kaybolur. Bu durumda veri alımı yapılamaz. Normal duruma tekrar

dönmek için RCSTA registerinin CREN adlı 4. Biti önce 0 sonra da 1 yapılmalıdır. Bu iĢlemle OERR biti tekrar 0

duruma getirilmiĢ olur.

Asenkron veri alımı yapılırken aĢağıda listelenen iĢlemler yapılmalıdır:

1- Ġstenen BAUD RATE değeri için gereken değer SPBRG‟ye yüklenir. Yüksek hızda BAUD RATE isteniyorsa

BRGH=1 yapılır.

2- Asenkron seri iletiĢim portunu aktif etmek için TXSTA adlı registerin SYNC adlı 4. Biti “0”, RCSTA

saklayıcısının SPEN adlı 7. Biti 1 yapılır.

3- Kesme kullanımı isteniyorsa PIE1 saklayıcısının RCIE adlı 5. Biti 1 yapılmalıdır.

4- 9 bitlik veri gönderimi (9. Bit olarak hata tesbit (parity) biti) isteniyorsa TXSTA saklayıcısının TX9 adlı 6. Biti 1

yapılır.

5- Veri alımını aktif yapmak için RCSTA saklayıcısının CREN adlı 4. Biti 1 yapılır. Bu anda TXREG saklayıcısına

veri yazmak mümkün duruma gelir ve PIR1 saklayıcısının TXIF biti 1 olur.

6- Veri alımı tamamlandığında PIR1 saklayıcının RCIF adlı 5. Biti 1 olur. Bu andaki kesmenin algılanabilmesi için

PIE1 registerinin RCIE biti 1 yapılmalıdır.

7- 9 bitlik veri alımı seçilmiĢse, RCSTA saklayıcısının RX9D adlı 9. Bit okunur.

115

8- RCREG saklayıcısı okunarak 8 bitlik veri

9- Bir hata oluĢturğunda RCSTA registerine ait CREN biti önce 0, sonra da 1 yapılır.

5.10.4. UYGULAMA 2- USART Kullanılarak PC’den PIC’e doğru tek yönlü Asenkron Seri veri transferi

Bu uygulamada PC‟den PIC kartına gönderilen karakterler LCD display ekranında gösterilmektedir. LCD kullanımı için

ilgili header dosyaları projeye eklenmelidir.

Bu uygulamada, öncekinden farklı olarak USART hata kontrolü de (karakter alırken eski karakterin üzerine yazmak,

çerçeve hatası(START ve STOP biti hatası)) yapılmıĢtır. Ġlgili fonksiyon, USART hatalarını siler.

/*PC - PIC kartı arası tek yönlü veri transferi. PIC kartının USART kullanarak PC'den

okuduğu karakterler LCD display ekranında görüntüleniyor.*/

#include <htc.h>

#include <delay.c>

__CONFIG(UNPROTECT & DPROT & WDTDIS & XT & PWRTDIS & BORDIS & WRTEN & LVPDIS & DEBUGDIS);

void usart_hatasi(void)

{

unsigned char s;

if(OERR)

{

TXEN=0; TXEN=1;

CREN=0; CREN=1;

}

if(FERR)

{

s=RCREG;

TXEN=0;TXEN=1;

}

}

unsigned char karakter_oku(void) //USART’tan bir karakter oku

{

while(!RCIF) usart_hatasi();

return RCREG;

}

karakter_gonder(unsigned char c) //usart’a bir karakter gönderir.

{

while(!TXIF); //TXIF 0 olana kadar bekle

TXREG=c;

}

//********************************************

void text_gonder(const char * s) // USART'a string ifade gönderiliyor

{

while(*s)

karakter_gonder(*s++);

}

//Ana program: USART’tan bir karakter okur ve bu karakteri LCD ekranında görüntüler

main(void)

{

unsigned char s;

SPBRG=25; //baud oranı 9600

BRGH=1; //Yüksek hız seçildi

SYNC=0; //Asenkron çalışma

SPEN=1; //Seri port aktif

CREN=1; // sürekli veri almayı aktif yap

TX9=0; //8 Bit TX Çalışma

TXEN=1; //TX'i aktif yap

TRISC6=0; //RC6 (MİKRODENETLEYİCİ TX UCU) ÇIKIŞ

TRISC7=1; //RC7 (MİKRODENETLEYİCİ RX UCU) Giriş

lcd_hazirla();

116

while (1)

{

s=karakter_oku(); //karakter oku

lcd_karakter_yaz(s);

}

}

5.10.5. UYGULAMA – 3: USART Kullanılarak iki yönlü Asenkron Seri iletişim uygulaması

Bu uygulamada PIC‟in seri portundan gelen küçük harf karakterler okunur ve bu karakterler büyük harfe dönüĢtürülüp

tekrar PC‟ye gönderilerek PC ekranında görüntülenir.

Karakter_oku() fonksiyonu USART‟tan bir karakter okur. Aynı Ģekilde karakter_goner() fonksiyonu

USART‟a bir karakter gönderir. Ana fonksiyonda önce USART konfigürasyonu yapılır. Daha sonra sonsuz bir döngü

içinde USART‟tan karakter okunur ve bu karakterler büyük harfe dönüĢtürülerek yine USART yoluyla PC‟ye gönderilir.

Büyük harf ve küçük harf karakterlerinin ASCII kodu incelendiğinde, sadece bit 5 in değiĢik olduğu görülür.küçük harf

karakterlerinde bit 5 Lojik 1 olup, karakter büyük harf olduğunda aynı bit, lojik 0 olmaktadır.

Örneğin ‘A’ karakterinin ASCII kodu ikili sayı olarak ‘0100 0001’ dir. Küçük harf ‘a’ karakterinin ASCII kodu ise

ikili olarak ‘0110 0001’ dir. Böylece küçük harf harhangi bir karakterin 5. Biti Lojik 0 yapılarak o karakter büyük

harfe dönüĢtürülmüĢ olur. Programda USART‟tan okunan karakterler bir s değiĢkeninde tutulur. Daha sonra okunan

karakterin binary ‘1101 1111’ (hex: 0xDF) sayısı ile AND‟lenir. Böylece karakter büyük harfe dönüĢmüĢ olur. Bu

karakter daha sonra PC‟ye gönderilmek üzere USART‟a gönderilir.

//İki yönlü USART seri iletişim uygulaması

#include <htc.h>

#include <delay.c>

__CONFIG(UNPROTECT & DPROT & WDTDIS & XT & PWRTDIS & BORDIS & WRTEN & LVPDIS & DEBUGDIS);

Void usart_hatasi(void)

{

unsigned char s;

if(OERR)

{

TXEN=0; TXEN=1;

CREN=0; CREN=1;

}

if(FERR)

{

S=RCREG;

TXEN=0;TXEN=1;

}

}

unsigned char karakter_oku(void) //USART’tan bir karakter oku

{

while(!RCIF) usart_hatasi();

return RCREG;

}

karakter_gonder(unsigned char c) //usart’A bir karakter gönderir.

{

while(!TXIF); //TXIF 0 olana kadar bekle

TXREG=c;

}

/* Ana program: USART’tan bir karakter okur ve bu karakteri büyük harfe

dönüştürüp tekrar USART’tan PC’ye gönderir */

main(void)

{

unsigned char s;

SPBRG=25; //baud oranı 9600

BRGH=1; //Yüksek hız seçildi

SYNC=0; //Asenkron çalışma

117

SPEN=1; //Seri port aktif

CREN=1; //sürekli veri almayı aktif yap

TX9=0; //8 Bit TX Çalışma

TXEN=1; //TX'i aktif yap

TRISC6=0; //RC6 (MİKRODENETLEYİCİ TX UCU) ÇIKIŞ

TRISC7=1; //RC7 (MİKRODENETLEYİCİ RX UCU) Giriş

while (1)

{

s=karakter_oku(); //karakter oku

s=s&0Xdf; //Büyük harf yap

karakter_gonder(s); //karakteri PC’ye gönder

}

}

5.10.6. UYGULAMA – 4: PIC kartında LM35 ısı sensörü ile ölçülen sıcaklık bilgisini USART Kullanılarak PC’ye

aktaran Asenkron Seri iletişim uygulaması

#include <htc.h>

#include <delay.c>

__CONFIG(UNPROTECT & DPROT & WDTDIS & XT & PWRTDIS & BORDIS & WRTEN & LVPDIS & DEBUGDIS);

void usart_hatasi(void)

{

unsigned char s;

if(OERR)

{

TXEN=0; TXEN=1;

CREN=0; CREN=1;

}

if(FERR)

{

s=RCREG;

TXEN=0;TXEN=1;

}

}

unsigned char karakter_oku(void) //USART’tan bir karakter oku

{

while(!RCIF) usart_hatasi();

return RCREG;

}

karakter_gonder(unsigned char c) //usart’A bir karakter gönderir.

{

while(!TXIF); //TXIF 0 olana kadar bekle

TXREG=c;

}

/* Ana program: USART’tan bir karakter okur ve bu karakteri büyük harfe dönüştürüp tekrar

USART’tan PC’ye gönderir */

main(void)

{

const float lsb=5000.0/1024.0;//bit başına voltaj hassasiyeti

float mV;

int sicaklik, santigrat;

TRISA=0x01; // Analog giriş için

ADCON1=0x8E;

ADCON0=0x41;

DelayUs(25);

SPBRG=25; //baud oranı 9600

BRGH=1; //Yüksek hız seçildi

SYNC=0; //Asenkron çalışma

SPEN=1; //Seri port aktif

CREN=1; //süreklü veri almayı aktif yap

118

TX9=0; //8 Bit TX Çalışma

TXEN=1; //TX'i aktif yap

TRISC6=0; //RC6 (MİKRODENETLEYİCİ TX UCU) ÇIKIŞ

TRISC7=1; //RC7 (MİKRODENETLEYİCİ RX UCU) Giriş

while (1)

{

ADGO=1; // Çevrim başlatılıyor

while(ADGO);

sicaklik=(int)(ADRESH*256 + ADRESL); // Hesaplama yapılıyor

mV=(int)sicaklik*lsb; //LM35'in ürettiği mV

santigrat=mV/10;

karakter_gonder(santigrat/10+48); //karakteri PC’ye gönder

karakter_gonder(santigrat%10+48); //karakteri PC’ye gönder

DelayMs(255);

}

}

5.11 UYGULAMA – 5: PIC – PC Arası Haberleşme Programı

Visual Basic .NET ile seri porta ulaĢmak için SerialPort Nesnesinden yararlanılır.

Bu nesneyi çift tıklayarak çalıĢmamıza eklediğimizde, formun altına SerialPort1 varsayılan

adında eklenir. Seri Port üzerinden gönderdiğimiz bilgileri görüntülemek için bir textbox, gelen

verileri görüntülemek için baĢka bir textbox, gerekli uyarı ve bilgileri kullanıcıya iletmek için bir StatusStrip (üzerinde bir

label oluĢturup adını mesaj olarak değiĢtirin), bağlanılacak Portu seçmek, seçilen COMport‟a bağlanmak ve bağlantıyı

kesmek, text kutuların içeriğini temizlemek… gibi çeĢitli görevleri

yerleĢtirmek için bir ToolStrip ekleyerek yandaki gibi bir Form

tasarlanabilir.

Eklenen ToolStrip‟e, bir ComboBox, 3 tane de Button ekleyip

Ģekildeki gibi Text özellikleri ayarlanır.

ComboBox nesnesinin items(Collection) özelliğine COM1, COM2,

COM3, COM4 eklenir.

ÇalıĢma anında ComboBox‟tan bir port seçildikten sonra o

porta bağlanmak için “BAĞLAN” butonuna aĢağıdaki kodlar yazılır:

Private Sub ToolStripButton1_Click(ByVal sender As .......

Try SerialPort1.PortName = ToolStripComboBox1.Text SerialPort1.Open() Catch ex As Exception mesaj.Text = ex.Message End Try End Sub

Açılan Portu kapatmak için tıklanması gereken “BAĞLANTIYI KES” Text özellikli butonun yordamı aĢağıdaki gibidir

Private Sub ToolStripButton2_Click(ByVal sender As … Try SerialPort1.Close() Catch ex As Exception

mesaj.Text = ex.Message

End Try

End Sub

Gelen ve giden verilerin görüntülendiği text kutularını temizlemek için “TEMĠZLE” Text özellikli butonun yordamı:

Private Sub ToolStripButton3_Click(ByVal sender As …

txtgiden.Clear()

txtgelen.Clear()

End Sub

119

Txtgönder isimli Txtbox‟a yazılan verinin daha önce açılmıĢ olan seri porttan gönderilmesi için “GÖNDER” Text

özellikli butonun kodları

Private Sub btngönder_Click(ByVal sender As …

Try

SerialPort1.WriteLine(txtgönder.Text)

txtgiden.Text = txtgiden.Text & vbCrLf & "BEN: " & txtgönder.Text

Catch ex As Exception

mesaj.Text = ex.Message

End Try

End Sub

Seri porttan bir mesaj geldiğinde onu yakalayıp gerekli iĢleri yapan alt program:

Private Sub SerialPort1_DataReceived(ByVal sender As …

Try

Dim a = SerialPort1.ReadLine

txtgelen.Text = txtgelen.Text & vbCrLf & "PIC KARTI: " & a.ToString

Catch ex As Exception

mesaj.Text = ex.Message

End Try

End Sub