program yazmak (çok ayrıntılı)

1 Mar 2012
204
1
mars
Yazan Editör: Selçuk Tüzel
Düzelti: Selçuk Tüzel Teknik Editör: Zeynep Çömlekçi
Şef Editör: Mehmet Çömlekçi
İçindekiler
Modül 1: Programlamaya Giriş ...............................................................3
Konu 1: Program Nedir?........................................................................ 4
Programlar ın Çalışma Modeli ............................................................... 5
Konu 2: Programcı Kimdir? ................................................................... 6
Konu 3: Programlama Dilleri................................................................. 7
Programlama Dillerinin Tarihçesi........................................................... 9
Konu 4: Programın Derlenmesi............................................................. 11
Modül Sonu Soruları & Alıştırmalar ....................................................... 12
Modül 2: Microsoft .NET Platformu....................................................... 15
Konu 1: Yazılım Geliştirme Dünyası ...................................................... 16
Konu 2: Sorun un Temeli ................................................................... 18
Konu 3: Çözüm Platformu .................................................................. 19
Modül 3: Microsoft Visual Studio Arayüzü ............................................ 23
Konu 1: Visual Studio Çal ışma Ortamı ................................................ 24
Çalışma Sayfalar ı ............................................................................ 24
Araç Çubuklar ı................................................................................. 25 Menüler............................................................................................ 26 Paneller............................................................................................ 26
Konu 2: Start Page............................................................................ 28
Konu 3: Menüler............................................................................... 30
Konu 4: Solution Explorer Paneli .........................................................33
Konu 5: Toolbox Paneli.......................................................................35
Konu 6: Properties Paneli.................................................................... 37
Konu 7: Help Kullanımı ........................................................................ 38
Dynamic Help..................................................................................... 39
Search ............................................................................................. 39
Index ...................................................................................::........... 39
Contents.............................................................................................. 40
IV İ çindekiler LAB 3.1: Help Kullan ımı ...................................................41
Dynamic Help ..................................................................................... 41 Contents.............................................................................................. 41
Search .............................................................................................. 41
Index ................................................................................................ 42
Modül Sonu Soruları & Alıştırmalar ..................................................... 43
Modül 4: Visual Basic.NET ile Windows Tabanlı Programlama ..................47
Konu 1: İlk Uygulama (Hello World, The Time Is...) ............................... 48
Konu 2: Özellikler, Metotlar ve Olaylar .................................................. 50 Özellikler............................................................................................ 50
Metotlar ........................................................................................... 52 Olaylar............................................................................................... 53
Konu 3: Visual Basic.NET’e Kontrollerin Eklenmesi.................................. 55
Form ................................................................................................ 56
Button .............................................................................................. 57
TextBox ............................................................................................ 57
Label ............................................................................................... 57
ComboBox ....................................................................................... 58 ListBox.............................................................................................. 59
Timer ............................................................................................... 60
LAB 4.1: Kronometre Uygulamas ı........................................................ 61
Form Üzerine Kontrollerin Eklenmesi, Biçimlendirmelerin Yap ılmas ı ...... 61
Kodlar ın yazılmas ı ............................................................................ 62
Konu 4: Haz ır Fonksiyonlar ................................................................. 65
Konu 5: InputBox ................................................................................ 68
Konu 6: MessageBox ........................................................................... 69
Konu 7: Değişken – Sabit Nedir? Değişkenlerin ve Sabitlerin Tan ımlanması 70
Değişken Nedir, Nas ıl Tan ımlanır? ....................................................... 70
Sabit Nedir, Nas ıl Tanımlanır? ............................................................... 73
Veri Tipleri .......................................................................................... 74 Structure............................................................................................. 77
Dizilerle Çalışmak ............................................................................... 78 Debug................................................................................................. 82
İ çindekiler V Al ıştırma ......................................................................... 84
Konu 8: Operatörler............................................................................. 87
Aritmetiksel Operatörler ...................................................................... 87
Karşıla ştırma Operat örleri ................................................................... 88
String Oper atörle ri ........................................................................... 89
Modül Sonu Soruları & Alıştırmalar ...................................................... 91
Modül 5: Algoritma ve Dump Coding .................................................. 95
Konu 1: Algoritma Nedir?.................................................................... 96
Konu 2: Dump Coding Nedir?.............................................................. 98
Konu 3: Akış Diyagramlarında Kullanılan Semboller............................... 99
Konu 4: Algoritma Uygulamalar ı ...................................................... 101
Bilet Satma .................................................................................... 101
Çay Demleme................................................................................ 102
Üniversite Eğitim Notunu He saplama .............................................. 103
Modül Sonu Soruları & Alıştırmalar .................................................. 105
Modül 6: Karar Yapılar ı ve Döngüler ................................................ 109
Konu 1: Karar Yapıları ....................................................................... 110
If .................................................................................................. 111
Koşul Operatör leri ......................................................................... 114
If Then Else .................................................................................. 117
ElseIf ........................................................................................... 118
Select Case .................................................................................. 118
Hangi Karar Cümlesi Nerede Kullanılır? ............................................ 122
Uygula ma ....................................................................................123
Algoritman ın İncelenmesi ............................................................ 124
Forma Kontrollerin Eklenmesi....................................................... 125
Kodlar ın Yazılmas ı ................................................................. 126
Konu 2: Döngüler.................................................................... 129
For Ne xt ................................................................................. 131
For Döngülerinin İç İçe Kullan ımı ............................................... 132 While..................................................................................... 136
Do Loop .............................................................................138
Do While ............................................................................ 139
Do Until ............................................................................. 139
VI İ çindekiler Sonsuz Döngüler .................................................. 140
Hangi Döngü Nerede Kullanılır? ................................................. 141
Uygula ma ........................................................................... 143
Konu 3: Hata Yakalama..................................................................... 146
Try Catch Fi nally ....................................................................... 148
Lab 1: Şifreleme Algoritması ........................................................ 151
Şifreleme ........................................................................... 151
Şifreyi Çö zmek ..................................................................... 156
Lab 2: Sıralama Algoritmas ı .......................................................... 160
Dizinin Doldurulması .............................................................. 160
Dizinin Sıralanmas ı ................................................................ 160
Lab 3: Arama Algoritması............................................................. 164
Dizinin Sıralanmas ı ................................................................ 164
Arama Algoritması ................................................................. 164
Modül Sonu Soruları & Alıştırmalar .................................................. 168
Modül 7: Fonksiyonlar ve Yordamlar............................................... 171
Konu 1: Sub........................................................................................ 172
Parametre Kullanımı .................................................................. 175
Opsiyonel Parametreler .............................................................. 177
ParamArray ............................................................................. 179
Sub Ma in................................................................................. 182
Konu 2: Function................................................................................ 184 Fonksiyonların ve Yordamların Aşırı Yüklenmesi ................................. 187
Konu 3: String Fonksiyonları............................................................. 189
Konu 4: Matematiksel Fonksiyonlar ................................................. 192
Konu 5: Tarih ve Zaman Fonksiyonları ............................................. 194
Konu 6: Offline ve Online Yardımın Etkin Kullanımı ........................ 198
Offline Yard ım.......................................................................... 199
Online Yard ım .......................................................................... 202
Lab 1: Kelime Oyunu ......................................................................... 204
Projenin Aç ılmas ı ...................................................................... 204
Yard ımcı Yordam ve Fo nksiyonlar ...................................................205
Olayların Yazılmas ı .................................................................... 207
İ çindekiler VII Modül Sonu Soruları & Alıştırmalar .................................................. 209 Modül 8: Veri Tipleri Üzerine İleri Bak ış .......................... 213
Konu 1: Değer Tipleri......................................................................... 214
Built-In Değer Tipleri .................................................................. 214
Kullan ıcı Ta n ımlı De ğer Tipl eri....................................................... 215
Konu 2: Referans Tipleri.................................................................... 216
Built-In Referans Tipleri .............................................................. 216
Kullan ıcı Ta n ımlı Referans Tipleri ................................................... 217
Konu 3: Organizasyon Yapısını İnceleme ........................................ 218
Structure Organizasyon Yapısı ve Belle ğin İncelenmesi ......................... 219
Class Organizasyon Yap ısı ve Belle ğin İncelenmesi .............................. 222
ByVal ve ByRef İncelemesi................................................................ 229
Modül Sonu Soruları & Alıştırmalar .................................................. 231
Modül 9: Windows Programlama ................................... 235
Konu 1: Formlar ve Windows Forms Kontrolleri.............................. 236
Form Nesnesi ........................................................................... 237
Birden Fazla Form Oluşturmak.................................................. 237
Form Özelli kleri.................................................................... 240
Form Olayları ....................................................................... 240
Form Metotları ..................................................................... 241 Label..................................................................................... 242
Label Özelli kleri ................................................................... 242
TextBox .................................................................................. 244
TextBox Özellikleri ................................................................ 244
TextBox Olaylar ı ................................................................... 245
TextBox Metotları.................................................................. 245
Button ................................................................................... 248
Button Özellikleri.................................................................. 248
Button Olayları ..................................................................... 248 CheckBox................................................................................ 250
CheckBox Özellikleri .............................................................. 250
CheckBox Olayları ................................................................. 251
RadioBut ton ............................................................................ 252 GroupBox................................................................................ 252
Panel ..................................................................................... 252
Panel Özelli kleri ................................................................... 253
VIII İ çindekiler ListBo x.............................................................. 257
ListBox Özellikleri ................................................................. 257
ListBox Olayları .................................................................... 258
ListBox Metotlar ı .................................................................. 258
CheckedLis tBox ........................................................................ 262
CheckedListBox Özellikleri ...................................................... 262
CheckedListBox Metotları ........................................................ 262
ComboBox .............................................................................. 265
omboBox Özellikleri............................................................. 265
NumericUpDown ....................................................................... 268
NumericUpDown Özellikler i ..................................................... 268
NumericUpDown Olayları ........................................................ 269
NumericUpDown Metotlar ı....................................................... 269
DomainUpDown ........................................................................ 270
DomainUpDown Özellikler i ...................................................... 270
DomainUpDown Olaylar ı ......................................................... 271
HScrollBar / VScrollBar ............................................................... 272
ScrollBar Özel likleri ............................................................... 272
ScrollBar Olaylar ı .................................................................. 273
TrackBar ................................................................................. 274
TrackBar Özel likleri ............................................................... 274
TabContr ol ..............................................................................275
TabControl Öz ellikler i ............................................................ 275
TabPage Özel likleri................................................................ 276
DateTimePi cker ........................................................................ 278
DateTimePicker Özellikleri ...................................................... 278
MonthCalen dar ......................................................................... 281
MonthCalendar Özellikler i ....................................................... 281
MonthCalendar Olayları .......................................................... 282
Timer .................................................................................... 284
Timer Özellikleri ................................................................... 284
Timer Olaylar ı ...................................................................... 284
Timer Metotları .................................................................... 284
ProgressBar ............................................................................. 285
ProgressBar Özellikler i............................................................ 285
ErrorProvider ........................................................................... 288
ErrorProvider Öz ellikler i ......................................................... 288
ErrorProvider Metotları ........................................................... 288
PictureBox .............................................................................. 291
PictureBox Öz ellikleri............................................................. 291
ImageLis t................................................................................ 293
ImageList Özellikleri .............................................................. 293
İ çindekiler IX LinkLabe l ............................................................... 295
LinkLabel Özellikleri .............................................................. 295
LinkLabel Olayları ................................................................. 296
TreeView ................................................................................ 297
TreeNode Nesnesi ................................................................. 297
TreeNode Özellikleri .............................................................. 297
Tr e e N o d e M e to t l a r ı..................................................... 298
TreeView Özellikleri............................................................... 298
TreeView Metotlar ı ................................................................ 299
TreeView Olayları.................................................................. 299
ListView ................................................................................. 303
ListView Özellikleri................................................................ 303
ListView Olaylar ı ................................................................... 304
Dinamik Kontroller .................................................................... 307
Lab 1: Internet Taray ıcısı ............................................................. 310
Kontrollerin Eklenmesi ........................................................... 310
Kodlar ın Yazılmas ı ................................................................. 311
Lab 2: Dört Haneli Sayı Bulma Oyunu .............................................. 314
Kontrollerin Eklenmesi ........................................................... 314
Kodlar ın Yazılmas ı ................................................................. 315
Lab 3: Hafıza Oyunu................................................................... 318
Kontrollerin Eklenmesi ........................................................... 318
Kodlar ın Yazılmas ı ................................................................. 319
Lab 4: Hesap Makinesi ............................................................ 322
Kontrollerin Eklenmesi ........................................................... 322
Kodlar ın Yazılmas ı ................................................................. 322
Modül Sonu Soruları & Alıştırmalar .............................................. 325
Modül 10: Menü Tasarımı ve MDI Formlar................................... 329
Konu 1: Menü Tasarımı............................................................. 330 Menüler.................................................................................. 330
MainMenu ........................................................................... 330
ContextMenu ....................................................................... 334
ToolBa r .............................................................................. 335
ToolTi p............................................................................... 338
StatusBa r............................................................................ 340 NotifyIcon...........................................................................343
RichText Box ........................................................................ 344
Lab 1: Notepad Uygulaması .......................................................... 347
Kontrollerin Eklenmesi ........................................................... 347
Kodlar ın Yazılmas ı ................................................................. 350
X İ çindekiler MDI Form lar........................................................... 359
Fare Olayları ............................................................................ 362
MouseDown olay ı .................................................................. 362
MouseUp olay ı...................................................................... 362
MouseMove olay ı................................................................... 362
Lab 2: File Browser.................................................................... 363
Kontrollerin Eklenmesi ........................................................... 363
Kodlar ın Yazılmas ı ................................................................. 364
Modül Sonu Soruları & Alıştırmalar .................................................. 369
Modül 11: Veri Yapılar ı ................................................... 373
Konu 1: Access’ e Giriş....................................................................... 374
Access Ortam ı .......................................................................... 375
Veritabanı Nesnesi Oluşturmak ................................................. 376
Konu 2: Veri Yap ılarına Giriş ............................................................. 379
Metin Veri Tipleri ...................................................................... 380
Sayısal Veri Tipleri ..................................................................... 380
Tarih Veri Tipi........................................................................... 380
Evet/Hay ır Veri Tipi ................................................................... 380
OLE Veri Tipi ............................................................................ 381
Konu 3: Veri Modelleme Gereksinimleri........................................... 382
Birinci Normal Form................................................................... 383
Birincil Anahtar .................................................................... 385
Yabanc ı Anahtar ................................................................... 387
Te k i l K ısıtı (Unique Co nstraint).................................................. 389
Bire Bir İli şki ........................................................................ 389
Bire Sonsuz İli şki ................................................................... 390
Sonsuza Sonsuz İli şki .............................................................. 390
İkinci Normal Form .................................................................... 392
Üçüncü Normal Form ................................................................. 393
Uygulama: Alışveri ş Modeli........................................................... 395
Kaynak Yöneti mi Modülü ......................................................... 395
Müşteri Yöneti m Modülü ......................................................... 397
Modül Sonu Soruları & Alıştırmalar .................................................. 401
Modül 12: SQL’e Giriş..................................................... 405
Konu 1: Access ile Sorgu Oluşturmak .............................................. 406
SELECT FROM WHERE ................................................................. 409
İ çindekiler XI Hesaplama Fonksiyonları ............................................ 413
INSERT ................................................................................... 415
UPDATE .................................................................................. 417
DELETE .................................................................................. 418
Konu 2: INNER JOIN ile Tablo Birleştirmek ........................................ 419
Konu 3: GR OUP BY..................................................................... 421
Konu 4: Aritmetiksel İş lemler........................................................ 423
Modül Sonu Soruları & Alıştırmalar .................................................. 425
Modül 1: Programlamaya Giriş Bu modülde, bir programcının bilmesi gereken temel programlama kavramla-rına giri ş yap ılacakt ır. Bir program ı olu şturan ö ğeler ve program ın çalışma sü-reci tamamlanana kadar geçirdiği aşamalar ayrı ayr ı i şlenecektir. Bu kavramlar programcının ve programlama dillerinin tan ımlanmas ına yardımcı olacaktır. Bu modülün sonunda; ? Bir program ın çal ışma prensibini aç ıklayabilecek, ? Programcı kavram ını tan ımlayabilecek, ? Değişik programlama dillerinin geli şimini açıklayabilecek, ? Derleme işlemini tanımlayabileceksiniz. 4 Modül 1: Konu 1: Program Nedir? Günümüzde bilgisayarların kullanım alanlar ı büyük ölçüde artm ıştır. Dolayısıyla işlerimizi daha hızl ı ve düzenli bir şekilde yapmamız, bilgisayarlar ı ne kadar iyi kulland ığımıza bağlıdır. Bunun için de çe şitli amaçlara göre yaz ılan programları kullanırız. 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. Programlamaya Giri ş 5 Programlar ın Çal ışma Modeli Programlar ın kullanılmasındaki amaç, girilen bilgilerin işlenip sonuçlar ın iste-nen ş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 prog-ramlar, belirtilen yaz ım kuralları kontrol edilerek derlenir. Bu derleme i şlemi so-nunda, yaz ılan kaynak kodlar bilgisayar ın anlayaca ğı tek dile çevrilir. Makine dili denilen bu dil, sadece 1 ve 0 say ılarından olu şur. Örnek: ATM makinesinden para çekmek. 1. Kullanıcı ATM makinesine kart ını yerle ştirir. 2. Şifresini girer. 3. ATM cihazında çalışan uygulama kartta yazan bilgileri okur. 4. Şifre kontrolü i şlemi yap ılır. 5. Şifre do ğru girilmi şse kullan ıcı çekmek istedi ği miktarı girer. 6. Bankadaki hesap kontrol edilir. 7. Uygunsa kullanıcıya ödeme yapar. 6 Modül 1: Konu 2: 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ıla-rın ço ğu genellikle aynı i şi gerçekleştirse de, üstlendikleri görevlere göre prog-ramcılar üç gruba ayr ılabilir: ? Mimar. Programların yazılması için gerekli teknolojileri belirleyen, ge-rekli 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. Programlamaya Giri ş 7 Konu 3: Programlama Dilleri Dünyada konuşulan her dilin amacı ileti şim sa ğlamakt ır. Farkl ı kültürlerden in-sanlar ın anla şabilmesi için ortak konu ştuklar ı bir dil gerekir. Programlama dillerinin amacı da bilgisayar ile programcının haberleşmesidir. Programc ı, bilgisayara hangi komutlar ın çalıştırması gerektiğini bilgisayarın anlayaca ğı dil-den konu şarak söyler. Bilgisayarda, programlar makine diline çevrildikten sonra çalışır. 1 ve 0 sayılarından olu şan bu makine dili, en alt seviye dildir. Dolay ısıyla programların bu dilde yazılması oldukça zordur. Programcılar konu şma diline daha yakın, kolay anlaşılabilecek diller kullan ır. Bu dillere yüksek seviye programla dilleri denir. Programlama dillerinin seviyeleri, makine diline yak ın olup olmamaları ile ölçülür. Bir programlama dili şu unsurlardan oluşur: ? Söz dizimi (Syntax). Bir dil, kendine ait kelimeler ile konu şulur. Prog-ramlama dillerinin de benzer bir davran ışı vardır. Programlama dillerin-deki bu kelimeler, programlama dilinin anahtar kelimeleridir (komutlar ı-dır). ? Gramer. Programlama dillerini kullanmak için sadece kelimeleri bilmek yeterli de ğildir. E ğer anlaml ı bir şekilde bir araya getirilemiyorsa, bu keli-meler hiçbir anlam ifade etmez. ? Semantik (Anlamsal). Bir dili, kelimeleri do ğru bir gramer kullanımı ile bir araya getirerek kullanabiliriz. Ancak konuşulan kelimelerin ne için kullanıld ığı da önemlidir. Bir programlama dilinin özelliklerinin nasıl ve ne için kullanıld ığı da, bu dilin semanti ğidir. 8 Modül 1: Örneğin bir finans program ı, Yeni Türk Liras ı cinsinden bir miktarı dolara çevirecektir. Yap ılacak i şlem, o andaki parite de ğerini merkez bankasından al-dıktan sonra, girilen miktarı bu de ğerle çarp ıp kullanıcıya göstermektir. Kullan ı-lan programlama dili ÇARP, GÖSTER, EŞİTLE komutları ile bu işlemi gerçekle ştirecektir. ÇARP EŞİTLE GÖSTER miktar parite sonuç Bu şekilde yazılan program söz dizimi açısından do ğrudur. Girilen veriler ve komutlar dışında, programlama dilinin anlamayaca ğı bir kelime kullanılmam ış-tır. Ancak komutlar yanl ış sırada kullan ılmıştır. ÇARP komutu hangi sayıları çarpmas ı gerektiğini bilemeyecektir. parite E ŞİTLE sonuç ÇARP miktar GÖSTER parite Komutlar ı ve de ğişkenleri, programlama dilinin gramerine göre do ğru yerlerde kullanmam ız gerekir. Bu şekilde kullanılan komutlar do ğru bir şekilde çalışır. Fakat GÖSTER komutunun ne için kullan ıld ığı yani semantiği de önemlidir. İstenilen, miktar ile pariteyi çarpmak, sonuca e şitlemek ve sonucu göstermektir. sonuç EŞİTLE miktar ÇARP parite GÖSTER sonuç Ş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 se-viye bir dil olarak değerlendirilir. Programlamaya Giri ş 9 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ştire-rek veya yeni bileşenler eklenerek yapılıyordu. Program ın i şlemesi için bir devi-nime 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 edi-yordu. 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 ı. 10 Modül 1: 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 ve-ren 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 se-viye 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. 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 mo-deli olan nesne yönelimli programlama (Object Oriented Programming – OOP) ortaya çıkarıld ı. C dilinin ve OOP modelinin tüm özellikleriyle C++ dili olu ştu-ruldu. C++ dilini, Sun Microsystems tarafından ç ıkart ılan Java takip etti. Java dilinin kullanım alanları, nesneye yönelimli bir programlama dili olması ve berabe-rinde 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. .NET platformu hakk ında daha detayl ı bilgi için Modül 2’ye bakın. Programlamaya Giri ş 11 Konu 4: 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 uy-gun 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 di-line çevrilir. Ancak bir yaz ım veya mantık hatası varsa, programcıya ge-rekli hata mesaj ı verilerek derleme i şlemi iptal edilir. ? Makine diline çevrilen kodlar çalıştırılır. 12 Modül 1: Modül Sonu Soruları & Al ıştırmalar 1. Varolan bir metin dosyasını ( .txt) görüntülemek için Notepad progra-mını kullanabiliriz. İş letim sistemi, dosyay ı kullan ıcılara göstermek için monitör ile ileti şim kurar. Monitör, i şletim sisteminden gelen verilerle ge-rekli görüntüleme i şlemlerini yapar. Bu senaryodaki program çeşitlerini belirtin. 2. Bir arkadaşımıza e-posta yollamak istedi ğimizde, e-posta adresi, konu ve mesaj bilgilerini gireriz. Daha sonra e-posta uygulaması mesaj ımızı verilen adrese yollar. Programın çal ışma modelinin aşamalar ını belirtin. 3. C dilini kullanarak yazdığınız kodların bilgisayar taraf ından çal ıştırılabilir hale gelmesi için hangi aşamalar ın gerçekleşmesi gerekir? Modül 2: 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. Bu modülü tamamlad ıktan sonra; ? Microsof.NET platformu hakkında genel bilgi sahibi olacak, ? .NET Framework ve bileşenlerini açıklayabilecek, ? Microsoft .NET platformunun yaz ılım geliştiricilere sunduğu avantajlar ı tan ımlayabileceksiniz. 16 Modül 2: Konu 1: Yazılım Geliştirme Dünyası Microsoft 1975 yılında Bill Gates ve Paul Allen tarafından kuruldu ğunda, viz-yonu “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 gereksi-nim 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 ği-miz 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. 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 uygula-maları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, ol-dukç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 uygu-lama 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 sun-maktan 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 ı kodla-rı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 za-man istenen düzeye ula şamayaca ğımızdır. Ke şke ihtiyaç duydu ğumuz tüm alt-yap ı 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 ilet ecekti. Sonra da siz ancak şirketinize dönebildi ğiniz zaman tedarikçilerle teker teker irtibata geçerek hangisi- Microsoft .NET Platformu 17 nin şirketiniz için en yararl ı olduğuna karar verecektiniz. Sipariş ve tesli-mat 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 üze-rinden 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. 18 Modül 2: Konu 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, kesinti-siz, hatasız ve güvenli bir şekilde ve istedikleri platformdan erişebilme-leri gereksinimi. ? Uygulama geliştirme sürecinde, geli ştiricilerin altyapı kodlar ı ile uğra ş-ması ve bunun sonucunda, uygulama geli ştirme ve test süresinin uza-ması. ? Bir uygulamanın farkl ı platformlarda çalıştırılabilmesi için, ayn ı i şlemleri gerçekle ştirecek kodlar ın tekrar tekrar yazılması gereksinimi. Microsoft .NET Platformu 19 Konu 3: Çözüm Platformu Microsoft 1990 yılında, yaşanacak 10 yılı da öngörerek, bu ve benzeri sorun-lara çözüm sunacak, uygulama geli ştiricilerin ve son kullanıcıların işlerini kolay-la ş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 plat-forma ba ğlam ıştı. Çok geni ş bir analiz ve geliştirme ekibinin çalışmaları sonu-cunda 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ştirebilmele-rine olanak tanıyordu. Uygulama geli ştiriciler şifreleme, kimlik do ğrulama, yetki-lendirme, soket ileti şimi, her türlü veri kaynağına yönelik veritaban ı i şlemleri, XML ve Web servisi teknolojilerine kadar burada saymadığımız (editörler bir modülün 100 sayfayı geçmesine pek s ıcak bakmıyorlar) pek çok teknolojiyi ve hatta milyonlarca haz ır sınıf ve fonksiyonu kar şılarında gördüler. Bugüne kadar günler, haftalar ve hatta aylar harcayarak geliştirmeye çal ıştıklar ı bu yapıların hepsini, karşılarında kullanıma hazır bir şekilde görmekten de son derece memnunlardı. Modül 3: Microsoft Visual Studio Arayüzü Bu modül, Microsoft Visual Studio arayüzünü tan ımayı sağlar ve etkili bir bi-çimde kullanmayı gösterir. Ev ve işyerindeki çalışma ortamını düzenlemek, daha verimli çal ışmayı sağlar. Yazılım geliştirirken de çal ışılan ortamı tan ımak ve ki şiselleştirmek, rahat çal ışmak açısından önemlidir. Bu modülü tamamlad ıktan sonra; ? Microsoft Visual Studio çal ışma ortamını tan ıyacak, ? Menülerin işlevlerini aç ıklayabilecek, ? Başlang ıç sayfasının özelliklerini kullanabilecek, ? Solution Explorer, Toolbox, Properties panellerini tanıyacak, ? Microsoft Visual Studio yardımını etkili bir şekilde kullanabileceksiniz. 24 Modül 3: Konu 1: Visual Studio Çalışma Ortamı Visual Studio, çok geli şmiş özelliklere ve yardımcı araçlara sahip bir dosya editörüdür. .NET platformu üzerinde geli ştirilen proje dosyalar ı d ışında, metin dosyalar ı, *.sql ve *.rtf uzant ılı dosyalar da düzenlenebilir. Visual Studio or-tam ını olu şturan ve kullanımını kolaylaştıran dört ana bile şen vardır: Çalışma Sayfaları Visual Studio ortamında dosyalar, birer çalışma sayfası (Tab Pages) olarak aç ı-lır. Bu dosyalar sekmeler halinde s ıralanır. Sayfalar aras ında CTRL+TAB kısayolu ile geçi ş yap ılır. Bu çal ışma modelinde, sadece bir sayfa görünür ve üzerinde çalışma yapılır. Ancak Visual Studio bize, çal ışma ortamını parçalara bölme imkan ı verir. Örnek: 1. Visual Studio çalışma ortamını açın. Başlang ıç sayfas ı kar şınıza ç ıkar. (E ğer başlang ıç sayfas ını göremiyorsanız, Help menüsünden Show Start Page komutunu seçin.) 2. View menüsünden, Web Browser alt menüsünü işaretleyin ve Show Browser komutunu seçin. Visual Studio, açmak istediğimiz Internet tarayıcısı için yeni bir sayfa olu şturur. 3. CTRL tuşunu bas ılı tutarak TAB tuşuna bas ın. Açt ığınız Internet tarayıcısından başlang ıç sayfasına dönülür. 4. Başlang ıç sayfas ını sağ t ıklay ın ve açılan menüden New Vertical Tab Group komutunu seçin. Visual Studio, sayfaları “sekme gruplarına” ayırarak birden fazla sayfa üzerinde çalışma imkanını sağlar. Microsoft Visual Studio Arayüzü 25 5. Başlang ıç sayfas ını, sayfa başlığını t ıklay ıp fare dü ğmesini basılı tuta-rak Internet tarayıcısının bulunduğu sekme grubuna taşıyın. RESİM 3.1. İPUCU Visual Studio ortam ını bir Web tarayıcısı olarak kullanabilirsiniz. Araç Çubukları Visual Studio, menü komutları için görsel k ısayolları araç çubukları (Toolbars) ile sunar. Benzer i şlemler için kullan ılan komutlar bir araç çubu ğunda gruplanır. Örneğin Standard araç çubu ğu, yeni dosya oluşturmak, bir dosyay ı açmak ve kaydetmek gibi genel dosya işlemleri için kullanılır. Araç çubuklar ı, varsay ılan durumda menülerin alt ında bulunur. Ancak araç çu-buklar ı taşınarak yerleri de ğiştirilebilir veya kayan duruma getirilebilir. Ayr ıca istenen araç çubuklar ı saklanabilir veya gösterilebilir. Araç çubuklar ının listesini görmek için View menüsünden Toolbars alt menüsünü i şaretleyin. Visual Studio bize kendi araç çubuklar ımızı olu şturma imkanı da verir. Farkl ı i ş-levlere sahip komutlar gruplan ıp, ki şisel bir araç çubuğu oluşturulabilir. Örnek: 1. Başlang ıç sayfas ının üstündeki bir araç çubu ğunu sa ğ t ıklay ın. Açılan menüde, varolan tüm araç çubuklar ı listelenir. İş aretli olan araç çubuk-ları eklenmi ş araç çubuklar ıdır. Bu listeden Web araç çubu ğunu seçin. 2. Web araç çubuğunu çift t ıklay ın. Bu i şlem, araç çubu ğunu “Floating” (kayan menü) durumuna getirir. Tekrar çift t ıklandığında, araç çubuğu “Dockable” (sabit) durumuna gelir. 3. Araç çubuğunu sağ t ıklay ın. Açılan menünün en alt ındaki Customize (özelle ştir) komutunu seçin. 4. Toolbars sekmesinde New (yeni) komutunu t ıklay ın. Açılan pencerede araç çubuğunun ismi için “Genel İş lemlerim” yaz ın. OK dü ğmesini tıkla-yın. Visual Studio, verilen isimde bir araç çubuğu oluşturur ve kayan durumda görüntüler. 5. Commands (komutlar) sekmesinde, Categories (kategoriler) listesinden Help kategorisini seçin. Bu listenin yan tarafında bulunan Commands listesinden Index komutunu bulun. Bu komutu ta şıyıp, oluşturduğumuz “Genel İş lemlerim” araç çubu ğuna bırak ın (Resim 3.2). 26 Modül 3: RESİM 3.2: Araç çubu ğu oluşturmak. Bu şekilde şu komutları da ekleyin: Categories Commands Tools Options File Exit View Show Web Browser Window Close All ********s 6. Araç çubuğunu çalışma ortamının alt ına taşıyarak sabitleyin. 7. Araç çubuğunu sa ğ t ıklay ın ve listeden “Genel İş lemlerim” araç çubu-ğunu seçerek çal ışma ortamından kaldırın. Menüler Birçok çalışma ortamının yapt ığı gibi, Visual Studio da benzer öğeler üzerinde işlevleri olan komutlar ı menüler halinde gruplar. Menülerin araç çubuklar ından fark ı, sabit olmalar ı ve özelleştirmeye aç ık olmamalarıdır. Menüler bu modülde detaylı olarak ele al ınacakt ır. Paneller Paneller, Visual Studio içindeki pencerelerdir. Çalışma ortamında birçok panel bulunur. Bunlar aras ında Solution Explorer, Toolbox, Object Browser, Proper-ties, Watch, Output, Search Result, Task List gibi s ıkça kulland ığımız paneller sayılabilir. İPUCU Görmek istenen paneller View menüsünden seçilebilir. Microsoft Visual Studio Arayüzü 27 Paneller, Visual Studio ortam ı içersinde istenen yere taşınabilir veya sabitlenebilir. Panellerin birkaç genel özelliği vard ır: ? Auto Hide (Otomatik gizle). Panelin, fare imleci üzerindeyken gözük-mesi ve imleç çekildikten sonra gizlenmesidir. ? Dockable (Sabitlenebilir). Panelin, Visual Studio ortam ı içersinde bir yerde sabitlenebilme özelli ğidir. ? Floating (Kayan). Kayan paneller herhangi bir yere sabitlenemez. An-cak her sayfanın üstünde durur ve böylece sürekli görünür. Panellerin bu özelliklerine Window menüsünden erişilebilir. Örnek: 1. View menüsünden Other Windows alt menüsünü işaretleyin ve Favor-ites panelini seçin. Panelin ba şlığında, biri Auto Hide, diğeri Close ol-mak üzere iki dü ğme görülür. 2. Auto Hide düğmesini tıklayarak paneli gizleyin. 3. Paneli tekrar seçin, Window menüsünden Auto Hide özelliğini seçin. Daha sonra ayn ı menüden Floating özelli ğini seçin. Panelin ta şınabil-di ği, ancak sabitlenemedi ği görülür. 4. Panel seçiliyken, Window menüsünden Dockable özelliğini seçin. Bu sefer, panelin taşındığında çalışma ortamının herhangi bir yerine sabitlenebildiği görülür. 5. Panel seçiliyken, Window menüsünden Hide komutunu seçin. Paneli tekrar açmak için bu ad ımlar ı tekrarlay ın. 28 Modül 3: Konu 2: Start Page Visual Studio çalışma ortamını açt ığımız zaman karşımıza ilk gelen başlang ıç sayfas ıdır. Bu sayfa üç bölümden olu şur (Resim 3.3). ? Projects. O ana kadar çalıştığınız projeleri gösterir. Bu menüden son projelerinizi açabilirsiniz. Son projelerde gözükmeyen bir proje (Open Project) veya yeni bir proje (New Project) de açabilirsiniz. ? Online Resources. Bu bölümde örnek uygulamalar (Find Samples), ipuçlar ı bulabilir, en yeni teknolojileri, güncellemeleri veya en son ekle-nen haberleri takip edebilir, MSDN kütüphanelerinde kod örnekleri ve makaleler araştırabilirsiniz. ? My Profile. Bu bölümde çalışma şeklinize göre bir profil seçebilirsiniz. Profiller; kullanılan kısayollara, panellerin yerlerine ve görünümlerine, Visual Studio yardımını kullan ırken yap ılan filtrelemeye göre de ğişir. Örneğin, profili Visual Basic Developer olarak ayarlarsak Toolbox, sayfaların sol tarafında çivili olarak durur. Yard ım panelinde bir arama yapmak istedi ğimizde ise, sonuçlar Visual Basic filtresine göre ç ıkar. Ayrıca Solution Explorer paneli CTRL+R k ısayolu ile açılır. Microsoft Visual Studio Arayüzü 29 RESİM 3.3: Start Page. Görünüm, kısayollar ve yard ım filtresi birbirinden bağımsız olarak da ayarlanabilir. Bu durumda seçilen profil, custom (özel) olarak gözükecektir. At Startup seçeneklerinden, Visual Studio açılırken hangi pencerenin gözükeceğini belirleyebilirsiniz. Örne ğin, ba şlang ıçta en son çalıştığınız proje-nin aç ılmasını istiyorsanız, “Load last loaded solution” seçeneğini tercih etmelisiniz. İPUCU Giriş sayfasını kapattıktan sonra, Help menüsünden Show Start Page seçeneğini tıklayarak açabilirsiniz. 30 Modül 3: Konu 3: Menüler Visual Studio menüleri birçok uygulamanın menülerine benzer niteliktedir. Menü isimlerinde, belirli bir harfinin altı çizilmi ştir. Belirtilen harflere ALT tuşu ile birlikte bas ıld ığında, o menülere kısayolla ula şılır. Menü komutlar ının bazıla-rında ise, sadece o komuta özel bir k ısayol tan ımlıdır. Bu k ısayollar CTRL veya SHIFT gibi birkaç tu ş kombinasyonu ile gerçekle şir. ? File (Dosya). Tüm dosya i şlemleri bu menü alt ındadır. Standard araç çubuğu ile bu menüdeki bazı komutlara ulaşılır. File menüsündeki ko-mutlar ile: ? Yeni bir proje, bir dosya veya boş bir çözüm (solution) olu şturmak, ? Oluşturulmuş bir projeyi veya varolan bir dosyay ı açmak, ? Web üzerinde paylaştırılmış dosya veya projeler açmak, ? Açık olan dosya veya projeleri kapatmak, ? En son kullanılan dosya veya projeleri (Recent Files) açmak, ? Dosyalar ı kaydetmek, yazd ırmak mümkündür. ? Edit (Düzenle). Tüm yazı düzenleme işlemleri için, bu menüdeki komutlar kullanılır. Text Editor araç çubu ğu da bu menünün komutlarına kısayoldur. Edit menüsündeki komutlar ile: ? Copy, Cut, Paste, Delete, Select All gibi temel işlemleri ? Find And Replace, Go, Bookmark gibi navigasyon işlemleri ? Outlining ile metinleri gruplama işlemleri ? Satırlar ı yorum sat ırı yapma, yorum satırlar ını kaldırma, büyük-kü-çük harf çevrimi gibi ileri seviye işlemler gerçekle ştirilir. Microsoft Visual Studio Arayüzü 31 ? View (Görünüm). Visual Studio çal ışma ortamındaki tüm paneller bu menü komutlarıyla gösterilir. Ayrıca Navigate Backward ve Navigate Forward komutlarıyla en son çal ışılan sat ıra geri dönülür. ? Project (Proje). Projeye dosya eklemek, ç ıkarmak, proje özelliklerini göstermek için bu menü kullan ılır. ? Build (Derleme). Projelerin çalışmak üzere derlenmesi için gereken komutlar, bu menü alt ındadır. ? Debug (Hata Ayıklama). Projede hata ayıklarken gereken komutlar Debug menüsü altındadır. Projeyi Debug durumunda ba şlatmak, BreakPoints (hata ayıklarken durulması gereken sat ırlar ı ayarlamak) gibi i şlemler yap ılır. ? Tools (Araçlar). Visual Studio ile beraber yüklenen yard ımcı araçların listelendi ği menüdür. Araç çubuklar ını özelle ştirmek için kullan ılan Cus-tomize seçeneği gibi Options seçeneği de en s ık kullanılan özellikler-den biridir. Visual Studio çalışma ortamının tüm ayarları Options menüsünden yap ılır. Environment ve Text Editor en s ık kullanılan seçeneklerdir. ? Environment (Ortam). Sayfa düzeni ve görünüm ayarları, yazı tipi (font) ve renk ayarlar ı, komutlar için k ısayol ayarları, Internet tarayı-cısı ayarları, yard ım ve dinamik yardım ayarlar ı buradan yap ılır. ? Text Editor (Metin düzenleyicisi). Farkl ı programlama dillerine özgü yaz ı düzeni ayarları buradan yap ılır. Örnek: 1. Tools menüsünden Options komutunu seçin. 2. Sol panelde bulunan Environment menüsünden Fonts and Colors (Yaz ı düzeni ve renkler) sekmesine gelin. 3. Sağ panelde bulunan Display items (Ö ğeleri listele) menüsünden Text alan ını seçin ve Item background (Ö ğe arka plan ı) özelli ğini Light Grey (Açık gri) olarak belirleyin. Tüm sayfalar ın arka plan rengi aç ık gri olacakt ır (Resim 3.4). 32 Modül 3: RESİM 3.4: Arka plan renginin değiştirilmesi. 4. Sol panelde Environment menüsünden Web Browser sekmesine gelin. Home Page (ana sayfa) özelli ğinin alt ındaki Use Default seçeneğini kald ırın ve metin kutusuna Bilge Adam Bilgi Teknolojileri Akademisi - Hoşgeldiniz yaz ın. 5. Sol panelde Text Editor menüsünden Basic alt menüsünü seçin. Burada Visual Basic diline özel metin düzenleme seçenekleri bulu-nur. Sağ panelde, Display sekmesinin alt ında Line Numbers (Sat ır numaraları) seçeneğini i şaretleyin. Bu seçenek, Visual Basic projelerinde çalışırken sat ır numaralar ını gösterir. ? Window (Pencere). Sayfalar ın ve panellerin görünümlerini ve özellikle-rini de ğiştirmek için kullanılan komutlar bu menü alt ında bulunur. Tüm açık çalışma sayfaları bu menü alt ında görüldüğü gibi, istenen sayfa seçilerek ön plana getirilir. Ayr ıca, Close All ********s (Tüm sayfaları kapat) komutu ile aç ık olan bütün sayfalar kapat ılır. Auto Hide All (Tü-münü otomatik gizle) komutu ile, sabit hale getirilmiş tüm paneller gizle-nir. ? Help (Yardım). Visual Studio çalışma ortamında çok sık kullanılan yar-dım panellerinin görünümü bu menü ile sağlan ır. Bu menü ile ayr ıca, kullanılan Visual Studio çal ışma ortamının sürümü hakkında bilgi alınır, son güncellemeler kontrol edilir, teknik destek için gereken e-posta ad-reslerine veya telefonlara ula şılır. Yardım kullanımı bu modülde detayl ı olarak ele al ınacakt ır. Microsoft Visual Studio Arayüzü 33 Konu 4: 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 (Resim 3.5) çözüm içinde bulu-nan tüm projelerle, ilgili dosya ve klasörler görüntülenir. Panelde koyu yazı ti-pinde gözüken proje, çözüm içindeki başlang ıç projesidir. Bu panelden, öğeler üzerinde silme, kopyalama, ta şıma ve ismini de ğiştirme işlemleri yap ılabilir. Ayr ıca panelin üst k ısmında, seçilen ö ğe üzerinde basit iş-lemler gerçekle ştirmek için bir araç çubu ğu bulunur. ? ******* (Yenile). Proje dosyalar ı üzerindeki değişikliklerin gözükme-sini sa ğlar. ? Show All Files (Bütün dosyalar ı göster). Seçilen projenin bulundu ğu klasördeki tüm dosyalar ı ve alt klasörleri gösterir. Panelde gözüken be-yaz ö ğeler proje içine dahil edilmemiş öğelerdir. Proje kapsamında kullanılmak istenen ö ğeler (örneğin, arka plan resmi), sa ğ t ıklan ıp In-clude In Project komutu ile projeye dahil edilmelidir. ? Properties (Özellikler). Paneldeki tüm ö ğelerin özellikleri, Properties komutu ile görülebilir. Bu komut seçildiğinde, ö ğenin özellikleri Proper-ties paneli ile görüntülenir. (Properties paneli bu modülde detayl ı olarak ele alınacakt ır.) 34 Modül 3: RESİM 3.5: Solution Explorer paneli. Solution Explorer paneli, View menüsünden görülebildiği gibi, varsay ılan klavye seçeneklerinde CTRL+ALT+L k ısayolu ile de görülebilir. Microsoft Visual Studio Arayüzü 35 Konu 5: Toolbox Paneli Toolbox (Araç kutusu) paneli, projelerde kullan ılan çe şitli bile şenlerin listelen-di ğ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. ClipBoard Ring sekmesinde ise kopyalanan metinler bulunur. Nesnenin silik gözükmesi, o anda çal ışılan sayfada kullan ılamayacağı anlam ına gelir (Resim 3.6). RESİM 3.6: Toolbox paneli. Toolbox panelinde nesneler, en s ık kullanılandan en az kullanılana göre s ırala-nır. Örneğin, Windows Forms sekmesinde en üstte Label , Link Label, Button, TextBox nesneleri bulunur. Nesneler, yerleri ve sıralar ı taşınarak 36 Modül 3: değiştirilebilir, ayr ıca başka bir sekmeye de ta şınılabilir. Varsay ılan sıralama d ı-şında, alfabetik olarak da sıralama yap ılabilir. Visual Studio çalışma ortamı, Toolbox panelindeki nesnelere yeni isim verme, nesneleri silme veya panele yeni sekmeler ve nesneler ekleme imkanlar ını da sağlar. Örnek: 1. View menüsünden Toolbox panelini seçin. 2. Panelde herhangi bir yeri sa ğ t ıklay ın ve Show All Tabs (Bütün sekme-leri göster) komutunu seçin. 3. Windows Forms sekmesinde TextBox nesnesini sa ğ t ıklay ın. Ç ıkan menüden Rename Item (Ad Değiştir) komutunu seçin ve “Metin Kutusu” yazın. 4. “Metin Kutusu ” nesnesini ta şıyarak sekmenin en üstüne getirin. 5. Paneli sa ğ t ıklay ın ve Sort Items Alphabetically (Nesneleri alfabetik ola-rak sırala) komutunu seçin. Metin Kutusu nesnesinin, alfabetik s ırada yerini ald ığı görülür. 6. Paneli sağ t ıklay ın ve Add Tab (Sekme ekle) komutunu seçin. Sek-meye “ Medya ” ismini verin. 7. Sekmeyi sa ğ t ıklay ın ve Add/Remove Items (Nesne Ekle/Kald ır) komu-tunu seçin. Customize Toolbox iletişim kutusu aç ılır. Burada Toolbox paneline eklenebilecek tüm bileşenler listelenir. Com Components sek-mesine gelin ve listeden Windows Media Player nesnesini i şaretleyin. OK dü ğmesini tıklayarak iletişim kutusunu kapatın. Windows Media Player nesnesinin, olu şturulan Medya sekmesine eklendi ği görülür. Toolbox paneline varsayılan klavye seçeneklerinde CTRL+ALT+X k ısayolu ile ulaşılır. Microsoft Visual Studio Arayüzü 37 Konu 6: Properties Paneli Properties (Özellikler) paneli (Resim 3.7) , 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. RESİM 3.7: Properties paneli. 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. 38 Modül 3: Konu 7: Help Kullanımı Yazılım geliştirirken en çok kullanacağımız kaynaklar yard ım dosyaları olacak-tır. Bir programlama dilinin çok çe şitli özellikleri ve kullanım farkl ılıklar ı olabilir. İyi bir programcı bütün bu özellikleri ezbere bilen de ğil, bu özellikleri en kısa sü-rede bulan, ö ğrenen ve kullanan programc ıdır. Yard ım dosyalarının kullanımını bilmek, programcılığın temelini oluşturan önemli unsurlardan biridir. DİKKAT Visual Studio yard ımını kullanmak için, MSDN (Microsoft Developer Network) yard ım kütüphanelerinin yüklenmiş olmas ı gerekir. Visual Studio yard ımı programcıya, gelişmiş özelliklere sahip paneller ve yar-dım dosyaları ile geniş bir kullan ım kolaylığı sağlar. Visual Studio yard ım dosyalarının yapısı, ba şlık, içerik ve ili şkili konular (See Also) bölümlerinden oluşur. Ayr ıca her yardım dosyasının altında bulunan Send Comments bağlant ısı ile konu hakk ında yorum gönderilebilir. Visual Studio yard ım panelleri Dynamic Help, Search, Index ve Contents ola-rak dörde ayr ılır. Bu panellere, Help menüsünden ula şılabilir (Resim 3.8). RESİM 3.8: Help menüsü. Microsoft Visual Studio Arayüzü 39 Dynamic Help Dynamic Help (Dinamik yardım) paneli, içeriği otomatik olarak de ğişen bir araçtır. Kod yazarken, panellerde veya sayfalarda nesneler seçildi ğinde, kullanıcının ba şka bir i şlem yapmas ına gerek kalmadan, o nesne hakk ındaki yard ım konularını listeler. F1 tuşuna bast ığımız zaman ise, seçilen nesneye ait, Dynamic Help panelindeki ilk yardım konusu yeni bir sayfada görüntülenir. Paneldeki yardım konuları Help, Samples ve Getting Started olarak üç bölüme ayrılmıştır. Help bölümü, seçilen nesneyle ilişkili olan kavramlar ın listelendi ği bölümdür. Samples, konuyla ilgili kod örnekleri bulunan yardım dosyalar ını gösterir. Getting Started, çalışılan sayfalara göre de ğişen, temel i şlemleri içeren ba şlang ıç yazılarını gösterir. Search Search (Arama) paneli, MSDN kütüphanelerinde arama yap ılan paneldir. Look for metin kutusuna, aranacak anahtar kelimeler girilir. Filtered by (Filtreleme) ile arama sonuçlar ı belli konulara göre s ınırlan ır ve istenmeyen seçeneklerin gösterilmesi engellenir. Search panelinde, Search in titles only, Match related words, Search in previ-ous results, Highlight search hits arama seçenekleri bulunur: ? Search in titles only. Sadece konu ba şlıklar ında arama yapar; içerik kısmına bakmaz. ? Match related words. Kelimeleri yaz ıld ığı gibi arar; benzer yaz ımlı kelimeleri aramaz. ? Search in previous results. İlk aramadan sonra aktif olan bu seçenek ile kelimeler, bir önceki aramada bulunan sonuçlar aras ında aran ır. ? Highlight search hits. Bulunan yard ım sayfalarında, aranan kelimele-rin seçili olmasını sağlar. Bulunan sonuçlar Search Results (Arama Sonuçlar ı) panelinde gösterilir. Bu panelde; ? Title, konunun başlığını ? ********, MSDN kütüphanelerinde hangi başlık alt ında bulunduğunu ? Rank, konunun aranan kelimeye olan yakınl ık derecesini ifade eder. Index Index (Dizin) paneli, yard ım dosyalarındaki bütün konuları alfabetik s ırada di-zer. Filtreleme işlevi, arama panelinde oldu ğu gibidir. Bu panelin özelliği, arana-cak kelime yaz ılırken, bu kelime ile ba şlayan tüm konular ın alfabetik sırada gösterilmesidir. Bu şekilde, aranan konulara çok hızl ı bir şekilde ula şılabilir. Eğer bir konu ile ilgili birden fazla yardım dosyası varsa, Index Results (Dizin Sonuçlar ı) panelinde bu seçenekler gösterilir. 40 Modül 3: Contents Contents (İçerik) panelinde, tüm MSDN içeri ği konulara göre hiyerar şik yap ıda, kategorilere ayr ılmış olarak gösterilir. Bu panelde de aynı şekilde filtreleme yap ılarak istenmeyen içerikler ç ıkart ılabilir. Bir yardım dosyası açıkken, Help menüsünden Sync Contents (İçerik senkroni-zasyonu) komutu seçilerek o yardım dosyasının Contents panelindeki yeri bulunabilir. Microsoft Visual Studio Arayüzü 41 LAB 3.1: Help Kullan ımı Bu lab tamamlandıktan sonra: ? Dynamic Help kullanımını ö ğrenecek, ? Search paneli ile arama yapabilecek, ? Contents paneli ile MSDN kütüphanelerinin hiyerarşik yap ısını ö ğrene-cek, ? Index paneli ile içeriğe hızl ı bir şekilde ula şabilecek, ? Yard ım dosyalarını yorumlayabileceksiniz. Bu lab ı tamamlamak için, MSDN yard ım kütüphaneleri yüklenmiş olmal ıdır. Dynamic Help 1. Help menüsünden Show Start Page komutunu seçin. 2. Help menüsünden Dynamic Help komutunu seçerek Dynamic Help panelini açın. Panelde gösterilen ilk konunun ismi nedir? 3. CTRL+ALT+X tuşlarına basarak Toolbox panelini açın. Dynamic Help menüsünde ne değişti? 4. Toolbox panelinde, Windows Forms sekmesindeki Button nesnesini seçin. Dynamic Help panelindeki ilk konunun ismi ne olarak de ğişti? 5. Button seçiliyken F1 tuşuna basın. Açılan sayfan ın ismi nedir? Contents 1. Help menüsünden Sync Contents ko mutunu seçin. Button Members konulu yard ım dosyası hangi konular ın alt ında bulunuyor? 2. Contents panelinin ilk başlığı olan Visual Studio .NET alt ında, Getting Assistance Æ "Using Help in Visual Studio .NET” Æ “Tips for Using the Help Keyword Index” konulu yardımı açın. File menüsünden Print komutunu seçin ve sayfay ı yazdırın. DİKKAT Sayfayı yazd ırmak için bilgisayar ınıza bağlı bir yazıcı bulunmas ı gerekir. İPUCU Yardım dosyalarını yazd ırmak, özellikle uzun metinlerde kolay çal ışma imkanı sağlar. 3. Contents panelini kapat ın. Search 1. Help menüsünden Search komutunu seçin. Look for metin kutusuna Visual Studio .NET yaz ın. Search in titles only ve Match related words seçeneklerini i şaretleyin. Search düğmesini tıklay ın. Kaç tane konu bulundu? En üst dereceli konu nedir? 42 Modül 3: 2. Search in previous results seçeneğini i şaretleyin. MSDN kelimesini ara-tın. Kaç konu bulundu? 3. Search in previous results seçeneğinin i şaretini kaldırın. MSDN kelime-sini tekrar arattığınız zaman kaç konu bulundu? Search in titles only se-çeneğinin i şaretini kaldırınca kaç konu bulundu? 4. Search Results ve Search panellerini kapat ın. Index 1. Help menüsünden Index komutunu seçin. Look for metin kutusuna "file types" yaz ın. İlk ç ıkan konu nedir? 2. Filtre olarak Visual Basic seçene ğini i şaretleyin. İlk olarak hangi konu gösterilir? 3. “File Types” konusunu tıklay ın. Açılan sayfada Solution Files (.sln and .suo) adl ı bölümü inceleyin. 4. Project Files başlığında, Visual Basic and Visual C# alt ba şlığının alt ın-daki “File Types and File Extensions in Visual Basic and Visual C#” konusunu t ıklay ın. 5. Açılan yard ım dosyasını inceledikten sonra, sayfanın See Also başlığı alt ındaki “What's New in Projects” konusunu sa ğ t ıklay ın. Açılan menüden “Open Link in New Window” komutunu seçin. Window menüsünden “New Vertical Tab Group” komutunu seçin. Bir önceki yard ım dosyasıyla arasındaki benzerlikleri inceleyin. 6. Window menüsünden “Close All ********s” seçeneği ile bütün sayfa-ları kapat ın ve Visual Studio ortamından ç ıkın. Microsoft Visual Studio Arayüzü 43 Modül Sonu Soruları & Al ıştırmalar 1. Visual Basic profili için, Object Browser paneline hangi k ısayolla ulaşı-lır? 2. Visual Studio ortamında tüm sabitlenmiş panelleri gizlemek için hangi menü komutu kullanılır? 3. Properties panelindeki özellikler alfabetik olarak nas ıl s ıralanır? Modül 4: 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 kodla-rın yaz ılmasını büyük ölçüde kolayla ştırarak, uygulama geliştirme sürecini daha h ızl ı ve kolay hale getirir. Bu modülü tamamlad ıktan sonra; ? Windows tabanlı programlamada kullan ılan kontrolleri tanıyacak, ? Kontrollerin özellik, metot ve olay kavramlar ını ö ğrenecek, ? Visual Basic .NET dilinde de ğişken ve sabit tan ımlamayı ö ğrenecek, ? Veri tiplerini tanıyacak, ? Operatörleri kullanabileceksiniz. 48 Modül 4: Konu 1: İlk Uygulama (Hello World, The Time Is...) Visual Basic .NET ile yazacağımız Windows uygulaması ekrana, “ Hello World!” 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. File menüsünden, New alt menüsünü ve Project komutunu seçin. “New Project” ileti şim kutusu, yazılaca ğı dile, çal ışacağı ortama göre de ğişen proje tiplerini listeler. 3. Proje tiplerinden Visual Basic Project ve Windows Application tipinin se-çili olduğunu kontrol edin. 4. Name özelliğine HelloWorld 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 ıra-kın. Properties panelini açarak Button kontrolünün Text özelli ğine “Hello World! ” 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("Hello World! The time is " & 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. Visual Basic.NET ile Windows Tabanlı Programlama 49 7. MsgBox metodunun yaz ıld ığı kodun üstüne, yapılmak isteneni belirten bir yorum satırı yaz ın. ' MsgBox metodu ile kullanıcıya Merhaba diyoruz. ' Now özelliği ile o andaki saat ve gün ' değerlerini de kullan ıcıya gösteriyoruz. 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. 50 Modül 4: Konu 2: Özellikler, Metotlar ve Olaylar .NET kontrolleri üç temel kavramdan olu şur. Özellikler Özellikler, kontrollerin görünümü, yerleşimi veya davran ışlarına özgü nitelikler-dir. Ö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 ıl-ması için, kontrollerin Text özellikleri kullan ılır. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Label1.Text = TextBox1.Text End Sub Visual Basic.NET ile Windows Tabanlı Programlama 51 RESİM 4.1. ? 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 ayarlan-dığı özelliktir. Bu özelliğin de ğeri, Color (renk) nesnesinde tanımlı değerlerle belirlenir. ? ForeColor (Önalan rengi). Kontrollerin üzerindeki yazıların rengini belirler. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Button1.BackColor = Color.Black Button1.ForeColor = Color.White End Sub RESİM 4.2. ? 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. Boolean veri tiplerinden bu modülde bahsedilecektir. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 52 Modül 4: 'Label kontrolünü gizle Label1.Visible = False 'Label kontrolünü göster Label1.Visible = True End Sub End Class Metotlar Metotlar kontrollerin yaptığı i şlemlerdir. Metotlar parametreyle veya parametre-siz ç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. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' İşlem yapıldıktan sonra ' TextBox kontrolüne odaklan TextBox1.Focus() End Sub 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). Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "Yaz ılım Uzmanı" TextBox1.Focus() ' Sekizinci karakterden sonra, beş karakter seç TextBox1.Select(8, 5) End Sub RESİM 4.3. ? BringToFront (Öne Getir). Kontrolü, üst üste duran kontroller aras ın-dan en öne getirir. Visual Basic.NET ile Windows Tabanlı Programlama 53 ? 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. 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 tetiklen-mesinde 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. Kontro-lün olaylar ının listelendiği diğer listeden de istenen olay seçilir (Resim 4.4). RESİM 4.4: Kontrollerin olaylar ının seçilmesi. Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click MsgBox("Form üzerine tıklandı") End Sub 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 üzerindey-ken 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 üzerindey-ken basılan dü ğme bırak ıld ığı zaman çal ışır. ? Enter (Girildiğinde). Kontrol seçildiği veya üzerine odaklan ıld ığı za-man gerçekleşen olayd ır. 54 Modül 4: ? 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. Visual Basic.NET ile Windows Tabanlı Programlama 55 Konu 3: 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 (Resim 4.5). RESİM 4.5: Kontrollerin eklenmesi. Kontroller, Toolbox panelinde çift t ıklanarak da eklenebilir. Kontrollerin tasarım anında büyüklükleri ve yerleri Size ve ******** özellikleri ile de ğiştirilebileceği gibi, fare ile de istenen şekilde ayarlanabilir (Resim 4.6). RESİM 4.6: Kontrollerin ayarlanması. 56 Modül 4: Form Windows uygulamaları, Windows kontrollerinin tutuldu ğu pencereler olan form-lardan oluşur. Bir Windows projesi açıld ığı zaman Form kontrolü otomatik ola-rak eklenir. İkinci bir form eklemek için Project menüsünden 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 (Resim 4.7 ve Resim 4.8). RESİM 4.7: Proje özelliklerinin aç ılması. RESİM 4.8: 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şiklik-ler 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, Debug menüsünden Stop Debugging komutu seçilerek kapatılabilir. Visual Basic.NET ile Windows Tabanlı Programlama 57 ? 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. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Label1.Text = "Proje başlat ıldı. Kayıt zamanı: " & Now End Sub 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. Private Sub btnRenkDegistir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRenkDegistir.Click btnRenkDegistir.ForeColor = Color.Gray End Sub TextBox Bir Windows metin kutusunu temsil eder. Kullan ıcıların değer girerek prog-ramla haberleşmesini sağlamak amac ıyla kullanılır. TextBox kontrolündeki yazı de ğişti ği zaman TextChanged olay ı gerçekle şir. Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged ' TextBox içindeki yazı de ğiştiği zaman ' aşağıdaki kod çalışır. MsgBox("Yazı de ğiştirildi: " & TextBox1.Text) End Sub Label Bir Windows etiketini temsil eder. Kullan ıcıya, form üzerinde bir yaz ıyı göster-mek amacıyla kullan ılır. Bu yaz ının görünümü, Label kontrolünün bazı özellik-leri ile de ğiştirilir. ? TextAlign (Yaz ı hizalama). Yaz ının Label kontrolü üzerinde nerede duraca ğını belirler (Resim 4.9). 58 Modül 4: RESİM 4.9: TextAlign özelli ği. ? Font (Yaz ı Tipi). Font özelli ği birçok alt özellik taşır. Bunlardan baz ıları en s ık kullanılan özelliklerdir (Resim 4.10). ? 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 4.10: Font özelli ği. 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. Ta s a rı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 (Resim 4.11). Visual Basic.NET ile Windows Tabanlı Programlama 59 RESİM 4.11: 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. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ComboBox1.Items.Add("Lise") ComboBox1.Items.Add("Üniversite") ComboBox1.Items.Add("Yüksek Lisans") ComboBox1.Items.Add("Doktora") End Sub RESİM 4.12: ComboBox kontrolünün çal ışması. 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 (Resim 4.13). Private Sub btnBosSiniflar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBosSiniflar.Click ListBox1.Items.Add("YU6501") ListBox1.Items.Add("YM6221") ListBox1.Items.Add("YM6102") ListBox1.Items.Add("YU6412") End Sub 60 Modül 4: RESİM 4.13: ListBox kontrolünün çal ışması. 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 sani-yede bir çal ıştırır. Sayacı ba şlatmak için kontrolün Start metodu, durdurmak için ise Stop me-todu kullan ılır. Enabled özelli ği, sayacın aktif olup olmadığını belirler. Private Sub btnBasla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBasla.Click ' Sayaç 5 saniyede bir çalışacak Timer1.Interval = 5000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick MsgBox("Sayaç çalışıyor...") End Sub Private Sub btnDur_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDur.Click Timer1.Stop() End Sub Visual Basic.NET ile Windows Tabanlı Programlama 61 LAB 4.1: Kronometre Uygulaması Bu lab ı tamamlad ıktan sonra; ? Form ve üzerindeki kontrollerin görünüm özelliklerini öğrenecek, ? ComboBox ve ListBox kontrollerine öğe ekleyebilecek, ? TextBox kontrolünden değer okuyabilecek, ? Timer kontrolünün çal ışma şeklini ö ğreneceksiniz. Form Üzerine Kontrollerin Eklenmesi, Biçimlendirmelerin Yapılmas ı 1. “Kronometre ” isminde yeni bir Windows projesi aç ın. 2. 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. ? Name özelli ğini Tahoma, ? Text özelli ğini “ Yaz ılım Uzmanlığı Kronometre Uygulamas ı”, ? 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. 3. Toolbox panelinden form üzerine bir Label ekleyin. Özelliklerini atay ın: ? Text: Kronometrem ? Font – Name: Forte , Font – Size: 28 ? Dock: Top ? TextAlign: BottomCenter 4. Bir Label kontrolü ekleyin. Özelliklerini atay ın: ? Text: 0 ? Font – Size: 30 ? TextAlign: MiddleCenter ? Name: lblSure 5. Forma bir Timer kontrolü ekleyin. Name özelli ğini tmrKronometre ola-rak 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. 6. 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. 62 Modül 4: 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. 7. Text özellikleri birinde “ Dur ”, di ğerinde “Başla” olan iki Button ekleyin. Kontrollerin Name özelliklerini sırayla btnDur ve btnBasla olarak değiştirin. 8. Bir ListBox kontrolü ekleyin ve Name özelli ğini lbKayit olarak değişti-rin. Bu kontrol kronometrenin ba şlama ve durma zamanlar ını kaydet-meyi sağlayacakt ır. 9. Bir TextBox kontrolü ekleyin. Name özelli ğini txtSure olarak değiştirin ve Text özelli ğinde yazan yaz ıyı silin. 10. Eklenen kontrolleri, Resim 4.14’te görünen şekilde düzenleyin. RESİM 4.14: Kronometre form görünümü. Kodların yaz ılmas ı 1. Form üzerinde sağ t ıklay ın ve View Code komutunu seçin. 2. Açılan kod sayfasında, KalanSure isimli bir de ğişken tanımlayın. Dim KalanSure As Integer 3. 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 kontro-lünde görüntüleyen kodlar ı yaz ın. Private Sub btnBasla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBasla.Click ' Başlangıç zamanı "KalanSure" değişkenine atanır. KalanSure = txtSure.Text ' Kalan süre kullanıcıya gösterilir. Visual Basic.NET ile Windows Tabanlı Programlama 63 lblSure.Text = KalanSure ' ListBox kontrolüne kayıt girilir. lbKayit.Items.Add("Kronometre ba şlad ı: " & Now.TimeOfDay.ToString) ' ComboBox kontrolünden seçilen değer, ' Timer kontrolünün çalışma hızını belirler. tmrKronometre.Interval = cmbInterval.Text ' Timer kontrolünü çalıştırır. tmrKronometre.Start() End Sub 4. Dur isimli Button kontrolünü çift t ıklay ın. btnDur_Click yordam ı içine Timer kontrolünü durduracak ve ListBox kontrolüne kay ıtlar ı ekleye-cek kodları yaz ın. Private Sub btnDur_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDur.Click ' Timer kontrolünü durdurur. tmrKronometre.Stop() ' ListBox kontrolüne kayıt girilir. lbKayit.Items.Add("Kronometre durduruldu: " & Now.TimeOfDay.ToString) End Sub 5. Ta s a rı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. Private Sub tmrKronometre_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrKronometre.Tick ' Her saniye geçtiğinde sure değeri 1 azalacaktır. KalanSure = KalanSure - 1 'KalanSure değeri kullanıcıya gösterilir lblSure.Text = KalanSure ' KalanSure değeri sıfıra ulaşmışsa kronometre durdurulur. If KalanSure = 0 Then tmrKronometre.Stop() lbKayit.Items.Add("Süre Doldu: " & Now.TimeOfDay.ToString) 64 Modül 4: MsgBox("Süre doldu") End If End Sub 6. 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. ? Süre ba şlad ıktan ve bittikten sonra ListBox kontrolündeki değişiklikler nelerdir? ? Hız 3000 olarak seçildi ğinde başlama ve biti ş zamanları arasındaki süre ne kadardır? Visual Basic.NET ile Windows Tabanlı Programlama 65 Konu 4: 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 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. Dosya işlemleri: ? Yeni bir klasör açmak: MkDir("C:\Kayitlar") ? Bulunduğu yer verilen bir dosyay ı ba şka bir yere kopyalamak: FileCopy("C:\LogDosyasi.txt ", " C:\Kayitlar\LogDosyasi.txt ") ? Bir dosyanın ismini değiştirmek: Rename("C:\LogDosyasi.txt", "C:\Log_Dosyasi.txt") ? Bir dosyayı silmek: Kill("C:\Log_Dosyasi.txt") 66 Modül 4: Ta r i h işlemleri: ? Verilen tarihin gününü almak: MsgBox(Day(Now)) ? 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) Yazı i şlemleri: ? Yazının ba şındaki ve sonundaki boşluklar ı atmak: Label1.Text = Trim(" BilgeAdam ") ' Sonuç: BilgeAdam ? Tüm yaz ıyı küçük harfe çevirmek: Label1.Text = LCase("BILGEAdam") ' Sonuç: bilgeadam ? Tüm yaz ıyı büyük harfe çevirmek: Label1.Text = UCase("bilgeADAM") ' Sonuç: BİLGEADAM ? Yazının belirli bir bölümünü almak. İkinci parametrede verilen pozisyon-dan ba şlayarak, üçüncü parametredeki değer kadar karakter alınır: Label1.Text = Mid("BilgeAdam", 6, 4) ' Sonuç: Adam ? Yazının parametrede belirtilen sıradaki karakteri almak: Visual Basic.NET ile Windows Tabanlı Programlama 67 Label1.Text = GetChar("BilgeAdam",9) ' Sonuç: m ? Verilen karakter koduna karşılık gelen karakteri almak: Label1.Text = Chr(65) ' Sonuç: A Sayı i şlemleri: ? Rasgele sayı üretmek: ' Maximimum 400 de ğerini alan bir say ı üretir Rnd() * 400 ? Rnd fonksiyonu, uygulama baştan ba şlad ığında ayn ı de ğerleri üretir. Her çalışmada farklı de ğer üretmek için, Rnd fonksiyonundan önce Randomize fonksiyonunun ça ğırılması gerekir: Randomize() 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) 68 Modül 4: Konu 5: 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 (Resim 4.15). InputBox("Bir sayı giriniz: ", "Sayı Girişi", 1, 350, 350) InputBox metodunun ilk parametresi, mesaj kutusunun gövdesinde gözüke-cek 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 ? DefaultResponse (Varsay ılan cevap) . Kullanıcı veri girmediğinde var-sayılan de ğerdir. ? XPos (X pozisyonu). Mesaj kutusunun sol kenar ının, ekranın sol kena-rına olan uzaklığıdır. ? YPos (Y pozisyonu). Mesaj kutusunun üst kenar ının, ekranın üst kena-rına olan uzaklığıdır. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ListBox1.Items.Add(InputBox("İsim soyad giriniz:", "Bilgi Girişi", "Bilinmiyor")) End Sub RESİM 4.15: InputBox. Visual Basic.NET ile Windows Tabanlı Programlama 69 Konu 6: MessageBox MessageBox , kullan ıcıya bilgi göstermek için aç ılan mesaj kutusudur. Bu mesaj kutusu dört öğeden olu şur (Resim 4.16). ? 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 4.16: MessageBox . Mesaj kutusu, kapanırken hangi dü ğmenin tıklandığını DialogResult nesnesi ile programcıya bildirir. If MessageBox.Show("Değişiklikler kaydedilsin mi?", "Kayıt", MessageBoxButtons.YesNoCancel) = DialogResult.Cancel Then ' İptal tuşuna basıldığı zaman ' buraya girilir. End If NOT MsgBox haz ır fonksiyonu MessageBox.Show metodu ile ayn ı i şleve sahiptir. 70 Modül 4: Konu 7: Değişken – Sabit Nedir? Değişkenlerin ve Sabitlerin Tanımlanması Değişken Nedir, Nas ıl Tan ımlanır? Program yazarken, baz ı verilerin daha sonra kullan ılmak üzere bir yerde tutul-ması 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. Değişkenler Dim anahtar kelimesi ile tan ımlanır. Dim sayi NOT Dim sözcüğü, “boyut” anlamına gelen Dimension kelimesinin k ısaltmasıdır. Bu şekilde tanımlanan değişkenler Object (nesne) tipindedir, yani her türden veriyi tutabilirler. Nesne tipindeki değişkenler, tanımlanmalarının kolay olması ve istenen tipte değer tutabilmeleri aç ısından avantajl ı olsa da, performansı önemli ölçüde düşürürler. Tuttuklar ı de ğerlerin tipleri biliniyorsa, de ğişkenleri ta-nımlarken tiplerini belirlemek gerekir. Visual Basic.NET ile Windows Tabanlı Programlama 71 Dim sayi As Integer Dim kelime As String Ta n ı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 sis-temlerinde çalışma anında hata üretecektir. Hatalı baz ı de ğişken tanımlar ı: Dim dim As Double Dim (sayi) As Short Dim 333sayisi As Integer Dim "kelime" As String Dim 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 = "Enis Günesen" Uygulama geliştirirken, değişkenlerin tan ımlanarak kullanılması, yaz ım yanl ışlarından kaynaklanan kar ışıkl ıklar ı engeller. De ğişkenlerin tanımlanma-dan 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. 72 Modül 4: RESİM 4.17: Option Explicit seçene ği kapalı. Option Explicit seçene ğinin On olmas ı, tan ımlanmamış de ğişkenlerin kulla-nılmasına izin vermez, tasar ım anında hata üreterek programc ıya bildirir. Varsay ılan durumda On de ğeri seçilidir. 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 Tablo 4.1’de kod bloklar ından hangi de ğişkenlere ula şılabildi ği görülüyor. Visual Basic.NET ile Windows Tabanlı Programlama 73 TABLO 4.1. 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 ıla-caksa, 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. S ınıf düzeyindeki de ğişkenler, ayn ı s ı-nıf içindeki fonksiyonlar ile de ğiştirilebilir ve sınıf örne ğinin ya şam süresinde il-gili özelliklerine erişim sa ğlanabilir. Sabit Nedir, Nasıl Tan ımlanır? 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 okunma-sı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. 74 Modül 4: 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 Tablo 4.2’de listelenmi ştir. TABLO 4.2: Visual Basic.NET Veri Tipleri Veri Tipi Büyüklük De ğer Boolean 2 Bayt True – False Byte 1 Bayt 0 – 255 Char 2 Bayt Tek bir Unicode karakteri tutar Date 8 Bayt 01.01.0001 tarihi 00:00:00 saati – 31.12.9999 tarihi 23:59:59 saati Decimal 16 Bayt Maksimum 29 haneli say ı tutar. +/-79,228,162,514,264,337,593,543,950,335 arasında değer alır Double 8 Bayt Negatif sayı aralığı: -1.79769E+308 ile -4.94065E-324 Pozitif say ı aralığı: 4.94065E-324 ile 1.79769E+308 Int32 4 Bayt -2,147,483,648 – 2,147,483,647 Int16 2 Bayt 32,768 – 32,767 Int64 8 Bayt -9,223,372,036,854,775,808 – 9,223,372,036,854,775,807. Single 4 Bayt Negatif sayı aralığı: -3.4028235E+38 ile -1.401298E-45 Pozitif say ı aralığı: 1.401298E-45 ile 3.4028235E+38 String Maksimum 2,147,483,647 Unicode karakter tutar Visual Basic.NET ile Windows Tabanlı Programlama 75 Double ve Single veri tiplerinin aralığında belirtilen “E + sayı” ifadesi, 10 ^ sayı ile çarpılaca ğını belirtir. Örne ğin 12 E-3 ifadesi, 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. 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 76 Modül 4: kaçabilir ve de ğer kay ıplar ı fark edilmez. Bu durumda dönü ştürme i şlemleri ha-zı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) 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 ti-pine 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. Visual Basic.NET ile Windows Tabanlı Programlama 77 Structure 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 Sub Degistir(ByVal yeniX As Integer, ByVal yeniY As Integer) x = yeniX y = yeniY End Sub End Structure Structure Ucgen Dim n1 As Nokta Dim n2 As Nokta Dim n3 As Nokta End Structure 78 Modül 4: Dizilerle Çalışmak Dizi de ğişkenleri, ayn ı tipte birçok veriyi bir arada tutmayı sağlar. Benzer i şlem-lerde 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 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 gere-kir. 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 başlang ıç değerleri atanabilir. Dim isimler() As String = {"Ali","Ahmet","Mehmet","Ay şe"} Diziler tek boyutlu olduğu gibi, birkaç boyutlu diziler de tan ımlanabilir. Visual Basic.NET ile Windows Tabanlı Programlama 79 ' İ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 ı var-dır. Bu dizide bir boyut daha olsayd ı, o boyutun her eleman ı için di ğer boyutlar-daki 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ı) yetmi-yorsa 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 koru-maz. 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) 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. 80 Modül 4: ? Length. Dizinin bütün boyutlarındaki toplam eleman sayısını veren özelliktir. Dim ComboBoxDizisi(19) As ComboBox MsgBox(ComboBoxDizisi.Length) 'Sonuç = 20 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. Bu-rada 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 çevi-rir. 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) Visual Basic.NET ile Windows Tabanlı Programlama 81 MsgBox(harfler(2)) 'Sonuç = A Dim harfler() As String = {"A", "B", "C"} Array.Reverse(harfler, 0, 1) MsgBox(harfler(2)) 'Sonuç = C ? IndexOf. İlk parametrede verilen dizide, ikinci parametrede verilen de-ğeri arar. Aranan de ğer dizide bulunursa indisi, bulunamazsa -1 döndü-rür. Dim notlar() As Single = {78.1, 99.9, 100, 12.2} Dim maxNot As Single = 100 MsgBox(Array.IndexOf(notlar, maxNot)) ' Aranan maxNot de ğerinin indisi = 2 82 Modül 4: Debug Visual Studio Debug arac ı, çal ışma anında kodlar aras ında satır sat ır ilerleye-rek 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 ( Şekil 4.18). RESİM 4.18: Durma noktası. 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. Visual Basic.NET ile Windows Tabanlı Programlama 83 RESİM 4.19: Autos paneli. 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 (Resim 4.19). ? 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 ala-nı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 nok-taya kadar çal ışmaya devam eder. Hata ayıklama, çalıştırılacak hiçbir sat ır kalmad ığında durur ve uygulama nor-mal ç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. 84 Modül 4: Alıştırma Bu uygulamada veri tiplerinin kullanım yerlerine ve diziler ile çalışma örnekle-rine bak ılacakt ır. Structure Veri Tipi 1. Sınıf isminde bir Windows projesi aç ın. 2. Açılan form üzerine sa ğ t ıklayarak View Code komutunu seçin. Kod sayfas ında sınıf düzeyinde bir Structure tan ımlayın. Structure Ogrenci Dim Isim As String Dim Soyad As String Dim Sube As Char Dim OrtalamaNotu As Single Dim DevamEdiyor As Boolean End Structure 3. Ogrenci tipindeki değerleri tutmak için, s ınıf düzeyinde iki elemanl ı bir dizi tan ımlayın. Dim ogrenciler(1) As Ogrenci 4. Formun Load olayına, uygulama açılırken yeni ö ğrenci ekleme kodla-rını yaz ın. Dim ogrenci1 As Ogrenci ogrenci1.Isim = "Ali" ogrenci1.Soyad = "Veli" ogrenci1.Sube = "C" ogrenci1.OrtalamaNotu = 67.1 ogrenci1.DevamEdiyor = True Dim ogrenci2 As Ogrenci With ogrenci2 .Isim = "Ahmet" .Soyad = "Veli" .Sube = "C" .OrtalamaNotu = 72.9 .DevamEdiyor = True End With ogrenciler(0) = ogrenci1 ogrenciler(1) = ogrenci2 İPUCU With anahtar kelimesi, belirtilen değişkeni tekrar yazmadan kullanmayı sa ğlar. Visual Basic.NET ile Windows Tabanlı Programlama 85 5. Forma btnOgrenciEkle isminde bir Button kontrolü yerleştirin. Bu kontrolün Click olayına, diziye yeni bir ö ğrenci kayd ı ekleyen kodu ekleyin. ' ogrenciler dizinde bo ş yer kalmadığı için ' diziyi, eski değerleri kaybetmeden tekrar ' boyutlandırmak gerekir. ReDim Preserve ogrenciler(2) Dim ogrenci As Ogrenci With ogrenci .Isim = "Veli" .Soyad = "Veli" .Sube = "D" .OrtalamaNotu = 92.1 .DevamEdiyor = False End With ogrenciler(2) = ogrenci ogrenciler dizisine ba şka bir yordamdan nasıl eri şildi? Formun Load olayında ogrenci isimli bir değişken tanımlandığı halde, Button kontrolünün Click olayında aynı isimde bir de ğişken nasıl ta-nımlanabiliyor? Dizi işlemleri 1. Forma bntOzellikleriGoruntule isminde bir Button kontrolü ekle-yin ve Click olayında, diziden indisi verilen ö ğrenciyi alan kodlar ı ya-zın. Dim indis As Integer = InputBox("Ogrenci sıras ı numaras ını girin") Dim secilenOgrenci As Ogrenci secilenOgrenci = ogrenciler(indis) Dim bilgiler As String With secilenOgrenci bilgiler &= .Isim & " " & .Soyad & vbCrLf bilgiler &= "Notu: " & .OrtalamaNotu & vbCrLf bilgiler &= "Şubesi: " & .Sube & vbCrLf bilgiler &= "Devam ediyor mu: " & .DevamEdiyor End With MsgBox(bilgiler, MsgBoxStyle.Information, "Öğrenci Bilgileri") 86 Modül 4: İPUCU VbCrLf (Visual Basic Carriage Return-Linefeed) sabiti, String de ğişkenle-rinde yeni sat ıra geçilmesini sa ğlar. Aritmetik işlemler 1. Forma btnOrtalamaHesapla isminde bir Button kontrolü ekleyin ve Click olay ında sınıfın ortalamas ını hesaplayan kodu yazın. Dim not1 As Double = ogrenciler(0).OrtalamaNotu Dim not2 As Double = ogrenciler(1).OrtalamaNotu Dim not3 As Double = ogrenciler(2).OrtalamaNotu Dim ortalama As Integer = CInt((not1 + not2 + not3) / 3) MsgBox(ortalama) 2. not3 de ğişkeninin tan ımlandığı yere BreakPoint koyun ve projeyi çalıştırın. 3. Form açıld ığında btnOrtalamaHesapla dü ğmesini tıklay ın. Uygulama-nın çal ışması durma noktas ı konulan yerde duracaktır. 4. Debug | Windows | Autos komutunu seçin. Autos panelinde not1 ve not2 de ğişkenlerinin değerlerini inceleyin. 5. Debug | Windows | Watch komutunu seçin. Watch panelinde Name sütununa “ ogrenciler ” yazın. + simgesini t ıklayarak ogrenciler dizi-sini genişletin ve dizi elemanlar ının de ğerlerini inceleyin. 6. Debug menüsünden Step Into komutunu seçin. Bu i şlemi Debug araç çubuğu ile ya da F11 tuşuna basarak da yapabilirsiniz. 7. Gösterilen hata mesaj ını inceleyin. Continue düğmesini tıklayarak uygulamay ı sonland ırın. 8. Uygulamay ı tekrar çalıştırın ve önce btnOgrenciEkle dü ğmesini daha sonra da btnOrtalamaHesapla dü ğmesini tıklay ın. Visual Basic.NET ile Windows Tabanlı Programlama 87 Konu 8: 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. Aritmetiksel Operatörler Bu operatörler aritmetik işlemlerinde, say ılarla veya say ı tutan ifadelerle kullanılır. ? Çarpma 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 88 Modül 4: İPUCU Aritmetik operatörleri, eşittir ifadesi ile beraber kullan ılırsa, işlem de ğişkenin ken-disi ile yap ılır. ? Üs alma toplam ^= 2S ? 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. Kar şıla ştırma Operatörleri Bu operatörler veri tiplerini birbirleriyle karşıla ştırmak için kullan ılır. Bu operatör-ler 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 birbirle-riyle 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 Visual Basic.NET ile Windows Tabanlı Programlama 89 "Yazı" <> "yazı" ' Sonuç: True 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 ? Split . Belirtilen ayraca göre yaz ıyı böler, çıkan sonuç String dizisinde tutulur. Ayraç karakterleri sonuç dizisinde yer almaz. Dim Kelime As String = "Kelime1:Kelime2:Kelime3" Dim parcalar() As String parcalar = Kelime.Split(":") ' parcalar dizisinin üç eleman ı olur: ' Kelime1 ' Kelime2 ' Kelime3 Dim parcalar2() As String parcalar2 = Kelime.Split("m") ' parcalar2 dizisinin dört eleman ı olur: ' Keli ' e1:Keli ' e2:Keli ' e3 ? ToCharArray. String de ğerinin belli bir bölümündeki karakterleri ya da tüm karakterlerini, Char dizisi olarak döndürür. Dim harfler() As Char = "Kelime".ToCharArray() ' Dizinin 1. elemanından başlayarak 4 karakter oku Dim harfler() As Char = "Kelime".ToCharArray(1,4) ? Insert. String tipinde bir de ğişkenin de ğerine, ilk parametrede belirti-len yerden ba şlayarak ikinci parametredeki de ğeri ekler. Ancak bu değişkenin de ğerini değiştirmez. Yeni oluşturulan String ifadesini döndürür. 90 Modül 4: Dim sayilar As String = "0123456789" Dim yeniSayilar As String yeniSayilar = sayilar.Insert(5, "--- Rakamlar ---") MsgBox(yeniSayilar) ' Sonuç: 01234--- Rakamlar ---56789 ? Remove. İlk parametrede verilen de ğerden ba şlayarak, ikinci parametre-deki değer kadar karakter, de ğişkenden ç ıkarılır. yeniSayilar = yeniSayilar.Remove(4, yeniSayilar.Length - 4) MsgBox(yeniSayilar) ' Sonuç: 0123 Visual Basic.NET ile Windows Tabanlı Programlama 91 Modül Sonu Soruları & Al ıştırmalar 1. Arabanın fren yapmas ı ve arabaya çarpılması, .NET nesnelerinin hangi kavramlarına girer? 2. Bir ListBox kontrolüne 10 saniyede bir kullan ıcıdan al ınan değerleri ekleyen kodları yaz ın. 3. Değişkenler ile sabitlerin farkı nedir? 4. 5 < 6 = -1 ifadesi hangi Boolean de ğerini döndürür, neden? Option Strict On seçildi ğinde ç ıkan hata mesajını inceleyin. Modül 5: Algoritma ve Dump Coding Programlamanın temelinde, çalışma ak ışını ve izlenecek yollar ı belirleyen algoritmalar vardır. Bir i ş yap ılmaya başlanmadan önce nas ıl planlan ıyorsa, kodlamaya geçilmeden önce de bir çal ışma planı belirlenmelidir. Programlar, bu planda yazılan kodları belli bir sıra ile okur ve i şler. Dolayısıyla algoritma yap ısını çok iyi kurmak gerekir. Kurulan algoritmalar ak ış diyagramları ile gör-sel zenginlik kazan ırlar. Dump Coding yöntemi algoritmaları çözmenin uzun, fakat etkili bir yoludur. Bu yöntem, ad ımlar ı tek tek inceleyerek algoritma ak ışını çözer. Bu modül tamamland ıktan sonra; ? Algoritma kurmayı ö ğrenecek, ? Dump Coding ile algoritmaları çözümleyecek, ? Akış diyagramları ile algoritmalar ı görsel olarak ifade edebileceksiniz. 96 Modül 5: Konu 1: Algoritma Nedir? Algoritma, bir işin hangi etaplardan geçilerek yap ılaca ğını gösteren çal ışma plan ıdır. Algoritma bir programlama dili de ğildir. Programlama dillerine yol gösteren bir yöntem dizisidir. Her dilde algoritma yaz ılıp uygulanabilir. Örne ğin bir cep telefonunun el kitapçığında yazan, rehber kaydı girmek için izlenecek yollar, o i şin algoritmas ıdır. Algoritma yazarken, programın çalışması için kullan ılan kaynaklar ın, yap ılması gereken kontrollerin veya işlemlerin aç ıkça ifade edilmesi gerekir. Ayr ıca iyi bir algoritmanın, tüm ihtimalleri kontrol edip istenmeyen durumlarda ne yapılması gerekti ğini de belirtmesi gerekir. Örneğin, bir e-ticaret uygulamas ında ürün sat ış algoritmas ı çıkarılır. Sat ın al ınacak ürün seçildikten sonra, kullanıcıdan adet miktar ı bilgisi al ınır. Uygu-lama yaz ılırken, bu de ğerin Int16 veri tipinde olacağına karar verildiği dü şünü-lürse; kullanıcının girdi ği adet miktar ı bu de ğişkene atanmadan önce kontrol edilmelidir. Eğer Int16 veri tipinin tutamayaca ğı bir de ğer girilmi şse, çal ışma anında uygulamanın beklenmedik şekilde durduğu ya da istenmeyen sonuçla-rın üretildi ği gözlemlenir. Ayr ıca sistemin verdiği hata, kullan ıcının anlamaya-cağı bir mesaj içerece ği için, uygulaman ın imajını da kötü yönde etkiler. ? Veri girişi. Çal ışma zamanında ço ğu kez, işleyi şin tamamlanması için dışar ıdan bir bilgi girilmesi gerekir. Algoritmanın çalışması için ihtiyaç duydu ğu veriler, i şlemi başlatan ki şiden veya belirtilen bir kaynaktan al ı-nabilir. Bu bilgiler sağlanmadan i şlem devam etmez. ? Kararlar. Karar ve kontrol yapıları algoritman ın ak ışını yönlendiren en önemli kavramlard ır. Girilen veya i şlem sonucunda elde edilen veriler, Algoritma ve Dump Coding 97 işlemin amac ına göre kontrol edilir ve sonuca göre algoritma ak ışı iste-nen yere yönlendirilir. ? İş lemler. Algoritman ın ak ışı boyunca veriler üzerinde değişiklikler, yeni değer atamalar ı gibi işlemlere ihtiyaç duyulur. Algoritmalar kurulurken, yap ılan i şlemlerin yal ın halde, tek tek yazılması okunabilirli ği art ırır. Algoritmalar adım sıras ı ile çal ışır ve karar yapıları sonucunda farklı bir yere yönlendirilmediği müddetçe, bir sonraki ad ım ile işlemeye devam eder. Örnek: Telefon kulübesinden telefon açmak için örnek bir algoritma 1. Telefon kulübesine git. 2. Telefon kart ı al. 3. Telefon s ıras ında kaç kişi oldu ğuna bak. 4. Ki şi say ısı s ıfırdan fazlaysa 3’e dön. 5. Kap ı kapal ıysa kapıyı aç. 6. İçeri gir, kap ıyı kapat. 7. Telefon kart ını telefona yerle ştir. 8. Ahizeyi kaldır. 9. Numaray ı çevir. 10. Konuşman ın bitip bitmedi ğine bak. 11. Konuşma bittiyse kartı al, bitmediyse 10’a dön. 12. Bir daha konu şma yapılacaksa 7’ye dön. 13. Kap ıyı aç, d ışar ı ç ık. Bu algoritman ın i şlemesi için, her ihtimal gözden geçirilerek, algoritma ak ışı ge-rekli yerlere yönlendirilir. Örne ğin, kap ının kapalı olmas ı durumunda kap ıyı aç-mak için gerekli komutlar verilmelidir. Bu algoritman ın ihtiyaç duyduğu veriler ya kullan ıcı tarafından verilir ya da i şlem ba şlamadan önce belirlidir. S ıradaki ki şi sayısı, telefon kart ı gibi veriler kullan ıcı tarafından sağlanmış; çevrilecek numara, algoritma ba şlamadan önce belirlenmiştir. 98 Modül 5: Konu 2: Dump Coding Nedir? Dump Coding yöntemi birçok karışık algoritmayı çözümlememizi sağlar. Dump Coding yöntemi, algoritmanın her adımında, değişkenlerin tek tek değerlerini yazıp i şleyi şi takip etmektir. Örnek: İki say ının OBEB’ini (ortak bölenlerin en büyü ğünü) alan algoritmalar-dan bir tanesi Euclid tarafından geli ştirilmiştir. 1. İki sayı gir. Büyük A, küçük B. 2. A sayısını B say ısına böl. Tam bölünüyorsa, OBEB B say ısıdır. Ç ıkış. 3. A sayısının de ğerini, kalan sayının de ğeri yap. 4. A ile B sayılarının yerini değiştir. İkinci etaba dön. Bu algoritman ın çalışma mantığı, Dump Coding yöntemi ile ad ım adım incele-nir. 1. İki sayı girilir. A = 12 ve B = 8. 2. A sayısı, B sayısına tam bölünmüyor. Algoritma di ğer etaptan devam eder. 3. Kalan sayı = 4. Dolay ısıyla A = 4 olur. 4. A sayısı ile B say ısının yerleri de ğiştirilir. A = 8 ve B = 4 olur. İkinci etaba dönülür. 5. A sayısı B say ısına tam bölünüyor. OBEB = 4. Algoritma ve Dump Coding 99 Konu 3: Akış Diyagramlar ında Kullanılan Semboller Madde madde yaz ılan algoritmalar ın okunmas ı kolaydır, ancak i şleyi şin bütü-nünü görmek, çoğu zaman mümkün değildir. Akış diyagramları, algoritmalar ı görsel biçimde göstermeyi, dolayısıyla daha anlaşılır hale getirmeyi sa ğlar. Algoritmada yap ılacak i şlemlerin çe şitlerine göre çeşitli semboller kullan ılır. ? Başla – Bitir. Algoritman ın hangi aşamadan ba şlayaca ğını ve ne za-man biteceğini gösteren semboldür. Bir algoritmay ı temsil eden ak ış di-yagramında, bir tane Ba şla ve bir tane Bitir sembolü olmalıdır (Resim 5.1). RESİM 5.1: Ba şla-Bitir sembolleri. ? Veri Giri şi. Kullan ıcıdan ve başka bir kaynaktan al ınan verilerin isimle-rini tutar (Resim 5.2). RESİM 5.2: Veri girişi sembolü. ? Karar Verme. Karar yap ısını belirten semboldür. Üstünde ko şul ifadesi belirtilir (Resim 5.3). 100 Modül 5: RESİM 5.3: Karar verme sembolü. ? Veritabanı. Veritabanında okuma veya yazma i şlemi yap ıld ığını göste-rir (Resim 5.4). RESİM 5.4: Veritabanı sembolü. ? Ekran. Üzerinde yazılan yaz ının bilgi olarak ekranda gözükeceğini belirtir (Resim 5.5). RESİM 5.5: Ekran sembolü. ? Printer. Üzerinde yazılan yazının yazıcıdan çıkarılaca ğını belirtir (Re-sim 5.6). RESİM 5.6: Printer sembolü. ? İş lem. Bir i şlem yap ılaca ğını belirten semboldür. Her i şlem için ayr ı bir fonksiyon sembolü kullan ılması, ak ış diyagramını daha anla şılır kılar (Resim 5.7). RESİM 5.7: İş lem sembolü. ? Fonksiyon. İş lem sembolüne yaz ılamayacak büyüklükte işlemler, alt işlem olarak bu sembolle belirtilir (Resim 5.8). RESİM 5.8: Fonksiyon sembolü. Algoritma ve Dump Coding 101 Konu 4: Algoritma Uygulamaları Bilet Satma Bir tiyatro uygulamas ının sürekli gerçekleştirece ği temel i şlem, bilet satmakt ır. Bu işlemi gerçekle ştirmek için gerekli kodlar yaz ılmadan önce, algoritma kurul-malıdır (Resim 5.9). RESİM 5.9: Bilet satma algoritması. 1. Kullanıcının istedi ği oyun, gün ve yer bilgileri al ınır. 2. Veritaban ı sorgulanarak, belirtilen günde oynayan oyunun bo ş yerleri çıkart ılır. 3. Boş yer say ısı s ıfırsa, o günde belirtilen oyun oynanm ıyordur ya da oyundaki bütün yerler satılmıştır. 4. Her iki durumda da bilet kesilemedi ği için ekranda hata mesaj ı gösteri-lir. Gün ve oyun bilgilerini ba ştan almak için ilk etaba dönülür. 5. Kullanıcıdan oturmak istedi ği yer bilgisi al ınır. 6. İstedi ği yerin dolu olup olmad ığı kontrol edilir. 7. Yer dolu ise ekrana hata mesajı gösterilir ve yer bilgisi tekrar alınmak üzere 5. etaba dönülür. 8. Ye r b o şsa, veritabanında oyunun yer kayıtlar ı güncellenir. 9. İstenilen gün, oyun ve yer bilgilerini içeren bilet yaz ıcıdan çıkart ılır. 102 Modül 5: Çay Demleme Bu örnekte, bir çay demleme işleminde yap ılması gereken i şlemleri, kontrol edilmesi gereken olayları içeren algoritma kurulur (Resim 5.10). 1. Kullanıcıdan su vermesi beklenir. 2. Suyu ısıtma işlemi yap ılır. 3. Suyun kaynayıp kaynamadığı kontrol edilir. Kaynamamışsa 2. etaba dönülür. 4. Çay daha önceden haz ır oldu ğu için, kullanıcıdan beklenmez. Demliğe çay koyma i şlemi yap ılır. 5. Kullanıcıdan, demleme işleminin ne kadar sürece ği bilgisi al ınır. 6. Kullanıcıdan al ınan demleme süresi ile şimdiki zaman (çay ın demlen-meye başlad ığı zaman) toplan ır. Ç ıkan değer, BitisZamani isimli değişkene atılır. Bu de ğişken demleme i şleminin ne zaman bitece ği bilgisini tutar. 7. Şimdiki zaman, biti ş zamanından küçükse çay ın demlenmesi için ayrı-lan süre daha dolmam ış demektir. Bu süre dolana kadar 7. etap tekrarlan ır. 8. Çayın demlendiğini, kullan ıcıya ekran üzerinde bildiren bir mesaj çıkart ılır. RESİM 5.10: Çay demleme algoritmas ı. Algoritma ve Dump Coding 103 Üniversite Eğitim Notunu Hesaplama Üniversitede bir dersin başar ı notu, genelde bir vize ve bir final notu ile hesaplan ır. Vize notunun katsay ısı finalden daha dü şüktür. Sonuçta ç ıkan not 50 ve üstündeyse öğrenci geçer, 50’nin alt ındaysa kalır. Bu örnek, vizenin %30 ve finalin %70 a ğırl ıkl ı olduğu ba şar ı notunun hesaplanmas ını akış diyagramı ile gösterir (Resim 5.11). RESİM 5.11: Üniversite notu algoritması. 1. Notu hesaplanacak ö ğrencinin numarası kullan ıcıdan al ınır. 2. Veritaban ından ö ğrencinin vize ve final notlar ı çekilir. 3. Eğer final notu 28 veya daha dü şükse ö ğrenci kal ır ve 9. etaba gidilir. Bu durumda vize notu 100 olsa dahi, sonuç olarak toplanan not 50’nin alt ında olur. Dolayısıyla öğrencinin kalmas ı kesinleşir. Böyle bir kontrol yap ılması, gereksiz i şlemlerin yapılmasını engeller. 4. Vize de ğişkenine, veritabanından alınan vize notunun %30’u atanır. 5. Final de ğişkenine, veritabanından alınan final notunun %70’i atan ır. 104 Modül 5: 6. Sonuc de ğişkenine, Vize ve Final de ğerlerinin toplamı atanır. 7. Sonuc de ğerinin 50’den büyük olup olmad ığı kontrol edilir. 8. Sonuc 50’den büyükse ekrana “Geçtiniz” yazan bir mesaj ç ıkart ılır. Algoritmadan çıkılır. 9. Sonuc 50’den küçükse ekrana “ Kaldınız” yazan bir mesaj ç ıkart ılır. Algoritma ve Dump Coding 105 Modül Sonu Soruları & Al ıştırmalar 1. Algoritma kurulurken esas al ınacak noktalar nelerdir? 2. Dump Coding ile algoritmanın farkı nedir? 3. Bir ürünün bilgilerinin, veritabanından çekilerek kullan ıcıya görüntüleme işleminin algoritmas ını kurun. 4. Bu algoritmay ı akış diyagramı ile gösterin. Modül 6: 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 iz elenerek birçok kez tekrarlanacak işlem-ler bir defa yazılır. Bu i şlem, döngü sonlanana kadar gerçekle ştirilir. Bu modül tamamland ıktan sonra: ? If ve Select Case karar yapılarını ö ğrenecek, ? For ve Do döngülerini tan ıyacak, ? Hangi karar yapısının ve döngünün nerede kullan ılaca ğını öğreneceksiniz. 110 Modül 6: Konu 1: Karar Yapılar ı 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 durum-larda ç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 ka-rar yap ıları tan ımlıdır. Bu bölüm tamamland ıktan sonra; ? If Then ElseIf karar yapıları ile ak ış kontrolü yapabilecek, ? Kontrollerde kullan ılan ko şul operatörlerini tan ıyacak, ? Select Case karar yapısını kullanabilecek, ? Hangi karar yapısının nerede kullanılaca ğını ö ğreneceksiniz. Karar Yapıları ve Döngüler 111 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 ın-daki 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” mesa-jını ç ıkartan algoritma (Resim 6.1). RESİM 6.1. 112 Modül 6: 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 Im-plicit 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 Resim 6.2’de görülen hata mesaj ı al ınır. RESİM 6.2: Hata mesajı. 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. Kar-şıla ştırma operatörlerinin dönü ş tipinin Boolean olduğundan Modül 4’teki Karşıla ştırma Operatörleri başlıkl ı ayr ımda bahsedildi. Eğer If deyimindeki bir karşıla ştırma ifadesi kullan ılmazsa, buradaki değer Implicit Conversion ile Boolean tipine çevrilir. Dim sayi As Integer = InputBox("Sayi girin:") Karar Yapıları ve Döngüler 113 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, giri-len 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 ' 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, ' 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 114 Modül 6: Koşul Operatörleri 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. 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 6.1). TABLO 6.1: And Operatörü Koşul 1 Koşul 2 Koşul 1 And Ko şul 2 True True True True False False False True False False False False 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 6.2). Karar Yapıları ve Döngüler 115 TABLO 6.2: 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 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 6.3). TABLO 6.3: 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 Not Bir koşulun değerini tersine çevirir. Koşul False ise True, True ise False olur (Tablo 6.4). TABLO 6.4: Not Operatörü Koşul Not Ko şul True False False True 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 perfor-mansı art ırır. Dim dizi() As String = {} ' Diziye eleman ekleme işlemleri ' ... 116 Modül 6: 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 di-ziye 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. 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:\BilgeAdamVeriTabani.mdb") End If Dosya silme işlemi için, kullan ıcının rolü veritabanından alındıktan sonra, kont-rol 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. Karar Yapıları ve Döngüler 117 If Then Else Else ifadesi, If yap ısındaki ko şulun sağlanmadığı bütün durumlarda devreye girer. If Koşul Then 'Diğer 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 118 Modül 6: 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 ol-duğ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. ElseIf If deyimindeki ko şul sağlanmadıysa Else deyimindeki kodlar çal ışıyordu. An-cak bazı durumlarda Else içinde de kontrol yapmak gerebilir. If Koşul Then ElseIf Koşul2 Then ElseIf Koşul3 Then End If Örnek: Günün saatine göre kar şılama mesaj ı ç ıkartmak için, saat de ğişkeninin birçok kez kontrol edilmesi gerekir. Sadece bir If kontrolü yap ılsaydı, sadece iki kar şılama mesaj ı ç ıkart ılabilirdi. Dim karsilamaMesaji As String = " BilgeAdama hoşgeldiniz!" Dim saat As Byte = Hour(Now) If 9 <= saat < 12 Then karsilamaMesaji = karsilamaMesaji.Insert(0, "Günayd ın,") ElseIf 12 <= saat < 16 Then karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi günler,") ElseIf 16 <= saat < 18 Then karsilamaMesaji = karsilamaMesaji.Insert(0, "İyi akşamlar,") End If ' Formun başlığı karşılama mesajını ' gösterecek şekilde ayarlanır Me.Text = karsilamaMesaji 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. Karar Yapıları ve Döngüler 119 Dim dosya As String = TextBox1.Text Select Case ComboBox1.SelectedText 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 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ı kodla-rın çalışması istenebilir veya de ğerlerin belirli aral ıklarda olması gibi durumlarla da kar şıla şılabilir. 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 120 Modül 6: durum = "Fazla" Case Else durum = "Çok Fazla" End Select Is Kullan ımı Is ifadesi kar şıla ştırma operatörleri ile kullan ılır. Randomize() 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şkenini 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 girile-mediğ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 üç basa-maklı olduğu gösterilirdi. Birden Fazla Koşulun Kontrolü Bir Case ifadesine birden fazla ko şul kullan ılmak isteniyorsa, bu ko şullar vir-gü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 Case MsgBox("Devam etmek istiyor musunuz?", MsgBoxStyle.YesNoCancel) Case MsgBoxResult.No, MsgBoxResult.Cancel Label1.Text = " İşlem iptal edildi" Karar Yapıları ve Döngüler 121 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 122 Modül 6: 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, kont-rol 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ır-ması 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 RESİM 6.3. 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 (Resim 6.3). Karar Yapıları ve Döngüler 123 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çi-len kontrolü bulmak için ElseIf yap ısının kullanımı yeterli olacakt ır. 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. Form-larda 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 Uygulama Bu uygulama kullanıcıya, stok durumuna veya tarihe göre de ğişen görüntü-leme seçenekleri sunarak, ürün katalogunu tan ıtır. Ürünler kategorilere göre ayrılmıştır ve ComboBox kontrolleri ile filtrelerden biri seçilmedi ği takdirde i şlem gerçekle şmez. Stok durumu filtresi ile satılmakta olan ürünlerden sadece stokta bulunan ya da stokta kalmamış olanlar listelenebilir. Tarihe göre filtreleme ile yeni ç ıkan ürün-ler ya da tüm ürünler gözlenebilir. Uygulamada, ak ış diyagramından koda geçiş a şaması rahat bir şekilde görüle-cektir. 124 Modül 6: Algoritman ın İncelenmesi Uygulaman ın algoritması ba şlang ıç ve ürün ekleme algoritmas ı olarak ikiye ay-rılmıştır. Başlang ıç algoritmasında ürün kategorisinin, stok durumunun ve tarih filtreleri-nin seçilip seçilmediği kontrol edilir. Herhangi biri seçilmedi ği zaman kullanıcıya ilgili mesaj gösterilir ve algoritmadan ç ıkılır. Tüm kontroller yap ıld ıktan sonra, il-gili kategorideki ürünlerin listeye eklenmesi için diğer algoritma devreye girer (Resim 6.4). RESİM 6.4: Başlangıç algoritmas ı. Ürün ekleme algoritması, ilk algoritmada seçilen kriterlere göre, kullan ıcıya gösterilecek ürün listesini doldurur. Bu algoritma ba şlang ıç olarak kategori numaras ını alır. Bu kategorideki stokta bulunan ürünleri listeye ekler. Stok du-rumu filtresinde “Hepsi” de ğeri seçiliyse, stokta o an bulunmayan ürünler de lis-teye eklenir. Tarih filtresinde “Son ç ıkanlar” değeri seçiliyse, eski ürünler liste-den çıkart ılır. Karar Yapıları ve Döngüler 125 RESİM 6.5: Ürün ekleme algoritması. Forma Kontrollerin Eklenmesi 1. UrunYelpazesi isminde bir Visual Basic Windows projesi aç ın. 2. Forma biri lbUrunler, diğeri lbKategoriler isminde iki ListBox kont-rolü ekleyin. lbUrunler liste kutusu tüm filtreler uyguland ıktan sonra çı-kan ürünleri listeler. lbKategoriler liste kutusuna kategori isimlerini ekleyin: ? Video ? Kitap ? Yaz ılım 3. Forma biri cmbTarihSirasi , di ğeri cmbStokDurumu isminde iki ComboBox kontrolü ekleyin. cmbTarihSirasi son ürünleri; cmbStokDurumu stoktaki ürünleri gösteren filtre olarak kullanılacakt ır. cmbTarihSirasi elemanlar ına “ Son Ç ıkanlar” ve “Tüm Ürünler” de-ğerlerini, cmbStokDurumu elemanlar ına “Sadece Stoktakiler ” ve “Hepsi ” de ğerlerini ekleyin. 4. lblMesaj isminde bir Label kontrolü ekleyin. Dock özelli ğini Buttom yap ın. Bu kontrol, filtrelerin seçilmedi ği durumda hata mesajlar ını gösterecektir. 5. lblSecilenUrunler isminde bir Label kontrolü ekleyin ve lbUrunler liste kutusunun üstüne yerleştirin. Bu kontrol, seçilen ürünlerin hangi kategoride olduğunu gösterecektir. 6. Forma btnListele isminde bir Button kontrolü ekleyin. 126 Modül 6: Kodların Yaz ılmas ı Bu uygulamadaki kodların tamam ı btnListele dü ğmesinin Click olayına yazılacakt ır. Kodlar aras ındaki numaralar, akış diyagramında işlenen durum-lara referans verir. Algoritma 1, ba şlang ıç algoritmasındaki numaralar ı; Algo-ritma 2, ürün ekleme algoritmasındaki numaralar ı ifade eder. 1. btnListele dü ğmesini çift tıklay ın ve Click olayına gelin. Düğme her tıklandığında liste kutusuna ard ı ard ına öğeler eklenmemesi ve hata mesajlarının temizlenmesi için gerekli kodlar ı yaz ın. lblMesaj.Text = "" lbUrunler.Items.Clear() 2. Kategori listesinden, stok ve tarih filtreleri için açılan kutulardan ö ğelerin seçili olup olmad ığının kontrolü yap ılır. E ğer seçilmemi ş bir değer varsa, ilgili hata mesajı lblMesaj etiketinde görüntülenir. ' Algoritma 1 - 1 If cmbStokDurumu.SelectedIndex = -1 And cmbTarihSirasi.SelectedIndex = -1 Then lblMesaj.Text = "Stok Durumu ve Tarih S ıras ı seçiniz." ' Algoritma 1 - 2 ElseIf cmbStokDurumu.SelectedIndex = -1 Then lblMesaj.Text = "Stok Durumunu seçiniz." ' Algoritma 1 - 3 ElseIf cmbTarihSirasi.SelectedIndex = -1 Then lblMesaj.Text = "Tarih S ıras ını seçiniz." ' Algoritma 1 - 4 ElseIf lbKategoriler.SelectedIndex = -1 Then lblMesaj.Text = "Kategori seçiniz." Else ' Algoritma 1 – 5 3. If ElseIf deyimlerinde tüm kontroller yap ıld ıktan sonra Else ifade-sine geçilir. Algoritmanın ak ışı bundan sonra ürün ekleme işlemiyle de-vam edecektir. Select Case lbKategoriler.SelectedIndex ' Algoritma 2 - 1 Case 0 ' Sadece stokta bulunan ürünler eklenir. ' Algoritma 2 - 2 lbUrunler.Items.Add("MSDN Tv Visual Basic 5") lbUrunler.Items.Add("MSDN Tv Visual Basic 4") ' Stokta bulunan veya bulunmayan ürünlerin Hepsi Karar Yapıları ve Döngüler 127 ' seçiliyse, kalan ürünler de listeye eklenir. ' Algoritma 2 - 3 If cmbStokDurumu.SelectedIndex = 1 Then ' Algoritma 2 - 4 lbUrunler.Items.Add("MSDN Tv Visual Basic") lbUrunler.Items.Add("MSDN Tv Visual Basic 2") lbUrunler.Items.Add("MSDN Tv Visual Basic 3") End If ' Eski ürünlerin gösterilmesi istenmiyorsa ' listeden çıkartılır. ' Algoritma 2 - 5 If cmbTarihSirasi.SelectedIndex = 0 Then ' Algoritma 2 - 6 lbUrunler.Items.Remove("MSDN Tv Visual Basic") lbUrunler.Items.Remove("MSDN Tv Visual Basic 2") End If 4. Di ğer iki kategori için liste ekleme i şlemleri ayn ıdır. Case 1 lbUrunler.Items.Add("Yaz ılım Uzmanl ığı 1") lbUrunler.Items.Add("Yaz ılım Uzmanl ığı 2") lbUrunler.Items.Add("Yaz ılım Mühendisliği Orta Düzey") lbUrunler.Items.Add("Yaz ılım Mühendisliği İleri Düzey") If cmbStokDurumu.SelectedIndex = 1 Then lbUrunler.Items.Add("Yazılım Mühendisliği Başlangıç Düzey") lbUrunler.Items.Add("Access Giri ş") End If If cmbTarihSirasi.SelectedIndex = 0 Then lbUrunler.Items.Remove("Yaz ılım Uzmanl ığı 1") End If Case 2 lbUrunler.Items.Add("Visual Studio 6.0") lbUrunler.Items.Add("Visual Basic .NET Standard 2003") lbUrunler.Items.Add("Visual Basic C# Standard 2003") If cmbStokDurumu.SelectedIndex = 1 Then lbUrunler.Items.Add("Visual Studio .NET 2005") End If If cmbTarihSirasi.SelectedIndex = 0 Then 128 Modül 6: lbUrunler.Items.Remove("Visual Studio 6.0") End If End Select 5. Select ifadesinde tüm eklemeler yap ıld ıktan sonra ikinci algoritma bi-ter. İlk algoritman ın son a şaması olan, kullanıcıya hangi kategoride ürün seçildi ğini gösteren mesaj yaz ılır ve If karar yapısı sonlanır. ' Algoritma 1 - 6 lblSecilenUrunler.Text = lbKategoriler.Text & " Kategorisindeki Ürünler" End If Karar Yapıları ve Döngüler 129 Konu 2: 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 (Resim 6.6). RESİM 6.6: Döngü. Bu bölüm tamamland ıktan sonra; ? For Next döngüsünü tan ıyacak, ? While ve Until döngülerinin farklarını ayırt edebilecek, 130 Modül 6: ? Do Loop döngüsünü tan ıyacak, ? İç içe döngüler kullanabilecek, ? Hangi döngünün nerede kullan ıld ığını ö ğreneceksiniz. Karar Yapıları ve Döngüler 131 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. 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ı ken-disi 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ğla-maz. 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 Byte For i = 0 To 255 ListBox1.Items.Add(Chr(i) & " - " & i) Next 132 Modül 6: Örneğin dizi i şlemlerinde, dizinin her elaman ına ula şmak için sayaç kullan ılabi-lir. Sayac ın artma hızı bir oldu ğu için dizi(sayac) ifadesi, sırayla dizinin ele-manlar ı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 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 ıl-ması gerekir. İlk döngü tek tek müşterileri almak için, alt döngü ise her mü şteri-nin telefonlarını almak için kullanılmal ıdır (Resim 6.7). Structure Musteri Dim Isim As String Dim Soyad As String Dim Telefonlari() As String End Structure Dim Musteriler() As Musteri ' Musteriler dizisi dolduruluyor ' ... Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i, j As Integer Karar Yapıları ve Döngüler 133 For i = 0 To Musteriler.Length – 1 ' İlk müşteri seçiliyor Dim m As Musteri = Musteriler(i) Label1.Text &= m.Isim & " " & m.Soyad Label1.Text &= " müşterisinin telefonları:" & vbCrLf For j = 0 To m.Telefonlari.Length - 1 Label1.Text &= m.Telefonlari(j) Label1.Text &= vbCrLf Next Next End Sub RESİM 6.7: İç içe döngüler. Birden fazla boyutlu dizilerde işlem yaparken de For döngüsü iç içe kullan ılabi-lir. Ö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. Randomize() Dim tablo(4, 4) As String Dim i As Byte For i = 1 To 4 tablo(0, i) = "Yazar " & i tablo(i, 0) = "Kitap " & i tablo(CInt(Rnd() * 3) + 1, CInt(Rnd() * 3) + 1) = "X" Next 134 Modül 6: tablo isminde String de ğerleri tutan bir dizi oluşturulur ve dizinin ilk sat ırına yazar isimleri, ilk sütununa da kitap isimleri konur. For döngüsünün sayacı bir-den ba şlad ığı için dizinin 0,0 koordinatl ı ilk eleman ına değer atanmaz. Yazar 1 Yazar 2 Yazar 3 Yazar 4 Kitap 1 Kitap 2 Kitap 3 Kitap 4 Daha sonra, tablonun diğer elemanlarına rasgele X de ğerleri atanır. Bu de ğer hangi yazar ın hangi kitabı yazdığını gösterir. CInt(Rnd() * 3) + 1 ifadesi 1 ile 4 arasında rasgele bir sayı üretir. Bu say ı tablo dizisine indis olarak verildi ğinde, kalan hücrelerde X de ğeri elde edilir. Yazar 1 Yazar 2 Yazar 3 Yazar 4 Kitap 1 X Kitap 2 X Kitap 3 X Kitap 4 X Tablonun tüm elemanlarını listelemek için iç içe iki For döngüsü kullan ılmal ıdır. For j As Integer = 0 To tablo.GetLength(0) - 1 For h As Integer = 0 To tablo.GetLength(1) - 1 Label1.Text &= tablo(j, h) Next Label1.Text &= vbCrLf Next Yazarlar ve Kitaplar tablosu haz ırlandıktan sonra, hangi yazarın hangi kitab ı yazdığını bulmak için yine tablo elemanları içinde dola şıp X de ğerini aramak gerekir. İlk For döngüsü ile Kitaplar satırlar ında, ikinci For döngüsü ile Yazarlar sütunlarında gezilir. For j As Integer = 0 To tablo.GetLength(0) - 1 For h As Integer = 0 To tablo.GetLength(1) – 1 ' Tablonun her elemanının değeri ' X değeri ile karşılaştırılır. If tablo(j, h) = "X" Then Label2.Text = tablo(0, h) & ", " Label2.Text &= tablo(j, 0) Label2.Text &= " kitabını yazıyor" Exit For End If Karar Yapıları ve Döngüler 135 Next Label1.Text &= vbCrLf Next Tablonun her eleman ı kontrol edilir ve X değeri bulundu ğu zaman, yazar ismi ve kitap ismi ekrana yazd ırılır. Yazar isimlerine, dizinin ikinci boyutunun ilk s ıra-sında tutuldu ğu için tablo(0,h) kodu ile ulaşılır. Kitap isimlerine ise, dizinin ilk boyutunun ilk sıras ında tutuldu ğu için tablo(j,0) kodu ile ulaşılır. Buradaki h ve j de ğişkenleri o anda kontrol edilen elemanın tablodaki indisleridir. Exit For ifadesi, o anda bulunan For döngüsünden çıkmayı sağlar. Bu ör-nekte ikinci For döngüsü Yazarlar sütunu üzerinde döndü ğü için, bu döngüden çıkıld ığında, ilk For döngüsüne tekrar geçilir. Bu sefer yeni bir kitap için Yazar-lar kontrol edilir. Sonuçta bir kitab ı birden fazla yazar yazmasına rağmen, görüntülenecek olan sadece ilk yazard ır. 136 Modül 6: 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ıl-ması ve kontrol edilmesi i şlemleri bu döngüde yap ılmaz. Bunun için kod yaz ıl-ması 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. An-cak 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 Karar Yapıları ve Döngüler 137 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. While ko şul1 and koşul2 or koşul3 End while 138 Modül 6: Do Loop Do ifadesi ile ba şlayan döngülerin söz dizimi Loop ifadesi ile sonlanacak şe-kilde 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 = "bilgeadam" Then Exit Do End If MsgBox("Hatalı giriş!", MsgBoxStyle.Exclamation) Loop Label1.Text = "Giriş ba şarılı." & vbCrLf Karar Yapıları ve Döngüler 139 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. Do While Koşullar, Do Loop döngüsünün içinde kontrol edilebildi ği gibi, döngüye girme-den 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 şu-lun kontrol edilmesidir. Yani en az bir defa yapılması istenen bir i şlem Do - Loop While yap ısı içersinde kullan ılabilir. 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 Do While ile yazılan bir döngüyü Do Until ifadesine çevirmek için, While kontrolündeki ko şulun tersinin al ınması gerekir. 140 Modül 6: Dim yanit As String Do MsgBox("İşlem yapılıyor...") yanit = InputBox("Devam etmek istiyor musunuz?") Loop Until Not (yanit = "e" Or yanit = "E") Do MsgBox("İşlem yapılıyor...") yanit = InputBox("Devam etmek istiyor musunuz?") Loop Until (yanit <> "e" And yanit <> "E") 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 ğe-rini 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 For döngüsünde sayac ın de ğeri Step ifadesindeki de ğerden fazla bir say ıda azalt ılırsa yine sonsuz döngüye girilir. Bu döngünün çalışması, Integer veri tipinin alabilece ği minimum de ğere ula şınca hata ile sonlan ır. For i As Integer = 0 To 9 Step 3 MsgBox("j") i -= 4 Next Karar Yapıları ve Döngüler 141 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 saya-cı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. 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 142 Modül 6: 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") = "" Karar Yapıları ve Döngüler 143 Uygulama Bu uygulamada, bir satranç tahtası üzerindeki bir filin hareket alan ı hesaplanır. Satranç tahtası rasgele ta şlarla doldurulur. Verilen bir koordinatta bulunan filin çapraz hareketlerine göre nereye ilerleyebilece ği bulunur. E ğer filin önünde bir ta ş varsa, bu ta şın bulunduğu yere ve daha gerisine ilerleyemeyecektir. Filin dört bir yan ına çapraz olarak hareket edebilece ği göz önünde bulundurulmal ı-dır. Tahtanın Doldurulması 1. Satranc isminde bir Windows projesi açın. 2. Form üzerine lbHareketAlani isminde bir ListBox, btnGoster is-minde bir Button ekleyin. 3. btnGoster dü ğmesinin Click olayına 8 x 8 boyutunda bir dizi tan ımla-yıp dolduran kodları yaz ın. Bu dizi Boolean tipinde de ğerler ta şır. Veri-len indisteki eleman ın de ğeri True olmas ı, o koordinatta bir taşın bulun-duğunu belirtir. Randomize() Dim tahta(7, 7) As Boolean For a As Integer = 0 To 7 For b As Integer = 0 To 7 tahta(a, b) = CInt(Rnd()) Mod 2 Next Next Hareket Alanı Tahta üzerindeki bir fil, dört çapraz yöne do ğru ilerleyebilir. Dizide çapraz olarak ilerlemek x ve y koordinatlarının eşit oranda artmas ı ve azalması demektir. Di-zide ilerlerken x ve y koordinatlarının sıfırdan küçük ve dizinin boyutundan bü-yük olmamas ına dikkat edilmelidir. Dört farkl ı yöne göre, koordinatlar artacak ya da azalacakt ır. 1. Fili tahta üzerine yerleştirmek için kullan ıcıdan koordinatlar ı al ın. Dim x As Byte = InputBox("Filin x koordinat ı:") Dim y As Byte = InputBox("Filin y koordinat ı:") 2. 0, 0 yönüne do ğru olan yoldaki ta şların kontrolünü yapın. Filin x ve y koordinatlar ını birer dü şürerek, koordinatlarda taş olup olmad ığı kontrol edilir. Eğer taş yoksa bu kareye ilerlenebildi ği, lbHareketAlani liste kutusuna koordinat eklenerek gösterilir. Yol üzerinde bir taş varsa, daha fazla ilerlenemeyece ği için While döngüsünden ç ıkılır. 144 Modül 6: Dim i As Integer = 1 While x - i >= 0 And y - i >= 0 If Not tahta(x - i, y - i) Then lbHareketAlani.Items.Add(x - i & " - " & y - i) i += 1 Else Exit While End If End While 3. 7, 0 yönüne doğru ilerlenir ve olası hareketler liste kutusuna eklenir. i = 1 Do While x + i < tahta.GetLength(0) And y - i >= 0 If Not tahta(x + i, y - i) Then lbHareketAlani.Items.Add(x + i & " - " & y - i) i += 1 Else Exit Do End If Loop 4. 7, 7 yönüne doğru kontrol yap ılır. i = 1 Do Until x + i >= tahta.GetLength(0) Or y + i >= tahta.GetLength(1) If Not tahta(x + i, y + i) Then lbHareketAlani.Items.Add(x + i & " - " & y + i) i += 1 Else Exit Do End If Loop 5. 0, 7 yönüne doğru ta şlar kontrol edilir. i = 1 Do While x - i >= 0 And y + i < tahta.GetLength(1) If Not tahta(x - i, y + i) Then lbHareketAlani.Items.Add(x - i & " - " & y + i) i += 1 Else Exit Do End If Loop Karar Yapıları ve Döngüler 145 Debug Kodlar yazıld ıktan sonra indislerin do ğru kullan ılıp kullanılmadığını ve döngü-lerde mant ıksal hatalar yap ılıp yapılmadığını kontrol etmenin en kolay yolu, hata ayıklay ıcı ile çal ışmaktır. Bu örnekte birçok döngü kurulmuş ve filin dört hareket yönündeki engeller kontrol edilmi ştir. Tüm hareketlerin işleyi şine De-bug ile kolayca bak ılabilir. 1. InputBox ile filin koordinatlarının al ındığı yere BreakPoint koyun ve projeyi çalıştırın. 2. x ve y koordinatlarına 0 değerini girin. Filin, tahtanın sol üst kö şesinde oldu ğu varsay ılır. Bu durumda fil hangi yönde ilerleyebilir? Step Into komutu ile kodlar aras ında ilerleyin ve hangi döngü içine girdi ğini bulun. 3. Locals panelinde i de ğişkeninin değerini izleyin. Ayn ı panelde tahta dizisinin, o anda kontrol edilen değerine bak ın. x ve y de ğerlerinin bir fazlas ını alarak, diğer değerin True ya da False olduğunu kontrol edin. 146 Modül 6: Konu 3: 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 za-man ı (Design Time) hataları olarak ayr ılabilir. Ta s a rım zaman ı hataları, kodların yazılması s ıras ında derleyici tarafından bulu-nan ve Task List panelinde gösterilen hatalard ır (Resim 6.8). Task List pane-linde hatan ın aç ıklaması, hatan ın projenin hangi dosyasında ve dosyanın ka-çıncı sat ırında bulunduğu gösterilir (Resim 6.9). Tasarım zaman ı hataları; ? Söz dizimi yanlış kullan ıld ığında, ? Option Explicit On durumunda, tan ımlanmayan bir değişken kullanıld ığında, ? Option Strict On durumunda, de ğişken tiplerini Implicit Conversion ile çevirirken meydana gelir. Çalışma zamanı hataları, uygulama çal ışırken yap ılması imkansız bir işlemin gerçekle ştirilmesi sıras ında meydana gelir (Resim 6.10). Örne ğin InputBox metodu ile bir sayının al ınması s ıras ında, kullan ıcı String tipinde bir de ğer gi-rerse çal ışma zamanında bir hata oluşur. Karar Yapıları ve Döngüler 147 RESİM 6.8: Ta s a r ım zamanı hatalar ı. RESİM 6.9: Task List paneli. Dim dizi(10) As Integer For i As Integer = 0 To dizi.Length Label1.Text &= dizi(i) Next RESİM 6.10: Çalışma zamanı hatas ı. Resim 6.10’daki 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. 148 Modül 6: 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 za-man ı 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 belirten bir mesaj yazılır. Exception nesnesinin Message özelli ği, hatanın oluştu ğu zaman üreti-len mesajı tutar. Exception nesnesinin özellikleri Catch içinde kullan ılmaya-caksa, tanımlanmas ına gerek yoktur. Karar Yapıları ve Döngüler 149 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ıla-cak 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 mey-dana 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. 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) Exit Sub Catch ex As Exception 150 Modül 6: MsgBox(ex.Message) Exit Sub Finally FileClose(dosya) MsgBox("Finally her durumda çal ışır") End Try MsgBox("Uygulama akışı buraya gelmeyecek.") Karar Yapıları ve Döngüler 151 Lab 1: Şifreleme Algoritmas ı Bu uygulamada, verilen bir yazı şifrelenerek bir dizi say ıya çevrilir. Bu sayılar, yazıda geçen karakterlerin ASCII kodlar ının karışmış bir halidir. Şifreyi çözmek için, şifrelemede izlenen yolların tersi uygulanır. İPUCU Şifreleme algoritmalarında yazıyı şifrelerken izlenen yollar ın geri dönüşü olmalı-dır. Örneğin rasgele say ılar kullanılarak şifrelenen bir yazıyı, tekrar rasgele say ı-lar kullanarak çözülemez. Şifreleme Verilen yazının şifrelenmesi üç etaptan olu şur: 1. Yazının karakterleri ASCII kodlar ına çevrilir. 2. Kodlar, gerekiyorsa başlarına 0 konarak, 4 haneli yapılır ve s ıralı halde bir String de ğişkeninde tutulur. 3. Sıralı şekilde yazılan kodlar, bir ba ştan, bir sondan karakter al ınarak tekrar düzenlenir. Örnek: “acf” kelimesinin şifrelenmesi: 1. a c f karakterleri ASCII kodlarına çevrilir. a = 97 c = 99 f = 102 2. Kodlar başlarına s ıfır konarak 4 haneli yapılır. 0097 0099 0102 Sıralı halde bir String de ğişkenine yaz ılır. 009700990102 3. Sayının ortas ına kadar, önce ba ştan, daha sonra sondan rakam al ına-rak tekrar yazılır. Siyah olarak gösterilen rakamlar, dizinin sonundan al ınmıştır. 0 0 2 0 2 0 0 2 0 0 0 2 0 0 9 0 2 0 0 9 1 0 2 0 0 9 1 7 0 2 0 0 9 1 7 0 152 Modül 6: 0 2 0 0 9 1 7 0 0 0 2 0 0 9 1 7 0 0 9 0 2 0 0 9 1 7 0 0 9 0 0 2 0 0 9 1 7 0 0 9 0 9 = Şifre Projenin Aç ılmas ı 1. Visual Studio ortamında, Sifreleme isminde bir Windows projesi açın. 2. Açılan forma lblSifre isminde bir Label kontrolü, btnSifrele is-minde bir Button kontrolü ekleyin. Bu kontroller kullanıcıdan al ınan yazının şifrelenip görüntülenmesini sa ğlayacakt ır. 3. Açılan forma lblDesifre isminde bir Label kontrolü ve btnSifreyiCoz isminde bir Button kontrolü ekleyin. Bu kontroller şifre-lenmi ş yazının lblSifre kontrolünden alınarak, şifrelenip görüntülenmesini sağlayacakt ır. DİKKAT Şifreleme algoritmas ının tüm kodlar ı btnSifrele kontrolünün Click olayına yazılacakt ır. ASCII Kodlarına Çevirme RESİM 6.11: ASCII kodlarına çevirme algoritması. 1. Şifrelenecek yaz ının girilmesi için gerekli kodu yazın. Bir yazı girilene kadar kullanıcıdan yazı istemek için Do Loop Until döngüsünü kulla-nın. Karar Yapıları ve Döngüler 153 Dim yazi As String ' Algoritma 1 - 1 Do yazi = InputBox("Şifrelenecek Kelimeyi girin") Loop Until yazi.Length > 0 2. Girilen yazının karakterlerini bir dizide toplamak için String de ğişkeni-nin ToCharArray() metodunu kullanın. ' Algoritma 1 - 2 Dim karakterler() As Char = yazi.ToCharArray() 3. Karakterlerin ASCII kodu karşılığını tutmak için kodlar isminde bir dizi yaratın. Karakterler dizisindeki tüm elemanlar üzerinde işlem yapmak için bir döngü kurun. Karakterler dizisindeki her karakteri Asc hazır fonksiyonu ile ASCII koduna çevirin. Dim uzunluk As Short = karakterler.Length - 1 Dim kodlar(uzunluk) As String Dim i As Integer ' kelimedeki her karakterin ASCII kodu alınır For i = 0 To uzunluk ' Algoritma 1 - 3 kodlar(i) = Asc(karakterler(i)) Next 4. Bu algoritma sonunda elde edilen kodlar dizisi, şifrelenecek olan yaz ının her karakterinin ASCII kodunu tutar. Bu dizi diğer algoritmanın giriş de ğeri olarak kullanılacakt ır. Sıralı Kodlara Çevirme ASCII karakter kodları 0 ile 255 aras ında bir değer al ır. Dolay ısıyla, her kod maksimum üç haneli olacaktır. Şifre olu şturulurken yapılan son düzenlemede kolaylık sa ğlamak için, bu kodlar 4 haneli yap ılır. Daha sonra bu kodlar diziden çekilerek SiraliKodlar adl ı bir String de ğişkenine yaz ılır. 1. Dizideki kodları sıralı bir şekilde tutmak için SiraliKodlar adl ı bir değişken tanımlayın. İlk algoritmadan alınan ASCII kodlar ını tutan kodlar dizisi üzerinde bir döngü kurun. Dim SiraliKodlar As String Dim j As Short = 0 While j <= kodlar.Length – 1 j += 1 End While 154 Modül 6: RESİM 6.12: Sıralı kodlara çevirme algoritması. DİKKAT 2 – 4 etaplarında yazılacak tüm kodlar While döngüsünün içine yaz ılacakt ır. Bu döngüde kullan ılacak ASCII kodunu bir de ğişkene atan kodu yazın. ' Alogritma 2 - 1 Dim AsciiKodu As String = kodlar(j) 2. AsciiKodu de ğişkeninde tutulan kodun 4 haneli hale getirilmesi için kaç tane sıfır eklenmesi gerekti ğini bulun. Eklenecek s ıfırlar ın sayısı, 4 – AsciiKodu de ğişkeninin uzunluğu kadard ır. Örneğin 192 kodlu bir değişkene eklenmesi gerenken sıfır sayısı 4 – 3 = 1 tanedir. Dim eklenecek As Byte = 4 - AsciiKodu.Length 3. Eklenecek sayı kadar çalışacak bir döngü içinde, sıfır ekleme işlemini yap ın. For i = 0 To eklenecek - 1 ' Alogritma 2 - 3 AsciiKodu = AsciiKodu.Insert(0, 0) Next 4. Düzenlenmiş AsciiKodu de ğerini Sıral ıKodlar de ğişkenine yaz ın ve sayacı bir art ırarak diğer ASCII koduna geçin. Karar Yapıları ve Döngüler 155 ' Alogritma 2 - 4 SiraliKodlar &= AsciiKodu j += 1 Algoritma sonunda ortaya ç ıkan değer, karakterlerin 4 haneli ASCII kodlar ını tutan bir String de ğişkenidir. Bu de ğişken, di ğer algoritmada tekrar düzenlenmek üzere kullan ılacakt ır. Şifrenin Olu şturulmas ı Bir önceki algoritmada elde edilen Sıral ıKodlar de ğişkeni halen istenen şif-reli yazı de ğildir. Çünkü 4 haneli kodlar s ıralı bir şekilde durur ve kolayca çözülebilir. Şifrenin ilk bak ışta anla şılmasını daha da zorlaştırmak için, s ıralan-mış kodlar biraz daha kar ıştırılır. RESİM 6.13: Şifrenin olu şturulması. 1. Döngüde kullanılacak j sayac ını s ıfırlay ın ve şifrenin tutulacağı de ğiş-keni tanımlayın. 'Algoritma 3 - 1 j = 0 Dim Sifre As String 2. Sıral ıKodlar de ğişkeni üzerinde yap ılacak i şlem say ısı, bir baştan, bir sondan ilerlendiği için, değişkenin uzunlu ğunun yarısı kadardır. Sayacın bu uzunlu ğa kadar tan ımlı olan bir döngü olu şturun. 'Algoritma 3 - 2 Do While j < SiraliKodlar.Length / 2 j += 1 Loop 156 Modül 6: DİKKAT 3 – 4 etaplar ında yazılacak tüm kodlar Do While döngüsünün içine yazılacak-tır. 3. Şifreye, Sıral ıKodlar’ın j indisli karakterini ekleyin. 'Algoritma 3 - 3 Sifre &= Mid(SiraliKodlar, j + 1, 1) 4. Şifreye, Sıral ıKodlar’ın uzunluk – j indisli karakterini ekleyin. 'Algoritma 3 - 4 Sifre &= Mid(SiraliKodlar, SiraliKodlar.Length - j, 1) 5. Sonuç olarak çıkan şifre, girilen yaz ının ASCII kodlarının karışık dü-zende tutulması ile olu şturulur. lblSifre.Text = "Girilen yaz ının şifrelenmiş hali: " & Sifre Şifreyi Çözmek Şifreleme algoritmas ı kullan ılarak olu şturulan şifrenin çözülmesi, izlenen yolla-rın tersi uygulanarak gerçekle ştirilir. De şifre algoritmas ı iki etaptan olu şur. 1. Bir baştan bir sondan karakter al ınarak şifrelenen ASCII kodlar ı, sıralı kodlar haline dönü ştürülür. 2. 4 haneli olarak duran s ıralı kodlar, karakterlere çevrilir. Karakterler ard ı ardına konarak de şifre i şlemi gerçekle ştirilir. Örnek: “acf” kelimesinin şifrelenmi ş hali 020091700909 şeklindedir. Bu kelime şifrelenirken, karakterleri 4 haneli ASCII kodlarına çevrilmi ş ve bu kodlar ın ra-kamlar ının sıras ı de ğiştirilmişti. Bu şifrenin önce 4 haneli s ıralı kodlar haline getirilmesi için, şifrelenen yöntemin tersi i şlenir. S ırayla okunan rakamlar önce başa, daha sonra sona yaz ılır. Şifre: 0 2 0 0 9 1 7 0 0 9 0 9 Sıralı kodlara çevrim: Sıran ın ilk yarısı Sıran ın son yar ısı 0 2 0 0 0 2 0 0 9 1 0 2 0 0 9 7 0 1 0 2 0 0 9 7 0 9 0 1 0 2 0 0 9 7 0 0 9 9 0 1 0 2 Sonuç olarak elde edilen sıralı ASCII kodlar ı, sıran ın ilk yarısı ve son yar ısının birle şimi olur: 0097 0099 0102 Karar Yapıları ve Döngüler 157 DİKKAT Sıran ın ilk yar ısı olu şturulurken, rakamlar sona eklenir. Ancak sıran ın son yarısı oluşturulurken rakamlar başa eklenir. Bu 4 haneli kodlar String de ğerinden Integer de ğerine çevrilir ve bu de ğerle-rin kar şılığı olan karakterler yaz ılır. 0097 Æ 97 Æ a 0099 Æ 99 Æ c 0102 Æ 102 Æ f Elde edilen karakterler birleştirildi ğinde şifre çözülmüş olur: “acf” DİKKAT Deşifre algoritmas ının tüm kodlar ı btnSifreyiCoz kontrolünün Click ola-yına yaz ılacakt ır. Şifreyi S ıralı Kodlara Dönü ştürmek Bu algoritma verilen şifreyi s ıralı ASCII kodlar ına dönüştürür. RESİM 6.14: Şifrenin s ıralı kodlara dönü ştürülmesi. 1. Şifreyi lblSifre etiketinden alın ve s ıralı kodların oluşturulmas ı için gereken de ğişkenleri tanımlayın. ' Algoritma 1 - 1 Dim Sifre As String = lblSifre.Text Dim SiraliKodlar As String Dim i As Short ' Başa ve sona rakam ekleneceği için ' değişkenlere başlangıç değerleri verilir Dim ilkYarisi As String = "" Dim sonYarisi As String = "" 158 Modül 6: 2. Şifrenin tüm elemanlar ı üzerinde bir döngü kurarak, s ıralı kodlar ın ilk ve son yarısını olu şturun. Kodlar ın ilk yarısı, şifrenin tek haneli rakamları ile; kodlar ın son yarısı, şifrenin çift haneli rakamlar ı ile oluşturulur. Dolayısıyla döngünün sayacı ikişer iki şer artmal ıdır. Şifrenin i indisli ra-kam ını s ıran ın ilk yarısına, yanındaki rakamı ( i + 1 indisli rakam ı) sıra-nın son yar ısına ekleyen kodları yaz ın. For i = 1 To Sifre.Length Step 2 ' Algoritma 1 - 2 ' Sıran ın ilk yarısının sonuna rakam eklenir. ilkYarisi &= Mid(Sifre, i, 1) ' Algoritma 1 - 3 ' Sıran ın son yarısının başına rakam eklenir. sonYarisi = sonYarisi.Insert(0, Mid(Sifre, i + 1, 1)) Next 3. Sıralı kodlar ın ilk yarısı ve son yar ısı birleştirilir. Elde edilen değer, 4 ha-neli ASCII kodlar ının sırayla tutulduğu bir String de ğeridir. ' Algoritma 1 - 4 SiraliKodlar = ilkYarisi & sonYarisi Sıralı Kodlar ın Okunmas ı İlk algoritmada elde edilen s ıralı ASCII kodlar ı, bu algoritmada okunarak karak-terlere çevrilir ve şifre çözülmüş olur. 1. Şifre çözüldü ğü zamanki de ğerinin tutulaca ğı de ğişkeni tanımlayın ve sıralı kodlar üzerinde bir döngü kurun. S ıralı kodlar 4 haneli kodlardan oluştu ğu için, döngüde bir seferde 4 rakam alınacakt ır. Bunun için döngünün sayac ı 4 artırılmal ıdır. i = 0 Dim yazi As String = "" Do While i < SiraliKodlar.Length i += 4 Loop DİKKAT 2 – 3 etaplar ında yazılacak tüm kodlar Do While döngüsünün içine yazılacak-tır. 2. Döngü her seferinde bir ASCII kodu alır. Bu de ğeri tutan bir değişken tan ımlanır ve sıralı kodlardan 4 haneli rakam bu de ğişkene atanır. Karar Yapıları ve Döngüler 159 RESİM 6.15: Sıralı kodların okunması. Dim AsciiKodu As Integer ' Algoritma 2 - 1 AsciiKodu = CInt(Mid(SiraliKodlar, i + 1, 4)) 3. Al ınan ASCII kodunun karakter kar şılığı bulunur ve yazi de ğişkenine eklenir. ' Algoritma 2 - 2 yazi &= Chr(AsciiKodu) 4. Döngü sonunda elde edilen de ğer lblDesifre etiketine yaz ılır. ' Algoritma 2 - 3 lblDesifre.Text = yazi 160 Modül 6: Lab 2: Sıralama Algoritmas ı Bu algoritma, bir dizinin elemanlarını küçükten büyü ğe sıralar. Dizinin Doldurulması 1. Siralama isimli bir Windows projesi aç ın. 2. Form üzerine biri lbSirasiz, di ğeri lbSirali isimli iki ListBox ekle-yin. Bu kontroller dizinin s ıras ız ve sıralı halini listeler. 3. btnListele ve btnSirala isimli iki Button ekleyin. 4. Formun kod tarafına geçin ve bir dizi tanımlayın. Bu dizi bir çok yorda-mın içinde kullan ılaca ğı için global olarak tan ımlanır. Dim dizi(4) As String 5. btnListele dü ğmesinin Click olayına, diziyi karışık bir şekilde isim-lerle dolduran kodlar ı yaz ın: dizi(0) = "Enis" dizi(1) = "Engin" dizi(2) = "Tamer" dizi(3) = "Kadir" dizi(4) = "Fulya" Dim i As Integer For i = 0 To dizi.Length - 1 lbSirasiz.Items.Add(dizi(i)) Next Dizinin Sıralanmas ı Sıralama algoritmas ı, dizi üzerinde bir döngü kurar ve sırayla dizinin bir ele-man ı seçilir. Bu eleman için bir başka döngü kurulur ve seçilen elemanın indi-sine kadar olan tüm elemanlarla bir karşıla ştırma yap ılır. Küçük olan s ıran ın başına konmak için büyük olan ile yer değiştirilir. Örnek 1. Dizinin 2. elemanı seçilir: " Engin " Dizinin 2. indisine kadar olan elemanlarla kar şıla ştırılır. "Engin " de ğeri alfabetik sırada " Enis" de ğerinden küçük olduğu için, bu iki değer yer değiştirilir. Sıra, Engin Enis Tamer Kadir Fulya olur. 2. Dizinin 3. elemanı seçilir: " Tamer " Karar Yapıları ve Döngüler 161 Dizinin 3. indisine kadar olan elemanlarla kar şıla ştırılır. "Tamer " de ğeri, "Enis" ve "Engin " de ğerlerinden büyük oldu ğu için s ıralama değişmez. 3. Dizinin 4. elemanı seçilir: " Kadir " Dizinin 4. indisine kadar olan elemanlarla karşıla ştırılır. " Kadir " < "Tamer " oldu ğu için bu iki de ğer yer de ğiştirilir. Sıra, Engin Enis Kadir Tamer Fulya olur. "Kadir " de ğeri, "Enis" ve " Engin " de ğerlerinden büyük olduğu için sıralama değişmez. 4. Dizinin 5. elemanı seçilir: " Fulya " Dizinin 5. indisine kadar olan elemanlarla karşıla ştırılır. " Fulya " < "Tamer " oldu ğu için bu iki de ğer yer de ğiştirilir. Sıra, Engin Enis Kadir Fulya Tamer olur. "Fulya " < "Kadir " oldu ğu için bu iki de ğer yer de ğiştirilir. Sıra, Engin Enis Fulya Kadir Tamer olur. Dizideki tüm değerler kontrol edildiği için algoritmadan ç ıkılır. RESİM 6.16: Sıralama algoritmas ı. 1. btnSirala dü ğmesinin Click olayına, dizi üzerinde bir döngü tan ımla-yın. Bu döngü dizinin (1 indisli) ikinci elemanından başlayarak dizi so-nuna kadar devam edecektir. Daha sonra bu döngü içine başka bir döngü daha yaz ın. Bu döngü, ilk döngünün sayac ından başlar ve sıfır 162 Modül 6: olana kadar devam eder. İkinci döngünün amacı, ilk döngüde seçilen elemanı, dizinin ba şına kadar olan elemanlarla karşıla ştırmakt ır. Dim i As Integer For i = 1 To dizi.Length - 1 Dim j As Integer = i While j AndAlso dizi(j) < dizi(j - 1) ' Yer değiştirme Algoritması j -= 1 End While Next While döngüsü, j de ğeri s ıfır olana kadar ve dizinin kontrol edilen de-ğeri bir önceki de ğerden küçük olana kadar devam eder. Burada, dizi elemanlarının kontrolünün sadece bir defa (bir önceki eleman ile) yap ıl-dığı dü şünülebilir. Ancak küçük eleman yer de ğiştirildi ğinde j de ğeri bir düşürülür. Döngü tekrar çalıştığı zaman, aynı eleman bu sefer dizinin kalan elemanlar ıyla kar şıla ştırılır. AndAlso operatörü, j de ğerinin sıfır olması durumunda diğer kontrolün yap ılmamas ı için kullan ılır. Di ğer kontrolde dizi(j – 1) ifadesi, nega-tif indisli de ğere ula şılmak istendi ği için hata mesaj ı verir. 2. Ye r d e ğiştirme algoritmas ı, bir de ğişkenin de ğerinin geçici bir yerde tutulmas ı ile gerçekle ştirilir. RESİM 6.17: Yer de ğiştirme algoritmas ı. Sıralama algoritmas ında dizinin j ve j - 1 indisli değerleri yer değiştirilir. While döngüsü içinde “Yer değiştirme Algoritması” ya-zan yorum sat ırını kald ırın ve yerine algoritma kodlarını yaz ın. Karar Yapıları ve Döngüler 163 ' Yer de ğiştirme Dim temp As String = dizi(j - 1) dizi(j - 1) = dizi(j) dizi(j) = temp 3. lbSirali liste kutusunda dizinin yeni s ıras ını görüntüleyen kodlar ı ya-zın. For t As Integer = 0 To dizi.Length - 1 lbSirali.Items.Add(dizi(t)) Next 164 Modül 6: Lab 3: Arama Algoritması Arama algoritmaları, sıralı bir liste üzerinde bir de ğerin aranmas ı için kullan ılır. Karışık sırada olan bir listede yapılan arama, ancak listenin ba şından sonuna kadar tüm elemanlar ının kontrol edilmesi ile gerçekleşir. Bu yöntem büyük dizi-lerde performansı dü şürür. Belirli bir sırada olan dizilerde ise daha h ızl ı arama yöntemleri kullanılmal ıdır. Bu labda ikili arama yöntemi (Binary Search) incelenecektir. DİKKAT İkili arama yöntemi sadece sıralı bir dizi üzerinde uygulanabilir. Ya da eldeki dizi öncelikle s ıralanır. NOT İkili arama yönteminde büyük-küçük k ıyaslaması yap ıld ığından, dizinin s ıralı ol-mas ı gerekir. Dizinin Sıralanmas ı Arama algoritması s ıralı bir dizi üzerinde çal ışacağı için, dizi olu şturulduktan sonra sıralanmas ı gerekir. 1. IkiliArama isminde bir Windows projesi açın. 2. Forma btnAra isimli bir Button ve lbDizi adl ı bir ListBox ekleyin. 3. Kod sayfas ına geçin ve global bir dizi tan ımlayın. Dim dizi(10) As Integer 4. Formun Load olayına diziyi rasgele say ılarla doldurmak için gereken kodlar ı yaz ın. For i As Integer = 0 To 10 dizi(i) = Rnd() * 1000 Next 5. Diziyi s ıralayın ve değerlerini lbDizi adl ı listeye ekleyin. Array.Sort(array) For i As Integer = 0 To 10 lbDizi.Items.Add(dizi(i)) Next Arama Algoritması İkili arama algoritmas ı, dizi üzerinde aranacak de ğeri önce sıran ın ortas ındaki değerle karşıla ştırır. Dizi küçükten büyü ğe do ğru s ıralı olduğu için, aranan de-ğer ortadaki de ğerden küçükse, arama dizinin ilk yar ısında devam eder. Dizinin di ğer yarısı aranan de ğerden büyük de ğerler içerdiği için, aramaya dahil edil-mez. Karar Yapıları ve Döngüler 165 Örnek Küçükten büyüğe sıralı dizi üzerinde 9 de ğeri aranacaktır. Dizi: 1 2 4 7 9 10 12 18 1. Son , Baş ve Orta de ğişkenleri tan ımlanır: Son de ğeri dizinin son elemanının indisini, Baş de ğeri dizinin ilk eleman ının indisini, Orta de-ğeri ise Son + Ba ş / 2 de ğerini al ır. Orta de ğeri virgüllü bir değer al ırsa tamsay ıya çevrilir. 2. Başlang ıç olarak Baş -1 , son dizi uzunlu ğu de ğerini al ır. Baş = -1 Son = 8 Orta = (8 – 1) / 2 = 3 3. Dizinin Orta indisli de ğeri alınır. Dizi(3) = 7 RESİM 6.18: Arama algoritması. 166 Modül 6: 4. Aranan 9 değeri, 7’den büyük oldu ğu için, dizinin son yar ısında aran ır. Baş de ğişkenine Orta de ğeri verilirse, dizinin ba şlang ıç indisi değiştirilir, böylece aramalar dizinin son yarısında gerçekleşmiş olur. Dizi: 9 10 12 18 Baş = 3 Son = 8 Orta = (8 + 3) / 2 = 5 5. Dizinin Orta indisli de ğeri alınır. Dizi(5) = 10 6. 9 de ğeri, 10’dan küçük olduğu için, kalan dizinin ilk yarısında aran ır. Dizi: 9 10 Baş = 3 Son = 5 Orta = (5 + 3) / 2 = 4 7. Dizinin ortasındaki de ğer al ınır: 9 8. Böylece 9 değerinin indisi Orta de ğeri olur. Kodlar Arama algoritmasının kodları btnAra dü ğmesinin Click olay ına yaz ılacakt ır. 1. Algoritma için gerekli bas , son ve orta de ğişkenlerini tanımlayın ve başlang ıç de ğerlerini verin. Aranan değerin indisini tutmak için de bir değişken tanımlayın. Dim son As Integer = dizi.Length Dim bas As Integer = -1 Dim orta As Integer Dim indis As Integer 2. Kullanıcıdan aranacak değeri girmesini isteyin. Dim hedef As Integer = InputBox("Aranan değeri girin:") 3. Dizide aranacak değer kalmadığı zaman ç ıkan bir döngü kurun. son ve bas de ğerleri arasındaki fark 1’e düştü ğünde, dizide aranacak de ğer kalmamıştır. While son - bas > 1 End While 4. While döngüsü içine, dizinin orta indisli de ğerini alan ve bu de ğeri ara-nan de ğerle karşıla ştıran kodları yaz ın. Karar Yapıları ve Döngüler 167 orta = (son + bas) / 2 If dizi(orta) > hedef Then son = orta ElseIf dizi(orta) < hedef Then bas = orta Else indis = orta MsgBox("İndis: " & indis) Exit Sub End If Eğer dizinin ortasındaki de ğer aranan değerse, indis bulunmuş demek-tir. orta de ğişkeni kontrolün yap ıld ığı de ğerin indisini tuttu ğu için, sonuç orta de ğeri olur ve yordamdan ç ıkılır. 5. Eğer istenen değer bulunamadan döngüden çıkılırsa, indis -1 de ğe-rini alır. End While ifadesinden sonra, aranan de ğerin bulunamad ığını belirten kodu yazın. indis = -1 MsgBox(" İndis: " & indis & " Aranan değer bulunamadı") 168 Modül 6: Modül Sonu Soruları & Al ıştırmalar 1. If ifadesi hangi veri tipini kontrol eder? 2. If - Select karar yapılarının farkları nelerdir? 3. True Or False And False (True Or False) And False ifadeleri hangi de ğerleri döndürür? 4. For Next döngüsünün Do döngülerine göre avantaj ı nedir? 5. While ve Until arasındaki fark nedir? 6. 4 boyutlu bir dizinin tüm elemanlarını doldurmak için, dizi üzerinde kaç tane döngü kurulmal ıdır? 7. Uygulamaları derledikten sonra hatalar hangi yollarla görülebilir? 8. Finally blo ğundaki kodlar ne zaman çalışır? 9. Sıralı arama yönteminde (Linear Search) dizinin elemanlarının sıralı ol-ması gerekli midir? 10. Sıralı arama yöntemini bir dizi üzerinde uygulay ın. Modül 7: 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 bulu-nup değiştirilmesi gerekir. Böylece hem uygulaman ın yazımı zorla şır, hem de değişik yapmak giderek imkans ız hale gelir. Bu problemler, birçok yerde yapıl-ması 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 numa-ras ı 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 fonksi-yon 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. Bu modül tamamland ıktan sonra; ? Yordam ve fonksiyon kullanarak kodlarınızın yönetilebilirliğini ve esnekli ğini art ıracak, ? Fonksiyon ve yordamlar ın farklarını ayırt edebilecek, ? .NET çat ısındaki tarih ve zaman, matematik, String fonksiyonlarını tan ıyacak, ? Offline ve Online yard ımı etkin bir şekilde kullanabileceksiniz. 172 Modül 7: Konu 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 te-mizlenmesi gerekiyorsa, bu kodları bir daha yazmamak için yordam kullanılabi-lir. 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 Fonksiyonlar ve Yordamlar 173 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. Ay-rı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 174 Modül 7: yordamın birbirine 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 yor-dam ında üç defa kullan ıld ığı için, her değişiklikte kodun yazıld ığı üç yer bulu-nup 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 sa-dece Temizle yordam ında yapmak yeterli olur. Sub Temizle() Label1.Text = "" ListBox1.Items.Clear() ListBox1.Items.Add("Dersler: ") End Sub Fonksiyonlar ve Yordamlar 175 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 ala-cak ş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() '... 176 Modül 7: 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 C onversion ile ilgili veri tipine çevrilir. Yordamları tan ımlarken parametrelerin isimleri ve veri tipleri belirtilmelidir. Ay-rı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. ByVal ve ByRef arasındaki farklar Modül 8’de detaylı olarak incelenecektir. 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. 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 _ Fonksiyonlar ve Yordamlar 177 y <> matris2.GetLength(1) Then MsgBox("Matris boyutlarının büyüklükleri birbiriyle ayn ı olmalıdır.") Exit Sub End If Dim sonuc(x - 1, y - 1) As Integer For i As Integer = 0 To x - 1 For j As Integer = 0 To y - 1 sonuc(i, j) = matris1(i, j) + matris2(i, j) Next Next End Sub Diziler yordamlara parametre olarak geçilirken, sadece isimleri verilir. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim m1(,) As Integer = {{1, 3, 5}, {7, 9, 11}} Dim m2(,) As Integer = {{0, 2, 4}, {6, 8, 10}} MatrisTopla(m1, m2) End Sub Opsiyonel Parametreler Yordamlara parametre verilmesi opsiyonel olabilir. Parametre tan ımlarken Optional anahtar kelimesi kullan ılırsa, yordam çağırıld ığında bu parametrenin girilmesi zorunlu olmaz. Opsiyonel parametreler tanımlanırken ba şlang ıç değerleri verilmelidir, çünkü bu alan bo ş bırak ıld ığı zaman hangi de ğerin işlenece ği bilinmelidir. Örneğin, MsgBox kullanımında baz ı parametrelerin iste ğe bağlı girilebildiği görülür. Girilmeyen parametreler için varsayılan de ğerler kullan ılır. MsgBox("Mesaj") MsgBox("Mesaj", MsgBoxStyle.YesNoCancel) MsgBox("Mesaj", MsgBoxStyle.MsgBoxRight, "Uyarı") MsgBox("Mesaj", , ) MsgBox("Mesaj", , "Dikkat") Örnek: Sub Yaz(ByVal mesaj As String, Optional ByVal SatirSayisi As Integer = 1) Label1.Text &= mesaj ' Verilen satır sayısı kadar satır başı yapılır. 178 Modül 7: For i As Integer = 0 To SatirSayisi - 1 Label1.Text &= vbCrLf Next End Sub Sub DiziYazdir(ByVal Dizi1() As String, ByVal Dizi2() As String, Optional ByVal Format As String = "Bitişik") If Dizi1.Length <> Dizi2.Length Then Yaz("Dizi uzunluklar ı eşit olmal ı") Exit Sub End If If Format.ToLower() = "bitişik" Then For i As Integer = 0 To Dizi1.Length - 1 Yaz(Dizi1(i) & Dizi2(i)) Next ElseIf Format.ToLower() = "altalta" Then For i As Integer = 0 To Dizi1.Length - 1 Yaz(Dizi1(i), 2) Yaz(Dizi2(i), 2) Next End If End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim isimler() As String = {"Enis", "Kadir", "Ebru"} Dim Soyadlar() As String = {"Günesen", "Sümerkent", "Gül"} DiziYazdir(isimler, Soyadlar) DiziYazdir(isimler, Soyadlar, "AltALTA") End Sub Opsiyonel parametreler, yordamların son argümanlar ı olmal ıdır (Resim 7.1). Bir opsiyonel parametreden sonra ancak ba şka bir opsiyonel parametre gelebilir. RESİM 7.1: Opsiyonel parametre. Fonksiyonlar ve Yordamlar 179 Bir yordamda veya fonksiyonda birçok opsiyonel parametre kullanılıyorsa, iste-nen 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 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 veri-len 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 Yaş ortalamas ını hesaplayan bu yordam ın ilk parametresi verilmek zorundad ır. ParamArray ile tan ımlı olan dizi, yordam ça ğırılırken girilen tüm parametreleri tutar. Fakat girilen bu parametrelerin veri tipleri ayn ı olmak zorundadır. Bu ör-nekte girilecek yaşlar Byte tipinde olacaktır. 180 Modül 7: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' İlk parametre verildikten sonra, ' istenen sayıda parametre verilebilir YasOrtalamasi("YU6112", 45, 14, 25, 28) ' Ya şlar parametre olarak verilmeyebilir YasOrtalamasi("YU6112") End Sub Parametrelerin sınırl ı olmaması, dizilere eleman ekleme işlemini kolayla ştırır. Örneğin, bir diziye birçok eleman eklemek için, bu elemanlar ın bir dizi içinde parametre olarak verilmesi gerekir. Dim Raf() As String Sub KitapEkle(ByVal Kitap() As String) ' Raf dizisine, kitaplar dizisinin ' elemanları eklenir. End Sub Bu yordam ın kullanımı için, eklenecek değerlerin önce bir diziye aktar ılması gerekir. Yordamın yazılması kolay, ancak kullanımı zordur. Bu yordam ı kullana-cak olan programc ının i şi ParamArray ile kolayla ştırılır. Sub Mesaj(ByVal msg As String) Label1.Text &= msg & vbCrLf End Sub Dim Raf() As String = {} Sub KitapEkle(ByVal Kitap As String, Optional ByVal Genisletme As Byte = 1) If Genisletme = 0 Then Mesaj("Dizi boyutu genişletilemedi...") Return End If ' Genişletme faktörü kullanıcıya bırak ıldığı için ' dizide boş alanlar olabilir. İlk boş alan bulunup ' veri buraya aktar ılır. Dim i As Integer While i < Raf.Length If Raf(i) = "" Then Raf(i) = Kitap Exit Sub End If Fonksiyonlar ve Yordamlar 181 i += 1 End While ' Dizide boş yer yoksa yeniden boyutland ırılır. ReDim Preserve Raf(i + Genisletme) Raf(i + 1) = Kitap End Sub Önce, diziye bir tek eleman ekleyen yordam yazılır. Dizinin tüm alanlar ı do-luysa, geni şletme parametresinde verilen değer kadar tekrar boyutlandırılır. Genişletme de ğişkeni Byte veri tipinde tan ımlı olduğu için negatif de ğer ala-maz. Dolayısıyla, dizinin boyutunun küçültülmesi engellenmiş olur. Bu yordam tek başına kullan ılabildi ği gibi, diziye birçok eleman ekleyecek yor-dama yardımcı olarak da kullan ılabilir. Sub Ekle(ByVal ParamArray Kitaplar() As String) For i As Integer = 0 To Kitaplar.Length - 1 ' Genişletme faktörü 5 ile tek tek kitap eklenir. KitapEkle(Kitaplar(i), 5) Next Mesaj(Kitaplar.Length & " kitap rafa eklendi.") End Sub Bu yordam ise s ınırs ız parametre alarak, dizi işlemlerinde programc ıya kolayl ık sağlar. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Ekle("Kitap1", "Kitap2", "Kitap3") End Sub 182 Modül 7: Sub Main Yeni bir yordam tanımlarken Main yordam ı hariç istenen isim verilebilir. Main yordamı bütün uygulamaların giriş noktasıdır. Windows uygulamalarında form-lar yüklenmeden önce o form içinde tan ımlı Main yordam ı çal ıştırılır. Bu Main yordamında Application sınıfı ba şlang ıç formunu Run metodu ile yükler. Application s ınıfı, .NET Framework’te, uygulamalar ı ba şlatmak, yönetmek ve sonland ırmak için kullan ılır. Projenin özelliklerinden başlang ıç nesnesi Sub Main olarak ayarlanırsa, uygu-lama çal ıştığı zaman tüm projede Main yordam ını arar. Windows uygulamalar ı geliştirilirken Main yordam ı yaz ılırsa ba şlang ıç formunun da bu yordam içinde belirtilmesi gerekir. Bu yordam bir modülün içinde tan ımlanabilir. Module Module1 Sub Main() Application.Run(New Form1) End Sub End Module Application s ınıfının Run metodu, parametre olarak ba şlang ıç formunu ister. Uygulama ba şlad ığı zaman hangi formun çal ışması isteniyorsa, bu formdan oluşturulup parametre olarak verilir. New anahtar kelimesi, sınıflar ı olu şturmak için kullanılır. Fonksiyonlar ve Yordamlar 183 RESİM 7.2: Run metodu. Başlang ıç formu olarak seçilen bir Windows formunda Main yordam ı tan ımla-nırsa, bu yordam Shared olarak tan ımlanmalıdır. Shared metotlar uygulama genelinde payla ştırılan sabit metotlard ır. Shared Sub Main() MsgBox("Başlangıç formları kod ile yüklenmelidir.") End Sub Başlang ıç formu olarak ayarlanmış bir formun içine bu Main yordam ı tan ımla-nırsa, formu yüklemek için herhangi bir kod yazılmadığı için uygulama sadece mesaj kutusunu gösterecektir. 184 Modül 7: Konu 2: 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 çar-pımı olacaktır. Fonksiyonların tanımlar ı de ğişkenler gibidir. Function Fonksiyon(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 KontrolOk() 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 KontrolOk() Then MsgBox("Seçiminizi yaptıktan sonra devam edebilirsiniz.") Exit Sub Fonksiyonlar ve Yordamlar 185 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 ko-dun çalıştırılmamas ıdır. E ğer dönüş de ğerini belirledikten sonra başka bir i şle-min 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 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ı, kont-rol yap ılan kodlar çal ıştırılmadan fonksiyondan ç ıkılacakt ı. 186 Modül 7: 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 giril-mesi 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 Fonksiyonlar ve Yordamlar 187 Fonksiyonlar ın ve Yordamlar ın A şırı Yüklenmesi Fonksiyon ve yordamları kullan ırken, ayn ı isimde birden fazla kez tan ımlanabil-dikleri görülür. Buna Aşırı Yükleme (OverLoad) denir. Bir yordamın ve fonksiyo-nun aşırı yüklenmesi kullan ımını kolaylaştırır. Ayn ı isimde farkl ı seçenekler sun-ması, metotlar ın kullanışlılığını art ırır. Sub UrunAra(ByVal UrunId As Integer) ' Ürün numaras ına göre arama yapılır. End Sub Function UrunAra(ByVal UrunIsmi As String) As Integer ' Ürün ismine göre arama yapılır. ' Bulunan ürünün numaras ı döndürülür. End Function Function UrunAra(ByVal UrunIsmi As String, ByVal UretimTarihi As Date) As Integer ' Ürün ismine ve üretim tarihine göre arama yapılır. ' Bulunan ürünün numaras ı döndürülür. End Function Function UrunAra(ByVal UretimTarihi As Date) As Integer ' Üretim tarihine göre arama yapılır. ' Bulunan ürünün numaras ı döndürülür. End Function 188 Modül 7: Aynı isimdeki metotlar ın ayrımı, parametrelerin veri tipi ve say ısına göre yapılır. Metotların isimleri, parametre sayısı ve parametrelerin veri tipleri metotlar ın im-zalarını (Method Signatures) olu şturur. Örne ğin, ürün numarasına göre arama yapan yordamın imzası UrunAra(Integer) şeklindedir. Integer parametre alan, UrunAra isminde başka bir yordam veya fonksiyon tanımlanamaz (Re-sim 7.3). Fonksiyonların dönü ş tipleri ile imzalar ı tan ımlanmaz. RESİM 7.3: Hatalı tan ımlama. Metotları a şırı yüklerken dikkat edilmesi gereken bazı noktalar vard ır. ? İmzalar ı ayn ı olan metotlar tanımlanamaz. ? Fonksiyonlar yordamlarla, yordamlar da fonksiyonlarla aşırı yüklenebi-lir. ? Fonksiyonlar dönü ş tiplerine göre a şırı yüklenemez. Fonksiyonlar ve Yordamlar 189 Konu 3: String Fonksiyonları String fonksiyonları, kullan ıld ığı String de ğeri üstünde verilen parametrelere göre değişen i şlemler yaparlar. Sonuç olarak geriye döndürdükleri de ğerler, fonksiyonun i şleyi ş amac ına göre değişir. ? CompareTo. Bu fonksiyon, i şlemin yapılaca ğı de ğeri parametre olarak verilen değerle karşıla ştırır. İki değer bir birine e şitse 0, parametredeki değer alfabetik olarak önde ise 1, değilse -1 de ğeri döndürülür. Dim yazi1 As String = "BilgeAdam" Dim yazi2 As String = InputBox("Yaz ı giriniz.") Select Case yazi1.CompareTo(yazi2) Case 0 MsgBox("Yazılar birbirine eşit") Case 1 MsgBox(yazi1 & ", " & yazi2 & " kelimesinden sonra geliyor") Case -1 MsgBox(yazi1 & ", " & yazi2 & " kelimesinden önce geliyor") End Select ? Concat. String de ğerlerini birleştirmek için kullan ılır. Parametre tipi ParamArray olduğu için, sınırs ız String de ğişkeni birle ştirilebilir. 190 Modül 7: Dim kurum As String = "BilgeAdam" Label1.Text = String.Concat("Kurum: ", kurum, "Şubeler: ", vbCrLf, "Fatih", "Bakırköy", "Kadıköy", "Beşiktaş", "Town Center") ? CopyTo. Bu fonksiyon ile bir String de ğişkenin belli bir kısmı, bir karak-ter dizisine kopyalan ır. Ayrıca kopyalanacak dizinin hangi indisten itiba-ren ba şlanaca ğı da belirtilir. Dim yazi As String = "BilgeAdam" Dim Karakterler(10) As Char ' Yazının 5. karakterinden itibaren al ınan 4 karakter, ' karakterler dizisinin 3. indisinden ba şlanarak ' diziye kopyalanır. yazi.CopyTo(5, Karakterler, 3, 4) ' Karakterler dizisinin son hali: ' _ _ _ A d a m _ _ _ _ Burada dikkat edilmesi gereken nokta, karakterlerin kopyalanaca ğı dizi-nin büyüklü ğünün yeterli olup olmad ığıdır. Dizinin kopyalanmaya başla-nacak indisi ile kopyalanacak karakterlerin uzunluğunun toplamı, dizi büyüklüğünden küçük olmal ıdır ? EndsWith & StartsWith . Bu fonksiyonlar, String de ğişkeninin, parametrede verilen String de ğeriyle ba şlad ığını ya da bitti ğini göste-rir. Geriye dönü ş de ğeri Boolean tipindedir. degisken.EndsWith(deger As String) As Boolean degisken.StartsWith(deger As String) As Boolean Dim HtmlTag As String = "" If HtmlTag.StartsWith("<") And HtmlTag.EndsWith(">") Then MsgBox("Yazım doğru") End If ? ToUpper & ToLower. ToUpper, String de ğişkenin içindeki küçük karakterleri büyü ğe; ToLower, büyük karakterleri küçüğe çevirir. Dim yazi As String = "bilgeADAM" MsgBox(yazi.ToUpper()) ' Sonuç: BİLGEADAM MsgBox(yazi.ToLower) ' Sonuç: bilgeadam Fonksiyonlar ve Yordamlar 191 ? Join. Bir String dizisindeki elemanlar ı, parametre olarak verilen ayraç karakteri ile birle ştirerek tek bir String de ğişkeni döndürür. Dim yazi() As String = {"İsim", "Soyad", "Adres", "Email", "Telefon"} MsgBox(String.Join(";", yazi)) ' Sonuç: İsim;Soyad;Adres;Email;Telefon ? SubString. Verilen bir String de ğerinin, bir bölümünü String olarak döndüren fonksiyondur. İstenen karakterlerin hangi indisten başlaya-cağı parametre olarak geçilir. Bu durumda, ba şlang ıç karakterinden sona kadar okunur. Ancak fonksiyonun, kaç karakter okunaca ğını belir-ten bir parametre kabul eden a şırı yüklemesi de vard ır. Dim yazi As String = "BilgeAdam" MsgBox(yazi.Substring(5)) ' Sonuç : Adam MsgBox(yazi.Substring(5, 2)) ' Sonuç : Ad ? Trim, TrimEnd, TrimStart. Trim fonksiyonu, parametre olarak verilen bir karakteri, String de ğişkeninin başından ve sonundan kald ırır. TrimEnd fonksiyonu parametrede verilen karakteri String de ğişkeninin sadece sonundan, TrimStart ise sadece başından kaldırır. Dim yazi As String = "--------Merhaba-------- MsgBox(yazi.Trim("-")) ' Sonuç: Merhaba MsgBox(yazi.TrimEnd("-")) ' Sonuç: --------Merhaba MsgBox(yazi.TrimStart("-")) ' Sonuç: Merhaba-------- 192 Modül 7: Konu 4: Matematiksel Fonksiyonlar Uygulamalarda ço ğu zaman matematiksel hesaplamalara ihtiyaç duyulur. Bu hesaplamalar ı kolaylaştıran hazır matematik fonksiyonları vardır. Bu fonksiyon-lar .NET Framework’te System.Math ad uzayının (namespace) içinde tan ımlanm ıştır. ? Abs . Verilen bir sayının mutlak de ğerini döndürür. Dönen değer her du-rumda pozitif olacakt ır. Math.Abs(-123) ' Sonuç: 123 ? Ceiling & Floor . Ceiling fonksiyonu, Double veri tipinde verilen bir sayıdan büyük, en küçük tamsayıyı verir. Floor fonksiyonu verilen sayıdan küçük, en büyük tamsay ıyı verir. Math.Ceiling(-12.231231) ' Sonuç: -12 Math.Ceiling(12.231231) ' Sonuç: 13 Math.Floor(-12.231231) ' Sonuç: -13 Math.Floor(12.231231) ' Sonuç: 12 Fonksiyonlar ve Yordamlar 193 ? Cos , Sin , Tan . Bu fonksiyonlar temel trigonometrik i şlemleri gerçekle şti-rir. Cos fonksiyonu verilen derecenin kosinüsünü, Sin say ının sinüsünü ve Tan say ının tanjant ını hesaplar. Parametre olarak verilen derece radyan (360 derece) de ğeri olarak kabul edilir. Dim Derece As Double =90 Math.Cos(Math.PI * Derece / 180) Math.Sin(Math.PI * Derece / 180) Math.Tan(Math.PI * Derece / 180) ? Exp . Bu fonksiyon, e sabitinin değerinin (yaklaşık 2,718281 değerinin), parametrede verilen sayı ile üssünü al ır. Math.Exp(4) ' Sonuç yakla şık: 54,59815 ? Log . Logaritmik hesaplamalar için kullanılan bir fonksiyondur. Taban pa-rametresi verilmezse say ının e taban ında logaritmasını al ır. Math.Log(1000, 10) ' Sonuç: 3 Math.Log(Math.E) ' Sonuç: 1 ? Max & Min . Max fonksiyonu verilen iki sayıyı kar şıla ştırarak büyük olanı, Min fonksiyonu ise say ılardan küçük olan ı döndürür. Math.Max(100, 200) ' Sonuç: 200 Math.Min(100, 200) ' Sonuç: 100 ? Pow . İlk parametrede verilen bir say ının, ikinci parametredeki de ğer kadar üssünü alır. Math.Pow(10,3) ' Sonuç: 1000 ? Sqrt. Verilen say ının karekökünü hesaplar. Math.Sqrt(441) ' Sonuç: 21 194 Modül 7: Konu 5: Tarih ve Zaman Fonksiyonları Tarih ve zaman fonksiyonlar ı Date veri tipi üzerinde hesaplamalar yapan fonksiyonlard ır. Bu fonksiyonlar System.DateTime ad uzay ında tanımlıdır. Ay-rıca Microsoft.VisualBasic altında tanımlı DateAdd ve DateDiff fonksiyon-ları da vard ır. ? DateAdd. Bu fonksiyon verilen bir zamana belli bir tarih veya zaman aral ığı eklemek için kullan ılır. Dönüş de ğeri, hesaplanan Date tipinde bir değer olacaktır. Function DateAdd(ByVal Aralik As DateInterval, _ ByVal Sayi As Double, _ ByVal Zaman As DateTime _ ) As DateTime Fonksiyonun aldığı ilk parametre DateInterval tipinde bir zaman aral ığıdır. Bu değerler a şağıdaki tiplerde olabilir: ? Day . Gün (1 – 31) ? DayOfYear. Gün (1 – 366) ? Hour. Saat (1 – 24) ? Minute. Dakika (1 – 60) ? Month . Ay (1 – 12) ? Quarter. Çeyrek y ıl (1 – 4) ? Second. Saniye (1 – 60) ? WeekDay. Gün (1 – 7) Fonksiyonlar ve Yordamlar 195 ? WeekOfYear . Hafta (1 – 53) ? Year. Y ıl Zaman parametresine işlem yap ılacak tarih, Sayi parametresine de eklenecek de ğer girilir. Do Dim baslangic As Date = Now Dim tahmin As Integer tahmin = InputBox("3 saniye içinde bir sayı girin") If Now > DateAdd(DateInterval.Second, 3, baslangic) Then MsgBox("Süreniz Doldu") Exit Do End If ' Oyun kodları... Loop ? DateDiff. Bu fonksiyon verilen iki tarihin aras ındaki kalan süreyi hesaplar. Bu süre DateInterval tipinde parametre olarak verilir. Function DateDiff( _ ByVal Aralik As DateInterval, _ ByVal Zaman1 As DateTime, _ ByVal Zaman2 As DateTime ) As Long Zaman aralığının hesaplanması, ikinci zaman değerinden ilkinin çıkarıl-ması ile gerçekle şir: Zaman2 – Zaman1 Sub DogumGununeKalan(ByVal dogumGunu As Date, Optional ByVal aralik As DateInterval = DateInterval.Day) ' Verilen doğum gününün senesi, ' içinde bulunan sene ile değiştirilir. dogumGunu = DateAdd(DateInterval.Year, Now.Year - dogumGunu.Year, dogumGunu) Dim kalan As Long kalan = DateDiff(aralik, dogumGunu, Now.Date) Dim mesaj As String = "Doğumgününüz " & Math.Abs(kalan) & " " & aralik.ToString() If kalan > 0 Then mesaj &= " geçmiş" 196 Modül 7: ElseIf kalan < 0 Then mesaj &= " sonra" Else mesaj = "Doğumgününüz bu " & aralik.ToString() & " içinde" End If MsgBox(mesaj) End Sub Bu örnek, verilen bir do ğum gününe kalan zaman aral ığını hesaplar. Zaman aral ığı varsayılan de ğeri Day olan opsiyonel bir parametre ola-rak verilir. DateDiff fonksiyonu iki tarih arasındaki zaman aralığını he-saplar. Bu örnekte istenen, doğum gününe kalan zamand ır. Dolayısıyla doğum gününün yılı önemli de ğildir. Bu de ğer içinde bulunan y ıl de ğeri ile de ğiştirildi ğinde, bu sene içinde kalan gün hesaplanabilir. ? CompareTo. String ifadelerinde olduğu gibi, tarih ve zaman de ğerleri üzerinde de karşıla ştırma yap ılabilir. CompareTo fonksiyonu, i şlem yap ı-lan tarih ile parametre olarak verilen tarihi kar şıla ştırır. Parametredeki tarih küçükse 1, büyükse -1 veya e şitse 0 döndürür. Dim d As Date = #03/23/2002# MsgBox(d.CompareTo(Now)) ? DaysInMonth. İlk parametrede verilen y ılın, ikinci parametrede verilen ayında kaç gün olduğunu döndürür. Date.DaysInMonth(2002, 2) ' Sonuç: 28 ? IsLeapYear . Verilen bir y ılın art ık yıl olup olmad ığını hesaplar. Dönü ş değeri True ya da False olabilir. Date.IsLeapYear(1200)) ' Sonuç: True ? Parse . Parametrede verilen String bir ifadeden Date veri tipine çevrim işlemini yapar. String ifadesinde verilen ifadenin do ğru bir tarih ve za-man tipinde olması gerekir. Date.Parse("23.04.2005 20:20:00") Date.Parse("22 July 2005 02:00 PM") Date.Parse("18 Haziran 1980") Fonksiyonlar ve Yordamlar 197 İngilizce’den farkl ı bir dilde girilen ay isimlerinin tarih tipine çevrilmesi için, uygulaman ın kültürünün o dilde ayarlanması gerekir. ' Uygulama kültürü Fransızca yapılır. Application.CurrentCulture = New Globalization.CultureInfo( "fr-FR") ' temps değişkeninin de ğeri 23/05/2005 olacaktır. Dim temps As Date = Date.Parse("23 Mai 2005") ' Bu kod hata verecektir. Dim zaman As Date = Date.Parse("23 Mayıs 2005") ? ToLongDateString & ToLongTimeString. Verilen tarihi uzun tarih ve zaman format ında gösteren fonksiyonlardır. Dim d As Date = #1/29/2005 12:59:22 PM# d.ToLongDateString() ' Sonuç: 29 Ocak 2005 Cumartesi d.ToLongTimeString() ' Sonuç: 12:59:22 ? ToShortDateString & ToShortTimeString . Verilen tarihi kısa tarih ve zaman format ında gösteren fonksiyonlardır. Dim d As Date = #1/29/2005 12:59:22 PM# d.ToShortateString() ' Sonuç: 29 Ocak 2005 d.ToShortTimeString() ' Sonuç: 12:59 198 Modül 7: Konu 6: Offline ve Online Yard ımın Etkin Kullanımı Visual Basic.NET dilinde uygulama geliştirirken .NET Framework içinde tan ımlı bir çok nesnenin fonksiyon ve yordamları kullan ılır. Ancak her yordam ve fonksiyonun ald ığı parametrelerin ve ne işe yaradıklar ının ezbere bilinmesi mümkün de ğildir. Modül 3’teki Help Kullanımı bölümünde MSDN offline yardımının kullanılmasından ve öneminden bahsedilmişti. MSDN kütüphanelerinin Visual Studio içine kurulmaması durumunda online yardım araçları kullan ılabilir. Vis-ual Studio, ba şlang ıç sayfas ının Online Resources sekmesinde birçok arama kolaylığı sunar. Fonksiyonlar ve Yordamlar 199 Offline Yardım Uygulama geliştirirken, kodlar ın yazılmasında IntelliSense arac ından büyük öl-çüde faydalanır. IntelliSense, bir kodun yaz ılması s ıras ında açıld ığı zaman, yazılan kodlarla başlayan tüm metot, özellik ve nesneleri programc ıya sunar. O anda üzerinde bulunulan öğenin açıklaması, ald ığı parametreler gibi bilgileri de gösterir. RESİM 7.4: IntelliSense. Visual Studio içinde MSDN kütüphanelerinde istenen konular ın aranmas ı için Index, Search, Contents ve Dynamic Help panelleri kullan ılır. Sonuç bulunduğu zaman yeni bir çal ışma sayfasında gösterilir. Bu sayfada aranan kavram ile il-gili detayl ı bilgiler ve örnekler mevcuttur. Örnek: String veri tiplerinin değişik formatlarda yazd ırılması için String.Format fonksiyonu kullan ılır. 200 Modül 7: 1. Visual Studio ortamında bir proje aç ın ve kod sayfas ında String.Format yaz ın. Fonksiyonu yazdıktan sonra parantezi açın ve IntelliSense arac ının çıkard ığı menüyü inceleyin. Fonksiyon kaç parametre alabiliyor? Aşağı ve yukarı oklarla menü içinde ilerleyerek fonksiyonun aşırı yüklenmi ş durumlar ını inceleyin. Fonksiyonun kaç tane a şırı yüklemesi yazılmış? 2. Format yaz ısının üstüne geldikten sonra F1 tuşuna basın ve dinamik yard ımın açtığı sayfaya bakın. Bu sayfa fonksiyonun tüm aşırı yüklemelerini gösterir. 3. Parametre olarak String ve ParamArray Object alan fonksiyonu tıklay ın. Ç ıkan sayfa fonksiyonun detaylar ını listeler. ? İlk olarak fonksiyonun söz dizimi verilmiştir. Burada parametre isim-leri ve tipleri üzerinde bağlant ılar görünür. Bu ba ğlant ılar ile ilgili yar-dım dosyası açılır. ? Parameters bölümünde bu fonksiyonun ald ığı parametrelerin tipleri ve kullan ım amaçlarını gösterilir. ? Return Value fonksiyonun dönüş de ğerinin hangi tipte olduğu ve nasıl olu ştu ğu gösterilir. ? Exceptions bölümünde bu fonksiyon kullanılırken meydana gelebilecek hatalar listelenir. ? Remarks bölümü, fonksiyonun kullanım yerleri, parametrelerin na-sıl kullan ılaca ğı, parametreler kullan ılırken dikkat edilmesi gereken yerler, ba ğlant ılı konular gibi fonksiyon hakk ında detaylı bilgiler ve-rir. ? Example bölümünde, fonksiyonun kullan ımına örnekler verilir. ? Requirements bölümünde, fonksiyonun çalışabilmesi için gereken araçlar ve platformlar listelenir. ? See Also bölümü, fonksiyon ile ilişkili kavramlara bağlant ılar sunar. Remark bölümündeki tanımlamalardan ve Examples bölümündeki örneklerden yararlanarak, fonksiyonun nas ıl kullan ıld ığını inceleyin. 4. Kod sayfan ıza geçin ve String.Format fonksiyona bir örnek yaz ın. Dim ocak As Integer = 1000 Dim subat As Integer = 1100 MsgBox(String.Format("Ocak ayı maaşı {0:C} -- Şubat ayı maa şı: {1:c}", ocak, subat)) 5. Formatlama işlemleri hakkında daha fazla bilgi almak için, fonksiyonun yard ım sayfasına gelin ve Remarks bölümünde Formatting Types Fonksiyonlar ve Yordamlar 201 bağlant ısını t ıklay ın ya da Index panelinde Formatting Types yaz ın ve yard ım sayfasını açın. Çıkan sayfada her veri tipi için kullanılan formatlama seçenekleri vard ır. Numeric Format Strings ba ğlant ısını t ıklad ıktan sonra aç ılan sayfada NumberFormatInfo bağlant ısını t ıklay ın. Format Character tablosunda de ğişik formatlama seçeneklerini incele-yin ve kodunuzda deneyin. 6. Web araç çubuğundan Geri düğmesini tıklayarak veya ALT+Sola Ok kısayolu ile String.Format Method ba şlıkl ı ilk açt ığınız sayfaya dö-nün. 7. Parametre olarak IFormatProvider, String ve ParamArray Object alan fonksiyon tan ımını t ıklay ın. Fonksiyonun kullanımını inceledikten sonra bu kullanıma bir örnek yaz ın. MsgBox(String.Format(New Globalization.CultureInfo("it-IT"), "Bugün: {0:dddd MM yyyy}", Now)) 8. Bu örnekte uygulamanın kültür ayarları de ğiştirilmeden, tarihin istenen kültür ayar ı ile gösterilmi ştir. Kültür ayarlarının tanımlanmas ını incele-mek için Index yardım panelinde CultureInfo yazın ve About CultureInfo Class indeksini seçin. Çıkan Index Result penceresinde CultureInfo Class indeksini seçin. 9. Bu sayfada çıkan kültür isimlerini örneğinizde kullanarak de ğişik sonuç-ları inceleyin. NOT Türkçe dil ailesi için Globalization.CultureInfo( "TR-tr ") kullan ılır 202 Modül 7: Online Yardım MSDN kütüphanelerinden offline olarak yardım almak hızl ı ve etkili bir yöntem-dir. Ancak bu yard ım dosyalarının güncellenmesi için MSDN sürümünün yeni-lenmesi gerekir. Online yard ım, MSDN kütüphanelerinin Internet ortamında ya-yınlanmas ıdır. Yeni örnekler, makaleler ve düzeltmelerle güncellenen bu yar-dım dosyalarına MSDN adresinden ulaşılabileceği gibi, Visual Studio ortamından da bu dosyalar içinde arama yap ılabilir. Örnek: Windows uygulamasında kullan ılan bir metin kutusunda “Geri Al” (Undo) i şlemi yap ılmak isteniyor, fakat fazladan kod yazılmak istenmiyor. Bu-nun için .NET Framework’te haz ır bir metodun olup olmad ığı kontrol edilmesi gerekir. Online yard ım ile gerekli arama yap ıld ıktan sonra ç ıkan sonuçlar yorumlan ır. 1. Başlang ıç sayfas ını (Start Page) aç ın ve Online Resources sekmesine gelin. 2. Sol paneldeki menüden Search Online menüsüne gelin ve Search For alt ındaki metin kutusuna “TextBox Undo” yaz ın. Sonuçların MSDN Online içinde hangi duruma göre filtrelenebildiğini gösteren ba ğlant ılar çıkar. Sonuçlar; ? Tüm MSDN içinde, ? MSDN kod ve karşıdan yüklemelerde, ? MSDN teknik makalelerinde, ? Microsoft bilgi veri kaynağında, ? Microsoft.com genelinde filtrelenebilir. Fonksiyonlar ve Yordamlar 203 3. Search results for All of MSDN bağlant ısını t ıklay ın ve ç ıkan sonuçları inceleyin. Aranan kayna ğın .NET Framework içinde kullanılabilmesi istendi ği için TextBoxBase.Undo Method (.NET Framework) yard ım ko-nusunu t ıklay ın. 4. MSDN Online kütüphanelerinin sayfa düzeni ve içeriği offline yardım ile aynıdır. TextBoxBase taban s ınıfının Undo metodunu inceleyen bu yar-dım sayfasında, metot tan ımlaması, Remarks, Examples, Require-ments ve See Also bölümleri görülür. Examples bölümünde Visual Ba-sic kodlar ının alt ında Undo metodunun kullan ımını inceleyin. 5. Undo yapıld ıktan sonra silinen kelimelerin bir listede tutulmas ı ve lis-teye ekleme i şleminin kolay bir şekilde yapılması isteniyor. Bunun için Sol panelde bulunan menülerin üstündeki Search For metin kutusuna “ArrayList” yazın ve çıkan sonuçlardaki ilk bağlant ıyı t ıklay ın. 6. ArrayList sınıfının Count ve Item özelliklerini ve Add metodunu inceleyin Uygulamanızı tamamlamak için bu özellikleri kodunuzda kullanın. Dim silinenler As New ArrayList Sub GeriAl() ' Metin kutusunda geri alınacak bir veri varsa If TextBox1.CanUndo Then ' Eski değerler listeye eklenir. silinenler.Add(TextBox1.Text) TextBox1.Undo() GeriAlinanKelimeler() End If End Sub ' Listeleme i şlemini yapan yordam Sub GeriAlinanKelimeler() ListBox1.Items.Clear() For i As Integer = 0 To silinenler.Count - 1 ' i indisli Item, liste kutusuna eklenir. ListBox1.Items.Add(silinenler.Item(i)) Next End Sub 204 Modül 7: Lab 1: Kelime Oyunu Bu uygulamadaki oyun, girilen bi r kelimenin son harfleriyle başlayan ba şka bir kelimenin girilmesidir. Oyunun seviyesi, girilecek kelimenin kontrol edilecek harf sayısıdır. Örne ğin, ikinci seviyede ilk girilen kelime “Masa” ise, bir sonraki kelime “sa” ile başlamal ıdır. Üçüncü seviyede bu kelime “asa” ile başlamal ıdır. Kullanıcı, oyuna ilk seviyeden ba şlar ve be ş kelime bildiği zaman bir sonraki seviyeye geçer. Toplam al ınan puan, bilinen kelime say ısının seviye kadar kuv-veti alınarak hesaplanır. Projenin Açılmas ı 1. KelimeOyunu isminde bir Window projesi aç ın ve forma listedeki kontrolleri ekleyin. ? btnBasla ve btnGiris isminde iki Button ? txtKelime isminde bir TextBox ? lblMesaj isminde bir Label ? tmrSure isminde bir Timer 2. Projenizin kod sayfas ına geçin ve uygulama boyunca kullan ılacak glo-bal de ğişkenleri tanımlayın. ' Kontrol edilecek kelime Dim kelime As String ' Oyunun seviyesi Dim OyunSeviyesi As Byte = 1 ' Timer kontrolünde kullanılacak süre Dim kalanSure As Integer = 5 ' Bilinen kelime sayısı Dim tekrar As Integer = 0 3. Uygulamaya giriş Sub Main yordam ından yapılır. Bu yordamda kullanıcıdan, formun başlığında görüntülenecek bir kullanıcı ad ı istenir. Eğer kullanıcı ad ı bo ş girilirse form yüklenmeden uygulamadan ç ıkılır. ' Uygulamanın giriş noktası Shared Sub Main() Dim KullaniciAdi As String KullaniciAdi = InputBox("Kullan ıcı Ad ı girin:") If KullaniciAdi = "" Then Exit Sub Fonksiyonlar ve Yordamlar 205 End If ' Form yükleniyor Dim oyun As New Form1 oyun.Text = KullaniciAdi & " yarışıyor" oyun.ShowDialog() End Sub Yardımcı Yordam ve Fonksiyonlar Uygulaman ın tamam ında kullanılacak kodlar yordam ve fonksiyonlar halinde yazılarak hem yönetilmesi hem de kullan ılabilirli ği artırılır. Uygulamada kullanılacak yordam ve fonksiyonlar Tablo 7.1’de listelenmi ştir. TABLO 7.1: Kelime Oyunu Uygulaması Yordam ve Fonksiyonlar ı İsim Parametreler İşlev Temizle Zamanı s ıfırlar ve TextBox kontrolüne Focus verir OyunuBaslat Başlangıç kelimesi al ınarak Timer ba şlatılır. OyunuBitir Optional String neden Süreyi durdurur, puanı ve bitiş nedeni kullan ıcıya gösterir. Bilgi String mesaj Label kontrolünde mesaj görüntülenir. SonrakiKelimeBilgi Girilecek kelimenin hangi harflerle başlayaca ğını gösterir. SeviyeAtla Byte seviye Oyunun seviyesini artırır. Kontrol String kelime1, String kelime2 İkinci kelimenin, ilk kelime-nin harfleriyle ba şlad ığının kontrolü yap ılır. PuanHesapla Byte seviye, Short tekrar Tekrar değerinin, seviye kadar üssü alınır. 1. Yordamları ve fonksiyonlar ı yaz ın. ? Temizle yordam ı Sub Temizle() kalanSure = 5 txtKelime.Text = "" txtKelime.Focus() End Sub 206 Modül 7: ? OyunuBaslat yordam ı Sub OyunuBaslat() Temizle() kelime = InputBox("Oyunun başlangıç kelimesini girin") tmrSure.Start() SonrakiKelimeBilgi() End Sub ? OyunuBitir yordam ı Sub OyunuBitir(Optional ByVal neden As String = "") tmrSure.Stop() Bilgi(neden) Temizle() Dim puan As Integer puan = PuanHesapla(OyunSeviyesi, tekrar) MsgBox("Puanınız: " & puan) End Sub ? Bilgi yordam ı Sub Bilgi(ByVal kelime As String) lblMesaj.Text = kelime End Sub ? SonrakiKelimeBilgi yordam ı Sub SonrakiKelimeBilgi() Dim mesaj As String mesaj &= Microsoft.VisualBasic.Right(kelime, OyunSeviyesi) mesaj &= " ile başlayan bir kelime girin" Bilgi(mesaj) End Sub ? SeviyeAtla yordam ı Sub SeviyeAtla(ByVal seviye As Byte) OyunSeviyesi = seviye OyunuBitir(seviye & ". seviyeye geçildi") Fonksiyonlar ve Yordamlar 207 SonrakiKelimeBilgi() End Sub ? Kontrol fonksiyonu Function Kontrol(ByVal kelime1 As String, ByVal kelime2 As String) As Boolean ' İkinci kelimenin ba şında oyun seviyesi kadar ' karakter alınır. Dim bas As String = kelime2.Substring(0, OyunSeviyesi) ' İkinci kelime, ilk kelimenin sonu ile başlıyorsa ' do ğru girilmiştir. True değeri döner. Return kelime1.EndsWith(bas) End Function ? PuanHesapla yordam ı Function PuanHesapla(ByVal seviye As Byte, ByVal tekrar As Short) As Integer Return Math.Pow(tekrar, seviye) End Function Olayların Yaz ılmas ı 1. tmrSure kontrolünün Tick olayına kalan süreyi kontrol eden kodları yazın. Private Sub tmrSure_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrSure.Tick If kalanSure <= 0 Then OyunuBitir("Süreniz doldu") Else kalanSure -= 1 End If End Sub 2. btnBasla dü ğmesinin Click olay ına, oyunu başlatan yordam ı yaz ın Private Sub btnBasla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBasla.Click OyunuBaslat() End Sub 3. btnGiris dü ğmesinin Click olayına, girilen kelimeyi al ıp kontrolleri ya-pan kodu yaz ın. Burada dikkat edilmesi gereken nokta, tekrar sayısının seviye ile doğru orantılı olmas ıdır. 208 Modül 7: Private Sub btnGiris_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGiris.Click Dim girilen As String = txtKelime.Text If Not Kontrol(kelime, girilen) Then Dim neden As String neden = "Girilen kelime, ilk kelimenin son " neden &= OyunSeviyesi & " harfi ile başlam ıyor" OyunuBitir(neden) ElseIf tekrar > 5 * OyunSeviyesi Then SeviyeAtla(OyunSeviyesi + 1) Else tekrar += 1 kelime = girilen SonrakiKelimeBilgi() Temizle() End If End Sub Fonksiyonlar ve Yordamlar 209 Modül Sonu Soruları & Al ıştırmalar 1. Sub ile Function arasındaki fark nedir? 2. Main yordam ı formların ve modüllerin içinde nas ıl tan ımlanır? Kendi Main yordam ınızı yaz ın. 3. Yordam ve fonksiyonlar uygulamalarda kod tekrarını nas ıl önler? 4. Yordam ve fonksiyonlar ın s ınırs ız parametre almas ını sağlayan ParamArrays neden sonda tan ımlanır? 5. Farklı kültürlerde tarih, zaman, metin de ğerlerini göstermek için gerekli olan sınıflar ve fonksiyonlar nelerdir? 6. Yordam ya da fonksiyon içinden yordam ya da fonksiyonlar çağırılabilir mi? Uygulamasını yaz ın. 7. Bir yordam ya da fonksiyon kendisini (Recursive) çağırabilir mi? Uygulamas ını yaz ın. Modül 8: Veri Tipleri Üzerine İleri Bakış .NET içinde tanımlanabilen veri tipleri temel (primitive) veri tipleri ya da kullanıcının tanımladığı veri tipleridir. Temel veri tipleri .NET içinde tanımlanm ış ve baz ı önemli özellikleri olan tiplerdir. Örneğin 32 bitlik bir say ıyı temsil eden Int32 de ğer tipi temel bir tiptir. Bu temel tipin üzerinde aritmetik i şlemler yap ılabilir. Structure olarak tan ımlanan kullan ıcı veri tipleri üzerinde aritmetik işlemler yap ılamaz. Temel ve kullan ıcı tan ımlı veri tipleri, de ğer tipi ve referans tipi olarak ikiye ayrı-lır. Structure bir değer tipi, Class ise bir referans tipidir. Değer tipleri belleğin stack bölgesinde, referans tipleri heap bölgesinde depolanır. Değer tiplerinin oluşturulmas ı ve silinmesi, sadece de ğerleri üzerinde işlem yap ıld ığı için kolay-dır. Değer tipinin ömrü bitti ği zaman stack yap ısından hemen kaldırılır. Refe-rans tiplerinin olu şturulmas ı ve yok edilmesi ekstra bir performans gerektirir. Ancak iki veri tipinin de birbirlerine göre avantajları vardır. Bu modül tamamland ıktan sonra; ? Temel ve kullanıcı tan ımlı de ğer tiplerini tanıyacak, ? Temel ve kullanıcı tan ımlı referans tiplerini tan ıyacak, ? Veri tiplerinin belleği kullan ımı ö ğrenecek, ? ByVal ile ByRef arasındaki farkı ö ğrenecek, ? Referans ve değer tiplerinin nerede kullanılaca ğını ö ğreneceksiniz. 214 Modül 8: Konu 1: Değer Tipleri Değer tipindeki de ğişkenlerin tuttuklar ı de ğerler bellekte stack yap ısında bulu-nur. Bir değer tipindeki de ğişkenin, ba şka bir de ğişkene atanması, de ğerin ol-duğu gibi kopyalanması ile gerçekleşir. Dolay ısıyla ne zaman bir atama işlemi yap ılsa, de ğer tipinin bir kopyası bellekte oluşturulur. Bu durum çok karmaşık değerler ve büyük veri bloklar ı için performans ı dü şürür. Ancak değer tipleri, ta-nımlı olduğu yerden çıkıld ığında bellekten hemen silinir. Built-In Değer Tipleri Built-In değer tipleri olarak bahsedilecek temel tipler, .NET içinde tanımlı olan veri tipleridir. Bu de ğer tipleri sayıları, ondal ık sayıları, Boolean de ğerlerini, tarih ve zaman de ğerlerini ve karakterleri temsil eden yap ılard ır. Bu tipler, tüm .NET dilleri tarafından kullan ılabilir şekilde tanımlanır. Ancak Visual Basic dilinde bu değer tiplerine belirli isimlerle ula şılır (Tablo 8.1). Tablo 8.1: Built-In Değer Tipleri Visual Basic .NET Framework Değer Boolean System.Boolean True / False Byte System.Byte 8 bit uzunluğunda sayı Char System.Char 16 bit uzunluğunda Unicode karakter Date System.DateTime 64 bit uzunluğunda tarih zaman de ğeri Decimal System.Decimal 128 bit uzunlu ğunda sayı Double System.Double 64 bit uzunluğunda kayan tipte say ı Integer System.Int32 32 bit uzunluğunda sayı Veri Tipleri Üzerine İ leri Bak ış 215 Tablo 8.1: Built-In Değer Tipleri Visual Basic .NET Framework Değer Long System.Int64 64 bit uzunluğunda sayı Short System.Int16 16 bit uzunluğunda sayı Single System.Single 32 bit uzunluğunda kayan tipte say ı ' Visual Basic tan ımı de ğer tipi Dim sayi As Short = 10 ' .NET Framework tanımı de ğer tipi Dim sayi2 As Int32 = 10 Kullanıcı Tanımlı De ğer Tipleri Uygulamalarda çoğu zaman Built-in değer tiplerinin sa ğlamad ığı özel veri tiple-rine ihtiyaç duyulur. Örne ğin bir üçgen tipi, kenarlar ı temsil eden üç tane say ı tutan bir de ğer tipi olarak oluşturulabilir. Kullanıcı tan ımlı de ğer tipleri Visual Basic .NET dilinde Structure ile olu şturu-lur. Structure Ucgen Dim kenar1 As Integer Dim kenar2 As Integer Dim kenar3 As Integer Public Sub New(ByVal kenar_1 As Integer, ByVal kenar_2 As Integer, ByVal kenar_3 As Integer) Me.kenar1 = kenar_1 Me.kenar2 = kenar_2 Me.kenar3 = kenar_3 End Sub End Structure ? Structure tiplerinde en az bir veri tipi tan ımlı olmas ı gerekir. ? Structure tiplerinde bo ş parametreli constructor tan ımlanamaz. Değer tipleri tan ımlandıklar ında bu constructor ile olu şturulur. Ancak bir veya daha fazla parametre alan constructor metotları kullan ılabilir. ? Structure veri tipleri Class yap ısına benzer, ancak değer tipi olduklar ı için olu şturulmas ı ve yok edilmesi daha kolayd ır. 216 Modül 8: Konu 2: Referans Tipleri Referans tipindeki de ğerlere eri şimler, bu de ğerlerin bellekte olu şturuldu ğu ye-rin adresi ile sağlan ır. Bu değerler bellekteki heap bölgesinde olu şturulur. Refe-rans tipindeki değişkenlerin, ba şka değişkenlere atanması i şlemleri bellekteki adreslerin kopyalanması ile gerçekle şir. Dolay ısıyla, ayn ı adresteki veriyi gösterir. Bu iki değişkenden herhangi biri de ğişti ğinde, diğeri de de ğişmiş olur. Sınıf ve dizi yapıları referans tipleridir. Dizilerin tuttuklar ı de ğerlerin sayısı çoğu zaman önceden bellidir, ama boyutları ve uzunlukları de ğişebilir. Dolay ısıyla dizi de ğişkenlerinin ismi, elemanlar ının bellekte tutulduklar ı ilk yerin adresini temsil eder. Ancak dizilerin tuttuklar ı de ğerler referans tipinde olmayabilir. Built-In Referans Tipleri .NET içinde tan ımlı olan Class ve Array yap ıları Object s ınıfından türetilmi ştir. Object s ınıfı .NET içinde tan ımlı bir Built-In referans tipidir. De ğişkenler tanım-land ıklar ı s ırada tipleri belirtilmezse Object tipinde olu şturulur. Kullanıcı tarafından olu şturulan diziler, bir Array s ınıfından türetilir. Bu s ınıf, diziler üzerinde i şlemleri kolayla ştıracak birçok özellik ve metot tan ımlar. Örne-ğin Length özelli ği, dizinin toplam eleman say ısını verir, Sort metodu ise dizi-deki elemanların sıralanmas ı i şlemini yapar. Dolay ısıyla Array s ınıfı, diziler için Built-In referans tipi sağlar. ' Parametre olarak verilen dizinin başlangıç adresidir. ' Dolayısıyla, bu adres bölgesinde tan ımlı ' değerlere ulaşılabilir. Veri Tipleri Üzerine İ leri Bak ış 217 Sub Goruntule(ByVal dizi() As Integer) For i As Integer = 0 To dizi.Length - 1 Label1.Text &= dizi(i) Next End Sub Kullanıcı Tanımlı Referans Tipleri .NET içinde tan ımlı s ınıflar kullanılabildi ği gibi, birçok nesne yönelimli program-lama dilinde kullan ıcılar kendi s ınıflar ını da olu şturabilirler. .NET Framework’te, kullanıcıların oluşturduğu bu s ınıflar Object s ınıfından türetilir. Dolayısıyla bu sınıflar kullan ıcı tan ımlı referans tipleridir. ' Kullanıcı tanımlı referans tipi Public Class Class1 Public Deger As Integer End Class Sub Test() Dim sinif As New Class1 sinif.Deger = 10 Dim sinif2 As Class1 ' Sinif de ğişkeninin tuttu ğu adres bilgisi ' diğer değişkene aktarılır. Dolay ısıyla Sinif2 ' değişkeni de bellekte aynı yeri temsil eder. sinif2 = sinif ' Sinif de ğişkenin tuttuğu adres bölgesindeki ' değer değiştirilir. sinif.Deger = 15 ' Sinif2 değişkeni de aynı adresi gösterdiği için ' sonuç 15 olur. MsgBox(sinif2.Deger) End Sub 218 Modül 8: Konu 3: Organizasyon Yapısını İnceleme Structure ve Class nesnelerini olu ştururken, bu nesnelerin bilgilerini tutmak içn bellek alanında yer aç ılır. Aç ılan yer için, Structure veya Class içindeki veri tiplerinin boyutu kadar kaynak gerekir. Structure bir veri tipi oldu ğu için, tan ımlandığı anda veya parametre geçilirken belle ğin stack alan ında oluşturu-lur. Buna kar şın, Class nesnesi referans tipi olduğu için, ancak New anahtar kelimesi ile tanımlandığı zaman belle ğin heap alanında oluşturulur. Bu iki yapı-nın, değişik kullan ım alanlar ında birbirlerine göre avantajlar ı vardır. Veri Tipleri Üzerine İ leri Bak ış 219 Structure Organizasyon Yap ısı ve Belle ğin İncelenmesi Structure veri tipi, değer tipi oldu ğu için, tanımlandığı anda bellekte stack bölümünde oluşturulur. Bellekte ayr ılan yer, Structure içinde tan ımlı olan Built-In veri tiplerinin toplam boyutu kadardır. Visual Basic .NET dilinde Structure veri tipleri New anahtar kelimesiyle de oluşturulabilir. Ancak bu durumda constructor metotları parametre alacak şe-kilde tan ımlanmalıdır. Varsayılan parametresiz constructor metotlar ı CLR taraf ından i şlenir. Dikkat edilmesi gereken bir durum da, New ile olu şturulan de-ğişkenlerin yine bir de ğer tipi olması ve stack alanında tutulmasıdır. NOT Sınıflardan nesne olu ştururken New anahtar kelimesi kullan ılır, ancak bu nesne-ler heap alan ında tutulur. Public Structure Ogrenci Public adi As String Public soyadi As String Public Sub New(ByVal isim As String, ByVal soyisim As String) Me.adi = isim Me.soyadi = soyisim End Sub End Structure Sub Test() 220 Modül 8: ' 1 - Öğrenci de ğeri tanımlandığı sırada ' stack alanında yer ayrılır Dim Ali As Ogrenci ' 2 - New ile tanımlanan değişkenler de stack ' alanında oluşturulur. ' Farkı, bu değişkenin ba şlangıç değeri almasıdır. Dim Veli As New Ogrenci("Veli", "Mehmet") ' 3 - Parametre olarak sipariş nesnesinin ' adresi verilir Goruntule(Veli) End Sub Sub Goruntule(ByVal ogr As Ogrenci) MsgBox(ogr.adi & " " & ogr.soyadi) End Sub 1. Ali de ğişkeni tanımlanırken Stack yapısı Değişken Ali.soyadi Değer = "" Değişken Ali.adi Değer = "" Ali Ogrenci Veri Tipleri Üzerine İ leri Bak ış 221 2. Veli de ğişkeni tanımlanırken Stack yapısı Değişken Veli.soyadi Değer = " Mehmet" Değişken Veli.adi Değer = " Veli" Veli Ogrenci Değişken Ali.soyadi Değer = "" Değişken Ali.adi Değer = "" Ali Ogrenci Bu değişkenler oluşturulduktan sonra, bir yordama parametre olarak verildikle-rinde, tüm de ğerleri kopyalanır. De ğer tipindeki de ğişkenler, atama işlemlerinde oldukları gibi kopyalan ır. 3. Goruntule yordam ı çağrıld ığı zaman Stack yap ısı Değişken ogr.soyadi Değer = " Mehmet" Değişken ogr.adi Değer = " Veli" ogr Ogrenci Değişken Veli.soyadi Değer = " Mehmet" Değişken Veli.adi Değer = " Veli" Veli Ogrenci Değişken Ali.soyadi Değer = "" Değişken Ali.adi Değer = "" Ali Ogrenci Test isimli yordamdan ç ıkılınca, bu de ğişkenler oluşturulduklar ı s ırayla stack yap ısından kaldırılır. 222 Modül 8: Class Organizasyon Yapısı ve Belle ğin İncelenmesi Class ’lardan (Sınıf) nesneler oluşturulduklar ı zaman bu nesnelerin de ğerleri heap bölgesinde tutulur. Ancak bu nesneleri gösteren bir adres tutucusu oluşturulur ve bu adresin de ğeri de stack alanında depolanır. Public Class Siparis Public Tarih As Date Public AliciIsmi As String Public Urun As String Public Sub New() End Sub Public Sub New(ByVal Tarih As Date, ByVal Isim As String, ByVal Urun As String) Me.Tarih = Tarih Me.AliciIsmi = Isim Me.Urun = Urun End Sub End Class Sub Test() ' 1 - Sipariş referansı oluşturulur Veri Tipleri Üzerine İ leri Bak ış 223 Dim ilkSiparis As Siparis ' 2 - Yeni bir nesne oluşturulup,adresi ' bu referansa aktar ılır ilkSiparis = New Siparis(Now, "Enis Günesen", "Visual Studio.NET 2003") ' 3 - Yeni bir nesne daha oluşturulur ve adresi ' değişkene aktarılır ilkSiparis = New Siparis(Now.AddYears(-1), "Enis Günesen", "Visual Studio.NET 2002") ' 4 - Yeni bir referans ve nesne oluşturulur Dim ikinciSiparis As New Siparis ' 5 - İki değişkenin aynı bellek alanını göstermesi ' sağlan ır ilkSiparis = ikinciSiparis ' 6 - Bu alandaki Ürün ismi de ğiştirilir ilkSiparis.Urun = "BilgeAdam Yaz ılım Uzmanl ığı" ' 7 - Parametre olarak sipariş nesnesinin ' adresi verilir Goruntule(ikinciSiparis) End Sub Sub Goruntule(ByVal parametreSiparis As Siparis) MsgBox(parametreSiparis.Urun) End Sub 1. ilkSiparis tan ımlanırken Stack alan ı Değer = 0x00000000 (Bellekte bo ş bir alan ı gösterir) İlkSiparis Heap alanı Nesne Adres Bilgisi 224 Modül 8: 2. ilkSiparis olu şturulurken Stack alan ı Değer = 0x00000012 ilkSiparis Heap alanı Nesne Adres Bilgisi Siparis Tarih = 10.05.2005 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2003 0x00000012 3. ilkSiparis referans ına başka bir nesne verilirken Stack alan ı Değer = 0x00000056 (Gösterdiği adres de ğeri de ğişir) ilkSiparis Heap alanı Nesne Adres Bilgisi Siparis Tarih = 10.05.2004 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2002 0x00000056 Siparis Tarih = 10.05.2005 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2003 0x00000012 (Bu adres alan ına art ık hiçbir referans ulaşmıyor) Veri Tipleri Üzerine İ leri Bak ış 225 4. ikinciSiparis olu şturulurken Stack alan ı Değer = 0x00000088 ikinciSiparis Değer = 0x00000056 ilkSiparis Heap alanı Nesne Adres Bilgisi Siparis Tarih = AliciIsmi = Urun = 0x00000088 Siparis Tarih = 10.05.2004 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2002 0x00000056 Siparis Tarih = 10.05.2005 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2003 0x00000012 5. ikinciSiparis’in adres bilgisi ilkSiparis ’e atan ırken Stack alan ı Değer = 0x00000088 ikinciSiparis Değer = 0x00000088 (Gösterdiği adres ikinci sipari ş referansı ile aynı olur) ilkSiparis 226 Modül 8: Heap alanı Nesne Adres Bilgisi Siparis Tarih = AliciIsmi = Urun = 0x00000088 Siparis Tarih = 10.05.2004 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2002 0x00000056 (Bu nesneyi gösteren referans kalmamış-tır) Siparis Tarih = 10.05.2005 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2003 0x00000012 6. ilkSiparis ’in gösterdi ği nesnenin ürün ismi de ğiştirilirken Stack alan ı Değer = 0x00000088 ikinciSiparis Değer = 0x00000088 ilkSiparis Veri Tipleri Üzerine İ leri Bak ış 227 Heap alanı Nesne Adres Bilgisi Siparis Tarih = AliciIsmi = Urun = BilgeAdam Yazılım Uzmanlığı 0x00000088 Siparis Tarih = 10.05.2004 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2002 0x00000056 (Garbage Collector, referanslar ını kay-betmi ş nesneleri bellekten siler) Siparis Tarih = 10.05.2005 AliciIsmi = Enis Günesen Urun = Visual Studio.NET 2003 0x00000012 (Garbage Collector, referanslar ını kay-betmi ş nesneleri bellekten siler) 7. ikinciSiparis’in gösterdi ği de ğer Goruntule yordam ı ile gösterilirken Stack alanı Değer = 0x00000088 parametreSiparis Değer = 0x00000088 ikinciSiparis Değer = 0x00000088 ilkSiparis Heap alanı Nesne Adres Bilgisi Siparis Tarih = AliciIsmi = Urun = BilgeAdam Yazılım Uzmanlığı 0x00000088 228 Modül 8: Sonuç olarak gösterilen de ğer, heap alan ında 0x00000088 adres numaral ı nesnenin ürün ismi olur. Parametre olarak verilen nesneler heap alan ında tek-rar olu şturulmazlar. Referans olarak geçen de ğişkenler aslında de ğer tipleridir. Ancak nesnenin tümü değil, sadece adres de ğerinin kopyası olu şturulur. Veri Tipleri Üzerine İ leri Bak ış 229 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" Ekle(mesaj, " World") MsgBox(mesaj) End Sub 230 Modül 8: mesaj de ğişkenin de ğeri, yordama de ğer olarak verilmi ştir. Dolay ısıyla yorda-mın üzerinde çalıştığı de ğer, mesaj ’ın bir kopyasıdır. Bellek alan ında fiziksel olarak farkl ı yerlerde dururular. Yani değişiklik yap ılan de ğer, sadece bir kopya-dı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 Parametre olarak referans tipinde bir değişken verilirse ByVal veya ByRef ara-sında bir fark olmaz. Referans tipleri, nesnelerin bulundu ğu heap alanlarının adresini tutar. Dolayısıyla ByVal olarak tan ımlanan parametreye referans tipi-nin de ğeri (adres bilgisi) kopyalanır. Bu kopya üzerinden aynı adres alan ında değişiklik yap ılır. ' Parametre ByVal ile tanımlı olsa dahi, değiştirir ' dizinin belirtilen index'teki de ğeri, ' adres olarak erişilir. Sub ElemanDegistir(ByVal dizi() As Integer, ByVal index As Integer, ByVal yeniDeger As Integer) dizi(index) = yeniDeger End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sayilar(2) As Integer sayilar(0) = 111 sayilar(1) = 222 sayilar(2) = 333 ElemanDegistir(sayilar, 1, 1000000) MsgBox(sayilar(1)) ' Sonuç = 1000000 End Sub Veri Tipleri Üzerine İ leri Bak ış 231 Modül Sonu Soruları & Al ıştırmalar 1. Değer değişkenleri ve referans değişkenleri aras ındaki farkı açıklay ın. Her iki de ğişken tipinin de yer ald ığı parametreleri içeren bir yordam ya-zın. Değişkenlerin verilerinin de ğişip değişmediğinin gözlemleyin. 2. Structure yap ısını açıklay ın. Kompleks bir veri tipini Stucture yap ı-sında kodlay ın. Yaz ılan veri tipinin uzunlu ğunu hesaplay ın. Modül 9: Windows Programlama Visual Basic.NET ile Windows Tabanl ı Programlama adl ı Modül 4’te 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. Bu modül tamamland ıktan sonra; ? ListBox, TreeView ve ComboBox gibi listeleme kontrollerini tanıyacak, ? PictureBox ve ImageList gibi resim kontrollerini tan ıyacak, ? TabControl , Panel , HScrollBar ve VScrollBar gibi düzenleme kont-rollerini tan ıyacak, ? DateTimePicker ve MonthCalendar gibi zaman ve tarih kontrollerini tan ıyacak, ? Çalışma anında forma yeni kontroller olu şturup ekleyebileceksiniz. 236 Modül 9: Konu 1: Formlar ve Windows Forms Kontrolleri Windows uygulamalarının temelini Windows Form nesneleri oluşturur. Win-dows 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. Windows Programlama 237 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 ekle-mek için aşağıdaki adımlar ı izleyin: 1. Solution Explorer panelinden projeyi sağ t ıklayarak ya da Project menüsünden 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- 238 Modül 9: ğ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. 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. Windows uygulamalarının başlang ıç nesnesi Sub Main olarak seçilebilir. Bu durumda, uyguluma yüklenirken herhangi bir form yerine Main yordam ı aranır. Bu yordam ayrı bir modül içine yaz ılabilir, ancak bu modüldeki Main yordam ı sonlandığı zaman uygulama da sonlan ır. Dolay ısıyla, bu yordamdan aç ılan formlar ın ShowDialog metodu ile aç ılması gerekir. Örneğin, bir Windows uygulamas ının kullanıcının girdi ği verilere göre de ğişik formlar ı açması için, başlang ıç nesnesinin Sub Main olarak ayarlanması gere-kir. Bu yordamda, kullan ıcının istedi ği form dinamik olarak yüklenir. Module Giris Sub Main() Dim grup, parola As String grup = InputBox("Kullanıcı grubu:") parola = InputBox(grup & " grubuna giriş için parola girin:") ' Grupların parolası kontrol edilir ' ve ilgili grubun formu aç ılır. ' Eğer parola veya grup ismi yanlış girilirse ' hata formu yüklenir. Select Case grup.ToUpper Case "SATIŞ" If parola.ToUpper <> "SATİS_PAROLA" Then Windows Programlama 239 HataFormuYukle("Satış departmanı parolası yanlış!") Else Dim satisDepartmani As New frmSatis satisDepartmani.ShowDialog() End If Case "YÖNET İM" If parola.ToUpper <> "YONET İM_PAROLA" Then HataFormuYukle("Yönetim departman ı parolası yanlış!") Else Dim yonetimDepartmani As New frmYonetim yonetimDepartmani.ShowDialog() End If Case Else HataFormuYukle(grup & " isminde bir grup bulunamadı") End Select End Sub ' Hata formu, verilen parametredeki mesaj ı ' gösterecek şekilde ayarlanır ve yüklenir. Sub HataFormuYukle(ByVal mesaj As String) Dim hataFormu As New frmHata hataFormu.lblHataMesaji.Text = mesaj hataFormu.ShowDialog() End Sub End Module 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 şe-kilde ayarlanabilir. 240 Modül 9: Form Özellikleri TABLO 9.1: Form Özellikleri Özellik Değer Tipi Aç ıklama AcceptButton Button Form üzerinde Enter tu şuna ba-sıld ığı zaman “t ıklanacak” Button kontrolü CancelButton Button Form üzerinde Esc tu şuna bas ıl-dığı zaman “t ıklanacak” Button kontrolü Opacity Double Formun şeffaflık oranı (0 -1 arası) MaximizeBox Boolean Maximize dü ğmesinin görünür-lü ğü MinimizeBox Boolean Minimize düğmesinin görünür-lü ğü ControlBox Boolean Close, Maximize ve Minimize düğmelerinin tümünün görü-nürlüğü StartPosition FormStartPosition Form aç ıld ığı zaman, ekran üze-rindeki konumu TopMost Boolean Formun tüm pencerelerin üze-rinde 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 Form Olaylar ı TABLO 9.2: 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 Windows Programlama 241 Form Metotları TABLO 9.3: 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. Ö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 Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "Hoşgeldiniz... " & TimeOfDay End Sub Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing ' 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) Handles MyBase.KeyDown ' 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 242 Modül 9: Label Label kontrolü form üzerinde kullanıcıya bilgi vermek amac ıyla kullanılan etikettir. Label Özellikleri TABLO 9.4: Label Özellikleri Özellik De ğer Tipi Açıklama TextAlign ContentAlignment Yaz ının etiket üzerindeki pozisyonu be-lirler. BorderStyle BorderStyle Kontrolün kenar stilidir. FixedSingle değeri, kontrolün kenar çizgilerini gös-terir. 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 dura-cağını belirler. RightToLeft RightToLeft Etiket üzerindeki yaz ının yönünü belir-ler. E ğer Yes de ğerini alırsa, yaz ılar sağdan sola gösterilir Label1.BorderStyle = BorderStyle.Fixed3D ' Visual Studio klasörü altındaki simgeler kullanılabilir Label1.Image = Image.FromFile("C:\Program Files\ _ Windows Programlama 243 Microsoft Visual Studio .NET 2003\Common7\Graphics\icons\Flags\FLGTURK.ICO") Label1.ImageAlign = ContentAlignment.MiddleRight Label1.RightToLeft = RightToLeft.Yes Label1.Text = "Türkçe" RESİM 9.1: Label kontrolü örne ği. NOT Resmin bulunduğu yer kontrolün sa ğ tarafında bulunacak şekilde ayarlanma-sına rağmen, sol tarafta gözükür. Bu durum, RightToLeft özelli ğinin Yes ola-rak atanmas ından kaynaklan ır. 244 Modül 9: TextBox Metin kutuları, kullan ıcıdan bilgi almak için kullan ılır. TextBox Özellikleri TABLO 9.4: TextBox Özellikleri Özellik Değer Tipi Açıklama MultiLine Boolean Metin kutusuna birden fazla satırda de-ğer girilebilmesini sa ğlar. False duru-munda 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, giri-len 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. Windows Programlama 245 TABLO 9.4: TextBox Özellikleri Özellik Değer Tipi Açıklama ReadOnly Boolean Metin kutusunun yazmaya karşı koru-malı 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. TextBox Olayları TABLO 9.5: TextBox Olayları Olay Aç ıklama TextChanged Metin kutusundaki yazı de ğişti ği zaman gerçekle şir. TextBox Metotları TABLO 9.6: 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. Örnek: 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 9.2: TextBox kontrolü örne ği. 246 Modül 9: Private Sub Form1_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, txtAltSayi.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 Windows Programlama 247 ' 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. Private Sub btnYukle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnYukle.Click txtSayilar.Clear() txtSayilar.Paste() End Sub 248 Modül 9: Button Windows uygulamalarında, form üzerinde komut dü ğmeleri olarak kullanılır. Button Özellikleri TABLO 9.7: 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 Button Olayları TABLO 9.8: 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ştirile-rek, özel bir mesaj kutusu tasarlanabilir. Windows Programlama 249 RESİM 9.3: 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 250 Modül 9: CheckBox Kullanıcının birçok seçene ği birden seçmesi için kullanılır. CheckBox Özellikleri TABLO 9.9: CheckBox Özellikleri Özellik De ğer Tipi Aç ıklama Checked Boolean Kontrolün seçili olup olmadığını belirler. CheckAlign ContentAlignment Seçme kutusunun ve üzerinde yazan metnin birbirlerine göre konumlarını be-lirler. 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 du-ruma geçilece ğini belirtir. E ğer bu özel-lik False ise, kontrolün durumunu de-ğiştirmek için, Click olayında, Checked özelli ğini güncellemek gere-kir. Windows Programlama 251 CheckBox Olayları TABLO 9.10: CheckBox Olayları Olay Açıklama CheckChanged Seçme kutusunun durumu de ğişti ği zaman gerçekle şir. Örnek: Bir GSM şebekesinden faturalı hat açılışında toplam tutar hesaplanır-ken, baz ı seçenekler CheckBox kontrolleri ile sunulabilir. RESİM 9.4: 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 252 Modül 9: RadioButton RadioButton kontrolleri, kullanıcıya sunulan seçeneklerden sadece bir tanesi-nin 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. 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. Panel GroupBox kontrolü gibi, kontrollerin belli bir düzende gözükmesini sağlamak için kullanılır. GroupBox kontrolünden fark ı olarak yatay ve dü şey kaydırma çu-buklar ı bulunur, ancak panel üzerinde başlık yazısı bulunmaz. Windows Programlama 253 Panel Özellikleri TABLO 9. 11: Panel Özellikleri Özellik De ğer Tipi Açıklama AutoScroll Boolean Panelde kaydırma çubuklarının görünürlüğünü belirler Paneller, seçeneklere göre bir grup kontrolün gizlenmesi veya görüntülenmesi aşamasında etkili bir rol oynar. Örnek: RadioButton, GroupBox ve Panel kontrolleri, BilgeAdam eğitim anketi formunun tasar ımında kullanılabilir. Anket, bir e ğitimin ürünleri hakk ında yapılır. Anket bilgileri eğitim araç gereçleri ve e ğitim içeri ği üzerinde “çok iyi”den “çok kötü”ye kadar bir değer verilmesiyle oluşturulur. Sonuç olarak elde edilen anket bilgileri kullan ıcıya gösterilerek onaylamas ı beklenir. RESİM 9.5: GroupBox, Panel ve RadioButton kontrolleri örne ği. ? Global değişkenlerin olu şturulmas ı: ' Ozet bilgilerinin tutulduğu değişken Private AnketOzet As String ' Onaylama dü ğmesinin aktif hale gelmesi için ' tüm oylamaların yapılmış olması gerekir Private IcerikOyuSecildi, AracOyuSecildi As Boolean 254 Modül 9: ? Formun yüklenmesi s ıras ında kontroller üzerinde yapılan ayarlar: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' Sistem ve yazılım seçeneklerini tutan ' GroupBox kontrolleri gizlenir: grpSistem.Visible = False grpYazilim.Visible = False ' Anketleri tutan Panel kontrolü gizlenir pnlAnket.Visible = False ' Onayla düğmesi oylamadan önce pasif haldedir btnOnayla.Enabled = False End Sub ? Eğitimler seçildi ğinde, ilgili alt seçeneklerin görüntülenmesi sa ğlan ır. Alt seçenekler, ayrı GroupBox kontrollerinde tutulur. Private Sub rbYazilim_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbYazilim.CheckedChanged, rbSistem.CheckedChanged ' GroupBox kontrollerini görünümleri, e ğitimlerin ' seçili olmas ıyla doğru orant ılıdır. grpYazilim.Visible = rbYazilim.Checked grpSistem.Visible = rbSistem.Checked UrunTemizle() pnlAnket.Visible = False End Sub ' Ürünler başlangıç değerlerine çevrilir Sub UrunTemizle() rbMCSD.Checked = False rbMCSE.Checked = False rbSistemUzmanligi.Checked = False rbYazilimUzmanligi.Checked = False End Sub ? Alt ürünler seçildiğinde, anket paneli görüntülenir ve panelin kar şılama mesajında ilgili ürünün ismi gösterilir. Private Sub rbSistemUzmanligi_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbSistemUzmanligi.CheckedChanged, rbYazilimUzmanligi.CheckedChanged, rbMCSD.CheckedChanged, rbMCSE.CheckedChanged Windows Programlama 255 Dim panelMesaji As String ' Bu olay ı tetikleyen RadioButton kontrolü al ınır Dim basilan As RadioButton = sender lblKarsilamaMesaji.Text = basilan.Text & " için anket girişi:" pnlAnket.Visible = True End Sub ? Anketlerde, ilgili konularda oylama yapıld ığı zaman, oylama düğmesi aktif hale getirilir ve anket mesajı olu şturulur. ' E ğitim içeriği için verilen oy Private Sub rbCokIyi_Icerik_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbCokIyi_Icerik.CheckedChanged, rbCokKotu_Icerik.CheckedChanged, rbIyi_Icerik.CheckedChanged, rbYeterli_Icerik.CheckedChanged, rbKotu_Icerik.CheckedChanged IcerikOyuSecildi = True Dim basilan As RadioButton = sender AnketOzetiCikar("Eğitim içeriği: " & basilan.Text) End Sub ' E ğitim araç gereçleri için verilen oy Private Sub rbCokIyi_Arac_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbCokIyi_Arac.CheckedChanged, rbCokKotu_Arac.CheckedChanged, rbIyi_Arac.CheckedChanged, rbYeterli_Arac.CheckedChanged, rbKotu_Arac.CheckedChanged AracOyuSecildi = True Dim basilan As RadioButton = sender AnketOzetiCikar("Eğitim araç gereçleri: " & basilan.Text) End Sub Sub AnketOzetiCikar(ByVal ozet As String) AnketOzet &= ozet & vbCrLf If IcerikOyuSecildi And AracOyuSecildi Then btnOnayla.Enabled = True 256 Modül 9: End If End Sub Anket bilgileri oluşturulduktan sonra, onay dü ğmesi aktif hale gelir. Bu düğme tıklandığı zaman kullan ıcıya girdiği bilgiler mesaj kutusu ile gösterilir. Kullan ıcı onayladıktan sonra kayıt i şlemleri gerçekle şir. Private Sub btnOnayla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOnayla.Click Dim mesaj As String mesaj = "Yapılan anket sonucu: " & vbCrLf & AnketOzet & vbCrLf mesaj &= "Bilgileriniz kaydedilecektir. Devam etmek istiyor musunuz?" If MsgBox(mesaj, MsgBoxStyle.YesNo, "Anket Sonucu") = MsgBoxResult.No Then Exit Sub Else ' Anket kayıt i şlemleri... End If End Sub Windows Programlama 257 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 TABLO 9.12: ListBox Özellikleri Özellik Değer Tipi Aç ıklama Items ListBox.ObjectCollection Liste kutusuna eklenen öğelerin tutulduğu kolek-siyon nesnesidir. SelectedItem Object Liste kutusundan seçilen öğeyi alır. SelectedItems SelectedObjectCollection Liste kutusundan seçilen öğeleri alır. Seçilen öğeler dinamik bir dizide tutulur. SelectedIndex Integer Liste kutusundan seçilen öğenin indisini al ır. SelectedIndices SelectedIndexCollection Liste kutusundan seçilen öğelerin indislerini bir koleksiyon nesnesinde tutar. DataSource Object Listenin öğelerinin tutul-duğu veri kayna ğıdır. Veri kayna ğı bo ş geçilirse Items koleksiyonuna ek-lenen ö ğeler görüntülenir. 258 Modül 9: TABLO 9.12: ListBox Özellikleri Özellik Değer Tipi Aç ıklama DisplayMember String Veri kaynağından gelen öğelerin, kullanıcıya gös-terilecek özelli ğidir. ValueMember String Veri kaynağından gelen öğelerin, dönüş de ğerini belirleyen özelliğidir. SelectedValue Object Seçilen öğenin, liste ku-tusunun ValueMember ile belirtilen özelli ğidir. SelectionMode SelectionMode Liste kutusundan kaç tane ö ğe seçilebileceğini belirtir. None de ğeri 0, One de ğeri 1, MultiSimple ve MultiExtended de ğer-leri birden fazla öğenin seçilebileceğini belirtir. MultiColumn Boolean Liste kutusundaki öğele-rin biden fazla kolonda görüntülenmesini belirler. ListBox Olayları TABLO 9.13: ListBox Olaylar ı Olay Açıklama SelectedIndexChanged Liste kutusunda bir ö ğe seçildi ği zaman gerçekle şir. ListBox Metotlar ı TABLO 9.14: ListBox Metotları Metot Açıklama GetItemText Parametre olarak verilen nesnenin liste kutusunda gösterilen yazı-sını döndürür. GetSelected Parametre olarak verilen indisteki öğenin seçili olup olmadığını döndürür. FindString Parametredeki String ifadesini liste kutusunda arayarak, bul-duğu ilk ö ğenin indisini döndürür Örnek: Tedarikçiden alınacak ve stokta bulunan ürünleri listelemek ve alım sa-tım işlemi yapmak için ListBox kontrolleri kullan ılabilir. Windows Programlama 259 RESİM 9.6: ListBox kontrolü örne ği. ? Ürünlerin tutulmas ı için bir Structure olu şturulur. Bu ürün yap ısının ToString metodu tekrar yazılmıştır. Bunun nedeni, ListBox kontro-lünde listelenen nesnelerin görüntülendiği de ğerin ToString metodu çağırılarak belirlenmesidir. Dolayısıyla liste kutularında istenen formatta değerin gözükmesini sağlamak için ToString metodunun tekrar yaz ıl-ması gerekir. Structure Urun Public Ismi As String Public Fiyat As Double Public Sub New(ByVal UrunIsim As String, ByVal UrunFiyat As Double) Ismi = UrunIsim Fiyat = UrunFiyat End Sub Public Overrides Function ToString() As String Return String.Format("{0} - {1:C}", Ismi, Fiyat) End Function End Structure ? Liste kutularının özellikleri ayarlan ır ve içine eleman doldurulur. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load lbTedarikci.SelectionMode = SelectionMode.MultiExtended lbStok.SelectionMode = SelectionMode.MultiExtended UrunEkle() End Sub 260 Modül 9: Sub UrunEkle() Dim u As Urun u = New Urun("Kalem", 1.49) lbTedarikci.Items.Add(u) u = New Urun("Silgi", 0.39) lbTedarikci.Items.Add(u) u = New Urun("Defter", 4.99) lbTedarikci.Items.Add(u) u = New Urun("Cetvel", 1.99) lbTedarikci.Items.Add(u) u = New Urun("Pergel", 2.99) lbTedarikci.Items.Add(u) u = New Urun("Not Defteri", 3.79) lbTedarikci.Items.Add(u) End Sub ? Tedarikçi liste kutusundan, stok liste kutusuna öğe aktarılması için, seçilen değerler önce liste kutusuna eklenir. Daha sonra bu seçilen de-ğerler, diğer listede olmayacağı için tek tek ç ıkart ılır. Private Sub btnEkle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEkle.Click ' Tedarikçiden alınan ürünler stok listesine eklenir For Each item As Object In lbTedarikci.SelectedItems lbStok.Items.Add(item) Next ' Stok listesine eklenen tüm ürünler ' tedarikçi listesinden çıkartılır For Each item As Object In lbStok.Items lbTedarikci.Items.Remove(item) Next btnCikar.Enabled = True btnHesapla.Enabled = True End Sub ? Stok listesinden ö ğe çıkarmak için, ekleme i şlemine benzer kodlar çalıştırılır. Private Sub btnCikar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCikar.Click ' Tedarikçiden alınan ürünler stok listesine eklenir For Each item As Object In lbStok.SelectedItems Windows Programlama 261 lbTedarikci.Items.Add(item) Next ' Stok listesine eklenen tüm ürünler ' tedarikçi listesinden çıkartılır For Each item As Object In lbTedarikci.Items lbStok.Items.Remove(item) Next If lbStok.Items.Count = 0 Then btnCikar.Enabled = False btnHesapla.Enabled = False End If End Sub ? Stoktaki toplam fiyatın hesaplanması i şlemi, ürünlerin fiyatlar ının al ınıp toplanmas ı ile gerçekle şir. Private Sub btnHesapla_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHesapla.Click Dim toplam As Double For i As Integer = 0 To lbStok.Items.Count - 1 Dim urun As Urun = lbStok.Items(i) toplam += urun.Fiyat Next lblToplam.Text = toplam End Sub ? Stok listesindeki bir öğenin seçildiği durumda, bu öğenin fiyatı görüntülenir. Private Sub lbStok_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbStok.SelectedIndexChanged Dim secilen As Urun secilen = lbStok.SelectedItem lblUrunFiyat.Text = String.Format("{0:C}", secilen.Fiyat) End Sub 262 Modül 9: CheckedListBox Liste kutusunun tüm özellik, metot ve olaylar ını alır ve listedeki öğelerin i şaret kutusu ile gösterilmesini sağlar. CheckedListBox Özellikleri TABLO 9.15: CheckedListBox Özellikleri Özellik Değer Tipi Açıklama CheckedItems CheckedItemCollection Liste kutusunda i şaretlenmiş öğeleri tutar. CheckedIndices CheckedIndexCollection Liste kutusunda i şaretlenmiş öğelerin indislerini tutar. CheckOnClick Boolean Liste kutusunda öğe tıklandığı zaman i şaretlenmesini belirler. False ise ilk t ıklamada ö ğe seçilir, ikinci tıklamada seçme kutusu i şaretlenir. CheckedListBox Metotları TABLO 9.16: CheckedListBox Metotları Metot Açıklama GetItemSelected Parametre olarak verilen indisteki öğenin seçili olup olmadı-ğını döndürür. SetItemSelected İlk parametrede verilen indisteki eleman ın seçili olup olmad ı-ğını, ikinci parametrede verilen Boolean değeri ile belirler. Windows Programlama 263 Örnek: Kategori başına stoktaki toplam ürünlerin gösterildi ği bir uygulamada, listelenen kategorileri seçmek için bu kontrol uygun olur. RESİM 9.7: CheckedListBox kontrolü örne ği. ? Listede bir öğe seçildiği zaman, seçilen tüm kategorilerin ürün stok du-rumu alınır ve toplam ürün say ısı kullan ıcıya gösterilir. Private Sub chlistKategoriler_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chlistKategoriler.SelectedIndexChanged Dim toplam As Integer ' Listedeki seçilen öğelerin ürün adeti toplanır. For i As Integer = 0 To chlistKategoriler.Items.Count - 1 If chlistKategoriler.GetItemChecked(i) Then Dim secilen As Object secilen = chlistKategoriler.Items(i) ' Stok durumunu gösteren fonksiyon çağırılır toplam += StokDurumu(secilen.ToString) End If Next lblToplamUrun.Text = "Seçilen kategorilerdeki toplam ürün: " & toplam End Sub ' Kategoriye göre, stoktaki ürünlerin belirlenmesi Function StokDurumu(ByVal kategori As String) As Integer Select Case kategori Case "Film" Return 1100 264 Modül 9: Case "Müzik" Return 982 Case "Bilgisayar" Return 302 Case "Kitap" Return 1222 Case Else Return 10 End Select End Function ' Ekleme işlemi Private Sub btnKategoriEkle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKategoriEkle.Click chlistKategoriler.Items.Add(txtKategoriAdi.Text) End Sub Windows Programlama 265 ComboBox Liste kutusu ile aynı özelliklere sahiptir, ancak listelenen öğeler aç ılan bir ku-tuda 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 üze-rinde de ğer girebilmesidir. Dolayısıyla bir TextBox kontrolü gibi de davranabilir. ComboBox Özellikleri TABLO 9.17: ComboBox Özellikleri Özellik Değer Tipi Açıklama DropDownStyle ComboBoxStyle Kontrolün listeleme stilini belirler. Simple stili, listedeki sadece bir öğeyi görüntüler. DropDown stili, listenin tüm elemanlar ını görüntüleyerek seçilmele-rini 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 ka-rakter say ısını belirler. SelectedText String Seçilen öğenin görüntülenen yazısını belirler. 266 Modül 9: Ö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 9.8: ComboBox kontrolü örne ği. ? ComboBox kontrollerinin özelliklerinin ayarlanmas ı ve format tiplerine öğe eklenmesi. Private Sub Form1_Load(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 Windows Programlama 267 ? 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 268 Modül 9: 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 TABLO 9.18: NumericUpDown Özellikleri Özellik Değer Tipi Açıklama HexaDecimal Boolean Say ıların onaltılık tabanda görüntülenmesini belirler. Increment Decimal Aşağı yukarı oklar kullan ıld ığında, sayıların artma ve azalma adımlarını belirler. Maximum Decimal Kontrolde gösterilen sayıların alabilece ği maksimum değeri belirler. Minimum Decimal Kontrolde gösterilen sayıların alabilece ği mi-nimum 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ş yapma-sını engeller. Windows Programlama 269 NumericUpDown Olaylar ı TABLO 9.19: NumericUpDown Olaylar ı Olay Aç ıklama ValueChanged Kontrolün sayı de ğeri de ğişti ği zaman gerçekle şir NumericUpDown Metotları TABLO 9.20: NumericUpDown Olaylar ı 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. Örnek: Alarm kurarken, tarih ve zaman değerlerinin ayarlanması NumericUpDown kontrolü ile yap ılabilir. RESİM 9.9: NumericUpDown kontrolü örne ği. ? Tarih ve zaman de ğerlerinin alabileceği maksimum ve minimum de ğer-ler ayarlan ır. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 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 270 Modül 9: 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 sender As System.Object, ByVal e As System.EventArgs) 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 DomainUpDown NumericUpDown kontrolü ile aynı yapıdad ır, ancak say ısal de ğerler yerine Object tipinde de ğerler tutar. Bu de ğerler kontrolün Items koleksiyonunda tutulur. Kontrol, bu özelli ği ile liste kutusuna benzer. DomainUpDown Özellikleri TABLO 9.21: DomainUpDown Özellikleri Özellik De ğer Tipi Açıklama Items DomainUpDownItemCollection Kontrolün öğelerinin tu-tuldu ğu dinamik bir liste-dir. SelectedItem Object Kontrolde seçilen ö ğeyi tutar. Windows Programlama 271 TABLO 9.21: DomainUpDown Özellikleri Özellik De ğer Tipi Açıklama Wrap Boolean Liste sonuna gelindiğinde baştaki veya sondaki öğeye geri dönülmesini belirler. DomainUpDown Olayları TABLO 9.22: DomainUpDown Olaylar ı Olay Açıklama SelectedItemChanged Kontrolde seçilen ö ğe değişti ği zaman gerçekle şir. Örnek: Metin kutularının de ğiştirilmek istenen yaz ı tipleri DomainUpDown kontro-lünde tutulabilir. RESİM 9.10: DomainUpDown kontrolü örne ği. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 0 To 10 dFont.Items.Add(System.Drawing.FontFamily.Families(i).Name) Next dFont.Wrap = True End Sub Private Sub dFont_SelectedItemChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dFont.SelectedItemChanged If dFont.SelectedIndex >= 0 Then TextBox1.Font = New Font(dFont.SelectedItem.ToString, 15) End If End Sub 272 Modül 9: HScrollBar / VScrollBar Horizontal – Vertical ScrollBar kontrolleri, say ısal bir değer taşıyan kaydırma çubuklarıdır. Tuttuklar ı de ğerlerin say ısal olmas ı bakımından NumericUpDown kontrolüne benzerler. Bu kontroller, üzerlerinde kayd ırma çu-buklar ı olmayan kontroller üzerinde kullanılabilir. Örne ğin ListBox ve Panel gibi kontrollerin kendi ScrollBar kontrolleri vard ır. TextBox kontrolünün de il-gili özellikleri ayarlanarak yatay ve düşey ScrollBar kontrolleri gösterilebilir. ScrollBar Özellikleri TABLO 9.23: ScrollBar Özellikleri Özellik De ğer Tipi Açıklama Value Integer Kaydırma çubu ğunun pozisyonuna göre alınan değeri tutar. SmallChange Integer Kontrolü, üstündeki oklar ile kayd ırıld ığı zaman eklenecek ya da çıkart ılacak de ğeri tutar. LargeChange Integer Kontrolü, kayd ırma çubu ğundaki bo şlu ğa tıkla-narak kaydırıld ığında zaman eklenecek ya da ç ı-kart ılacak de ğeri tutar. Minimum Integer Value özelli ğinin alabileceği maksimum değeri tutar. Maximum Integer Value özelli ğinin alabileceği minimum de ğeri tu-tar. Windows Programlama 273 ScrollBar Olaylar ı TABLO 9.24: ScrollBar Olaylar ı Olay Açıklama Scroll Çubuklar kayd ırıld ıklar ı zaman gerçekle şir. ValueChanged Kod ile ya da çubuklar kayd ırılınca Value özelli ği de ğişti ği zaman gerçekle şir. Örnek: Bir ComboBox kontrolünün öğelerini listelemek için, a şağıya doğru bir kaydırma çubuğu görüntülenir. Ancak listedeki bazı elemanlar kontrole s ığmı-yorsa, çalışma anında bu kontrolün genişli ği art ırılabilir. RESİM 9.11: ScrollBar kontrolü örne ği. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load hsGenislik.Maximum = ComboBox1.Width * 2 hsGenislik.Value = ComboBox1.Width End Sub Private Sub hsGenislik_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles hsGenislik.Scroll ComboBox1.Width = hsGenislik.Value End Sub 274 Modül 9: TrackBar Bu kontrol, ScrollBar kontrollerine benzer yap ıdad ır, ancak kontrol, bir cetvel biçiminde olduğu için, üzerinde durulan pozisyon gör sel olarak takip edilebilir. Kontrolün kaydırma çubuklar ından bir farkı da üzerine odaklanılabilir olmas ıdır. Dolayısıyla, kontrolün Value de ğeri klavyede bulunan yukarı, aşağı, sa ğa, sola oklar ve PageUp, PageDown tuşları ile de ğiştirilebilir. TrackBar Özellikleri TrackBar kontrolünün birçok özelliği ScrollBar kontrollerinin özellikleriyle aynıdır. Fakat kontrolü daha esnek hale getiren birkaç özelliği vard ır. TABLO 9.25: TrackBar Özellikleri Özellik Değer Tipi Açıklama TickStyle TickStyle Kontrolün değerini gösteren çizgilerin pozis-yonunu belirler. TickFrequency Integer Çizgiler aras ında kalan değerlerin say ısını belirler. Orientation Orientation Kontrolün yönünün yatay veya dü şey olma-sını sa ğlar. Windows Programlama 275 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 nes-nesinin TabPages koleksiyonuna eklenir. Ekleme i şlemi, Properties paneli ile tasarım anında da yap ılabilir. TabControl Özellikleri TABLO 9.26: TabControl Özellikleri Özellik Değer Tipi Açıklama HotTrack Boolean Fare ile sekme sayfalar ının üzerine gelindiğinde, isimlerinin görsel olarak değişmesini belirler. ItemSize Size Sekme sayfalarının büyüklü ğünü be-lirler. Multiline True Eklenen sekmelerin birden fazla sa-tı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 be-lirler. TabCount Integer Sekme sayısını belirler. TabPages TabPageCollection Kontrolün içinde bulunduğu sekme sayfalar ının koleksiyonudur. 276 Modül 9: TabControl nesnesine TabPage sayfalar ı eklemek için tasarım anında Tab-Page Collection Editor penceresinden yararlanılabilir (Resim 9.12). RESİM 9.12: 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. TABLO 9.27: TabPage Özellikleri Ö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. Ö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. Windows Programlama 277 RESİM 9.14: TabControl örne ği. 278 Modül 9: DateTimePicker Bir açılan kutudan zaman de ğeri seçmeyi sağlar. Seçilen değer Date tipinde olur. DateTimePicker Özellikleri TABLO 9.28: DateTimePicker Özellikleri Özellik Değer Tipi Açıklama CalendarTrailing ForeColor Color Bir önceki ve bir sonraki ay ın gün-lerinin görüntülenme rengidir. CalendarTitle ForeColor Color Takvim ba şlığının ön plan rengidir. CalendarTitle BackColor Color Takvim ba şlığının arka plan rengi-dir. CalendarMonth Background Color Takvim arka plan rengidir. CalendarForeColor Color Takvimdeki yazıların ön plan rengi-dir. CalendarFont Font Takvimin gösterileceği yazı tipi ayarlarıdır. ShowCheckBox Boolean Tarih de ğerinin yan ında seçme kutusunun gösterilmesi. Checked Boolean Seçme kutusu görüntülendi ği za-man, tarihin seçili olup olmadığını gösterir Windows Programlama 279 TABLO 9.28: DateTimePicker Özellikleri Özellik Değer Tipi Açıklama Format DateTime PickerFormat Kontrolün görüntüleneceği format ı belirler. Long, Short de ğerleri uzun ve kısa tarih format ını, Time sadece zaman ı gösterir. Custom değeri, CustomFormat özelli ğine girilen formatta gösterileceğini be-lirler. 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 ta-rih 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 formatında olur. Örnek: Veritabanından bir kaydın belli tarih aral ıklar ı ile sorgulanması s ıra-sında, kullan ıcının başlang ıç ve bitiş tarihlerini seçmesi için bu kontrol kullanılabilir. RESİM 9. 15: 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 280 Modül 9: ' 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 ' 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 Windows Programlama 281 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 ı özellikle-rinde 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 tu-tan bir özellik yoktur. TABLO 9.29: MonthCalendar Özellikleri Özellik Değer Tipi Açıklama MaxSelectionCount Integer Bir seferde maksimum kaç gün seçi-lece ğini belirler. SelectionRange SelectionRange Başlangıç ve biti ş tarihlerinden olu-şan bir seçim aral ığı nesnesidir. SelectionBegin Date Seçilen tarih aral ığının hangi tarihten itibaren başlad ığını belirler. SelectionEnd Date Seçilen tarih aral ığının hangi tarihte bitti ğini belirler. ScrollChange Integer İleri geri düğmeleri tıklandığı zaman kaç ay atlanacağını belirler. MonthlyBoldedDates Date() Takvimde hangi günlerin kalın yazı tipinde gösterilece ğini belirler. İş a-retlenen günler, her ay için kalın gösterilir. 282 Modül 9: TABLO 9.29: MonthCalendar Özellikleri Özellik Değer Tipi Açıklama ShowToday Boolean Takvimin alt k ısmında, sistem takvi-mine göre hangi günde olduğunu gösterir. ShowTodayCircle Boolean Takvimde, o günün seçili olmas ını belirler. ShowWeekNumbers Boolean Takvimin sol tarafında, y ılın hafta numaralar ını gösterir. MonthCalendar Olayları TABLO 9.30: MonthCalendar Olayları Olay Aç ıklama DateChanged Seçilen tarihten farklı bir tarih seçildiğinde gerçekleşir. DateSelected Yeni bir tarih seçildiği zaman gerçekle şir. DateChanged olayı gerçekle ştikten hemen sonra bu olay gerçekleşir. Ö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 9.16: MonthCalendar kontrolü örne ği. ? 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 Windows Programlama 283 ' 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öre-vin ba şlang ıç-biti ş tarihleri ayarlan ır. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) 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 284 Modül 9: Timer Windows uygulamalarında sayaç görevini görür. Timer Özellikleri TABLO 9.31: Timer Özellikleri Özellik De ğer Tipi Açıklama Enabled Boolean Kontrolün aktif olup olmadığını belirler. Interval Integer Sayac ın hangi zaman aralığında bir çal ışması ge-rektiğini belirler. Milisaniye cinsindedir. Timer Olayları TABLO 9.32: Timer Olayları Olay Açıklama Tick Interval özelli ğinde belirtilen zaman değeri geçti ğinde gerçekleşir. Timer Metotlar ı TABLO 9.33: Timer Metotlar ı Metot Açıklama Start Sayac ı ba şlatır Stop Sayac ı durdurur Windows Programlama 285 ProgressBar ProgressBar, belli bir andaki de ğerin, alabilece ği de ğer aral ığına göre yüzde-sini gösterir. Yap ılan bir işlemin ilerleyişini göstermesi açısından oldukça kulla-nışlı bir kontroldür. ProgressBar Özellikleri TABLO 9.34: 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 be-lirler. Ö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 = ProgressBar1.Maximum 286 Modül 9: Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If kalan = 0 Then Timer1.Stop() Me.Close() End If Dim aralik As Integer aralik = ProgressBar1.Maximum - ProgressBar1.Minimum ' Kalan sayım i şleminin yüzdesi hesaplanır Dim oran As Integer = (aralik - kalan) / aralik * 100 Label1.Text = oran & "% tamamlandı" ProgressBar1.Value = ProgressBar1.Maximum - kalan kalan -= 1 End Sub RESİM 9.17: 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 Windows Programlama 287 If CheckBox1.Checked Then frmDurum.ShowDialog() End If End Sub 288 Modül 9: ErrorProvider Form üzerindeki kontrollerin yanında hata mesajları gösterilmesini sağlar. ErrorProvider Özellikleri TABLO 9.35: 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. AlwaysBlink, her zaman, BlinkIfDifferentError farkl ı bir hata meydana geldiğinde yanıp söneceğini belir-ler. NeverBlink ise simgenin yanıp sönme-den görüntülenece ğini belirler. Icon Icon Hata mesajlarının gösterilmesi sıras ında çı-kan simgeyi belirler. ErrorProvider Metotlar ı TABLO 9.36: ErrorProvider Metotlar ı Metot Açıklama SetError Kontrollerin hata mesajlarının belirlenmesi için kullanılır. Windows Programlama 289 ErrorProvider kontrolü forma eklendi ği zaman, Properties panelinde, kont-rollerin ekstra özellikleri görünür. Bu özellikler, forma eklenen her ErrorProvider için oluşturulur. TABLO9.37: ErrorProvider Ekstra Özellikleri Özellik Aç ıklama IconAlignment On ErrorProviderIsmi Hata simgesinin, kontrolün üzerinde nerde bu-lunacağını belirler. IconPadding On ErrorProviderIsmi Hata simgesinin, kontrolden kaç piksel uzakta duracağını belirler. Error On ErrorProviderIsmi Varsayılan hata mesaj ını belirler Ö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 9.18: 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 sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) 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 290 Modül 9: Private Sub txtSoyad_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) 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 sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) 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 Windows Programlama 291 PictureBox Form üzerinde bir resim görüntülemek için kullanılır. PictureBox Özellikleri TABLO 9.38: 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. AutoSize de ğeri, kontrolün büyüklüğünü resmin bü-yüklüğüne göre ayarlar. CenterImage de ğeri, resmi kontro-lün ortasına gelecek şekilde ayarlar. Normal de ğeri, kontrolün sol üst kö-şesine göre konumlandırır. StretchImage de ğeri, resmi kont-rolün büyüklü ğüne göre boyutlandırır ve resmin tam görünmesini sağlar. Örnek: Form üzerinde bir resmin değişik boyutlarda gösterilmesi için PictureBox kontrolü tercih edilir. 292 Modül 9: RESİM 9.19: 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 Windows Programlama 293 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 TABLO 9.39: ImageList Özellikleri Özellik Değer Tipi Açıklama Images ImageCollection Kontrolün içinde bulunan resimlerin listelendiği dinamik bir koleksiyondur. Bu özellik bir koleksiyon olduğu için, di ğer liste kontrollerinin öğelerinin resmini belirleme i şlemi büyük ölçüde kolaylaşır. ImageSize Size Kontrolün tuttuğu resimlerin büyük-lü ğünü belirler TransparentColor Color Listedeki resimlerin bu özellikte belir-tilen renkteki bölgeleri saydam olur. 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 re-sim göstermek için kullanılabilir. 294 Modül 9: 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 Windows Programlama 295 LinkLabel Bu kontrol, nesnelere ba ğlant ı kurmak için kullanılır. Text özelli ğinde birden fazla nesneye bağlant ı kurulabilir. Bu durumda, kontrol t ıklandığı zaman hangi bağlant ının i şlenece ği Click olay ında belirlenir. LinkLabel Özellikleri TABLO 9.40: LinkLabel Özellikleri Özellik De ğer Tipi Açıklama LinkArea LinkArea Bağlant ının hangi karakterler arasında ak-tif olaca ğını belirler. LinkBehavior LinkBehavior Bağlant ının yazısında bulunan çizginin ne zaman gösterileceğini belirler. HoverUnderline de ğeri fare üzerinde durdu ğu zaman, AlwaysUnderline de-ğeri her zaman altı çizili oldu ğunu belirler. NeverUnderline de ğeri ise bağlant ı yaz ısının altının çizilmeyeceğini belirler. LinkColor Color Bağlant ının LinkVisited özelli ği False olduğu zaman gösterilecek rengini belirler. LinkVisited Boolean Bağlant ının en az bir kere tıklandığını be-lirler. VisitedLink Color Color Bağlant ının LinkVisited özelli ği True olduğu zaman gösterilecek rengini belirler. Links LinkLabel. LinkCollection Kontrolün Text özelli ğinde bulunan ba ğ-lant ıları tutar. 296 Modül 9: LinkLabel Olayları TABLO 9.41: LinkLabel Olayları Olay Açıklama Click Kontrolün üzerine t ıklandığı zaman gerçekle şir. Diğer kontrollerin tıklama olay ından farkl ı olarak, LinkLabel üzerinde hangi ba ğlant ının tıklandığı anla şılır. Örnek: İletişim bilgi formunda e-posta ve Internet adresleri gibi bağlant ıları gös-termek için LinkLabel kullan ılır. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim bilgi As String bilgi = "BilgeAdam web sitesi: http://www.bilgeadam.com" bilgi &= vbCrLf & "Mail ile ula şmak için tıklayın" LinkLabel1.Text = bilgi ' İnternet adresinin başlad ığı karakterden ' itibaren link eklenir LinkLabel1.Links.Add(22, 24, "http://www.bilgeadam.com") ' Mail adresinin ba şlad ığı karakterden ' itibaren link eklenir LinkLabel1.Links.Add(72, 8, "mailto:p[email protected]") End Sub Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked Dim tiklanan As Integer tiklanan = LinkLabel1.Links.IndexOf(e.Link) 'Tıklanan linkin ziyaret edildi ği belirtilir LinkLabel1.Links(tiklanan).Visited = True ' Linki çalıştırmak için ilgili i şlem gerçekleştirilir System.Diagnostics.Process.Start(e.Link.LinkData) End Sub Windows Programlama 297 TreeView Bu kontrol, içinde bulunan öğeleri hiyerar şik bir yap ıda görüntüler. Her eklenen öğe bir düğümü temsil eder. Dü ğümler birleşerek a ğaç yap ısını olu ştururlar. Düğümler, kök ve alt dü ğüm olarak ikiye ayrılır. Kök düğümler, kontrolün ilk sıras ında yer alır ve ayn ı seviyededir. Alt dü ğümler, kök dü ğümlerin ve diğer alt düğümlerin altına eklenebilir. TreeNode Nesnesi TreeView kontrolünde gösterilen ö ğeler, özelliklerini TreeNode s ınıfından alır. Kök ve alt düğümlerin tümü TreeNode tipindedir. Her dü ğümün bir Nodes özel-li ği vard ır. Bu özellik, dü ğümün alt dü ğümlerinin tutuldu ğu koleksiyondur. Alt dü-ğümler olu şturulup bu özelli ğe eklenebilir. TreeNode dü ğümleri oluşturulup, özellikleri atand ıktan sonra TreeView kontro-lünde gösterilmesi için, TreeView nesnesinin Nodes koleksiyonuna eklenmesi gerekir. TreeNode Özellikleri TABLO 9.42: TreeNode Özellikleri Özellik Değer Tipi Açıklama Text String Düğümün üstünde gösterilen yazıyı belirler. Nodes TreeNodeCollection Düğümün alt dü ğümlerini tutan koleksiyon-dur. 298 Modül 9: TABLO 9.42: TreeNode Özellikleri Özellik Değer Tipi Açıklama Checked Boolean TreeView kontrolünde seçim kutular ı gös-teriliyorsa, dü ğümün işaretli olup olmad ığını belirler. NextNode TreeNode Ayn ı seviyedeki bir sonraki dü ğümü göste-rir. PrevNode TreeNode Ayn ı seviyedeki bir önceki dü ğümü gösterir. LastNode TreeNode Alt dü ğümlerinin en sonuncusunu gösterir. FirstNode TreeNode Alt dü ğümlerinin ilkini gösterir. NodeFont Font Düğümün yaz ı tipini belirler. FullPath String Düğümün, kökten kendisine kadar olan tüm dü ğümlerin Text özelliklerini sıralar. Parent TreeNode Düğümün ait olduğu TreeNode nesnesini belirtir. TreeNode Metotlar ı TABLO 9.43: TreeNode Metotları Metot Açıklama Collapse Düğümün ilk seviyedeki alt düğümlerini gizler. Eksi i şaretinin tık-lanmas ı ile ayn ı görevi görür. Expand Düğümün ilk seviyedeki alt düğümlerini gösterir. Art ı i şaretinin tıklanmas ı ile ayn ı görevi görür. ExpandAll Düğümün alt dü ğümlerini son seviyeye kadar gösterir. Toggle Düğümün durumunu açıksa kapalı, kapalıysa açık duruma getirir. GetNodeCount Verilen parametre True ise tüm alt dü ğümlerin, False ise sadece ilk seviyedeki dü ğümlerin sayısını verir. TreeView Özellikleri TABLO 9.44: TreeView Özellikleri Özellik Değer Tipi Açıklama CheckBoxes Boolean Düğümlerin yanında işaret kutularının gös-terilmesini belirler. ImageIndex Integer Kontrolün tüm öğeleri için varsayılan resmin ImageList içindeki indisini belirler. Bu özelliğin kullan ılması için, kontrolün ImageList özelli ğinin belirlenmesi gerekir. Windows Programlama 299 TABLO 9.44: TreeView Özellikleri Özellik Değer Tipi Açıklama SelectedImageIndex Integer Öğenin üzerine gelip seçildiğinde gösterile-cek resmin ImageList içindeki indisini belirler. SelectedNode TreeNode Seçilen dü ğümü belirler. TopNode TreeNode Kontrolün ilk kök düğümünü gösterir. ShowLines Boolean Düğümler arasında çizgilerin gözükmesini belirler. ShowPlusMinus Boolean Alt dü ğümleri gösterip gizlemek için kullanı-lan artı-eksi i şaretlerinin gözükmesini belir-ler. ShowRootLines Boolean Kök düğümlerinin çizgilerinin ve artı-eksi işaretlerinin gözükmesini belirler. PathSeparator String Bir dü ğümün FullPath özelli ğinde gösteri-len dü ğümleri ayıran karakterleri belirler. TreeView kontrolüne kod ile dü ğüm eklenebildiği gibi, tasar ım anında Visual Studio TreeNode Editor penceresi kullan ılarak da dü ğüm eklenebilir. RESİM 9.21: Properties panelinde düğüm eklemek. TreeView Metotlar ı TABLO 9.45: TreeView Metotları Metot Açıklama CollapseAll Kontrolün tüm düğümlerini gizler. ExpandAll Kontrolün tüm düğümlerini gösterir. TreeView Olayları TABLO 9.46: TreeView Olaylar ı Olay Aç ıklama BeforeSelect Düğüm seçilmeden önce gerçekle şir. AfterSelect Düğüm seçildikten sonra gerçekle şir. 300 Modül 9: TABLO 9.46: TreeView Olaylar ı Olay Aç ıklama BeforeCollapse Düğüm kapanmadan önce gerçekle şir. AfterCollapse Düğüm kapandıktan sonra gerçekleşir. BeforeExpand Düğüm aç ılmadan önce gerçekleşir. AfterExpand Düğüm aç ıld ıktan sonra gerçekleşir. RESİM 9.22: TreeNode Editor penceresi. Örnek: Ürün kategorileri, genelde tek kategori olarak ele alınsa da, asl ında hiyerar şik bir yap ıda incelenmeleri gerekir. Her kategorinin sonsuz sayıda alt kategorisi olabilir. Bu tip kategoriler, en iyi şekilde TreeView kontrolü ile görüntülenebilir. ? Yeni kategori ekleme işlemi kök dü ğüm ve alt düğüm olarak yapılabilir. Eğer RadioButton kontrollerinde kök düğüm seçilmişse ana kategori; alt düğüm seçilmişse, seçilen kategorinin altına bir alt kategori eklenir. Private Sub btnYeniKategoriEkle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnYeniKategoriEkle.Click Dim secilen As TreeNode secilen = TreeView1.SelectedNode If RadioButton1.Checked Then ' Kök düğüm eklenir Windows Programlama 301 TreeView1.Nodes.Add(txtYeniKategori.Text) ElseIf RadioButton2.Checked Then ' Seçilen kategoriye alt kategori eklenir secilen.Nodes.Add(txtYeniKategori.Text) End If End Sub RESİM 9.23: TreeView kontrolü örne ği. ? Seçilen bir kategorinin silinmesi i şlemi için, o dü ğümün hangi ana dü-ğüme ait olduğu bulunmal ıdır. Private Sub btnSil_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSil.Click Dim secilen As TreeNode = TreeView1.SelectedNode If Not secilen.Parent Is Nothing Then ' Seçilen düğüm, Parent dü ğümünün Nodes ' koleksiyonundan çıkartılır. secilen.Parent.Nodes.Remove(secilen) Else ' Eğer Parent yok ise Kök düğümdür. TreeView1.Nodes.Remove(secilen) End If End Sub ? Tüm düğümlerin gösterilmesi ve seçilen düğümün hiyerar şik yap ısının gösterilmesi: Private Sub btnGoster_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGoster.Click 302 Modül 9: TreeView1.ExpandAll() End Sub Private Sub btnKategoriGoster_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKategoriGoster.Click Dim secilen As TreeNode = TreeView1.SelectedNode MsgBox(secilen.FullPath) End Sub Windows Programlama 303 ListView Kullanıcıya değişik listeleme seçenekleri sunan bir kontroldür. İçinde bulunan öğeler, tek bir nesne olarak veya detaylar ı ile gösterilebilir. Dolay ısıyla öğeler ListViewItem nesnesi, detayları ise ListViewSubItem nesnesi olarak tan ımlanır. ListView Özellikleri TABLO 9.47: ListView Özellikleri Özellik Değer Tipi Açıklama View View Listenin görünümünü belirler. LargeIcons de ğeri listedeki öğelerin büyük resimle, SmallIcons küçük re-simle 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ülen-di ği detay görünümü sa ğlar. AllowColumn Reorder Boolean Detay görünümünde, kolonların kulla-nıcı taraf ından düzenlenebilmesini be-lirler. 304 Modül 9: TABLO 9.47: ListView Özellikleri Özellik Değer Tipi Açıklama Activation ItemActivation Öğelerin ne zaman etkinle ştirileceğini belirler. OneClick de ğeri, öğenin tek tıklamayla, Standard de ğeri, öğenin çift tıklamayla aktif hale geleceğini be-lirler. TwoClick de ğeri seçiliyken, ilk tıklandığında ö ğe seçilir, daha sonra ikinci defa t ıklandığında ise öğe aktif hale gelir. CheckBoxes Boolean Öğelerin yan ında seçme kutular ının bu-lunmas ını belirler. Columns ColumnHeader Collection Detay görünümündeyken, öğelerin alt öğelerinin gösterilece ği kolonlar ı tutan koleksiyondur. FullRowSelect Boolean Detay görünümde, öğenin tüm detay satırının seçilmesini belirler. GridLines Boolean Kolonlar ve satırlar aras ında ayırıcı çiz-gilerin gözükmesini belirler. LabelEdit Boolean Çalışma anında, kullanıcın, liste öğeleri-nin yazısını de ğiştirmesini belirler. Bu özelliğin kullan ılması için, Activation özelliğinin Standard olması gerekir. ListView Olayları TABLO 9.48: 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 Örnek: Windows Explorer ile dosya görünümleri, ListView ile gerçekle ştirilir. RESİM 9.24: ListView kontrolü örne ği. Windows Programlama 305 ? 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 sender As System.Object, ByVal e As System.EventArgs) 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) End Sub ? 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 306 Modül 9: 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 Windows Programlama 307 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 özel-likleri 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 ştu-rulmas ı gerekir. 308 Modül 9: RESİM 9.25: 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 b.Width = 30 b.Text = "X" Dim max********_Y, max********_X As Integer ' Yeni dü ğmenin yeri form dışında bir yerde olamaz max********_X = Me.Width - b.Width max********_Y = Me.Height - b.Height Randomize() ' Dü ğmenin bulunacağı yer rasgele ayarlanır. b.******** = New Point(Rnd() * max********_X, Rnd() * max********_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 Windows Programlama 309 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 310 Modül 9: Lab 1: Internet Tarayıcısı Bu labda, Windows altında bulunan Microsoft Web Tarayıcısı kontrolü projeye eklenerek Internet taray ıcısı gerçekle ştirilir. Bu labda kullanılan kontroller ve teknikler: ? LinkLabel. Ana sayfaya ba ğlant ı sağlar. ? RadioButton. Ba ğlant ıların yeni ya da ayn ı pencerede aç ılması seçeneğini sunar. ? GroupBox. RadioButton kontrollerini gruplamak için kullan ılır. ? TabControl . Ta r a y ıcıların farklı pencerelerde gözükmesini sa ğlar. ? Microsoft Web Tarayıcısı. Internet sitelerinin görüntülenmesini sağlar. ? Dispose metodu. TabPage sayfalar ının silinmesi için kullan ılır. ? For Each. Sayfalar ın tümünün kapanması için kullan ılır. ? Dinamik kontroller. Ba ğlant ılar yeni bir sayfada aç ıld ığı zaman, yeni bir TabPage olu şturulur. Bu sayfan ın içine yeni bir tarayıcı kontrolü oluşturulup eklenir. Daha sonra bu sayfa TabControl nesnesine ekle-nir. Kontrollerin Eklenmesi Yeni bir Windows projesi aç ın ve Toolbox paneline Microsoft Web Tarayıcısını ekleyin. NOT Toolbox paneline kontrol ekleme i şlemleri için Modül 3’e bakın RESİM 9.26: Microsoft Web Tarayıcısı kontrolünün eklenmesi. Form üzerine Tablo 9.49’daki kontrolleri ekleyin ve belirtilen özellikleri ayarla-yın. Windows Programlama 311 TABLO 9.49: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik Değer TextBox – txtAdres Text http:// RadioButton - rbAyniSayfa Checked True RadioButton - rbYeniSayfa GroupBox – GroupBox1 Text LinkLabel – LinkLabel1 Text Ana Sayfa Button – btnSayfaKapat Text Sayfayı Kapat Button – btnTumunuKapat Text Tüm Sayfalar ı Kapat TabControl – TabControl1 TabPages Yeni bir sayfa ekleyin Dock Bottom TabPage – TabPage1 Text Sayfa 1 Taray ıcı – AxWebBrowser1 Dock Fill RESİM 9.27: Internet taray ıcısının tasarımı. Kodların Yaz ılmas ı 1. Form yüklenirken LinkLabel kontrolünün gösterece ği ba ğlant ıyı ve for-mun AcceptButton özelli ğini ayarlayın. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load LinkLabel1.Links.Add(0, 9, "http://www.bilgeadam.com") Me.AcceptButton = btnGit End Sub 312 Modül 9: 2. Yazılan Internet adresine gitmek için kullan ıcı, aynı sayfayı veya yeni açılacak bir sayfay ı kullanabilir. Seçilen duruma göre aynı sayfada ya da farklı sayfada Internet sitesini görüntüleyen kodlar ı yaz ın. Private Sub btnGit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGit.Click ' Girilen bağlantının başında http ifadesi ' bulunmuyorsa bu ifade eklenir If Not txtAdres.Text.StartsWith("http://") Then txtAdres.Text = txtAdres.Text.Insert(0, "http://") End If ' TabControl nesnesinde sayfa yoksa ya da Yeni Sayfa ' seçeneği seçilmişse, adres yeni sayfada gösterilir. If rbYeniSayfa.Checked OrElse TabControl1.TabPages.Count = 0 Then YeniSayfa(txtAdres.Text) Else AyniSayfa(txtAdres.Text) End If End Sub Sub YeniSayfa(ByVal link As String) ' Dinamik kontroller olu şturulur. Dim sayfa As New TabPage(link) Dim tarayici As New AxSHDocVw.AxWebBrowser tarayici.Dock = DockStyle.Fill ' Tarayıcı TabPage kontrolüne eklenir sayfa.Controls.Add(tarayici) ' Oluşturulan sayfa TabControl nesnesine eklenir. TabControl1.TabPages.Add(sayfa) ' Yeni aç ılan sayfa seçili olarak gösterilir TabControl1.SelectedTab = sayfa ' Tarayıcı, verilen bağlantıyı görüntüler tarayici.Navigate(link) End Sub Sub AyniSayfa(ByVal link As String) ' Internet sitesi, seçilen sayfada gösterilir. Dim sayfa As TabPage Windows Programlama 313 sayfa = TabControl1.SelectedTab Dim tarayici As AxSHDocVw.AxWebBrowser ' Tarayıcı, sayfan ın kontrolleri içinde bulunur. ' Sayfada başka kontrol bulunmadığı için, ilk ' kontrol tarayıcıdır. tarayici = sayfa.Controls(0) sayfa.Text = link tarayici.Navigate(link) End Sub 3. Ana sayfa ba ğlant ısı t ıklandığı zaman, BilgeAdam Internet sitesinin yeni bir sayfada aç ılmasını sağlayan kodları yaz ın. Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked YeniSayfa(e.Link.LinkData) End Sub 4. Seçilen sayfayı ve tüm sayfalar ı kapatan kodlar ı yaz ın. Private Sub btnSayfaKapat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSayfaKapat.Click Dim sayfa As TabPage sayfa = TabControl1.SelectedTab If Not sayfa Is Nothing Then sayfa.Dispose() End If End Sub Private Sub btnTumunuKapat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTumunuKapat.Click For Each sayfa As TabPage In TabControl1.TabPages sayfa.Dispose() Next End Sub 314 Modül 9: Lab 2: Dört Haneli Say ı Bulma Oyunu Bu labda, MasterMind oyunundan uyarlanmış 4 haneli sayı bulma oyunu prog-ramlanacaktır. Oyunun i şleyi şi rakamları farklı ya da ayn ı olarak tutulan 4 ha-neli sayının tahmin edilmesidir. Tahmin edilen say ıyla ilgili ipuçları verilir. Yerini tutan rakamlar + ile, yerini tutmayan, ancak say ı içinde geçen rakamlar – ile belirtilir. Örnek: Tutulan say ı: 1980 Tahmin 1: 4952 İpucu: +1 (Sadece 9 rakamı yerini tuttu) Tahmin 2: 9820 İpucu: +1 -2 (0 yerini tuttu, 9 ve 8 bulundu, ancak yeri tutturulamad ı) Bu labda kullanılan kontroller ve teknikler: ? ListBox. Yap ılan tahminleri tutmay ı sağlar. ? DomainUpDown . Oyunun zorluk derecesinin seçilmesini sa ğlar. ? ErrorProvider. Kullan ıcının, tahminleri düzgün formatta girip girmedi-ğini kontrol eder. ? İç İçe Döngüler. Farkl ı rakamları olan sayılar üretmek ve tahminleri kontrol etmek için kullan ılır. Kontrollerin Eklenmesi Form üzerine Tablo 9.50’deki kontrolleri ekleyin ve belirtilen özellikleri ayarla-yın. TABLO 9.50: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik De ğer TextBox – txtTahmin ListBox – ListBox1 DomainUpDown – DomainUpDown1 Items Farklı Sayılar Tekrarlı Sayılar Text Zorluk Seçin Button – btnTahminEt Text Tahmin Et Button – btnYeniOyun Text Yeni Oyun Label – lblMesaj Windows Programlama 315 RESİM 9.28: Dört haneli sayı bulma oyunu tasarımı. Kodların Yaz ılmas ı Sistem tarafından tutulacak say ılar, DomainUpDown kontrolünde yap ılan seçime göre farkl ı ya da ayn ı rakamlara sahip olacaktır. Function SayiUret() As Integer Dim sayi As Integer = DortHaneliSayi() ' Sayıdaki rakamlar tekrar edilebilirse If DomainUpDown1.SelectedIndex = 1 Then Return sayi End If ' Sayının rakamları birbirinden farkl ı ' olana kadar sayı üretilir While Not SayiKontrol(sayi) sayi = DortHaneliSayi() End While Return sayi End Function ? Rakamları birbirinden farkl ı dört haneli say ı üretir. Function DortHaneliSayi() As Integer Randomize() Dim sayi As Integer = Rnd() * 10000 ' Sayı 4 haneli olana kadar tekrar üretilir While sayi < 1000 sayi = Rnd() * 10000 End While Return sayi End Function 316 Modül 9: ? Sayının rakamlarının birbirinden farklı olmas ını kontrol eder. Function SayiKontrol(ByVal sayi As Integer) As Boolean Dim rakamlar() As Char = CStr(sayi).ToCharArray ' Rakamlar tek tek bir birleriyle kontrol edilir ' Tekrarlanan rakam varsa False döner For i As Integer = 0 To rakamlar.Length - 2 For j As Integer = i + 1 To rakamlar.Length - 1 If rakamlar(i) = rakamlar(j) Then Return False End If Next Next Return True End Function ? Yeni oyun düğmesine tıklandığı zaman say ı üretilir ve oyun ba şlar. Private Sub btnYeniOyun_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnYeniOyun.Click BulunacakSayi = SayiUret() lblMesaj.Text = "Yeni Oyun! Say ı üretildi..." End Sub ? Metin kutusunun Validating olay ında, girilen de ğerler kontrol edilir. Private Sub txtTahmin_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtTahmin.Validating If txtTahmin.Text.Length = 4 And IsNumeric(txtTahmin.Text) Then ErrorProvider1.SetError(txtTahmin, "") Else ErrorProvider1.SetError(txtTahmin, "Sayı yanlış girildi") e.Cancel = True End If End Sub ? Tahmin edilen say ının hangi rakamlarının tutuğu kontrol edilir. Public Function TahminKontrol(ByVal sayi As Integer) As String Dim sonuc As String ' Sonuç kümesindeki artı ve eksi sayısı Dim arti As Byte = 0 Windows Programlama 317 Dim eksi As Byte = 0 Dim i, j As Byte Dim sdizi() As Char sdizi = CStr(sayi).ToCharArray Dim sBulunacak() As Char sBulunacak = CStr(BulunacakSayi).ToCharArray ' Yerleri tutan sayılar bulunur For i = 0 To 3 If sdizi(i) = sBulunacak(i) Then arti += 1 End If Next ' Yerleri tutmayan sayılar ın kontrolü For i = 0 To 3 For j = 0 To 3 If i <> j Then If sdizi(i) = sBulunacak(j) Then eksi += 1 Exit For End If End If Next Next If arti = 0 And eksi = 0 Then sonuc = "0" ElseIf arti = 4 Then sonuc = "Tebrikler!" ElseIf arti <> 0 AndAlso eksi <> 0 Then sonuc = "+" & arti & " -" & eksi ElseIf arti = 0 Then sonuc = "-" & eksi End If Return sonuc End Function Private Sub btnTahmin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTahmin.Click ListBox1.Items.Add(TahminKontrol(txtTahmin.Text)) End Sub 318 Modül 9: Lab 3: Hafıza Oyunu Hafıza oyunu, belli say ıda kart içinden ayn ı resme sahip olanlar ın bulunmas ına dayalıdır. Bu labda, form üzerine seçilen seviye kadar kart ekleme i şlemi yap ı-lır. Kontroller çalışma anında eklenece ği için dinamik olarak olu şturulmal ıdır. Bu labda kullanılan kontroller ve teknikler: ? ComboBox. Seviyenin seçilmesi için kullan ılır. ? ImageList. Eklenen kartlar ın resimlerini tutar. ? Dinamik kontroller. Kullanıcının seçti ği seviye kadar kart ekleme iş-lemi için kullanılır. ? Tag . Kontrollerin Tag özelli ği, o kontrole ait bilgi tutmak için kullan ılır. Bu labda, yeni eklenen kartlar ın hangi resmi ta şıyacağı kontrolü Tag özelli-ğinde tutulur. Kontrollerin Eklenmesi Form üzerine Tablo 9.51’deki kontrolleri ekleyin ve belirtilen özellikleri ayarla-yın. TABLO 9.51: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik De ğer ComboBox– ComboBox1 Items 4 Kart 8 Kart 16 Kart ImageList – ImageList1 Images 8 tane resim ekleyin RESİM 9.29: Image Collection Editor. Windows Programlama 319 Kodların Yaz ılmas ı 1. ComboBox kontrolünden seviye seçildi ği zaman, form üzerinde varolan tüm dü ğmelerin silinip, seçilen seviye kadar düğme eklenmesi gerekir. Bu işlem oyunu ba ştan ba şlat ır. Sub KartYerlestir(ByVal kartSayisi As Integer) DugmeleriSil() Dim x As Integer = 10 Dim y As Integer = 50 For i As Integer = 1 To kartSayisi ' Dinamik bir dü ğme oluşturulur ve özellikleri ' ayarlanır Dim kart As New Button kart.Height = 30 kart.Width = 30 kart.******** = New Point(x, y) ' Düğme tıklandığı zaman gerçekeşecek olay AddHandler kart.Click, AddressOf ButonaTiklandi Me.Controls.Add(kart) ' Bir sonraki eklenecek olan dü ğme ' ilk kontrolün 70 piksel sa ğında olacaktır x += 70 ' Düğmenin Form sınırları içinde olmas ı gerekir. If x > Me.Width Then x = 10 y += 50 End If Next KartResimYukle() End Sub 2. Düğmeleri silme işlemi, form üzerindeki tüm dü ğmelerin bir listeye atılıp daha sonra formun kontrollerinden kaldırılarak yap ılır. Sub DugmeleriSil() Dim silinecek As New ArrayList ' Form içindeki Button kontrolleri bir listede tutulur For Each c As Control In Me.Controls 320 Modül 9: If TypeOf c Is Button Then silinecek.Add(c) End If Next For i As Integer = 0 To silinecek.Count - 1 Me.Controls.Remove(silinecek(i)) Next End Sub 3. Kartlara resim yüklerken, her resmin iki karta yüklenmesi gerekir. Sub KartResimYukle() ' Düğmeler bir listeye alınır. Dim dugmeler As New ArrayList For Each c As Control In Me.Controls If TypeOf c Is Button Then dugmeler.Add(c) End If Next Randomize() Dim i As Integer = 0 ' Kartlar ikişer ikişer ele alınır. İki karta da ' ayn ı resim atanır. Ve bu iki kart düğmeler ' listesinden ç ıkartılır. While dugmeler.Count > 0 Dim kart1, kart2 As Button kart1 = dugmeler(Rnd() * (dugmeler.Count - 1)) kart1.Tag = i dugmeler.Remove(kart1) kart2 = dugmeler(Rnd() * (dugmeler.Count - 1)) kart2.Tag = i dugmeler.Remove(kart2) i += 1 End While End Sub 4. Eklenen kartlar tıklandığı zaman, ilk seferde bir kart aç ılır ve resmi gösterilir. İkinci kart aç ıld ığı zaman bu iki kart ın resmi ayn ıysa kart form-dan kald ırılır. Windows Programlama 321 Private AcikKart As Button Private acik As Boolean = False Private Sub ButonaTiklandi(ByVal sender As Object, ByVal e As EventArgs) Dim kart As Button = sender ' Eğer ilk kart açılıyorsa If Not acik Then ' Kart ı görüntüle kart.BackgroundImage = ImageList1.Images(kart.Tag) AcikKart = kart acik = True 'Eğer ikinci kart açılıyorsa Else ' Açılmış kartın resmi, yeni açılan kart ın ' resmi ile aynıysa, bu kartlar silinir If kart.Tag = AcikKart.Tag Then Me.Controls.Remove(kart) Me.Controls.Remove(AcikKart) Else AcikKart.BackgroundImage = Nothing End If acik = False End If End Sub RESİM 9.30: Hafıza oyunu. 322 Modül 9: Lab 4: Hesap Makinesi Bu labda, bir hesap makinesinde kullanılan genel fonksiyonlar gerçekle ştirilecektir. Bu labda 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. Kontrollerin Eklenmesi Form üzerine Tablo 9.52’deki kontrolleri ekleyin ve belirtilen özellikleri ayarla-yın. TABLO 9.52: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik De ğer Button – 0 – 9 arası, her say ı için Button(Sayi) isminde bir dü ğme ekleyin. Örnek: 5 sayısı için Button5 Text Temsil ettikleri say ılar Button – Her i şlem için bir dü ğme ekleyin: Çarpma, bölme, toplama çıkarma, eşitlik, temizleme Text Temsil ettikleri işlemler. * + / - = C RESİM 9. 31: Hesap makinesi. Kodların Yaz ılmas ı 1. İş lemin türünü ve seçildi ğini belirleyen, girilen bir önceki say ıyı tutan global de ğişkenleri yazın. Private IslemSecildi As Boolean = False Private Sayi As Double Private Islem As String Windows Programlama 323 2. 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 3. İş 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 4. 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 324 Modül 9: End Select txtSayi.Text = Sayi End Sub 5. C (temizle) dü ğmesi tıklandığı zaman, metin kutusunu temizleyen ve global de ğişkenleri başlang ıç de ğerlerine getiren kodları yaz ın. 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 Windows Programlama 325 Modül Sonu Soruları & Al ıştırmalar 1. Formun kapanmas ını, şeffafl ığını yavaşça azaltarak sağlamak için, for-mun hangi olay, özellik ve metotlarından faydalan ır? Uygulamas ını ya-zın. 2. Fiziksel olarak bulundukları yerler bir dizide tutulan resimlerin, slayt gösterisi şeklinde gösterilmesi hangi kontroller ile sağlan ır? Uygulama-sını yaz ın. 3. Kurumsal bir şirketin elemanlar ının ba ğlı olduklar ı departmanlar ve mü-dürler hiyerarşik olarak hangi kontrol ile gösterilebilir? Her müdür ve de-partman başka bir müdür ve departmana bağlıdır. Uygulamas ını Structure yap ısını kullanarak ve ilgili kontrollerle birlikte yaz ın. 4. Microsoft Excel ile oluşturulan sayfalar, ayn ı pencerede tutulur. Bir Win-dows uygulamasında sınırs ız sayıda sayfanın aynı form üzerinde tutul-masını hangi kontrol sağlar? Bu sayfalar çalışma anında oluşturulmak istenirse, kontrolün hangi özelliklerinden faydalan ılır? Modül 10: Menü Tasarımı ve MDI Formlar 330 Modül 10: Konu 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 uygulamala-rı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. Bu bölüm tamamland ıktan sonra: ? MainMenu ve ContextMenu kontrolleri ile menü tan ımı yapabilecek, ? ToolBar kontrolü ile tasarımda araç çubuklarını kullanabilecek, ? ToolTip kontrolü ile menü araçlar ının kullanımı hakkında bilgi sa ğlaya-cak, ? StatusBar ve NotifyIcon kontrolleri ile uygulamalar ın tasar ımını zen-ginle ştireceksiniz. Menüler Windows uygulamalarında kullanılan iki tip menü vard ır. MainMenu, formlar ın başında duran sabit menüdür. ContextMenu, fare ile sa ğ t ıklandığında çıkan menüdür. MainMenu Windows uygulamasına bir menü eklemek için, Toolbox panelinden bir MainMenu kontrolünü forma sürükleyin. Eklenen menü bir bileşen olarak for-mun 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 Menü Tasarım ı ve MDI Formlar 331 gelinir ve başlık yazısı yaz ılır. Properties panelinde bu menünün MenuItem ola-rak eklendi ği görülür (Resim 10.1). RESİM 10.1: 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 menuYeni_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menuYeni.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). RESİM 10.2: Kısayol tu şunun belirlenmesi. 332 Modül 10: MenuItem Özellikleri TABLO 10.1: MenuItem Özellikleri Özellik De ğer Tipi Açıklama Checked Boolean Menü öğesinin yan ında seçili olduğuna dair bir i şaretin gözükmesini sağlar. Enabled Boolean Menü öğesinin aktif durumda olup ol-madığı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ım-lar. ShowShortCut Boolean Menünün kısayolunun, isminin yan ında gözükmesini belirler. MenuItems MenuItemCollection Alt menülerin tutuldu ğu koleksiyondur. Örnek: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim dosya As New MenuItem("D&osya") ' Yeni işleminin yapılması için bir menü eklenir. Dim yeni As New MenuItem("&Yeni") yeni.Shortcut = Shortcut.CtrlN yeni.ShowShortcut = True AddHandler yeni.Select, AddressOf YeniClick dosya.MenuItems.Add(yeni) ' Açma işleminin yapılması için bir menü eklenir. Dim ac As New MenuItem("&Aç") ac.Shortcut = Shortcut.CtrlO ac.ShowShortcut = False AddHandler ac.Select, AddressOf AcClick dosya.MenuItems.Add(ac) MainMenu1.MenuItems.Add(dosya) End Sub Private Sub AcClick(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub Private Sub YeniClick(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub Menü Tasarım ı ve MDI Formlar 333 RESİM 10.3: Menü örneği. 334 Modül 10: ContextMenu ContextMenu, bir kontrol sa ğ t ıklandığı zaman aç ılan menüdür. Bu menü uygulamaya eklendiği zaman Properties panelinde, kontrollerin ContextMenu özelliği olarak bu menü atanabilir (Resim 10.4). RESİM 10. 4: ContextMenu özelli ği. RESİM 10.5: ContextMenu örne ği. Menü Tasarım ı ve MDI Formlar 335 ToolBar ToolBar 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. ToolBar kontrolünde yap ılacak i şlemler bir ToolBarButton olarak gösterilir. ToolBar Özellikleri TABLO 10.2: ToolBar Özellikleri Özellik Değer Tipi Açıklama Buttons ToolBarButtonCollection Kontrolün düğmelerinin tu-tuldu ğu koleksiyon ButtonSize Size Kontroldeki dü ğmelerin bü-yüklüğünü belirler. Düğ-melerin büyüklükleri ayrı ayrı belirlenemez. DropDownArrows Boolean Stili DropDownButton ola-rak seçilmiş ToolBarButton dü ğmele-rinin alt menüsünün gö-rünmesini belirler. ToolBar kontrolüne ToolBarButton dü ğmeleri eklemek için kontrolün Buttons özelli ğinden faydalan ılır. Tasar ım anında Properties panelinden Buttons özelli ği t ıklandığı zaman aç ılan pencerede, kontrole dü ğme eklenir (Resim 10.6). 336 Modül 10: RESİM 10.6: ToolBarButton Collection Editor penceresi. ToolBarButton Özellikleri TABLO 10.3: ToolBarButton Özellikleri Özellik De ğer Tipi Açıklama Style ToolBarButtonStyle Düğmenin görünüm stilini belirler. PushButton de ğeri standart bir düğ-meyi, ToggleButton t ıklandığı za-man basılı kalan bir dü ğmeyi, Separator de ğeri dü ğmeler arasında bir ayracı temsil eder. DropDownButton de ğeri dü ğmenin yan ında bir menünün açılaca ğını belir-ler. DropDownMenu Menu Kontrolün stili DropDownButton ola-rak seçilmişse, yanında çıkacak menüyü belirler. Bu menü sadece ContextMenu cinsinden olabilir. Pushed Boolean Düğmenin basılı olup olmad ığını belir-ler. Text String Düğmenin üzerinde yazan yazıyı belir-ler. ImageIndex Integer ToolBar kontrolüne bir ImageList bağlanm ışsa, bu özellik dü ğmenin hangi resmi göstereceğini belirler. ToolTipText String Düğmenin üzerinde durulduğu zaman gösterilecek ipucunu belirler. Menü Tasarım ı ve MDI Formlar 337 Düğmeler tıklandığı zaman çalışması istenen kodlar, ToolBar kontrolünün ButtonClick olayına yaz ılır. Ancak burada hangi dü ğmenin tıklandığının kod yazarak bulunmas ı gerekir. RESİM 10.7: ToolBar örne ği. Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick Select Case ToolBar1.Buttons.IndexOf(e.Button) ' Ayraçlar da bir ToolBarButton oldu ğu için ' indisler kontrol edilirken buna dikkat edilmelidir Case 0 ' Kopyala Case 1 ' Kes Case 2 ' Yapıştır Case 4 ' Geri Al Case 6 ' Yardım End Select End Sub 338 Modül 10: ToolTip Bu kontrol, form üzerindeki kontrollerin üzerine gelindi ği zaman ipucu göster-mek için kullanılır (Resim 10.9). 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 (Resim 10.8). ToolTip Özellikleri TABLO 10.4: ToolTip Özellikleri Özellik Değer Tipi Açıklama Active Boolean Kontrolün aktif olup olmadığını belirler. False değerini alırsa, form üzerinde ipuçları görüntü-lenmez. AutomaticDelay Integer AutoPopDelay, InitialDelay , ReshowDelay de ğerleri için otomatik süreleri ayarlar. AutoPopDelay Integer İpucunun görüntülenme süresini belirler. InitialDelay Integer İpucunun gözükmesi için, fare imlecinin kontrol üzerinde durmas ı gereken süreyi belirler ReshowDelay Integer Yeni bir kontrolün üzerine gelindiği zaman, bu kontrole ait ipucunun gösterilmesi için gereken süreyi belirler. ShowAlways Boolean Seçilen kontrol aktif olmadığı zamanlarda dahi ipucunun gösterilmesini sa ğlar. Menü Tasarım ı ve MDI Formlar 339 RESİM 10.8: ToolTip özellikleri. RESİM 10.9: ToolTip kontrolü örne ği. 340 Modül 10: StatusBar 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. StatusBar Özellikleri TABLO 10.5: StatusBar Özellikleri Özellik De ğer Tipi Açıklama Panels StatusBarPanel Collection Kontrolün içinde birden fazla yazı görüntü-lemek için kullan ılan panelleri tutar. ShowPanels Boolean Birden fazla panelin gözükmesini belirler. SizingGrip Boolean StatusBar kontrolünün yanında, formun büyüklü ğünü değiştirmek için kullanılan sim-genin gözükmesini belirler. Text String StatusBar üzerinde yazan yaz ıyı belirler. Eğer ShowPanels özelli ği True ise, bu özellikte yaz ılan yaz ı gözükmez. StatusBar kontrolüne panel eklemek için kontrolün Panels özelli ğinden yararlanılır. Menü Tasarım ı ve MDI Formlar 341 RESİM 10.10: StatusBarPanel Collection Editor penceresi. Panel Özellikleri TABLO 10.6: Panel Özellikleri Özellik De ğer Tipi Açıklama AutoSize StatusBarPanel AutoSize Panelin bazı durumlara göre otomatik bo-yutlandırmasını sa ğlar. None de ğeri, panelin büyüklüğünün de ğişmeyeceğini, Contents de ğeri, panelin içerdiği yazıya göre değişece ğini belirler. Spring de ğeri, durum çubu ğundaki bo ş alanlar ın payla-şılmasını sa ğlar. BorderStyle StatusBarPanel BorderStyle Panelin kenarlık stilidir. Raised de ğeri, panelin bir düğme gibi gözükmesini, Sunken de ğeri, panelin basık gözükmesini sağlar. None de ğeri, kenarlar ın gözükme-sini engeller. Alignment Horizontal Alignment Panelin yazısının hizalanmasının belirler. Text String Panel üzerinde yazan yaz ıyı belirler. Width Integer Panelin geni şli ğini belirler. MinWidth Integer Panel büyüklüğünün minimum de ğerini belirler. Style StatusBar PanelStyle Panelin üzerindeki yazıların stilini belirler. Text de ğeri, normal yazı gözükmesini sağlar. OwnerDraw, de ğişik font ve renk-lerde yaz ıların görüntülenmesini sağlar. Icon Icon Panel üzerinde görüntülenen simgeyi be-lirler. 342 Modül 10: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim p As New StatusBarPanel p.MinWidth = 100 p.AutoSize = StatusBarPanelAutoSize.Contents p.Alignment = HorizontalAlignment.Left p.BorderStyle = StatusBarPanelBorderStyle.Raised p.Style = StatusBarPanelStyle.Text StatusBar1.Panels.Add(p) Timer1.Interval = 1000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim panel As New StatusBarPanel panel = StatusBar1.Panels(0) panel.Text = Now End Sub RESİM 10.11: StatusBar kontrolü örne ği. Menü Tasarım ı ve MDI Formlar 343 NotifyIcon Windows uygulamalarının Windows görev çubu ğunda görüntülenen simgesini belirler. RESİM 10.12: NotifyIcon kontrolü örne ği. NotifyIcon Özellikleri TABLO 10.7: 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 ya-zıyı belirler. 344 Modül 10: 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 sadece 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 (Resim 10.12). RESİM 10.12: RichTextBox kontrolü örne ği. 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. Ta s a rım sıras ında ulaşılabilen özellikler: Menü Tasarım ı ve MDI Formlar 345 TABLO 10.8: RichTextBox Ta s a r ım Sıras ında Ulaşılabilen Özellikler Özellik Değer Tipi Açıklama ZoomFactor Single Metnin büyüklüğünü belirler. 1 – 64 arası bir de ğer alır. WordWrap Boolean Uzun yazıların bir sonraki satıra geçerek görüntülenmesini sağlar. DetectUrls Boolean Bağlant ı olarak girilen yazıların LinkLabel şeklinde algılanmas ını belir-ler. 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ılan-masını, dolayısıyla bu tuşa basıld ığında kontrolden ç ıkılmasının engellenmesini be-lirler. ShowSelectionMargin Boolean Satır ba şındaki boşlu ğun gösterilmesini belirler. RightMargin Integer Satırlar ın maksimum uzunluğunu piksel cinsinden belirler. Çalışma sıras ında ulaşılabilen özellikler: TABLO 10.9: RichTextBox Çal ışma Sıras ında Ulaşılabilen Özellikler Özellik Değer Tipi Açıklama Capture Boolean Kontrol içine yaz ı yazarken farenin gizlenme-sini belirler. UndoActionName String En son yapılabilecek Undo i şleminin tipini tutar. RedoActionName String Undo işlemi yapıld ıktan sonra, en son yap ı-labilecek Redo işleminin ismini tutar. SelectedText String Seçilen metni belirler. SelectionBullet Boolean Seçilen satırın madde i şaretli olarak görün-tü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ı be-lirler. SelectionLength Integer Seçilen metnin uzunluğunu belirler. 346 Modül 10: RichTextBox Metotları TABLO 10.10: RichTextBox Metotları Metot Açıklama Find Metin kutusu içinde, parametre olarak verilen bir yazıyı arar. Yaz ıyı ilk gördü ğü yerin indisini döndürür. LoadFile Bir dosyadan alınan metni yükler. SaveFile Parametre olarak verilen konumdaki dosyaya, metni yazar. Dosyanın *.rtf veya *.doc uzant ılarında kaydedilmesi, zengin içeriğin görüntülenmesi aç ısından önemlidir. Undo Yap ılan i şlem geriye alınır. Redo Geri alınan işlem tekrar yap ılır. RichTextBox Olayları TABLO 10.11: 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. Menü Tasarım ı ve MDI Formlar 347 Lab 1: Notepad Uygulaması Bu labda, RichTextBox kontrolünün sa ğlad ığı kolayl ıklarla bir metin editörü uy-gulamas ı 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 10.13: Notepad uygulaması. Bu labda kullanılan kontroller ve teknikler: ? MainMenu. 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. ? NotifyIcon . Uygulamanın simgesinin görev çubuğunda gözükmesini sağlar. ? ToolBar. Kaydetme, dosya açma, hizalama gibi i şlemlere kısayollar sağlamak için kullan ılır. ? ImageList. Araç çubuğundaki düğmeleri resimlerini belirlemek 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. ? StatusBar. Dosyalar aç ıld ığı zaman isimlerini ve kayıt durumlar ını gö-rüntülemek için kullan ılır. Kontrollerin Eklenmesi Form üzerine Tablo 10.12’deki kontrolleri ekleyin ve belirtilen özellikleri ayarla-yın. 348 Modül 10: TABLO 10.12: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik Değer ContextMenu – ContextMenu1 Geri Al, Kes, Kopyala, Yapıştır, Sil, Tümünü Seç değerlerini içeren menü öğeleri ekleyin. ContextMenu – ContextMenu2 Gizle değerini içeren bir menü öğesi ekleyin. ToolBar – ToolBar1 Buttons Kaydet, Aç, Kopyala, Kes, Yapıştır, Undo, Redo, Madde İş aretle, Sola Hizala, Sağa Hi-zala, Ortala komutlar ı için dü ğmeler ekleyin. Her düğmenin ImageIndex özelli ğine, ImageList içinde bulunan resimlerden uy-gun olanın indisini atayın. ImageList – ImageList1 Images Araç çubu ğundaki öğeleri temsil eden re-simler ekleyin. OpenFileDialog -OpenFileDialog1 SaveFileDialog -SaveFileDialog1 FontDialog - FontDialog1 StatusBar - StatusBar1 ShowPanels True Panels İki tane panel ekleyin. İlk panelin AutoSize özelliğini Contents olarak belirleyin. NotifyIcon - NotifyIcon1 Icon Uygulamanız için bir simge seçin Text "Notepad Uygulamas ı" RichTextBox – RichTextBox1 Dock True Uygulamaya son olarak bir MainMenu ve ilgili alanlara MenuItem ö ğelerini ekle-yin. Parantez içinde belirtilen tuşlar, menü ö ğelerine erişmek için kullanılacak kısayollard ır. Bu değerleri, menü ö ğelerinin ShortCut özelli ğine ekleyin. ? Dosya ? Yeni (Ctrl+ N) ? Aç ( Ctrl+O ) ? Kaydet (Ctrl+ S) ? Farklı Kaydet ? Çıkış Menü Tasarım ı ve MDI Formlar 349 ? 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 ? Sola Hizala ? Sağa Hizala ? Ortala ? Madde İş aretle ? Araç çubuğunu gizle ? Yard ım ? Hakkında Uygulamaya frmBul isminde yeni bir form ekleyin. Bu form, metin kutusunda aranan değeri bulmak için kullan ılacakt ır. Forma, arama işlemleri için gereken kontrolleri ekleyin. TABLO 10.13: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik De ğer Button – Button1 DialogResult DialogResult.OK Text "Bul " Button – Button2 Text "İptal" CheckBox – cbTumKelimeyiSec Text "Bulduktan sonra tüm kelimeyi seç " Checked True TextBox – txtAranan Kontrolleri ekledikten sonra Button1 ve Button2 dü ğmelerinin Click olayına, formu kapatan kodlar ı yaz ın: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click Me.Close() End Sub 350 Modül 10: RESİM 10.14: Notepad Bul işlemi. Uygulamaya frmHakkinda isminde yeni bir form ekleyin. Bu form, uygulama bilgilerini içerir. RESİM 10.15: Notepad Hakkında penceresi. Kodların Yaz ılmas ı ? Dosya ismini ve dosyanın kaydedilip edilmedi ğini tutan de ğişkenleri ta-nı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. Böylece kodun karma şıkl ığı azalır ve de ğişiklik yapmak ko-layla şır. ? Durum çubuğunda değişiklik yapma i şlemlerini yaz ın. Durum çubuğu, dosya açma kaydetme gibi i şlemler sonunda de ğişecektir. Sub DurumDegistir() ' İlk panele dosya ismi yazılır StatusBar1.Panels(0).Text = DosyaIsmi ' İkinci panele kayıt durumu yazılır If Kaydedildi Then StatusBar1.Panels(1).Text = "Kaydedildi" Else Menü Tasarım ı ve MDI Formlar 351 StatusBar1.Panels(1).Text = "Kaydedilmedi" End If End Sub ? Dosyaya kaydetme ve farklı kaydetme i şlemlerini yazın. ' Kaydetme işlemi Sub Kaydet() If DosyaIsmi = "" Then FarkliKaydet() Else RichTextBox1.SaveFile(DosyaIsmi) Kaydedildi = True End If DurumDegistir() 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 DurumDegistir() 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 352 Modül 10: ' İş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 ' Yeni bir dosya açılır RichTextBox1.Clear() DosyaIsmi = "" End If Kaydedildi = True DurumDegistir() 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) Menü Tasarım ı ve MDI Formlar 353 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. DİKKAT Bu kodda belirtilen indis numaraları, uygulaman ızda ToolBar kontrolüne ekledi ğiniz düğmelerin indis numaraları ile farkl ılık gösterebilir. Yapılan i şlemler yorum sat ırı olarak geçilmi ştir. Bu i şlemleri, dü ğmelerin indislerine göre tekrar düzenleyin. Düğmelerin indislerini ö ğrenmek için ToolBar kontrolünün Buttons özelli ğine bakın. Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick ' Bas ılan düğmenin indisine göre işlem yapılır. Select Case ToolBar1.Buttons.IndexOf(e.Button) Case 0 'Kaydet Kaydet() Case 1 ' Ac DosyaAc(False) Case 3 ' Kopyala RichTextBox1.Copy() Case 4 ' Kes RichTextBox1.Cut() Case 5 354 Modül 10: ' Yapıştır RichTextBox1.Paste() Case 7 ' Geri Al RichTextBox1.Undo() Case 8 ' Tekrarla RichTextBox1.Redo() Case 10 ' Madde işaretle RichTextBox1.SelectionBullet = Not RichTextBox1.SelectionBullet Case 11 ' Sola Hizala RichTextBox1.SelectionAlignment = HorizontalAlignment.Left Case 12 ' Ortala RichTextBox1.SelectionAlignment = HorizontalAlignment.Center Case 13 ' Sağa Hizala RichTextBox1.SelectionAlignment = HorizontalAlignment.Right End Select 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 DurumDegistir() End Sub Menü Tasarım ı ve MDI Formlar 355 ? Uygulama kapanırken dosyanın kaydedilip kaydedilmeyeceğini soran kodlar ı yaz ın. ' Kapanırken dosyanın kaydedilmesi kontrol edilir. Private Sub Form3_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 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 ? Her menü öğesinin alt ına, ilgili i şlemleri yaz ın. Burada dikkat edilmesi gereken nokta, bazı ContextMenu ö ğelerinin ve MainMenu ö ğelerinin aynı i şlemi yapt ığıdır. Örne ğin “Geri Al” komutu, her iki menüde de var-dır. Bu kodları farklı yordamlar yerine, ayn ı yordam ın içine yazarak Handles ifadesine iki menü ö ğesinin Click olay ı yaz ılır. Örnek: Private Sub MenuItem19_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem19.Click, MenuItem5.Click RichTextBox1.Undo() End Sub DİKKAT Bu kodda belirtilen menü isimleri, uygulamanızda MainMenu veya ContextMenu kontrolüne eklediğiniz menülerin isimleri ile farklılık gösterebilir. Yap ılan i şlemler yorum sat ırı olarak geçilmi ştir. İlgili menü öğesini çift tıklayarak Click olayında, burada belirtilen i şlemleri yaz ın. ' Yeni Dosya aç Private Sub MenuItem13_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem13.Click DosyaAc(True) End Sub ' Dosya Aç 356 Modül 10: Private Sub MenuItem14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem14.Click DosyaAc(False) End Sub ' Kaydet Private Sub MenuItem15_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem15.Click Kaydet() End Sub ' Farklı Kaydet Private Sub MenuItem16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem16.Click FarkliKaydet() End Sub ' Çık Private Sub MenuItem18_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem18.Click Application.Exit() End Sub ' Geri al Private Sub MenuItem19_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem19.Click, MenuItem5.Click RichTextBox1.Undo() End Sub ' Kes Private Sub MenuItem21_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem21.Click, MenuItem7.Click RichTextBox1.Cut() End Sub ' Kopyala Private Sub MenuItem22_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem22.Click, MenuItem8.Click RichTextBox1.Copy() End Sub Menü Tasarım ı ve MDI Formlar 357 ' Yapıştır Private Sub MenuItem23_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem23.Click, MenuItem9.Click RichTextBox1.Paste() End Sub ' Yazı sil Private Sub MenuItem24_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem24.Click, MenuItem10.Click ' 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 yaz ıyı seç Private Sub MenuItem28_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem28.Click, MenuItem12.Click RichTextBox1.SelectAll() End Sub ' Yazı tipini seç Private Sub MenuItem36_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem36.Click ' 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 ' Sola Hizala Private Sub MenuItem29_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem29.Click RichTextBox1.SelectionAlignment = HorizontalAlignment.Left End Sub 358 Modül 10: ' Sa ğa Hizala Private Sub MenuItem30_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem30.Click RichTextBox1.SelectionAlignment = HorizontalAlignment.Right End Sub ' Ortala Private Sub MenuItem31_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem31.Click RichTextBox1.SelectionAlignment = HorizontalAlignment.Center End Sub ' Madde i şaretle Private Sub MenuItem33_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem33.Click RichTextBox1.SelectionBullet = Not RichTextBox1.SelectionBullet End Sub ' Hakkında formunun gösterilmesi Private Sub MenuItem34_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem34.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 MenuItem37_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem37.Click, MenuItem38.Click ToolBar1.Visible = MenuItem37.Checked MenuItem37.Checked = Not MenuItem37.Checked End Sub ' Dosya bulunması Private Sub MenuItem26_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem26.Click Bul() End Sub End Class Menü Tasarım ı ve MDI Formlar 359 MDI Formlar Multiple ******** Interface formlar ı, içinde birden fazla form bar ındıran formlard ır. MDIChild olarak eklenen bu formlar birbirinden tamamen ba ğımsız-dır. Örne ğin bir Excel dosyas ı içinde birden fazla sayfa olabilir. Bu sayfalar ana forma ba ğlıdır. Ana form kapandığı zaman bu sayfalar da kapan ır. MDIParent olarak nitelendirilen bu ana formların, MDIChild 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 (Resim 10.16). RESİM 10.16: isMDIcontainer özelli ği. MDI formlara alt formlar eklemek için, form oluşturma i şlemleri bilinen ş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() 360 Modül 10: Bir formun sahip olduğu alt formlara ulaşmak için, MDIChildren özelli ğinden yararlanılır. Bu özellik tek boyutlu bir form dizisidir. ' Tüm formlar ı kapatır. ' Alt formlar kapandığı zaman, dizi otomatik olarak ' yeniden boyutlandırılır. While Me.MdiChildren.Length > 0 Me.MdiChildren(0).Close() End While ' Tüm formlar ı Minimize eder For i As Integer = 0 To Me.MdiChildren.Length - 1 Me.MdiChildren(i).WindowState = FormWindowState.Minimized Next RESİM 10.17: MDI formlar. Alt formlar genişletildiklerinde, form üzerinde yazan ba şlık ana forma taşınır. Alt formda tan ımlı bir menü, ana formun menüsü ile birle şir. Bu menü birle şim i şle-mine Merge denir. Menü öğeleri, varsayılan durumda ana formdaki menülerin yan ına eklenir. Ancak menü ö ğelerinin MergeType özelli ği ile varsay ılan de ğer değiştirilebilir. ? MergeType.Add. Varsayılan de ğerdir. Bu de ğeri alan menü ö ğeleri, bir-le şme sonucunda menüye eklenir. ? MergeType.MergeItem . Bu değeri alan menüler, sonuç menüsünde aynı MergeOrder de ğerindeki menülerle birle şir. ? MergeType.Replace . Birle şme sonucunda bu menü, aynı MergeOrder değerinde olan öğe ile değiştirilir. ? MergeType.Remove. Birleşme sonucunda bu menü ç ıkart ılır. RESİM 10.18: Ana formdaki menü. Menü Tasarım ı ve MDI Formlar 361 RESİM 10.19: Alt formdaki menü. RESİM 10.20: Birleştirilmi ş menü. Alt formlar, ana forma basamak şeklinde eklenir. Birçok alt form ile çal ışılıyorsa, bu formların düzenlenmesine ihtiyaç duyulur. Alt formlar ı düzenlemek için for-mun LayoutMdi metodu kullanılır. Me.LayoutMdi(MdiLayout.TileHorizontal) Me.LayoutMdi(MdiLayout.TileVertical) Me.LayoutMdi(MdiLayout.Cascade) Me.LayoutMdi(MdiLayout.ArrangeIcons) MDI Form içindeki alt formlardan seçili olana ulaşmak için, formun ActiveMdiChild özelliği kullan ılır. If Not Me.ActiveMdiChild Is Nothing Then Me.Text = Me.ActiveMdiChild.Text End If 362 Modül 10: Fare Olayları Fare olayları, formlar üzerinde farenin bir tu şunun t ıklanmas ı ya da bir kontro-lü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ı belir-ler. Ö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. Menü Tasarım ı ve MDI Formlar 363 Lab 2: File Browser Bu labda, verilen bir konumdaki klasörlerin listelenmesi ve seçilen klasörün bilgilerinin alt formlarda görünmesi uygulamas ı gerçekle ştirilecektir. RESİM 10.21: File Browser uygulaması. Bu labda kullanılan kontroller ve teknikler: ? MainMenu. Klasörlerin görüntülenece ği konumu belirlemek, yeni klasör eklemek ve klasör silmek gibi i şlemler için kullan ılır. ? ContextMenu. Seçilen klasörün alt klasörleri ni listelemek ve klasörü liste-den kald ırmak için kullan ılır. ? TreeView. Belirtilen konumdaki klasörleri ve alt klasörleri listelemeyi sa ğ-lar. ? StatusBar. Seçilen dosyaların konumlar ını görüntülemeyi sa ğlar. ? ListBox. Alt klasörlerin listelenmesi için kullanılır. Kontrollerin Eklenmesi Form üzerine Tablo 10.14’teki kontrolleri ekleyin ve belirtilen özellikleri ayarla-yın. TABLO 10.14: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik De ğer Form isMDIContainer True ContextMenu – ContextMenu1 Alt Klasörler ve Kald ır de ğerlerini içeren menü ö ğelerini ekleyin. 364 Modül 10: TABLO 10.14: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik De ğer MainMenu – MainMenu1 Yeni Konum ve Dosya Bilgileri değerlerini içeren menü öğelerini ekleyin. StatusBar – StatusBar1 TreeView – TreeView1 Uygulamaya DosyaBilgileri isminde yeni bir form ekleyin. Form içine Tablo 10.15’teki kontrolleri ekleyin ve özelliklerini ayarlay ın. TABLO 10.15: Eklenecek Kontroller Kontrol – Kontrol İsmi Özellik Değer MainMenu – MainMenu1 Yeni, Sil ve Kapat değerlerini içeren menü öğelerini ekleyin. ListBox – ListBox1 Dock Fill Kodların Yaz ılmas ı Ana Form ? Belirtilen konumdaki klasörleri listeleyen kodları yaz ın. Function KlasorleriAl(ByVal konum As String) As String() Dim klasorler() As String = System.IO.Directory.GetDirectories(konum & "\") For i As Integer = 0 To klasorler.Length - 1 klasorler(i) = klasorler(i).Remove(0, konum.Length + 1) Next Return klasorler End Function ? Form üzerinde görüntülenecek klasörlerin bulunduğu yeri tutan değiş-keni ve yeni formun açılmasını yaz ın. Private YeniKonum As String Sub FormBilgileri() Dim f As New DosyaBilgileri f.MdiParent = Me f.Text = YeniKonum & TreeView1.SelectedNode.FullPath Menü Tasarım ı ve MDI Formlar 365 f.KlasorleriListele() f.Show() End Sub ? Yeni konumu seçen menü alt ına, TreeView kontrolünde alt klasörleri listeleyen kodlar ı yaz ın. ' Yeni konumun seçilmesi Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click YeniKonum = InputBox("Konum girin:", "Yeni Konum", "C:\") Dim klasorler() As String = KlasorleriAl(YeniKonum) For i As Integer = 0 To klasorler.Length - 1 TreeView1.Nodes.Add(klasorler(i)) Next TreeView1.SelectedNode = TreeView1.Nodes(0) End Sub ? TreeView kontrolünde bir klasör seçildi ği zaman durum çubu ğunda klasörün ismini görüntüleyen kodlar ı yaz ın. Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect StatusBar1.Text = YeniKonum & TreeView1.SelectedNode.FullPath End Sub ? ContextMenu içinde tanımlanan işlemleri yaz ın. ? Alt klasörlerin listelenmesi. ' Alt klasörler Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click Dim secilen As TreeNode = TreeView1.SelectedNode secilen.Nodes.Clear() Dim konum As String = YeniKonum & secilen.FullPath Dim altKlasorler() As String = KlasorleriAl(konum) 366 Modül 10: For i As Integer = 0 To altKlasorler.Length - 1 secilen.Nodes.Add(altKlasorler(i)) Next End Sub ? Klasörün kald ırılma i şlemi. ' Seçilen klasörün listeden kaldırılma işlemi Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem4.Click Dim secilen As TreeNode = TreeView1.SelectedNode If secilen Is Nothing Then Exit Sub If secilen.Parent Is Nothing Then TreeView1.Nodes.Remove(secilen) Else secilen.Parent.Nodes.Remove(secilen) End If End Sub ? Dosya bilgilerini görüntüleyen kodlar ı yaz ın. ' Dosya bilgileri – MainMenu öğesine tıklandığında Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click FormBilgileri() End Sub ' Dosya bilgileri – TreeView öğesine çift tıklandığında Private Sub TreeView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseDown If e.Clicks = 2 Then FormBilgileri() End If End Sub ? Farenin ortadaki tekerle ğinin döndürülmesi i şleminde, TreeView içinde seçilen ö ğeden bir önceki veya bir sonraki ö ğeye gidilmesi için gereken kodlar ı yaz ın. Private Sub TreeView1_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseWheel If TreeView1.SelectedNode Is Nothing Then Exit Sub Menü Tasarım ı ve MDI Formlar 367 If e.Delta < 0 Then Dim sonraki As TreeNode = TreeView1.SelectedNode.NextNode If Not sonraki Is Nothing Then TreeView1.SelectedNode = sonraki End If Else Dim onceki As TreeNode = TreeView1.SelectedNode.PrevNode If Not onceki Is Nothing Then TreeView1.SelectedNode = onceki End If End If End Sub DosyaBilgileri formunda yaz ılacak kodlar: ? Alt klasörlerin listelendiği kodları yaz ın. Sub KlasorleriListele() ListBox1.Items.Clear() Dim klasorler() As String = System.IO.Directory.GetDirectories(Me.Text & "\") For i As Integer = 0 To klasorler.Length - 1 ListBox1.Items.Add(klasorler(i)) Next End Sub ? Yeni klasörün eklenmesi için gereken kodları yaz ın. Private Sub MenuItem3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click Dim yeniKlasor As String = InputBox("Yeni klasör ismi girin:") yeniKlasor = yeniKlasor.Insert(0, Me.Text & "\") System.IO.Directory.CreateDirectory(yeniKlasor) KlasorleriListele() End Sub ? Seçilen klasörün silinmesini sa ğlayan kodları yaz ın. Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click Dim silinecek As String 368 Modül 10: silinecek = ListBox1.SelectedItem System.IO.Directory.Delete(silinecek, True) KlasorleriListele() End Sub Menü Tasarım ı ve MDI Formlar 369 Modül Sonu Soruları & Al ıştırmalar 1. MainMenu ve ContextMenu nesnelerini ve kullan ım alanlar ını açıklay ın. Kontrolleri içeren bir uygulama geliştirin. 2. ImageList kontrolünün kullanım amacını ve nasıl kullan ıld ığını açıkla-yın. Kontrolü içeren bir uygulama geli ştirin. 3. SDI ve MDI form yapılarını açıklay ınız ve her iki tür için birer örnek uygulama geli ştirin. Modül 11: Veri Yapılar ı Birçok şirket, kurum ve kayıtlar ını tutan yapılar için verilerin önemi çok büyük-tür. Verilerin kağıt üzerinde tutulmas ı, hem aramalar ın yapılması, hem de kay ıt düzeni açısından çok zor bir yöntemdir. Bilgisayarların iş yaşamında kullanıl-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 modülde Microsoft Access veritaban ı üze-rinde veri yap ılarının kullanılması i şlenecektir. Bu modülü tamamlad ıktan sonra; ? Microsoft Access ortamını tan ıyacak, ? Veritabanlarında kullanılan de ğişik veri tiplerini tanıyacak, ? Veri modelleme tekniklerini ö ğreneceksiniz. 374 Modül 11: Konu 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ı ana-liz 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. Veri Yap ıları 375 Access Ortamı Access ortam ı, veritaban ı geli ştirirken kullan ıcıya birçok kolaylık sunar. Access açıld ığı zaman sa ğ panelde “Görev Bölmesi” ç ıkar (Resim 11.1). Bu panel bir-çok i şleme k ısayol sağlar. ? Başlang ıç. Access Office Online ba şlang ıç sayfas ıdır. Microsoft haber sitelerine bağlant ıları ve en son aç ılan veritabanlar ını listeler. ? Yardım. Online yardım seçeneklerini sunar. ? Arama sonuçları. Online yardımda bulunan sonuçları listeler. ? Dosya arama. Belirtilen yerde, belli tipte dosyalar ı aramay ı sağlar. ? Yeni dosya. Yeni bir veritaban ı dosyası veya veri eri şim dosyas ı aç-mak için kullanılır. RESİM 11.1: Görev Bölmesi. 376 Modül 11: Boş veritabanı açma komutu verildi ği zaman, “Yeni Veritabanı Dosyas ı” ileti şim kutusunda dosya ismi girilip yeni veritaban ı olu şturulur. Olu şturulan veritabanı dosyalar ının uzantısı *.mdb olur. Daha önceden olu şturulmuş bir veritaban ını açmak için Dosya menüsünden Aç komutu verilir. Ctrl+O k ısayolu da dosyalar ı açmak için kullan ılabilir. Veritaban ı açıld ığı zaman, veritaban ı üzerinde yap ılabilecek tüm işlemleri su-nan bir pencere çıkar (Resim 11.2). Veritabanı nesnelerini yönetilmesi bu pen-cere ile yap ılır. Sol panelde bulunan Nesneler sekmesinde, veritaban ında bulu-nabilecek tüm nesneler listelenir. Bir nesne tipi seçildi ğinde, veritaban ında bulunan bu tipteki tüm öğeler görüntülenir. Örneğin, Tablolar sekmesine gelindi ğinde veritabanı üzerindeki tablolar görüntülenir, yeni tablo olu şturmak için seçenekler sunulur. RESİM 11.2: Veritabanı penceresi. Veritabanı Nesnesi Olu şturmak Veritaban ı penceresinde nesneleri oluşturmak için farklı kısayollar bulunur. Tabloları olu şturmak için bu k ısayollardan yararlanılabilir. ? Tasarım görünümünde tablo oluştur. Bu seçenek ile tablodaki verile-rin tasar ımı tamamen kullanıcıya bırak ılmıştır. Kullan ıcı alan adlar ını kendisi girip, ilgili veri tipini ve gerekli ayarları seçebilir (Resim 11.3). ? Sihirbaz kullanarak tablo olu ştur. Access içinde çok s ık karşıla şılan, kullanıcıya büyük hız sa ğlayan sihirbaz yard ımı ile tablo olu şturulur. Sihirbaz, hangi tipte tablo olu şturulaca ğını, önceden haz ırlanm ış zengin şablonları kullan ıcıya sunarak belirler (Resim 11.4). ? Veriler girerek tablo oluştur. Bu seçenek ile tablolar veri girişi ile oluşturulur (Resim 11.5). Access kullan ıcının girdi ği verilere göre alan sayısını ve tiplerini belirler. Ancak alan adları daha sonradan değiştirilmelidir (Resim 11.6). Veri Yap ıları 377 RESİM 11.3: Ta s a r ım görünümünde tablo oluşturmak. RESİM 11.4: Sihirbaz ile tablo oluşturmak. RESİM 11.5: Veri girerek tablo olu şturmak. Oluşturulan tablolar tasar ım ve veri sayfası görünümlerinde incelenebilir. Veri sayfas ı görünümü, veri giri şinde kullan ıcıya büyük kolaylık sa ğlar. Örneğin, Evet/Hay ır veri tipindeki bir alana veri girilmesi için bir CheckBox görüntülenir. Ayr ıca tablonun ili şkide oldu ğu tablolar bulunur ve alt tablo olarak kullanıcıya sunulur (Resim 11.7). 378 Modül 11: RESİM 11.6: Alan adlar ının değiştirilmesi. RESİM 11.7: Veri sayfasında ili şkili tabloların görüntülenmesi. Tablolar olu şturulduktan sonra, aralarındaki ilişkilerin kurulmas ı ve görüntülen-mesi için araç çubuğundaki “İli şkiler” düğmesi kullanılır (Resim 11.8). RESİM 11.8: İli şkiler düğmesi. Veri Yap ıları 379 Konu 2: Veri Yapılar ına Giriş 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. Örneğin kategori tablosunda tutulan verilerin sayısı genellikle azd ır ve çok fazla artmaz. Dolay ısıyla bu verilerin tekil alanında tutu-lan sayının çok büyük veri tipinde olması gerekmez. Ancak makalelerin tutul-duğu bir alan ın kapasitesinin çok büyük olması gerekir. 380 Modül 11: Metin Veri Tipleri ? Metin (Text). Metin bilgilerini tutmak için tan ımlanan veri tipidir. Bu de-ğere girilebilecek maksimum karakter sayısı 255’tir. Bir alana belirtilen uzunluktan küçük bir değer girildiğinde, kalan boş yerler için kaynak ayrılmaz. Metin veri tipi say ısal de ğerler de içerebilir. ? Not (Memo). Maksimum 65535 karakter tutar. Büyük metinsel veriler için tercih edilmelidir. Say ısal Veri Tipleri Sayı veri tipinin birden fazla alan büyüklü ğü vard ır. ? Bayt (Byte). 0 ile 255 aras ında bir say ı. ? Tamsayı ( Integer). –32,768 ile 32,767 arasında bir say ı. ? Uzun Tamsayı ( Long Integer). –2,147,483,648 ile 2,147,483,647 aras ında bir say ı. ? Tek (Single). Negatif sayı aral ığı: –3.402823E+38 ile –1.401298E–45 Pozitif sayı aral ığı: 1.401298E–45 ile 3.402823E38. ? Çift (Double). Negatif say ı aralığı: 1.79769313486231E+308 ile – 4.94065645841247E–324. Pozitif sayı aralığı: 1.94065645841247E– 324 ile 1.79769313486231E+308. ? Ondalık (Decimal). –10^38–1 ile 10^38–1 aras ında sayı. ? Otomatik Sayı ( AutoNumber ) veri tipi, alana veri girildiği zaman otoma-tik olarak belirlenen sayıları ifade eder. Sayılar rasgele ya da birden başlayarak girilir. Tarih Veri Tipi Tarih alanları için de ğişik büyüklüklerde depolama seçenekleri sunar. ? Genel Tarih. K ısa Tarih ve Uzun Saat birleşimi bir görünümdür. ? Uzun Tarih. 12 Aralık 2004 Pazar format ında görünür. ? Orta Uzunlukta Tarih. 12 Ara 2004 format ında görünür. ? Kısa Tarih. 12.12.2004 format ında görünür. ? Uzun Saat. 15:11:19 format ında görünür. ? Kısa Saat. 15:11 format ında görünür Evet/Hay ır Veri Tipi Bir bit de ğerinde, Evet ve Hay ır de ğerlerini alan veri tipidir. Veri sayfalarında veya sorgu sonucunda bir CheckBox ile ifade edilir. E ğer seçili ise bu alan ın de-ğeri -1, de ğilse 0 olur. Bu alan sorgulan ırken -1 ve 0 de ğerleri kontrol edilmeli-dir. Veri Yap ıları 381 OLE Veri Tipi Alana bir nesne eklemek veya bağlamak için kullanılan veri tipidir. Resimler, Excel dosyaları veya bir dosyadan seçebileceğiniz herhangi bir nesne bağlanabilir. 382 Modül 11: Konu 3: Veri Modelleme Gereksinimleri Verileri tablolarda tutarken bazı modellemelere gereksinim duyulur. Örne ğin, yazılan bir verinin tekrarlamamas ı önemlidir. Ürünler tablosunda kategori isim olarak tutulursa, aynı kategorideki ürünler için bu ismin tekrar yaz ılması gerekecektir. Bu durum, hem tabloya veri girişini zorla ştırır, hem de de ğişiklik yap ılmak istenirse, her ürünün kategorisini değiştirmek gerekir. Bu tip sorunlar, normalizasyon kurallarını ortaya ç ıkarmıştır. Normalizasyon, yer alanından kazanma, veri tutarl ılığı ve ölçeklenebilirlik ama-cıyla tablolardan gereksiz verilerin çıkart ılması i şlemleridir. Bu i şlemler, tablola-rın üç etapta normal formlara getirilmesi ile gerçekle şir. Veri Yap ıları 383 Birinci Normal Form Bu işlem, yatay düzeyde gereksiz veya tekrarlanan verilerin ç ıkart ılmasıdır. Sa-tırlarda en az düzeyde veri tutulmas ı ve bir bilginin sadece bir kolonda bulun-ması sağlan ır. Örnek: Bu örnekte bir eğitmen grubunun yapt ığı projeler bir veritaban ında tutu-lur. Verilerin tek bir tabloda tutulmas ı baz ı problemlere yol açar. Eğitmen1 E ğitmen2 Proje Konu Saat Kurum Ali Veli Uzmanlık Kitabı Windows 300 BilgeAdam Ali Veli Mühendislik Kitabı Windows, Web 350 BilgeAdam Bu örnekte, projelerin eğitmenleri iki ayr ı alanda tutulmu ştur. Bu durum 1NF (birinci normal form) kural ını ihlal etmiştir. Yani bir sat ırda, bir verinin tekrar et-mesi söz konusudur. Bu tabloda projeler iki e ğitmenle s ınırlanm ış durumdad ır. Ancak bir kitabı birçok e ğitmenin yazd ığı durumlar da olabilir. Ayrıca, proje konular ında birden fazla bilgi tutulur. Mühendislik Kitabı projesinin Windows ve Web olmak üzere iki tane konusu bulunur. Belli bir konuya göre arama yapmak zorla şır. Eğitmenler tek bir alanda toplan ıp, konular kitaplara göre tekrar düzenlenebilir. Eğitmen Proje Konu Saat Kurum Ali Uzmanl ık Kitabı Windows 300 BilgeAdam Veli Uzmanl ık Kitabı Windows 300 BilgeAdam Ali Mühendislik Kitabı Web 350 BilgeAdam Veli Mühendislik Kitabı Web 350 BilgeAdam 384 Modül 11: Yeniden düzenlenen bu tabloda ise bir kitap projesi için iki tane sat ır olu şuyor. Ayrıca Mühendislik kitab ının sadece Web konusunda olduğu görülüyor. Diğer konu için de ayr ıca iki sat ır eklenmesi gerekir. Eğitmen Proje Konu Saat Kurum Ali Uzmanl ık Kitabı Windows 300 BilgeAdam Veli Uzmanl ık Kitabı Windows 300 BilgeAdam Ali Mühendislik Kitabı Web 350 BilgeAdam Veli Mühendislik Kitabı Web 350 BilgeAdam Ali Mühendislik Kitabı Windows 350 BilgeAdam Veli Mühendislik Kitabı Windows 350 BilgeAdam Ancak bu şekilde, verilerin gereksiz yere tekrarland ığı görülür. Veriler bu şe-kilde tekrar yaz ıld ıklar ı zaman hata olas ılığı artar. Dolayısıyla, veri bütünlü ğü bozulur. Örne ğin Mühendislik Kitab ı yerine Muhendis Kitapi gibi bir veri girildiği zaman, alınacak raporlarda çeli şkiler ortaya çıkar. Dolayısıyla tekrarlanan bu verilerin ayrı bir tabloda tutulmas ı gerekir. Eğitmen No E ğitmen 1 Ali 2 Veli Konu No Konu 500 Windows 501 Web Proje No Proje Saat Kurum 100 Uzmanl ık Kitabı 300 BilgeAdam 101 Mühendislik Kitabı 350 BilgeAdam Eğitmenler ve konular tablosundaki verilerin birer numaras ı vardır. Bu verilere erişmek için konu veya eğitmenin ismiyle de ğil, numara kullan ılır. Dolayısıyla, tablolarda onlarca karakterin tekrarlanmas ı yerine, verileri temsil eden numara-lar tekrarlanacaktır. Bu durum, hem veritaban ının büyümesini engeller, hem de tablo üzerinde kay ıt aramalarını h ızlandırır. Tablolar birbirinden ayrıld ıktan sonra, projelerin hangi eğitmenler taraf ından ya-pıld ığı ve hangi konularda oldu ğu bilgileri kaybedilmiştir. Bu bilgilerin elde edil-mesi için tablolar arasında ilişkiler kurmak gereklidir. İli şkilerin kurulmas ı için, tabloların birbirlerine referans vermesi gerekir. Yani bir tablodan di ğerine ula şmak için bir bilgi gerekir. Örneğin, bir projenin hangi ko-nuda olduğunu belirlemek için konu numaras ına ihtiyaç vardır. Bu numara, projenin hangi konuda olduğunu belirleyecektir. Tablolar arasında ili şkileri kurmak için bu numaraların do ğru biçimde kullanıl-ması gerekir. Bu numaralar davran ışlarına göre ikiye ayr ılır. Veri Yap ıları 385 Birincil Anahtar Tablonun bir ya da birden fazla alan ı, tek bir veriyi temsil etmesi için Birincil Anahtar (Primary Key) yapılır. Bu anahtar verinin bir daha tekrarlanmamas ını sağlar ve ilişkiler kurulurken ana tabloyu belirler. Örnekteki Birincil Anahtar olan alanlar Eğitmen No, Proje No ve Konu No alanlar ıdır. Birden fazla alanın Birincil Anahtar olarak tan ımlanmas ı, alanlar ın tuttu ğu veri-nin birleşik olarak tekli ğini sa ğlar. Örne ğin, sipari ş detaylar ı tablosunda, sipari ş numaras ı ile ürün numaras ının beraber tekrarlanmaması gerekir. Aksi halde, bir siparişteki ürünün iki farkl ı adet, indirim vs. bilgileri olacaktır. Sipariş No Ürün No Adet İndirim 100 680 1 0 100 679 2 10 102 680 1 15 100 680 2 5 Bu tabloda sipariş ve ürün numarası beraber Birincil Anahtar yapılmıştır. Dolayısıyla, bu alanlar ın herhangi birisinde bir veri tekrarı olabilir. Önemli olan, bu iki alanın beraber ayn ı veriyi tutmamas ıdır. Örnekte, 100 numaralı sipari şte 680 numaralı ürün kayd ı iki defa geçmiştir. Yap ılacak sorgularda, bu ürünün siparişte 1 adet oldu ğu ve 0 YTL indirim yapıld ığı, aynı zamanda 2 adet olduğu ve indirimin 5 YTL olduğu görülür. Bu da verinin tutarl ılığını bozar. Access ile tablolarda Birincil Anahtar olu şturmak için, istenen alanlar seçilerek araç çubuğundaki Birincil Anahtar düğmesi tıklan ır (Resim 11.9). 386 Modül 11: RESİM 11.9: Birincil Anahtar dü ğmesi. Veri Yap ıları 387 Yabancı Anahtar Bir tablo içinde ba şka bir tabloya referans vermek için, o tablonun numarası kullanılır. Yani o tablonun Birincil Anahtar alan ına gönderme yapılır. Bu i şlemin yap ılması için, referans gönderen tabloda bu verinin tutulması gerekir. Farkl ı bir tablonun birincil anahtar ını tutan alana Yabancı Anahtar (Foreign Key) denir. Örneğin, şarkı listesinin tutuldu ğu bir tabloda albüm numarası, albümler tablo-sundaki Birincil Anahtar olan alana referans verir. RESİM 11.10: Yabancı Anahtar. Bu anahtarlar ın kullanımı, ili şkilerin tanımlanmas ında büyük öneme sahiptir. Tabloların normalizasyonunun sa ğlanması için birbirleriyle ilişkilendirilmeleri gerekir. Üç çe şit ili şki vard ır. 1. Bire bir ili şki (One to One) 2. Bire sonsuz ili şki (One to Many) 3. Sonsuza sonsuz ili şki (Many to Many) 388 Modül 11: Access ile, tablolar arasındaki ilişkiler, bir alanın sürüklenip diğer tablodaki bir alan ın üzerine b ırak ılması ile kurulur (Resim 11.11). Access bu alanların Birincil Anahtar olup olmadığına bakarak ilişkinin cinsini belirler. RESİM 11.11: İli şki oluşturmak. İli şki tanımlanırken açılan İli şkileri Düzenle penceresinde, tablolardaki hangi alanlar üzerinde ili şki kurulaca ğı gösterilir. Buradan, ilişkinin türü ve davranışı hakkında özel ayarlamalar yapılır (Resim 11.12). ? Bilgi tutarl ılığına zorla. Bir tablodaki verinin diğer tabloda varolup olmad ığını kontrol eder. ? İli şkili alanlar ı ardarda güncelle (Cascade Update). Birincil Anahtar üzerinde bir değişiklik yap ılmışsa, ilişkide oldu ğu tablolardaki Yabancı Anahtar alanları da de ğiştirir. ? İli şkili kayıtlar ı ardarda sil (Cascade Delete). Tabloda bir kay ıt silin-di ği zaman, ili şkide oldu ğu tablolardaki veriler de silinir. RESİM 11.12: İli şkileri Düzenle penceresi. Veri Yap ıları 389 Tekil K ısıtı (Unique Constraint) Bazı durumlarda, Birincil Anahtar olmayan alanlar ın bazılarının da tabloda bir-den fazla kez geçmesi istenmez. Örne ğin, ö ğrenci tablosundaki bir numara başka bir öğrenci için geçerli de ğildir. Ya da sicil tablosundaki bir TC kimlik numaras ı tekrarlanmaz. Bu alanlar ın Tekil olarak tan ımlanmas ı gerekir. Access ile tablo tasarlarken, alanlar ın Tekil olarak tanımlanmas ı, indekslemeyi gerektirir. Bir alanın indekslenmesi, tabloda aramaların o alan üzerinden daha hızl ı yap ılmasını sağlar. Ancak her alan üzerinde indeks kullan ılmamalıdır. Bu durum, sorgular ın performans ını art ırmak yerine düşürür. Üzerinde s ıkça sorgu çalıştırılan alanlar indekslenebilir (Resim 11.13). RESİM 11.13: Tekil tanımlaması. Bire Bir İli şki Bir tablodaki bir kayıt, di ğer tablodaki bir veri için ancak bir kez kullanılabilir. Örneğin Sicil tablosu, bir ki şinin ismini, soyad ını ve kimlik numarasını tutuyor olsun. Ö ğrenci tablosu ise ö ğrencinin okul numaras ı, sınıfı gibi kay ıt bilgilerini 390 Modül 11: tutuyor olsun. Ö ğrenci ile Sicil aras ında bire bir ili şki vard ır. Ö ğrenci tablosun-daki bir veri, Sicil tablosunda sadece bir veriyi referans gösterebilir. Sicil tablosundaki bir veri de, Öğrenci tablosundaki bir veri için kullanılabilir. Dolayı-sıyla, bir ö ğrencinin bir sicili olabilir, bir sicil ise sadece bir ö ğrenciye ait olabilir (Resim 11.14). Tablolar arasındaki bu ilişkiler iki Birincil Anahtar üzerinden yapılır. RESİM 11.14: Bire bir ilişki. Bire Sonsuz İli şki Tablodaki bir verinin, ilişkide oldu ğu tabloda birden fazla kez kullanılabilmesidir. Örneğin, bir araba ve model tablolar ı arasında bire sonsuz bir ili şki vard ır. Araba tablosundaki bir veri, model tablosundaki bir veriyi bir kez kullanabilir. Ancak model tablosundaki bir veri, araba tablosunda birden fazla veri tarafın-dan kullanılabilir. Yani, bir araban ın sadece bir modeli olur ve bir model birden fazla arabanın modeli olabilir (Resim 11.15). Tablolar arasında bire sonsuz bir ili şki oluşturmak için, birden fazla veride geçe-cek olan tabloda Birincil Anahtar, bu değerin bir kere tutulaca ğı tabloda Ya-bancı Anahtar olmak zorundad ır. RESİM 11.15: Bire sonsuz ilişki. Sonsuza Sonsuz İli şki İki tablo arasında sonsuza sonsuz bir ilişkiyi temsil eder. Tablolardaki her veri di ğeri için birden fazla kullan ılıyorsa, iki taraflı sonsuz bir ili şki vard ır. Örne ğin, bir film ve oyuncu tablolar ı arasındaki ilişki sonsuza sonsuzdur. Film tablosun-daki bir veri, oyuncular tablosunda birden fazla veri için kullanılabilir. Ayn ı şe-kilde, oyuncu tablosundaki bir veri, f ilmler tablosunda birden fazla veri için kullanılabilir. İli şki şu şekilde tanımlanabilir: Bir oyuncu birden fazla filmde oynayabilir. Bir filmde birden fazla oyuncu bulunabilir. Tablolar aras ında sonsuza sonsuz bir ili şki kurmak için, ara tabloya ihtiyaç duyulur. Bunun nedeni, her iki tablodaki verilerin birden fazla e şinin bulunabilmesidir. Yap ılan ara tabloya, iki tablodan al ınan Birincil Anahtar alan- Veri Yap ıları 391 ları konur. Bu alanlar ikili Birincil Anahtar yap ılarak veri bütünlü ğü sa ğlanmış olur (Resim 11.16). RESİM 11.16: Sonsuza sonsuz ilişki. Tabloların birinci normal forma getirilmesi için ili şkilerin kurulmas ı gerekir. Bu durumda, ayr ılan tablolar ın birbirleri ile ilişkilerinin saptanması ve bunun sonu-cunda Yabanc ı Anahtar alanlar ının eklenmesi veya ara tabloların oluşturulmas ı gerekir. Örneğin, Proje ile Konular arasında bir sonsuza sonsuz ili şki vard ır. Bir projenin birden fazla konusu olabilir ve bir konuda birden fazla proje yap ılabilir. Bunun için ara tablonun kurulmas ı gerekir. Konu No Konu 500 Windows 501 Web Proje No Proje Saat Kurum 100 Uzmanl ık Kitabı 300 BilgeAdam 101 Mühendislik Kitabı 350 BilgeAdam Proje No Konu No 100 500 101 500 101 501 Bu tablo ile 100 numaralı Uzmanl ık Kitabı projesinin 500 numaralı Windows konusunda olduğu görülür. Bu tablo biçimi, belli konulardaki projelerin sorgulanmasını da destekler. Eğitmenler ile projeler arasında da sonsuza sonsuz bir ilişki vard ır. Bir e ğitmen birden fazla projede bulunabilir. Bir projeyi birden fazla eğitmen yürütebilir. Dolayısıyla, bu ili şki için de bir ara tablo yap ılması gerekir. Eğitmen No Proje No 1 101 2 101 1 100 2 100 392 Modül 11: İkinci Normal Form Birinci normal form satır bazında gereksiz verilerin çıkart ılmasıydı. İkinci normal form ise kolon baz ında veri tekrarını kontrol eder. E ğer bir kolonda bir veri bir-den fazla kez kullanılıyorsa, bu verilerin ayr ı bir tabloda tutulmas ı gerekir. Örnekte kurum ismi olan BilgeAdam, tüm satırlar için yaz ılmıştır. Dolayısıyla bu kolonda veri tekrar ı yap ılmıştır. Bu kurum ismi ayr ı bir tabloda tutulup, ana tab-loda numaras ı ile referans gösterilmelidir. Kurum No Kurum İsmi Şehir Adres 221214 BilgeAdam İstanbul Barbaros Bulvar ı Be şikta ş Bu durumda, projeler ve kurum tablosu aras ında bire sonsuz bir ilişki oldu ğu için, projeler tablosuna hangi kuruma ait oldu ğunu belirtmek üzere bir Yabancı Anahtar eklenir. Proje No Proje Saat Kurum No 100 Uzmanl ık Kitabı 300 221214 101 Mühendislik Kitabı 350 221214 Veri Yap ıları 393 Üçüncü Normal Form Üçüncü normal formda, tablonun Birincil Anahtar ile direk ilişkisi bulunmayan, ancak diğer alanlara ba ğlı alanları bulunur. Örne ğin, kurumlar tablosunda şehir ismi alan ının kurum ile doğrudan ba ğlant ısı yoktur. Adres alanı ile daha çok bağlant ılıdır. Bu alanların ayrı bir tabloya al ınması, üçüncü derece normalizas-yondur. Tablolar ayr ıld ıktan sonra aralarındaki ilişkiler belirlenmelidir. Bu örnekte bir ku-rumun birden fazla adresi olabilir. Ancak bir adres, sadece bir kuruma aittir. Kurum No Kurum İsmi 221214 BilgeAdam Adres No Şehir Adres Kurum No 17982 İstanbul Barbaros Bulvar ı Be şikta ş 221214 Üçüncü normal forma getirilen tabloların, di ğer formların da k ısıtlar ını sağla-ması gerekir. Adres tablosundaki Şehirler alan ı, her adres için tekrarlanacakt ır. Bu da ikinci normal form kural ının ihlali demek olur. Dolay ısıyla Şehir alan ını ayrı bir tablo olarak ay ırmak gerekir. Şehir No Şehir İsmi 34 İstanbul Adres No Şehir No Adres Kurum No 17982 34 Barbaros Bulvarı Be şikta ş 221214 394 Modül 11: RESİM 11.17: Örnekteki ilişkiler. Veri Yap ıları 395 Uygulama: Al ışveri ş Modeli Bir e-ticaret internet sitesinin hedefi, ürünlerin büyük kitlelere satışını gerçekle ş-tirmektir. İnternet kullan ıcıları bu hedef kitleyi oluşturur. Satılan ürünler, bu kullanıcılara çe şitli hizmetler sunularak pazarlanmal ıdır. Veritaban ında ürünlerin tutulmas ı, stok durumlarının ve siparişlerin gözlenmesi kadar, kullanıcı kayıtlar ının tutulması, yeni kampanyalar ın aç ılması, ürünler hakkındaki yorumların tutulmas ı gibi kavramlar da önemlidir. Veritabanının tasarlanmasında bu kavramlar tek tek ele al ınıp incelenmelidir. Kaynak Yönetimi Modülü E-ticaret firmasının ürünlerinin yönetimi, stok, sipariş ve firma bilgilerinden olu-şur. Ürünlerin stoklardaki durumları takip edilmeli ve gerektiği zaman firmalar-dan tedarik edilmelidir. Dolayısıyla ürünler, firmalar, sipari şler ve stoklar bu mo-dülde i şlenmelidir. ? Ürünler. Bu tablo, ürünlerin detayl ı bilgilerini tutar. Ürünün ismi, birim fi-yatı, eklenme tarihi, özellikleri, üretimde olup olmad ığı, incelenme sa-yısı gibi bilgilerin tutulur (Resim 11.18). Ürünlerin hangi kategoride oldukları ve sağlayıcı firma bilgileri de tutulmal ıdır. Ancak kategori ismi kolon baz ında birçok defa tekrarlana-cağı için, ikinci normalizasyon kural ına göre ayr ı bir tabloya al ınmalıdır. Sağlayıcı firma bilgileri de ayn ı şekilde ayrı bir tabloda tutulmal ıdır. Bu durumda bire sonsuz bir ilişki oluşur. Yani bir firma birden fazla ürün sağlar, ancak bir ürün sadece bir firma taraf ından sağlan ır. Dolayısıyla bu iki alan Yabanc ı Anahtar olarak tan ımlanmalıdır. RESİM 11.18: Ürünler tablosu. ? Firmalar. Firma bilgileri ayr ı bir tablo olarak tutulur. Bilgi olarak adres, müşteri temsilcisi ismi, e-posta ve Web sayfas ı adresleri tutulur (Resim 11.19). 396 Modül 11: RESİM 11.19: Firmalar tablosu. ? Siparişler. Ürünler satın al ındıktan sonra, sipariş bilgisi olarak kayda geçer. Siparişlerin nakliye ücreti, sipari ş verilme ve gönderilme tarihi, havale ile ödeme durumlarında son ödeme tarihi, gönderilecek adres, ödenip ödenmediği ve sipari şin iptal edilip edilmedi ği gibi bilgileri tutulur. Ayrıca sipari şi hangi kay ıtl ı kullan ıcının verdi ğini de tutmak gerekir. Bir siparişi sadece bir kullan ıcı verebilir ve bir kullan ıcı birden fazla sipari ş verebilir. Dolayısıyla bire sonsuz bir ili şki olu şturmak için kullan ıcı numaras ı Yabanc ı Anahtar olarak tan ımlanmalıdır (Resim 11.20). RESİM 11.20: Sipari şler tablosu. Siparişler ile Ürünler aras ında sonsuza sonsuz bir ilişki vard ır. Yani bir siparişte birden fazla ürün bulunabilir. Bir kullan ıcı aynı anda birden fazla ürün almak isteyebilir. Ayn ı şekilde bir ürün birden fazla sipari şte bulunabilir. Yani bir ürün birden fazla kullan ıcıya sat ılabilir. Bu durumda Siparişler ile Ürünler aras ında ayrı bir tablo yap ılması gerekir. Bu ara tablo, bir sipari şteki bir ürün bilgisini tutacaktır. Dolay ısıyla bu tablo daha etkin bir şekilde kullanılabilir. Örne ğin belli bir sipari şte bir üründen kaç tane alındığı ancak bu tabloda tutulabilir. Ayr ıca, bu ürün, Veri Yap ıları 397 yap ılan bir kampanyadan al ınıyor olabilir. Böylece, bu kayıtta kam-panya bilgilerinin de tutulması gerekir (Resim 11.21). RESİM 11.21: Sipari şDetayları tablosu. ? StokMerkezleri. Ürünlerin belirli şehirlerde veya belirli merkezlerdeki stoklar ı tutulmas ı gerekir. Siparişin verildi ği yere en yak ın stoktan ürün göndermek için bu stok bölgelerinin tutulmas ı gerekir. Bu stokun adres, e-posta, merkez olup olmad ığı bilgileri tutulmal ıdır (Resim 11.22). RESİM 11.22: StokMerkezleri tablosu. StokMerkezleri ile Ürünler arasında sonsuza sonsuz bir ili şki vard ır. Yani bir stok merkezinde birden fazla ürün bulunabilir ve bir ürün birden fazla stok merkezinde bulunabilir. Bu ilişki için ara bir tablo yapılmal ıdır (Resim 11.23). Müşteri Yönetim Modülü Kaynak planlamaları yap ıld ıktan sonra, bu kaynaklar ın müşteriye ne şekilde sunulaca ğına karar verilmelidir. Kullanıcılar Internet sitesini kullan ırken kendile-rine bir hesap açabilirler ve sipari şlerini bu hesap ile yapt ıklar ında, kendilerine ait istatistikleri kolayca elde edebilirler. Örneğin bir kullan ıcı, en çok hangi kategoride ürünleri satın aldığını sorgulayabilir. Kullan ıcılar, sipari şlerini verme-den önce ürünlerle ilgili bilgi almak isteyebilir. Bu ürünleri daha önce alan 398 Modül 11: kullanıcıların yazd ıklar ı yorumlardan faydalanmalar ı için, ürün yorumlarının da tutulmas ı gerekir. Ayr ıca, kullanıcıya de ğişik tarihlerde aç ılan, belli süreli kampanyaların sunulmas ı, e-ticaret sitesinin kullanımını art ıracakt ır. Kullan ıcılar ürünleri incelerken, satın almadan önce sepetlere ekleyebilirler. Böylece siteyi tekrar ziyaret edince, daha önceden inceledi kleri ve sepete ekledikleri ürünleri görebilirler. RESİM 11.23: StokDurumu tablosu. ? Kullan ıcılar. Bu tabloda kullan ıcı hakkında bilgiler tutulur. İsim, soyad ı, e-posta, kayıt tarihi gibi bilgilerin yan ı s ıra siteye giriş yapmak için kulla-nıcı ad ı ve parolan ın da tutulmas ı gerekir. Bu parolan ın de ğişikliği du-rumda güvenlik sorusu ve cevab ı da ayr ıca tutulmal ıdır (Resim 11.24). RESİM 11.24: Kullanicilar tablosu. ? Yorumlar. Kullanıcıların yapt ıklar ı yorumların bir tabloda tutulması gerekir. Ancak burada dikkat edilmesi gereken nokta, bir kullanıcının yorum yazması için sisteme giri ş yapmas ının gerekmemesidir. Dolayı-sıyla, burada Kullan ıcılar tablosuna bir referans göstermeye gerek yok-tur. Yorumlar ı yazan ki şileri takma adlar ı, yazd ığı yorumlar, tarih ve ver-dikleri puan tutulmalıdır (Resim 11.25). Ayrıca, yorumun hangi ürün hakk ında yap ıld ığını belirten ve ürünler tablosuna referans gösteren bir Yabanc ı Anahtar alanının tutulmas ı gerekir. Veri Yap ıları 399 RESİM 11.25: Yorumlar tablosu. ? Sepetim. Kullan ıcıların ürünleri inceledikten sonra sepetlerinde sakla-ması için olu şturulan bir tablodur. Bu tabloda ürün numarası ve kullanıcı numarasına referans gösterilmelidir. Bu ürünlerin eklenme tarihi ve adeti de tabloda tutulmal ıdır. Kullanıcılar, ürünleri sürekli sepete ekleyip ç ıkartabilir. Ç ıkartma i şle-minde, verinin tablodan silinmesi gerekir. Ancak bir kaydın sürekli ekle-nip silinmesi performansı dü şürür. Dolayısıyla ürünün sepetten çıkart ıld ığını belirleyen bir Evet/Hay ır veri tipinde alan belirlenebilir. Bu alan ın de ğeri Evet ise ürün sepettedir ve kullan ıcıya gösterilir. Ürünün tekrar ekleme işleminde ise sadece bu alan güncellenir (Resim 11.26). RESİM 11.26: Sepetim tablosu. ? Kampanyalar. Kullan ıcıya sunulan kampanyalar e-ticaret kavram ında önemli bir yer al ır. Bu kampanyalar bir ya da birden fazla ürünün toplam fiyat ında belli tarihler aras ında belli bir indirim yap ılmasıyla gerçekleşir. Kampanya tablosunda kampanyanın başlang ıç bitiş tarihleri, devam edip etmediği ve yap ılan indirim birer alan olarak tutulmal ıdır (Resim 11.27). Bu durumda, bir kampanyada birden fazla ürün olabilir. Bir ürün ise bir-den fazla kampanya dahilinde olabilir. Dolay ısıyla ara tablo eklenerek sonsuza sonsuz bir ili şki kurulmalıdır (Resim 11.28). 400 Modül 11: RESİM 11.27: Kampanyalar tablosu. RESİM 11.28: KampanyaUrunler tablosu. RESİM 11.29: Uygulamadaki ili şkiler.0 Veri Yap ıları 401 Modül Sonu Soruları & Al ıştırmalar 1. Veritaban ı yönetim sistemi kavram ını ve bu sistemlere neden ihtiyaç duyulduğunu aç ıklay ın. 2. Microsoft Access platformunun avantajlarını açıklay ın. 3. Microsoft Access'te yer alan veri türlerini ve kullanım alanlar ını açıkla-yın. 4. Birincil Anahtar ve Yabancı Anahtar yap ılarını ve kullanım alanlarını açıklay ın. Örnek bir veritaban ı geli ştirin. Modül 12: SQL’e Giriş SQL (Structured Query Language) dili, veritabanlar ı üzerinde sorgu yapmak için kullanılan bir dildir. Sorgular, analiz a şamalar ında, veri eklerken, günceller-ken 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, de-tayl ı veri analizi yapmak için kullan ılır. Bu modülü tamamlad ıktan sonra; ? SELECT cümleleri ile tablo sorgulayabilecek, ? Kriterler ve hesaplama fonksiyonları kullanarak sorguları şekillendirebilecek, ? UPDATE sorgusu ile tabloları güncelleyebilecek, ? INSERT sorgusu ile tablolara veri ekleyebilecek, ? DELETE sorgusu ile tablolardan veri silebilecek, ? JOIN ile birden fazla tabloyu birle ştirip sorgu çal ıştırabileceksiniz. 406 Modül 12: Konu 1: Access ile Sorgu Oluşturmak Access ile sorguları görüntülemek ve oluşturmak için, veritabanı penceresin-den Sorgular sekmesi seçilir. Sorgular iki şekilde olu şturulabilir. ? Tasarım görünümünde sorgu. Sorgular, istenen tablolar ve gerekli alanlar eklenerek olu şturulur. Burada sorgunun üç farkl ı görünüm şekli vard ır. Tasarım görünümü, SQL görünümü ve Veri sayfası görünümü (Resim 12.1). RESİM 12.1: Sorgu görünüm seçenekleri. Ta s a rım görünümünde sorgular, tabloların görsel olarak eklenip, alanlar ının seçilmesi ile oluşturulur. Tablolar ı ba ğlama i şlemleri, kriterler ve alan isimlerinin SQL diline çevrilmesi Access tarafından yap ılır (Re-sim 12.2). SQL’e Giriş 407 RESİM 12.2: Ta s a r ım görünümü. SQL görünümünde sorgular, SQL cümlesi kullan ıcı tarafından yaz ılarak oluşturulur. Bu modüldeki sorgular bu görünümde olu şturulacaktır (Re-sim 12.3). RESİM 12.3: SQL görünümü. Veri sayfası görünümü, SQL sorgusu çalıştırıld ıktan sonra verilerin görünümüdür. SQL sorgular ı çal ıştırıld ıktan sonra bu görünüme geçilir (Resim 12.4). RESİM 12.4: Çalıştır dü ğmesi. ? Sihirbaz ile sorgu. Access sihirbazı, tablolar üzerinde yap ılacak sorguların kolay ve h ızl ı bir şekilde olu şturulmas ını sağlar. 408 Modül 12: RESİM 12.5: Sihirbaz ile sorgu olu şturmak. SQL’e Giriş 409 SELECT FROM WHERE SELECT sorgusu tablolardan veri kümesi çekmek için kullanılan sorgudur. Sorgunun yapısı SELECT Alanlar FROM Tablo İsmi WHERE Kriterler şeklindedir. Bu cümlede SELECT kelimesinden sonra gelen alanlar, tablolar ı olu şturulan ko-lonlard ır. Sonuç kümesinde, tablonun hangi alanlar ının olacağını gösterir. Bu-rada 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 Urunler Buradaki yıld ız ifadesi, tüm alanlar ın listeleneceği anlamına gelir. SELECT Urunler.Isim, Urunler.BirimFiyat, Urunler.Eklen****rihi FROM Urunler 410 Modül 12: 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 Isim, BirimFiyat, Eklen****rihi FROM Urunler RESİM 12.6: Sorgu sonucu. 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. SQL’e Giriş 411 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 ? 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 Tablo 12.1’de baz ı kural ve örnekler verilmiştir. TABLO 12.1: Özel Karakter Örnekleri Pattern Örnek True de ğeri dön-düren örnek False de ğeri döndüren örnek Sıfır veya birden fazla karakter * Nu* Nuray, Nuri Banu Özel karakterlerin kullan ımı Beş [*] Be ş * Be şiktaş Tek karakter ? Ç?n Çan , Çin Ç ıban , Çanak Tek Say ı # Versiyon # Versiyon 5 , Versiyon 1 Versiyon 10, Versiyon Üç Karakter Aralığı [a-z] a , b, c 43, 2 Aral ık D ışı [!0-9] a , b, c 1 , 2, 3 Örnek: Microsoft Studio ürünler in listelenmesi (Resim 12.7). 412 Modül 12: SELECT Urunler.Isim FROM Urunler WHERE Urunler.Isim LIKE '*Studio*' RESİM 12.7: Sorgu sonucu. ? 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 Firmalar.Isim, Firmalar.Email, Firmalar.WebSayfasi FROM Firmalar WHERE ((Not (Firmalar.Email) Is Null)) OR ((Not (Firmalar.WebSayfasi) Is Null)); SQL’e Giriş 413 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; RESİM 12.8: Toplama i şleminin sonucu. ? Avg . Kriterlerin sa ğland ığı alanların ortalama de ğerini al ır. SELECT Avg(Urunler.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. 414 Modül 12: SELECT Max(Isim) AS [En son geçen kullan ıcı] FROM Kullanicilar; SELECT Max(KayitTarihi) AS [En son kaydolan kullan ıcı] FROM Kullanicilar; RESİM 12.9: Ortalama i şleminin sonucu. RESİM 12.10: Maksimum değerin al ınması. ? 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; RESİM 12.11: Minimum de ğerin al ınması. ? Count . De ğeri NULL olmayan sat ırlar ın kaç tane olduğunu verir. Genel-likle 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. Birin-cil Anahtar alanının üzerinden bir say ım yapılabilir. SELECT Count(KullaniciId) AS [Toplam Kullan ıcı Sayısı] FROM Kullanicilar; RESİM 12.12: Sayma i şleminin sonucu. SQL’e Giriş 415 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 unu-tulmamal ı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, SonOde****rihi, Adres ) VALUES (1, 3, '20.05.2005', '25.05.2005', 'Be şiktaş Istanbul') Bu tip INSERT sorgular ında sadece tek bir değer girilebilir. Ancak bazı durum-larda birden fazla verinin girilmesi istenebilir. Bu durumda, girilecek değerler SELECT cümlesiyle ba şka bir tablodan alınır. Örnek: Ödenen sipari şlerin tutuldu ğu ayrı bir tablo oluşturulur. Sipari ş tablosun-dan bu tabloya tüm ödenen kayıtlar ın aktar ılması i şlemi INSERT SELECT cüm-lesi ile yap ılır. INSERT INTO OdenenSiparisler ( SiparisId, KullaniciId, NakliyeUcreti, SiparisTarihi, Gonderil****rihi, Adres) 416 Modül 12: SELECT SiparisId, KullaniciId, NakliyeUcreti, SiparisTarihi, Gonderil****rihi, Adres FROM Siparisler WHERE Odendi = -1; SQL’e Giriş 417 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üncel-leme 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 418 Modül 12: 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 SQL’e Giriş 419 Konu 2: INNER JOIN ile Tablo Birleştirmek Birden fazla tablodan kayıt çekilmek istendiğinde, bu tablolar ın Birincil Anahtar ve Yabancı Anahtar alanlar ı üzerinden birle ştirilmeleri gerekir. Tablolar ı birleştir-mek, birçok bilgiyi sonuç kümesinde tek bir tablo olarak göstermeyi sa ğlar. Örneğin, bir ürünün hangi kategoride olduğu bilgisi Ürünler tablosunda vard ır. Ancak bu değer o kategori numaras ını belirtti ği için, son kullanıcıya bir şey ifade etmez. Kategori ismi ise, Kat egoriler tablosunda durur. Sonuç kümesin-den kategori ismini görüntülemek için bu tablolar ın birleştirilmesi gerekir. Sözdizimi: SELECT Alanlar FROM Tablo1 AS isim1 INNER JOIN Tablo2 AS isim2 ON isim1.Alan = isim2.Alan Burada tablo isimlerine birer takma isim verilmiştir. Bu isimler alanlar ın seçi-minde yazım kolaylığı sağlar. Bazı alanlar birbirleriyle ayn ı isimde olduklar ı için bu alanın hangi tabloya ait oldu ğu belirtilmelidir. SELECT isim1Alan1, isim1.Alan2, ..., isim2.Alan1, isim2.Alan2 FROM Tablo1 AS isim1 INNER JOIN Tablo2 AS isim2 ON isim1.Alan = isim2.Alan İki tablonun birle ştirme i şlemi, ON ifadesinden sonra belirtilen alanlar üzerinden yap ılır. Burada, iki tablo aras ında ilişki kurulan alanlar belirtilmelidir. Örnek: Ürünlerin stoklardaki miktarını ö ğrenmek için StokDurumu ve Ürünler tablolarını birleştirmek gerekir. 420 Modül 12: SELECT StokDurumu.Adet, Urunler.Isim FROM Urunler INNER JOIN StokDurumu ON Urunler.UrunId = StokDurumu.UrunId; İkiden fazla tablodan bilgi çekmek için, önce iki tablo birleştirilir. Sonuç olarak çıkan tablo ile de diğer tablolar tek tek birleştirilir. Birle ştirme i şlemi ((Tablo1 + Tablo2) + Tablo3) + Tablo4... şeklindedir. INNER JOIN kullan ılırken pa-rantezlerin unutulmaması gerekir. Örnek: Bir kullanıcının sepetindeki ürünlerin birim fiyatları sorgulanmak isten-di ği zaman, Kullan ıcılar, Sepetim ve Ürünler tablolar ı ili şkide oldukları alanlar üzerinden birleştirilmelidir. SELECT k.Isim, k.Soyad, s.Adet, u.BirimFiyat FROM (Urunler u INNER JOIN Sepetim AS s ON u.UrunId = s.UrunId) INNER JOIN Kullanicilar AS k ON k.KullaniciId = s.KullaniciId WHERE k.KullaniciId = 1 SQL’e Giriş 421 Konu 3: GROUP BY Hesaplama fonksiyonlarının kullanıld ığı sorgularda SELECT ifadesinden sonra sadece hesaplanan alan sonuç kümesine eklenmişti. Ancak ço ğu zaman, he-saplanan alanlarla birlikte diğer alanlar ın da sonuç kümesinde olması istenir. Örneğin, belli bir kategoride kaç tane ürünün bulundu ğu, kategori numarası so-nuç kümesinde olacak şekilde isteniyor. Bu durumda, Ürünler tablosundaki ka-yıtlar ın sayma işleminin gerçekle ştirilmesi için önce kategori numaras ına göre gruplanmas ı gerekir. SELECT k.KategoriId, COUNT(UrunId) AS [Ürün Sayısı] FROM Urunler u INNER JOIN Kategoriler k ON u.KategoriId = k.KategoriId GROUP BY k.KategoriId Tablodan kategori numarası d ışında ba şka herhangi bir alan daha isteniyorsa, bu alan GROUP BY ifadesine ya da bir hesaplama fonksiyonunun içine alınmalı-dır. SELECT k.Isim, k.KategoriId, Sum(u.BirimFiyat) AS [Toplam Fiyat], COUNT(UrunId) AS [Ürün Sayısı] 422 Modül 12: FROM Urunler u INNER JOIN Kategoriler k ON u.KategoriId = k.KategoriId GROUP BY k.KategoriId, k.Isim RESİM 12.12: GROUP BY kullanımı. SQL’e Giriş 423 Konu 4: Aritmetiksel İş lemler Sorgular sıras ında, alanlar üzerinde toplama, çıkarma, çarpma, bölme gibi arit-metiksel 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 Dahil] FROM Urunler Örnek: Stoklarda rezerve edilmemiş toplam ürün say ısı. SELECT Urunler.Isim, Sum(StokDurumu.Adet - StokDurumu.Rezerve) AS [Açık Ürün Sayısı - Tüm Stoklar] FROM Urunler INNER JOIN StokDurumu ON Urunler.UrunId = StokDurumu.UrunId GROUP BY Urunler.Isim; Toplama işlemi, say ılar üzerinde yap ılabildi ği gibi metinsel de ğerler üzerinde de birle ştirme görevi görür. Örnek: Kullanıcıların isim ve soyadlarının beraber görüntülenmesi 424 Modül 12: SELECT Kullanicilar.Isim + ' ' + Kullanicilar.Soyad AS [İsim Soyad] FROM Kullanicilar SQL’e Giriş 425 Modül Sonu Soruları & Al ıştırmalar 1. SELECT ifadesinin kullanım alan ını açıklay ın ve bir örnek SQL cümlesi geliştirin. 2. INSERT ifadesinin kullanım alan ını açıklay ın ve bir örnek SQL cümlesi geliştirin. 3. UPDATE ifadesinin kullanım alan ını açıklay ın ve bir örnek SQL cümlesi geliştirin. 4. DELETE ifadesinin kullanım alan ını açıklay ın ve bir örnek SQL cümlesi geliştirin. 5. DELETE ve UPDATE ifadelerini kullan ırken dikkat etmemiz gereken noktaları açıklay ın. 6. CASCADE DELETE ve CASCADE UPDATE ifadelerini içeren bir veritaban ı uygulamas ı geli ştirin ve silme durumunu gözlemleyin.


alıntıdır :D
 
Son düzenleme:
1 Mar 2012
204
1
mars
bunun indirme linkini vermiştim ama açamayanlar/indiremeyenler için buraya yazıyım dedim.konuya eklicektim ama süper online internet kotası dolduğndanmıdır bil. yavaşlığındanmıdır neden açamadım googleye bile 1 saatde giriyor :D o yüzden yeni konu açtım.
 

darkwolter

Katılımcı Üye
8 Şub 2012
619
0
Gerçekten cok karışık olmus okuyabilen cıkacağını sanmıyorum.
 
Son düzenleme:
1 Mar 2012
204
1
mars
ben bunu dün düzenleyecektim kardeş ama int. aşırı yavaştı şu üstteki yorumu yazana kadar canım çıktı :D
şimdi düzenlerim :D
 

mbk69

Katılımcı Üye
18 Nis 2012
483
0
Bayburt
Okumadım, .pdf dosyası yokmu bunun çok karışık. Birde aynı yazı aynı boyut aynı renk hiç okunmaz 1-2 saat alır ve bayılırım :D
 

baho26340

Katılımcı Üye
1 Ara 2011
533
0
26
AYRILDI
Biraz düşünmek lazım diğer insanlar bunu okurmu okurken sıkılırmı okurmak istermi...
lütfen bilinçlenelim.
 

numyam

Yeni üye
7 Tem 2012
12
0
okumadım ama kardeşim emeğine sağlık ... işim düşerse okurum daha yeniyim çünkü :)
 

misit

Üye
25 Haz 2012
168
0
Üstadım megep.meb.gov.tr adresine gidin orada modüllere tıklayın bilişim teknolojileri veri tabani dalı 10.sınıf 11.sınıf ve 12.sınıfı indirin görsel porgramlama , nesne tabanlı programlama dersleri var 12. sınıf modülleri c# 11.sınıf modülleri vb. 10. sınıftada temel bilgisayar dersleri ram nedir vs . :D teşekkür butonu orada :D :D inş. yararlı olmuştur :)
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.