İndir

Transkript

İndir
© 2000
Tolga GÜYER
© 2000
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)
2
Tolga GÜYER
© 2000
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]
Form üzerinde Circle ve Line metotları ile yaratılan grafiklerin doldurma
renklerini belirler.
Sözdizimi: form.FillColor [ = renk]
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
Form metninin saydamlık özelliğini belirler.
Sözdizimi: form.FontTransparent [= boolean]
FillColor
FillStyle
FontTransparent
3
Tolga GÜYER
ForeColor
Palette
Picture
© 2000
Form üzerinde yer alan grafiklerin rengini belirler.
Sözdizimi: form.ForeColor [=renk]
Form tarafından kullanılacak bir palet dosyası atar.
Sözdizimi: form.Palette = path
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
4
Tolga GÜYER
DrawWidth
Enabled
OLEDropMode
PaletteMode
RightToLeft
Visible
© 2000
1
Kesik çizgili
2
Noktalı
3
Kesik çizgi - Nokta
4
Kesik çizgi - Nokta - Nokta
5
Saydam
6
İç dolgulu
Grafik metotlarında çizgi kalınlığını belirler.
Sözdizimi: form.DrawWidth [= büyüklük]
Formun kullanılabilir ya da kullanılamaz olmasını belirler.
Sözdizimi: form.Enabled [= boolean]
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.
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.
Metin yazım yönünü belirler.
Sözdizimi: form.RightToLeft
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
5
Tolga GÜYER
© 2000
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.
6
Tolga GÜYER
© 2000
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
7
Tolga GÜYER
© 2000
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,
Formun üzerindeki grafik metodu kullanılarak yaratılan nesneler için
ScaleWidth
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,
Formun üzerindeki grafik metodu kullanılarak yaratılan nesnelerin
ScaleTop
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.
8
Tolga GÜYER
© 2000
Formlara Uygulanan Olaylar
Activate
Deactivate
Click
DblClick
DragDrop
DragOver
GotFocus
Initialize
Form, aktif pencere olduğu anda oluşur.
Sözdizimi: Private Sub Form_Activate( )
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
Form üzerinde fare tıklaması sırasında oluşur.
Sözdizimi: Private Sub Form_Click( )
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
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ı.
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ı.
Form fokusu aldığı anda oluşur.
Sözdizimi: Private Sub Form_GotFocus( )
Form çalışma anında yaratıldığı anda oluşur.
Sözdizimi: Private Sub form_Initialize( )
9
Tolga GÜYER
KeyDown,
KeyUp
KeyPress
LinkClose
LinkError
LinkExecute
LinkOpen
Load
LostFocus
© 2000
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.
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.
DDE alışverişi kesildiği anda oluşur.
Sözdizimi: Private Sub Form_LinkClose( )
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)
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
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.
Form yüklendiği anda oluşur.
Sözdizimi: Private Sub Form_Load()
Form fokusu kaybettiği anda oluşur.
Sözdizimi: Private Sub Form_LostFocus( )
10
Tolga GÜYER
MouseDown
MouseUp
MouseMove
© 2000
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
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
11
Tolga GÜYER
Paint
Resize
Terminate
Unload
© 2000
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
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
Formun çalışması, çalışma anında sonlandığı anda oluşur.
Sözdizimi: Private Sub object_Terminate( )
Form, bellekten boşaltıldığı anda oluşur.
Sözdizimi: Private Sub Form_Unload(Cancel As Integer)
12
Tolga GÜYER
© 2000
İLK UYGULAMA : ÇİZİM PROGRAMI
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
Private
Friend
Opsiyonel-Fonksiyona tüm modüllerde yer alan tüm diğer prosedürler
tarafından erişilebilir.
Opsiyonel-Fonksiyona sadece kendisinin tanımlı olduğu modüldeki
prosedürlerden erişilebilir.
Opsiyonel-Sadece Class-Modüllerde tanımlanır. (Bkz: VB Help Reference)
13
Tolga GÜYER
Static
Fonksiyon adı
parametreler
tür
deyimler
ifade
© 2000
Opsiyonel-Fonksiyon tarafından kullanılan lokal değişkenler çağrılar
arasında korunurlar.
Standart değişken isimlendirme kuralları kullanılarak belirlenen ad.
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
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.
Fonksiyon tarafından çalıştırılacak program deyimleri.
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
14
Tolga GÜYER
© 2000
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
15
Tolga GÜYER
© 2000
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
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
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"
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.
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
16
Tolga GÜYER
© 2000
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
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.
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.
Fare düğmesine basılıyor.
Son çizim konumunu fare
düğmelerinden herhangi birisine
basılan konum olarak atar.
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
Private Sub Form_MouseDown(Button As Integer, Shift
As Integer, X As Single, Y As Single)
CurrentX = X
CurrentY = Y
End Sub
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
Private Sub CmbRenk_Click()
RenkKodu = KodaCevir(CmbRenk.Text)
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.
CmbRenk ComboBox’ında
seçilen rengin kod karşılığını
RenkKodu değişkenine aktarır.
17
Tolga GÜYER
Private Sub CmbKalinlik_Click()
Me.DrawWidth = KodaCevir(CmbKalinlik.Text)
End Sub
Private Sub BtnTemizle_Click()
Me.Cls
End Sub
Private Sub BtnCikis_Click()
End
End Sub
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
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
© 2000
CmbKalinlik ComboBox’ında
seçilen çizgi kalınlığını kod
karşılığını formun DrawWidth
özelliğine aktarır.
BtnTemizle butonuna basılıyor.
Form temizleniyor.
BtnCikis butonuna basılıyor.
Program sonlanıyor.
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.
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.
18
Tolga GÜYER
© 2000
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)
19
Tolga GÜYER
© 2000
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>
20
Tolga GÜYER
© 2000
[<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
21
Tolga GÜYER
© 2000
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]
22
Tolga GÜYER
© 2000
[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
23
Tolga GÜYER
© 2000
Sayac = 0
While Sayac < 20
Sayac = Sayac + 1
Wend
24
Tolga GÜYER
© 2000
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
25
Tolga GÜYER
© 2000
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"
26
Tolga GÜYER
© 2000
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.
27
Tolga GÜYER
© 2000
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
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
Değişken tanımlamaları.
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
28
Tolga GÜYER
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 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 BtnTopla_Click()
TusaBasildi = 1
Arti = True
Ondalik = False
LbBilgiEkr.Caption = "+"
End Sub
Private Sub BtnC_Click()
TxtEkran.Text = 0
TusaBasildi = 0
Ondalik = False
LbBilgiEkr.Caption = ""
End Sub
Private Sub BtnCE_Click()
TxtEkran.Text = 0
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
© 2000
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.
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.
İ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.
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.
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.
Tam Silme butonuna basılıyor.
Tüm değerler sıfırlanıyor.
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.
Sağdan-Silme butonuna
basılıyor. Kod eğer ekrandaki
text sıfırdan farklıysa çalışıyor.
29
Tolga GÜYER
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
© 2000
İ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.
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.
Off butonuna basılıyor. Form
geri-yükleniyor.
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.
Karekök butonuna basılıyor.
Eğer ekrandaki sayı negatifse
30
Tolga GÜYER
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 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
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
© 2000
bilgi ekranına hata işareti
basılıyor. Aksi durumda
ekrandaki sayının karekökü
hesaplanıp yine ekrana
aktarılıyor.
İ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.
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.
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"
31
Tolga GÜYER
© 2000
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
32
Tolga GÜYER
© 2000
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 = ""
33
Tolga GÜYER
© 2000
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
34
Tolga GÜYER
© 2000
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)
35
Tolga GÜYER
© 2000
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
36
Tolga GÜYER
© 2000
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,"
37
Tolga GÜYER
© 2000
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
38
Tolga GÜYER
© 2000
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()
39
Tolga GÜYER
© 2000
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
40
Tolga GÜYER
© 2000
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:
41
Tolga GÜYER
© 2000
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
sonraki deyime geçirir.
: Hata durumunda kodun akışını hatanın oluştuğu deyimden
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...!
42
Tolga GÜYER
© 2000
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)
43
Tolga GÜYER
© 2000
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
44
Tolga GÜYER
© 2000
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 = ""
45
Tolga GÜYER
© 2000
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
46
Tolga GÜYER
© 2000
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.
47
Tolga GÜYER
VbMsgBoxSetForeground
penceresi olarak belirler.
vbMsgBoxRight
vbMsgBoxRtlReading
sistem)
© 2000
65536
Mesaj kutusu penceresini ön cephe (foreground)
524288
1048576
Mesaj metni sağa dayalı.
Mesaj metni sağdan sola doğru yazılır. (Arabik
Ö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.
48
Tolga GÜYER
© 2000
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.
49
Tolga GÜYER
© 2000
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"
Kapat düğmesine basılmadan önce Kaydet
düğmesine basılıp basılmadığını belirlemek
için kullanılacak flag (bayrak) değişken
CmbIL ComboBox’ından bir seçenek
seçildiği anda önce CmbILCE ComboBox’ı
temizleniyor, sonra seçilen textin durumuna
göre AddItem metodu kullanılarak
dolduruluyor. (Seçilen ile ait ilçe adları ile)
50
Tolga GÜYER
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
© 2000
Kapat butonuna basıldığında, önce Kaydet
düğmesine basılıp basılmadığı ve zorunlu
alanların tümünün dolu olup olmadığı
kontrol ediliyor. Sonuç olumsuz ise önce
kullanıcıya bilgileri kaydedip
kaydetmeyeceği soruluyor ve verdiği cevaba
göre form doğrudan kapatılıyor ya da
kaydetme işlemi yapılıp kapatılıyor. Aksi
durumda ise form doğrudan kapatılıyor.
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 = ""
Kaydet butonuna basıldığında, önce zorunlu
TxtBAd.Text = ""
alanların tümünün doldurulup
doldurulmadığı denetleniyor, eğer sonuç
TxtAAd.Text = ""
olumlu ise uygun bir mesajın ardından tüm
TxtAileNo.Text = ""
alanlara ilk değerleri aktarılıyor ve SetFocus
TxtCiltNo.Text = ""
metodu kullanılarak ilk alan olan TxtKSeri
TxtSiraNo.Text = ""
alanı aktif hale getiriliyor. Aksi durumda,
TxtDYer.Text = ""
yani zorunlu alanlardan en az birisi boş ise
kullanıcıya bir uyarı mesajı veriliyor.
TxtDYil.Text = ""
TxtKayNo.Text = ""
TxtKNo.Text = ""
TxtKSeri.Text = ""
TxtMah.Text = ""
51
Tolga GÜYER
© 2000
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
52
Tolga GÜYER
© 2000
Ç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
53
Tolga GÜYER
© 2000
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.
Kodlar, formların görüntüleri üzerinde verilmiştir:
Private Sub CmdTamam_Click()
End
End Sub
Private Sub CmdGozAt_Click()
FrmBul.Show 1
End Sub
Private Sub CmdIptal_Click()
End
End Sub
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub
Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub
Private Sub CmdBulTamam_Click()
FrmAna.TxtDosAd.Text = File1.Path & File1.filename
Unload Me
End Sub
Private Sub CmdBulIptal_Click()
Unload Me
End Sub
54
Tolga GÜYER
© 2000
Ş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
55
Tolga GÜYER
© 2000
LstDosyalar.AddItem File1.List(j)
End If
Next j
End Sub
56
Tolga GÜYER
© 2000
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.
57
Tolga GÜYER
© 2000
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()
58
Tolga GÜYER
© 2000
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
59
Tolga GÜYER
© 2000
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
60
Tolga GÜYER
© 2000
Private Sub Timer1_Timer() ‘Tasarımda Interval özelliği 200 olarak belirlenmiştir.
kelebek 'Ve kelebeğimiz kanat çırpıyor
End Sub
MENÜLER
Hemen hemen bütün Windows
tabanlı uygulamalarda görmeye alışık
olduğumuz pop-up (üstten-açılır)
menüler, Visual Basic
uygulamalarında da oldukça
kullanışlı bir araç olan Menu Editor
kullanılarak kolaylıkla hazırlanabilir.
Forma bir menü eklemek için Tools
menüsünden Menu Editor seçeneğini
seçmek yeterlidir. Bu yapıldığında
karşımıza, oluşturacağımız menünün
seçenek adlandırma, alt menüler,
indeksler ve kısayol atamaları gibi
detaylarının tasarlanacağı yandaki
pencere gelecektir.
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.
61
Tolga GÜYER
Sol Ok
© 2000
: 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
geçirir.)
: Seçileni menü sıralamasında bir yukarı çıkartır. (Soldan sağa sıralamada sola
Aşağı Ok
geçirir.)
: Seçileni menü sıralamasında bir aşağı indirir. (Soldan sağa sıralamada sağa
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.
62
Tolga GÜYER
© 2000
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:
Global TusaBasildi As Boolean
Global C1,C2 As Byte
Dim katsayi
Function hesapla(p1, p2) As Double
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.
63
Tolga GÜYER
© 2000
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ı
Sıfırdan küçük
Sıfırdan büyük
Sıfıra eşit
Belirtilmezse
Rnd tarafından üretilen rasgele sayı
Her seferinde aynı sayı üretilir
Her seferinde farklı sayı üretilir
En sık üretilen rasgele sayı üretilir
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:
64
Tolga GÜYER
© 2000
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
65
Tolga GÜYER
© 2000
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
66
Tolga GÜYER
© 2000
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
Do While Timer < basla + sure
saydırılıyor (bekleme için)
Loop
End Sub
‘ basla ya sistem sayıcısının o anki değeri aktarılıyor.
‘Sistem sayıcısı (Timer fonksiyonu) sure kadar
Private Sub Timer1_Timer()
ZamanSayaci = ZamanSayaci + 1‘Oyun sırasında süreyi tutan Timer kontrolü
Label2.Caption = ZamanSayaci
End Sub
Private Sub OyunBitti()
67
Tolga GÜYER
© 2000
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
68
Tolga GÜYER
FrmSeviye
© 2000
Private Sub CmdIptal_Click()
Unload Me
End Sub
Private Sub CmdTamam_Click()
seviye = CmbSvy.Text
If OptSurekli.Value = True Then surekli = True Else surekli = False
Unload Me
End Sub
Private Sub Form_Load()
CmbSvy.Text = seviye
If surekli Then OptSurekli.Value = True Else OptTurlu.Value = True
End Sub
FrmAbout
Dim kontrol As Byte
Private Sub kelebek()
If kontrol = Private
0 Then Sub CmdTamam_Click()
Unload
Me
PicKlbk.Picture
= PicKlbk1.Picture
kontrol = 1
End Sub
Else
‘Bilgiler= label’lara
tasarım
PicKlbk.Picture
PicKlbk2.Picture
giriliyor.
kontrol =‘sırasında
0
End If
End Sub
Private Sub BtnTamam_Click()
Unload Me
End Sub
Private Sub Timer1_Timer()
kelebek
FrmYardim
69
Tolga GÜYER
© 2000
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
70
Tolga GÜYER
© 2000
Program Eş Kartları Nasıl Anlıyor?
Birbiri ile eş olan resimleri içeren PictureBox’lar aşağıdaki gösterilmiştir:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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:
71
Tolga GÜYER
© 2000
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ı.
72
Tolga GÜYER
© 2000
73
Tolga GÜYER
© 2000
Ö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:
74
Tolga GÜYER
© 2000
FrmAna
Dim yol, sol, sag
Private Sub MnuCikis_Click()
End
End Sub
Private Sub CmdGeri_Click()
Geri sarma butonu. rsyc, liste kutusundaki resim dosyası yolunun
rsyc = rsyc - 1
indeksini gösterir. Burada bu indeks bir azalır ve ayarlar formunda
seçilen devir durumuna göre (devirli, modülde tanımlı bir boolean
If rsyc = -1 Then
değişken) ilk başa ulaştığında (sıfırıncı indeks) bu noktada kalır ya
If devirli Then
da sona döner. Listeden yolu (path) alır ve resmi Image1’e yükler.
İleri sarma butonu da (Cmdileri) bu işlemin tam tersini
rsyc = LstGelenPath.ListCount - 1
gerçekleştirecektir.
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
75
Tolga GÜYER
© 2000
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
76
Tolga GÜYER
© 2000
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
CommonDialog1’in dosya türü süzgeci (filter) Slayt Dosyalarına
Do
(*.sly) ayarlanıyor ve ShowOpen metodu kullanılarak sistemin Aç
p = InStr(1, dosya, "/")
penceresi görüntüleniyor. Burada belirlenen dosyanın içeriği
RichTextBox1 adlı zengin metin alanına aktarılıyor. Alınan bilgi,
If p <> 0 Then
kaydederken belirlenen forma uygun olarak işleniyor. (Bkz.
parca = Left(dosya, p - 1)
DosyaKaydet prosedürü)
Mid(dosya, 1) = Space(p)
dosya = Trim(dosya)
Else
parca = dosya
77
Tolga GÜYER
End If
Parcala (parca)
LstGelenPath.AddItem Trim(sol)
LstGelenFile.AddItem sag
Loop Until p = 0
End Sub
© 2000
Kaydetme penceresi görüntülenmeden önce dosya adlı bir
değişkene, dosyaların yollarını ve adlarını taşıyan liste
kutularından alınan stringler, “/” ayıracı ile ekleniyorlar. Sonuçta
elde edilen “dosya” değişkeni, kaydetme işleminden önce
RichTextBox1’e aktarılmaktadır.
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
Parcala prosedürü, “C:\RESİMLER\BMP\resim01.bmp” gibi bir
metni, sol=“C:\RESİMLER\BMP\” ve sag=“resim01.bmp” gibi iki
ayrı parçaya böler.
78
Tolga GÜYER
© 2000
FrmBul
Dim j
Private Sub CmdEkle_Click()
FileListBox’ta seçilen dosyalar ListBox’a eklenmeden önce, daha
önceden eklenip eklenmedikleri kontrol ediliyor. Eğer sonuç
Dim syc, k
olumlu ise (ancak bu durumda syc sayaç değişkeni liste
syc = 0
kutusundaki item sayısına ulaşacaktır) dosya adı ve yolu ayrı ayrı
iki liste kutusuna eklenir.
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)
79
Tolga GÜYER
© 2000
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
80
Tolga GÜYER
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
© 2000
Image’in Stretch özelliği False ise, Image alanı
resmin boyutlarına göre yeniden ölçeklendirilir ve bu
ölçüler Stretch özelliği True yapılsa da değişmez.
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
81
Tolga GÜYER
© 2000
PROBLEMLER-1
1. “EĞİK ATIŞ SİMULASYONU” Aşağıdaki görünüme sahip bir form hazırlayın:
Belirli değerlerle sınırlı bir ilk hız ve 0o-90o arası bir açı değeri girilip AT! butonuna
basıldığında, sol alt köşede yer alan atış ünitesinden belirlenen ilk hızla fırlayacak bir top
(içi dolu bir çember), belirlenen açı ile eğik atış hareketi yapacak ve düşecek.
2. “TRİGONOMETRİK FONKSİYON GRAFİĞİ ÇİZİCİ” Aşağıdaki görünüme sahip bir
form hazırlayın:
İstenilen fonksiyon seçilip aralığın alt ve üst sınırları girildikten sonra ÇİZ butonuna
basıldığında, aşağıda yer alan koordinat sisteminde fonksiyonun grafiği çizilecek.
82
Tolga GÜYER
© 2000
3. “IŞIN YANSITICISI” Aşağıdaki görünüme sahip bir form hazırlayın:
0o-180o arası bir açı değeri girilip GÖNDER butonuna basıldığında, ışın kaynağından
çıkacak bir ışın, yansıtıcıya ulaşarak yansıma prensiplerine uygun olarak yansıyacak.
4. “SEKME SİMULASYONU” Aşağıdaki görünüme sahip bir form hazırlayın:
BIRAK! butonuna basıldığında top (Image), yerçekimi etkisiyle düşey olarak düşecek ve
sekme presibine uygun olarak hareketsiz kalıncaya kadar sekecek.
83
Tolga GÜYER
© 2000
5. “SARKAÇ SİMULASYONU” Aşağıdaki görünüme sahip bir form hazırlayın:
0o-90o arası bir açı değeri girildiğinde sarkaç bu açıya uygun bir konum alacak. BIRAK!
butonuna basıldığında sarkaç doğal hareketine başlayacak ve salınım prensibine uygun
olarak hareketsiz kalıncaya kadar salınacak.
6. “DENKLEM ÇÖZÜCÜ” Aşağıdaki görünüme sahip bir form hazırlayın:
A, B, C ve D tamsayı değerleri girilip ÇÖZ butonuna basıldığında hesaplanan X1 ve
X2 çözümleri ekrandaki konumlarına yazdırılacak.
84
Tolga GÜYER
© 2000
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
85
Tolga GÜYER
© 2000
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
olmalıdır.
: Okutulan kaydın aktarılacağı değişken. Random dosyada kayıt türünde
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
olmalıdır.
: Okutulan kaydın aktarılacağı değişken. Random dosyada kayıt türünde
Len Fonksiyonu
Bir stringin karakter sayısını ya da bir kaydın byte uzunluğunu verir. Genel sözdizimi:
86
Tolga GÜYER
© 2000
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
87
Tolga GÜYER
© 2000
Ö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
Private Sub CmdBul_Click()
FrmBul.Show 1
End Sub
Private Sub CmdCikis_Click()
End
End Sub
Private Sub CmdDuzelt_Click()
FrmDuzelt.Show 1
End Sub
Private Sub CmdGiris_Click()
FrmGiris.Show 1
End Sub
Private Sub CmdSil_Click()
FrmSil.Show 1
88
Tolga GÜYER
© 2000
FrmGiris
Private Sub CmdKapat_Click()
Close #1
Unload Me
End Sub
Private Sub CmdVazgec_Click()
cevap = MsgBox("Girilecek başka kayıt var
mı?", 4)
If cevap = 6 Then
TxtAd.Text = ""
TxtSoyad.Text = ""
TxtAdres.Text = ""
TxtTel.Text = ""
TxtAd.SetFocus
Else
Unload Me
End If
End Sub
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
89
Tolga GÜYER
© 2000
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 CmdKapat_Click()
Close #1
Unload Me
End Sub
Private Sub Form_Load()
Open "Rehber.dat" For Random As #1 Len =
Len(Kayit)
TxtKayitNo.Text = LOF(1) / Len(Kayit)
End Sub
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
90
Tolga GÜYER
© 2000
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 Form_Load()
Open "Rehber.dat" For Random As #1 Len =
Len(Kayit)
TxtKayitNo.Text = LOF(1) / Len(Kayit)
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
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
91
Tolga GÜYER
© 2000
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
Private Sub CmdTamam_Click()
If OptYeni.Value Then
Yeni = True
Else
Yeni = False
End If
Unload Me
End Sub
FrmSil
Private Sub Form_Load()
Open "Rehber.dat" For Random As #1 Len =
Len(Kayit)
TxtKayitNo.Text = LOF(1) / Len(Kayit)
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
92
Tolga GÜYER
© 2000
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
93
Tolga GÜYER
© 2000
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
vbReadOnly
vbHidden
vbSystem
vbDirectory
vbArchive
Örnekler:
0
Normal (geçerli)
1
Salt-okunur
2
Gizli
4
Sistem dosyası
16
Klasör
32
Arşiv dosyası
GetAttr("C:\TEST.DAT")
SetAttr "C:\TEST.DAT", vbHidden + vbReadOnly
94

Benzer belgeler

makro programlama ders notları

makro programlama ders notları Formun açıldığı andaki görünümünü belirler. Sözdizimi: form.StartUpPosition = position

Detaylı