arkadaşlar umarım beğinirsiniz sizin için bi kitap yayınlıyorum sadece Visual basic aradığınız herşey emin olun fazlası var. Eğer elinde benim gibi bi kitabı olan varsa bi zahmet özellikle delphi, flash, dreamweaver.... Hadi Allah kolaylık versin
MS VISUAL BASIC DERS NOTLARI
VB’de program yazmak demek, nesnelerin olaylar sonucunda verdikleri tepkilerin belirlenmesi demektir. Bu tepki, nesnenin herhangi bir özelliğinin değiştirilmesi, nesneye bir metodun uygulanması ya da bir fonksiyonun çalıştırılması olabilir. Örneğin, bir düğme nesnesine fare ile tıklanması olayı sonucunda, mesaj kutusu fonksiyonunun çalıştırılıp, kullanıcıya bir mesaj verilmesi gibi. Bu şekilde tasarlanan tüm olay-tepki ilişkileri, bir VB programının temelini oluşturur. Genel olarak bir VB programı aşağıdaki bileşenlerden oluşur: Project : Programın bütününe verilen isimdir. Form : Programın sahip olduğu tüm pencerelere (ekranlara) birer form adı verilir. Her VB programı en az bir forma sahip olmalıdır. MDI (Multiple Document Interface) Form : Birden fazla pencerenin aynı anda açık tutularak çalıştırılabilmesine olanak veren formlardır. Module: Tüm program dahilinde kullanılacak global tanımlamaları içeren bileşendir. VB dilinin bileşenlerini ise aşağıdaki gibi sıralayabiliriz: • Nesneler (Objects) • Özellikler (Properties) • Fonksiyonlar (Functions) • Metotlar (Methods) • Olaylar ( Events) • Deyimler (Statements) • Sabitler (Constants) FORMLAR Formların Özellikleri Appearance - Görünüm Özellikleri Appearance Formun çalışma anında (runtime) düz ya da 3 boyutlu görüntülenmesi için kullanılır. Sözdizimi: form.Appearance Değerler: 0 Düz. Form görsel efektler olmadan boyanır. 1 (Varsayılan) 3B. Form, üç-boyut efekti ile boyanır. BackColor Formun arkafon rengini belirler. Sözdizimi: form.BackColor [=renk]
BorderStyle Formun kenar çizgilerinin tipini belirler. Sözdizimi: form.BorderStyle = [değer] Değerler: 0 Kenar çizgisi yok. 1 Tekli sabit. Konumu değiştirilebilir. Boyutları ise yalnızca max.ve min. düğmeleri kullanılarak değiştirilebilir. 2 (Varsayılan) Boyutları değiştirilebilir. 3 Sabit Dialog. max. ve min düğmeleri yoktur. Boyutları değiştirilemez. 4 Sabit Araç Penceresi. Boyutları değiştirilemez, Kapat düğmesi ve küçük yazılı başlık çubuğu olan form. Form Windows Görev Çubuğunda gösterilmez. 5 Araç Penceresi. Boyutları değiştirilebilen, Kapat düğmesi ve küçük yazılı başlık çubuğu olan form. Form Windows Görev Çubuğunda gösterilmez.
Caption Formun başlığını belirler. Sözdizimi: form.Caption [= string] FillColor Form üzerinde Circle ve Line metotları ile yaratılan grafiklerin doldurma renklerini belirler. Sözdizimi: form.FillColor [ = renk] FillStyle Form üzerinde Circle ve Line metotları ile yaratılan grafiklerin doldurma desen tipini belirler. Sözdizimi: form.FillColor [ = değer] Değerler: 0 Dolgulu 1 (Varsayılan) Saydam 2 Yatay doğru 3 Dikey doğru 4 Artan köşegen 5 Azalan köşegen 6 Çapraz 7 Köşegen çapraz FontTransparent Form metninin saydamlık özelliğini belirler. Sözdizimi: form.FontTransparent [= boolean] ForeColor Form üzerinde yer alan grafiklerin rengini belirler. Sözdizimi: form.ForeColor [=renk] Palette Form tarafından kullanılacak bir palet dosyası atar. Sözdizimi: form.Palette = path Picture Formun arkafonuna bir resim ekler. Sözdizimi: form.Picture [= resim] Örnek: Private Sub Form_Load () Form1.Picture = LoadPicture("C:\PICS\AUTO\PORSCHE.BMP") End Sub
Behavior - Davranış Özellikleri AutoRedraw Otomatik yeniden-resimleme özelliğini aktif hale getirir. Sözdizimi: form.AutoRedraw [= boolean] ClipControls Boyama olaylarında, değişkenlik gösteren durumlarda tüm nesnenin ya da yenilenen alanların boyanmasına karar verir. Sözdizimi: form.ClipControls Örnek: Aşağıdaki kodu formun declerations bölümüne kopyalayın ve çalıştırıp formun büyüklüğünü değiştirin. Daha sonra aynı işlemi formun ClipControls özelliğini False yapıp tekrar edin. Private Sub Form_Paint () ' Arkafon için rastgele bir renk seçer: BackColor = &HFFFFFF * Rnd End Sub DrawMode Shape ve Line kontrollerinin çizim tipini belirler. Sözdizimi: form.DrawMode [= değer] Değerler: 1 Siyah. 2 15’in tersi. 3 Arkafon rengi ile kalem ters-renginin kombinasyonu 4 13’ün tersi. 5 Kalem rengi ile görüntülenen rengin tersinin eşzamanlı kombinasyonu 6 Görüntülenen rengin tersi 7 Kalem rengi ile görüntülenen rengin kombinasyonu 8 9’un tersi. 9 Kalem rengi ile görüntülenen rengin eşzamanlı kombinasyonu. 10 7’nin tersi. 11 Çizim modunu sonlandırır. 12 Kalem renginin tersi ile görüntülenen rengin kombinasyonu. 13 (Varsayılan) ForeColor özelliği ile belirlenen renk. 14 Kalem rengi ile görüntülenen rengin tersinin kombinasyonu. 15 Kalem rengi ile görüntülenen rengin kombinasyonu. 16 Beyaz. DrawStyle Grafik metotlarında çizgi tipini belirler. Sözdizimi: form.DrawStyle [= değer] Değerler: 0 (Varsayılan) Dolgulu 1 Kesik çizgili 2 Noktalı 3 Kesik çizgi - Nokta 4 Kesik çizgi - Nokta - Nokta 5 Saydam 6 İç dolgulu DrawWidth Grafik metotlarında çizgi kalınlığını belirler. Sözdizimi: form.DrawWidth [= büyüklük] Enabled Formun kullanılabilir ya da kullanılamaz olmasını belirler. Sözdizimi: form.Enabled [= boolean]
OLEDropMode Forma ait hedef bileşenin OLE-bırakma işlemlerini ayarlar. Sözdizimi: form.OLEDropMode [= mode] 0 (Varsayılan) Hedef bileşen OLE-bırakmasını kabul etmez. 1 El ile. OLE-bırakması programatik olarak gerçekleştirilebilir. 2 Otomatik. OLE-bırakması, eğer tanımlanabilirse hedef bileşen tarafından otomatik olarak algılanır vr kabul edilir. PaletteMode Yüklü paletin renk yelpazesi modunu ayarlar. Sözdizimi: form.PaletteMode = tamsayı Değerler: 0 (Varsayılan) Yarımton palet. 1 Üstten-artmalı palet. 2 Palette özelliğinde belirlenen palet kullanılır. RightToLeft Metin yazım yönünü belirler. Sözdizimi: form.RightToLeft Visible Formun görünüp görünmeme durumunu ayarlar. Sözdizimi: form.Visible [= boolean]
DDE - Dinamik Veri Değişimi (Dynamic Data Exchange) Özellikleri LinkMode DDE alışverişi için link türünü belirler ve bağlantıyı aktif hale getirir. Sözdizimi: form.LinkMode [= değer] Değerler: 0 (Varsayılan) Hiçbirisi - DDE kapalı. 1 Otomatik - Bağlantılı veri her değiştiğinde hedef kontrol güncellenir. 2 El ile - Hedef kontrol LinkRequest metodu çalıştırıldığında güncellenir. 3 Bildirimli - Bağlantılı veri her değiştiğinde LinkNotify olayı gerçekleşir, ancak, hedef kontrol yine LinkRequest metodu çalıştırıldığında güncellenir. LinkTopic Form için kaynak uygulama ve konuyu belirler. Sözdizimi: form.LinkTopic [= değer] Örnek: Private Sub Form_Load () Form1.LinkMode = 0 'Bağlantının aktif olmadığına emin olmak için. Form1.LinkTopic = "Excel|Sheet1" 'Uygulama ve konu belirleniyor. Form1.LinkMode = 1 'Bağlantı sağlanıyor. End Sub
Font - Yazıtipi Özellikleri Font Form metni için yazıtipi özelliklerini belirler. Sözdizimi: form.Font NOT: Font özelliğini ona yeni özellikler kazandırabileceğimiz bir nesne gibi kullanabiliriz: Form1.Font.Bold = True
Misc - Diğer Özellikler Name Formun kodlarda kullanılacak adını belirler. Sözdizimi: form.Name ControlBox Formun pencere kontrol düğmelerini açar ya da kaldırır. Sözdizimi: form.ControlBox HelpContextID Formun yardım dosyasındaki indeks numarasını belirler. Sözdizimi: form.HelpContextID [= sayı] Aşağıdaki kodu üzerinde textbox olan formun declerations bölümüne kopyalayın ve çalıştırıp fokus formda iken ve textbox’da iken F1 tuşuna basın: Private Sub Form_Load () Text1.HelpContextID = 21001 Form1.HelpContextID = 21005 End Sub Icon Forma bir simge dosyası atar. Sözdizimi: form.Icon [= picture] KeyPreview Klavye olaylarını aktif hale getirir. Sözdizimi: form.KeyPreview [= boolean] Aşağıdaki kodu formun declerations bölümüne kopyalayın ve çalıştırıp F1, F2 ve F3 tuşlarına basın. Private Sub Form_Load () KeyPreview = True End Sub Private Sub Form_KeyDown (KeyCode As Integer, Shift As Integer) Select Case KeyCode Case vbKeyF1: MsgBox "F1 yardım içindir" Case vbKeyF2: MsgBox "F2 metni kopyalar" Case vbKeyF3: MsgBox "F3 kopyalanan metni yapıştırır" End Select End Sub MaxButton Ekranı kapla düğmesini aktif hale getirir. Sözdizimi: form.MaxButton MDIChild Formun, bir MDI form içinde MDI Child form olarak görüntülenip görüntülenmeyeceğini belirler. Sözdizimi: form.MDIChild MinButton Simge durumuna küçült düğmesini aktif hale getirir. Sözdizimi: form.MinButton MouseIcon Fare imlecinin simgesini belirleyen bir .ico dosyası atar. Sözdizimi: form.MouseIcon = LoadPicture(pathname), form.MouseIcon [= picture] MousePointer Fare imlecinin türünü belirler. Form.MousePointer [= değer] 0 (Varsayılan) Form tarafından belirlenir. 1 Ok. 2 Çarpı. 3 I işareti. 4 Simge. 5 Dört yönlü ok. 6 İki yönlü ok.(KuzeyDoğu-GüneyBatı) 7 İki yönlü ok.(Kuzey-Güney). 8 İki yönlü ok.(GüneyDoğu-KuzeyBatı). 9 İki yönlü ok.(Doğu-Batı). 10 Yukarı Ok. 11 Kumsaati. 12 Normal. 13 Ok ve Kumsaati. 14 Ok ve Soru işareti. 15 Boyut değiştirme. 99 MouseIcon özelliği ile belirlenen simge. NegotiateMenus Form üzerinde yer alan bir nesneye ait menünün otomatik olarak görüntülenip görüntülenmeyeceğini belirler. ShowInTaskbar Formun Windows’un görev çubuğunda yer alıp almayacağını. Sözdizimi: form.ShowInTaskbar Tag Nesneye, VB tarafından kullanılmayacak özel amaçlı bir bilgi ya da yorum atamak için kullanılır. Sözdizimi: form.Tag [= ifade] WhatsThisButton Formun başlık çubuğunda bu nedir düğmesinin yer alıp almayacağını belirler. Sözdizimi: form.WhatsThisButton NOT: Bu özelliğin çalışması için aşağıdaki atamalar yapılmalıdır: ControlBox=True BorderStyle=Fixed Single ya da Sizable | BorderStyle=FixedDialog MinButton, MaxButton=False WhatsThisHelp Windows’un help sistemini aktif hale getirir. Sözdizimi: form.WhatsThisHelp [= boolean] WindowState Form penceresinin çalışma anındaki (runtime) görünümünü belirler. Sözdizimi: form.WindowState [= değer] Değerler: 0 (Varsayılan) Normal. 1 Simge durumunda. 2 Ekranı kaplamış.
Position – Konum Özellikleri Height, Width Formun yükseklik ve genişlik ölçülerini belirlerler. Sözdizimi: form.Height [= sayı], form.Width [= sayı] Left, Top Formun Sol ve Üst kenardan sonra bırakılacak boşluklarını belirler. Sözdizimi: form.Left [= değer], form.Top [= değer] Moveable Formun taşınabilir olup olmadığını belirler. Sözdizimi: form.Moveable = boolean StartUpPosition Formun açıldığı andaki görünümünü belirler. Sözdizimi: form.StartUpPosition = position Değerler: 0 Başlangıç koşulu yok. 1 Üzerinde bulunulan nesneye göre merkez. 2 Ekrana göre merkez. 3 Ekranın sol-üst köşesi.
Scale – Ölçek Özellikleri ScaleHeight, ScaleWidth Formun üzerindeki grafik metodu kullanılarak yaratılan nesneler için sırasıyla dikey ve yatay ölçek tanımlarlar. Sözdizimi: form.ScaleHeight [= değer], form.ScaleWidth [= değer] Örnek: Aşağıdaki kodu üzerinde textbox olan formun declerations bölümüne kopyalayın ve çalıştırıp formun üzerine tıklayın. Sonra formun büyüklüğünü değiştirip tekrar tıklayın. Private Sub Form_Click () Dim Radius As Integer ' Değişken tanımları. ScaleHeight = 100 ' Yükseklik büyüklüğü. ScaleWidth = 100 ' Genişlik büyüklüğü. For Radius = 5 to 50 Step 5 FillStyle = 1 Circle (50, 50), Radius ' Çember çiziliyor. Next Radius End Sub ScaleLeft, ScaleTop Formun üzerindeki grafik metodu kullanılarak yaratılan nesnelerin sırasıyla sol ve üst köşeleri için koordinatları belirlerler. Sözdizimi: form.ScaleLeft [= değer], form.ScaleTop [= değer] ScaleMode Ölçek birimini belirler. Sözdizimi: form.ScaleMode [= değer] Değerler: 0 ScaleHeight, ScaleWidth, ScaleLeft, ve ScaleTop özelliklerinin sahip oldukları değerlere göre ayarlanır. 1 (Varsayılan) Twip (inç başına 1440 twip, santimetre başına 567 twip). 2 Nokta (inç başına 72 nokta). 3 Piksel (Monitör veya yazıcının çözünürlüğüne göre ayarlanır). 4 Karakter (Yatay = birim başına 120 twip; Dikey = birim başına 240 twip). 5 Inç. 6 Milimetre. 7 Santimetre. Formlara Uygulanan Olaylar Activate Form, aktif pencere olduğu anda oluşur. Sözdizimi: Private Sub Form_Activate( ) Deactivate Form, deaktif pencere olduğu anda oluşur. Sözdizimi: Private Sub Form_Deactivate( ) Örnek: Private Sub MDIForm_Load () Form1.Caption = "Form #1" ' Form1 için pencere başlığı atanıyor. Dim NewForm As New Form1 ' Yeni bir child form oluşturuluyor. Load NewForm NewForm.Caption = "Form #2" ' Form2 için pencere başlığı atanıyor. NewForm.Show ' Yeni form görüntüleniyor. End Sub Private Sub Form_Activate () ' Durum çubuğu metni atanıyor: MDIForm1.Label1.Caption = "Current form: " & Me.Caption End Sub Click Form üzerinde fare tıklaması sırasında oluşur. Sözdizimi: Private Sub Form_Click( ) DblClick Form üzerinde çift fare tıklaması sırasında oluşur. Sözdizimi: Private Sub Form_DblClick( ) Örnek: Private Sub Form_Load () List1.AddItem "Nalan" ' Liste kutusunun girişleri belirleniyor. List1.AddItem "Cüneyt" List1.AddItem "Murat" List1.AddItem "Ferit" End Sub Private Sub List1_DblClick () Command1.Value = True ' Click olayı tetikleniyor. End Sub Private Sub Command1_Click () Text1.Text = List1.Text ' Seçilen seçenek Text1 nesnesine metin olarak aktarılıyor. End Sub DragDrop Sürükle-Bırak işlemi tamamlandığında oluşur. Sözdizimi: Private Sub Form_DragDrop(source As Control, x As Single, y As Single) x,y : Sürüklenen formun bırakıldığı konumdaki yatay ve dikey koordinatı. DragOver Sürükle-Bırak işlemi gerçekleştiğinde oluşur. Sözdizimi: Private Sub Form_DragOver(source As Control, x As Single, y As Single, state As Integer) x,y : Sürüklenen formun yatay ve dikey koordinatı. state : Formun o anki durumu. 0: form, hedefe bırakıldı; 1: form hedefe sürüklenmekte; 2: form hedef dışında bir noktaya bırakıldı. GotFocus Form fokusu aldığı anda oluşur. Sözdizimi: Private Sub Form_GotFocus( ) Initialize Form çalışma anında yaratıldığı anda oluşur. Sözdizimi: Private Sub form_Initialize( )
KeyDown, KeyUp
Form üzerinde herhangi bir tuşa basıldığı anda (KeyDown) ve tuş bırakıldığı anda (KeyUp) oluşurlar. Sözdizimi: Private Sub Form_KeyDown(keycode As Integer, shift As Integer), Private Sub Form_KeyUp(keycode As Integer, shift As Integer) keycode: VB nesne kütüphanesinde (VB-object library) yer alan düğme kodlarından birisi. shift: SHIFT, CTRL, ve ALT düğmelerinin durumunu verir. Bu tuşların sırasıyla 1,2 ve 4 bitlik değerleri vardır. Toplam değer kullanılır. KeyPress Form üzerinde herhangi bir tuşa basıldığı anda oluşur. Basılan tuşun ANSI kodunu verir. Sözdizimi: Private Sub Form_KeyPress(keyascii As Integer) keyascii: Basılan tuşun ANSI kodu. LinkClose DDE alışverişi kesildiği anda oluşur. Sözdizimi: Private Sub Form_LinkClose( ) LinkError DDE alışverişi sırasında hata olduğu anda oluşur. Sözdizimi: Private Sub Form_LinkError(linkerr As Integer) linkerr: Oluşan hata kodu. (Bkz: VbHelp) LinkExecute DDE alışverişi sırasında, hedef uygulama tarafından bir komut gönderildiği anda oluşur. Sözdizimi: Private Sub Form_LinkExecute(cmdstr As String, cancel As Integer) cmdstr : Hedef uygulama tarafından gönderilen komut stringi. cancel : Gönderilen komutun kabul parametresi. False: Kabul edildi; True: reddedildi. Örnek: Private Sub Form_LinkExecute (CmdStr As String, Cancel As Integer) Cancel = False Select Case LCase(CmdStr) Case "{big}" WindowState = 2 ' Ekranı kapla. Case "{little}" WindowState = 1 ' Simge durumu. Case "{hide}" Visible = False ' Formu gizle. Case "{view}" Visible = True ' Formu göster. Case Else Cancel = True ' Komut kabul edilmedi. End Select End Sub LinkOpen DDE alışverişi başlatıldğı anda oluşur. Sözdizimi: Private Sub Form_LinkOpen(cancel As Integer) cancel: 0: Alışveriş gerçekleştirilir, 0 dışında herhangi bir değer alışverişi durdurur. Load Form yüklendiği anda oluşur. Sözdizimi: Private Sub Form_Load() LostFocus Form fokusu kaybettiği anda oluşur. Sözdizimi: Private Sub Form_LostFocus( )
MouseDown MouseUp Form üzerinde fare düğmesine basıldığında (MouseDown) ve bırakıldığında (MouseUp) oluşurlar. Sözdizimi: Private Sub Form_MouseDown(button As Integer, shift As Integer, x As Single, y As Single) Private Sub Form_MouseUp(button As Integer, shift As Integer, x As Single, y As Single) button: Sol, Sağ ve Orta tultan hangisine basıldığını verir. Bu tuşların sırasıyla 1,2 ve 4 bitlik değerleri vardır. Toplam değer kullanılır. shift: SHIFT, CTRL, ve ALT düğmelerinin durumunu verir. Bu tuşların sırasıyla 1,2 ve 4 bitlik değerleri vardır. Toplam değer kullanılır. x,y: Fare imlecinin o anki konumunu verir. Örnek: Dim PaintNow As Boolean Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single, Y As Single) PaintNow = True ' Boyamayı aktif hale getirir. End Sub Private Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y As Single) PaintNow = False ' Boyamayı kapatır. End Sub Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single, Y As Single) If PaintNow Then PSet (X, Y) ' Belirlenen koordinatlara nokta koyar. End If End Sub Private Sub Form_Load () DrawWidth = 10 ' Geniş fırça kullan. ForeColor = RGB(0, 0, 255) ' Çizim rengini ata. End Sub MouseMove Fare imleci form üzerinde hareket ettirildiği anda oluşur. Sözdizimi: Private Sub Form_MouseMove(button As Integer, shift As Integer, x As Single, y As Single) button: Sol, Sağ ve Orta tultan hangisine basıldığını verir. Bu tuşların sırasıyla 1,2 ve 4 bitlik değerleri vardır. Toplam değer kullanılır. shift: SHIFT, CTRL, ve ALT düğmelerinin durumunu verir. Bu tuşların sırasıyla 1,2 ve 4 bitlik değerleri vardır. Toplam değer kullanılır. x,y: Fare imlecinin o anki konumunu verir. Örnek: Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Line -(X, Y) End Sub
Paint Form üzerinde yer alan bir grafik nesnesinin, taşıma ya da boyut değiştirme eylemlerinden sonra tekrar yenilendiği anda oluşur. Sözdizimi: Private Sub Form_Paint( ) Örnek: Çalıştırıp formun boyutlarını değiştirin. Private Sub Form_Paint () Dim HalfX, HalfY ' Değişken tanımları. HalfX = ScaleLeft + ScaleWidth / 2 ' Genişliğin orta noktası. HalfY = ScaleTop + ScaleHeight / 2 ' Yüksekliğin orta noktası. Line (ScaleLeft, HalfY) - (HalfX, ScaleTop) ' Karo çiz. Line -(ScaleWidth + ScaleLeft, HalfY) Line -(HalfX, ScaleHeight + ScaleTop) Line -(ScaleLeft, HalfY) End Sub Private Sub Form_Resize Refresh End Sub Resize Form boyutu değiştirildiği anda oluşur. Sözdizimi: Private Sub Form_Resize( ) Örnek: Çalıştırıp formun boyutlarını değiştirin. Private Sub Form_Load () Text1.Text = "" ' Text1 kutusunun metnini temizle. End Sub Private Sub Form_Resize () Text1.Move 0,0, ScaleWidth, ScaleHeight End Sub Terminate Formun çalışması, çalışma anında sonlandığı anda oluşur. Sözdizimi: Private Sub object_Terminate( ) Unload Form, bellekten boşaltıldığı anda oluşur. Sözdizimi: Private Sub Form_Unload(Cancel As Integer)
Aşağıdaki kesit ile verilen genel görünüme sahip bir çizim programı uygulaması geliştireceğiz:
Önbilgiler 1. Fonksiyonlar Çift yönlü veri alış-verişi gerçekleştiren prosedürlerdir. – Diğer prosedür çeşitleri: Sub (yordamlar) ve Property (Özellikler) – Genel sözdizimleri aşağıda açıklanmıştır:
[Public | Private | Friend] [Static] Function <Fonksiyon Adı> [(parametreler)] [As tür] [deyimler] [Fonksiyon adı = ifade] [Exit Function] [deyimler] [Fonksiyon adı = ifade] End Function
Public Opsiyonel-Fonksiyona tüm modüllerde yer alan tüm diğer prosedürler tarafından erişilebilir. Private Opsiyonel-Fonksiyona sadece kendisinin tanımlı olduğu modüldeki prosedürlerden erişilebilir. Friend Opsiyonel-Sadece Class-Modüllerde tanımlanır. (Bkz: VB Help Reference)
Static Opsiyonel-Fonksiyon tarafından kullanılan lokal değişkenler çağrılar arasında korunurlar. Fonksiyon adı Standart değişken isimlendirme kuralları kullanılarak belirlenen ad. parametreler Opsiyonel-Fonksiyona çağrıldığı anda veri aktaracak parametre değişkenleri. Bir ya da daha fazlası birbirlerinden virgülle ayrılarak tanımlanabilir: parametre-1 As tür-1, parametre-2 As tür-2,..., parametre-N As tür-N tür Opsiyonel-Fonksiyon tarafından geri döndürülecek değerin veri türü. Aşağıdakilerden birisi olabilir: Byte, Boolean, Integer, Long, Currency, Single, Double, Decimal, Date, String, Object, Variant ya da kullanıcı-tanımlı bir tür. deyimler Fonksiyon tarafından çalıştırılacak program deyimleri. ifade Opsiyonel-Fonksiyon tarafından geri döndürülecek değer.
2. CommandButton (Komut Düğmesi) İşlemleri başlatmak, kesmek ya da sonlandırmak için kullanılan kontrollerdir. Önemli özellikleri ve algıladığı bazı olaylar aşağıda açıklanmıştır: Özellikler Cancel : Butonun iptal düğmesi olup olmadığını belirler. Bir formda sadece bir iptal düğmesi yer alabilir. İptal düğmesi, form üzerinde yapılan son işlemi iptal eder. Caption : Buton üzerinde yer alacak yazıyı belirler. Style : Standart ya da Grafiksel olarak butonun türünü belirler. Arka fon renginin değiştirilmesi veya resim eklenmesi için grafiksel bir buton kullanılmalıdır. Olaylar Click : Butona basıldığı anda oluşur. Diğer olayların bir çoğu formlar tarafından algılanan olaylarla aynı şekilde çalışırlar. 3. ComboBox (Açılan Kutu) Açılan kutu biçiminde seçenekler sunan kontrollerdir. Önemli özellikleri ve algıladığı bazı olaylar aşağıda açıklanmıştır: Özellikler ItemData : ComboBox içinde yer alacak seçenekleri belirler. Bu işlem, örnek uygulamada yaptığımız gibi kod içersinde de gerçekleştirilebilir. Sorted : Seçeneklerin alfabetik olarak sıralanıp sıralanmayacağını belirler. Style : ComboBox’ın türünü belirler. Olaylar Click : ComboBox’tan bir seçenek seçildiği anda oluşur. Change : ComboBox’ta yer alan bir seçenek değiştirildiği anda oluşur. 4. Label (Etiket) Etiket bilgisi eklemek için kullanılır. 5. TextBox (Metin Kutusu) Tasarım anında veya kod ya da kullanıcı denetimli olarak bilgi gösteriminde kullanılan kontrollerdir. Önemli özellikleri ve algıladığı bazı olaylar aşağıda açıklanmıştır: Özellikler PasswordChar : TextBox’a girilecek bilginin belirlenen karakterle gizlenmesini (Şifre girişi gibi) sağlar. Text : TextBox içinde yer alan bilgiyi taşır. Olaylar Click : TextBox’a tıklandığı anda oluşur. Change : TextBox’ta yer alan bilgi değiştirildiği anda oluşur. 6. OptionButton (Seçenek Düğmesi) Açık ya da kapalı konuma ayarlanabilen seçenek kontrolüdür. Önemli özellikleri ve algıladığı bazı olaylar aşağıda açıklanmıştır: Özellikler Caption : Buton yanında yer alacak yazıyı belirler. Style : OptionButton’ın türünü belirler. Value : OptionButton’ın çalışma anında seçili olup olmadığını belirler. Olaylar Click : TextBox’a tıklandığı anda oluşur. 7. Frame (Çerçeve) Form alanında bir kontrol bölgesi yaratmak için kullanılan kontrollerdir. CurrentX, CurrentY Çizim metotlarında, en son çizim konumunun koordinatlarını verir. Bu koordinatların hangi metot için hangi konum olarak belirlendiği aşağıda listelenmiştir: Circle Merkez noktası. Cls 0, 0. (Ekranın sol-üst köşesi) Line Doğrunun son noktası. NewPage 0, 0. (Ekranın sol-üst köşesi) Print Bir sonraki basım pozisyonu. PSet Konulan noktanın kendisi. Uygulama İçin Yapılan Design-Time Ayarlamaları Uygulamada kullanılan nesnelerin tasarımda değiştirilen özellikleri aşağıda listelenmiştir: FrmAna : Form Name = FrmAna Appeareance = 0-Flat BackColor = &H80000005& BorderStyle = 1-Fixed Single Caption = Çizim V1.1 MaxButton = False StartUpPosition = 2-CenterScreen BtnTemizle : CommandButton Name = BtnTemizle Caption = TEMİZLE
BtnCikis : CommandButton Name = BtnCikis Caption = ÇIKIŞ BtnKalem : CommandButton Name = BtnKalem BackColor = &H80000018& Caption = KALEM Style = 1-Graphical BtnSilgi : CommandButton Name = BtnSilgi BackColor = &H8000000F& Caption = SİLGİ Style = 1-Graphical CmbRenk : ComboBox Name = CmbRenk Text = Siyah CmbKalinlik : ComboBox Name = CmbKalinlik Text = Orta OptDolgulu : OptionButton Name = OptDolgulu Caption = Dolgulu Value = True OptDolgusuz : OptionButton Name = OptDolgusuz Caption = Dolgusuz Value = False Açıklamalı Kodlar 1. Değişken ve Fonksiyon Tanımlamaları
Dim RenkKodu As Integer Dim CizimModu As Byte
Function KodaCevir(GelenText As String) As Integer If GelenText = "Siyah" Then KodaCevir = 0 If GelenText = "Kırmızı" Then KodaCevir = 12 If GelenText = "Yeşil" Then KodaCevir = 10 If GelenText = "Mavi" Then KodaCevir = 9 If GelenText = "Sarı" Then KodaCevir = 14 If GelenText = "Çok İnce" Then KodaCevir = 1 If GelenText = "İnce" Then KodaCevir = 2 If GelenText = "Orta" Then KodaCevir = 3 If GelenText = "Kalın" Then KodaCevir = 4 If GelenText = "Çok Kalın" Then KodaCevir = 5 End Function RenkKodu, ilgili ComboBox’tan seçilen rengin kodunu tutar. CizimModu ise Kalem ya da Silgi düğmelerinden hangisinin aktif olduğunu belirler. (1=Kalem,0=Silgi) KodaCevir fonksiyonu, text olarak gelen bilgiye karşılık gelen kodu geri döndürür. 2. Olay Kodları Private Sub Form_Load() CizimModu = 1 Me.DrawWidth = 2 TxtCemberYrcp.Text = "20" CmbRenk.AddItem "Siyah" CmbRenk.AddItem "Kırmızı" CmbRenk.AddItem "Mavi" CmbRenk.AddItem "Yeşil" CmbRenk.AddItem "Sarı" CmbKalinlik.AddItem "Çok İnce" CmbKalinlik.AddItem "İnce" CmbKalinlik.AddItem "Orta" CmbKalinlik.AddItem "Kalın" CmbKalinlik.AddItem "Çok Kalın" End Sub
Form yükleniyor. Çizim modu kaleme göre ayarlanıyor. Formun DrawWidth özelliğine (çizgi kalınlığı) 2 değeri veriliyor. TxtCemberYrcp TextBox’unun text özelliğine 20 değeri veriliyor ve sırasıyla CmbRenk ve CmbKalinlik ComboBox’ları dolduruluyor. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then Line -(X, Y), QBColor(RenkKodu) End Sub Fare imleci yer değiştiriyor. Eğer bu sırada basılan düğme sol fare düğmesi ise imlecin son çizim konumundan (CurrentX,CurrentY) o anki konumuna (X,Y) RenkKodu ile bir çizgi parçası çiziliyor. Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then Line -(X, Y), QBColor(RenkKodu) End Sub Fare düğmesi bırakılıyor. Eğer bırakılan düğme sağ fare düğmesi ise imlecin son çizim konumundan (CurrentX,CurrentY) o anki konumuna (X,Y) RenkKodu ile bir çizgi parçası çiziliyor. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) CurrentX = X CurrentY = Y End Sub Fare düğmesine basılıyor. Son çizim konumunu fare düğmelerinden herhangi birisine basılan konum olarak atar.
Private Sub Form_DblClick() If CizimModu = 1 Then FillColor = QBColor(RenkKodu) If OptDolgulu.Value = True Then FillStyle = 0 Else FillStyle = 1 Circle(CurrentX, CurrentY),Val(TxtCemberYrcp.Text) * 10 End If End Sub
Form üzerinde çift-tıklama yapılıyor. Eğer çizim modu 1 ise, yani kalem butonu basılı ise formun doldurma rengi özelliği RenkKodu değişkeninin taşıdığı değere karşılık gelen renk kodunu alıyor ve OptDolgulu OptionButton’ın Value özelliğinin True ya da aksi olması durumuna göre (Bu seçenek seçili ya da değil) formun FillStyle özelliği belirleniyor. Circle metodu kullanılarak son çizim konumu merkezli ve TxtCemberYrcp TextBox’ında yer alan değerin 10 katı yarıçaplı bir çember çiziliyor. Private Sub CmbRenk_Click() RenkKodu = KodaCevir(CmbRenk.Text) End Sub CmbRenk ComboBox’ında seçilen rengin kod karşılığını RenkKodu değişkenine aktarır. Private Sub CmbKalinlik_Click() Me.DrawWidth = KodaCevir(CmbKalinlik.Text) End Sub CmbKalinlik ComboBox’ında seçilen çizgi kalınlığını kod karşılığını formun DrawWidth özelliğine aktarır. Private Sub BtnTemizle_Click() Me.Cls End Sub BtnTemizle butonuna basılıyor. Form temizleniyor. Private Sub BtnCikis_Click() End End Sub BtnCikis butonuna basılıyor. Program sonlanıyor. Private Sub BtnSilgi_Click() CizimModu = 0 Me.DrawWidth = 15 RenkKodu = 15 BtnSilgi.BackColor = &H80000018 'Sarı renk kodu BtnKalem.BackColor = &H8000000F 'Gri renk kodu End Sub BtnSilgi butonuna basılıyor. Çizim modu silgi olarak belirleniyor ve kalınlık 15’e, renk kodu 15’e (beyaz) ayarlanıyor. BtnSilgi butonunun arka fon rengi sarı, BtnKalem butonunun arka fon rengi griye dönüştürülüyor. Private Sub BtnKalem_Click() CizimModu = 1 Me.DrawWidth = KodaCevir(CmbKalinlik.Text) RenkKodu = KodaCevir(CmbRenk.Text) BtnKalem.BackColor = &H80000018 'Sarı renk kodu BtnSilgi.BackColor = &H8000000F 'Gri renk kodu End Sub BtnKalem butonuna basılıyor. Çizim modu kalem olarak belirleniyor ve kalınlık CmbKalinlik ComboBox’ının textinin kod değerine, renk kodu CmbRenk ComboBox’ının textinin kod değerine ayarlanıyor. BtnSilgi butonunun arka fon rengi gri, BtnKalem butonunun arka fon rengi sarıya dönüştürülüyor.
DEĞİŞKEN TANIMLAMALARI (DIM) Değişken tanımlamaları genel olarak üç farklı biçimde yapılabilir: Global, Yarı-global ve Lokal. Lokal tanımlamalar bir nesneye ait altprogramlar içersinde gerçekleştirilen tanımlamalardır. Yarı-global tanımlamalar ise söz konusu nesnenin declarations kesiminde gerçekleştirilen ve nesneye ait tüm kodlarda geçerlilik sağlayan tanımlamalardır. Global tanımlamalar, projenin module bileşeninde gerçekleştirilirler ve tüm proje kapsamında geçerlilik sağlarlar. Değişken tanımlamalarında kullanılan Dim deyiminin genel sözdizimi aşağıdaki gibidir: Dim <Değişken adı>[([indisler])] [As [New] tür] Açıklamalar: <Değişken adı> Standart değişken isimlendirme kurallarına bağlı kalarak (Türkçe harfler, aritmetik işlem ya da mantıksal bağlaç operatörleri kullanılmayacak) verilecek herhangi bir isim. indisler Dizi türü değişken tanımlamalarında kullanılan indis alt ve üst sınırı. Genel olarak şu şekilde tanımlanırlar: AltSınır To ÜstSınır New Belirtildiği takdirde daha önceden tanımlanmış olan değişken, reset yapılarak yeniden tanımlanır. tür Belirtme zorunluluğu yoktur. (Belirtilmediği takdirde Variant olarak algılanır) Genel olarak kullanılabilecek değişken türleri: Byte (Küçük tamsayı), Boolean (Doğru/Yanlış), Integer (Tamsayı), Long (Büyük tamsayı), Currency (Para birimi), Single (Küçük gerçel sayı), Double (Büyük gerçel sayı), Decimal (10’un kuvvetleri), Date (tarih), String (metin), String*uzunluk (sabit-uzunluklu metinler için), Object (Nesne), Variant (Nümerik, string ya da tarih türlerinin hepsini kapsayan bir tür.) ya da kullanıcı-tanımlı bir tür. Örnek: Dim Deger1, Deger2 ‘Her ikisi de Variant Dim Sayi As Integer Dim Bulundu, Secim As Boolean, DogumTrh As Date Dim Dizi(50) ’51 elemanlı Variant dizisi Dim Matris(3, 4) As Integer ’12 elemanlı tamsayı matrisi Dim Matris3d(1 To 5, 4 To 9, 3 To 5) As Double ’90 elemanlı gerçel sayı matrisi Dim Trh(1 To 10) As Date ‘1 den 10 a kadar indekslenmiş tarih dizisi Dim MyArray() ‘Dinamik bir Variant dizisi (Belirli bir indeksleme yok) KOŞULLU İFADELER 1. If..Then..Else Tek-satırlı kullanım: If <koşul ifadesi> Then deyimler [Else deyimler] Blok kullanımı: If <koşul ifadesi> Then deyimler [ElseIf <koşul ifadesi> Then deyimler] [Else deyimler] End If Açıklamalar: <koşul ifadesi> True(Doğru) ya da False(Yanlış) olarak değerlendirilebilecek sayısal ya da sayısal olmayan bir ifade. Eğer koşul boş ise (Null), False olarak değerlendirilir. deyimler Tek-satırlı kullanımda birbirlerinden “:” işareti ile ayrılmış çalıştırılabilir kod deyimleri. Örneğin; If A > 10 Then A = A + 1 : B = B + A : C = C + B gibi. Blok kullanımda her biri ayrı satırlara yazılmış çalıştırılabilir kod deyimleri. Örnek: Dim Sayi, Basamak, Sonuc Sayi = 53 ' Değişkenin ilk değeri atanıyor. ‘ Blok kullanımı: If Sayi < 10 Then Basamak = 1 ElseIf Sayi < 100 Then Basamak = 2 Else Basamak = 3 End If ' Tek-satırlı kullanım: If Basamak = 1 Then Sonuc = "Tek basamaklı" Else Sonuc = "Birden çok basamaklı"
2. Select Case Select Case <ifade> [Case <ifade-1> [<deyimler-1>] [Case <ifade-2> [<deyimler-2>] . . . [Case <ifade-n> [<deyimler-n>] [Case Else [deyimler] End Select Örnek: Private Sub Command1_Click() Select Case Val(Text1.Text) Case 0 To 49 MsgBox "Notunuz:D" Case 50 To 69 MsgBox "Notunuz:C" Case 70 To 89 MsgBox "Notunuz:B" Case 90 To 100 MsgBox "Notunuz:A" Case Else MsgBox "Notunuz Alfabetik Sistemde Hesaplanamadı" End Select End Sub DÖNGÜLER 1. Do..Loop İki farklı kullanımı olan döngü deyimidir. Bunlardan ilki; Do [{While | Until} <koşul ifadesi>] [deyimler] [Exit Do] [deyimler] Loop Diğeri ise; Do [deyimler] [Exit Do] [deyimler] Loop [{While | Until} <koşul ifadesi>] biçimindedir. İki kullanım arasındaki fark, ilkinde koşulun işlemlere başlanmadan önce, ikincisinde ise işlemler en az bir defa gerçekleştirildikten sonra denetleniyor olmasıdır. Exit Do ifadesi deyimler arasında istenilen bir noktada döngüyü kırmak için kullanılır. Örnek: Dim Denetle, Sayac Denetle = True: Sayac = 0 ' Değişkenlerin ilk değerleri atanıyor. Do ' Dıştaki döngü başlıyor. Do While Sayac < 20 ' İçteki döngü. Sayac = Sayac + 1 ' Sayac birer birer artıyor. If Sayac = 10 Then Denetle = False Exit Do ' İçteki döngüden çıkılıyor. End If Loop Loop Until Denetle = False ' Dıştaki döngü için sonlanma koşulu. 2. For Each..Next For Each <eleman> In <grup> [deyimler] [Exit For] [deyimler] Next [eleman] Örnek: Verilen örnekte Nesne, text özelliğine sahip bir nesneyi temsil eden değişkendir. Koleksiyon ise bir nesneler koleksiyonudur. Dim Bulundu, Nesne, Koleksiyon Bulundu = False For Each Nesne In Koleksiyon If Nesne.Text = "Merhaba" Then Bulundu = True Exit For End If Next 3. For..Next En çok kullanılan döngü biçimidir. Başlangıç ve bitiş değerleri sayısal ya da sayısal olmayan ifadeler, basamak ise döngü sıçrama değeridir. For <sayaç> = <başlangıç değeri> To <bitiş değeri> [Step <basamak>] [deyimler] [Exit For] [deyimler] Next [<sayaç>] Örnek: Dim Kelimeler, Karakterler, YeniText For Kelimeler = 10 To 1 Step -1 ' 10’dan başlayarak azalan döngü. For Karakterler = 0 To 9 ' 0’dan başlayarak artan döngü. YeniText = YeniText & Karakterler ' YeniText stringi oluşturuluyor. Next Karakterler YeniText = YeniText & " " ' Kelimeler arası bir boşluk ekleniyor. Next Kelimeler 4. While..Wend Ön-denetimli bir koşullu döngü biçimidir: While <koşul ifadesi> [deyimler] Wend Örnek: Dim Sayac Sayac = 0 While Sayac < 20 Sayac = Sayac + 1 Wend
SUB PROSEDÜRLER Sadece veri girişi yapılabilen altprogramlardır. Genel sözdizimleri aşağıdaki gibidir: [Private | Public | Friend] [Static] Sub <Prosedür Adı> [(parametreler)] [deyimler] [Exit Sub] [deyimler] End Sub Hazırlanan bir sub prosedürü sadece adı ve parametreleri kullanılarak ya da Call <Prosedür Adı> (parametreler) bildirimi ile çağrılabilir. NOT : Sözdizimde yer alan öntakılar için bakınız: Fonksiyonlar. Örnek: ‘Dikdörtgenin alanı hesaplanıyor: Sub DikdörtgenAlan(Uzunluk, Yukseklik) Dim Alan As Double ' Lokal değişken. If Uzunluk = 0 Or Yukseklik = 0 Then Exit Sub End If Alan = Yukseklik * Uzunluk MsgBox Alan End Sub ‘Formu ekrana göre ortalayan altprogram: Sub CenterForm(frm as Form) ‘Parametre olarak Form nesnesi türünde tanımlanmış ‘frm değişkeni kullanılıyor. frm.left=(screen.Width-frm.Width)/2 ‘Formun sol kenar konumu, ekran genişliği ile ‘formun genişliğinin farkının yarısı oluyor. (form, ‘ekranın yatay-ortasına göre ortalanıyor) frm.top=(screen.Height-frm. Height)/2 ‘Formun üst kenar konumu,ekran yüksekliği ile ‘formun yüksekliğinin farkının yarısı oluyor. ‘(form,ekranın dikey-ortasına göre ortalanıyor) End Sub HESAP MAKİNESİ V1.0 Bu kesimde genel bir hesap makinesi uygulaması geliştireceğiz. Bu uygulamada amaç, TextBox ve CommandButton kontrollerinin etkin olarak kullanımları üzerinde daha fazla pratik yapmaktır. Uygulamamız, genel görünümü aşağıda verilen bir tek forma sahip olacaktır: Önbilgiler String İşlemleri String türü bilgiler üzerinde çeşitli işlemler gerçekleştiren bazı önemli fonksiyonlar aşağıda verilmiştir: LSet stringvar = string; varname1 = varname2 : String değişkenler arasında sola dayalı olarak aktarma yapar. Örnek: Dim DnmStr DnmStr = "0123456789" ' String değişkenin ilk değeri. Lset DnmStr = "<-Sola" RSet stringvar = string; varname1 = varname2 : String değişkenler arasında sağa dayalı olarak aktarma yapar. InStr([başlangıç, ]string1, string2[, AramaModu]) : string1 içersinde string2 nin ilk bulunuş pozisyonunu verir. Örnek: Dim ArananString, ArananKarakter, Pozisyon ArananString ="XXpXXpXXPXXP" . ArananKarakter = "P" Pozisyon = Instr(4, ArananString, ArananKarakter, 1) ‘4 ten itibaren metinsel (textual) arama yapar. Sonuç:6 Pozisyon = Instr(1, ArananString, ArananKarakter, 0) ‘1 den itibaren ikili (binary) arama yapar. Sonuç :9 Pozisyon = Instr(ArananString, ArananKarakter) ' Varsayılan arama modu ikili aramadır. Sonuç:9. Pozisyon = Instr(1, ArananString, "W") ' Sonuç: 0. & Operatörü : İki stringin birleştirilmesinde kullanılır. Asc(string) : Eğer string birden çok karakterden oluşuyorsa ilk karakterin ASCII değerini verir. Örnek: Dim Sayi Sayi = Asc("A") ' Sonuç: 65. Sayi = Asc("a") ' Sonuç: 97. Sayi = Asc("Alfabe") ' Sonuç: 65. Chr(kod) : Koda karşılık gelen karakteri verir. Str(sayı) : Sayıyı string türüne dönüştürür. Val(string) : String bilgiyi sayısal bilgiye dönüştürür. Left(string, uzunluk) : stringin soldan uzunluk sayıda karakterin oluşturduğu parçasını verir. Örnek: Dim String1, String2 String1 = "Merhaba Dünya" String2 = Left(String1, 1) ' Sonuç: "M". String2 = Left(String1, 7) ' Sonuç: "Merhaba". String2 = Left(String1, 20) ' Sonuç: "Merhaba Dünya". Right(string, uzunluk) : stringin sağdan uzunluk sayıda karakterin oluşturduğu parçasını verir. Len(string) : stringin karakter sayısını verir. LTrim(string), RTrim(string), Trim(string) : Sırasıyla string içersinde yer alan boşluklardan soldakileri, sağdakileri, sol ve sağdakileri elimine ederler. Mid(string, başlangıç[, uzunluk]) : string içersinden, başlangıç pozisyonundan itibaren uzunluk sayıda karakterin oluşturduğu stringi verir. Mid(string1, başlangıç[, uzunluk]) = string2 : string1 içersinde, başlangıç pozisyonundan itibaren uzunluk sayıda karakterin yerine string2 yi aktarır. Örnek: Dim yazi yazi = "Duvardan köpek atladı" Mid(yazi, 10, 5) = "tilki" ' yazi = "Duvardan tilki atladı". Space(sayı) : Belirtilen sayı kadar boşluk karakteri içeren boş string üretir. String(sayı, karakter) : Belirtilen karakteri belirtilen sayı kadar tekrarlı olarak içeren string üretir. Örnek: Dim Str1 Str1 = String(5, "*") ' Sonuç: "*****". Str1 = String(5, 42) ' Sonuç: "*****". Str1 = String(10, "ABC") ' Sonuç: "AAAAAAAAAA". Veri Türleri Dönüşüm Fonksiyonları CBool(ifade) CByte(ifade) CCur(ifade) CDate(ifade) CDbl(ifade) CDec(ifade) CInt(ifade) CLng(ifade) CSng(ifade) CVar(ifade) CStr(ifade) Açıklamalı Kodlar Dim sayi, Bellek1, Bellek2, Bellek3, Bellek4 As Double Dim TusaBasildi As Byte Dim Arti, Eksi, Carpi, Bol, Kuvvet, Ondalik As Boolean Değişken tanımlamaları. Private Sub Btn0_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "0" Else TxtEkran.Text = "0" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "0" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "0" End If End If If LbBilgiEkr.Caption="E" Then LbBilgiEkr.Caption="" End Sub 0 (Sıfır) butonuna basılıyor. TusaBasildi değişkeni herhangi bir aritmetik işlem butonuna basılıp basılmadığını belirliyor. (0=basılmamış, 1=basılmış) Ondalik boolean değişkeni ise ondalık düğmesine basılıp basılmadığını belirliyor. (T=basılmış, F=basılmamış) Kod iki ana durum altında inceleniyor: Arit.işlem tuşuna basılmış ya da basılmamış. Eğer basılmamışsa ondalık tuşunun da durumuna göre ekrana yeni bir 0 ekleniyor veya doğrudan 0 aktarılıyor. Eğer basılmışsa yine ondalık tuşunun durumuna göre ekrana yeni bir 0 ekleniyor veya ekrandaki mevcut sayı sayi değişkenine alınarak ekrana doğrudan 0 aktarılıyor. Son olarak, eğer bilgi ekranında E (Hata) varsa bu kaldırılıyor. Private Sub BtnAE_Click() TxtEkran.Text = -1 * CDbl(TxtEkran.Text) If LbBilgiEkr.Caption="E" Then LbBilgiEkr.Caption="" End Sub Art-Eksi butonuna basılıyor. Ekrandaki değer –1 ile çarpılıyor ve eğer bilgi ekranında E (Hata) varsa bu kaldırılıyor.
Private Sub BtnAl1_Click() If CDbl(TxtEkran.Text) <> 0 Then Bellek1 = CDbl(TxtEkran.Text) BtnAl1.BackColor = QBColor(12) End If End Sub İlk bellek hücresine veri giriş butonuna basılıyor. Eğer ekrandaki değer sıfırdan farklıysa Bellek1 değişkenine ekrandaki string değer double türüne dönüştürülerek yerleştiriliyor. Bunun ardından butonun rengi kırmızı yapılıyor. Private Sub BtnBellekTmz_Click() Bellek1 = 0 Bellek2 = 0 Bellek3 = 0 Bellek4 = 0 BtnAl1.BackColor = QBColor(10) BtnAl2.BackColor = QBColor(10) BtnAl3.BackColor = QBColor(10) BtnAl4.BackColor = QBColor(10) End Sub Bellek temizleme butonuna basılıyor. Tüm bellek değişkenleri sıfırlanıyor ve veri giriş butonları tekrar ilk renklerine (yeşil) dönüştürülüyor. Private Sub BtnTopla_Click() TusaBasildi = 1 Arti = True Ondalik = False LbBilgiEkr.Caption = "+" End Sub Aritmetik işlem butonlarına basılıyor. Her tuş için kendisine ait boolean değişken True oluyor, bilgi ekranına basılan tuşun etiketi aktarılıyor ve TusaBasildi ile Ondalik değişkenleri uygun değerleri alıyor. Private Sub BtnC_Click() TxtEkran.Text = 0 TusaBasildi = 0 Ondalik = False LbBilgiEkr.Caption = "" End Sub Tam Silme butonuna basılıyor. Tüm değerler sıfırlanıyor. Private Sub BtnCE_Click() TxtEkran.Text = 0 Ondalik = False LbBilgiEkr.Caption = "" End Sub Kısmi Silme butonuna basılıyor. TusaBasildi hariç tüm değerler sıfırlanıyor. Dolayısıyla işlem ve işlemden önceki sayı korunmuş oluyor. Private Sub BtnDel_Click() If CDbl(TxtEkran.Text) <> 0 Then If Len(TxtEkran.Text) = 1 Or (Len(TxtEkran.Text) = 2 And Left(TxtEkran.Text, 1) = "-") Then TxtEkran.Text = 0 Else TxtEkran.Text = Left(TxtEkran.Text, Len(TxtEkran.Text) - 1) End If End If LbBilgiEkr.Caption = "" End Sub Sağdan-Silme butonuna basılıyor. Kod eğer ekrandaki text sıfırdan farklıysa çalışıyor. İki durumda inceleniyor: Eğer ekranda tek karakter kaldıysa ya da tek karakterli negatif bir sayı kaldıysa (-3 gibi) doğrudan sıfıra indirgeniyor. Aksi durumlarda ekrandaki karakterler sağdan birer birer siliniyor.
Private Sub BtnEsit_Click() If Arti Then TxtEkran.Text = sayi + CDbl(TxtEkran.Text) Arti = False ElseIf Eksi Then TxtEkran.Text = sayi - CDbl(TxtEkran.Text) Eksi = False ElseIf Carpi Then TxtEkran.Text = sayi * CDbl(TxtEkran.Text) Carpi = False ElseIf Bol Then If CDbl(TxtEkran.Text) = 0 Then LbBilgiEkr.Caption = "E" Else TxtEkran.Text = sayi / CDbl(TxtEkran.Text) End If Bol = False ElseIf Kuvvet Then TxtEkran.Text = sayi ^ CDbl(TxtEkran.Text) Kuvvet = False End If TusaBasildi = 1 Ondalik = False LbBilgiEkr.Caption = "" End Sub Eşittir butonuna basılıyor. Daha önce basılan arit.işlem butonuna göre işlemden önceki sayı ve o an ekranda bulunan sayı işleme sokuluyor. Bölme işleminde, sıfıra bölünme hatası algılanıyor ve bilgi ekranına hata işareti (E) basılıyor. Private Sub BtnOff_Click() Unload Me End Sub Off butonuna basılıyor. Form geri-yükleniyor. Private Sub BtnOndlk_Click() If Not Ondalik Then Ondalik = True If TusaBasildi = 0 Then TxtEkran.Text = TxtEkran.Text & "," Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "0," End If End If End Sub Ondalık butonuna basılıyor. Kod eğer daha önce bu butona basılmadıysa çalışıyor. Aritmetik işlem butonuna basılmışsa sayı ekrandan alınıyor (işlemde kullanılmak üzere) ve ekrana “0,” basılıyor. Aksi durumda ekrandaki değer “,” ekleniyor. Private Sub BtnSqrt_Click() TusaBasildi = 1 If CDbl(TxtEkran.Text) < 0 Then LbBilgiEkr.Caption = "E" Else TxtEkran.Text = Sqr(CDbl(TxtEkran.Text)) End If If LbBilgiEkr.Caption<>"E" Then LbBilgiEkr.Caption="" End Sub Karekök butonuna basılıyor. Eğer ekrandaki sayı negatifse bilgi ekranına hata işareti basılıyor. Aksi durumda ekrandaki sayının karekökü hesaplanıp yine ekrana aktarılıyor.
Private Sub BtnVer1_Click() If Bellek1 <> 0 Then If TusaBasildi = 0 Then TxtEkran.Text = Bellek1 Else sayi = CDbl(TxtEkran.Text) TusaBasildi = 0 TxtEkran.Text = Bellek1 End If End If TusaBasildi = 1 End Sub İlk bellek hücresine veri çıkış butonuna basılıyor. Kod, hücredeki değer sıfırdan farklıysa iki durumda çalışıyor: Eğer aritmetik işlem tuşuna basılmamıisa ekrana Bellek1 değişkenindeki değer yerleştiriliyor. Aksi durumda ekrandaki değer sayı değişkenine alınıyor ve ekrana Bellek1 değişkenindeki değer yerleştiriliyor. Private Sub BtnX_Click() TusaBasildi = 1 If CDbl(TxtEkran.Text) = 0 Then LbBilgiEkr.Caption = "E" Else TxtEkran.Text = 1 / CDbl(TxtEkran.Text) End If If LbBilgiEkr.Caption<>"E" Then LbBilgiEkr.Caption="" End Sub 1/x butonuna basılıyor. Ekrandaki değer sıfırdan farklıysa 1/değer hesaplanıp tekrar ekrana aktarılıyor. Aksi durumda bilgi ekranına hata işareti (E) basılıyor. Private Sub BtnX2_Click() TusaBasildi = 1 TxtEkran.Text = CDbl(TxtEkran.Text) ^ 2 LbBilgiEkr.Caption = "" End Sub x^2 butonuna basılıyor. Ekrandaki değerin karesi hesaplanıp tekrar ekrana aktarılıyor. Kodun Tamamı Dim sayi, Bellek1, Bellek2, Bellek3, Bellek4 As Double Dim TusaBasildi As Byte Dim Arti, Eksi, Carpi, Bol, Kuvvet, Ondalik As Boolean
Private Sub Btn0_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "0" Else TxtEkran.Text = "0" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "0" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "0" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub Private Sub Btn1_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "1" Else TxtEkran.Text = "1" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "1" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "1" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn2_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "2" Else TxtEkran.Text = "2" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "2" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "2" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn3_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "3" Else TxtEkran.Text = "3" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "3" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "3" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn4_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "4" Else TxtEkran.Text = "4" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "4" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "4" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn5_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "5" Else TxtEkran.Text = "5" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "5" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "5" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn6_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "6" Else TxtEkran.Text = "6" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "6" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "6" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn7_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "7" Else TxtEkran.Text = "7" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "7" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "7" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn8_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "8" Else TxtEkran.Text = "8" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "8" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "8" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub Btn9_Click() If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & "9" Else TxtEkran.Text = "9" End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & "9" Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "9" End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub BtnAE_Click() TxtEkran.Text = -1 * CDbl(TxtEkran.Text) If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub BtnAl1_Click() If CDbl(TxtEkran.Text) <> 0 Then Bellek1 = CDbl(TxtEkran.Text) BtnAl1.BackColor = QBColor(12) End If End Sub
Private Sub BtnAl2_Click() If CDbl(TxtEkran.Text) <> 0 Then Bellek2 = CDbl(TxtEkran.Text) BtnAl2.BackColor = QBColor(12) End If End Sub
Private Sub BtnAl3_Click() If CDbl(TxtEkran.Text) <> 0 Then Bellek3 = CDbl(TxtEkran.Text) BtnAl3.BackColor = QBColor(12) End If End Sub
Private Sub BtnAl4_Click() If CDbl(TxtEkran.Text) <> 0 Then Bellek4 = CDbl(TxtEkran.Text) BtnAl4.BackColor = QBColor(12) End If End Sub
Private Sub BtnBellekTmz_Click() Bellek1 = 0 Bellek2 = 0 Bellek3 = 0 Bellek4 = 0 BtnAl1.BackColor = QBColor(10) BtnAl2.BackColor = QBColor(10) BtnAl3.BackColor = QBColor(10) BtnAl4.BackColor = QBColor(10) End Sub
Private Sub BtnBol_Click() TusaBasildi = 1 Bol = True Ondalik = False LbBilgiEkr.Caption = "/" End Sub
Private Sub BtnC_Click() TxtEkran.Text = 0 TusaBasildi = 0 Ondalik = False LbBilgiEkr.Caption = "" End Sub
Private Sub BtnCarp_Click() TusaBasildi = 1 Carpi = True Ondalik = False LbBilgiEkr.Caption = "x" End Sub
Private Sub BtnCikar_Click() TusaBasildi = 1 Eksi = True Ondalik = False LbBilgiEkr.Caption = "-" End Sub
Private Sub BtnDel_Click() If CDbl(TxtEkran.Text) <> 0 Then If Len(TxtEkran.Text) = 1 Or (Len(TxtEkran.Text) = 2 And Left(TxtEkran.Text, 1) = "-") Then TxtEkran.Text = 0 Else TxtEkran.Text = Left(TxtEkran.Text, Len(TxtEkran.Text) - 1) End If End If LbBilgiEkr.Caption = "" End Sub
Private Sub BtnEsit_Click() If Arti Then TxtEkran.Text = sayi + CDbl(TxtEkran.Text) Arti = False ElseIf Eksi Then TxtEkran.Text = sayi - CDbl(TxtEkran.Text) Eksi = False ElseIf Carpi Then TxtEkran.Text = sayi * CDbl(TxtEkran.Text) Carpi = False ElseIf Bol Then If CDbl(TxtEkran.Text) = 0 Then LbBilgiEkr.Caption = "E" Else TxtEkran.Text = sayi / CDbl(TxtEkran.Text) End If Bol = False ElseIf Kuvvet Then TxtEkran.Text = sayi ^ CDbl(TxtEkran.Text) Kuvvet = False End If TusaBasildi = 1 Ondalik = False LbBilgiEkr.Caption = "" End Sub
Private Sub BtnOff_Click() Unload Me End Sub
Private Sub BtnOndlk_Click() If Not Ondalik Then Ondalik = True If TusaBasildi = 0 Then TxtEkran.Text = TxtEkran.Text & "," Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "0," End If End If End Sub
Private Sub BtnSqrt_Click() TusaBasildi = 1 If CDbl(TxtEkran.Text) < 0 Then LbBilgiEkr.Caption = "E" Else TxtEkran.Text = Sqr(CDbl(TxtEkran.Text)) End If If LbBilgiEkr.Caption <> "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub BtnTopla_Click() TusaBasildi = 1 Arti = True Ondalik = False LbBilgiEkr.Caption = "+" End Sub
Private Sub BtnCE_Click() TxtEkran.Text = 0 Ondalik = False LbBilgiEkr.Caption = "" End Sub
Private Sub BtnVer1_Click() If Bellek1 <> 0 Then If TusaBasildi = 0 Then TxtEkran.Text = Bellek1 Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = 0 TusaBasildi = 0 TxtEkran.Text = Bellek1 End If End If TusaBasildi = 1 End Sub
Private Sub BtnVer2_Click() If Bellek2 <> 0 Then If TusaBasildi = 0 Then TxtEkran.Text = Bellek2 Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = 0 TusaBasildi = 0 TxtEkran.Text = Bellek2 End If End If TusaBasildi = 1 End Sub
Private Sub BtnVer3_Click() If Bellek3 <> 0 Then If TusaBasildi = 0 Then TxtEkran.Text = Bellek3 Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = 0 TusaBasildi = 0 TxtEkran.Text = Bellek3 End If End If TusaBasildi = 1 End Sub
Private Sub BtnVer4_Click() If Bellek4 <> 0 Then If TusaBasildi = 0 Then TxtEkran.Text = Bellek4 Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = 0 TusaBasildi = 0 TxtEkran.Text = Bellek4 End If End If TusaBasildi = 1 End Sub
Private Sub BtnX_Click() TusaBasildi = 1 If CDbl(TxtEkran.Text) = 0 Then LbBilgiEkr.Caption = "E" Else TxtEkran.Text = 1 / CDbl(TxtEkran.Text) End If If LbBilgiEkr.Caption <> "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub BtnX2_Click() TusaBasildi = 1 TxtEkran.Text = CDbl(TxtEkran.Text) ^ 2 LbBilgiEkr.Caption = "" End Sub
Private Sub BtnXY_Click() TusaBasildi = 1 Kuvvet = True LbBilgiEkr.Caption = "^" Ondalik = False End Sub
Private Sub Form_Load() TxtEkran.Text = 0 TusaBasildi = 0 Arti = False Eksi = False Carpi = False Bol = False Ondalik = False Bellek1 = 0 Bellek2 = 0 Bellek3 = 0 Bellek4 = 0 End Sub
HESAP MAKİNESİ V1.1 : HESAPLAMADA HIZIN YENİ ADI ! Hesap makinemizin bu yeni versiyonunda görünüm ve işlev olarak önemli bir değişiklik yapmıyoruz. Ancak sloganımıza da uygun olarak kodlarda oldukça kısalık sağlayacak, dolayısıyla çalışabilir program kodunu (exe) önemli ölçüde küçültecek ve çalışma-zamanı hızını artıracak bazı modifikasyonlar yapacağız. Bunlar iki grupta toplayabiliriz: • Kontrol Dizileri (Control Arrays) • Hata Algılayıcı (On Error .. GoTo) Kontrol Dizileri (Control Arrays) Kontrol dizileri, benzer koda sahip kontrol nesnelerinin bir sayı ile indekslenerek, olay kodlarının tek bir sub içersinde verilmesine olanak sağlarlar. Bu sayı, Index adlı ilk değeri sıfır olan bir değişkende tutulur. Örneğin BtnSayilar adlı bir CommandButton kontrol nesnesi eğer bir kontrol dizisi haline getirilirse, BtnSayilar(0), BtnSayilar(1), ..., BtnSayilar(n) biçiminde n-tane kontrol nesnesi elde ederiz. Bir Kontrol Dizisini Nasıl Yaratırım? Kontrol dizilerini yaratmanın en pratik yöntemi, dizi haline getirilecek kontrol nesnesinin kopyalanıp tekrar yapıştırılmasıdır. Bu yapıldığında aşağıdaki mesajı içeren bir mesaj kutusu ile karşılaşırız: You already have a control named ‘BtnSayilar’. Do you want to create a control array? Bize, BtnSayilar adlı bir kontrol nesnemizin zaten varolduğu ve bir kontrol dizisi yaratmak isteyip istemediğimiz sorulmaktadır. Eğer cevabımız hayır ise yapıştırılan, BtnSayilar kontrolünden bağımsız yeni bir nesne olacaktır. Aksi durumda ise BtnSayilar otomatik olarak indekslenerek BtnSayilar(0), yapıştırılan yeni nesne de BtnSayilar(1) olarak adlandırılacaktır. Gelelim bizim uygulamamıza... Hesap makinemizin aşağıda verilen butonları, birbirlerine oldukça benzer olay kodlarına sahiptirler: • Sayı butonları. (Btn0, Btn1, ..., Btn9) • Aritmetik işlem butonları (BtnTopla, BtnCikar, BtnCarp, BtnBol, BtnXY) • Fonksiyon butonları (BtnSqrt, BtnX, BtnX2) • Bellek Giriş butonları (BtnAl1, ..., BtnAl4) • Bellek Çıkış butonları (BtnVer1, ..., BtnVer4) Dolayısıyla bu buton gruplarının her birini birer kontrol dizisi hailen getirebiliriz. Aşağıdaki resimde bu kontrol dizileri gösterilmiştir:
Kontrol dizilerinde yer alan her bir buton birbirinden Index değişkeni ile ayrılmaktadır. Örneğin, BtnSayi(2)_Click olayı 2 butonuna basıldığı anda, BtnFonk(2)_Click olayı ise 1/x butonuna basıldığı anda oluşacaktır. On Error .. GoTo Bir prosedür içersinde herhangi bir hata oluştuğunda programın davranışını belirlemek için kullanılır. Üç farklı sözdizimi vardır: On Error GoTo <satır adı> : Hata durumunda kodun akışını belirtilen satıra yönlendirir. On Error Resume Next : Hata durumunda kodun akışını hatanın oluştuğu deyimden sonraki deyime geçirir. On Error GoTo 0 : Söz konusu prosedür için hata algılayıcısını kapatır. On Error ile yakalanan hata, Err nesnesi kullanılarak saptanabilir. Hata oluştuğunda Err nesnesinin Number özelliği hatanın kodunu gösteren sayısal bir değer alır. Biz uygulamamızda iki tip hatayı bu yöntemleri kullanarak yakaladık ve bilgi ekranımızda hata mesajı (E) verdirdik: sıfıra bölme ve negatif sayıların karekökü. (Bu hataların kodları sırasıyla 11 ve 5’tir.) Böylece her durum için (paydanın sıfır olup olmadığı, karekökü alıncak sayının negatif olup olmadığı gibi) gereksiz denetimler yapmaktan kurtulmuş olduk. Uyarılar&Açıklamalar “On Error Resume Next” her nekadar çoğunlukla programcının sihirli değneği konumunda da olsa aslında oldukça tehlikeli bir komuttur. Koda “hata ne olursa olsun sen bir sonraki deyimden devam et” demek, sizin de takdir edeceğiniz gibi pekte profesyonel bir yaklaşım olmasa gerek...! Oluşan hatanın kodunu öğrenmenin pratik bir yolu vardır. Hatanın oluştuğu görüldükten ve hataya sebep olan prosedür belirlendikten sonra o prosedürün başına yerleştirilecek On Error GoTo ile yönlendirme yapılan satırda şu fonksiyonu yazmak yeterli olacaktır: MsgBox Err.Number Hesap Makinesi V1.1 - Kodun Tamamı Dim sayi, Bellek(3) As Double Dim TusaBasildi As Byte Dim Arti, Eksi, Carpi, Bol, Kuvvet, Ondalik As Boolean
Private Sub BtnAE_Click() TxtEkran.Text = -1 * CDbl(TxtEkran.Text) If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub BtnBellekTmz_Click() For j = 0 To 3 Bellek(j) = 0 BtnGirdi(j).BackColor = QBColor(10) Next j End Sub
Private Sub BtnC_Click() TxtEkran.Text = 0 TusaBasildi = 0 Ondalik = False LbBilgiEkr.Caption = "" End Sub
Private Sub BtnCikti_Click(Index As Integer) If Bellek(Index) <> 0 Then If TusaBasildi = 0 Then TxtEkran.Text = Bellek(Index) Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = 0 TusaBasildi = 0 TxtEkran.Text = Bellek(Index) End If End If TusaBasildi = 1 End Sub
Private Sub BtnDel_Click() If CDbl(TxtEkran.Text) <> 0 Then If Len(TxtEkran.Text) = 1 Or (Len(TxtEkran.Text) = 2 And Left(TxtEkran.Text, 1) = "-") Then TxtEkran.Text = 0 Else TxtEkran.Text = Left(TxtEkran.Text, Len(TxtEkran.Text) - 1) End If End If LbBilgiEkr.Caption = "" End Sub
Private Sub BtnEsit_Click() On Error GoTo HATA If Arti Then TxtEkran.Text = sayi + CDbl(TxtEkran.Text) Arti = False ElseIf Eksi Then TxtEkran.Text = sayi - CDbl(TxtEkran.Text) Eksi = False ElseIf Carpi Then TxtEkran.Text = sayi * CDbl(TxtEkran.Text) Carpi = False ElseIf Bol Then TxtEkran.Text = sayi / CDbl(TxtEkran.Text) Bol = False ElseIf Kuvvet Then TxtEkran.Text = sayi ^ CDbl(TxtEkran.Text) Kuvvet = False End If TusaBasildi = 1 Ondalik = False LbBilgiEkr.Caption = "" HATA: If Err.Number = 11 Then LbBilgiEkr.Caption = "E" End Sub
Private Sub BtnFonk_Click(Index As Integer) On Error GoTo HATA TusaBasildi = 1 If LbBilgiEkr.Caption <> "E" Then LbBilgiEkr.Caption = "" Select Case Index Case 0: TxtEkran.Text = Sqr(CDbl(TxtEkran.Text)) Case 1: TxtEkran.Text = CDbl(TxtEkran.Text) ^ 2 Case 2: TxtEkran.Text = 1 / CDbl(TxtEkran.Text) End Select HATA: If Err.Number = 11 Or Err.Number = 5 Then LbBilgiEkr.Caption = "E" ' 11 :Sıfıra bölme, 5: negatif karekök. End Sub
Private Sub BtnGirdi_Click(Index As Integer) If CDbl(TxtEkran.Text) <> 0 Then Bellek(Index) = CDbl(TxtEkran.Text) BtnGirdi(Index).BackColor = QBColor(12) End If End Sub Private Sub BtnIslem_Click(Index As Integer) TusaBasildi = 1 Ondalik = False Select Case Index Case 0: Arti = True LbBilgiEkr.Caption = "+" Case 1: Eksi = True LbBilgiEkr.Caption = "-" Case 2: Carpi = True LbBilgiEkr.Caption = "x" Case 3: Bol = True LbBilgiEkr.Caption = "/" Case 4: Kuvvet = True LbBilgiEkr.Caption = "^" End Select End Sub
Private Sub BtnOff_Click() Unload Me End Sub
Private Sub BtnOndlk_Click() If Not Ondalik Then Ondalik = True If TusaBasildi = 0 Then TxtEkran.Text = TxtEkran.Text & "," Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = "0," End If End If End Sub
Private Sub BtnSayi_Click(Index As Integer) If TusaBasildi = 0 Then If CDbl(TxtEkran.Text) <> 0 Or Ondalik Then TxtEkran.Text = TxtEkran.Text & Index Else TxtEkran.Text = Index End If Else TusaBasildi = 0 If Ondalik Then TxtEkran.Text = TxtEkran.Text & Index Else sayi = CDbl(TxtEkran.Text) TxtEkran.Text = Index End If End If If LbBilgiEkr.Caption = "E" Then LbBilgiEkr.Caption = "" End Sub
Private Sub BtnCE_Click() TxtEkran.Text = 0 Ondalik = False LbBilgiEkr.Caption = "" End Sub
Private Sub Form_Load() TxtEkran.Text = 0 TusaBasildi = 0 Arti = False Eksi = False Carpi = False Bol = False Ondalik = False For j = 0 To 3 Bellek(j) = 0 Next j End Sub
MESAJ KUTUSU FONKSİYONU (MsgBox) Kullanıcıya bir diyalog penceresi ile bir mesaj iletir, kullanıcı pencerede yer alan ilgili butona basıncaya kadar bekler ve kullanıcının hangi butona bastığını bize sayısal bir değerle geri döndürür. İki türlü kullanılabilir: 1. Basit Kullanım: MsgBox “Mesaj metni” Üzerinde sadece Tamam butonu olan ve bizim yazdığımız mesaj metnini kullanıcıya ileten diyalog penceresini açar. 2. İleri Düzeyde Kullanım: MsgBox(“mesaj metni”[,butonlar][,“başlık metni”][,yardım dosyası,indeks]) “mesaj metni” : Yazılması zorunlu. Mesajın içeriğini belirten max. 1024 karakter string ifade. butonlar : Zorunlu değil. Pencerede yer alacak butonlar ve pencere resmi gibi görsel ve işlevsel detayları belirten sabitler toplamı. “başlık metni” : Zorunlu değil. Pencere başlığına yazılacak metni belirleyen string ifade. yardım dosyası: Zorunlu değil. Pencere aktif iken F1 tuşuna basıldığında açılacak indeksli yardım dosyasının yolu ve adı. indeks : Açılan yardım dosyasında ilgili yardımın indeks numarası. butonlar Parametresi için Sabit Tanımları Sabit Değer Açıklama vbOKOnly 0 Sadece TAMAM butonu görüntülenir. vbOKCancel 1 TAMAM ve İPTAL butonları görüntülenir. vbAbortRetryIgnore 2 VAZGEÇ, TEKRAR DENE ve ATLA butonları görüntülenir. vbYesNoCancel 3 EVET, HAYIR ve İPTAL butonları görüntülenir. vbYesNo 4 EVET ve HAYIR butonları görüntülenir. vbRetryCancel 5 TEKRAR DENE ve İPTAL butonları görüntülenir. vbCritical 16 Hata simgesi görüntülenir. vbQuestion 32 Soru işareti simgesi görüntülenir. vbExclamation 48 Uyarı simgesi görüntülenir. vbInformation 64 Bilgi simgesi görüntülenir. vbDefaultButton1 0 İlk buton geçerli. (Seçili durumda) vbDefaultButton2 256 İkinci buton geçerli. vbDefaultButton3 512 Üçüncü buton geçerli. vbDefaultButton4 768 Dördüncü buton geçerli. vbApplicationModal 0 Uygulama modeli; Kullanıcı o an kullanmakta olduğu uygulamaya devam edebilmek için mesaj kutusunu yanıtlamalı. vbSystemModal 4096 Sistem modeli; Kullanıcı mesaj kutusunu yanıtlayıncaya kadar çalışır durumda olan tüm uygulamalar durdurulur. vbMsgBoxHelpButton 16384 Mesaj kutusuna Yardım butonu ekler. VbMsgBoxSetForeground 65536 Mesaj kutusu penceresini ön cephe (foreground) penceresi olarak belirler. vbMsgBoxRight 524288 Mesaj metni sağa dayalı. vbMsgBoxRtlReading 1048576 Mesaj metni sağdan sola doğru yazılır. (Arabik sistem) Örnek Uygulama : Kimlik Bilgileri Veri Giriş Ekranı Bu uygulamada nüfus cüzdanı bilgilerinin girilebileceği bir veri giriş formu tasarlayacağız. Bazı alanlar bilgi girilmesi zorunlu alanlar olarak belirlenecek. Henüz veritabanı bilgimiz olmadığından kaydetme işlemi yapmayacağız. Ama formumuzda yer alan Kaydet ve Kapat düğmelerine yazacağımız kodlar, aşağıdaki işlemleri gerçekleştirecek: Kaydet Düğmesi : Basıldığında ilk olarak zorunlu alanlar denetlenecek ve eğer bunlardan en az birisi boş bırakılmış ise kullanıcı, üzerinde hata simgesi ve Tamam butonu bulunan bir mesaj kutusu ile uyarılacak. Eğer zorunlu alanların hepsi dolu ise kaydetme işleminin gerçekleştirildiğine dair, üzerinde bilgi simgesi ve Tamam butonu bulunan bir mesaj kutusu açılacak ve kullanıcı Tamam’a basınca formdaki tüm alanlar ilk haline getirilecek. (Form bir sonraki bilgi girişine hazırlanacak.) Kapat Düğmesi : Eğer zorunlu alanlar doldurulmuş ve Kaydet düğmesine basılmadan Kapat’a basılmış ise kullanıcıya, üzerinde uyarı simgesi ile Evet ve Hayır butonları bulunan, bilgileri kaydetmeden formu kapatmaya çalıştığını belirten ve kaydetmeyi isteyip istemediğini soran bir mesaj kutusu açılacak. Kullanıcının verdiği cevap evet ise yine kaydetme işleminin gerçekleştirildiğine dair, üzerinde bilgi simgesi ve Tamam butonu bulunan bir mesaj kutusu açılacak ve kullanıcı Tamam’a bastığında form kapanacak. Hayır ise hiçbir mesaj gelmeden form doğrudan kapanacak. Aksi durumda, yani zorunlu alanların hepsi doldurulmamış ya da Kaydet düğmesine zaten basılmış ise form doğrudan kapanacak. Alanlarla İlgili Açıklamalar : Form üzerinde yer alan Ad, Soyad, Baba adı gibi alanlar TextBox olabilir. Ancak Medeni hal, Kan grubu vb. alanlar çoktan seçimli alan tiplerinden (ComboBox, ListBox, OptionButton) seçilmelidir. Tarih alanı ise formatta bütünlük sağlamak açısından kullanıcıyı sınırlayacak şekilde (Gün, Ay ve Yıl ayrı alanlar şeklinde gibi) düşünülmelidir. Nüfusa kayıtlı olduğu il bir çoktan seçimli alandan seçildikten sonra ilçeye ait çoktan seçimli alan, o ilin ilçe adları ile doldurulacaktır. ÖNEMLİ NOT : Birbirleriyle uyumlu olarak çalışan OptionButton’lar yaratmak için. bunlar birbirleri ile gruplandırılmalıdır. Bunu yapmanın en pratik yolu, önce ortak bir Frame yaratıp sonra gruplamak istediğimiz OptonButton’ları bu Frame’in içinde yaratmaktır. Tasarlayacağımız formun genel görünümü aşağıda verilmiştir:
Şimdi, bu uygulama ile ilk defa kullandığımız iki nesneden bahsedelim: ListBox ve CheckBox. Formumuzda yer alan Veriliş Nedeni alanı bir ListBox, Sabıka Kaydı ve Askerlik Yapamaz Belgesi alanları ise birer CheckBox’tır. ListBox ComboBox ile aynı gruptadır. Yani kullanıcıya birçok seçenek içinden istediğini seçtirmek için kullanırız. Ancak bazı özellikleri ile ComboBox’dan ayrılır. Bunlar: 1. ComboBox’dakinin aksine ListBox’da kullanıcı, oluşturulan kutunun büyüklüğü ölçüsünde bir çok seçeneği aynı anda görür. 2. ListBox, MultiSelect özelliği sayesinde birden çok seçeneğin aynı anda seçilmesine olanak tanır. Yani, ListBox.MutiSelect=0 ise Sadece bir seçenek seçilebilir. ListBox.MutiSelect=1 ise Birden çok seçenek seçilebilir. ListBox.MutiSelect=2 ise Birden çok seçenek, klavyeden Ctrl tuşuna basılı iken seçilebilir.
CheckBox OptionButton ile aynı gruptadır. Ancak OptionButton gruplarında sadece bir seçenek seçilmesine izin verilirken, CheckBox kontrollerinde kullanıcı birden çok seçeneği aynı anda işaretleyebilir. Kod Dim kaydedildi As Boolean
Private Sub CmbIL_Click() CmbILCE.Clear Select Case CmbIL.Text Case "Ankara": CmbILCE.AddItem "Merkez" CmbILCE.AddItem "Altındağ" CmbILCE.AddItem "Keçiören" CmbILCE.AddItem "Mamak" CmbILCE.AddItem "Çankaya" CmbILCE.AddItem "Yeni Mahalle" CmbILCE.AddItem "Polatlı" CmbILCE.AddItem "Beypazarı" Case "Adana": CmbILCE.AddItem "Merkez" CmbILCE.AddItem "Seyhan" CmbILCE.AddItem "Kozan" CmbILCE.AddItem "Pozantı" CmbILCE.AddItem "Aladağ" Case "Artvin": CmbILCE.AddItem "Merkez" CmbILCE.AddItem "Ardanuç" CmbILCE.AddItem "Arhavi" CmbILCE.AddItem "Şavşat" CmbILCE.AddItem "Hopa" Case "Bolu": CmbILCE.AddItem "Merkez" CmbILCE.AddItem "Gerede" CmbILCE.AddItem "Mengen" CmbILCE.AddItem "Mudurnu" CmbILCE.AddItem "Seben" Case "Bursa": CmbILCE.AddItem "Merkez" CmbILCE.AddItem "Osmangazi" CmbILCE.AddItem "İnegöl" CmbILCE.AddItem "İznik" Case "İstanbul": CmbILCE.AddItem "Merkez" CmbILCE.AddItem "Adalar" CmbILCE.AddItem "Bakırköy" CmbILCE.AddItem "Beykoz" CmbILCE.AddItem "Beyoğlu" CmbILCE.AddItem "Beşiktaş" CmbILCE.AddItem "Kadıköy" CmbILCE.AddItem "Üsküdar" CmbILCE.AddItem "Zeytinburnu" CmbILCE.AddItem "Şişli" CmbILCE.AddItem "Çatalca" CmbILCE.AddItem "Sarıyer" End Select End Sub
Private Sub CmdKapat_Click() Dim cvp As Integer If Not kaydedildi And TxtSyd.Text <> "" And TxtAd.Text <> "" And TxtBAd.Text <> "" And TxtAAd.Text <> "" Then cvp = MsgBox("Değişiklikleri kaydetmek istiyor musunuz?", vbYesNo + vbExclamation, "DİKKAT") If cvp = 6 Then MsgBox "Bilgiler kaydedilmiştir...", vbInformation, "" Unload Me Else Unload Me End If Else Unload Me End If End Sub
Private Sub CmdKaydet_Click() Dim msj As String kaydedildi = True If TxtSyd.Text = "" Or TxtAd.Text = "" Or TxtBAd.Text = "" Or TxtAAd.Text = "" Then msj = "Zorunlu alanlarda bilgi eksikliği saptanmıştır." msj = msj & Chr(13) & "Lütfen bu bilgileri tamamlayınız." MsgBox msj, vbCritical, "UYARI" kaydedildi = False Else MsgBox "Bilgiler kaydedilmiştir...", vbInformation, "" TxtSyd.Text = "" TxtAd.Text = "" TxtBAd.Text = "" TxtAAd.Text = "" TxtAileNo.Text = "" TxtCiltNo.Text = "" TxtSiraNo.Text = "" TxtDYer.Text = "" TxtDYil.Text = "" TxtKayNo.Text = "" TxtKNo.Text = "" TxtKSeri.Text = "" TxtMah.Text = "" TxtVerYer.Text = "" OptEvli.Value = False OptBekar.Value = False OptDul.Value = False OptBosan.Value = False OptRhPoz.Value = False OptRhNeg.Value = False LstVerNed.Text = "" CmbDAy.Text = "" CmbDGun.Text = "" CmbIL.Text = "" CmbILCE.Text = "" CmbKanGr.Text = "" ChckAsk.Value = False ChckSab.Value = False TxtKSeri.SetFocus kaydedildi = False End If End Sub
Private Sub Form_Load() kaydedildi = False End Sub ÇOK FORMLU UYGULAMALAR Birden çok formla çalışan bir uygulama tasarlamak, tek formla çalışan bir uygulama tasarlamaktan daha zor değildir. Bu işlem, ana formu yaptıktan sonra Project menüsünden Add Form seçeneği kullanılarak yeni formlar eklemek suretiyle gerçekleştirilebilir. Birden çok form bulunduran uygulamalarda, aksi belirtilmediği sürece ilk yapılan form ana form olur ve uygulama çalıştırıldığında ilk olarak bu form yüklenir. Bu sıralama, Project menüsünden <Proje Adı> Properties seçeneği kullanılarak değiştirilebilir. Herhangi bir formu çalışma-anında (runtime) görüntülemek için Show metodu kullanılır. Metodun ayrıntıları aşağıda verilmiştir: Show Metodu Herhangi bir formu ya da MDI formu görüntüler. Sözdizimi aşağıdaki gibidir: <Form Adı>.Show <Mod> <Mod>, görüntülenen formun aktif durumdaki davranışını belirleyen bir parametredir. İki değer alabilir: 0-Modeless (Geçerli durum) ve 1-Modal. Modeless durumunda form aktif durumda iken, yani fokus form üzerinde iken kullanıcı, açık durumda olan diğer formlara geçiş yapmak gibi başka aktiviteleri gerçekleştirebilir. Modal durumunda ise açık kaldığı sürece sadece görüntülenen form üzerinde işleme izin verilir. Şimdi, bir ana form ve bu form tarafından çağrılan ikinci bir forma sahip örnek bir uygulama üzerinde, aynı zamanda üç yeni kontrol nesnesinin kullanılışını göreceğiz: DirListBox, DriveListBox ve FileListBox. DirListBox Disk içinde yer alan klasör haritasını görüntüler ve kullanıcıya bu harita üzerinde istediği klasörü çift-tıklama yolu ile seçme olanağı tanır. Seçilen klasörün yolu, bu kontrol nesnesinin Path özelliğine aktarılır. Diğer bir deyişle DirListBox nesnemizin adı Dir1 ise Dir1.Path bize Dir1 içinde seçilen klasörün tam yolunu verecektir.
DriveListBox Bilgisayarda tanımlı olan tüm disk sürücülerini görüntüler ve kullanıcıya istediği sürücüyü seçme olanağı sağlar. Seçilen sürücü bu kontrol nesnesinin Drive özelliğine aktarılır.
FileListBox Kendisine ait Path özelliği tarafından belirlenen klasördeki dosyaları görüntüler ve kullanıcıya bunlardan seçim yapma olanağı tanır. Çalışma-anında değiştirilmediği sürece bu yol geçerli klasörü (VB kurulum klasörü) gösterecektir. Seçilen dosya ise kontrolün File özelliğinde saklanır.
Örnek uygulamamızda bu kontroller yazılan kodlarla ilişkilendirilerek eş güdümlü (senkronize) çalışmaları sağlanmıştır. Uygulamada yer alan ana form bir metin kutusu ve üç buton içermektedir: Tamam, İptal ve Gözat. Tamam ve İptal butonlarının her ikisi de formu kapatmaktadır. (Çünkü bu örnek büyük bir uygulamanın bir parçası olarak düşüünülmüştür.) Gözat düğmesine basıldığında, üzerinde yukarıda anlatılan kontrol nesnelerini ilişkilendirilmiş bir biçimde taşıyan ikinci formumuz Modal modunda görüntülenmektedir. Bu kontroller kullanılarak belirlenen dosya adı ve yolu, eğer Tamam butonuna basılırsa ana formumuzun dosya adı metin kutusuna aktarılarak form kapanmakta, aksi halde, yani İptal butonuna basılırsa ikinci formumuz doğrudan kapatılmaktadır.
Şimdi, FrmBul formuna aranan dosyanın türünü de seçebileceğimiz bir ComboBox ekleyeceğiz ve böylece dosya listemizde sadece istediğimiz türden dosyaların görüntülenmesini sağlayacağız. Bunun için ilk olarak, dosya türünü seçebileceğimiz CmbDosyaTur adlı bir ComboBox yaratacağız ve tasarım-anında (design-time) bu ComboBox’ımızın liste özelliğine uygun seçenekleri gireceğiz. Daha sonra FileListBox’ımızı gizleyeceğiz ve onun yerine LstDosyalar adlı sıradan bir ListBox yerleştireceğiz. Bunu yapmaktaki amacımız, FileListBox’ta yer alan dosya adlarından sadece CmbDosyaTur’de seçilen uzantıya sahip olan dosya adlarını buradan seçip, ListBox’a aktarmaktır. Diğer bir deyişle, LstDosyalar adlı liste kutumuz, File1 adlı dosya liste kutumuzdan dosya türü kriterine uygun olarak süzülen dosyaları gösterecektir. FrmBul formunun yeni şekli ve bu forma ait kodlar aşağıda verilmiştir:
Private Sub CmbDosyaTur_Click() LstDosyalar.Clear For j = 0 To File1.ListCount - 1 If Right(File1.List(j), 3) = Right(CmbDosyaTur.Text, 3) Then LstDosyalar.AddItem File1.List(j) End If Next j End Sub
Private Sub CmdBulIptal_Click() Unload Me End Sub
Private Sub CmdBulTamam_Click() FrmAna.TxtDosAd.Text = File1.Path & "\" & LstDosyalar.Text Unload Me End Sub
Private Sub Dir1_Change() File1.Path = Dir1.Path LstDosyalar.Clear For j = 0 To File1.ListCount - 1 If Right(File1.List(j), 3) = Right(CmbDosyaTur.Text, 3) Then LstDosyalar.AddItem File1.List(j) End If Next j End Sub RESİM İLİŞTİRME (PICTURE CLIP) Bu kesimde, hazırlayacağımız bir sayı tutmaca oyunu ile PictureBox ve Image kontrollerinin etkin kullanımını öğreneceğiz. Uygulama iki formdan oluşmaktadır. Ana form (FrmSor) ve program hakkında penceresi (FrmAbout). Ana formumuzda bir Image, Program Hakkında formunda ise bir PictureBox nesnesi kullandık. Image, PictureBox ile aynı işlevi taşır, ancak PictureBox’ın özelliklerinin bir altkümesini içerir. Buna karşın runtime’da PicturBox’tan daha hızlı çalışır. Program hakkında formumuzda, üç adet PictueBox kullanılmıştır. Bunlardan sadece biri kullanıcıya gösterilmektedir. Diğer ikisi sabit olarak iki resim dosyası iliştirilmiş olarak (tasarım-anında Picture özelliği kullanılarak atanan resim dosyaları) formun görünmeyen yüzünde yer almaktadır. Aşağıda, formun kullanıcıya gösterilmeyen bölümü işaretlenmiştir: Bu bölümde PictureBox nesneleri ile birlikte yine ilk defa bu uygulamamızda kullandığımız Timer kontrolü de yer almaktadır. Şimdi bu kontrolleri daha yakından tanıyalım: PictureBox Bitmap (*.bmp), ikon (*.ico), metafile (*.wmf), gelişmiş metafile (*.emf), JPEG (*.jpg) ya da GIF dosyalarını görüntülemek için kullanılır. En önemli özellikleri tasarım-anında veya LoadPicture fonksiyonunu kullanarak kod içersinde resim atamak için kullanacağımız Picture özelliği ile, PictureBox’ın boyutunu atanan resmin boyutuna göre genişletip genişletmeyeceğini belirleyen (True ya da False) AutoResize özelliğidir. Image PictureBox ile aynı amaçlarla kullanılır ama sistem kaynaklarını daha ekonomik kullanır ve yeniden resimlendirme hızı daha fazladır. En önemli özellikleri yine Picture özelliği ile, atanan resmin Image’in boyutuna göre ayarlanıp (daraltma ya da genişletme) ayarlanmayacağını belirleyen Stretch (True ya da False) özelliğidir. Timer Timer kontrolü, belirli bir kodu düzenli zaman aralıkları ile çalıştırmak için kullanılır. Çalıştırılacak kod, kontrolün Timer olayına yazılır ve zaman aralığı kontrolün Interval özelliği ile belirlenir. Bizim uygulamamızda, görünen bölümde yer alan PictrueBox’ta diğer iki PictureBox’ın resimlerinin uygun bir periyotla görüntülenebilmesi için bir Timer kontrolü kullanılmıştır. Bu şekilde, Tolga Güyer yazısına konan kelebeğin kanat çırpması sağlanmıştır. LoadPicture Fonksiyonu Genel Sözdizimi : LoadPicture([string ifade]) [string ifade] atanacak resim dosyasının yolunu (path) ve tam dosya adını belirtir. Dosya, Bitmap (*.bmp), ikon (*.ico), metafile (*.wmf), gelişmiş metafile (*.emf), run-length encoded (.rle), JPEG (*.jpg) ya da GIF türünde olmalıdır. Ana formun ilk çalıştığı andaki hali (PictureBox’ın resmi uygulama içinde değiştiriliyor) ve açıklamalı kodlar aşağıda verilmiştir: FrmSor Dim syc As Byte 'Kart resimlerinin sayaç değişkeni Dim RsmYol As String 'Resim dosyalarının path stringi Dim tutulansayi, sayilar(7) As Integer
Private Sub CmdAbout_Click() FrmAbout.Show 1 'Program hakkında formunu görüntüle End Sub
Private Sub CmdKapat_Click() End End Sub
Private Sub CmdTuttum_Click() RsmYol = App.Path & "\images\kartsor1.bmp" 'İlk kartın path ve dosya adı Image1.Picture = LoadPicture(RsmYol) 'İlk kartı göster CmdTuttum.Visible = False CmdVar.Visible = True CmdYok.Visible = True End Sub
Private Sub CmdVar_Click() tutulansayi = tutulansayi + sayilar(syc) 'Tutulan sayıyı hesapla syc = syc + 1 'Kart dosyalarının sayacını artır If syc < 8 Then 'Sadece 7 tane kart dosyası var RsmYol = App.Path & "\images\kartsor" & syc & ".bmp" 'Uygulamanın yolu+dosya adı+sayaç stringi oluşturuluyor Else Image1.Picture = LoadPicture("") 'Son resim de gösterildi, sıra finalde Image1.Left = 1800 'Final resmi daha küçük olduğundan soldan ortalanıyor BackColor = &H8000000E 'Arka fon beyaz RsmYol = App.Path & "\images\final.bmp" Label1.Visible = True Label1.Caption = tutulansayi 'Ve işte tutlan sayı CmdVar.Visible = False CmdYok.Visible = False End If Image1.Picture = LoadPicture(RsmYol) End Sub
Private Sub CmdYeni_Click() Image1.Picture = LoadPicture("") sifirla 'Değişkenleri baştaki değerlerine döndür RsmYol = App.Path & "\images\grfsor.bmp" 'Tekrar ilk resim Image1.Picture = LoadPicture(RsmYol) End Sub
Private Sub CmdYok_Click() 'Var düğmesi ile aynı, tek fark tablo sayısı tutlansayi'ya eklenmiyor. syc = syc + 1 If syc < 8 Then RsmYol = App.Path & "\images\kartsor" & syc & ".bmp" Else Image1.Picture = LoadPicture("") Image1.Left = 1800 BackColor = &H8000000E RsmYol = App.Path & "\images\final.bmp" Label1.Visible = True Label1.Caption = tutulansayi CmdVar.Visible = False CmdYok.Visible = False End If Image1.Picture = LoadPicture(RsmYol) End Sub
Private Sub Form_Load() sayilar(1) = 1 'Tablo sayıları dizisi oluşturuluyor sayilar(2) = 2 sayilar(3) = 4 sayilar(4) = 8 sayilar(5) = 16 sayilar(6) = 32 sayilar(7) = 64 sifirla End Sub
Private Sub sifirla() 'Değişkenlere ve kontrollere ilk değerleri atanıyor syc = 1 tutulansayi = 0 Label1.Visible = False CmdVar.Visible = False CmdYok.Visible = False CmdTuttum.Visible = True BackColor = &H8000000F Image1.Left = 0 End Sub FrmAbout Dim kontrol As Byte 'Sıralamayı belirleyen bayrak değişkeni
Private Sub kelebek() 'Sıraya göre uygun resim atanıyor: If kontrol = 0 Then PicKlbk.Picture = PicKlbk1.Picture kontrol = 1 Else PicKlbk.Picture = PicKlbk2.Picture kontrol = 0 End If End Sub
Private Sub BtnTamam_Click() Unload Me End Sub
Private Sub Timer1_Timer() ‘Tasarımda Interval özelliği 200 olarak belirlenmiştir. kelebek 'Ve kelebeğimiz kanat çırpıyor End Sub
MENÜLER Caption, menümüzde yer alacak ilk seçeneğin etiketidir. Name alanına ise o menü seçeneğine ait (kodlarda kullanılacak) bir isim verilmelidir. Index her menü seçeneğini, aynı kontrol dizilerinde olduğu gibi sayısal bir değerle numaralandırmak suretiyle, gerektiğinde kodlarda kolaylık sağlamak amacıyla kullanılır. Ancak bu sayının seçeneğin menüdeki pozisyonu ile bir ilgisi yoktur. Menü seçeneğinin görünümü ile ilgili opsiyonlar (Checked=İşretli, Enabled=Aktif, Visible=Görünür, WindowList=MDI formları gösteren pencere listesi) işaretlenerek, menü seçeneklerinin pozisyonları ve altmenüler ise alt kısımda yer alan ok resimli butonlar kullanılarak ayarlanabilir. Next : Seçili seçeneğin altına yeni seçenek eklemek için yer açar. Insert : Seçili seçeneğin üzerine yeni seçenek eklemek için yer açar. Delete : Seçili seçeneği siler. Sol Ok : Seçileni bir seviye yukarı çıkartır. (Bir üst menü seçeneği olur) Sağ Ok : Seçileni bir seviye aşağı indirir. (Kendisinden önceki seçeneğin bir altmenü seçeneği olur) Yukarı Ok : Seçileni menü sıralamasında bir yukarı çıkartır. (Soldan sağa sıralamada sola geçirir.) Aşağı Ok : Seçileni menü sıralamasında bir aşağı indirir. (Soldan sağa sıralamada sağa geçirir.) Aşağıda menü editörü kullanılarak hazırlanan bir menü örneği görsel olarak açıklanmıştır. Editörde yapılan ayarlamaların uygulamadaki yansımalarına dikkat edin:
Ayrıca ShortCut ComboBox’ı kullanılarak her menü seçeneği için bir kısayol atanabilir. Menü Seçeneklerinin Adlandırılması Her menü seçeneğinin (Caption’ın dışında) bir adı olmalıdır. Bu ad, değişken isimlendirme kurallarına uygun olarak verilmelidir. Kodların anlaşılabilir olması açısından, menü seçenekleri adlandırılırken şu kurala uyulması yararlı olacaktır: Bir menünün bir seçeneği ya da alt menüsü, o menünün adı ile başlayan bir isimle adlandırılmalıdır. Örneğimizde MnDosya menüsünde yer alan Aç seçeneği, MnDosyaAc olarak adlandırılmıştır. Aynı şekilde, MnArac menüsünde yer alan Çizim Araçları seçeneği MnAracCiz, bunun altında yer alan Çember seçeneği ise MnAracCizCember olarak adlandırılmıştır.
MODÜLLER Modüller, proje kapsamında kullanılacak tanımlamaların (değişken, prosedür ya da fonksiyonlar) yer aldığı bileşenlerdir. Bir proje, içerdiği formlardan bağımsız olarak bir ya da daha çok sayıda modül içerebilir. Projeye bir modül eklemek için Project menüsünden Add Module seçeneğinin seçilmesi yeterlidir. Bu yapıldığında ekrana gelen pencereden yeni bir modül seçilebilir ya da önceden hazırlanmış bir modül projeye dahil edilebilir. Bir modül sadece bir kod bölümünden oluşur: tüm tanımlamaların yapılacağı General Declarations bölümü. Aşağıda örnek bir modülün kod penceresi verilmiştir: Burada TusaBasildi, C1 ve C2 değişkenleri global olarak tanımlanmışlardır. Dolayısıyla tüm proje kapsamında kullanılabilirler. Ancak katsayi değişkeni lokal olarak tanımlandığından sadece ilgili modül içersinde kullanılabilir. Diğer yandan hesapla fonksiyonu da proje dahilinde kullanılabilecektir. Şimdi geliştireceğimiz örnek uygulamada son olarak öğrendiğimiz iki yeni kavramı da kullanacağız: Menü ve Modül. BİR HAFIZA OYUNU: ResimBUL V1.0 Oyun oldukça basit bir amaca sahiptir: Arkaları dönük durumda olan 10 çift resimli kartı, her bir çifti art arda açmak suretiyle tümüyle açmaya çalışmak. Ancak her kart üzerinde tıklandığında sadece 1-2 saniye gözüküyor ve sonra tekrar geri dönüyor. Böylece fotoğrafik hafızamızın gücü ölçüsünde bu amaca en kısa sürede ve en az tıklama sayısı ile ulaşmaya çalışıyoruz. Sonuçta program bize uygun bir formül kullanarak performansımız doğrultusunda bir puan hesaplıyor. Projenin en önemli özelliklerinden birisi, her oyunun başında kartların (PictureBox’ların) rasgele (random) olarak program tarafından karıştırılmasıdır. Bu işlemde, VB’nin rasgele sayı üreten Rnd fonksiyonu kullanılmıştır. Bu fonksiyonun özellikleri aşağıda açıklanmıştır: Rnd Fonksiyonu Genel Sözdizimi : Rnd[(sayı)] Single türünde (32 bit ondalık sayı) rasgele sayı üretir. Bu işlemi, Rastgele Sayı Üreteci (Random Number Generator) adlı, sistem saatini kullanan bir algoritma kullanarak gerçekleştirir. Ancak bu algoritma program çalıştığında başlatıldığından (initialize), eğer üreteç her sayı üretilmeden önce başlatılmazsa sürekli aynı sayıyı üretecektir. Bu yüzden her sayı için Randomize deyimi kullanılarak üreteç yeniden başlatılmalıdır. sayı parametresi zorunlu değildir. Bu parametrenin aldığı değerler aşağıdaki tabloda verilmiştir: sayı Rnd tarafından üretilen rasgele sayı Sıfırdan küçük Her seferinde aynı sayı üretilir Sıfırdan büyük Her seferinde farklı sayı üretilir Sıfıra eşit En sık üretilen rasgele sayı üretilir Belirtilmezse Her seferinde farklı sayı üretilir Rnd fonksiyonunun kullanım örneği için verilen uygulamanın ana formuna ait kodu inceleyiniz. Projemiz beş adet formdan ve bir adet modülden oluşmaktadır. Ana form (FrmAna), üzerinde bir menü ve 20 adet PictureBox’ın yer aldığı (kartlar için) bir formdur. Ayrıca süreyi tutmakta kullanılan bir Timer nesnesi, süre ve oyun sonunda hesaplanan puanın basılacağı label’lar ve oyunla ilgili tüm ayarlamaların yapılacağı birde menü içermektedir. Diğer formlar ise Program Hakkında Formu (FrmAbout), Kart Seçimi Formu (FrmKartSec), oyun seviyesinin ayarlandığı Ayarlar Formu (FrmSeviye) ve oyunun kurallarının açıklandığı Yardım Formudur (FrmYardim). Formların genel görünümleri ve çalıştırdıkları kodlar aşağıda verilmiştir: FrmAna
Dim c, ilk, TiklamaSayaci, EslemeSayaci, ZamanSayaci Private Sub Form_Load() c = 0 EslemeSayaci = 0 ZamanSayaci = 0 TiklamaSayaci = 0 Timer1.Enabled = False MnOyunStop.Visible = False ‘Oyun henüz başlamadığından oyunu durdurma menü seçeneği gizli seviye = 2 ‘Default oyun seviyesi surekli = True ‘Default oyun ayarı fondosya = "fon1.jpg" ‘Default kart arkafon resmi End Sub
Private Sub MnAboutAbout_Click() FrmAbout.Show 1 End Sub
Private Sub MnAboutYard_Click() FrmYardim.Show 1 End Sub
Private Sub MnOyunCikis_Click() End End Sub
Private Sub MnOyunStop_Click() Timer1.Enabled = False For j = 0 To 19 ‘Oyun bitirildi, tüm kartları aç Picture1(j).Picture = LoadPicture(App.Path & "\images" & "\resim" & j & ".wmf") Picture1(j).Enabled = False Next j MnOyunYeni.Visible = True ‘Yeni oyun menü seçeneği tekrar göründü MnOyunStop.Visible = False ‘Oyunu bitir menü seçeneği kayboldu MnSec.Enabled = True ‘Oyun sırasında Disable olan menü seçenekleri tekrar Enable oldu MnAbout.Enabled = True End Sub
Private Sub MnOyunYeni_Click() Karistir ‘Karistir prosedürü çağrılıyor (Kartları rasgele karıştırır) For j = 0 To 19 ‘Kartların arkafon resimleri yükleniyor ve PitureBox’lar Enable oluyor Picture1(j).Picture = LoadPicture(App.Path & "\images\" & fondosya) Picture1(j).Enabled = True Next j c = 0 EslemeSayaci = 0 ‘Yeni oyun için sayaçlar sıfırlandı ZamanSayaci = 0 TiklamaSayaci = 0 Timer1.Enabled = True Label4.Caption = "" MnSec.Enabled = False ‘Menü seçenekleri oyun sırasındaki ayarlarına getiriliyor MnAbout.Enabled = False MnOyunYeni.Visible = False MnOyunStop.Visible = True End Sub
Private Sub MnSecAyar_Click() FrmSeviye.Show 1 End Sub
Private Sub MnSecKart_Click() FrmKartSec.Show 1 End Sub
Private Sub Picture1_Click(Index As Integer) TiklamaSayaci = TiklamaSayaci + 1 ‘Her tıklama sayılıyor If c = 0 Then 'Oyun tipi sürekli seçildi ise sadece ilk hamlede çalışacak resimkoy (Index) bekle (seviye / 10) Picture1(Index).Picture = LoadPicture(App.Path & "\images\" & fondosya) c = 1 ilk = Index Else If Not surekli Then c = 0 ‘Oyunu her turda (her iki kart açıldığında) başa döndürüyor.(turlu oyun) If (Abs(ilk - Index) = 5 And ilk < 10 And Index < 10) Or (Abs(ilk - Index) = 5 And ilk > 9 And Index > 9) Then 'Eşleme yapılmış (açıklama için kodların sonuna bakınız) resimkoy (Index) 'Yeni bulunan resim resimkoy (ilk) 'İlk tıkladığı resim Picture1(Index).Enabled = False ‘Bulanan resimleri PictureBox larını disable yapalım ki bir daha ‘tıklayamasın Picture1(ilk).Enabled = False EslemeSayaci = EslemeSayaci + 1 ‘Doğru tıklamaları sayıyoruz If EslemeSayaci = 10 Then OyunBitti ’10 eşleme demek resimlerin hepsi açılmış demek Else ‘Eğer doğru resmi bulamadıysa göster-bekle-kapat resimkoy (Index) ‘Göster bekle (seviye / 10) ‘Bekle Picture1(Index).Picture = LoadPicture(App.Path & "\images\" & fondosya) ‘Ve kapat End If ilk = Index End If End Sub
Private Sub resimkoy(idx) Dim yol yol = App.Path & "\images" & "\resim" & idx & ".wmf" ‘Gelen indekste (idx) bulunan PicturBox’a Picture1(idx).Picture = LoadPicture(yol) ‘resim&idx.wmf dosyası yükleniyor End Sub
Private Sub bekle(sure) Dim basla basla = Timer ‘ basla ya sistem sayıcısının o anki değeri aktarılıyor. Do While Timer < basla + sure ‘Sistem sayıcısı (Timer fonksiyonu) sure kadar saydırılıyor (bekleme için) Loop End Sub
Private Sub Timer1_Timer() ZamanSayaci = ZamanSayaci + 1 ‘Oyun sırasında süreyi tutan Timer kontrolü Label2.Caption = ZamanSayaci End Sub
Private Sub OyunBitti() Dim puan, mesaj Timer1.Enabled = False puan = CInt((1 / ZamanSayaci) * 1000 + (1 / TiklamaSayaci) * 1000) ‘Puan hesaplayan bu formül, ne kadar az tıklama ile ne kadar az sürede oyun tamamlanırsa o kadar ‘yüksek puan değeri veriyor mesaj = "OYUN BİTTİ" & Chr(13) & "PUANINIZ : " & puan MsgBox mesaj Label4.Caption = puan MnSec.Enabled = True MnAbout.Enabled = True MnOyunYeni.Visible = True MnOyunStop.Visible = False End Sub
Private Sub Karistir() Dim Rsayi(19), sayi, h, j, k, T, L Randomize ‘Bu prosedür her çağırıldığında rasgele sayı üreteci yeniden başlatılacak Rsayi(0) = Int(20 * Rnd) ’20 adet rasgele sayıdan oluşan bir dizi oluşturuluyor For j = 1 To 19 Do sayi = Int(20 * Rnd) h = 0 For k = 1 To j If sayi <> Rsayi(k - 1) Then h = h + 1 ‘Bu dizide hiçbir sayı tekrarlanmamalı Next k Loop Until h = j Rsayi(j) = sayi Next j T = 120 ‘PictureBox ların ilk Top pozisyonu L = 120 ‘PictureBox ların ilk Left pozisyonu For j = 0 To 19 Picture1(Rsayi(j)).Top = T ‘Rasgele indeksli PictureBox ların Top ve Left pozisyonları ayarlanıyor Picture1(Rsayi(j)).Left = L L = L + 1200 If L = 6120 Then T = T + 1320 L = 120 End If Next j End Sub FrmSeviye
FrmAbout FrmYardim FrmKartSec Private Sub CmdIptal_Click() Unload Me End Sub
Private Sub CmdTamam_Click() If Shape1(0).Visible Then ‘Hangi dikdörtgen (Shape) görünür durumda ise o arkafon seçilmiş demektir fondosya = "fon1.jpg" ElseIf Shape1(1).Visible Then fondosya = "fon2.jpg" ElseIf Shape1(2).Visible Then fondosya = "fon3.jpg" ElseIf Shape1(3).Visible Then fondosya = "fon4.jpg" End If Unload Me End Sub
Private Sub Form_Load() Select Case fondosya Case "fon1.jpg": Shape1(0).Visible = True Case "fon2.jpg": Shape1(1).Visible = True Case "fon3.jpg": Shape1(2).Visible = True Case "fon4.jpg": Shape1(3).Visible = True End Select End Sub Private Sub Image1_Click(Index As Integer) For j = 0 To 3 ‘Hangi Image e tıklandı ise o resme ait Shape görünür oluyor If j = Index Then ‘Amaç kullanıcıya resim seçildi etkisi yaratmak Shape1(j).Visible = True Else Shape1(j).Visible = False End If Next j End Sub Program Eş Kartları Nasıl Anlıyor? Birbiri ile eş olan resimleri içeren PictureBox’lar aşağıdaki gösterilmiştir:
Yani, 1. Indeks farkı = 5 olan (6-1=5 gibi) ve Indeks değeri 10’dan küçük olan kartlar eş resimleri taşır. (0-9 arası kartlar) 2. Indeks farkı = 5 olan (16-11=5 gibi) ve Indeks değeri 10’dan büyük olan kartlar eş resimleri taşır. (10-19 arası kartlar) PictureBox’lara ait resimler bu şekilde belirlendikten sonra Karistir prosedürü PictureBox’ların yerlerini rasgele değiştiriyor. Böylece oyunu oynayan eşleri bilemiyor (Programcı da buna dahil), ancak program biliyor.
TOOLBAR (ARAÇ ÇUBUĞU) Programlarımıza, menünün yanı sıra bir araç çubuğu da ekleyebiliriz. Bunu, VB’nin ToolBar ve ImageList kontrollerini kullanarak gerçekleştiriyoruz. Aşağıda klasik bir araç çubuğu gösterilmiştir:
ImageList ve ToolBar Kontrolleri ImageList ve ToolBar kontrolleri VB’nin standart bileşenleri içersinde yer almazlar. Bu kontrolleri içeren bileşen (component) Microsoft Windows Common Controls adlı bileşendir. Bu ve benzeri harici bileşenleri projemize dahil etmek için aşağıdaki yol izlenmelidir: 1. Project Menüsü-Components seçeneğini seç. 2. Açılan pencerede istediğin bileşen(ler)in yanına işaret koy ve Tamam düğmesine bas. Bu işlemleri yapıldığında, eklenen bileşenin içerdiği kontrollerin simgelerinin, VB’nin standart araç çubuğuna eklendiği görülür. Bir ToolBar kontrolü yaratmak için öncelikle forma toolbarın resimlerini sağlayacak bir ImageList yerleştirilmelidir. ImageList nesnesi de Timer kontrolü gibi çalışma anında otomatik olarak görünmez olur. Yerleştirilen ImageList’in özellikler-properties penceresinde (sağ tuş menüsünden açılan), listeye dahil edilecek resim dosyaları belirlenir ve her resim 0’dan başlayan tamsayılarla indekslenir. Form üzerine yerleştirilecek ToolBar kontrolü de, şekilde gösterildiği gibi daha önce yerleştirilmiş olan ImageList kontrolü ile ilişkilendirilir ve Insert tuşu kullanılarak butonlar eklenir. Her bir butona, ImageList’te indekslenen sayı ile bir resim atanır. ImageList’in Properties penceresinin Images sekmesinde yer alan bazı özellikler aşağıda açıklanmıştır: Index : Seçilen resme ait indeks numarası (Toolbarda kullanılacak) Insert Picture : Resim listesine yeni resim ekler. Remove Picture: Listeden seçilen resmi kaldırır. Image Count : Listedeki resimlerin toplam sayısını gösterir. Tag : Programcı bilgi alanı. (İşlevsiz) Key : Seçilen resme ait anahtar ad. (Kodlarda kullanılır) ToolBar’ın Properties penceresinin Buttons sekmesinde yer alan bazı özellikler aşağıda açıklanmıştır: Indeks : Seçilen butona ait indeks numarası. Caption : Seçilen butonun yazısı. Key : Seçilen butona ait anahtar ad. (Kodlarda kullanılır) Style : Seçilen butonun görünüm tipi. Tag : Programcı bilgi alanı. (İşlevsiz) ToolTipText : Seçilen butona ait balon yardım metni. Image : Butona ait resmin ImageList’teki indeks numarası.
ÖRNEK UYGULAMA : SLAYT GÖSTERİCİSİ Bu örnek uygulamamız, manyetik ortamda kayıtlı (Disk, Disket ya da CD) çeşitli formatlardaki resim dosyalarını derleyerek slayt düzeninde görüntülemekte, bunların söz konusu ortamdaki adreslerinden (yollarından) bir slayt dosyası oluşturmakta ve bu dosyayı istenildiğinde açmaktadır. Uygulama, üzerinde bir menü ve toolbar bulunan bir ana form ve bunun dışında dört adet formdan ve bir modülden oluşmaktadır. Toolbar, menü ile aynı fonksiyonları gerçekleştiren butonları içerir. Ana formun haricindeki formlar, uygulamaya ait ayarlamaların yapıldığı bir form, manyetik ortamda yer alan resim dosyalarını derleyebileceğimiz bir form, program hakkında formu ve yardım formudur. Dosya açma ve dosya kaydetme işlemleri dışında uygulama, şu ana kadar kazanılan bilgi birikimi ile rahatlıkla anlaşılabilir. Bu işlemleri, Windows’un kendisine ait “Yeni adla kaydet” (Save as) ve “Aç” (Open) DialogBox’larını kullanarak gerçekleştiriyoruz. Bu DialogBox’ları, VB’nin Microsoft Common Dialog Control bileşeninde yer alan (ki bu bileşen standart araç çubuğunda yer almaz, bir önceki bölümde anlatıldığı gibi eklenir) CommonDialog nesnesini kullanılarak kontrol ederiz. Bu kontrolle uyumlu olarak çalışacak diğer bir nesne, Microsoft Rich Text Box Control bileşeninde yer alan RichTextBox nesnesidir. Form üzerine yerleştirilecek bir CommonDialog, çalışma anında görünmez olur. İşlevi, Windows’a ait DialogBox’ları açmak ve bu pencerelerle veri alışverişi gerçekleştirmektir. Bizim uygulamamızda, Aç penceresinde seçilen dosyanın içeriği, form üzerinde yer alan RichTextBox’a metin olarak aktarılır ve programımız bu veriyi işleyerek kendisi için anlamlı bir biçime getirir. Kaydet penceresi de bunun tam tersi mantıkla, RichTextBox içersindeki bilgiyi kullanıcının isimlendireceği bir dosyaya kaydeder. Elbette bu bilgi de programımız tarafından kaydetme işleminden önce anlamlı bir biçime getirilmiştir. Diğer bir deyişle, işletim sistemi ile programımız arasındaki köprü RichTextBox, bu köprü üzerinde veriyi her iki taraf taşıyan kontrol ise CommonDialog’dur.
Aşağıda, formların genel görünümleri ile her bir forma ait kodlar verilmiştir:
FrmAna Dim yol, sol, sag
Private Sub MnuCikis_Click() End End Sub
Private Sub CmdGeri_Click() rsyc = rsyc - 1 If rsyc = -1 Then If devirli Then rsyc = LstGelenPath.ListCount - 1 Else rsyc = 0 End If End If yol = LstGelenPath.List(rsyc) & "\" & LstGelenFile.List(rsyc) If yol <> "\" Then Image1.Picture = LoadPicture(yol) End If End Sub
Private Sub Cmdileri_Click() rsyc = rsyc + 1 If rsyc = LstGelenPath.ListCount Then If devirli Then rsyc = 0 Else rsyc = LstGelenPath.ListCount - 1 End If End If yol = LstGelenPath.List(rsyc) & "\" & LstGelenFile.List(rsyc) If yol <> "\" Then Image1.Picture = LoadPicture(yol) End If End Sub
Private Sub Form_Load() isyc = 0 gsyc = 0 devirli = True boyut = True End Sub
Private Sub MnuDosyaAc_Click() DosyaAc End Sub
Private Sub MnuDosyaExit_Click() End End Sub
Private Sub MnuDosyaKaydet_Click() DosyaKaydet End Sub
Private Sub MnuDosyaYeni_Click() YeniKaset End Sub
Private Sub MnuSecAyr_Click() FrmSecenek.Show 1 End Sub
Private Sub MnuSecTlb_Click() If MnuSecTlb.Checked = True Then MnuSecTlb.Checked = False Toolbar1.Visible = False Else MnuSecTlb.Checked = True Toolbar1.Visible = True End If End Sub
Private Sub MnuSlaytEkle_Click() SlaytEkle End Sub
Private Sub MnuYardimAbout_Click() FrmAbout.Show 1 End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As ComctlLib.Button) Select Case Button.Key Case "BtnYeni" YeniKaset Case "BtnAc" DosyaAc Case "BtnKaydet" DosyaKaydet Case "BtnYazdir" Case "BtnEkle" SlaytEkle Case "BtnScnk" FrmSecenek.Show 1 Case "BtnYardim" Case "BtnCikis" End End Select End Sub
Private Sub SlaytEkle() FrmBul.Caption = "Slayt Ekle" For j = 0 To LstGelenPath.ListCount - 1 FrmBul.LstPath.AddItem LstGelenPath.List(j) FrmBul.LstSecilen.AddItem LstGelenFile.List(j) Next j FrmBul.Show 1 End Sub
Private Sub YeniKaset() LstGelenPath.Clear LstGelenFile.Clear FrmBul.Caption = "Yeni Slayt Kaseti" FrmBul.Show 1 End Sub
Private Sub DosyaAc() CommonDialog1.Filter = "Slayt Dosyaları|*.sly" CommonDialog1.ShowOpen RichTextBox1.LoadFile CommonDialog1.filename, rtfRTF dosya = RichTextBox1.Text Do p = InStr(1, dosya, "/") If p <> 0 Then parca = Left(dosya, p - 1) Mid(dosya, 1) = Space(p) dosya = Trim(dosya) Else parca = dosya End If Parcala (parca) LstGelenPath.AddItem Trim(sol) LstGelenFile.AddItem sag Loop Until p = 0 End Sub
Private Sub DosyaKaydet() Dim dosya As String dosya = LstGelenPath.List(0) & "\" & LstGelenFile.List(0) For j = 1 To LstGelenPath.ListCount - 1 dosya = dosya & "/" & LstGelenPath.List(j) & "\" & LstGelenFile.List(j) Next j RichTextBox1.Text = dosya CommonDialog1.Filter = "Slayt Dosyaları|*.sly" CommonDialog1.ShowSave RichTextBox1.SaveFile CommonDialog1.filename, rtfRTF End Sub
Private Sub Parcala(GelenStr As String) sol = " " sag = " " Do p = InStr(1, GelenStr, "\") If p <> 0 Then sol = sol & Left(GelenStr, p) Mid(GelenStr, 1) = Space(p) GelenStr = Trim(GelenStr) Else sag = GelenStr End If Loop Until p = 0 sol = Left(sol, Len(sol) - 1) End Sub
FrmBul
Dim j
Private Sub CmdEkle_Click() Dim syc, k syc = 0 For j = 0 To File1.ListCount - 1 If File1.Selected(j) Then For k = 0 To LstSecilen.ListCount - 1 If LstSecilen.List(k) <> File1.List(j) Then syc = syc + 1 Next k If syc = LstSecilen.ListCount Then LstSecilen.AddItem File1.List(j) LstPath.AddItem File1.Path End If syc = 0 End If Next j End Sub
Private Sub CmdIptal_Click() Unload Me End Sub
Private Sub CmdSil_Click() For j = 0 To LstSecilen.ListCount - 1 If LstSecilen.Selected(j) Then LstSecilen.RemoveItem (j) LstPath.RemoveItem (j) Exit For End If Next j End Sub
Private Sub CmdTamam_Click() FrmAna.LstGelenFile.Clear FrmAna.LstGelenPath.Clear If LstSecilen.ListCount <> 0 Then For j = 0 To LstSecilen.ListCount - 1 FrmAna.LstGelenPath.AddItem LstPath.List(j) FrmAna.LstGelenFile.AddItem LstSecilen.List(j) Next j FrmAna.Image1.Picture = LoadPicture(LstPath.List(0) & "\" & LstSecilen.List(0)) End If rsyc = 0 Unload Me End Sub
Private Sub CmdTemizle_Click() LstSecilen.Clear LstPath.Clear End Sub
Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub
Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub
Private Sub File1_Click() Image1.Picture = LoadPicture(Dir1.Path & "\" & File1.filename) End Sub FrmSecenek
Private Sub CmdIptal_Click() Unload Me End Sub
Private Sub CmdTamam_Click() If OptDevirli.Value Then devirli = True Else devirli = False End If If Check1.Value = 1 Then FrmAna.Image1.Stretch = True FrmAna.Image1.Width = 5385 FrmAna.Image1.Height = 3255 Else FrmAna.Image1.Stretch = False End If Unload Me End Sub
Private Sub Form_Load() If devirli Then OptDevirli.Value = True Else OptDevirsiz.Value = True End If If FrmAna.Image1.Stretch Then Check1.Value = 1 Else Check1.Value = 0 End If End Sub
RANDOM (RASGELE) ERİŞİMLİ DOSYALAR Şu ana kadar yaptığımız bütün uygulamalarda, bilgiyi sadece değişkenlerde sakladık. Oysa amacı veri depolamak ve gerektiğinde bu veriyi işleyerek bilgiye dönüştürmek olan bir uygulamanın, bundan daha gelişmiş bir veri saklama yöntemine gereksinimi vardır. Bunlardan ilki, rasgele erişimli dosyalardır. “Rasgele” sözcüğü, VB’nin kullandığı erişim yönteminden gelmektedir. Bu dosya tipinde her kayıt, otomatik olarak bir kayıt numarası ile numaralandırılır. Herhangi bir kayda bu kayıt numarası ile doğrudan ulaşabiliriz. Ancak bir kayda başka bir alan kullanılarak ancak sıradan erişilebilir. Bu da kayıt sayısı arttığında çok ta pratik bir yöntem değildir. Ama az sayıda kayıt ile işlem yapıyorsak ya da binary dosyalar üzerinde çalışıyorsak, bu dosyalama türünü rahatlıkla kullanabiliriz. Şimdi kullanacağımız bazı komut ve deyimleri açıklayalım: Open Deyimi Dosya açmak/yaratmak için kullanılır. İlk açıldığında dosya yaratılır. Daha sonraki her açılışında ise belirlenen moda uygun olarak açılır. Genel sözdizimi: Open <dosya> For mod [Access erişim] [kilit] As [#]DosyaNumarası [Len=KayıtUzunluğu] <dosya> : Açılacak dosyanın yolu ve tam adını belirleyen string. Eğer yol belirtilmez ve sadece dosya adı (uzantısı ile) verilirse dosya, uygulamanın çalıştığı konumda aranır. mod : Dosyanın açılma modunu belirleyen anahtar. Append, Binary, Input, Output ya da Random. Eğer belirtilmezse dosya Random (Rasgele) modda açılır. Append, Input ve Output Sequential (Sıralı) dosyalar içindir. Bu tür dosyalar, kayıt mantığı olmayan metin tabanlı dosyalardır. Append bu dosyaya veri ekleme, Input girdi Output ise veri okuma modunda açar. Binary ise ikili (makine koduna dönüştürülmüş) dosya açmak için kullanılır. erişim : Erişim biçimi. Read, Write, ya da Read Write anahtarlarından birisi kullanılır. Belirtilme zorunluluğu yoktur. kilit : Dosyanın kilit modunu belirten anahtar. Shared, Lock Read, Lock Write ya da Lock Read Write. Bunlar sırasıyla dosyayı paylaşılan, okumaya kilitli, yazmaya kilitli ve hem okumaya hem yazmaya kilitli yapar. Belirtilme zorunluluğu yoktur. DosyaNumarası: Kodlarda açılan dosyayı temsil edecek 1-511 arası bir dosya numarası. Sıradaki boş dosya numarasını FreeFile fonksiyonunu kullanarak saptayabilirsiniz. KayıtUzunluğu : 32,767 byte ile sınırlı bir değer. Dosya random açıldı ise bu değer kayıt uzunluğudur. Eğer sequential dosya söz konusu ise bu değer dosyadaki karakter sayısı olacaktır. Örnekler: Sequential bir dosyayı Girdi amaçlı açalım: Open "TESTFILE" For Input As #1 ' Başka bir modda açmadan önce dosyayı kapatalım: Close #1 ' Bu örnekte binary bir dosya sadece yazma amaçlı açılıyor: Open "TESTFILE" For Binary Access Write As #1 Close #1 ' Dosya, Kayitlar adlı bir kayıt adı ile rasgele erişimli olarak açılıyor: Open "TESTFILE" For Random As #1 Len = Len(Kayitlar) Close #1 ' Sequential dosya Çıktı amaçlı olarak okuma ya da yazma yapılabilecek biçimde açılıyor: Open "TESTFILE" For Output Shared As #1 Close #1 ' Binary bir dosya okuma amaçlı olarak açılıyor. Ancak okuma kilidi konduğundan dosya açıkken başka bir uygulama tarafından kullanılamaz. Open “TESTFILE” For Binary Access Read Lock Read As #1 Close Deyimi Open deyimi kullanılarak açılan bir dosyayı kapatmak için kullanılır. Genel sözdizimi: Close [DosyaNumarası] DosyaNumarası belirtilmezse o an açık durumda olan tüm dosyalar kapatılır. Get Deyimi Random ya da Binary bir dosyadan okuma amaçlı olarak kullanılır. Genel sözdizimi: Get [#]DosyaNumarası, [KayıtNumarası], Değişken DosyaNumarası : Hangi dosyadan okuma yapıldığını belirtir. KayıtNumarası : Random dosyada kaydın sıra numarası, Binary dosyada ise byte numarası olarak algılanır. Değişken : Okutulan kaydın aktarılacağı değişken. Random dosyada kayıt türünde olmalıdır. Put Deyimi Random ya da Binary bir dosyaya yazma amaçlı olarak kullanılır. Genel sözdizimi: Put [#]DosyaNumarası, [KayıtNumarası], Değişken DosyaNumarası : Hangi dosyaya yazma yapılacağını belirtir. KayıtNumarası : Random dosyada kaydın sıra numarası, Binary dosyada ise byte numarası olarak algılanır. Değişken : Okutulan kaydın aktarılacağı değişken. Random dosyada kayıt türünde olmalıdır. Len Fonksiyonu Bir stringin karakter sayısını ya da bir kaydın byte uzunluğunu verir. Genel sözdizimi: Len(string | değişken)
LOF Fonksiyonu Open deyimi ile açılan dosyanın byte uzunluğunu verir. Genel sözdizimi: LOF(DosyaNumarası) EOF Fonksiyonu Open deyimi ile Random ya da Sequential modunda açılan dosyanın sonuna ulaşılıp ulaşılmadığını belirten boolean değer döndürür. Genel sözdizimi: EOF(DosyaNumarası) FreeFile Fonksiyonu Open deyimi ile kullanılmak üzere, sıradaki boş dosya numarasını verir. Genel sözdizimi: FreeFile[(Aralık)] Aralık : 0 (default) verilirse boş dosya numarası 1 – 255, 1 verilirse 256 – 511 arasında aranacaktır. Type Bildirimi Modül seviyesinde kullanıcı-tanımlı veri türleri yaratmak için kullanılır. Random bir dosyayı oluşturacak kayıtların türü, modülde Type bildirimi kullanılarak belirlenir. Genel sözdizimi: [Private | Public] Type <değişken> <bileşen> As type [<bileşen> As type] . . . End Type ÖRNEK UYGULAMA Hazırlayacağımız uygulama Random (Rasgele) bir dosya üzerinde çalışacak ve aşağıdaki özelliklere sahip olacaktır: • Kayıt Girişi • Kayıt Arama • Kayıt Düzeltme • Kayıt Silme Bu özelliklerin hepsi uygulamamızda bir ana form tarafından çağrılan birer form olarak tasarlanmıştır. Aşağıda her bir form ve bu formlara ait kodlar verilmiştir: Module1 Type kayitturu Ad As String * 10 Soyad As String * 15 Adres As String * 50 Tel As String * 10 End Type Global Kayit As kayitturu Global Yeni As Boolean FrmAna FrmGiris
Private Sub CmdKaydet_Click() If TxtAd.Text <> "" And TxtSoyad.Text <> "" Then Kayit.Ad = Trim(UCase(TxtAd.Text)) Kayit.Soyad = Trim(UCase(TxtSoyad.Text)) Kayit.Adres = TxtAdres.Text Kayit.Tel = TxtTel.Text cevap = MsgBox("Bilgiler dosyaya yazılsın mı?", 4) If cevap = 6 Then Put #1, TxtKayitNo.Text, Kayit TxtKayitNo.Text = TxtKayitNo.Text + 1 TxtAd.Text = "" TxtSoyad.Text = "" TxtAdres.Text = "" TxtTel.Text = "" TxtAd.SetFocus End If Else MsgBox "ADI ve SOYADI alanlarının doldurulması zorunludur." End If End Sub
Private Sub Form_Load() Open "Rehber.dat" For Random As #1 Len = Len(Kayit) TxtKayitNo.Text = LOF(1) / Len(Kayit) TxtKayitNo.Text = TxtKayitNo.Text + 1 End Sub
FrmBul
Private Sub CmdAra_Click() Dim bulundu As Boolean bulundu = False If TxtAd.Text = "" Or TxtSoyad.Text = "" Then MsgBox "Lütfen ADI ve SOYADI alanlarını doldurunuz" Else For i = 1 To LOF(1) / Len(Kayit) Get #1, i, Kayit If Trim(UCase(TxtAd.Text)) = Trim(Kayit.Ad) And Trim(UCase(TxtSoyad.Text)) = Trim(Kayit.Soyad) Then TxtKayitNo.Text = i TxtAd.Text = Kayit.Ad TxtSoyad.Text = Kayit.Soyad TxtAdres.Text = Kayit.Adres TxtTel.Text = Kayit.Tel bulundu = True End If Next i If Not bulundu Then MsgBox "Aranan kayıt bulunamamıştır..." End If End If End Sub
Private Sub TxtKayitNo_KeyPress(KeyAscii As Integer) If TxtKayitNo <> "" Then If KeyAscii = 13 Then Get #1, TxtKayitNo.Text, Kayit TxtAd.Text = Kayit.Ad TxtSoyad.Text = Kayit.Soyad TxtAdres.Text = Kayit.Adres TxtTel.Text = Kayit.Tel End If End If End Sub
FrmDuzelt
Private Sub CmdAra_Click() Dim bulundu As Boolean bulundu = False If TxtAd.Text = "" Or TxtSoyad.Text = "" Then MsgBox "Lütfen ADI ve SOYADI alanlarını doldurunuz" Else For i = 1 To LOF(1) / Len(Kayit) Get #1, i, Kayit If Trim(UCase(TxtAd.Text)) = Trim(Kayit.Ad) And Trim(UCase(TxtSoyad.Text)) = Trim(Kayit.Soyad) Then TxtKayitNo.Text = i TxtAd.Text = Kayit.Ad TxtSoyad.Text = Kayit.Soyad TxtAdres.Text = Kayit.Adres TxtTel.Text = Kayit.Tel bulundu = True End If Next i If Not bulundu Then MsgBox "Aranan kayıt bulunamamıştır..." End If End If End Sub Private Sub CmdDuzelt_Click() If TxtAd.Text <> "" And TxtSoyad.Text <> "" Then Kayit.Ad = Trim(UCase(TxtAd.Text)) Kayit.Soyad = Trim(UCase(TxtSoyad.Text)) Kayit.Tel = TxtTel.Text Kayit.Adres = TxtAdres.Text FrmSor.Show 1 If TxtAd.Text <> Kayit.Ad Or TxtSoyad.Text <> Kayit.Soyad Then If Yeni Then Put #1, LOF(1) / Len(Kayit) + 1, Kayit Else Put #1, TxtKayitNo.Text, Kayit End If End If Close #1 Unload Me End If End Sub
Private Sub CmdKapat_Click() Close #1 Unload Me End Sub
FrmSor
FrmSil
Private Sub CmdAra_Click() Dim bulundu As Boolean bulundu = False If TxtAd.Text = "" Or TxtSoyad.Text = "" Then MsgBox "Lütfen ADI ve SOYADI alanlarını doldurunuz" Else For i = 1 To LOF(1) / Len(Kayit) Get #1, i, Kayit If Trim(UCase(TxtAd.Text)) = Trim(Kayit.Ad) And Trim(UCase(TxtSoyad.Text)) = Trim(Kayit.Soyad) Then TxtKayitNo.Text = i TxtAd.Text = Kayit.Ad TxtSoyad.Text = Kayit.Soyad TxtAdres.Text = Kayit.Adres TxtTel.Text = Kayit.Tel bulundu = True End If Next i If Not bulundu Then MsgBox "Aranan kayıt bulunamamıştır..." End If End If End Sub
Private Sub CmdKapat_Click() Close #1 Unload Me End Sub
Private Sub CmdSil_Click() For i = TxtKayitNo.Text To LOF(1) / Len(Kayit) - 1 Get #1, i + 1, Kayit Put #1, i, Kayit Next i Open "Rehber.tmp" For Random As #2 Len = Len(Kayit) For i = 1 To LOF(1) / Len(Kayit) - 1 Get #1, i, Kayit Put #2, i, Kayit Next i Close FileCopy "Rehber.tmp", "Rehber.dat" Kill "Rehber.tmp" MsgBox "Kayıt silinmiştir..." Unload Me End Sub
DOSYA VE KLASÖRLER ÜZERİNDE İŞLEMLER Bu bölümde, uygulamanın kendisi dışındaki dosyalara ve klasörlere müdahale etmesini sağlayacak bazı özel VB deyimlerini ve fonksiyonlarını tanıtacağız. CurDir : Geçerli klasörü verir. Eğer değiştirilmedi ise bu klasör, uygulamanın çalıştığı klasördür. ChDir() : Geçerli klasörü değiştirir. Örnek : ChDir “C:\Belgelerim” ChDrive() : Geçerli sürücüyü değiştirir. Örnek : ChDrive “D” MkDir() : Geçerli sürücü ve klasör altında bir klasör yaratır. Örnek : MkDir “Oyunlar” RmDir() : Geçerli sürücü ve klasör altında belirlenen klasörü siler. Örnek : RmDir “Oyunlar” FileCopy() : Belirli bir klasörde yer alan bir dosyayı belirlenen bir klasöre yeni adla kopyalar. Birden çok sayıda dosya üzerinde işlem yapmak için Joker karakterlerden yararlanılabilir. (*,?) Örnek : FileCopy “A:\Bulutlar.bmp” “C:\Windows\YeniBulutlar.bmp” Kill() : Belirli bir klasörde yer alan bir dosyayı silmek için kullanılır. Yine Joker karakterlerden yararlanılabilir. Örnek : Kill “C:\Windows\Gereksiz.doc” Name() : Bir dosya ya da klasörün adını değiştirmek için kullanılır. Örnek : Name “C:\Rehber.dat” “C:\Rehber.Tmp” FileLen() : Dosyanın byte olarak uzunluğunu verir. Örnek: FileLen “A:\deneme.exe” GetAttr()/SetAttr() : Dosyanın özniteliklerini değiştirir/verir. Parametreler aşağıda verilmiştir: vbNormal 0 Normal (geçerli) vbReadOnly 1 Salt-okunur vbHidden 2 Gizli vbSystem 4 Sistem dosyası vbDirectory 16 Klasör vbArchive 32 Arşiv dosyası Örnekler: GetAttr("C:\TEST.DAT") SetAttr "C:\TEST.DAT", vbHidden + vbReadOnly
neyse yeterince örnekli sayfalardan vermeye çalıştım açıklamalarla beraber... unutmayın eğer kitap gibi bişey varsa elinizde paylaşın bizimle.