Bilgisayarli Kontrol Sistemleri

Transkript

Bilgisayarli Kontrol Sistemleri
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.
1.7.
Ġlk Uygulama (Merhaba!. ġu anda tarih ve saat…) ............................................................................................... 10
Ö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
1
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.
1.20.1.
1.21.
Hata Yakalama .............................................................................................................................................. 39
Try Catch Finally .................................................................................................................................................. 40
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
2
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
Menü Tasarımı ve MDI Formlar................................................................................................................... 72
1.23.
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
3
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
4
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.
5
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ğı dilden 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.
6
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.
7
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
8
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, yetkilendirme, 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.
9
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.
10
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.
11
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.
12
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.
13
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.
14
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.
15
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.
16
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
17

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))
18
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:
arapgir myo
Label1.Text = LCase("ARAPGİR myo") ' Sonuç:
Tüm yazıyı büyük harfe çevirmek:
ARAPGİR MYO
Label1.Text = UCase("arapgir MYO") ' Sonuç:
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
19



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.
20
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 tanı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
Dim
Dim
Dim
dim As Double
(sayi) As Short
333sayisi As Integer
"kelime" As String
<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ı.
21
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.
22
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
Büyüklük Değer
Tipi
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
Maksimum 29 haneli sayı tutar. +/-79,228,162,514,264,337,593,543,950,335
Decimal 16 Bayt
arasında değer alır
Negatif sayı aralığı: -1.79769E+308 ile -4.94065E-324 Pozitif sayı aralığı:
Double 8 Bayt
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.
Negatif sayı aralığı: -3.4028235E+38 ile -1.401298E-45 Pozitif sayı aralığı:
Single
4 Bayt
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.
23
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
1.13.
Structure Ucgen
Dim n1 As Nokta
Dim n2 As Nokta
Dim n3 As Nokta
End Structure
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
24
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
25


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.
1.14.
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
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ı.
26
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
27
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
28
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.
29
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.
30
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
False
False
1.17.2.
True
False
True
False
True
False
False
False
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
31
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
32
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.
33
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.
34
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.
35
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.
36
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.
37
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.
38
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.
39
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
40
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.
41
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
42
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.
43
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",
MsgBox("Mesaj",
MsgBox("Mesaj",
MsgBox("Mesaj",
MsgBoxStyle.YesNoCancel)
MsgBoxStyle.MsgBoxRight, "Uyarı")
, )
, "Dikkat")
44
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
45
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
46
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"
47
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.
48
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
AcceptButton
Açıklama
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

Değer Tipi
Button
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
49
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
TextAlign
BorderStyle
Değer Tipi
Açıklama
ContentAlignment Yazının etiket üzerindeki pozisyonu belirler.
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
50
1.22.3.
TextBox
Metin kutuları, kullanıcıdan bilgi almak için kullanılır.

TextBox Özellikleri
Özellik
MultiLine
Açıklama
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

Değer Tipi
Boolean
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.
51
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.
52
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.
53

CheckBox Özellikleri
Özellik
Checked
CheckAlign
Değer Tipi
Açıklama
Boolean
Kontrolün seçili olup olmadığını belirler.
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
54
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
Items
Değer Tipi
ListBox.ObjectCollection
Selectedltem
Selectedltems
Object
SelectedObjectCollection
SelectedIndex
Selectedlndices
Integer
SelectedIndexCollection
DataSource
Object
Açıklama
Liste kutusuna eklenen öğelerin tutulduğu koleksiyon
nesnesidir.
Liste kutusundan seçilen öğeyi alır.
Liste kutusundan seçilen öğeleri alır. Seçilen öğeler dinamik
bir dizide tutulur.
Liste kutusundan seçilen öğenin indisini alır.
Liste kutusundan seçilen öğelerin indislerini bir koleksiyon
nesnesinde tutar.
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
Veri kaynağından gelen öğelerin, kullanıcıya gösterilecek özelliğidir.
Veri kaynağından gelen öğelerin, dönüĢ değerini belirleyen özelliğidir.
Seçilen öğenin, liste kutusunun ValueMember
ile belirtilen özelliğidir.
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.
Boolean
Liste kutusundaki öğelerin biden fazla kolonda görüntülenmesini belirler.
DisplayMember String
ValueMember
String
SelectedValue
Object
SelectionMode
MultiColumn

ListBox Olayları
Olay
Açıklama
SelectedIndexChanged Liste kutusunda bir öğe seçildiği zaman gerçekleĢir.
TABLO: ListBox Olayları
55

ListBox Metotları
Açıklama
Parametre olarak verilen nesnenin liste kutusunda gösterilen yazısını döndürür.
Parametre olarak verilen indisteki öğenin seçili olup olmadığını döndürür.
Parametredeki String ifadesini liste kutusunda arayarak, bul- duğu ilk öğenin indisini
döndürür
TABLO 9.14: ListBox Metotları
Metot
GetItemText
GetSelected
FindString
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
DropDownStyle
Değer Tipi
Açıklama
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.
56
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
HexaDecimal
Increment
Değer Tipi Açıklama
Boolean
Sayıların onaltılık tabanda görüntülenmesini belirler.
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
57

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
58
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
HotTrack
Değer Tipi
Boolean
Açıklama
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.
RESĠM 9.13: TabPage eklemek.
 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
59
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
CalendarTrailing
ForeColor
CalendarTitle ForeColor
CalendarTitle
BackColor
CalendarMonth
Background
CalendarForeColor
CalendarFont
ShowCheckBox
Checked
Değer Tipi
Color
Açıklama
Bir önceki ve bir sonraki ayın gün lerinin görüntülenme rengidir.
Color
Color
Takvim baĢlığının ön plan rengidir.
Takvim baĢlığının arka plan rengidir.
Color
Takvim arka plan rengidir.
Takvimdeki yazıların ön plan rengidir.
Takvimin gösterileceği yazı tipi ayarlarıdır.
Tarih değerinin yanında seçme kutusunun gösterilmesi.
Seçme kutusu görüntülendiği zaman, tarihin seçili olup olmadığını
gösterir
Format
DateTime
Kontrolün görüntüleneceği formatı belirler. Long, Short değerleri
PickerFormat 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
Color
Font
Boolean
Boolean
Ö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
60
' 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
MaxSelect ionCount
SelectionRange
SelectionBegin
SelectionEnd
ScrollChange
MonthlyBoldedDates
Değer Tipi
Integer
SelectionRange
Date
Date
Integer
Date()
ShowToday
Boolean
ShowTodayCircle
Boolean
ShowWeekNumbers Boolean
TABLO: MonthCalendar Özellikleri

Açıklama
Bir seferde maksimum kaç gün seçileceğini belirler.
BaĢlangıç ve bitiĢ tarihlerinden oluĢan bir seçim aralığı nesnesidir.
Seçilen tarih aralığının hangi tarihten itibaren baĢladığını belirler.
Seçilen tarih aralığının hangi tarihte bittiğini belirler.
Ġleri geri düğmeleri tıklandığı zaman kaç ay atlanacağını belirler.
Takvimde hangi günlerin kalın yazı tipinde gösterileceğini belirler.
ĠĢaretlenen günler, her ay için kalın gösterilir.
Takvimin alt kısmında, sistem takvi-mine göre hangi günde olduğunu
gösterir.
Takvimde, o günün seçili olmasını belirler.
Takvimin sol tarafında, yılın hafta numaralarını gösterir.
MonthCalendar Olayları
Açıklama
Seçilen tarihten farklı bir tarih seçildiğinde gerçekleĢir.
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ı
Olay
DateChanged
DateSelected
Ö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.
61

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
Enabled
Interval
Değer Tipi
Boolean
Integer
Açıklama
Kontrolün aktif olup olmadığını belirler.
Sayacın hangi zaman aralığında bir çalıĢması rektiğini belirler. Milisaniye cinsindedir.
TABLO: Timer Özellikleri
62

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
63
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
64
Ö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
65
Ö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
Images
Değer Tipi
Açıklama
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
66
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
View
Değer Tipi
View
AllowColumn
Reorder
Activation
Boolean
CheckBoxes
Columns
Boolean
ColumnHeader
Collection
Boolean
Boolean
Boolean
FullRowSelect
GridLines
LabelEdit
ItemActivation
Açıklama
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.
Detay görünümünde, kolonların kullanıcı tarafından düzenlenebilmesini
belirler.
Öğ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.
Öğelerin yanında seçme kutularının bulunmasını belirler.
Detay görünümündeyken, öğelerin alt öğelerinin gösterileceği kolonları
tutan koleksiyondur.
Detay görünümde, öğenin tüm detay satırının seçilmesini belirler.
Kolonlar ve satırlar arasında ayırıcı çizgilerin gözükmesini belirler.
Ç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.
67

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)
68

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
69
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.
70
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.
71
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).
72
RESĠM: Kısayol tuĢunun belirlenmesi.

ToolStripMenultem Özellikleri
Özellik
Checked
Değer Tipi
Boolean
Açıklama
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.
73
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.
74

ToolTip Özellikleri
Özellik
Değer
Tipi
Boolean
Active
AutomaticDelay Integer
AutoPopDelay
InitialDelay
Integer
Integer
ReshowDelay
Integer
ShowAlways
Boolean
TABLO: ToolTip Özellikleri
1.23.6.
Açıklama
Kontrolün aktif olup olmadığını belirler. False değerini alırsa, form üzerinde
ipuçları görüntülenmez.
AutoPopDelay, InitialDelay, ReshowDelay değerleri için otomatik süreleri
ayarlar.
Ġpucunun görüntülenme süresini belirler.
Ġpucunun gözükmesi için, fare imlecinin kontrol üzerinde durması gereken
süreyi belirler
Yeni bir kontrolün üzerine gelindiği zaman, bu kontrole ait ipucunun
gösterilmesi için gereken süreyi belirler.
Seçilen kontrol aktif olmadığı zamanlarda dahi ipucunun gösterilmesini sağlar.
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.
75

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
ZoomFactor
WordWrap
DetectUrls
Değer Tipi
Single
Boolean
Boolean
Açıklama
Metnin büyüklüğünü belirler. 1 - 64 ara bir değer alır.
Uzun yazıların bir sonraki satıra geçerek görüntülenmesini sağlar.
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
Boolean
String
String
Açıklama
Kontrol içine yazı yazarken farenin gizlenmesini belirler.
En son yapılabilecek Undo iĢleminin tipini tutar.
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
Capture
UndoActionName
RedoActionName

RichTextBox Metotları
Açıklama
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ı
Metot
Find

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ı
76
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
ContextMenuStrip
Kontrol İsmi
ContextMenuStrip1
ContextMenuStrip
ToolStrip
ContextMenuStrip2
ToolStrip1
OpenFileDialog
SaveFileDialog
FontDialog
NotifyIcon
OpenFileDialog1
SaveFileDialog1
FontDialog1
NotifyIcon1
RichTextBox
RichTextBox1
Özellik
Geri Al, Kes, Kopyala, YapıĢtır, Sil, Tümünü Seç değerlerini
içeren menü öğeleri ekleyin.
Gizle değerini içeren bir menü öğesi ekleyin.
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.
Text: "Notepad Uygulaması"
Icon: Uygulamanız için bir simge seçin
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.
77
Dosya
Yeni (Ctrl+ N)
Aç (Ctrl+O)
Kaydet (Ctrl+ S)
Farklı Kaydet
ÇıkıĢ
Düzen
Geri Al (Ctrl+ Z)
Kes (Ctrl+X)
Kopyala (Ctrl+C)
YapıĢtır (Ctrl+V)
Sil
Bul
Yazı Tipi
Tümünü Seç
Görünüm
Yardım
Sola Hizala
Hakkında
Sağa Hizala
Ortala
Madde ĠĢaretle
Araç çubuğunu gizle
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
Button
Buttonl
Button
Button2
CheckBox
cbTumKelimeyiSec
TextBox
txtAranan
Özellik
DialogResult
Text
Text
Text
Checked
Değer
DialogResult.OK
"Bul"
"Ġptal"
"Bulduktan sonra tüm kelimeyi seç"
True
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.
78
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
79
' 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
80
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
81
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
82

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
83
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ıl84
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.
85
Ġ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
86



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.
87
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.
88
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
Kullanımı
Sınırlamalar/Kısıtlamalar
Türü
Metin
Alfa sayısal veriler
En fazla 255 karakter depolar.
(metin ve sayılar)
Not
Alfa sayısal veriler
Alanı programla dolduracaksanız en çok 2GB veri depolar (tüm
(metin ve sayılar)
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
Parasal veriler
Verileri dört ondalık basamak duyarlığıyla 8 baytlık sayılar olarak
Birimi
depolar. Parasal veriler depolamak isterseniz ve Access'in değerleri
yuvarlamasını istemezseniz, bu veri türünü kullanın.
Otomatik
Yeni kayıt
Verileri 4 baytlık değerler halinde depolar; genellikle birincil
Sayı
oluĢturduğunuz zaman
anahtarlarda kullanılır.
Access tarafından
oluĢturulan benzersiz
değerler
Evet/Hayır
Boole (doğru veya
Access tüm Evet değerleri için -1 ve tüm Hayır değerleri için 0
yanlıĢ) verileri.
kullanır.
OLE
Office ve Windows
En çok 2GB veri depolar (tüm Access veritabanları için boyut
Nesnesi
tabanlı programlardan
sınırıdır). 2GB veri eklendiğinde veritabanınızın yavaĢ çalıĢacağını
gelen görüntü, belge,
unutmayın. OLE Nesnesi alanları özgün belgenin veya baĢka
grafik ve diğer nesneler
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
Office Access 2007 .accdb dosyalarında yenidir. E-posta iletilerine
dosyalar
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.
89
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
90

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)
91
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;
92
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
93
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.
94
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.
95
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.
96
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.
97
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.
98
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
99

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.
100

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 .
101
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()
102

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.
103
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.
104
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.
105
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
106
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.
107
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.
108
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.
Pin 2
Pin 3
Pin 4
Pin 5
Pin 6
Pin 7
Pin 8
Pin20
Pin 22
5.5.1.
D-Tipi 9 pin No.
Pin 3
Pin 2
Pin 7
Pin 8
Pin 6
Pin 5
Pin 1
Pin 4
Pin 9
Adı
Transmit Data ( Veri Gönder )
Receive Data ( Veri Al )
Request To Send ( Gönderme Ġsteği )
Clear To Send (Göndermeye Müsait )
Data Set Ready ( Veri Paketi Hazır )
Signal Ground ( Sinyal Topraklama )
Carrier Detect ( TaĢıyıcı Tanımlandı)
Data Terminal Ready ( Veri Terminali Hazır )
Ring Indicator ( Çevrim Göstergesi )
Pin Fonksiyonları
Kısaltma
TD
RD
CTS
DCD
Adı
Transmit Data
Receive Data
Clear To Send
Data Carrier Detect
DSR
DTR
Data Set Ready
Data Terminal
Ready
Request To Send
Ring Indicator
RTS
RI
Kısaltma
TD
RD
RTS
CTS
DSR
SG
CD
DTR
RI
Fonksiyonu
Seri Veri ÇıkıĢı (TxD)
Seri Veri GiriĢi (RxD)
Bu hat seri portun veriyi göndermek için hazır olup olmadığını belirler.
Seri port telefon hattının diğer ucundaki portta bir taĢıyıcı (Carrier) tespit
ettiğinde hat aktif olur.
UART‟a modemin bağlantı için hazır olduğunu belirtir.
DSR‟nin tersini yapar. Modeme UART‟ın bağlantı için hazır olduğunu
belirtir.
Modeme, UART‟ın veriyi göndermek için hazır olduğunu belirtir.
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 T1 IN 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.
109
RS232 ASENKRON SERİ İLETİŞİM VE DALGA FORMLARI
5.6.
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
0
0
1
1
0
0
1
1
0
STOP BİTİ
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.
110
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
CSRC
TX9
TXEN
SYNC
--BRGH
bit 7
6
5
4
3
2
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.
R-1
TRMT
1
R/W-0
TX9D
bit 0
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
1𝑠𝑛
ise baud rate 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
ASENKRON (SYNC=0)
DÜġÜK HIZ (BRGH=0)
𝐹𝑜𝑠𝑐
𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒 =
64(𝑋 + 1)
YÜKSEK HIZ (BRGH=1)
𝐹𝑜𝑠𝑐
𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒 =
16(𝑋 + 1)
𝐹𝑜𝑠𝑐
𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒 =
4(𝑋 + 1)
SENKRON (SYNC=1)
Fosc: PIC saat sinyal frekansı (Hz cinsinden)
X: SPBRG saklayıcı içindeki değer (0 – 255 arasında)
111
Baud oranı bilinince SPBRG yazmacına yüklenecek sayı da aĢağıdaki formüllerle bulunabilir:
MOD
ASENKRON (SYNC=0)
DÜġÜK HIZ (BRGH=0)
𝐹𝑜𝑠𝑐
𝑋=
−1
𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 64
𝑋=
SENKRON (SYNC=1)
YÜKSEK HIZ (BRGH=1)
𝐹𝑜𝑠𝑐
𝑋=
−1
𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 16
𝐹𝑜𝑠𝑐
−1
𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 4
Ö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?
𝑋=
𝐹𝑜𝑠𝑐
4. 106
−1 =
− 1 = 103,16 → 𝑆𝑃𝐵𝑅𝐺 = 103
𝐵𝑎𝑢𝑑 𝑅𝑎𝑡𝑒. 16
2400.16
ĠĢ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.
112
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
113
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.
114
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();
115
while (1)
{
s=karakter_oku();
lcd_karakter_yaz(s);
}
//karakter oku
}
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;
BRGH=1;
SYNC=0;
//baud oranı 9600
//Yüksek hız seçildi
//Asenkron çalışma
116
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
117
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
118
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
119

Benzer belgeler

bilgisayarlı kontrol 6

bilgisayarlı kontrol 6 Toolbox(Araç Kutusu) Paneli ................................................................................................................................. 9

Detaylı