MÜHENDİSLİKTE İLERİ PROGRAMLAMA

T.C.
MİLLÎ SAVUNMA BAKANLIĞI
HARİTA GENEL KOMUTANLIĞI
HARİTA YÜKSEK TEKNİK OKULU
ANKARA
MÜHENDİSLİKTE İLERİ PROGRAMLAMA
DERS NOTLARI
Dr.Müh.Yb. Tayfun ÜNLÜ
Müh.Yzb. Feyzi KANTAR
ANKARA
2005
İÇİNDEKİLER
1. Bilgisayar Programlaması Mantığı
a. Algoritma Kurma
b. Akış Diyagramı
c. Akış Diyagramı Örnekleri
2. Yapısal Programlama Dilinin(Pascal) Temel Elemanları
a. Dilin Özellikleri
b. Program Yapısı
c. Değişkenler ve Sabitler
d. Tanımlama Bloğu
e. İcra Bloğu
f. Veri Tipleri, Operatörler ve Öncelikleri
g. İfadeler
3. Yapısal Programlama Dilinin Cümleleri
a. Atama Cümleleri
b. Giriş/Çıkış Cümleleri
c. Kontrol Cümleleri
d. Döngü Cümleleri
4. Yapısal Programlama Dilinin Diğer Elemanları
a. Dosya İşlemleri
b. Alt Programlar
c. Sıralı Veri Tipleri
d. Diziler
e. String İşlemleri
f. Records
5. Görsel Programlama Ortamı ve Temel Kavramlar
a. Projeler ile Çalışma
b. Kontrollerin Kullanımı
c. Özellik,Metod ve Olay Kavramları
6. Görsel Programlama Dilinin (Visual Basic) Temel Elemanları
a. Veri Tipleri, Sabitler ve Değişkenler
b. String ve Tip Dönüşümü İşlemleri
7. Görsel Programlama Dilinin Diğer Elemanları
a. Temel İşlemler
b. Blok Kontrol Deyimleri
c. Diziler
d. Alt Yordam Hazırlamak ve Kullanmak
e. Dosya İşlemleri
f. Dosya ve Dizinler Üzerinde İşlem Yapmak
8. Görsel Programlama Dili İle Kullanıcı Ara Yüzü Hazırlama
a. Formlar ve Özellikleri
b. Formlara Uygulanan Olaylar
c. Formlara Uygulanan Metotlar
d. MDI Özellikli Formlar
i
e.
f.
g.
h.
i.
j.
Hazır Formlar ve Şablonlar
Kontroller
Menü Hazırlamak
Araç Çubuğu Hazırlamak
Ortak Diyalog Kutuları
Hata Ayıklama
9. Görsel Programlama Dili İle Veritabanı Uygulamaları
a. Veritabanı Dosyası Hazırlamak
b. Veri Kontrolü
c. Veri Form Sihirbazı İle Form Hazırlamak
d. Birden Fazla Tablo Üzerinde İşlem Yapmak
e. Program Kodu Yazarak Veritabanı Dosyası Hazırlamak
f. Recordset Nesnesi
g. Sorgu Hazırlamak ve Sql Dili
h. ADO Kontrolü
i. Data Environment
j. Crystall Report ile Rapor Hazırlamak
k. Data Report ile Rapor Hazırlamak
l. Yazıcıyı Kullanmak
10. Görsel Programlama Dili İle İleri Uygulamalar
a. API Fonksiyonları
b. Yardım Dosyası Hazırlamak
c. Proje Hazırlama Sihirbazı
d. Exe Dosya ve Kurulum Hazırlama
e. ActiveX Hazırlamak ve DHTML Projeleri
f. Nesneye Yönelik Program Hazırlama
ii
1.Bilgisayar Programlaması Mantığı
a.Algoritma Kurma
Algoritma, verilen herhangi bir sorunun çözümüne ulaşmak için uygulanması gerekli adımların hiç bir yoruma
yer vermeksizin açık, düzenli ve sıralı bir şekilde söz ve yazı ile ifadesidir. Algoritmayı oluşturan adımlar
özellikle basit ve açık olarak sıralandırılmalıdır.
Programlamanın temeli olan algoritma hazırlanmasında dikkat çekici bir nokta, aynı sorunu çözmek için
hazırlanabilecek olası algoritma sayısının birden çok olmasıdır. Başka deyişle, bir sorunun çözümü için
birbirinden farklı birden fazla sayıda algoritma hazırlanabilir. Bu da gösteriyor ki herhangi bir problemin
çözümü için birbirinden farklı yüzlerce bilgisayar programı yazılabilir.
Bir bilgisayar programı için hazırlanacak olan algoritma da aynı şekilde çözüm yolunu bilmeyen bir kişiye,
çözüme ulaşmak için neler yapması gerektiği anlatılıyormuş gibi hazırlanmalı ve eksik bir nokta bırakmaksızın
gerekli tüm adımları açık ve düzenli olarak içermelidir. Çözüm için kullanılacak bilgilerin nereden alınacağı,
nerede saklanacağı ve çözümün program kullanıcısına nasıl ulaştırılacağı algoritma adımları arasında
belirtilmelidir.
Aşağıda değişik işlemlere ilişkin algoritma örnekleri verilmiştir.
Örnek 1: İki sayıyı toplamak için gerekli programa ait algoritmanın oluşturulması.
Algoritma:
A1 :Birinci sayıyı gir
A2 :İkinci sayıyı gir
A3 :İki sayının toplamını yap
A4 :Toplamın değerini yaz
A5 :Bitir.
Bu tam bir algoritmadır. Sözcüklerin ortaya çıkaracağı yanlış anlamaların ortadan kaldırmak amacıyla semboller
ve matematik dilini gerektiren bazı kısaltmalar kullanmak daha uygun olacaktır. Bir algoritma yazılırken şu
metot izlenmelidir:
1.
2.
3.
4.
5.
6.
Programda kullanılacak elemanları temsil etmek üzere uygun isimler veya değişkenler seç.
Bazı isimlere başlangıç değeri olarak çözümün gerektirdiği uygun değerler ver.
Gerekirse programa girilecek verileri düzenle.
Cebirsel notasyon ve kararlar kullanarak aritmetik işlemleri gerçekleştir.
Çıkışı düzenle.
Bitir.
1
Yukarıda iki sayının toplanması için oluşturduğumuz algoritmayı bu yeni gereksinimlere uyarak yeniden
yazalım.
Toplam adı için Z
Birinci Sayı için X
İkinci Sayı için Y değerleri kullanılırsa;
Algoritma:
A1 :X değerini gir
A2 :Y değerini gir
A3 :Z ¬ X+Y
A4 :Z’ yi yaz
A5 :Bitir
Görüldüğü üzere bu şekilde bir algoritma ile çözüm yolunu izlemek daha kolaydır. Bundan sonra bu tip
algoritma kullanılacaktır.
Örnek 2: Verilen bir sayının faktöriyelini hesaplayan programın algoritmasının oluşturulması
Sayının faktöriyeli :Fak
Faktöriyel degişkeni :X
Faktöriyeli hesaplanacak sayı :Y
Algoritma:
A1 :Fak¬ 1, X¬ 0
A2 :Y’i gir
A3 :Y<0 ise 2. adımı tekrarla
A4 :X¬ X+1
A5 :Fak¬ Fak*X
A6 :X<Y ise 4. adıma geri dön
A7 :Fak değerini yaz
A8 :Bitir
2
Bu algoritmada 1. adımda X e 0 ve Fak değişkenine 1 değeri atanıyor. 2. adımda Y değeri giriliyor ve 3. adımda
Y değerinin 0 dan küçük bir değer olup olmadığı denetleniyor ve denetim sonucuna göre gerekli komut veriliyor.
4. adımda X’in değeri 1 arttırılıyor ve 5. adımda X için Fak değeri hesaplanıyor. 6. adımda X in değerinin
faktöriyeli hesaplanacak sayıdan küçük olması durumunda 4. adımdan itibaren işlemlerin tekrarlanması komutu
veriliyor, X’ in değerinin Y’ye eşit olması durumunda işlemler tamamlanarak hesaplanan değerin yazdırılması
işleminden sonra programın çalışması sona ermektedir.
b. Akış Diyagramları
Geliştirilecek olan yazılımın genel yapısının şematik gösterimine akış diyagramı veya blok diyagramı adı
verilir. Akış diyagramları, yazılımı oluşturacak program parçalarını ve bu parçaların birbirleri ile olan ilişkilerini
belirler. Bir bilgisayar programının oluşturulmasında akış diyagramlarının hazırlanması, algoritma oluşturma
aşamasından sonra gelmektedir. Bilgisayar programının oluşturulması sırasında algoritma aşaması atlanarak,
doğrudan akış diyagramlarının hazırlanmasına başlanabilir. Programlama tekniğinde önemli ölçüde yol almış
kişiler bu aşamayı da atlayarak direkt olarak programın yazımına geçebilirler.
Akış diyagramlarının algoritmadan farkı, adımların simgeler şeklinde kutular içinde yazılmış olması ve adımlar
arasındaki ilişkilerin (iş akışı) oklar ile gösterilmesidir.
Akış diyagramlarında kullanılan semboller, anlamları ve kullanış amaçları aşağıdaki tabloda verilmiştir.
Tablo 1. İş akış diyagramlarında kullanılan semboller ve anlamları
Simge
Simgenin Adı ve Anlamı
3
Elips Akış diyagramının başlangıç ve bitiş yerlerini gösterir. Başlangıç
simgesinden çıkış oku vardır. Bitiş simgesinde giriş oku vardır.
Paralel Kenar: Programa veri girişi ve programdan elde edilen sonuçların
çıkış işlemlerini gösterir.
Dikdörtgen Aritmetik işlemler ve değişik atama işlemlerinin temsil
edilmesi için kullanılır.
Eşkenar Dörtgen Bir karar verme işlemini temsil eder.
Altıgen Program içinde belirli blokların ard arda tekrar edileceğini
gösterir.
Oklar Diyagramın akış yönünü ,yani her hangi bir adımdaki işlem
tamamlandıktan sonra hangi adıma gidileceğini gösterir.
Ayrıntılı bir akış diyagramı, yazılımı oluşturan işlemleri ve ilişkilerini en küçük detayına kadar belirler.
Bir bilgisayar programının geliştirilmesinde kullanılan programlama dili ne olursa olsun bu programların akış
diyagramlarında genel olarak yalnız üç basit mantıksal yapı kullanılır. Bu mantıksal yapılardan en basiti sıralı
yapıdır. Sıralı yapı, hazırlanacak programdaki her işlemin mantık sırasına göre nerede yer alması gerektiğini
vurgular. Bu yapı sona erinceye kadar ikinci bir işlem başlayamaz.
Şekil 1: Sıralı Yapı
Mantıksal yapılardan ikincisi Karar Verme yapısıdır (Şekil 2). Programlama sırasında If...Then... Else yapısı ile
tanıyacağımız bu mantıksal yapılar, birden fazla sıralı yapı seçeneğini kapsayan modüllerde, hangi şartlarda
hangi sıralı yapının seçileceğini belirler.
4
Şekil 2: Karar Verme Yapısı
Üçüncü mantıksal yapı çeşidini tekrarlı yapılar oluşturmaktadır. Bu yapılara Pascal programlama dilinde
For(Şekil 3.a), While ve Repeat..Until (Şekil 3.b), yapısı adı da verilir. Şartlara göre değişik işlem gruplarının
yapılmasını sağlar. Bu yapı yukarıda sözü edilen iki yapının çeşitli kombinezonların tekrarlanmasından
oluşmuştur.
Söz konusu üç değişik yapı, değişik kombinezonlarda kullanılarak istenilen işlevleri yerine getirecek programlar
hazırlanabilir. Programların bu üç basit yapı ile sınırlandırılması program modüllerinin daha kolay
tasarlanmasını sağlar.
(b)
(a)
Şekil 3: Tekrarlı Yapı
c.Akış Diyagramı Örnekleri
Bu bölümde yazılım oluşturma evrelerinden biri olan akış diyagramları ile ilgili örnekler verilmiştir. Sözlü veya
yazılı olarak oluşturduğumuz algoritmanın programa dönüştürülmesi sırasında programın çalışma sırasını da
gösteren akış diyagramlarıyla ilgili örnekler aşağıda verilmiştir.
Örnek 1: İki sayının toplamını ve ortalamasını yapan bilgisayar programının akış diyagramını çiziniz.
5
Örnek 2: 1’den 100’e kadar olan sayıların toplamlarını ve ortalamalarını veren programın akış diyagramını
çiziniz.
Örnek 3: Ax+b=0 şeklinde verilen 1.derece denklemin çözümünü veren programa ait akış diyagramını çiziniz.
6
Örnek 4: Ax²+Bx+C=0 şeklinde verilen 2. derece denklemin köklerini bulan programın akış diyagramını
çiziniz.
Yukarıdaki örnekte A=0 girilmesi durumunda denklem 1.derece olmaktadır. Bu durumu dikkate alarak gerekli
çözümü de gösterecek şekilde akış diyagramını değiştiriniz.
Örnek 5: 1’ den 100’e kadar sayıların karelerini, kareköklerini, küplerini, küpköklerini toplamlarını ve
ortalamalarını veren programın akış diyagramını çiziniz.
7
Örnek 6: Yukarıda karar mantığı yapısı ile çözümlediğimiz problemi döngü yapısı ile çözümleyelim.
8
Örnek 7:10 tane N sayısının faktöriyelini hesaplayan programın akış diyagramını çiziniz.
9
Örnek 8: Yukarıdaki örneği tekrarlı yapı olarak tanımladığımız döngü yapısı ile çözelim.
10
Örnek 9: Elimizde bulunan A,B, ve C gibi 3 adet sayıdan en büyüğünü ve en küçüğünü bulan programın akış
diyagramını çiziniz.
11
Örnek 10: Elimizde bilinmeyen sayıda koni bulunmaktadır ve koniye ait yarıçap (R) ve yükseklik (H) değerleri
klavyeden girilmek suretiyle V=p .R².H/3 formülü ile hacim hesabı yapılacaktır. Koniye ait yarıçap değeri 0
girildiğinde programın çalışması duracaktır. Programda her girilen veri için hacim değeri rapor edilecek,
programın çalışması bittiğinde toplam kaç koni için hacim hesabı yapıldığı da belirtilecektir.
Verilen akış diyagramında R ve H değerlerinin negatif girilmesine engel olacak şekilde akış diyagramını yeniden
düzenleyiniz.
Örnek 11: F(x) kesikli fonksiyonunun değeri X’in aldığı değerlere göre aşağıda verilmiştir. X’in değeri 0-10
arasında 0.5 aralıklarla arttığına göre her bir X değeri için F(x) fonksiyonunu hesaplayan programın akış
diyagramını çiziniz.
·
·
·
·
0< X < 2 f(x)= X
2< X < 3 f(x)=X 3-X2-2
3< X < 4 f(x)=X 2-2X+13
4< X f(x)=X 4-3X2-43
12
Örnek 12: p sayısının formülü
olduğuna göre serinin paydasındaki ifade 100
oluncaya kadar pi sayısını hesaplayan bilgisayar programının akış diyagramını çiziniz.
13
2.Yapısal Programlama Dilinin(Pascal) Temel Elemanları
a.Dilin Özellikleri
·
·
·
·
·
·
·
Pascal programlama dili mantıklı bir şekilde bir araya getirilmiş program bloklarından oluşan blok
yapılı bir dildir.
Satır numaraları kullanılmaz.
Tüm değişken isimlerinin program veya alt programın başlangıcında tanımlanması gerekir.
Her bir değişkenin veri tipi açıkça tanımlanmalıdır.
Genel kural olarak pascal kendiliğinden bir veri tipinden diğerine otomatik dönüşüm yapmaz. Pascal
derleyicisi veri tipi kontrolünü atama ve karşılaştırma cümleleri ile parametre geçişlerinde yapar.
Alt programlar(functions, procedures) ana program ile aynı yapıya sahiptir.
Program satırları okunurluğu sağlayacak şekilde hizalanır(indentation).
Pascal Programı
Program Başlığı
Program Bloğu
Tanımlama Bloğu
Label
Bölümü
CONST
Bölümü
İcra Bloğu
TYPE
Bölümü
VAR
Bölümü
AltProgram Bölümü
Şekil 4: Bir Pascal Programının Şematik Görünümü
14
b.Program Yapısı
Bir pascal programının yapısı aşağıda görüldüğü gibidir.
PROGRAM NAME1(INPUT,OUTPUT)
LABEL { GOTO deyiminde kullanılan referanslar }
CONST { Sabitler }
TYPE { Kullanıcı tarafından tanımlanan veri tipleri }
VAR { Genel(Global) Değişkenler }
FUNCTION NAME2(Parametre Listesi):TYPE;
Label
Const
Type
Var
{Varsa bu altprogramın kullanacağı diğer altprogramlar}
BEGIN
Pascal Cümleleri;
END;
PROCEDURE NAME3(Parametre Listesi)
Label
Const
Type
Var
{Varsa bu altprogramın kullanacağı diğer altprogramlar}
BEGIN
Pascal Cümleleri;
END;
Label
Const
Type
Var
BEGIN
Pascal Cümleleri;
END;
Ana Program
c.Değişkenler ve Sabitler
Değişkenler ve sabitler bir harf ile başlarlar. İsimlerinin uzunluğu kullanılan derleyiciye bağlıdır.
· Standart pascalda isim uzunluğu 8 karaktere kadar olabilir.
· Turbo pascalda isim uzunluğu 127 karaktere kadar olabilir. İlk 63 karakteri benzersiz olmalıdır.
Pascal deyim ve komutlarında kullanılan sözcükler isimlendirmede kullanılamaz.
(Reserved words)
Geçersiz
7
1X
FARUK-K
Geçerli
A
X1
FARUK
(1). Tamsayı Sabitler
25
025
+25
-25
(2). Reel Sabitler
(a). Ondalık Sayılı
2.5 –2.5
15
(b). Bilimsel Notasyonda
-1.234x10 15 -> -1.234E+15 veya -1.234E15
(c). Normalleştirilmiş Formda
25.34E2 -> 0.2534 E4
(3). String veya Karakter Sabitler
‘HYTO’ ‘HO’ ‘TC’
(4). Mantıksal Sabitler
True False
(5). Küme Sabitleri
Sayılabilir değerlerden oluşan topluluğa küme denir.
[1..12] 1 ile 12 arasındaki sayılardan oluşan alt küme(subrange)
[1,3,5,7,9] ilk beş tek sayıdan oluşan küme
[‘A’..’Z’]
d.Tanımlama Bloğu
(1). Label Bölümü
Label bölümü program içerisinde GOTO cümlesi kullanıldığında gereklidir. İyi bir yapısal
program GOTO cümlesi içermemelidir.
Örn: LABEL 10,EXIT,459,99
(2). Constant Bölümü
CONST
Pwd=’HYTO’
Bosluk=’ ‘
Yildiz=’***’
E= 2.718283
PI=3.14
ALPHA=[‘A’..’Z’]
(3). Type Bölümü
TYPE
Tip İsmi
16
=
Tip Tanımı
;
TYPE
WeekDays = (MON, TUE, WED, THUR, FRI) ;à Sıralı(Enumarated) tip
Indis = 1..50;
DiziTipi = ARRAY[Indis] OF INTEGER
Line = STRING[80]
RENKLER = SET OF (RED,BLUE);
Isim = RECORD
First : STRING[10];
Last : STRING [15];
END;
(4). Var Bölümü
VAR
X,Y,Z : INTEGER;
J,K : REAL;
Q : BOOLEAN;
Words : ARRAY [1..100] OF STRING[10];
Days : WeekDays;
Kullanıcı tanımlı tip adları TYPE
Satır : Line;
bölümünde tanımlanmış olmalıdır.
Ad : Isim;
e.İcra Bloğu
·
Tüm icra edilebilir cümleler BEGIN/END arasına yazılır.
o Programla ilgili açıklamalar {...} veya (*...*) arasına yazılır.
o Boşluklar okumayı arttırmak için semboller, değişkenler ve operatörler arasına
konulabilir.
C := A + B;
C := A + B;
o Okumayı arttırmak için kodun içine boş satırlar eklenebilir.
17
·
Kod Yazmada dikkat edilecek hususlar:
o Pascala ait sözcükler büyük harfle yazılır.
o Her bir cümle ayrı bir satıra yazılır.
o Kullanıcı tanımlı isimlerin ilk karakteri büyük diğerleri küçük harf ile yazılır.
o Devam eden cümlenin kalan kısmını aynı hizada yazın.
o Her BEGIN sözcüğü bir END sözcüğü ile bitirilmelidir.
·
Kullanıcı tarafından tanımlanan isimler aşağıdaki Pascal sözcüklerinden farklı
olmalıdır.
*ABSOLUTE
ABS
AND
ARRAY
BEGIN
CASE
CONST
DIV
DO
DOWNTO
ELSE
AND
*EXTERNAL
FILE
FORWARD
FUNCTION
GOTO
IF
*IMPLEMENTATION
IN
*INLINE
*INTERFACE
*INTERRUPT
LABEL
MOD
NIL
NOT
OF
OR
PACKED
PROCEDURE
PROGRAM
RECORD
REPEAT
SET
*SHL
*SHR
*STRING
THEN
TO
TYPE
*UNIT
UNTIL
*USES
VAR
WHILE
WITH
*XOR
NOT: (*) ile işaretlenen sözcükler sadece TURBO PASCAL için geçerlidir.
f.Veri Tipleri Operatörler ve Öncelikleri
·
Veri Tipleri
o
Tamsayı Tipleri
18
Pascalda değişkenleriniz için tanımlayabileceğiniz veri tiplerini aşağıda bulabilirsiniz. İşaretli veya işaretsiz
tamsayıları ifade etmek için kullanabileceğiniz çeşitli aralıkları kapsayan değişken tipleridir. Programlarınızda
en çok kullanacak olduğunuz tipler de yine bu tiplerdir.
Tip
Değer
Açıklama
Byte
0..255
İşaretsiz tamsayılar (8 bit).
Shortint -128..127
İşaretli tamsayılar (8bit).
Integer -32768..32767
İşaretli tamsayılar (16 bit)
Word
0..65535
İşaretsiz tamsayılar (16 bit).
Longint -2147483648..2147483647
İşaretli tamsayılar(32 bit).
o
Kesirli Sayı Tipleri
Bu sayı tipleri sabit veya ondalıklı gerçel sayıları ifade etmekte kullanılırlar. Özellikle büyük rakamlarla veya
bilimsel araştırmalarla uğraşıyorsanız bu tip değişkenlere çok işiniz düşecek demektir.
Tip
Değer
Real
2.9e-39..1.7e38
Single
1.5e-45..3.4e38
Double
5.0e-324..1.7e308
Extended 3.4e-4932..1.1e4932
Comp
-9.2e18..9.2e18
Basamak
11-12
7-8
15-16
19-20
19-20
Açıklama
6 bytelık yer tutar
4 bytelık yer tutar
8 bytelık yer tutar
10 bytelık yer tutar
8 bytelık yer tutar
Aşağıdaki değerler bilimsel notasyonda yazılmıştır. Düzgün görüntüsü için şu örnekten yararlanabilirsiniz :
2.9e-39 = 2.9 * 10-39
o
Karakter ve Alfanümerik Tipler
Bu tip değişkenlerin içinde isim, adres gibi sayısal olmayan değerler tutulur.
Tip
Değer
Char ‘a’,’z’...
String (0..254 karakter)
o
Açıklama
Tek karakterlik değişkenler (8 bit).
Karakterlerden oluşan dizidir
Mantıksal Tip
Sadece doğru veya yanlış değerini tutabilen değişkenlerdir. Karar vermenizde size yardımcı olacaklarına emin
olabilirsiniz. Doğru için 1, yanlış için 0 olarak düşünebilirsiniz.
Tip
Değer
Boolean True,False (1,0)
·
Operatörler
o
Aritmetik Operatörler
19
Operator
+
*
/
Div
Mod
o
Operator
Not
And
Or
Xor
Shl
Shr
İşlemi
Toplama
Çıkarma
Çarpma
Bölme
Tamsayı Bölme
Kalan
İşlem Tipleri
integer,real
integer,real
integer,real
integer,real
integer,real
integer
Sonuç tipi
integer,real
integer,real
integer,real
real,real
integer,real
integer
Mantıksal Operatörler
İşlem
Değil
Ve
Veya
1 sayacı
Sola kaydırma
Sağa kaydırma
İşlem Tipi
integer
integer
integer
integer
integer
integer
Sonuç Tipi
integer
integer
integer
integer
integer
integer
Karşılaştırma Operatörleri Bu operatörlerin sonucu daima boolean döner.
Operatör
=
<>
<
>
<=
>=
o
Açıklaması
Eşit olup olmadığını kontrol eder
Farklı olup olmadığını kontrol eder
Küçük mü?
Büyük mü?
Küçük veya eşit mi?
Büyük veya eşit mi?
Küme Operatörleri
* : İki kümenin kesişimini verir.
+: İki kümenin birleşimini verir.
- : Soldaki kümenin sağdaki kümeden fark kümesini verir.
·
Operatörlerin Önceliği
o
1nci Öncelik: Parantez içindeki işlemler.
o
2nci Öncelik: Yordam çağrıları
o
3ncü Öncelik: Tekli operatörler (-A)
20
o
4ncü Öncelik: Mantıksal NOT
o
5nci Öncelik: * , / , DIV , MOD , AND
o
6ncı Öncelik: + , - , OR , XOR
o
7nci Öncelik: Karşılaştırma operatörleri
g.İfadeler
·
Aritmetik İfadeler
o
Her aritmetik ifade bir satıra yazılmalıdır. (x1+x2)/(x3+x4) vb.
o
Bir aritmetik ifade uzunsa birden fazla satıra bölünebilir.
A:=B+SIN(X)+...................................+B*C
+D*TAN(Y); gibi.
o
İki aritmetik operatör yan yana yazılamaz.
Yanlış
Doğru
--------------------
A*-B
A/-B
A*(-B)
A/(-B)
o Açılan parantez sayısı kadar kapanan parantez sayısı olmalıdır.
o Üs alma operatörü yoktur.
·
·
Karşılaştırma İfadeleri
o
Birden fazla karşılaştırma operatörü parantezler aracılığı ile kullanılabilir. –10<B<10 =>
(B>-10) AND (B<10)
o
Karşılaştırma ifadeleri mantıksal ve karşılaştırma operatörleri ile değişken ve sabitlerin uygun
birleşiminden oluşur.
İfade Örnekleri
o 7 * 10 – 5 MOD 3 * 4 + 9
70
2
8
21
62
71
o (7 * (10 – 5) MOD 3) * 4 + 9
5
35
2
8
17
o NOT (( A>B) OR K) AND L
{A=2; B=5; K=TRUE; L=FALSE;}
F
T
F
F
3.PASCAL CÜMLELERİ
Pascal cümleleri yapılarına göre basit ve blok cümleler olarak ikiye ayrılabilir.
Basit cümleler:
· Atama Cümleleri
· Giriş/Çıkış Cümleleri
· Alt Program Çağrıları
· GOTO Cümlesi
· Boş Cümle(vb.)
Blok Cümleler: Birden fazla olup alt alta bir yapı içerisinde yer alırlar.
· Sıralı Cümleler: BEGIN/END bloğu içerisinde yer alan cümlelerdir.
· Kontrol Cümleleri: IF THEN ELSE ve CASE yapıları içerisinde yer alan cümlelerdir.
· Döngü Cümleleri: FOR, WHILE veya REPEAT yapıları içerisinde yer alan cümlelerdir.
3.a.Atama Cümleleri
A := B + C
:= Operatörü atama operatörü olup sağındaki ifadenin değerini solundaki değişkene aktarır.
22
3.b.Giriş/Çıkış Cümleleri
Bir bilgisayar işlemi genel olarak üç temel bölümden oluşur bunlar giriş - işlem - çıkış'tır.
Pascal'da giriş ve çıkış işlemleri için Readkey, Read, Readln, Write ve Writeln fonksiyonları
kullanılır. Şimdi bu fonksiyonlara sırasıyla göz atalım.
3.b.1.Readkey:
Klavyeden bir karakter okumak için kullanılır.
Readkey ile okunan karakter ekranda görünmez. Fonksiyon sadece bir karakteri bir değişkenin içine
girmek için kullanılır.
Readkey fonksiyonu Crt.Tpu Pascal kütüphanesi içinde tanımlı olan bir fonksiyon olduğu için bu
fonksiyonu kullandığımızda programımıza "uses Crt;" satırını mutlaka eklemek zorundayız. Bu satır,
readkey fonksiyonunun yazdığımız program tarafından tanınmasını sağlıyor.
Örnek :
Uses Crt;
var
C: Char;
Begin
Writeln('Lutfen bir tusa basin');
C := Readkey;
Writeln(' Bastiginiz tus ', C, ');
end.
3.b.2. Read-Readln:
Pascal 'da okuma işlemi için kullanılan komutlar READ ve READLN olup genel kullanım yapısı şu şekildedir;
Read(A1,A2,A3,...,An)
Readln(A1,A2,A3,...,An)
Read ile Readln arasındaki fark: Read, okuma işlemi tamamlandıktan sonra aynı satırda kalınmasını, Readln ise
yeni bir satıra gelinmesini sağlar. Bir Pascal programı içerisinde bu iki komutun kullanımı aşağıdaki program
parçasında verilmiştir.
Var
s,a,n:real;
begin
23
Read(s,a,n)
end.
Okunacak değerlerin düzeni;
12.45 43.543 62.12
Aynı değerleri Readln ile okutturmak istersek;
Var
s,a,n:real;
begin
Readln(s,a,n)
end.
Okunacak değerlerin düzeni yukarıdaki okuma düzeni ile aynı olabileceği gibi her değer ayrı bir satırda
verilebilir, her hangi satırlarda verilebilir, örnek olarak s, a ve n değerleri aşağıdaki okuma düzeninde
okutturulmuştur.
12.45 43.543
62.12
3.b.3. Write-Writeln:
Pascal programlama dilinde yazma işlemi için WRITE ve WRITELN komutları kullanılmaktadır. Bu komutların
genel kullanım yapısı şu şekildedir
Write(A1,A2,A3,...,An)
Writeln(A1,A2,A3,...,An)
İki kullanım şekli arasındaki fark, Read ile Readln arasındaki fark gibidir. İfadeler Write ile yazdırıldıktan sonra
imleç aynı satırda bekleyecektir, Writeln ile yazdırılması durumunda ise imleç bir sonraki satıra geçecektir.
Var
s,a,n:integer;
......
24
begin
s:=3;a:=9;n:=5;
Write(s);
Write(a);
Write(n);
End.
Programın çalıştırılmasıyla elde edilen sonuç 395 olacaktır.
Aynı değişkenleri Writeln ile yazdırdığımızda;
Var
s,a,n:integer;
......
begin
s:=3;a:=9;n:=5;
Writeln(s);
Writeln(a);
Writeln(n);
End
3
9
5
elde edilecektir.
3.b.3. Pascal’da Çıktı Düzeni:
Pascal'da değişken tanımları bölümünden de hatırlayacağınız gibi sayıları ifade etmek için
real, integer gibi tip tanımları kullanıyoruz. Fakat bu tip tanımları ile tanımlanan değişkenlerin
25
içerdiği sayısal ifadeler bizim günlük hayatta kullandığımız ve ihtiyaç duyduğumuz şekilde
değil bilgisayarın saklayabileceği şekillerde bulunmaktadır. Örneğin sizin "birim" diye real
tipinde tanımladığınız bir değişkene "4.5" değerini girdiğimizi düşünelim bu değişkeni
ekranda görüntülemek istediğimizde elde edeceğimiz görüntü şu şekilde olacaktır.
4.5000000000E+00
İşte bu tür görüntüleri düzgün hale sokmak ve çıktı düzenini sağlamak için aşağıda anlatılan
yöntem kullanılır.
Tip
Yöntem
Açıklama
Integer tipindeki bir değişkenin adının arkasına n gibi sayısal bir değer yazılırsa
Integer Değişken : n bu n karakterlik bir saha içinde bu sayının sağa doğru dayalı bir şekilde
yazılmasını sağlar.
Real
Real tipinde bir değişkenin adının arkasına n ve m gibi sayısal değerler
Değişken:n:m yazılırsa bunlar n karakterlik alan içinde, ondalık kısmı noktadan sonra m tane
karakter içermek üzere sağa dayalı olarak yazdırılır.
String Değişken:n
String tipindeki bir değişkenin adının arkasına n gibi sayısal bir değer yazılırsa
bu n karakterlik bir saha içinde bu karakter dizisinin sağa doğru dayalı bir
şekilde yazılmasını sağlar.
ClrScr Fonksiyonu
O andaki ekranı temizler ve imleç ekranın sol üst köşesine konumlanır.
Clrscr fonksiyonu ekranı temizlerken o anda ekranda aktif olan zemin rengini kullanır. Yani eğer
zemin rengi o anda Textbackground(Yellow); komutu kullanılarak sarıya çevrilmişse bu satırdan sonra
kullanılacak bir clrscr; komutu ekranın tamamen sarıya dönüşmesini sağlayacaktır.
GotoXY Fonksiyonu
İmlecin ekranın istenilen bir pozisyona konumlanmasını sağlamak için kullanılır.
gotoxy(sütun,satır); şeklinde kullanılır
Clrscr ve Gotoxy fonksiyonları CRT Kutuphanesi içinde tanımlıdır. Bu komutları program içinde
kullanacağınız zaman programınızın en başına uses crt; cümlesini eklemeyi unutmayın.
Örnek:
Uses Crt;
Var
Ad : String[20];
Begin
26
ClrScr;
Write('Adiniz : '); Readln(Ad);
Gotoxy(30,12);
write(Ad);
End;
Dos text modunda ekranın 80 sütun ve 24 satırdan oluştuğunu unutmayın...
3.c.Kontrol Cümleleri
Pascalda genel olarak kullanılan karşılaştırma deyimleri şunlardır:
3.c.1.IF Deyimi
IF deyimi, bir şartın doğru veya yanlış olmasına bağlı olarak programın belirli parçalarının çalışmasını veya
çalışmamasını sağlar. IF deyimi,
IF şart cümlesi THEN Blok1;
veya
IF şart cümlesi THEN Blok1 ELSE Blok2 şeklinde kullanılabilir.
Buradaki şart cümlesi, birbirlerine mantıksal operatörler ile bağlanmış bir veya birkaç ilişkisel operasyon veya
bir tek mantıksal ifade olabilir. Aşağıdaki örnekleri inceleyelim:
IF A=B THEN ...
IF (A=B) AND (A=C) THEN ...
IF (A+1) < (B-1) THEN ...
IF (Cev In ['E' , 'e']) THEN ...
Then sözcüğünü takiben, bloklar birden fazla komut cümlesinden oluşurlar ise, bu blokların BEGIN ve END
deyimleri içine alınması zorunludur. IF deyiminin ikinci şekli yani ELSE' den sonra gelen komut veya komutlar
dizisi geçerlilik kazanmışsa, ELSE' den önce gelen komut cümlesinin yada, End deyiminin sonuna ';' işareti
konulmaz. Aşağıdaki örneklerden 1.si hatalı 2.si doğrudur.
IF A=B Then Writeln ('Eşit'); Else Writeln ('Farklı');
IF A=B Then Writeln ('Eşit') Else Writeln ('Farklı');
IF deyimi içinde kullanılan Blok1 ve Blok2 çeşitli komut cümlelerinden oluşabileceğine göre bu blokların içinde
başka IF cümleleri de yer alabilir. IF deyimlerinin bu şekilde kullanılmasına iç içe IF deyimleri adı verilir. IF
cümlesinde yer alan her iki bloğun geçerlilik kazanması söz konusu olamaz.
IF degisken_1 <kosul> degisken_2 then
begin
----islemler
27
----end;
Bu kullanım şekli IF deyiminin en yalın şekillerinden biridir. Degisken_1 ile Degisken_2 arasındaki koşulun
durumuna göre THEN ifadesinden sonra gelen işlemler yapılır.
Örnek: Aşağıda verilen kodlarına göre daire, üçgen ve dikdörtgenin çevresini hesaplayan Pascal programını
yazınız.
1. Üçgen
2. Dikdörtgen
3. Daire
Program Cevre_Hesabi;
uses crt; {Windows için Wincrt}
var
sekil:byte;
uzun1,uzun2,uzun3:real;
cevre:real;
Begin
Writeln('1. Üçgen');
Writeln('2. Dikdörtgen');
Writeln('3. Daire');
Write('Şeklin Kodunu Giriniz');
Readln(Sekil);
If Sekil=1 then
Begin
Write('Uçgenin 1. Kenar Uzunluğunu giriniz :');readln(Uzun1);
Write('Uçgenin 2. Kenar Uzunluğunu giriniz :');readln(Uzun2);
Write('Uçgenin 3. Kenar Uzunluğunu giriniz :');readln(Uzun3);
Cevre:=uzun1+uzun2+uzun3;
28
end;
If Sekil=2 then
Begin
Write('Dikdörtgenin Kısa Kenar Uzunluğunu giriniz:') ;
readln(Uzun1);
Write('Dikdörtgenin Uzun Kenar Uzunluğunu giriniz :');
readln(Uzun2);
Cevre:=2*(uzun1+uzun2);
End;
If Sekil=3 then
Begin
Write('Dairenin yarıçapını giriniz :');readln(Uzun1);
Cevre:=2*pi*Uzun1;
End;
Writeln('Seçilen Nesnenin Çevre Uzunluğu =',Cevre:8:2);
End.
Örnek : Aşağıda verilen kodlara göre birim dönüşümlerini veren Pascal programı yazınız.
Fahrenhayt 'tan (F) Santigrad 'a (C) : C=5/9*(F-32)
İnç 'ten (I) Santimetre 'ye (Cm) : Cm=2.54*I
Mil 'den (M) Kilometre 'ye (Km) : Km=1.6*M
Pound 'dan (P) Kilogram 'a (Kg) : Kg=0.45*P
Program metrik_cevrimler;
uses crt; {Windows için Wincrt}
var kod:byte;
F,C,I,Cm,M,Km,P,Kg:real;
Begin
29
Writeln('Çevrim Kodları');
Writeln('1. Fahrenhayt -> Santigrad');
Writeln('2. İnç -> Santimetre ');
Writeln('3. Mil ->Kilometre ');
Writeln('4. Pound -> Kilogram ');
Write('Çevrim Kodunu Giriniz ='); Readln(Kod);
If Kod=1 then begin
Write('Fahrenhayt Değerini Giriniz ='); Readln(F);
C:=5*(F-32)/9;
Writeln('Santgrad Değeri =',C:7:2,' °');
end;
If Kod=2 then
Begin
Write('İnç Değerini Giriniz ='); Readln(I);
Cm:=2.54*I;
Writeln('Santimetre Değeri =',Cm:7:2);
end;
If Kod=3 then
Begin
Write('Mil Değerini Giriniz ='); Readln(M);
Km:=1.6*M;
Writeln('Kilometre Değeri =',Km:7:2);
end;
If Kod=4 then
Begin
Write('Pound Değerini Giriniz ='); Readln(P);
Kg:=0.45*P;
30
Writeln('Kilogram Değeri =',Kg:7:2);
End;
End.
3.c.2.If Then Else Yapısı
IF degisken_1 <kosul> degisken_2 then
begin
----islemler
----end
ELSE
begin
----islemler
----end;
Bu yapı kullanıldığında, Degisken_1 ile Degisken_2 belirtilen koşulu karşıladıkları zaman THEN ifadesinden
sonra gelen işlemler, aksi halde ELSE ifadesinden sonra tanımlanan işlemler yaptırılır.
IF degisken_1 <kosul> degisken_2 then
begin
islemler1;
end
else
if degisken_3 <kosul> degisken4 then
begin
islemler2;
end
else
31
if degisken_5 <kosul> degisken6 then
begin
islemler3;
end;
Örnek:Aşağıdaki program klavyeden girilen yılın kaç gün olduğunu vermektedir. Programı inceleyiniz.
program deneme;
uses crt; {Windows için Wincrt}
var
yil:integer;
begin
clrscr;
Write('Gun Sayisini ogrenmek istediginiz yili giriniz :');
readln(yil);
if (yil mod 4 )=0 then
begin
Writeln('Yil 366 gun');
End
Else
Begin
Writeln ('Yil 365 gun');
end;
readln;
end.
3.c.3.Case ... Of
Bir değerin birden fazla değer ile karşılaştırmasını yapan ve bir eşitliğin bulunması halinde belli program
parçalarının çalıştırılmasını sağlayan CASE deyiminin genel formu aşağıda verilmiştir.
CASE Kontrol Değişkeni OF
Etiket1 : Blok1 ;
32
Etiket2 : Blok2 ;.
Etiketn : Blokn ;
ELSE BLOK;
END;
Kontrol değişkeni real haricindeki standart tiplerden birine sahip olan bir değişkendir. CASE deyimi içindeki
etiketler LABEL olarak tanımlananlardan farklıdır. Bunlar sabit değerler olup, kontrol değişkeni ile aynı tipe
sahiptir. Etiketi takip eden bloklar ise PASCAL komut cümlelerinden meydana gelir. Komut cümleleri birden
fazla ise BEGIN END deyimleri arasına yazılması zorunludur. Etiketlerin dışında yazılan ELSE deyimi ve bunu
takip eden blok seçimliktir
Örnek : Aşağıda kişinin yaşı girildiğinde, yaşına uygun mesajlar veren bir Pascal programı verilmiştir
Program Yasdilim;
Uses wincrt; {Dos için CRT}
Var yas:integer;
Begin
Clrscr;
Write('Yaşınızı Giriniz :');
ReadLn(YAS);
CASE yas OF
0..5:Writeln('Yaşınız 0-5 arasında');
5..15:Writeln('Yaşınız 5-15 arasında');
15..35:Writeln('Yaşınız 15-35 arasında');
35..50:Writeln('Yaşınız 35-50 arasında');
50..85:Writeln('Yaşınız 50-85 arasında');
else Writeln('Çok Yaşayın');
end;
Readln;
End.
Örnek : Kare, dikdörgen, üçgen ve daire alan hesabı yapan bir Pascal programı hazırlanacaktır. Programda alanı
hesaplanacak nesneyi belirttikten sonra ilgili alanın hesaplanabilmesi için CASE...OF yapısı kullanılacaktır.
33
program Sekillerin_alan_hesabi;
uses Crt; {Windows için Wincrt}
var Ch : char;
uzun,gen,yuk,Taban,ycap: real;
Alan_Kare,Alan_Dortgen,Alan_Ucgen,Alan_Daire:real;
i:byte;
begin (* Ana program *)
Writeln;
Writeln('Lütfen Alan Hesabı Yapacağınız Nesneyi seçiniz :');
Writeln;
Writeln('[K]are');
Writeln('[D]ikdörtgen');
Writeln('[U]çgen');
Writeln('d[A]ire');
Writeln('[C]ıkış');
Write('Alan hesabı yapılacak nesne (K/D/U/A) ?=');
Readln(Ch);
case UpCase(Ch) of
'K' : begin
Write('Karenin kenar uzunluğu =');
Readln(uzun);
Alan_Kare:= uzun*uzun;
Writeln('Alan ',Alan_kare:12:4);
end;
'D' : begin
Write('Dörtgenin Genişliği = ');
Readln(gen);
34
Write('Dörtgenin Yüksekliği =');
Readln(yuk);
Alan_Dortgen:=gen*yuk;
Writeln(' Dörtgenin Alanı= ',Alan_Dortgen:12:4);
end;
'U' : begin
Write('Üçgenin Taban Uzunluğu =');
Readln(Taban);
Write('Üçgenin Yüksekliği =');
Read(yuk);
Alan_Ucgen:=taban*yuk/2;
Writeln('Üçgenin Alanı = ',Alan_Ucgen:12:3);
end;
'A' : begin
Write('Dairenin Çapı =');
Readln(Ycap);
Alan_Daire:= sqr(ycap)*Pi;
Writeln('Dairenin Çapı =',Alan_Daire:12:3);
end;
'C' : begin Writeln('Bitti');exit; end;
else Writeln(' Tanımsız giriş');
end;
end. (* Ana program sonu *)
3.d.Döngü Cümleleri
3.d.1.For Deyimi
For deyimi, bir program parçasının belirlenen sayıda üst üste çalıştırılması için kullanılır. For deyiminin genel
kullanım şekilleri aşağıda verilmiştir.
35
FOR Kontrol Değişkeni :=Başlangıç_Değeri TO Son_değer DO
Begin
İşlemler
End;
Bu kullanım şeklinde başlangıç değeri bitiş değerinden küçük olmak zorundadır. TO ifadesiyle başlangıçtan
bitişe kadar artarak tekrar yapılacağını, DO ifadesi de tanımlanan işlemlerin tekrarlanacağını bildirir.
FOR Kontrol Değişkeni :=Başlangıç_Değeri DOWNTO Son_değer DO
Begin
İşlemler
End;
For deyiminin bu kullanım şeklinde başlangıç değeri bitiş değerinden daima büyük olup DOWNTO
ifadesi de döngü değişkeninin tekrarlama işleminde azalacağını belirtir. DO ifadesi ise belirtilen
işlemlerin döngü sayısınca tekrarlanacağını bildirir.
Turbo Pascal dilinde diğer programlama dillerinden farklı olarak başlangıç değerinden son değere
artışlar/azalmalar birer birer olmaktadır. Aşağıdaki örnek programları inceleyiniz.
Örnek:Aşağıdaki örnek Program; 1'den 8'e kadar artan ve 9'dan 3'e kadar birer birer azalan iç içe for
do döngülerinin kullanımını göstermektedir.
Program icice_for_ornek;
Uses crt; {Windows için Wincrt}
Var
i,j:byte;
Begin
For i:=1 to 8 do
Begin
for j:=9 downto 3 do
Begin
36
Write(i*j:6);
end;
Writeln;
end;
Readln;
End.
Örnek: 'A' dan 'Z' ye kadar büyük harfleri ekrana yazdıran Pascal programı.
Program Odev;
var ch:=Char;
begin
Writeln('BÜYÜK HARFLER');
for ch:='A' to 'Z' DO
Write(Ch,' ');
end.
Örnek. Klavyeden girilen bir ifadeyi tersten yazdıran program.
program terstenyazma;
uses crt; {Windows için Wincrt}
var
mesaj:string;
i,l:byte;
begin
Write('Bir mesaj yazınız');
Readln(mesaj);
37
l:=length(mesaj);
Writeln(L);
for i:=L downto 1 do
Write(Copy(mesaj,i,1));
end.
3.d.2. Repeat Deyimi
Bir program bloğunun belli bir şart sağlanıncaya kadar üst üste çalıştırılmasını sağlayan REPEAT
deyiminin genel formu aşağıdaki şekildedir.
Repeat
.
Program Satırları
.
Until (Boolean Şartı)
Burada repeat, tekrar etme anlamında olup, tekrar etme işi UNTIL deyimindeki boolean ifadesi
sağlanıncaya kadar devam eder. Bu deyim program satırları bölümüne herhangi bir şey yazılmaksızın
kullanılabilir.
Bu döngünün en büyük avantajı belirli bir sayı ile sınırlandırılmamış olmasıdır. Boolean ifadesindeki
şart sağlanıncaya kadar işlemlere devam edilmektedir.
Dikkat edilirse şart cümlesinin aldığı değer ne olursa olsun program bloğu bir kez çalışmaktadır.
Örnek : Aşağıda verilen Pascal programı birden verilen sayıya kadar olan sayıların toplamını
hesaplamaktadır.
Program ornek_repeat;
uses wincrt;
var
sayi:integer;
38
top:real;
begin
clrscr;
top:=0;
Write(' Sayıyı Giriniz =');
Readln(sayi);
Repeat
top:=top+sayi
sayi=sayi-1
Until (Sayi=0);
Writeln(sayi,' sayısına kadar olan sayıların toplamı=’,top:6:3);
end.
3.d.3.While Deyimi
Bir program bloğunun belli bir şart sağlandığı sürece üst üste icrasını sağlayan WHILE deyiminin
genel yazılış şekli aşağıdadır.
While <şart cümlesi> Do BLOK
Do kelimesini takip eden blok WHILE deyimi tarafından döngüye sokulacak komut cümlelerini
kapsar. Komut cümlesi sayısı birden fazla ise, bu bloğun BEGIN...END deyimleri arasına alınması
zorunludur.
WHILE ile REPEAT arasındaki fark; Repeat döngüsü şart cümlesi yanlış olduğu sürece, While
döngüsü ise şart cümlesi doğru olduğu sürece devam etmesidir.
Örnek : Repeat -Until ile yapılan örnek programı WHILE-DO ile yapalım.
program ornek_While;
uses wincrt;
var
sayi:integer;
top:real;
39
begin
clrscr;
top:=0;
Write(' Sayıyı Giriniz =');
Readln(sayi);
While Sayi>0 do
begin
top:=top+sayi
sayi=sayi-1
end;
Writeln(sayi,' sayısına kadar olan sayıların toplamı=’,top:6:3);
end
4.YAPISAL PROGRAMLAMA DİLİNİN DİĞER ELEMANLARI
4.a. Dosya İşlemleri
Ascii içerikli dosyalar okunabilir karakterler içeren dosyalar olup, TEXT veri tipi ile
tanımlanır.
VAR
EmpFile:TEXT
·
Standart dosyalar da dahil olmak üzere bir pascal programında kullanılan tüm dosyalar
program başlığında yer almalıdır.
PROGRAM PayRoll(INPUT,OUTPUT,EmpFile)
·
Dosya kullanılmadan önce ASSIGN prosedürü ile dosya değişkeni disk üzerindeki
fiziksel dosya ismine bağlanır. ASSIGN(dosya değişkeni, dosya ismi).
·
Eğer dosyadan okuma yapılacaksa, dosya program içinde RESET ile açılır.
RESET(dosya değişkeni)
Örnek:
ASSIGN(EmpFile,’Employee.dat’)
RESET(EmpFile)
40
·
Okunmak için açılan dosya içindeki değerler aşağıdaki komutlar aracılığı ile ilgili
değişkenlere okunur.
READ(dosya değişkeni, değişken listesi)
READLN(dosya değişkeni, değişken listesi)
·
Dosya sonu EOF fonksiyonu ile kontrol edilir. Dosya sonuna gelinmişse fonksiyon
TRUE değeri döndürür.
Örnek: Aşağıdaki program parçası bir dosyanın içeriğini ekrana kopyalar.
WHILE NOT EOF(EmpFile) DO
BEGIN
READLN(EmpFile,EmpName,EmpNumber);
WRITELN(EmpName,EmpNumber);
END;
·
Eğer yeni bir dosyaya değerler yazdırılacaksa , dosya program içinde REWRITE
komutu ile açılır. Bu komut ile açılan dosya diskte mevcut ise içeriği silinir.
REWRITE(dosya değişkeni)
·
Eğer var olan bir dosyanın içeriği korunarak sonuna yeni değerler yazdırılacaksa ,
dosya program içinde APPEND komutu ile açılır.
APPEND(dosya değişkeni)
·
Yazmak için açılan dosyaya, yeni değerler aşağıdaki komutlar aracılığı ile yazılır.
WRITE(dosya değişkeni, değişken listesi)
WRITELN(dosya değişkeni, değişken listesi)
· WRITELN(dosya değişkeni) ile dosyaya boş bir satır eklenir.
· Okuma veya yazma işlemleri bitince dosya CLOSE komutu ile kapatılır.
CLOSE(dosya değişkeni)
Örnek: Çalışanların numaraları ve saatlik ücretleri EmpFile7.Dat içerisinde,
verilmiştir. Çalışanların numaralarını ve saatlik ücretlerini 1.05 katsayısı kadar
arttırarak EmpFile8.dat içerisine yazdırın.
EmpFile7.Dat (Eski dosya)
3126
3127
3128
EmpFile8.Dat(Yeni dosya)
7.50
8.75
9.35
3123
3124
3125
7.88
9.19
9,82
PROGRAM UcretYenile(EmpFile,NewEmpFile,Output,Input);
CONST
EmpFileName=’c:\empfile7.dat’
NewEmpFileName=’c:\empfile8.dat’
Increase=1.05
41
VAR
EmpFile,NewEmpFile:Text;
EmpNum:INTEGER;
HourlyRate,NewHourlyRate:REAL;
BEGIN
ASSIGN(EmpFile,EmpFileName);
ASSIGN(NewEmpFile,NewEmpFileName);
RESET(EmpFile);
REWRITE(NewEmpFile);
WHILE NOT EOF(EmpFile) DO
BEGIN
READLN(EmpFile,EmpNum,HourlyRate);
NewHouryRate=HourlyRate*Increase;
WRITELN(NewEmpFile,EmpNum,NewHourlyRate);
END;
CLOSE(EmpFile);
CLOSE(NewEmpFile);
END.{UcretYenile)
4.b. Alt Programlar
Yapısal programlamanın en önemli yaklaşımlarından biri, temel uygulamayı bir takım
parçalara bölerek gerçekleştirmektir. Pascal'da bu parçalar altyordam (procedure) veya
fonksiyon (function) olarak kodlanır. Yapısal programlamanın temel tercih nedeni, program
modüllerinin bağımsız olarak geliştirilmeleri ve çalışıp çalışmadığının kolaylıkla
anlaşılabilmesidir.
Alt programlar genellikle tekrar edilen işlemleri kolaylıkla yapabilmek için yazılırlar. Tekrar
edilen işleme örnek olarak, programımız içinde birden fazla yerde faktöryel hesabı yapmamız
gerekiyor ise bunu bir alt program ile hesaplatmamız halinde aynı işleme sahip program
satırlarının tekrarı önlenecek, programın takibi kolaylaşacak ve daha verimli hafıza kullanımı
söz konusu olacaktır.
Bilgisayar dillerinin tamamında bulunan alt program yapısı PASCAL Programlama dilinde
PROCEDURE ve FUNCTION türü alt programlar olmak üzere iki ayrı türdedir. Bu iki ayrı
tür alt programlar birbirlerine benzer özellikler taşımalarına rağmen yapısallık ve icra
açısından bazı farklılıklar içerirler.
Alt programlarda yapılacak işlemler, ana program içinde nerede gerekiyor ise o noktada ilgili
işlemleri yapan alt programın adı yazılarak devreye sokulur.
42
Alt Programlar Hakkında Genel Bilgiler
·
·
·
·
·
Her alt programın bir başlığı, bir tanım bloğu, bir de icra bloğu vardır.
Ana programlar PROGRAM deyimi, prosedür alt programlar PROCEDURE,
fonksiyon alt programlar FUNCTION deyimi ile başlar.
Alt program adının hemen yanında verilen parametreler değer transferi işlemleri için
kullanılırlar. Bir alt programa değer transferi yapılarak, her bir çalışmada verilen
değişik değerlere bağlı olarak değişik sonuçlar üretmek mümkündür.
Alt program isminin yanına parametre yazmak seçime bağlıdır. Eğer parametre
yazılıyor ise bunlar procedure isminin yanına parantez içinde yazılırlar.
Pascal programlama dilinde formal ve gerçek parametreler olmak üzere iki tür
parametre tanımlanabilir. Formal parametreler, programın tamamına ait olmayıp
sadece değer transferi için kullanıldıklarından geçici parametreler olarak
isimlendirilebilirler. Yani bu parametreler ile sadece alt program içinde çalışılabilir.
Ana programda, alt programın çalıştırılması için yazılması gereken alt programın
yanında yazılan parametreler ise gerçek parametre adını alırlar. Burada gerçek ve
formal parametrelerin sıralanış, sayı ve tip bakımından aynı olması gerekir.
4.b.1.Function Alt Programları
Pascal’da altprogramlar başlığı altındaki yapısal modüllerden bir diğeri de fonksiyonlardır
(function). Function ve Procedure arasındaki farkı anlayabilmek için procedure ve function
olarak ayrı ayrı yazılmış bir uygulama üzerinde duralım.
PROCEDURE Toplam(X,Y:integer; var Z:integer);
begin
Z:=X+Y;
end;
FUNCTION Toplam (X,Y:integer):Integer;
begin
TOPLAM:=X+Y;
end;
Örnekte toplam isimli alt yordam (Procedure) X ve Y tamsayılarının toplamını referans
parametresi türündeki Z değişkeni aracılığı ile getirir. Procedure durumunda geri
döndürülecek değer, VAR ile tanımlanmış bir değişkene atanmaktadır. Fonksiyon olarak
tanımlanan TOPLAM modülü ise toplamı kendisi getirmektedir. Fonksiyon sona
erdirilmeden önce geri döndürülecek, fonksiyonun ismine atanmaktadır. Toplam isimli
fonksiyon, integer tiptedir.
43
Procedure olarak yazılan TOPLAM alt programı ;
Toplam (A;B;T);
(Procedure)
şeklinde çağırılırken,
function şeklinde geliştirilmiş Toplam alt programı ;
T:=Toplam(A;B);
(Function)
komutuyla çağırılır.
4.b.2. Procedure Alt Programları
Bir pascal programında Procedure alt programlara eri şim ve procedure alt programın program içindeki yeri aşağıdaki genel gösterim
şeklinde verilmiştir.
Program ad_;
procedure Altprogram1;
begin
işlem blokları;
end;
procedure Altprogram2;
begin
işlem blokları;
end;
(* ANA PROGRAM*)
BEGIN
işlemler;
Altprogram1;
Altprogram2;
........
işlemler;
........
44
Altprogram1 ;
........
END.
Alt programlarda, ana programlarda olduğu gibi sabit, değişken ve çeşitli tip tanımlamaları
yapılabilir. Yapılan bu tanımlamalar, alt program aktif olduğu sürece geçerli olup alt
programın çalışması sona erdiğinde alt programda tanımlanan değişken, sabit ve tipler
bellekten silinir.
Procedure işlem blokları iki şekilde kullanılır,
a. Parametresiz Prosedürler
b. Parametreli Prosedürler
4.b.1.a.Parametreli Prosedürler
Ana program ve alt programlarda tanımlanan değişkenlerin farklı olması durumunda tercih
edilirler. Ana programda tanımlanan değişken değerlerinin işleme alınmaları, alt programda
tanımlanan değişkenlere aktarılarak yapılır.
Parametreli prosedürlerde de tek yönlü ve çift yönlü olmak üzere iki ayr ı tür değer transferi
söz konusudur. Eğer procedure ismini takiben parametrelerin tanım cümlesi VAR ile
başlıyorsa parametreler arasında çift yönlü değer transferi yapılacak demektir. Yani ana
programda kullanılan değişkenler alt programa aktarılacak ve alt programın çalışması sona
erdiğinde sonuç değerler ana programa transfer edilir.
Tek yönlü değer transferinde ise parametrelerin tanım cümlesi VAR ile başlamaz, değer
transferi ana programdan alt programa olur ve alt programın icrası sonunda ortaya çıkan
sonuçlar ana programa transfer edilmez. Her iki tür için yaz ım örnekleri aşağıda verilmiştir.
Tek yönlü Transfer :Procedure Altyordam(X;Y;Z:integer;KAD:real);
Çift yönlü Transfer :Procedure Altyordam(VAR X;Y;Z:integer;VAR KAD:real);
Veri transferinde String değişken veya bir dizi değişken formal parametre olarak
tanımlanamaz. String ve dizi değişkenler formal parametre olarak kullanılacaksa, tip
bildirisinin özel bir tip ismi olarak verilmesi gerekir. Aşağıda verilen örnekler sözü edilen
kurala göre hatalı yazılmışlardır.
45
Procedure Altyordam(A:Array1..100 of real);
Procedure Altyordam2(S:String200);
Uygun tanımlamalar yapmak için Type bölümünden yararlanılmalıdır. Aşağıda verilen örnek
tanımlar özel tip isimler kullanıldığı için geçerlidir.
Type
Oz=Array1..100 of real;
sozcuk=String200;
Procedure Altyordam(A:Oz);
Procedure Altyordam2(S:Sozcuk);
Ana programdan alt programa transfer sırasında tanım bloklarında kullanılan parametrelerin
tipleri aynı olmak zorundadır. Aksi takdirde 'Tip Uyuşmazlığı' hatası meydana gelecektir.
Aşağıdaki örnek programları inceleyiniz.
program paramli1;
uses crt; {Windows için Wincrt}
var
a,b,t:integer;
procedure toplam(x,y:integer);
begin
t:=x+y;
end;
begin
clrscr;
46
readln(a);
readln(b);
Toplam (a,b);
Writeln(t);
end.
program paramli2;
uses crt; {Windows için Wincrt}
var
a,b,t:integer;
procedure toplam(x,y:integer;var z:integer);
begin
z:=x+y;
end;
begin
clrscr;
readln(a);
readln(b);
47
Toplam (a,b,t);
Writeln(t);
end.
Yukarıdaki programda X ve Y değerlerinin toplamları Writeln(t); program satırında ekrana yazdırılmaktadır.
Aynı programda toplamı yazdırmak istenilen parametre değiştirildiğinde program hata verecektir. Aşağıdaki
program derlendiği zaman çalışmayacak ve 3 nolu hata meydana gelecektedir. Programı yazarak hatanın
nedenini anlamaya çalışınız.
program hatali_paramli;
uses crt; {Windows için Wincrt}
var
a,b,t:integer;
procedure toplam(x,y:integer;var z:integer);
begin
z:=x+y;
end;
begin
clrscr;
readln(a);
readln(b);
Toplam (a,b,t);
Writeln(z);
end.
Örnek : Aşağıdaki örnek programda dizgi isimli tek boyutlu bir dizi oluşturulmuş ve bu dizinin elemanları sıra
ile 1-100 arasındadır. Bu dizi değer aldıkça altprograma değer transfer etmekte ve alt programda bu dizinin
değerleri random komutu ile rastgele sayılardan oluşan yeni bir diziye aktarılmakta ve ana programa geri
dönmektedir.
Program degerparametresi;
uses crt; {Windows için Wincrt}
type DiziTipi=Array[1..100] of integer;
var
48
Dizgi:DiziTipi;
Yenidizi1,Yenidizi:DiziTipi;
K:word;
PROCEDURE Ornekleme(Pardizi:DiziTipi;var YeniDizi:DiziTipi);
begin
Yenidizi[k]:=Random(Pardizi[k])
end;
begin
for k:=1 to 100 do
begin
Dizgi[k]:=K;
Ornekleme(Dizgi,YeniDizi1);
Writeln(Dizgi[k],'
',YeniDizi1[k]);
end;
While not keypressed do
end.
4.b.1.b.Parametresiz Prosedürler
Bu tür alt programlarda; alt program içinde kullanılan değişkenler ana program içinde
kullanılan değişkenler ile aynıdır. Bu nedenle ana program ile alt program arasında veri
transferi yapılmasına gerek yoktur. Aşağıdaki örnek programlar Parametresiz Prosedür
kullanımını açıklamaktadır.
49
program faktoriyel_hesabi;
uses crt; {Windows için Wincrt}
var fakt:longint;
n,i:integer;
procedure islem1;
begin
fakt:=1;
for i:=1 to n do
begin
fakt:=fakt*i;
end;
end;
begin
clrscr;
Write('N sayısını giriniz =');
Readln(N);
islem1;
Writeln('N sayısının Faktöriyeli =',fakt:10);
repeat until keypressed;
end.
50
4.b.3. Aidiyet Kuralları(Scope Rules)
· Bir sabit veya değşken tanımlandığı proram birimi içerisinde geçerlidir.
· Bir alt yordam (procedure veya function) içerisinde tanımlanan değişkene alt program
dışında erişilemez.
· Ana programın VAR bloğu içerisinde tanımlanan değişkenler(aynı isimli birdeğişken
alt yordam içerisinde tanımlanmamışsa) programın her yerinden erişilebileceği için
genel(global) değişkenlerdir.
· Bir alt yordam içerisinde tanımlanan değişkene, bu alt program içerisinde tanımlanan
diğer alt programlar içerisinden erişilebilir.
· Eğer SubA alt yordamı SubB alt programından önce tanımlanmışsa SubB alt
yordamını çağırabilir.
PROGRAM SCOPE;
PROCEDURE A;
PROCEDURE B;
PROCEDURE C;
.......
.......
.......
END; {C}
PROCEDURE D;
.......
.......
.......
END; {D}
END; {B}
END; {A}
END. {Scope}
Aşağıdakiler İçinde Tanımlananlar
Main
A
B
C
D
Aşağıdakiler İçin Geneldir
Main, A, B, C, D
B, C, D
C, D
C
D
51
Aşağıdakiler
A
B
C
D
Aşağıdakilerce Çağrılabilir
Main, B, C, D
A, C, D
B, D
B
Aşağıdakiler
Main
A
B
C
D
Aşağıdakileri Çağırabilir
A
B
C, D
B, A
C, B, A
4.c. Sıralı Veri Tipleri
Ondalık sayılar dışında sayılabilir(kesikli) verilerin oluşturduğu bir topluluktur. İlk ve son
eleman hariç, her elemanın Bir önceki ve bir sonraki elemanı mevcuttur. Bu veri tipleri ile
aşağıdaki fonksiyonlar kullanılırlar.
PRED : Bir önceki elemanı verir.
SUCC : Bir sonraki elemanı verir.
ORD : Elemanın değerini(sırasını) verir.
Örnekler:
PRED(‘B’) = ‘A’
PRED(-3) = -4
PRED(TRUE) = FALSE
PRED(FALSE) = Tanımsız(Undefined)
SUCC(‘T’) = ‘U’
SUCC (99) = 100
SUCC (FALSE) = TRUE
SUCC (TRUE) = Tanımsız(Undefined)
Kullanıcı tarafından tanımlanan sıralı veri tipleri:
· Subrange
· Enumarated
4.c.1. Subrange
Sıralı verilere ait bir alt kümedir.
Örnek:
VAR
NUM : 1..10;
KAR : ‘A’..’Z’
52
4.c.2. Enumarated Sıralı Veri Tipi
Kullanıcı tanımlı sıralı veri tipidir. TYPE bölümünde tanımlanır.
· Bu tipe ait değerler, kapalı parantez içinde birbirinden virgül ile ayrılmış farklı
isimlerden oluşur.
·
Bu tipe ait değişkenlere PRED, SUCC, ORD fonksiyonları uygulanabilir.
·
Pascal tarafından veya daha önce kullanıcı tarafından tip tanımında kullanılan
sözcükler listede yer alamaz.
·
Bu tipe ait değerler giriş/çıkış işlemlerinde kullanılamaz..
·
Bu tip alt programların başlığında yer alamaz.
Örnek:
TYPE
Days = (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
VAR
Day : Days;
FOR Day := Mon TO Wed DO
Hata verir.
Writeln(Day);
FOR Day := Mon TO Wed DO
CASE Day OF
Mon : WRITELN(‘MONDAY’);
.......
.......
Yazdırma işlemleri bu
şekilde yapılabilir.
.......
.......
Sun : WRITELN(‘SUNDAY’);
END;
4.d. DİZİLER
Hangi programlama dili kullanılırsa kullanılsın, değişken tanımlamanın mantığı aynıdır.
Saklanacak bilginin tipine göre bir tip seçilir, buna bir isim verilir ve hafızada bu değişken
için bir bellek ayrılır. Her değişken için durum aynıdır. Pascal programlama dilinde bu işlemi
53
VAR bölümü içinde yaparız. Eğer aynı özelliklere sahip birden fazla değişkene ihtiyaç
duyulursa dizileri kullanırız. Diziler ile aynı tipte birbirleri ile ilgili verileri toplu olarak
tanımlayabiliriz.
VAR
DiziAdı : ARRAY [AltSınır..UstSınır] OF VeriTipi;
Örnek: Klavyeden 10 notun giridiği ve ortalamasının ekrana yazıldığı bir program
yazın.(Daha sonra bu programı ortalamanın üzerindeki notları verecek şekilde genişletin.)
PROGRAM ORTALAMA (Input,Output);
VAR
Indis : INTEGER;
Notlar : ARRAY [1..10] OF INTEGER;
Toplam : INTEGER;
Ortalama : REAL;
BEGIN
FOR Indis := 1 TO 10 DO
BEGIN
WRITE(Indis,’NCI NOT=’);
READLN(Notlar[Indis]);
END;
Toplam := 0;
FOR Indis := 1 TO 10 DO
Toplam := Toplam + Notlar[Indis];
Ortalama := Toplam/10;
WRITELN(‘ORTALAMA=’,Ortalama);
END.
·
·
Diziler alt yordam tanımında parametre olarak kullanılacaksa TYPE bölümünde bu
dizilere ait tip tanımlamaları yapılmalıdır.
Birden fazla boyutlu dizi(çok boyutlu dizi), her bir boyutu birbirinden virgüller ile
ayrılarak alt sınırı ve üst sınırı belirtilerek tanımlanır.
Örnek:
VAR
B: ARRAY [1..3, 1..4] OF INTEGER;
4.e. String İşlemleri
Stringler Turbo Pascal’da aşağıdaki gibi tanımlanır.
Değişken : STRING[uzunluk];
Örnek :
54
TYPE
StringArray = STRING[8];
VAR
P:StringArray;
·
·
·
·
·
·
Sadece STRING (TurboPascal) standart veri tipi ile tanımlanan değişkenler 255 karakter
içerir.
String değişkenine atanan değer string değişkeninin uzunluğundan büyükse soldan
itibaren uzunluğu kadar değer atanır.
String değerler karşılaştırma operatörleri ile birbirleri ile karşılaştırılabilir. Karşılaştırmada
ascii tablosu karakter indeksi göz önüne alınır.
String değişkenleri
o READ/WRITE
o READLN/WRITELN
giriş/çıkış cümlelerinde kullanılabilir.
VAR
Line : STRING[20];
Şeklinde tanımlanmış string değişkenin;
o Line[0] hücresinde stringin o andaki uzunluğu
o Line[1] hücresinde stringin ilk karakter değeri
o Line[uzunluk] hücresinde stringin son karakter değeri tutulur.
Stringler alt yordam tanımında parametre olarak kullanılacaksa TYPE bölümünde bu
stringlere ait tip tanımlamaları yapılmalıdır.
TYPE
String20 : STRING[20];
VAR
Line : String20;
.......
.......
.......
PROCEDURE P(X:String20);
......
......
......
......
......
·
+ operatörü ile iki string birleştirilebilir.
Name1 := ‘TURBO’;
Name2 := ‘PASCAL’
Name := Name1 + Name2;
55
4.e.1. String Alt Yordamları
·
LENGTH(String) : Stringin uzunluğunu verir.
LENGTH(S)
·
CONCAT(Str1,Str2,...) : Stringleri birleştirir.
·
COPY (Value,Başlangıç,Uzunluk) : Value stringi içinden başlangıç indeksinden
başalayarak, uzunluk kadar alt stringi başka bir stringe kopyalar.
Lastname := COPY(‘ John Smith’,6,5);
·
POS(İfade,String) : İfadenin String içinde nerede başladığını verir.
Location := Pos(‘York’, ‘NewYork’);
·
INSERT(Kaynak, Hedef, İndeks) : Kaynak içerisindeki stringi, hedef stringinin içine
indekste belirtilen yerden itibaren yerleştirir.
·
DELETE( Hedef, İndeks,Uzunluk) : Hedef stringi içinden indeks sayısının belirttiği
karakterden başlayarak uzunluk kadar alt string silinir.
Örnek:
City := ‘NewYork City’;
DELETE(City,8,5);
·
STR(Sayı, Sonuç) : Sayı içerisindeki sayısal değeri strnge dönüştürerek sonuç string
değişkenine aktarır.
Örnek:
STR(‘123’,Numstring);
·
VAL(String, Sayı, HataKodu) : String içinde ifadeyi sayısal değere dönüştürerek sayı
değişkenine aktarır, eğer bir hata oluşursa HataKodu değişkeninden öğrenebilirsiniz.
o Eğer string değeri sayısal değere dönüştürülebiliyorsa, HataKodu değişkeni 0
değeri alır.
56
o Eğer string değeri sayısal değere dönüştürülemiyorsa, string içinde
dönüştürülemiyen karakterin yeri HataKodu değişkenine aktarılır.
Örnek :
VAL(‘123a’, Sayı, HataKodu) işletildiğinde HataKodu 4 değerini alır.
4.f. Kayıtlar(Records)
Birden fazla farklı tipte değişkenin anlamlı bir bütün oluşturduğu durumlarda yeni bir
yapıya ihtiyaç duyarız. Pascal programlama dili bu ihtiyacı Record yapısı ile karşılar.
·
Record Tipi TYBE bölümünde tanımlanır.
TYPE
EmpRecord = RECORD
Name : STRING[15];
Age : INTEGER;
Dep : INTEGER;
HRate : REAL;
END;
·
VAR bölümünde tanımlanan record tipinde olan değişkenler tanımlanır.
VAR
Person : Emp;
·
Record’ı bir paket(kayıt), içerdiği değişkenleri ise bir eleman(alan) olarak görebiliriz.
·
Bir kayıta atama yapıldığında her bir alanına ayrı ayrı atama yapılır.
Person.Name := ‘Ali UZUN’
Person.Age := 35;
Person.Dep := 2;
Person.Hrate := 2.5;
57
·
Kayıtlara değer okuma, kayıt değerlerini yazdırmak istendiğinde, her bir alan ayrı ayrı
giriş/çıkış işlemlerine tabi tutulurlar.
READLN(Person.Name,Person.Age,Person.Dep,Person.Hrate);
WRİTELN (Person.Name,Person.Age,Person.Dep,Person.Hrate);
·
İç içe kayıt tanımları yapılabilir.
TYPE
EmpRec = RECORD
Name : STRING[15];
Age : INTEGER;
Dep : INTEGER;
HRate : REAL;
Birth = RECORD;
Month : STRING[8];
Day : 1..31;
Year : 1900..2100;
END;
END;
Veya
TYPE
BirthDay = RECORD;
Month : STRING[8];
Day : 1..31;
Year : 1900..2100;
END;
58
EmpRec = RECORD
Name : STRING[15];
Age : INTEGER;
Dep : INTEGER;
HRate : REAL;
Birth :BirthDay;
END;
·
Aynı alan isimleri farklı veya iç içe kayıt kayıtlar içerisinde kullanılabilir, fakat bir kayıt
içinde birden fazla aynı isimli alan bulunamaz.
·
Kayıt ismi WITH cümlesi ile kullanılırsa alan isimlerinin önüne kayıt ismi yazmak gerekli
değildir.
VAR
Employee : EmpRec;
Date : BirthDay;
WITH Employee DO
READLN(Age,Dep,Hrate);
WITH Employee DO
WITH Birth DO
READLN(Age,Dep,Month,Day);
Veya
WITH Employee,Birth DO
READLN(Age,Dep,Month,Day);
·
Kayıt Dizileri normal dizilerin tanımlandığı şekilde tanımlanırlar.
TYPE
59
EmpRec = RECORD
Name : STRING[15];
Age : INTEGER;
Dep : INTEGER;
HRate : REAL;
Birth = RECORD;
Month : STRING[8];
Day : 1..31;
Year : 1900..2100;
END;
END;
ArrType = ARRAY [1..100] OF EmpRec;
VAR
Dizi1 : ARRAY [1..100] OF EmpRec;
Dizi2 : ArrType;
UYGULAMA
Bilgisayar programlaması dersinin sınav sonuçları ‘C:\DATA\SINAV.DAT’ dosyasına
yazılmıştır. Dosyanın her bir satırına bir öğrencinin bilgileri kaydedilmiştir. Her satıra
öğrencinin adı, soyadı, doğru yanlış türü sınav sorularının cevapları olarak D(doğru),
Y(yanlış), B(boş) bilgileri girilmiştir. Sınav soruları 100 adettir. Satırdaki her veri
arasında bir boşluk bulunmaktadır.
a. Cevap anahtarının klavyeden girildiği
b. Her bir öğrencinin adını, soyadını ve sınav sonucunu, sınıfın öğrenci mevcudunu,
ortalamasını ve başarı oranını(geçme notu=50) ‘C:\DATA\SONUC.DAT’ dosyasına
60
yazdırıldığı bir pascal programı yazın.
Çıktı Örneği :
Kemal ŞAHİN 95
Mustafa KURT 96
........
........
........
........
........
........
........
------------------------------------Mevcut : .......
Ortalama = .......
Başarı = %.......
61
5.Görsel Programlama Ortamı ve Temel
Kavramlar
5.a. Projeler İle Çalışma
·
·
·
·
·
·
·
·
·
Visual Basic Projesi Nedir?
Project Explorer Kullanmak
Yeni Proje Yaratmak
Projenin Özelliklerini Değiştirmek
Projeyi İsimlendirmek ve Kaydetmek
Mevcut Projeyi Açmak
Projeye Dosya Eklemek
Projeden Dosya Çıkarmak
Proje Grupları İle Çalışmak
Visual Basic Projesi Nedir?
Bir proje ile uygulama aynı anlama gelmez.
Bir proje, herhangi bir uygulama geliştirmek için kullandığımız bir araçtır. Projeler ile
geleneksel uygulamalar dışında dynamic link library (dll) ve ActiveX kontrolleri
geliştirebiliriz. Bir program geliştirirken , formları, modülleri ve kontrolleri bir proje içinde
yönetip, derleyerek Visual Basic uygulaması geliştirebiliriz.
Visual Basic’de proje, programı oluşturan dosyaların oluşturduğu bir guruptur.
Formlar, modüller, grafikler, kontroller hatta başka tip dosyalar projeyi oluşturur. Proje
hakkında akılda tutulması gerekli ilk nokta, programı geliştirirken proje içindeki her
dosya diskte ayrı ayrı kaydedilir.
Proje İçinde Yer Alabilecek Dosya Tipleri
Dosya Uzantısı Tanımı
FRM
Form
BAS
Modül
FRX
Form üzerindeki grafik nesneler için otomatik oluşturulan dosya
OCX
ActiveX kontrol
CLS
Sınıf Modülü
VBP
Visual Basic proje dosyası
62
Proje dosyasında projede kullanılan dosyalar hakkında detaylı bilgi bulunur. Proje
dosyasında birleştirilmiş geliştirme ortamının(IDE) ayarları, proje ismi, projede yer
alan dosyaların listesi gibi bilgiler yer alır. Proje dosyalarının uzantıları VBP’dir.
Project Explorer Kullanmak
Projeniz içindeki dosyaları Project Explorer içinde yönetebilirsiniz. Project Explorer
IDE’nin sağ tarafında bulunur (Şekil 5.a.1). Project Explorer penceresi proje
dosyalarınızı yönetecek onları form veya kod penceresinde görüntüleyecek metodlar
içerir.
ŞEKİL 5.a.1 Project Explorer kullanımı. OCX and FRX dosyaları Project Explorer
penceresinde listelenmezler.
Project Explorer içerisinde yapılacak işlerin çoğu context menü aracılığı ile
yapılır.Proje dosyaları üzerine sağ tıklarsanız Şekil 5.a.2.de görülen context menüye
ulaşabilirsiniz.
63
ŞEKİL 5.a.2 Project Explorers context menü.
Context menu ile aşağıdaki işlemleri gerçekleştirebilirsiniz.
·
·
·
·
·
·
·
·
Dosyayı form veya kod penceresinde görüntülemek,
Dosyanın özelliklerini görüntülemek,
Projeye dosya eklemek,
Seçilen dosyayı kaydetmek,
Seçilen dosyayı silmek,
Dosyayı yazdırmak,
Project Explorer penceresinin tipini (float veya dock) değiştirmek,
Project Explorer penceresini gizlemek.
64
Yeni Proje Yaratmak
Visual Basic her çalıştırılışında New Project diyalog kutusu karşınıza çıkar. Bu
projede yaratmak istediğiniz proje tipini seçin ve Open düğmesine basın.
Şekil 5.a.3 Yeni proje yaratmak.
Visual Basic açıkken de yeni bir proje yaratmak mümkündür.
Bunun için:
1. File menüsünden, New Project seçilir. (New project seçilince eski projenin
kaydedilip edilmeyeceği sorulur.)
2. New Project dialog kutusundan proje tipi seçilip OK düğmesine basılır.
Projenin Özelliklerini Değiştirmek
Proje ismi, sürüm numarası ve başlık gibi projeyi tanımlayan bilgilerin tanımlanması
gereklidir. Bunlar ve diğerlerine Project properties diyalog kutusundan erişilebilir(Şekil
5.a.4 ve 5.a.5).
65
FIGURE 5.a.4 Project properties diyalog kutusu General sekmesi.
FIGURE 5.a.5 Project properties diyalog kutusu Make sekmesi.
Project Properties diyalog kutusuna erismek için
66
1. Project Explorer penceresinde proje dosyası üzerindeyken sağ fare tuşuna basınız.,
2. Context Menüden, ProjectName Properties elemanını seçin.
Projeyi İsimlendirmek ve Kaydetmek
Projeyi kaydederken aynı zamanda projeyi oluşturan bağımsız dosyaları da
kaydedersiniz.(form,modül,grafik vb). Eğer projeyi ilk defa kaydediyorsanız Visual
basic önce her dosyanın ayrı ayrı kaydedilmesini ister, en sonunda ise proje dosyası
kaydedilmelidir.
Projeyi kaydetmek
1. File menüsünden, Save Project. Seçilir.
2. Eğer proje ilk defa kaydediliyor veya projeye yeni dosyalar eklenmişse
kaydedilmemiş her bir dosya için Save File As diyalog kutusu açılır. (Şekil 5.a.6).
ŞEKİL 5.a.6 Visual Basic otomatik olarak frmFirst isimli form için
frmFirst.frm dosya ismi önerir.
3. Dosya için bir isim girin ve Save düğmesine basın
4. Kaydedilecek son dosya Proje dosyasıdır. VB otomatik olarak
Project_name.vbp’yi dosya ismi olarak önerir. Eğer proje ismi girmemişseniz, VB
varsayılan isim olarak Project1.vbp’yi önerir. Böyle bir durumda daha anlamlı bir isim
vermeniz önerilir.(Örneğin SaveTest.vbp gibi.)
67
Mevcut Projeyi Açmak
Daha önce çalıştığınız projeleri açmak için File menüsünü açtığınızda bu menünün
alt kısmında yer alan ve son zamanlarda çalışılan proje isimlerinden
yararlanabilirsiniz.
Visual Basic açıldığında Mevcut Projeleri açmak
Visual Basic açıldığında, New Project diyalog kutusu görünür. Mevcut
projelere doğrudan bu diyalog kutusundan erişebilirsiniz. Eğer her açılışta bu
diyalog kutusunu görmek istemiyorsanız alttaki onayı kaldırın.
Mevcut projeyi açmak
1. File menüsünden, Open Project elemanını seçin. Open Project diyalog kutusu
açılır.(Şekil 5.a.7).
ŞEKİL 5.a.7 Open Project diyalog kutusu.
2. Existing sayfasından, açmak istediğiniz projenin klasöründen proje dosyasını
seçin veya son zamanlarda çalıştığınız projeyi Recent sayfasından seçin.
3. Open düğmesine basın.
68
Projeye Dosya Eklemek
Genellikle programlarınız birden fazla form ve modül içerirler. Bu durumda projeye
yeni form veya modül eklemek gerekir. Projelerinize yeni dosyaları iki türlü
ekleyebilirsiniz.(Project menüsünden veya Project Explorer penceresinden)
Project Explorer İçerisinden Yeni Dosya Eklemek
1. Project Explorer içerisinden sağ fare tuşuna basın.
2. Gelen context menüden Add, ve dosya tipini seçin.
Hangi metodu seçerseniz seçin , seçmek istediğiniz form veya modülün çok
kullanılan kalıplarını içeren bir diyalog kutusu ekrana gelir(Şekil 5.a.8), kullanacağınız
kalıbı seçip Open düğmesine basın.
ŞEKİL 5.a.8 Add Form diyalog kutusu.
Gerek Project menüsünden, gerekse Project Explorer penceresinin context
menüsünden Add File seçilirse, ekrana gelen dosya açma diyalog kutusundan var
olan dosyalar projeye eklenebilir.(Şekil 5.a.9)
69
ŞEKİL 5.9 Add File.
Projeden Dosya Çıkarmak
Eğer projenizde istemediğiniz bir dosya varsa projeden çıkarabilirsiniz. Bir dosyayı
projeden çıkarırsanız disk üzerinde kalır. Bundan sonra silmek istiyorsanız windows
explorer kullanın.
Projeden Dosya Çıkarmak
1. Project Explorer penceresinde çıkarmak istediğiniz dosyayı seçin ve sağ fare
tuşuna basın,
2. Gelen context menüden Remove dosyaismini seçin.
Aynı zamanda Project Explorer penceresinde çıkarmak istediğiniz dosyayı seçip,
Project menüsünden Remove dosyaismini seçin.
Proje Grupları İle Çalışmak
Visual Basic 6 aynı anda birden fazla proje ile çalışmanıza izin verir. Çalışılacak
bütün projeler bir proje gurubu içinnde toplanıp, VBG uzantısı ile kaydedilebilir. Aynı
yapıya ihtiyaç duyulduğunda proje gurup dosyasının açılması yeterlidir.
Proje gurubuna proje eklemek
1.File menüsünden Add Project seçilir.
70
2.Add Project diyalog kutusu aracılığı ile yeni veya varolan bir proje seçilir.
3.OK düğmesine basılır. Visual Basic otomatik olarak bir proje gurubu oluşturur ve
yeni projeyi bu guruba dahil eder.
ŞEKİL 5.a.10 Project Explorer aynı anda birden fazla projeyi proje gurubu içinde
yönetir.F5 tuşuna basıldığında Kalın harflerle ismi yazılı proje çalıştırılır.
Proje gurupları ActiveX kontrolleri yaratırken önem kazanır, bu durumda birden fazla
projenin aynı anda açık olması gerekir.
5.b. Kontrollerin Kullanımı
·
·
·
·
·
·
·
·
Formlar ve Kontroller Nedir?
Temel Kontroller Nelerdir?
Kontrollerin Eklenmesi, Çıkarılması
Kontrolleri İsimlendirmenin Önemi
Bir Kontrol Nasıl Boyutlandırılır, Konumlandırılır?
Formun Boyutunu Değiştirmek
Kontrolleri Guruplamak
Kontroller Ekleyerek Visual Basic’i Genişletmek
Formlar ve Kontroller Nedir?
Visual Basic içerisinde formlar, oluşturduğunuz programların temel yapı taşlarıdır.
Formlar kullanıcıların programla etkileşimde bulundukları nesnelerin üzerine
71
konuldukları yapılardır. Formlar üzerindeki nesneler (ifadelerin girildiği metin kutuları,
tıklanan düğmeler vb.) kullanıcı ile etkileşimi sağlayan kontrollerdir.
Temel Kontroller Nelerdir?
Programlarınızı yaparken çoğunlukla az sayıda fakat oldukça kullanışlı kontroller
kullanırız. Bu kontroller ile programlarınıza düğmeler, onay kutuları, etiketler ve metin
kutuları vb. kontrolleri ekleyebilirsiniz. Bu kontroller ile diskinizde bulunan dosyaları
görebilir hatta veritabanını okuyabilirsiniz. Bunlara temel kontroller denir. Temel
kontroller araç kutusu üzerinde bulunur.(Şekil 5.b.1) Tablo 5.b.1.de temel kontroller
listelenmiştir.
ŞEKİL 5.b.1 Bir kontrolü seçmek için üzerine tıklamak yeterlidir.
TABLO 5.b.1 Visual Basic 6 Temel Kontrolleri
Kontrol
Label(Etiket)
Tanımı
Form üzerinde yazıları göstermek için kullanılır.
Frame(Çerçeve)
Üzerindeki kontrolleri guruplamak için kullanılır.
CheckBox(Onay Kutusu)
Kullanıcılara bir seçeneği seçip seçmemesine imkanı verir.
ComboBox(Kapalı Liste
Kutusu)
Kullanıcılara listeden bir değer seçmelerine veya listeye
değer girmelerine imkan verir.
72
HscrollBar(Yatay Kaydırma
Çubuğu)
Timer(Zaman)
Diğer bir konrol içerisindeki veriyi yatay olarak kaydırır.
Belirli zaman aralıklarında programın bir işlemi
gerçekleştirmesini sağlar.
DirListBox(Dizin Liste Kutusu) Kullanıcıya dizin seçme imkanı verir.
Shape(Şekil)
Form üzerine şekil çizmeye yarar.
Image(Görüntü)
Form üzerine resim konulması için kullanılır. Kontrolleri
guruplamada kullanılmaz.
OLE Container(ole nesnesi)
Bir konrol programının işlevselliğini programınıza ekler.
PictureBox(Resim Kutusu)
Form üzerine resim konulması için kullanılır. Kontrolleri
guruplamada da kullanılır.
TextBox(Metin Kutusu)
İfadeleri göstermek, veri girmek ve düzeltmek için
kullanılır.
CommandButton(Komut
Düğmesi)
Kullanıcının tanımlayacağı bir işlemin yapılması için
kullanılır.
OptionButton(Seçenek
Düğmesi)
Bir seçenek gurubu içerisinde bir seçeneğin seçiminde
kullanılır.
ListBox(Liste kutusu)
Listeden bir eleman seçmek için kullanılır.
VscrollBar(Düşey Kaydırma
Çubuğu)
Diğer bir konrol içerisindeki veriyi düşey olarak kaydırır.
DriveListBox(Sürücü Liste
Kutusu)
Kullanıcının bir sürücü seçmesini sağlar.
FileListBox(Dosya Liste
Kutusu)
Kullanıcıya dosya seçme imkanı verir.
Line(Çizgi)
Form üzerine çizgi çizilmesini sağlar.
Data
Programın bir veritabanı ile bağlantı kurmasını sağlar.
Kontrollerin Eklenmesi, Çıkarılması
Araçlar kutusu üzerinde yer alan kontroller üzerine çift tıklanarak veya taşınarak form
üzerine eklenir.
Form üzerine kontrolun taşınması
1. Kontrolun araç kutusu üzerindeki sembolüne tıklanır.
2. Fare ile form üzerine gelindiğinde imlecin şekli + olur. Kontrolün yerleştirileceği
yere farenin sol tuşu ile tıklayın.
73
3. Fare sol tuşu basılı iken, fare sola çekilirse bir kutu görünür.
4. Kutu uygun konuma geldiğinde çekme işlemi bitirilip, fare sol tuşu bırakılır.
ŞEKİL 5.b.2 Kontrolun form üzerine konumlanması.
Kontrolun form üzerinden silinmesi
1. Form üzerinden silinmek istenen kontrol fare ile seçilir. Seçilen kontrolun her
köşesinde bir kutucuk belirir.
2. Delete tuşuna basılırak veya sağ tuşa tıklandığında gelen menüden delete elemanı
seçilerek, kontrol form üzerinden silinir.
ŞEKİL 5.b.3 Form üzerinden kontrolun seçilmesi.
74
Kontrolleri İsimlendirmenin Önemi
Bir kontrolun en önemli özelliklerinden biri ismidir. Çünkü kontrol program içerisinde
ismi ile kullanılır. Bir kontrolu form üzerine koyduğunuzda visual basic tarafından
otomatik olarak önceden belirlenmiş isimler ile adlandırılırlar.(Command1,Text1 vb).
Ancak form üzerinde aynı tipten birden fazla kontrol farklı amaçlar için kullanılacaksa
otomatik olarak adlandırılması yerine, yapacağı işe uygun bir isimle kullanıcı
tarafından adlandırılması daha doğru olacaktır.
Kontrolun isimlendirilmesi
1. Forma eklenen kontrolün seçildiğinden emin olun.(Seçildiğinde kontrol
köşelerinde birer kutucuk belirir.)
2. Özellikler(Properties) penceresinde, sağ kolondaki kontrol ismi üzerine
tıklanır.(Şekil 5.b.4)
3. Mevcut isim silinir, istediğiniz isim yazılır.
ŞEKİL 5.b.4 Özellikler(Properties) penceresinde kontrol ismini değiştirebilirsiniz.
Kontrola verilecek isim, kontrolun tipini ve ne yapacağını belirten bir isim olmalıdır.
Verilecek ismin ilk üç karakteri kontrolün tipini bildiren önek olması ve diğer karakterlerin
kontrolun program içinde ne yaptığını tanımlayan bir ifade olması tercih edilmelidir. İsim
içinde boşluk bulunmamalıdır.
TABLO 5.b.2 Temel Kontrolları İsimlendirmede Kullanılan Önekler
Control
Prefix Control
Prefix
Label
lbl
PictureBox
pic
Frame
fra
TextBox
txt
CheckBox
chk
CommandButton cmd
75
ComboBox
cbo
OptionButton
opt
HscrollBar
hsb
ListBox
lst
Timer
tmr
VscrollBar
vsb
DirListBox
dir
DriveListBox
drv
Shape
shp
FileListBox
fil
Image
img
Line
lin
Data
dat
OLE Container Control ole
Örneğin, bir komut düğmesi(CommandButton) programı kapatmak için
kullanılacaksa, öneki cmd olacak şekilde cmdKapat şeklinde isimlendirilir.
Bir Kontrol Nasıl Boyutlandırılır, Konumlandırılır
Kontrolu form üzerine yerleştirirken gerçek boyutlarında çizmek mümkün değildir.
Kontrolu fare ile boyutlandırmak
1. Araç kutusundan imleci seçin.
2. Form üzerinden boyutlandırmak istediğiniz kontrolu seçin.
3. Seçilmiş olan kontrolun köşelerindeki kutucukları farenin sol tuşuna tıklayarak, sol
tuşa basılı tutarak kontrolu boyutlandırın.
ŞEKİL 5.b.5 Form üzerindeki kontrolun boyutlandırılması
Kontrolun konumunu değiştirmek için kontrol üzerine tıklayıp yeni konumuna çekin.
Formun Boyutunu Değiştirmek
Proje içinde açılan her yeni form standart boyutları ile oluşturulur. Tasarımınız ve
kullanacağınız kontroller formun boyutlarını değiştirmenizi gerektirebilir. Bu durumda
form seçili iken formun etrafında oluşan tutamakları kullanarak formun boyutunu
değiştirebilirsiniz.
76
ŞEKİL 5.b.6 Kullanılan kontrollere uygun olarak formu boyutlandırmak.
Kontrolleri Gruplamak
Bazı kontroller üzerinde bulunan kontrolleri guruplamak için kullanılırlar. Bu
kontrol(frame,picture box vb) taşıyıcı veya kap olarak değerlendirilebilir. Bu kontrolün
kapsadığı kontroller taşıyıcıları ile birlikte hareket ettirilebilir veya silinebilir.
Kontrol gurubuna yeni bir kontrol dahil etmek için araç kutusundan yeni bir kontrol
seçip, taşıyıcı kontrol üzerine çizmek gerekir. Kontrolleri guruplamak kod içerisinde
de özellikle kontrollerin boyutlandırılması ve konum değişikliklerinde önemlidir.
Kontrolleri Ekleyerek Visual Basic’i Genişletmek
Temel kontroller oldukça kullanışlı ve güçlü olmasına rağmen programlama
ihtiyaçlarınızı karşılamada yetersiz kalabilmektedir. Bu durumda aarç kutusunda
varsayılan kontroller arasında bulunmayan fakat Visual Basic ile beraber gelen
ActiveX kontroller kullanılabilir. Bunlar araç kurusuna eklenebilirler.
77
Add controls to the Toolbox
1. Project menüsünden, Components elemanını seçin.
2. Components diyalog kutusunda , kontrols sayfasında Selected Items Only onay
kutusundaki işareti kaldırınca bilgisayarınızdaki kullanabileceğiniz ActiveX
kontrollerinin listesini görebilirsiniz.
3.Listeden eklemek istediğiniz kontrolun yanındaki onay kutusunu işaretleyin.
ŞEKİL 5.b.7 Araç kutusuna eklenecek kontrolun seçimi.
4. OK düğmesine basın. Seçtiğiniz kontrolun araç kutusuna eklendiğini göreceksiniz.
Eklenen yeni kontrolleri diğer temel kontrolleri kullandığınız şekilde
kullanabilirsiniz.
78
ŞEKİL 5.b.8 Kontrollerin araç kutusuna eklenmesi.
79
5.c. Özellik, Metod ve Olay Kavramları
·
·
·
Özellik, Metod ve Olay Nedir?
Olaya Yönelik Programlamanın Önemi
Örnek Bir Programda Özellik, Metod ve Olay Kullanımı
o Grafik AraYüzü Oluşturmak.
o Form_Load() Olay Yordamın Programlamak
o Click() Olayını Programlamak
o Olayları Rapor Etmek
Özellik, Metod ve Olay Nedir?
Özellikler nesneleri tanımlamaya yararlar. Metodlar nesnelerin bir iş yapmalarını
sağlarlar. Olaylar ise nesnelerin yaptıkları işler sonucu oluşurlar.
Her nesnenin örneğin formun kendisini tanımlayan özellikleri vardır. Birçok nesnenin
ortak özellikleri aşağıdaki tabloda verilmiştir. Seçili bir nesnenin özelliklerine
birleştirilmiş geliştirme ortamının Özellikler(Properties Window) penceresinden
erişilebilir.
TABLO 5.c.1 Visual Basic Kontrollerinin Ortak Özellikleri
Özellik Tanım
Left
Kontrolun sol köşesinin x koordinatı
Top
Kontrolun üst köşesinin y koordinatı
Height Kontrolun yüksekliği
Width
Kontrolun genişiliği
Name
Kontrolun İsmi
Enabled Kullanıcının kontrolu kullanıp kullanımayacağını belirtir, (true/false) değeri alır.
Visible Kontrolun forö üzerinde görünüp görünmeyeceğini belirtir, (true/false) değeri alır.
Bir diğer önemli özellik BorederStyle olup,formun üst barında bulunan pencere
elemanlarını(maximize, minimize düğmeleri vb.) belirler.
TABLO 5.c.2 BorderStyle Özelliğinin Alabileceği Değerler
Değer
0-None
Anlamı
Sınırları, başlığı olmayan hareket ettirilemeyen form oluşur.
1-Fixed Single
Form köşelerinden çekilerek boyutlandırılamaz fakat Maximize ve
80
Minimize düğmeleri vardır
2-Sizable
(varsayılan)
Form köşelerinden çekilerek boyutlandırılabilir, Maximize ve Minimize
düğmeleri vardır
3-Fixed Dialog
Boyutlandırılamaz ve Maximize/Minimize düğmeleri yoktur, diyalog
kutusu oluşturmada kullanılır.
4-Fixed
ToolWindow
3 ile aynıdır fakat başlığı biraz dar ve başlıkta kullanılan fontlar ve Close
düğmesi küçüktür, kayan araç çubukları yapmak için kullanılır.
5-Sizable
ToolWindow
4 ile aynıdır fakat köşelerinden çekilerek boyutlandırılabilir.Visual Basic
Özellikler penceresi gibi pencerelerin tasarımında kullanılır.
ŞEKİL 5.c.1 Bir formun BorderStyle özelliği 6 farklı stil değeri alabilir.
Metodlar bir formun bir yerden başka yere taşınması gibi kontrollerin farklı işlemleri
nasıl yapacağını belirtmek için tasarlanmış program parçalarıdır. Her kontrolun farklı
metodları vardır. Ortak metodlar aşağıda listelenmiştir.
TABLO 5.c.3 Visual Basic Kontrollerinin Ortak Metodları
Metod
Move
Kullanımı
Programdan gelen bir isteğe bağlı olarak bir nesnenin konumunu değiştirir.
Drag
Kullanıcının kontrolu çekip bırakma işlemini yönetir.
SetFocus İmleci ait olduğu kontrol üzerinde konumlar.
ZOrder
Ait olduğu kontrolun ekranda önde veya arkada olmasını belirler.
81
Olaylar program ile etkileşirken sistem tarafından algılanan eylemlerdir. Örneğin, bir
kullanıcı form üzerindeki bir düğmeye bastığında birçok olay oluşur. Fare tuşuna
tıklanır, formun düğmesi tıklanır ve fare tuşu bırakılır. Bunlar sırası ile MouseDown
olayı, Click olayı ve MouseUp olayına karşılık gelir. Her kontrolun farklı olayları
vardır. Ortak olaylar aşağıda listelenmiştir.
TABLO 5.c.4 Visual Basic Kontrollerinin Ortak Olayları
Olay
Change
Oluşumu
Metin kutusu veya veri giriş kontrollerinde veri girerken veya düzeltirken.
Click
Kullanıcı bir nesne üzerinde mouse tuşuna bastığında.
DblClick
Kullanıcı bir nesne üzerinde mouse tuşuna çift tıkladığında.
DragDrop
Kullanıcı bir nesneyi başka konuma taşıdığında.
DragOver
Kullanıcı bir nesneyi başka nesne üzerine taşıdığında.
GotFocus
İmleç bir nesneye konumlandığında.
KeyDown
İmleç bir nesne üzerindeyken klavye tuşlarına basıldığında.
KeyPress
İmleç bir nesne üzerindeyken klavye tuşlarına basılıp bırakıldığında.
KeyUp
İmleç bir nesne üzerindeyken klavye tuşu serbest bırakıldığında.
LostFocus
İmleç nesneyi terkettiğinde.
MouseDown İmleç bir nesne üzerindeyken fare tuşuna basıldığında.
MouseMove İmleç bir nesne üzerinde hareket ettirildiğinde.
MouseUp
İmleç bir nesne üzerindeyken fare tuşu serbest bırakıldığında.
Olaya Yönelik Programlamanın Önemi
Visual Basic içinde bir program yazarken genellikle olaya yönelik programlama
yapıyorsunuz demektir.Olaya yönelik programlama demek yazdığınız kodun çoğu
kullanıcıların programla bir iş yaptıklarında veya Windows ortamında bir şeyler
olduğunda çalışması demektir. Bu şekilde programlama yapmak olayların ne zaman
olacağını bilmek ve programın olaylara nasıl cevap vereceğini bilmek gerekir.
Windows ve Visual Basic işlerin çoğunu sizin için yapar. Herhangi bir olay olduğunda
, Windows programınıza bir mesaj gnderir. Programınız bu mesajı okur, bu olay için
yazdığınız kodu çalıştırır. Bu olay için kod yazmamışsanız, programınız olayı dikkate
almaz.
Genel olarak bu kod bir yordamdır ve programınızın içinden çağrılabilir bir kod
bloğudur.Yordam formatı aşağıda verilmiştir
82
[Public|Private] [Static] Sub|Function|Property _
function_name (arguments) [As Type]
{...Your procedure code...}
End Sub|Function|Property
Bir olay yordamı, bir olay olduğunda buna cevap olarak çalıştırılacak kodu, projeniz
içinde yazmaya başlayacağınız yerdir. Olay yordamları kod penceresi içerisinde
yazılırlar. Kod penceresine aşağıdaki işlemlerden birini uygulayarak erişebilirsiniz.
·
Nesne üzerinde çift tıklayarak,
·
Fare ile nesneyi seçip F7 tuşuna basarak,
·
Fare ile nesneyi seçip View menüsünden Code seçeneğine tıklayarak,
·
Project Explorer penceresinden nesnenin formunu seçip, View Code
düğmesine tıklayarak.
ŞEKİL 5.c.2 Bir olay yordamı örneği
Code penceresinden bir olay seçtiğinizde Visual Basic otomatik olarak bir olay
yordamı üretir. Şekil 5.c.2 de, olay yordamlarının nesne ismi, alt çizgi ve takip eden
olay ismi ile isimlendirildiğini görebilirsiniz (cmdExit_Click()). Bu örnekte, cmdExit
komut düğmesine tıklandığında ekrana bir mesaj kutusunun çıktığı görülür.
Örnek Bir Programda Özellik, Metod ve Olay Kullanımı
Özellik, Metod ve Olay Kullanımına örnek vermek için MoveIt isimli bir uygulama
geliştirilecektir.
83
ŞEKİL 5.c.3 MoveIt isimli program arayüz üzerindeki düğmelere tıklandıkça formu
ekran üzerinde hareket ettirir.
MoveIt frmMove formu ve bu formun içerdiği formun köşelerine yerleştirilmiş komut
düğmelerinden oluşur. MoveIt uygulamasını çalıştırdığınızda arayüzün içerdiği
düğmelere tıklayarak formu ilgili köşelere hareket ettirebilirsiniz. Formun ortasındaki
metin kutusunda ise oluşan olayı görebilirsiniz.
MoveIt uygulamasının oluşturulması (genel adımlar)
1. Grafik ara yüzü(graphical user interface =GUI) olu şturun.
2. Form_Load() olay yordamını kodlayın.
3. Click() olay yordamını kodlayın.
4. Oluşan olayı rapor eden kodları hazırlayın.
Grafik AraYüzü Oluşturmak
1. File menüsünden New Project elemanını seçin. Ekrana gelen New Project diyalog
kutusundan Standard EXE’yi seçin.
2. Proje formunun ismini Özellikler penceresi içinde frmMove olarak değiştirin.
3. frmMove formunun köşelerine birer komut düğmesi, ortasına ise bir etiket
yerleştirin.
4. Etiketi ve dört komut düğmesini şekil 5.c.4.e göre özellikler penceresi içinde
isimlendirin.
84
ŞEKİL 5.c.4 Ara yüz tasarımı.
5. Formun BorderStyle özellik değeri olarak 1-Fixed Single seçin. Bu değer çalışma
zamanında formun boyutlandırılmasını önleyecektir. Ayrıca etiketin BorderStyle
özelliğine Alignment 2-Center değeri verin.
6. Formu frmMove.frm ve projeyi MoveIt.vbp olarak kaydedin.
Form_Load() Olay Yordamını Programlamak
Formun ekranda gösterilmesinden önce yapacağınız şeyleri hazırlamak için
Form_Load() olay yordamı kullanılır.
Bu yordam içinde aşağıdaki olaylar gerçekleştirilecektir.
·
Komut düğmelerinin üzerlerine yazıları yazılacak.
Etiketin üzerine ilk değeri yazdırılacak.
·
Formun başlığı yazdırılacak.
·
4 komut düğmesinin ve etiketin konumları belirlenecektir.
·
85
Formun üzerinde herhangi bir yere(kontroller d ışında) çift tıklandığında, Code
penceresinde Form_Load() olay yordamı açılır. Sonra Liste 5.c.1.deki kodu
girin. ‘ ile başlayan satırlar açıklama satırlarıdır, kodun okunabilirliğini
sağlarlar anacak icra edilmezler.
LISTE 5.c.1 frmMove Formunun Form_Load() Olay Yordamı
01 `Set the Caption property of the CommandButtons
02 cmdTopLeft.Caption = "Top Left"
03 cmdTopRight.Caption = "Top Right"
04 cmdBottomLeft.Caption = "Bottom Left"
05 cmdBottomRight.Caption = "Bottom Right"
06
07 `Clear the initial text of the label
08 lblNotify.Caption = ""
09
10 `Set the form's title bar text
11 frmMove.Caption = "MoveIt"
12
13 `The rest of the code centers the form on the
14 `screen, sets the position of the four
15 `CommandButtons, and sets the size and
16 `position of the label.
17
18 `Center the form on the screen. This works by
19 `setting the Left side of the form to the center
20 `of the screen, less half the width of the form.
21 `Also, the Top of the form is set to the center
22 `of the screen, less half the height of the form.
23 frmMove.Left = (Screen.Width - frmMove.Width) / 2
24 frmMove.Top = (Screen.Height - frmMove.Height) / 2
25
26 `Set the Left edge of the buttons. The 200 setting
27 `for the left buttons sets a space between the edge
28 `of the form and the buttons. The right buttons are
29 `set by subtracting the width of the button from
30 `the width of the form, and subtracting 300 to
31 `set a space between the button and the form edge.
32 cmdTopLeft.Left = 200
33 cmdBottomLeft.Left = 200
34 cmdTopRight.Left = _
frmMove.Width - cmdTopRight.Width - 300
35 cmdBottomRight.Left = _
frmMove.Width - cmdBottomRight.Width - 300
36
37 `Set the Top edge of the buttons. This is done
38 `similar to setting the Left edge.
39 cmdTopLeft.Top = 200
40 cmdBottomLeft.Top = _
frmMove.Height - cmdBottomLeft.Height - 500
41 cmdTopRight.Top = 200
42 cmdBottomRight.Top = _
frmMove.Height - cmdBottomRight.Height - 500
43
44 `Set the size of the label
45 lblNotify.Height = 360
46 lblNotify.Width = 3000
47
48 `Center the label within the form. This is done
49 `similar to centering the form.
50 lblNotify.Left = _
86
(frmMove.Width - lblNotify.Width) / 2
51 lblNotify.Top = _
(frmMove.Height - lblNotify.Height) / 2 – 200
ŞEKİL 5.c.5 Olay yordamlarınızı birleştirilmiş geliştirme ortamının Code penceresinde
yazabilirsiniz.
Click() Olayını Programlamak
Formu ekranda hareket ettirmek için Click() olay yordamın kullanacağız. Bunun için olay
yordamın yazacağımız komut düğmesi üzerinde çift tıklandığında o komut düğmesine ait
Click() yordamı Code penceresinde görülür.Liste 5.c.2. de verilen kodları ilgili yordamlara
girin.
LISTE 5.c.2 Komut Düğmelerinin Click() Olay Yordamları
01
02
03
04
05
06
Private Sub cmdBottomLeft_Click()
`Set the value of the form's TOP property
`to the bottom of the screen but bring
`it up the height of the screen so that the
`bottom of the form is on the bottom of
87
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
`the screen
frmMove.Top = Screen.Height - frmMove.Height
`Set the value of the form's LEFT property
`to the far left of the screen.
frmMove.Left = 0
End Sub
Private Sub cmdBottomRight_Click()
`Set the value for the form's TOP property to
`the bottom of the screen, but bring the TOP
`up the HEIGHT of the form so that the bottom
`of the form is on the bottom of the screen.
frmMove.Top = Screen.Height - frmMove.Height
`Set the value of the form's LEFT property to
`the right of the screen but bring it across
`the screen the width of the form so that the
`right side of the form is on the right
`side of the screen
frmMove.Left = Screen.Width - frmMove.Width
End Sub
Private Sub cmdTopLeft_Click()
`Set the value of the form's TOP property
`to the top of the screen.
frmMove.Top = 0
`Set the value of the form's LEFT property
`to the left of the screen.
frmMove.Left = 0
End Sub
Private Sub cmdTopRight_Click()
`Set the value of the form's TOP property
`to the top of the screen.
frmMove.Top = 0
`Set the value of the form's LEFT property to
`the right of the screen but bring it back across
`the screen the width of the form, so that the
`right side of the form is on the right
`side of the screen
frmMove.Left = Screen.Width - frmMove.Width
End Sub
Olayları Rapor Etmek
Son bölümde form ve komut düğmelerinde oluşan olayları rapor edecek kodu
yazacağız. Kullanıcılar form üzerinde farenin tuşuna basıp bıraktıkça tuşun durumu
form üzerindeki etikete yazılacaktır. Fare ile kontroller arasında gezdikçe oluşan
88
olaylar etiket üzerinde görünecektir.Bunu yapmak için üç farklı tipte olay yordamı
yazmak gerektirmektedir. Form için MouseDown ve MouseUp, her bir komut
düğmesi için ise GotFocus olay yordamı.
Liste 5.c.3.de frmMain için MouseUp ve MouseDown olay yordamlarının kodları
verilmiştir. Bu kodları ilgili olay yordamlarına giriniz. Örneğin formun üzerine gelip çift
tıklayarak kod penceresine ulaşıp, olay yordamları açılan penceresinden
MouseDown olay yordamını seçerseniz frmMain_MouseDown() olay yordamına
ulaşabilirsiniz.
LISTE 5.c.3 Kullanıcını Fare Düğmesine Basıp Bırakmasını Raporlayan
Kod
01 Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
02
03 lblNotify.Caption = "MouseDown Event"
04
05 End Sub
06
07 Private Sub Form_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
08
09 lblNotify.Caption = "MouseUp Event"
10
11 End Sub
89
ŞEKİL 5.c.6 Nesnenin olay yordamının seçimi.
Son olarak hangi komut düğmesinin aktif olacağını gösteren kodu ekleyelim. Liste
5.c.4.de her bir komut düğmesine ait GotFocus olay yordamı kodu verilmiştir.
LISTE 5.c.4 Code for Reporting Which CommandButton Has the Focus
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub cmdBottomLeft_GotFocus()
lblNotify.Caption = "cmdBottomLeft has the Focus"
End Sub
Private Sub cmdBottomRight_GotFocus()
lblNotify.Caption = "cmdBottomRight has the Focus"
End Sub
Private Sub cmdTopLeft_GotFocus()
lblNotify.Caption = "cmdTopLeft has the Focus"
End Sub
Private Sub cmdTopRight_GotFocus()
lblNotify.Caption = "cmdTopRight has the Focus"
90
22
23 End Sub
Her bir komut düğmesine ait GotFocus Olay Yordamları girilerek programın yazımı
bitirilir. F5 tuşuna basılarak program çalıştırılır.
ŞEKİL 5.c.7 Komut düğmesine tıkladığınızda otomatik olarak aktif hale geçer ve bu
durum etiket içinde rapor edilir.
91
6. Görsel Programlama Dilinin Temel Elemanları
6.a.Veri Tipleri, Sabitler ve Değişkenler
·
·
·
·
·
·
·
·
·
Değişkenlere Bilgi Depolama
o Değişkenleri Tanımlamak
o Değişkenleri İsimlendirmek
o Değişken Tipinin Doğru Seçilmesi
Açık Tanımlamalar Yapmak
Değişkenlerde Tip Sonekleri Kullanmak
String Kullanımı
Değişken Uzunluklu ve Sabit Uzunluklu Stringler
Bir Değişkenin Nerede Kullanılacağını Belirlemek
o Genel Değişkenler Tanımlamak
o Yerel Değişkenler Tanımlamak
Statik Değişkenler
Sabitler
o Visual Basic’in Sağladığı Sabitler
o Kendi Sabitlerinizi Tanımlamak
Atama Cümleleri
Değişkenlere Bilgi Depolama
Veriler program içerisinde işlenirken geçici olarak değişkenlere yüklenirler. Bir
değişken programın değişik yerlerinde değişik değerler alabilir. Değişkenler program
içerisinde değerleri değişebilecek büyüklükler için kullanılır. Değişken değerlerine
program içerisinden ulaşılabilir.
Değişkenleri Tanımlamak
Visual Basic Tarafından Kullanılan İfadeler
Bu ifadeleri değişken isimleri gibi programşlama ihtiyaçlarınız için kullanamazsınız.
Örneğin; Dim, As, New, ReDim, If, Then, Else, Loop, While, ve End Visual Basic
92
tarfaından kullanılan ifadelerdir. Bu ifadeler kod penceresi içinde farklı renkte
görülürler.
Aşağıdaki formatta değişkenleri tanımlayabilirsiniz.
Dim Değişkenİsmi As VeriTipi
Bu tanımlamada
· Dim Visual Basic tarafından değişken tanımlama için kullanılan özel ifadedir.
· Değişkenİsmi değişkene verilecek isimdir.
· As özel ifadesi bir veri tipi tanımlamakta olduğunuzu belirtir.
· VeriTipi değişkenin hagi veri tipinde olacağını bildirir.
Bu açıklamalar doğrultusunda aşağıdaki örnekte Integer veri tipinde i ismli bir
değişken tanımlanmaktadır.
Dim i as Integer
Değişkenleri İsimlendirmek
Değişkenleri tanımlarken onları isimlendirmek zorundasınız. İsimlendirme ile
değişkenleri birbirinden ayırma ve kolay erişim imkanına kavuşuruz.
Değişkenleri isimlendirmede çok büyük esnekliğe sahibiz. Değişken isimleri basit,
açıklayıcı veya içerdiği bilgiyi tanımlayıcı olabilir. Bu esnekliğe rağmen
isimlendirmede aşağıdaki kurallara uyulmalıdır.
·
·
·
·
İsimler mutalaka harf ile başlamalıdır.
İsim içinde nokta olmamalıdır.
İsim tanımlandığı modül veya yordam içinde bezersiz(tekrarsız) olmalıdır.tanım The
name must be unique within the current procedure or module (this restriction depends
on the scope of the name, which you'll learn about a little later).
İsim 255 karakterden büyük olamaz.
Aşağıda hatalı değişken isimleri verilmiştir.
·
·
·
1Week—Değişkene rakamla başlayamazsınız.
Earnings.To.Data—Nokta kullanamazsınız.
Number One—Boşluk kullanamazsınız.
Aşağıdaki değişken isimleri hatasızdır.
MyNum&
93
i%
iNumOne
strInputValue
Number2#
Program kodunun okunabilirliğini arttırmak için değişkenlere açıklayıcı isimler
verilmeli ve bu isimlere veri tiplerine uygun önekler verilmelidir. Veri tiplerine uygun
önek vermenin nasıl yapılacağı aşağıdaki tabloda belirtilmektedir.
TABLO 6.a.1 Değişkenler ve Önekler
Önek Değişken
B
Boolean
Örnek
bLightsOn
C
Currency
cAmountDue
D
Double
dDollarPerGallon
Db
Database
dbAccountsPayable
Ds
Dynaset
dsOverDue
Dt
Date+time
dtDateDue
Prefix Variable/Control
Example
Td
TableDef
tdEmployees
H
Handle
HWnd
i
Integer
iCounter
l
Long
LNum
str
String
strMessage
s
Single
SPay
a
Array
a_iMyArray
g
Global
g_iTotal
m
Local to module or form
m_iAmount
ani
Animation button
aniMain
cbo
Combo box and drop-down list box
cboMyList
chk
Check box
chkDoctorIn
clp
Picture clip
clpEmblems
cmd
Command button
cmdFirstName
com
Communications
comLineOne
ctr
Control (used within procs when the specific type is unknown) ctrNext
dat
Data
datEmployees
db
ODBC database
dbTaxpayers
dir
Directory list box
dirProjects
dlg
Common dialog
dlgSettings
drv
Drive list box
drvMain
94
fil
File list box
filPictures
frm
Form
frmMain
fra
Frame
fraTeams
gau
Gauge
gauGas
Prefix Variable/Control
Example
gpb
Group button
gpbApps
grd
Grid
grdMain
hsb
Horizontal scroll bar
hsbText
img
Image
imgMain
key
Keyboard key status
keyASCII
lbl
Label
lblLastName
lin
Line
LinRed
lst
List box
lstStooges
mdi
MDI child form
mdiMain
mnu
Menu
mnuEdit
opt
Option button
optGender
ole
OLE client
oleMain
pnl
3D panel
pnlFriends
shp
Shape
shpCircle
spn
Spin control
spnTemp
txt
Text/edit box
txtAddress
tmr
Timer
tmrBreak
vsb
Vertical scrollbar
vsbComments
Değişken Tipinin Doğru Seçilmesi
Değişken içinde hemen herşeyi tutabilirsiniz. Bir değişken sayıyı, karakterlerden
oluşan stringi, bir nesneyi, formu, kontrolu, veritabanı nesnelerini tutabilir.
Tablo 6.a.2 Visual Basic içinde kullanılabilecrk veri tipleri sunulmaktadır. Tabloda
herhangi bir tipteki değişkenin tutabileceği verileri, hafızada kendisine ayrılacak yeri
ve alabileceği değerlerin aralığı gösterilmektedir.
TABLO 6.a.2 Değişken Veri Tiplerinin Özellikleri
Tip
Tutabileceği Veriler
Tam Sayılar
Hafıza
Gereksinimi
2 bytes
Integer
Long
-32,768 - 32,767 arası
Tam Sayılar
4 bytes
Yaklaşık +/- 2.1E9
95
Değer Aralığı
Single
Ondalık Sayılar
4 bytes
-3.402823E38 -1.401298E-45 arasındaki
negatif değerler ve 1.401298E-45
3.402823E38 arası pozitif değerler
Double
Ondalık Sayılar(çift
hassasiyet)
8 bytes
-1.79769313486232E308
-4.94065645841247E-324 arası negatif
değerler ve 4.94065645841247E-324
1.79769313486232E308 arası positif
değerler
Currency Ondalık işaretinin
8 bytes
solunda 15 haneye
kadar ve sağında 4
haneye kadar olan tüm
sayılar.
922,337,203,685,477.5808
922,337,203,685,477.5807 arası
String
Karakterlerden oluşan 1 byte (her
ifadeler
karakter için)
Sabit uzunluklu stringler için 65,000
karakter ve dinamik stringler için 2 milyar
karaktere kadar
Byte
Sayı
1 byte
0 255 arası
2 bytes
True veya False
Boolean Mantıksal Değerler
Date
Tarih ve Zaman Bilgisi 8 bytes
1 Ocak 100 31 Aralık 9999 arası
Object
Resimler veya
herhangi bir nesne
4 bytes
Variant
Önceden bilinmeyen
ve tabloda yer alan
tiplerden biri için
16 bytes + 1
byte(her
karakter için)
Açık Tanımlamalar(Explicit Declaration) Yapmak
Değişkenleri açıkça tanımlama demek değişkenin bir cümle içerisnde tanımlanması
demektir. Visual Basic içerisinde tanımlama yapmadan da değişkenleri kullanmaya
başalayabilirsiniz. Aşağıdaki her bir cümlede bir değişken açıkça tanımlanmıştır.
Dim VarName [As VarType][, VarName2 [As VarType2]]
Private VarName[As VarType][, VarName2[As VarType2]]
Static VarName[As VarType][, VarName2[As VarType2]]
Public VarName[As VarType][, VarName2[As VarType2]]
Dim, Private, Static, ve Public Visual Basic ifadeleri, değişkenlerin nasıl ve
nerede kullanılabileceklerini belirtirler. Bir cümle içinde virgül kullanılarak
birden fazla değişken tanımlanabilir. Tipler As ifadesinden sonra açıkça
belirtilmelidir. Tip belirtilmezse değişkenin variant tipte olacağı kabul edilir.
Variant tipte bir değişken herhangi bir tipteki(integer,double.string vb.) değeri
alabilir.
96
Aşağıdaki kod satırları değişkenleri açık tanımlamaya yönelik bir örnektir.
Private iNumVal As Integer
Private iAvgVal As Integer, dInputval As Double
Static sCalcAverage As Single
Dim strInputMsg As String
Visual basic içerisinde Dim, Private, Static, veya Public kullanarak değişken
tanımlama mecburiyeti yoktur. Örneğin MyVal değişkenini kod içerisinde açıkça
tanımlamadan kullanılırsa derleyici bunu dolaylı tanımlanmış (implicit declaration) ve
veri tipini variant olarak kabul edecektir. Dolaylı tanımlama tercih edilen bir yöntem
değildir çünkü değişken isminin yanlış yazılması hata mesajı vermeyecek, ismi yanlış
yazılan değişken farklı bir değişken olarak kabul edilecektir. Bu da program içerisnde
ciddi hataların oluşmasına yol açabilecektir.
`Declare a
variable to hold the value fo the winner
Dim iTheWinnner as Integer
`Assign a value to the winner variable
iTheWinner = 100
`This code will show you a message that says
`The winner has won: 0
`because you typed, iTheWhiner by mistake
MsgBox "The winner has won: " & CStr(iTheWhiner)
Form veya modülün ilk satırına Option Explicit yazarak dolaylı tanımlamadan
kurtulabilirsiniz. Bu satır yazıldıktan sonra kodunuzda kullandığınız her değişken için
açık tanımlama yapmanız gereki aklsi takdirde hata mesajı alırsınız. Bu işlemi IDE’yi
kullanarak tüm form ve modüller için geçerli kılabilirsiniz.
IDE’yi değişken tanımlamayı zorunlu hale getirecek şekilde ayarlayın
1. Tools menüsünden, Options elemanını seçin.
2. Options diyalog kutusunun Editor sayfasından, Require Variable Declaration
onay kutusuna işaret koyun. (Şekil 6.a.1)
3. OK düğmesine tıklayın.
97
ŞEKİL 6.a.1.
Option Explicit seçeneği eklendiğinde, eğer bir değişkeni tanımlamayı unutursanız
derleme esnasında değişken tanımlanmamıştır hata mesajını alacaksınız. Örneğin
aşağıdaki cümle ile bir degişken tanımlayıp:
Dim strMyName As String
Eğer sonraki cümlede değişken ismini yanlış yazarsanız Visual Basic hatayı
yakalayacaktır. Eğer aşağıdaki cümleyi yazarsanız bir hata mesajı alırsınız.
strMyNme = "Clark Kent"
Değişkenlerde Tip Sonekleri Kullanmak
Daha öncek örneklerde değişken tanımında değişkenin veri tipini belirlemek için As
ifadesi kullanılıyordu. Bir başka yöntem ise As yerine tip soneki kullanmaktır. Bu
yntemde değişken tanımlanırken değişken isminin sonuna tip bildiren sonek eklenir
ve As ifadesi kullanılmaz. Kullanılan sonek değişkenin tipini otomatik olarak belirler.
98
TABLO 6.a.3 Değişken Sonekleri
Değişken Tipi Sonek
Integer
%
Long
&
Single
!
Double
#
Currency
@
String
$
Byte
Boolean
Date
Object
Variant
Örnek:
Private NumVal%
Private AvgVal%, Inputval#
Static CalcAverage!
Dim InputMsg$
Sonek kullanarak değişken tanımlama daha basit ve hızlı bir yöntemdir. Değişken
ismine bakarak veri tipi anlaşılacağından progran geliştirme hızını arttırabilir. Sonek
kullanmak bir programcı tercihidir.
String Kullanımı
Bir string karakterlerden oluşan bir topluluktur. Aşağıda farklı strimg değerleri
verilmektedir.
"Cheese"
"You have made an error!"
"a"
"July 4, 1776"
"75"
Her bir karakter topluluğu çift tırnak arasında yer almktadır(""). Çift tırnak içerisinde
yazılı olan her değeri Visual Basic string değeri olarak kabul eder. Çift tınak içerisinde
olmayan ifadeler ise değişken veya dilin bir parçası olarak kabul edilir.
99
"75" ifadesi size tamsyı olarak görünebilir fakat çift tırnak arasında yer aldığı için
Visual Basic tarafından string olarak kabul edilir.
Değişken Uzunluklu ve Sabit Uzunluklu Stringler
Programınızda kullandığınız stringlerin çoğu değişken uzunluklu olup 64000’e kadar
karakter içerebilirler. Deişken uzunluklu string değişkenlerine yeni değerler atandıkça
değişkenlerin uzunlukarı değişir.Bunun yanı sıra Sabit Uzunluklu string değişkenleri
de vardır.
Sabit Uzunluklu string değişkenlerine yeni değerler atamak değişkenin uzunluğunu
değiştirmez. Eğer atanan değer değişkenin uzunluğundan kısa ise kalan kısım boş
karakterler ile doldurulur.Eğer atanan değer değişkenin uzunluğundan fazla ise
soldan başlayarak değişkenin alabileceği kadar karakter alınır, artan kısım atılır.
Sabit Uzunluklu değişkenler aşağıdaki formata göre tanımlanır.
Dim Değişkenİsmi As String * stringUzunluğu
Bu formata uygun olarak 128 karakter uzunluklu strMyString değişkeni aşağıdaki
şekilde tanımlanmıştır.
Dim strMyString As String * 128
Sabit uzunluklu string değişkeni kullanmak ilk başta gerekli görünmese de,
programınız içinde Windows API (Application Programming Interface) kullanmanız
durumunda gerekli olacağını fark edeceksiniz.
Bir Değişkenin Nerede Kullanılacağını Belirlemek
Tanımlama cümlesinde, değişken içerisine ne atayabileceğiniz dışında Visual
Basic’in bu değişkeni nerede kullanacağını anlayabilirsiniz.Kullanılacak yer(scope)
değişkenin geçerli olduğu kod bölümünü gösterir. Sadece bir yordam içerisinde yerel
olarak(locally) kullanabileceğiniz değişkenler dışında, çalıştığınız form veya modülde
hatta tüm programda genel olarak(globally) kullanabileceğiniz değişkenler vardır.
Dim ile tanımlanan bir değişken tanımlandığı yer içinde(local) kullanılabilir. Örneğin
bir alt yordam içinde Dim ile tanımlanan değişken sadece tanımlandığı yordam içinde
100
geçerlidir. Eğer bu değişkeni diğer yordamlarlada kullanmak istiyorsak tüm
yordamlara genel olarak tanımlamalıyız.
Genel Değişkenler Tanımlamak
Tek form ve modül kullanan programlar dışındakilerde bazı değişkenlere kodun her
tarafından ulaşılmasına ihtiyaç olduğunu fark edersiniz. Bu değişkenler genel
değişkenlerdir(Public or global variables). Bu değişkenler programın her yerinde
kullanılabilecek bilgileri veya o andaki durum bilgilerini tutan değişkenlerdir.
Genel değişkenler, kod veya form Modülünün General Declarations bölümünde
Public deyimi ile tanımlanır. Aşağıda genel değişken tanımlama örneği verilmektedir.
Public bLightsOn as Boolean
Form içinde Public deyiminin özel bir önemi vardır. Formun General Declarations
bölümünde Public deyimi ile tanımlanan değişkenler, programın her yerinden bu
formun bir özelliği gibi görünür. Örneğin frmMain formu içinde genel olarak
tanımlanan strMyName değişkenine, değer girildikten sonra bu formun dışında
herhangi bir yerde ihtiyaç duyulursa aşağıdaki şekilde erişilebilir.
strSomeString = frmMain.strMyName
Formlar ve modüller vb. program parçaları arasında bilgi alış verişi için genel
değişkenler kullanılır.
Eğer değişkene programın her yerinden erişme zorunluluğu yoksa kullanılacağı
yerde Dim deyimi ile yerel olarak tanımlanmalıdır.
Eğer değişken bir form veya modül içinde her yerde kullanılacaksa modül veya form
modülünün general declarations bölümünde Private deyimi ile tanımlanmalıdır.
Bunlara form veya modül değişkenleri de denir.
Yerel Değişkenler Tanımlamak
İlk bakışta programlarınızda kullanabileceğiniz tüm değişkenleri genel olarak
tanımlamayı tercih edebilirsiniz. Ama programlarınız büyüdükçe bunun uygun bir
yöntem olmadığını göreceksiniz. Programlarınızda yordamları çağırdıkça yordamlar
101
hafızay yüklenecek işleri bittikten sonra hafızadan silineceklerdir. Ancak bu
yordamlarla ilgili değişkenler genel oldukları için program bitene kadar hafızada
kalmaya devam edecekler bu da propgramınızın fazla sistem kaynağı kullanmasına
neden olacaktır. Farklı yordamlarda aynı isimli değişkenleri kullanmak isim
çakışmalarına hatta mantık hatalarına neden olacaktır..
Statik Değişkenler
Bir yordam içinde tanımlanan değişkenler yordamın çalışması bittiğinde Visual Basic
tarafından hafızadan silinirler. Bazen değişkenin değerini yordam bittikten sonra da
korumasına ihtiyaç duyarız. Bu durum yordamın son çağrılışında değişkenin aldığı
değeri kullanmak gerektiği hallerde karşımıza çıkar.
Yordamın çalışmasının bitmesinden sonra bile değerini koruyan değişkenler Static
deyimi ile tanımlanır. Bu tanım Visual Basic’e bu değişkenin sadece tanımlandığı
yordam içinde kullanılabileceğini fakat atanan değerleri programın çalışması boyunca
muhafaza edeceğini söyler. Örneğin aşağıdaki satırda statik bir tamsayı değişken
tanımlanmıştır.
Static iNumOfClicks as Integer
Statik değişkenin kullanımına iyi bir örnek olarak bir komut düğmesine kaç defa
tıklandığını bulmayı verebiliriz. Eğer tıklama sayısını Click() olay yordamı içinde yerel
olarak tanımlarsınız, her tıklamada olay yordamı çalıştırılacak yordamın bitmesiyle
birlikte değişken hafızadan silindiği için bir sonraki tıklamada önceki tıklama sayısına
ulaşılamıyacaktır.
Sub MyButton_Click()
Static iNumOfClicks as Integer
iNumOfClicks = iNumOfClicks + 1
MsgBox "Number of Clicks: " & CStr(iNumOfClicks)
End Sub
Sabitler
Değişkenler bilgisayarın hafızasına bilgi yükleme araçlarıdır. Bir diğer yükleme aracı
ise sabitlerdir. Sabitlerin özel bir kullanımı vardır. Sabitler tanımlanırken değer alırlar
ve aldıkları değer program boyunca değiştirilemez. Eğer değiştirilirse Visual Basic
102
Hata mesajı verir. Sabitler daha çok program içinde hatırlanması zor büyüklüklerin
yerine kullanılan anlaşılır ifadelerdir.
Const METER_TO_FEET = 3.3
Meters# = CDbl(InputBox("Enter a distance in meters"))
DistFeet# = Meters# * METER_TO_FEET
MsgBox "The distance in feet is: " & CStr(DistFeet#)
Visual Basic’in Sağladığı Sabitler
Visual Basic 4.0’den beri dil içerisindeki bir çok işlem için sabitler önceden
hazırlanmıştır. Örneğin renk tanımlama sabitleri, veri erişim sabitleri, şekil sabitleri
gibi. Visual Basic tarafından sağlanan sabitler vb öneki ile başlar. Bir çok
fonksiyonun ihtiyaç duyduğu sabitler, fonksiyonun yardım menüsünden öğrenilebilir.
Eğer bir sabitin değerini öğrenmek istiyorsanız araç çubuğu üzerindeki Object
Browser düğmesine tıklayın veya F2 tuşuna basın. Ekrana gelen Object Browser
diyalog kutusundaki listeden istediğiniz sabiti seçerek değerini alttaki metin alanından
görebilirsiniz.
Kendi Sabitlerinizi Tanımlamak
Visual Basic Bir çok işlem için gerekli sabitleri tanımlamasına rağmen bazen kendi
sabitlerinizi tanımlamaya ihtiyaç duyarsınız.Sabitler Const deyimi ile aşağıdaki
formata göre tanımlanır.
Const SABİT_İSMİ [As VERİTİPİ] = value
Bu cümle değişken tanımlama cümlesine benzemektedir. Farklı olarak atama işlemi de
tanımlama cümlesinde yapılmaktadır. Sabitin veri tipine uygun değer atanmalı string değerler
“ ”arasında yer almalıdır.
Atama Cümleleri
Değişkenleri etkin olarak kullanabilmek için onlara değer atamak ve bu değerler ile
işlem yapmak gerekir. Değişkeni tanımlamdan sonraki aşama değişkene değer
atamadır. Bu ise atama cümlesi ile olur. Atama işlemi = operatörü ile olur.
Operatörün solunda değer atancak değişken yazılır. Operatörün sağında değişkenin
veri tipine uygun bir değer veya bu değeri oluşturacak mantıksal veya aritmetik bir
ifade yazılır. Yazılan ifade gerektiği kadar karmaşık olabilir. Aşağıdaki örnekte farklı
atama cümleleri verilmiştir:
NumStudents% = 25
103
SumScores% = 2276
AvgScore% = SumScores% / NumStudents%
TopStudent$ = "Janet Simon"
BadStudent$ = txtStudent.Text
Formların ve kontrollerin özelliklerinden çoğunu değişken olarak düşünebilirsiniz.
Bunlara tasarım zamanında(kod yazılırken) değer atanabilir, çalışma zamanında(kod
çalıştırılırken) değerleri değiştirilebilir. Aşağıda buna bir örnek verilmiştir.
`Convert the third variable (which is an integer)
`to text and assign it to the text property of the
`TextBox for the result.
txtTotal.Text = CStr(z)
Atama cümlesinde atanan değerin veri tipi değişkenin veri tipi ile aynı veya uyumlu
değilse, tip uyuşumsuzluğu hatası( type mismatch error) verir. Aşağıda buna bir
örnek verilmiştir.
Dim x%
`Next line causes
`type mismatch error
x% = "Happy Birthday!"
6.b. String ve Tip Dönüşümü İşlemleri
6.b.1. String İşlemleri
a. Asc Fonksiyonu
Bu fonksiyon herhangi bir karaktersel bilginin ilk karakterinin ASCII kodunu bulmak
amacıyla kullanılmaktadır. Eğer katar sıfır uzunlukta ise, yani boş bir katarsa hata üretir.
Genel Yazılışı
Asc(karaktersel bilgi)
‘Asc(string)
Private Sub Form_Load()
Sonuc_1 = Asc ("A")
Sonuc_2 = Asc ("a")
Sonuc_3 = Asc ("Armut")
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
End Sub
b. Chr Fonksiyonu
104
Chr fonksiyonu dışarıdan parametre olarak değeri 0 ile 255 arasınsa değişen tamsayı bir değeri
almaktadır. Geriye bu sayının ASCII karakterini döndürür. 0....31 arasındaki kodlar aynı aralıktaki
ASCII karakter ile aynı işleve sahiptir ve görüntülenemezler. Chr$ kullanılırsa sonuç String,
kullanılmazsa Variant olur. Chr fonksiyonunun geriye döndürdüğü bilgi Variant tipindedir. Eğer
geriye karaktersel bilginin döndürülmesini istiyorsanız Chr yerine Chr$ fonksiyonu kullanabilirsiniz.
Chr(10) değeri MsgBox ve InputBox gibi fonksiyonlarda MsgBox’un birden çok satırda
görüntülenmesi için kullanılır.
Genel Yazılışı
Chr(ANSI kodu)
‘Chr(charcode)
Private Sub Form_Load()
Sonuc_1 = Chr (65)
Sonuc_2 = Chr (97)
Sonuc_3 = Chr (37)
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
End Sub
Private Sub Command1_Click()
Dim I, J, Msg, NL
NL = Chr(10)
For I = 1 To 2
For J = Asc("A") To Asc("Z")
Msg = Msg & Chr(J)
Next J
Msg = Msg & NL
Next I
MsgBox Msg
End Sub
c. LCase Fonksiyonu
Bu fonksiyon parametre olarak aldığı karaktersel bilginin içinde bulunan alfabetik karakterlerin
büyük olanlarını küçük harfe çevirmektedir.
LCase fonksiyonu geriye karaktersel bilginin yeni halini, yani büyük harflerin küçük harfe
çevrilmiş halini döndürür. LCase fonksiyonu kendisine parametre olarak verilen karaktersel bilginin
yalnızca alfabetik olan karakterleri üzerinde etkili olmaktadır. Harflerden başka karaktersel bilgi
dahilinde bulunacak rakamlar ve diğer karakterler üzerinde bir etkisi yoktur.
Genel Yaz ılışı
LCase ( karaktersel Bilgi)
‘LCase(string)
105
Visual Basic, Türkçe’ye özgü olan “I” ve “İ” harflerini LCase fonksiyonu ile
küçük harfe çeviremez.
Private Sub Form_Load()
Dim Sonuc_1, Sonuc_2
Sonuc_1 = "Merhaba Dünya1234"
Sonuc_2 = Lcase(Sonuc1)
Text1 = Sonuc_1
Text2 = Sonuc_2
End Sub
d. Left Fonksiyonu
Bu fonksiyon dışarıdan parametre olarak karaktersel bir bilgiyi, karaktersel bilgi içeren bir
değişkeni veya Variant tipli değişkeni alabilmektedir. Bu fonksiyon kendisine parametre olarak verilen
Variant veya karaktersel (String) tipli değişken veya sabit bilginin soldan itibaren istenilen kadarını
ayırmak, çıkarmak amacıyla kullanılmaktadır. Uzunluk değeri 0 ... 65535 arasında olmalıdır. 0
verilirse boş bir katar (“”) elde edilir. Katarın uzunluğuna eşit ya da ondan daha büyükse, katarın
tamamı döndürülür.
Genel Yazılışı
Left ( karaktersel ifade , uzunluk)
‘Left (string, length)
Private Sub Form_Load()
Karakter = "Merhaba Dünya"
Sonuc_1 = Left (Karakter, 1)
Sonuc_2 = Left (Karakter, 7)
Sonuc_3 = Left (Karakter, 20)
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
End Sub
Visual Basic’te Left fonksiyonu ile benzer işleve sahip olan Left$ adında bir fonksiyon daha vardır.
Left fonksiyonu geriye Variant tipte bilgi döndürür. Left$ fonksiyonu geriye String tipte bilgi
döndürmektedir. Ayrıca Left$ parametre olarak yalnızca Variant ve karaktersel bilgi içeren
değişkenleri parametre olarak kabul etmektedir. Dim bildiri deyimi ile declare edilmiş sayısal tipli
değişkenleri Left$ fonksiyonu parametre olarak kabul etmez.
e. Len Fonksiyonu
Len fonksiyonu yardımı ile kendisine parametre olarak verilen
karaktersel veya başka bir tip bilginin uzunluğu bulunur. Değişken Variant
106
tipinde ise, sonuç her zaman için verinin String olarak kaç byte yer kapladığını
belirtir. Arguman Null ise sonuç Null olur.
Genel Yaz ılışı
Len (karaktersel bilgi | variant) ‘Len (string | varname)
Len fonksiyonuna karaktersel bir sabit veya karaktersel bilgi içeren bir
değişkeni parametre olarak verecek olursanız geriye karaktersel bilgideki
karakter sayısı döndürülür.
Private Sub Form_Load()
Ad = "Avrupa"
Uzunluk1 = Len(Ad)
Uzunluk2 = Len("Avrupa")
Uzunluk3 = Len(“Cumhuriyet”)
Sonuc_1 = Uzunluk1
Sonuc_2 = Uzunluk2
Sonuc_3 = Uzunluk3
End Sub
f. LTtrim ve LTrim$ Fonksiyonları
Ltrim fonksiyonu kendisine parametre olarak verilen herhangi bir tipteki, LTrim$ ise
karaktersel tipteki veya Variant bilgilerinin baş tarafında bulunan boşlukları çıkarmak amacıyla
kullanılır. Parametre olarak alınan bilginin baş tarafında boşluklar varsa bunlar çıkarılır. Geriye
karaktersel bilgi veya değişkenin yeni hali döndürülür. Parametre olarak verilen karaktersel bilginin
baş tarafında hiçbir boşluk yoksa geriye bilginin kendisi döndürülür.
Genel Yazılışı
LTrim( karaktersel bilgi) ‘LTrim(string)
Private Sub Form_Load()
Sonuc_1 = "
Harita
"
Sonuc_2 = LTrim(Sonuc_1)
Sonuc_3 = LTrim(RTrim(Sonuc_1))
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
End Sub
g. Mid ve Mid$ Fonksiyonları
Bu iki fonksiyon kendilerine parametre olarak verilen karaktersel veya Variant bir bilginin
belirlenen bir kısmını ayırıp çıkarmak amacıyla kullanılır. Mid ve Mid$ fonksiyonları dışarıdan
parametre olarak üç bilgi almaktadır. Birinci parametrede verilen bilginin başlama yerinden itibaren
alınacak karakter sayısı kadarı alınarak geriye döndürülür. Mid fonksiyonu geriye Variant tipte bilgi
döndürürken Mid$ fonksiyonu geriye karaktersel tipte bilgi döndürmektedir. Alınacak veya geriye
döndürülecek karakter sayısını belirtmek amacıyla kullanılan 3. parametrenin kullanılması isteğe
bağlıdır. Alınacak karakter sayısı verilmezse, başlama yerinden karaktersel bilginin sonuna kadar olan
kısmı alınır.
Genel Yazılışı
Mid(karakter bilgi, başlama yeri, alınacak karakter sayısı ) ‘Mid(string, start[, length])
Kısım
Tanımlama
107
Karakter bilgi
Birinci parametre katar üretmede kullanılacak karakter bilgiyi belirtir.
Başlama yeri
İkinci parametre ise, üretme işleminin başlanılacağını konumu belirten
Long tipinde bir değerdir.
Alınacak karakter sayısı
Üçüncü parametre ise bu konumdan itibaren kaç karakterin esas
alınacağını belirten Long tipinde bir değerdir.
İkinci ve üçüncü parametrelerin değeri 1... 65535 arasında bir değer olabilir. Uzunluk belirtilmezse
ya da katar uzunluğundan daha büyük bir değer verilirse, başlama konumundan itibaren katarın geri
kalan kısmı üretilir. Başlama konumu, katarın uzunluğundan daha büyük bir değer olarak verilirse, boş
bir katar üretilir.
Private Sub Form_Load()
Katar = "Harita Genel Komutanlığı"
BirKelime = Mid(Katar, 1, 6)
İkiKelime = Mid(Katar, 8, 6)
ÜçKelime = Mid(Katar, 30)
Sonuc_1 = BirKelime
Sonuc_2 = İki.Kelime
Sonuc_3 = ÜçKelime
End Sub
h. Right Fonksiyonu
Çalışma mantığı yönünden Left fonksiyonuna çok benzeyen Right
fonksiyonu dışarıdan 2 parametre almaktadır. Bu fonksiyona ilk parametre
olarak dışarıdan karaktersel veya Variant tipte sabit bilgi veya değişkeni
verilmektedir. Bu fonksiyon kendisine parametre olarak verilen karaktersel
veya Variant tipli bilgi veya değişkenin içeriğinin sağdan itibaren istenilen
kadarını ayırmak, çıkarmak amacıyla kullanılmaktadır.
Genel Yazılışı
Right (karaktersel bilgi, uzunluk) ‘Right(string, length)
Private Sub Form_Load()
Karakter = "Merhaba Dünya"
bilgi
Sonuc_1 = Right(Karakter, 1)
Sonuc_2 = Right(Karakter, 5)
Sonuc_3 = Right(Karakter, 20)
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
'Karakter
End Sub
i. RTrim ve RTrim$ Fonksiyonları
RTrim fonksiyonu parametre olarak aldığı karaktersel bilginin arka tarafında yani sağında
bulunan boşlukları çıkarmak amacıyla kullanılmaktadır. Parametre olarak alınan karaktersel bilginin
arka tarafında boşluklar varsa bunlar çıkarılır. Parametre olarak verilen karaktersel bilginin arka
tarafında hiçbir boşluk yoksa, geriye bilginin ilk hali döndürülür.
108
Genel Yaz ılışı
RTrim ( karaktersel bilgi)
‘RTrim(string)
Veri tabanı dosyasına bilgi yazılırken pek nadir olarak karaktersel tipe sahip alanlar tam olarak
doldurulur. Genellikle alanın sonunda birkaç boşluk kalır. Veri tabanı dosyasından okunan bu bilgiler
ekrana veya yazıcıya yazdırılırken arkasındaki boşluklar istenmez. Bunun için RTrim fonksiyonu
kullanılır.
Private Sub Form_Click()
Dim Sonuc_1, Sonuc_2
Sonuc_1 = "
Harita
Sonuc_2 = RTrim(Sonuc_1)
Text1 = Sonuc_1
Text2 = Sonuc_2
"
End Sub
Private Sub Form_Load()
Open “Adres.dat” For Random As #1 Len = Len(Alanlar)
KayıtNo = LOF(1) / Len (Alanlar)
KayıtNo = InputBox (“ Okunacak Kayıt No”)
Get #1, KayıtNo, Alanlar
Show
Print Alanlar.Ad; Alanlar.Soyad
DÜNYA
Print RTrim(Alanlar.Ad) ; Alanlar.Soyad
DÜNYA
End Sub
‘ Merhaba
‘ Merhaba
j. Space Fonksiyonu
Belirtilen sayıda boşluk karakterlerinden oluşan bir katar üretir. $ kullanılırsa sonuç String
kullanılmazsa Variant olur. Parametre değeri 0...65535 arasında bir Long değeridir.
Genel Yazılışı
Space(sayı) ‘Space(number)
Private Sub Form_Click()
Dim Sonuc_1, Sonuc_2
Sonuc_1 = "Merhaba Dünya"
Sonuc_2 = "Merhaba" & Space(10) & "Dünya"
Text1 = Sonuc_1
Text2 = Sonuc_2
End Sub
k. Spc Fonksiyonu
Bu fonksiyon boşluk oluşturmak amacıyla kullanılır. Print# deyiminde ya da Print yönteminde
belirtilen sayıda boşluk bırakır. Program içinde ne kadar boşluk oluşturulmak isteniyorsa, boşluk
109
sayısı Spc fonksiyonuna parametre olarak verilemelidir. Spc fonksiyonu dışarıdan parametre olarak
sayısal bir bilgi almaktadır. Bu fonksiyona parametre olarak verilen tam sayısal bilgi 0 ile 255
arasında bir değer olabilir.
Genel Yazılışı
Spc(boşluk sayısı) ‘ Spc(n)
Private Sub Form_Click()
Dim Mesaj
Mesaj =”Visual Basic”
Print Spc(10) ; Mesaj
End Sub
l. Str$ Fonksiyonu
Str$ fonksiyonu ile sayısal bir bilgi karaktersel bilgi tipine çevrilir. Geriye Sonuç bilginin
Variant olması isteniyorsa Str$ yerine Str fonksiyonu kullanılmalıdır. Str fonksiyonu dışarıdan
parametre olarak karaktersel bilgi tipine çevrilecek sayısal bir bilgiyi almaktadır.
Genel Yazılışı
Str(Sayısal Bilgi)
‘Str(number)
Private Sub Form_Load()
Sonuc_1 = Str (459)
Sonuc_2 = Str (-459.65)
Sonuc_3 = Str (459.001)
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
End Sub
m. StrComp Fonksiyonu
Bu fonksiyondan karaktersel veya Variant tipteki iki sabit bilgiyi veya bilgi içeren iki
değişkeni birbiri ile karşılaştırmak için yararlanılır. Bu fonksiyon dışarıdan biri seçimlik olan 3
parametre almaktadır. Birinci parametrede verilen bilgi, ikinci parametrede verilen bilgi ile
karşılaştırılır. Geriye karşılaştırmanın sonucu ile ilgili bir değer döndürür. Karşılaştırılan ilk bilgi,
ikinci bilgiden büyük veya küçükse yani eşit değilse geriye1, bilgiler birbirine eşitse 0 değeri
döndürür. Karşılaştırılan her iki bilgi Null ise geriye Null değeri döndürülür.
Genel Yazılışı
StrComp(1.Bilgi, 2.Bilgi, Karşılaştırma şekli) ‘ StrComp(string1, string2[, compare])
Kısım
Tanımlama
Karaktersel bilgi1 (String1)
Karaktersel bir ifade
Karaktersel bilgi2 (String2)
Karaktersel bir ifade
Karşılaştırma (Compare)
Üçüncü parametre ise karşılaştırma yöntemini belirler. 0..2 arasında bir
110
değer almalıdır
0 ise küçük ve büyük harf ayrımı yapılmaz,
1 ise küçük ve büyük harf ayrımı yapılır
Private Sub Form_Load()
Bilgi1 = "ABCD": Bilgi2 = "abcd"
Sonuc_1 = StrComp(Bilgi1, Bilgi2, 1)
Sonuc_2 = StrComp(Bilgi1, Bilgi2, 0)
Sonuc_3 = StrComp(Bilgi2, Bilgi1)
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
End Sub
Private Sub Form_Load()
Kitap1 = “ Visual Basic”
Kitap2 = “Access”
Sonuc = StrComp(Kitap1,Kitap2)
If Sonuc = 0 Then
MsgBox “Bilgiler birbirine eşit”
Else
MsgBox “Bilgiler birbirine eşit değil”
End If
End Sub
n. String Fonksiyonu
Yaptıkları işlev bakımından birbirine çok benzeyen String ve String$ fonksiyonları, bir
karakterin istenilen sayıda ekrana veya yazıcıya arka arkaya tekrarlanarak yazılmasını sağlar. Sonuna
“$” işareti konulan String$ fonksiyonu geriye karaktersel bilgi döndürürken String fonksiyonu geriye
Varient tipte bilgi döndürmektedir.
Genel Yazılışı
String(sayı, karakter)
‘String(number, character)
Sring$ fonksiyonu dışarıdan parametre olarak iki adet bilgi almaktadır. Birinci parametre tekrar
sayısıdır ve en fazla 65.525 değerini alabilir. İkinci parametre ile tekrarlanarak yazılacak karakter veya
karakter içeren değişkenin adı verilmektedir. İkinci parametre olarak doğrudan karakter yerine
istenirse karakteri temsil eden Ascii kodu da yazılabilir. İkinci parametre olarak bir katar
belirtiliyorsa, katarın ilk karakteri alınır. Kod 0...255 arasındadır. Daha büyük bir değer verilirse
256’ya bölümünden kalan esas alınır.
111
Private Sub Form_Load()
Sonuc_1 = String (8, "*")
Sonuc_2 = String (5, 42)
Sonuc_3 = String (10, "ABC")
Text1 = Sonuc_1
Text2 = Sonuc_2
Text3 = Sonuc_3
End Sub
o. Tab Fonksiyonu
Tab fonksiyonu ile Print deyimi öncesi ekranın satır bazında bilgi yazılacak yerini belirlerken
geçerli font ve punto değeri ile birlikte o anda geçerli olan Formun boyutları göz önüne alınmalıdır. En
az 1 değerini girebilirsiniz. En çok ise çıktı dosyasının genişliği girilebilir. Daha geride konum
belirtilirse, bir alt satırda belirtilen konuma gider.1‘den küçük bir değer girilirse ilk sütuna geçilir.
Satır genişliğinden daha büyük bir konum değeri belirtilirse satır genişliğine bölümünden kalan değer
esas alınır.
Genel Yazılışı
Tab(ekranın bilgi yazılacak sütunu) ‘Tab[(n)]
Private Sub Form_Click()
Mesaj = " Visual Basic"
Print Tab(10); Mesaj
Print Tab(20); Mesaj
End Sub
p. Trim Fonksiyonu
Bu fonksiyon parametre olarak aldığı karaktersel bilginin hem başında hem de sonunda yer
alan boşlukları çıkarıp bilginin yeni şeklini geriye döndürür. Karaktersel bilgiyi hem RTrim hem de
LTrim fonksiyonunun etkisine maruz bırakmak yerine her iki fonksiyonunun yaptıklarını bir seferde
tek başına yapabilen Trim fonksiyonu kullanılır.
Genel Yaz ılışı
Trim ( karaktersel bilgi) ‘Trim(string)
Private Sub Form_Click()
Dim Sonuc_1, Sonuc_2
Sonuc_1 = "
Harita
Sonuc_2 = Trim(Sonuc_1)
Text1 = Sonuc_1
Text2 = Sonuc_2
End Sub
"
r. UCase$ Fonksiyonu
112
Bu fonksiyon parametre olarak aldığı karaktersel bilgilerin içinde bulunan küçük harfleri
büyük harfe çevirir.
Genel Yazılışı
UCase ( karaktersel bilgi) ‘UCase(string)
Ucase fonksiyonu geriye karaktersel bilginin yeni halini, yani küçük harflerin büyük harfe
çevrilmiş halini döndürür. Ucase fonksiyonu kendisine parametre olarak verilen karaktersel bilginin
yalnızca alfabetik olan karakterleri üzerinde etkili olmaktadır. Harflerden başka karaktersel bilgi
dahilinde bulunacak rakamlar ve diğer karakterler üzerinde bir etkisi yoktur. Visual Basic, Türkçe’ye
özgü olan “ı” ve “i” harflerini UCase fonksiyonu ile büyük harfe çeviremez.
Private Sub Form_Click()
Dim Sonuc_1, Sonuc_2
Sonuc_1 = "Dünya1234"
Sonuc_2 = UCase(Sonuc_1)
Text1 = Sonuc_1
Text2 = Sonuc_2
End Sub
s. Val Fonksiyonu
Bu fonksiyon karaktersel bir bilginin sayısal bilgiye dönüştürülmesi amacıyla
kullanılmaktadır.
Genel Yazılışı
Val (karaktersel bilgi) ‘Val(string)
Val fonksiyonu parametre olarak aldığı karaktersel bilginin sayısal bilgiye çevrilebilen kısmını
ondalık noktaları ile birlikte sayısal bilgiye çevirerek geriye döndürür. Sayısal bilgi tipine çevrilmek
istenen karaktersel bilginin içinde alfabetik karakterler varsa çevirme işlemi ilk alfabetik karaktere
rastlayıncaya kadar yapılır. Boşluk. Tab ve LF karakterleri dikkate alınmaz. Sonuç Double tipindedir.
Private Sub Form_Click()
Sonuc1 = Val("123.456")
Sonuc2 = Val("123adana")
Sonuc3 = Val("A15")
Sonuc4 = Val("11A21")
Sonuc5 = Val("2457")
Sonuc6 = Val(" 2 45 7")
Sonuc7 = Val("24 and 57")
Text1 = Sonuc1
Text2 = Sonuc2
Text3 = Sonuc3
Text4 = Sonuc4:Text5 = Sonuc5
Text6 = Sonuc6:Text7 = Sonuc7
End Sub
113
6.b.2. Tip Dönüşümü İşlemleri
a. CCur Fonksiyonu
Parametre değerini Currency tipine dönüştürür.
Genel Yazılışı
CCur(ifade) ‘CCur(expression)
Private Sub Form_Load()
Dim MyDouble, Sonuc
MyDouble = 543.214588
Sonuc = CCur(MyDouble * 2)
Text1 = Sonuc
End Sub
b. CBool Fonksiyonu
Parametre değerini Boolen tipine dönüştürür.
Genel Yazılışı
CBool(ifade) ‘ CBool(expression)
Private Sub Form_Click()
Dim A, B, Check
A = 5: B = 5
Sonuc = Cbool(A = B)
Text1 = Sonuc
A = 0
Sonuc = Cbool(A) :
Text2 = Sonuc
End Sub
c. CByte Fonksiyonu
Parametre değerini Byte tipine dönüştürür.
Genel Yazılışı
CByte(ifade) ‘CByte(expression)
Private Sub Form_Click()
Dim MyDouble, Sonuc
MyDouble = 125.5678
Sonuc = CByte(MyDouble)
Text1 = MyByte
End Sub
d. CDbl Fonksiyonu
Parametre değerini Double tipine dönüştürür.
Genel Yazılışı
CDbl(ifade) ‘CDbl(expression)
114
Private Sub Form_Click()
Dim MyCurr, Sonuc
MyCurr = Ccur(234.456784)
Sonuc = CDbl(MyCurr * 8.2 * 0.01)
Text1 = Sonuc
End Sub
e. Clnt Fonksiyonu
Parametre değerini Integer tipine dönüştürür.
Genel Yazılışı
Clnt(ifade) ‘Clnt(expression)
Private Sub Form_Click()
Dim MyDouble, MyInt
MyDouble = 2345.5678
Sonuc = Clnt(MyDouble)
Text1 = Sonuc
End Sub
f. CLng Fonksiyonu
Parametre değerini Long tipine dönüştürür.Bu çevirme esnasında yuvarlama yapılır.
Genel Yazılışı
CLng(ifade) ‘CLng(expression)
Private Sub Form_Click()
Dim MyVal1, MyVal2, Sonuc1, Sonuc2
MyVal1
=
25427.45:
MyVal2
=
25427.55
Sonuc1 = CLng(MyVal1)
Sonuc2 = CLng(MyVal2)
Text1 = Sonuc1 : Text2 = Sonuc2
End Sub
g. CSng Fonksiyonu
Parametre değerini Single tipine dönüştürür.
Genel Yazılışı
CSng(ifade) ‘CSng(expression)
115
Private Sub Form_Click()
Dim MyDouble1, MyDouble2, Sonuc1,
Sonuc2
MyDouble1 = 75.3421115
MyDouble2 = 75.3421555
Sonuc1 = CSng(MyDouble1)
Sonuc2 = CSng(MyDouble2)
Text1 = Sonuc1
Text2 = Sonuc2
End Sub
h. CStr Fonksiyonu
Parametre değerini String tipine dönüştürür.
Genel Yazılışı
CStr(ifade) ‘CStr(expression)
Private Sub Form_Click()
Dim MyDouble, Sonuc
MyDouble = 437.324
Sonuc = CStr(MyDouble)
Text1 = Sonuc
End Sub
i. CVar Fonksiyonu
Parametre değerini Variant tipine dönüştürür.
Genel Yazılışı
CVar(ifade) ‘CVar(expression)
Private Sub Form_Click()
Dim MyInt, Sonuc
MyInt = 4534
Sonuc = CVar(MyInt & "000")
Text1 = Sonuc
End Sub
7.Görsel Programlama Dilinin Diğer Elemanlar
7.a. Temel İşlemler
Aritmetik
Description
Üs alma
Çıkarma
Karşılaştırma
Symbo
Description
l
^
Eşitlik
Eşit değil
116
Mantıksal
Symb
ol
=
<>
Description
Değil
Ve
Symb
ol
Not
And
Çarpma
Bölme
*
/
Küçük
Büyük
Tam Bölme
\
Küçük eşit
<=
Mod
Büyük eşit
>=
Modulus
arithmetic
Toplama
+
String
concatenation
&
<
>
Object
equivalence
Veya
Logical exclusion
Logical
equivalence
Logical
implication
Or
Xor
Eqv
Imp
Is
1. Aritmetik İşlemler
a. Üs Alma (^) Operatörü
Bir sayının üssü alınmak istenirse “^” operatöründen yararlanılır.
Genel Yazılışı
Sayısal Bilgi ^ Sayısal Bilgi
Sayısal Değişken
^ Sayısal Değişken
Sonuc = 3 ^ 2
Sonuc = 10 ^ 0
‘ 9
‘ 1
Sonuc = 10 ^ -2
‘ 0.01
Sonuc = 10 ^ 10
‘ 1000
b. Çıkarma (-) Operatörü
Çıkarma operatörü günlük hayattaki kullanımından farklı değildir. Sayısal bir bilgiden bir
başkasını çıkarmak amacıyla kullanılır.
Genel Yazılışı
Sayısal Bilgi - Sayısal Bilgi
Sayı
Sayı
Sayı
= 20 – 10
= Sayı – 5
= SQR(36) – 4
‘ 10
‘ 5
‘ 2
c. Çarpma (*) Operatörü
Çarpma operatörü verilecek iki sayısal bilgiyi birbiri ile çarpar. Çarpma işleminin sonucunu
bir fonksiyona parametre olarak verebiliriz.
117
Genel Yazılışı
Sayısal Bilgi * Sayısal Bilgi
Sayı = 10 * 20
Sayı = SQR(36) * 4
‘ 200
‘ 24
d. Bölme (/) ve Tam Bölme (\) Operatörü
Bölme “/” operatörü kendisine verilecek iki sayısal bilgiden birincisini ikinciye böler. Bölme işlemi
sonucu bulunacak değerin tam sayı olması isteniyorsa bu kez “\” operatörü kullanılır.
Genel Yazılışı
Sayısal Bilgi /
Sayısal Bilgi
Bölme işlemi dışarıdan parametre olarak iki sayısal değer alır. Bu sayısal değerlerden ikincisinin
mutlaka sıfırdan farklı olması gerekir. İkinci değerin veya parametrenin sıfır olması halinde hata
meydana gelir ve programın çalışması kırılır.
Bölme işlemini yapmak üzere dışarıdan alınan bu iki parametreden birincisi ikinciye bölünür.
Geriye bölme işleminin sonucu döndürülür. Döndürülen bu değeri yakalamak için yine sayısal bir
değişken kullanılır. İstenirse döndürülen bu değer sayısal işlem yapan bir fonksiyona veya çıkış
deyimine parametre olarak aktarılır.
Bölme işlemi ile elde edilecek bilginin tipi, bölen ve bölünen bilginin tipine bağlı olarak değişir.
Eğer hem bölünen hem de bölen Integer ise sonuç Single tipte olur. Bölünen değer ve bölen değer
Single ise çıkacak sonuç yine single tipte olur. Bölme işleminde kullanılan bilgilerden biri Long veya
Double ise bölme işlemi bulunacak sonuç yine Double olur. Bölme işlemi ile bulunan değerin ondalık
noktadan sonraki kısmına gerek duyulmuyorsa, ya Int() fonksiyonundan ya da normal bölme operatörü
yerine tam bölme operatöründen yararlanılır. “\” operatörü ile yapılan bölme işlemlerinde sürekli
olarak tam sayı değerler elde edilir.
118
Sayı = 20/10
‘ 2
Sayı = 12.555 \ 2
‘ 3
Sayı = 10 \ 3
kullanılır)
‘ 3
(Sonucun tam sayı olması için \
e. Mod Operatörü
İki sayının bölümünden artanı döndürür.
Genel Yazılışı
Sonuç = sayı1 Mod sayı2 ‘ result = number1 Mod number2
Dim MyResult
MyResult = 10 Mod 5
' 0 döndürür.
MyResult = 10 Mod 3
' 1 döndürür.
MyResult = 12 Mod 4.3
' 0 döndürür.
MyResult = 12.6 Mod 5
' 3 döndürür.
f. Toplama (+) Operatörü
+ operatörü kendisine parametre olarak verilecek iki sayısal veya karaktersel bilgileri toplar.
Toplanacak bilgiler direk olarak yazılıp toplanacağı gibi, değişkenler aracılığı ile toplama işlemi
yapılabilir.
Genel Yazılışı
Sayısal Bilgi +
Sayısal Bilgi
Karaktersel Bilgi + Karaktersel Bilgi
Sayı = 10 + 25
Sayı = Sayı + 5
‘ 35
‘ 40
Sonuc = SQR(100) + 10
Sonuc = SQR(36) + SQR(16)
‘ 20
‘ 10
119
Sonuc = SQR(30 + SQR(16)) + 10
‘ 16
Aşağıda iki ayrı karaktersel bilgiyi “+” operatörü ile birleştirelim.
Sonuc = “Visual” + “Basic” ‘ Visual Basic
Karaktersel bilgileri birbirine eklemek için toplama (+) operatörü yerine birleştirme (&) operatörü
kullanabilirsiniz.
Sonuc = “Visual” & “ “&”Basic” ‘ Visual Basic
g. & Operatörü
İki karaktersel ifadeyi birleştirir.
Genel Yazılışı
Sonuç = ifade1 & ifade 2 ‘result = expression1 & expression2
Dim MyStr
MyStr = "Hello" & " World"
' Hello World" döndürür.
MyStr = "Check " & 123 & " Check"
'"Check 123 Check" döndürür.
2. Karşılaştırma İşlemleri
a. Eşitlik ve Atama = Operatörü
= operatörü ile iki bilginin birbirine eşitliği değerlendirilip geriye eşitlik hakkında mantıksal bir
sonuç döndürür. Döndürülecek mantıksal sonucun doğru (True) olabilmesi için karşılaştırılan veya
birbirine eşitliği araştırılan her iki bilginin de birbirine eşit olması gerekir. Karşılaştırılan bilgiler
karaktersel, tarihsel, mantıksal veya sayısal veri tipinde olabilir.
Genel Yazılışı
İfade1 = İfade2
Karşılaştırılan ifadelerden birinin diğerine eşit olmaması halinde geriye mantıksal yanlış değeri
döndürülür. Yukarıdaki paragrafta belirtildiği gibi Visual ve diğer Basic sürümlerinde “=” karakteri iki
120
amaç için kullanılmaktadır. Birincisinde = karakteri bir değişkene bilgi aktarmak amacıyla kullanılır.
Bunun için önce bilgi aktarılacak değişkenin adı ve ardından “=” karakteri yazılır. Değişkene
aktarılacak bilgi en son yazılır. Değişkene aktarılacak bilgi tipi değişkenin tipine göre değişir.
Bilindiği gibi karaktersel sabitler çift tırnak (“”) içine alınır. Bir değişkene = operatörü ile aktarılan
bilgi doğrudan yazılabileceği gibi bir değişkenin içeriği de olabilir.
= operatörünün hangi amaçla kullanıldığı, program içinde kullanıldığı yere bağlı olarak değişir.
“=” ile yapılan atama işleminden önce IF gibi mantıksal bir değeri parametre olarak kullanılan
deyimlerden birinin kullanılması halinde = operatörü yerine eşitlik görevini üstlenir.
Sayı = 323
IF Sayı = 525
‘ Sayı değişkenine 323 sabit değeri atanır
Then
‘ Sayı değişkeninin 525 içerip içermediğine bakılır.
b. Eşit değil <> Operatörü
İki bilginin birbirine eşitliğini değerlendirip geriye eşitlik hakkında mantıksal bir sonuç
döndürülür. Döndürülecek mantıksal sonucun doğru (True) olabilmesi için karşılaştırılan veya
birbirine eşitliği araştırılan her iki bilginin de birbirine eşit olması gerekir. Karşılaştırılan bilgiler
karaktersel, tarihsel, mantıksal veya sayısal veri tipinde olabilir.
Genel Yazılışı
İfade1 <> İfade2
Karşılaştırılan bilgiler karaktersel, tarihsel, mantıksal veya sayısal veri tipinde olabilir.
121
Sonuc = “123” <> “123”
Sonuc = “Adana” <> “Adana”
Sonuc = 12 <> 21
‘ True (-1)
‘ False (0)
‘ True (-1)
Karşılaştırılan ifadelerden birinin diğerine eşit olmamsı halinde geriye mantıksal yanlış değeri
döndürülür.
c. Küçüktür “<” Operatörü
“<” operatörü üzerinde işlem yapmak üzere dışarıdan iki bilgi-ifade alır. Bu bilgiler
karaktersel, mantıksal veya sayısal veri tipinde olabilir. Birinci bilginin ikinci bilgiden küçük olup
olmadığı araştırılır. Birinci bilgi ikinci bilgiden küçükse, geriye mantıksal doğru, değilse mantıksal
yanlış değeri döndürür.
Genel Yazılışı
İfade1 < İfade2
Sonuc
Sonuc
Sonuc
Sonuc
= “A” < “a”
= “a” < “Z”
= 12 < 10
= “Ada” < “Adana”
‘
‘
‘
‘
True
False
False
True
d. Büyüktür “>” Operatörü
“>” operatörü diğer karşılaştırma operatörlerinde olduğu gibi üzerinde işlem yapmak üzere
dışarıdan iki bilgi-ifade alır. Bu bilgiler karaktersel, mantıksal veya sayısal veri tipinde olabilir. Birinci
bilginin ikinci bilgiden büyük olup olmadığı araştırılır. Birinci bilgi ikinci bilgiden büyükse, geriye
mantıksal doğru, değilse mantıksal yanlış değeri döndürür.
Genel Yazılışı
İfade1 > İfade2
Sonuc
Sonuc
Sonuc
= “A” > “a”
= “a” > “Z”
= 12 > 10
‘ False
‘ True
‘ True
122
e. Küçük eşit “<=” Operatörü
İki bilginin birbirine eşitliğini ve birincinin ikinciden küçüklüğünü değerlendirip geriye eşitlik
ve küçüklük hakkında mantıksal bir sonuç döndürür. Döndürülen mantıksal sonucun doğru olabilmesi
için karşılaştırılan veya birbirine eşitliği araştırılan birinci bilginin ikinciden küçük veya eşit olması
gerekir. Karşılaştırılan bilgiler karaktersel, mantıksal veya sayısal veri tipinde olabilir.
Genel Yazılışı
İfade1 <= İfade2
Karşılaştırılan ifadelerden birincinin ikinciden büyük olması halinde birincinin ikinciye eşit olup
olmadığına bakılmaksızın geriye mantıksal yanlış değeri döndürülür.
Sonuc =
12 <= 10
‘ False
Sonuc =
20 <= 30
‘ True
f. Büyük eşit “>=” Operatörü
İki bilginin birbirine eşitliğini ve birincinin ikinciden büyüklüğünü değerlendirip geriye eşitlik
ve büyüklük hakkında mantıksal bir sonuç döndürür. Döndürülen mantıksal sonucun doğru olabilmesi
için karşılaştırılan veya birbirine eşitliği araştırılan birinci bilginin ikinciden büyük veya eşit olması
gerekir. Karşılaştırılan bilgiler karaktersel, mantıksal veya sayısal veri tipinde olabilir.
Genel Yazılışı
İfade1 >= İfade2
Karşılaştırılan ifadelerden birincinin ikinciden küçük olması halinde birincinin ikinciye eşit olup
olmadığına bakılmaksızın geriye mantıksal yanlış değeri döndürülür.
Sonuc =
12 >= 10
‘ True
Sonuc =
20 >= 30
‘ False
123
g. Eşdeğer “Is” Operatörü
Bahsedilen iki değişken objeyi karşılaştırır.
Genel Yazılışı
result = object1 Is object2
Dim A As New Form1
Dim B As Form
Private Sub Form_Click()
If A Is B Then
Msg = " A ve B aynı formdan sözeder."
Else
Msg = " A ve B aynı formdan söz etmez"
End If
MsgBox Msg
Set B = A
If A Is B Then
Msg = " A ve B aynı formdan sözeder."
Else
Msg = " A ve B aynı formdan söz etmez"
End If
MsgBox Msg
End Sub
3. Mantıksal İşlemler
a. NOT (değil) Operatörü
NOT operatörü mantıksal bir koşulla birlikte kullanılır. Birlikte kullanılan mantıksal koşul
doğru (True) değerine sahipse NOT operatörü geriye mantıksal yanlış (False) , NOT ile birlikte
kullanılan koşul yanlış (False) değerine sahipse geriye mantıksal doğru (True) döndürülür. Yani NOT
operatörü sürekli olarak birlikte kullanılan mantıksal değerin tersini döndürmektedir.
Genel Yazılışı
NOT <Koşul>
Sonuc
Sonuc
Sonuc
Sonuc
Sonuc
=
=
=
=
=
True AND Not True
True AND Not False
False AND Not False
True OR Not True
False OR Not False
‘
‘
‘
‘
‘
0
-1
0
-1
–1
Örnek olarak açık olan bir dosyanın numarasını parametre olarak EOF() fonksiyonu
dosyanın sonuna gelindiği zaman geriye mantıksal doğru değerini döndürür. Ancak dosyalar
124
üzerinde kayıt ekleme hariç yapılan bütün işlemler dosyanın sonuna gelindiği sürece yapılabilir.
Onun için her işlemden sonra dosyanın sonuna gelinip gelinmediği EOF() fonksiyonu ile
araştırılır. Bu durumda EOF() fonksiyonunun geriye döndürdüğü değerin IF veya DO WHILE
gibi bir deyime parametre olarak verilebilmesi için NOT operatörü ile olumsuz yapılması
gerekir.
DO WHILE NOT EOF (DosyaNo)
......
LOOP
b. AND (ve) Operatörü
And operatörü ile mantıksal iki koşulu birlikte değerlendirip yine mantıksal bir sonuç
döndürülür. Döndürülecek mantıksal sonucun doğru (True) olabilmesi için birlikte değerlendirilen her
iki koşulun da doğru olması gerekir.
Genel Yazılışı
Mantıksal Koşul_1 AND Mantıksal Koşul_2
Mantıksal koşullardan birinin yanlış (False) olması halinde geriye mantıksal yanlış değeri
döndürülür. Döndürülen değeri başka bir mantıksal değişkene veya mantıksal parametre alan bir
fonksiyona parametre olarak aktarabilirsiniz.
DO WHILE NOT EOF (DosyaNo) AND DEVAM = “E”
........
LOOP
Bu program parçasında DO WHILE – LOOP döngüsünün sürmesi iki koşula bağlıdır. Birinci
koşulda dosya sonuna gelinip gelinmediğini değerlendiren EOF() fonksiyonunun mantıksal yanlış
(false) değerini vermesi ve ikinci koşulda ise DEVAM değişkenin “E” değerini içermesi isteniyor.
Döngünün devam edebilmesi için her iki koşulun da doğru değere sahip olması gerekiyor. Visual
Basic’te mantıksal yanlış değeri 0 ve mantıksal doğru değeri ise –1 ile gösterilmektedir.
Sonuc = True And True
Sonuc = True And False
Sonuc = False And True
‘ –1
‘ 0
‘ 0
125
Sonuc = False And False
‘ 0
Son iki satırda ikinci koşula bakılmadan geriye mantıksal yanlış (.F.) değeri döndürülür. Çünkü
geriye mantıksal yanlış değeri döndürmek için koşullardan birinin yanlış olması yeterlidir. Aşağıda
AND mantıksal operatörüne parametre olarak verilecek koşulların sonucuna göre “And” ile yapılacak
mantıksal değerlendirilmelerin sonuçları aşağıda gösterilmiştir.
1.İfade
2.İfade
Sonuç
True
True
True
True
False
False
True
Null
Null
False
True
False
False
False
False
False
Null
False
Null
True
Null
Null
False
False
Null
Null
Null
Private Sub Form_Click()
Dim A, B, C, Msg
A = 10: B = 8: C = 6
If A > B And B > C Then
Msg = " Her iki ifade True döndürür"
Else
Msg = " Bir veya iki ifade False döndürür"
End If
MsgBox Msg
End Sub
c. .OR. (veya) Operatörü
126
Mantıksal İki koşulu birlikte değerlendirip yine mantıksal bir sonuç döndürülür. Döndürülecek
mantıksal sonucun doğru (True) olabilmesi için birlikte değerlendirilen iki koşuldan birinin doğru
olması yeterlidir.
Genel Yazılışı
Mantıksal Koşul_1 .OR.. Mantıksal Koşul_2
Mantıksal koşullardan ikisinin de yanlış (false) olması halinde geriye mantıksal yanlış değeri
döndürülür. Döndürülen değeri başka bir mantıksal değişkene veya mantıksal değerler alabilen bir
fonksiyona parametre olarak aktarabilirsiniz.
DO WHILE SEHIR = “ADANA” OR. DEVAM =”E”
........
LOOP
Bu program parçasında DO WHILE –LOOP döngüsünün sürmesi iki koşuldan birisinin doğru
olmasına bağlıdır. Birinci koşulda SEHIR alanının “ADANA” bilgisini içermesi isteniyor. İkinci
koşulda ise DEVAM değişkeninin “E” değerini içermesi isteniyor.
Sonuc = True OR True
‘ –1
Sonuc = True OR False ‘ –1
Sonuc = False OR False ‘ 0
Birlikte değerlendirilen koşullardan birincisinin doğru olması halinde ikinci koşula bakılmaksızın
geriye mantıksal doğru (True) değeri döndürülür. Çünkü geriye doğru değerini döndürmek için
koşullardan birinin doğru olması yetiyor.
d. Xor Operatörü
İki ifade üzerinde mantıksal karşılaştırma yapar.
Genel Yazılışı
Sonuç = İfade1 Xor İfade2 ‘ [result =] expression1 Xor expression2
If İfade1 is
True
True
False
False
And İfade2 is
True
False
True
False
Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null
' Initialize variables
MyCheck = A > B Xor B > C
' False
127
Sonuç
False
True
True
False
MyCheck = B > A Xor B > C
' True
MyCheck = B > A Xor C > B
' False
MyCheck = B > D Xor A > B
' Null
MyCheck = A Xor B
' 2 (bitwise comparison)
e. Eqv Operatörü
İki ifade üzerinde mantıksal karşılaştırma yapar.
Genel Yazılışı
Sonuç = İfade1 Imp İfade2 ‘result = expression1 Eqv expression2
If İfade1 is
True
True
False
False
Dim A, B,
A = 10: B
MyCheck =
MyCheck =
MyCheck =
MyCheck =
C, D, MyCheck
= 8: C = 6: D
A > B Eqv B >
B > A Eqv B >
A > B Eqv B >
A Eqv B
And İfade2 is
True
False
True
False
= Null
C
C
D
Sonuç
True
False
False
True
' Initialize variables.
' True
' False
' Null
'-3 (bitwise comparison)
Private Sub Form_Click()
Dim A, B, C, Msg
A = 10: B = 8: C = 6
If A > B Eqv B > C Then
Msg = " Her iki ifade True veya False döndürür"
Else
Msg = " Bir ifade True ve diğer False döndürür"
End If
MsgBox Msg
End Sub
f. Imp Operatörü
İki ifade üzerinde mantıksal karşılaştırma yapar.
Genel Yazılışı
Sonuç = İfade1 Imp İfade2 ‘result = expression1 Imp expression2
If İfade1 is
True
True
True
False
And İfade2 is
True
False
Null
True
128
Sonuç
True
False
Null
True
False
False
Null
Null
Null
False
Null
True
False
Null
Dim A, B, C, D, MyCheck
A = 10: B = 8: C = 6: D = Null
MyCheck = A > B Imp B > C
'
MyCheck = A > B Imp C > B
'
MyCheck = B > A Imp C > B
'
MyCheck = B > A Imp C > D
'
MyCheck = C > D Imp B > A
'
MyCheck = B Imp A
Private Sub Form_Click()
Dim A, B, C, Msg
A = 10: B = 8: C = 6
If A > B Imp B > C Then
Msg = " True döndürür."
Else
Msg = " False döndürür."
End If
MsgBox Msg
True
True
True
Null
Null
True
False
True
True
Null
'-1 (bitwise comparison)
End SubEnd Sub
7.b.Blok Kontrol Deyimleri
Visual Basic gelişmiş yapısal programlama dillerinde bulunan bütün blok kontrol deyimlerine
sahiptir. Visual Basic programları dahilinde programın bir yerinden başka bir yerine atlama
önerilmediğinden Visual Basic tarafından çizilen modern ve yapısal program geliştirme çerçevesine
uyum sağlamak gerekir. Visual Basic dahilinde kullanılabilecek program kontrol ve döngü
deyimlerinin bazıları şunlardır.
IF – ELSEIF – ELSE – ENDIF
IIF () FONKSİYONU
DO – LOOP
SELECT CASE – END SELECT
FOR – NEXT
WHILE –WEND
GOSUB... RETURN
1. If-Endif Deyimi
IF deyimi, programın akışı IF deyimi ile birlikte verilen koşula bağlı olarak belirlenen veya
ELSE, ELSEIF veya ENDIF deyimleri ile oluşturulan işlem bloğuna geçmesini veya söz konusu
program bloğunun işletilmeyip atlatılmasını sağlar. If deyimi ile birlikte ELSEIF ve ELSE eklerinin
129
kullanılması isteğe bağlıdır. Ayrıca IF-ENDIF ile sınırlanan bir program bloğundan çıkmadan yeni
işlem blokları oluşturmak mümkündür. Yani IF-ENDIF blok deyimi ile iç içe bloklar oluşturup
kullanabilirsiniz.
IF ifade THEN
.......
END IF
Eğer IF deyimine parametre olarak verilen “İfade” mantıksal doğru değerini içeriyorsa IF ile
ENDIF arasında yer alan satırlar sıra ile tek tek işletilir. ”İfade” mantıksal yanlış yani False değerini
içeriyorsa bu kez IF ile ENDIF arasında yer alan satırlar atlanılıp program işlemi ENDIF deyiminden
sonra gelen ilk satıra geçer. IF deyimi ile birlikte THEN yardımcı deyimi kullanılmazsa hata meydana
gelir.
Private Sub Form_Load()
Ders_Not = InputBox(“Öğrencinin notunu girin “)
If
Ders_Not < 50 Then
MsgBox (“Bu öğrenci zayıf not aldı”)
End If
If
Ders_Not >= Then
MsgBox (“Bu öğrenci geçer
not aldı”)
End If
End Sub
Ancak içeriği araştırılan değişkenin alma olasılığı olan her değer için ayrı ayrı IF-ENDIF işlem
bloğu hazırlamak pratik değildir. Şimdi yukarıda verilen ve iki IF-ENDIF işlem bloğu bulunan örnek
programla aynı işleve sahip başka bir örnek program verelim.
Private Sub Form_Load()
Ders_Not = InputBox(“Öğrencinin notunu girin “)
If
Ders_Not < 50 Then
MsgBox (“Bu öğrenci zayıf not aldı”)
Else
MsgBox (“Bu öğrenci geçer
not aldı”)
End If
End Sub
Yapılan karşılaştırmalarda ikiden fazla olasılık varsa If-End If işlem bloğunda ELSE deyiminden
başka bir de ELSEIF yardımcı deyiminden yararlanılır.
IF İfade1 THEN
130
......
ELSEIF İfade2 THEN
......
ELSEIF İfade3 THEN
.......
ELSE
........
END IF
Eğer birinci karşılaştırma (İfade1) mantıksal doğru değerine sahipse, IF deyiminin bulunduğu satır
ile ilk ELSEIF deyiminin bulunduğu satıra kadar olan program satırları işletilir. Ardından programın
işletimi blok sonuna işaret eden END IF deyiminden sonraki satıra geçer. Bu durumda işlem
bloğundaki ELSEIF yardımcı deyimleri ile hazırlanan işlemlerin sonucuna bakılmaz.
IF deyimine parametre olarak verilen ifade1 mantıksal yanlış değerine sahipse bu kez ELSEIF
deyimine parametre olarak verilen ifade2’nin sonucuna bakılır. İfade2 doğru değere sahipse, ilk
ELSEIF ile 2.ELSEIF deyimleri arasında kalan program satırları işletilir. İfade1,İfade2 ve İfade3
karşılaştırmaları mantıksal yanlış değerine sahipse en son olarak ELSE deyimi ile ENDIF deyimi
arasında kalan program satırları işletilir.
Private Sub Form_Load()
Ders_Not = InputBox(“Öğrencinin notunu girin “)
If
Ders_Not < 50 Then
MsgBox (“Bu öğrenci zayıf not aldı”)
ElseIf Ders_Not >= 50 And Ders_Not < 70 Then
MsgBox (“Bu öğrenci orta not aldı”)
ElseIf Ders_Not >= 70 And Ders_Not < 90 Then
MsgBox (“Bu öğrenci İyi not aldı”)
Else
MsgBox (“Bu öğrenci Pekiyi
not aldı”)
End If
End Sub
ELSEIF’lerin sayısı istenildiği kadar arttırıla bilinir. Ancak iç içe ve karmaşık kontrol blokları
oluşturmak programın okunurluğunu azaltacağından çok gerekmedikçe iç içe karmaşık İf-Else’lerden
kaçınmak gerekir. Genel yazılıştaki “ifade” yerine bir fonksiyonun geriye döndüreceği mantıksal
değeri ifade olarak kullanmak mümkündür.
2. IIf Fonksiyonu
IIF fonksiyonu çalışma mantığı ve yaptıkları itibarı ile IF deyimine pek
benzemiyor. IIF fonksiyonu da IF deyimi gibi bir mantıksal durumu
değerlendirmekte ve ona göre davranmaktadır.
131
Genel Yazılışı
IIF( Mantıksal İfade, Birinci, İfade, İkinci İfade)
Genel yazılışından da görüleceği gibi IIF() fonksiyonu dışarıdan parametre
olarak üç adet bilgi almaktadır. Birinci parametrenin mantıksal değer üreten
bir ifade olması gerekiyor. İkinci ve Üçüncü parametreler için bir sınırlama
bulunmuyor. Eğer mantıksal ifade, mantıksal doğru değerine sahipse IIF()
fonksiyonu geriye ikinci parametrede verilen ifadeyi, yanlışsa bu kez üçüncü
parametrede verilen ifadeyi geriye döndürür.
Private Sub Form_Load()
Ders_Not = InputBox(“Öğrencinin notunu girin “)
Sonuc = IIF(Ders_Not >=50, “Geçer not”, “Zayıf Not”)
MsgBox Sonuc
End Sub
Aslında IIF fonksiyonu bir bakıma IF deyiminin kısıtlı bir şeklidir. Yalnızca
iki olasılığın söz konusu olduğu durumlarda IF deyiminin yerine IIF
fonksiyonunu kullanabilirsiniz.
3. Select Case – End Select Deyimi
SELECT CASE –END SELECT deyimi işlev bakımından IF-ENDIF deyimine çok benzemektedir.
Çok sayıda iç içe IF-ENDIF işlem blokları kullanıldığı zaman programın okunurluğu azalır programı
izlemek zorlaşır. Select Case dallandırma tek bir düğme değişkenine ya da durum tersi (test case) bağlı
olduğu zaman, onlardan çok daha etkilidir.
Genel Yazılışı
SELECT CASE Kontrol değişkeni
CASE İfade1
........
CASE İfade2
........
CASE ELSE
........
END SELECT
SELECT CASE ile program bloğu başlar ve END SELECT ile biter. Genel
yazılıştan tespit edileceği gibi blok başlatan SELECT CASE deyiminden sonra
yapılacak karşılaştırmalarda kullanılacak bir kontrol değişkeni bulunmaktadır.
Eğer kontrol değişkeninin içeriği “İfade1” olarak verilen değerle aynı ise,
birinci ifadenin içeriğini araştıran CASE deyiminden bir sonraki CASE deyimine
kadar olan program satırları işletilir ve program akışı END SELECT deyimini
izleyen satıra geçer.
Eğer ikinci koşul doğru değerine sahipse, bu kez CASE deyiminden sonra bir sonraki CASE ile
CASE ELSE’e kadar olan program satırları işletilir. CASE ile END SELECT arasında CASE deyimi
ile birlikte kullanılan bütün koşullar yanlış sonucunu veriyorsa CASE ELSE seçeneği varsa CASE
ELSE’den END SELECT’e kadar olan program satırları işletilir.
132
SELECT CASE ile CASE döngüsü başlatıldıktan sonra sıra ile bütün “CASE İfade” bulunan
satırlar taranır. Eğer “ifade” olarak belirtilen bilgi veya bilgiyi temsil eden değişkenin içeriği ile
kontrol değişkeninin içeriği birbirine eşitse, ikinci “CASE ifade2” bulunduğu satıra kadar olan
program satırları işletilir.
Private Sub Form_Load()
Sayı = InputBox(“1 ile
4
arası bir sayı girin “)
Select Case Sayı
Case 1
MsgBox (“Girdiğiniz Sayı 1”)
Case 2
MsgBox (“Girdiğiniz Sayı 2”)
Case 3
MsgBox (“Girdiğiniz Sayı 3”)
End Select
End Sub
Aşağıdaki verilen SELECT CASE deyiminin kullanıldığı örnek ile, daha önce If-END IF blok
deyimini anlatmak üzere verilen örnek aynı işleve sahiptir. Bu örnekte bir önceki örnekten farklı
olarak “Is” yardımcı deyiminden sonra karşılaştırma işlemi yapılıyor.
Private Sub Form_Load()
Ders_Not = InputBox(“Öğrencinin aldığı notunu girin “)
Select Case Ders_Not
Case Is < 50
MsgBox (“Bu öğrenci zayıf not aldı”)
Case Is >= 50
MsgBox (“Bu öğrenci geçer not aldı”)
End Select
End Sub
Private Sub Form_Load()
Show
Print “1-Yeni kayıt Girişi”
Print “2-Kayıt Okuma”
Print “3-Kayıt Düzeltme”
Print “4-Kayıt Silme”
Print “Programdan Çıkış”
SECIM = InputBox(“Seçiminizi Girin”)
Select Case SECIM
Case 1
133
Kayıt
Case 2
Okuma
Case 3
Düzeltme
Case 4
Silme
Case 5
End
End Select
End Sub
Bu örnek program çalıştırıldığı zaman kullanıcıya seçim yapma şansı vermek için InputBox()
fonksiyonu ile ekrana bir diyalog kutusu getirilir. Girişi yapılan sayısal değer SECİM değişkenine
aktarılır.
Örnek program parçasındaki CASE blok deyiminin koşulu SECİM değişkeninin içeriği test
etmekle ilgili SECİM değişkenin içeriği 1 ise “Kayıt” satırı ile KAYIT adlı procedure veya BAS
uzantılı modül dosyası işletilir. Eğer SECİM değişkeninin içeriği 2 ise bu kez OKUMA adlı diğer
yordam işletilir.
4. Do While – Loop Deyimi
DO WHILE –LOOP blok kontrol deyimi verilen şarta bağlı olarak bloklanan program satırlarının
bir döngü halinde tekrar tekrar işletilmesini sağlar. Blok DO WHILE deyiminin bulunduğu satırdan
başlayıp LOOP deyiminin bulunduğu satırda biter.
Genel Yazılışı
DO WHILE İfade
..........
EXIT DO
...........
LOOP
Genel yazılışta verilen EXIT DO yardımcı ek deyiminin kullanılması isteğe bağlıdır. DO WHILE
deyimine parametre olarak verilen “İfade” doğru değerine sahip olduğu ve EXIT DO deyimi ile
müdahale edilmediği sürece, DO WHILE ile LOOP deyimleri arasında yer alan program satırları
döngü halinde tekrar tekrar işletilir.
“ifade” yerine IF deyiminde olduğu gibi mantıksal bir karşılaştırma, bir değişken veya tek başına
doğru(True) ile Mantıksal yanlış (False) kullanılabilir. Kullanılacak karşılaştırmanın sonucu mantıksal
134
doğru (True) olduğu sürece “DO WHILE ifade” ile “LOOP” arasında yer alan program satırları bir
döngü halinde sürekli olarak işletilir.
Private Sub Form_Load()
Dim Ogrenci(10) As Integer
i =1
Do While i <=10
Ogrenci(i) = InputBox (Str(i) & “. Öğrencinin Notu”)
i = i+1
Loop
i = 1
Show
FontSize =12
Do While i <=10
Print Str(i) & “. Öğrencinin aldığı noy” & Str(Ogrenci(i))
i=i+1
Loop
End Sub
İkinci Do While döngüsünde öğrencilerin aldıkları notlar sıra ile ekrana yazılmaktadır. Döngü
içinde döngü kontrol değişkeni olarak kullanılan “i” değişkeninin değeri her turda arttırılmasaydı
döngü, kısır döngü durumuna düşerdi. Bu bakımdan kurulan döngülerden çıkma koşulları en başında
düşünülmelidir.
DO WHILE-LOOP deyiminin genel kullanış biçiminde bulunan ve kullanılması isteğe bağlı olan
EXIT DO yardımcı deyimi, döngüden “ifade” ile belirtilen şarta bağlı kalmadan çıkmayı sağlar.
Programın işletimi EXIT DO deyimine geldiğinde veya döngü içerisinde EXIT DO deyiminin
kullanılması halinde, EXIT DO deyiminden LOOP deyimine kadar olan program satırları işletilmeyip
program işletimi LOOP deyiminin bulunduğu satırı izleyen satıra geçer. EXIT DO deyimi daha çok
döngüden çıkmanın bir şarta bağlanmadığı durumlarda kullanılır. Bu durumda EXIT DO deyimi
kullanılana değin sürekli olarak döngü içinde kalınır.
Genel alışkanlıkla yalnızca EXIT DO deyimi ile çıkılacak şekilde oluşturulan DO WHILE-LOOP
döngülerinde “İfade” olarak mantıksal sabit bir değer veya değişken kullanılır.
DO WHILE True
..........
IF koşul
EXIT DO
ENDIF
LOOP
135
Yukarıda verilen DO WHILE –LOOP döngüsünün her turunda IF deyimi ile “koşul” test edilir.
Eğer koşul mantıksal doğru değerini içeriyorsa programın işletimi döngüden çıkılarak LOOP deyimine
izleyen satıra geçer.
Döngü kontrol ifadesi olarak mantıksal sabit yani True kullanılması halinde döngüden EXIT DO
ile çıkılmadığı sürece döngü sonsuz olur. Bu nedenle yukarıdaki tipteki döngülerde mutlaka döngüden
çıkabilmek için belirli şartlara bağlı olarak EXIT DO deyiminin aktive olması sağlanmalıdır.
Private Sub Form_Load()
Dim Ogrenci(10) As Integer
i =1
Do While
True
Ogrenci(i) = InputBox (Str(i) & “. Öğrencinin Notu”)
i = i+1
Cevap = MsgBox (“Devam edecek misiniz”,4)
If Cevap = 7 Then
Exit Do
End If
Loop
End Sub
Evet düğmesinin seçildiğinde MsgBox geriye 6, Hayır düğmesi seçildiğinde geriye 7 değerini
döndürür. Şimdiye kadar anlatılan Do While- Loop örneklerinde döngünün devam etme koşulları en
başında test ediliyordu. Döngü koşulunun en başında mantıksal yanlış değerine sahip olması halinde
döngü başlamadan biter. Do While döngü deyiminin döngü koşulunun döngü sonunda test edilen
değişik bir tipi daha vardır.
DO
.......
EXIT DO
..........
LOOP WHILE İfade
Döngü koşulunun döngünün sonunda kontrol edildiği bu döngü tipinde, döngü koşulu ne olursa
olsun her şartta döngüde bulunan program satırları en azından bir kez işletilir.
5. For-Next Döngü Deyimi
DO WHILE-LOOP ile oluşturulan döngülerde önceden döngü dahilinde bulunan program
satırlarının kaç kez tekrarlanacağı bilinmez. FOR-NEXT ile oluşturulan döngülerin kaç kez
tekrarlanacağı önceden bellidir.
136
FOR Döngü Değişkeni = İlk Değer TO Son Değer STEP Artım
..........
[EXIT FOR]
..........
NEXT Döngü Değişkeni
Genel yazılıştaki Döngü Değişkeninin kullanılmadan önce tanımlanması önerilir. Bu değişken daha
önceden ilk değer verilerek tanımlanmamışsa bu değişken otomatik olarak oluşturulur. FOR deyimine
ikinci parametre olarak verilen ilk değer döngü değişkeninin alacağı ilk değerdir. Son değer işe döngü
değişkeninin alabileceği son değerdir.
Artım değerinde döngü dahilinde bulunan program satırlarının her turda işletilmesinden sonra
Döngü değişkeninin ne kadar artacağı yazılır. Artım değeri yazılmazsa bunun 1 olduğu varsayılır.
Artım değeri pozitif bir değere sahipse başlangıç değerinin Son değerden daha küçük olması gerekir.
Eğer artım negatif bir değere sahipse bu kez başlangıç değerinin daha büyük olması gerekir.
FOR X =1 TO 10
...................
..................
NEXT X
Bu döngü örneğinde X döngü değişkeni, 1 döngü değişkeninin başlangıç değeri ile 10 döngü
değişkeninin son değeridir. Artım değeri verilmediği için 1 olduğu varsayılacaktır. Bu döngüde FOR
ile NEXT arasında kalan program satırları arka arkaya 10 kez işletilir.
EXIT FOR deyimi DO WHILE –LOOP deyiminde olduğu gibi programın akışını NEXT deyimine
ulaşmadan tekrar FOR deyimini izleyen satıra aktarır. EXIT FOR ise döngüden belirli bir şarta bağlı
olarak döngü tasarlanan sayıda tekrarlanmadan çıkmayı sağlar.
6. Örnek Problem
137
Option Explicit
Dim Gridcizgi As Boolean
Private Sub DrawGrid()
Dim X As Integer
Dim Y As Integer
Dim Color As Integer
If Gridcizgi Then Exit Sub Else Gridcizgi = True
If Grid.Checked Then
Color = RGB(255, 0, 0)
For X = Picture1.Width \ 20 To Picture1.Width Step
Picture1.Width \ 20
Picture1.Line (X, 0)-(X, Picture1.Height), Color
Next X
For Y = Picture1.Height \ 20 To Picture1.Height Step
Picture1.Height \ 20
Picture1.Line (0, Y)-(Picture1.Width, Y), Color
Next Y
Else
Picture1.Cls
End If
Gridcizgi = False
End Sub
Private Sub Grid_Click()
138
Grid.Checked = Not Grid.Checked
DrawGrid
End Sub
7.c. Diziler
·
·
·
·
Dizi Nedir?
Dizi Tanımlamak
o Dizileri Normal Değişkenler Gibi Tanımlamak
o Dizileri To Sözcüğü İle Tanımlamak
Dinamik Diziler
Çok Boyutlu Diziler
o Dizi Elemanlarına Döngüler Aracılığı İle Erişim
Dizi Nedir?
Aynı tipe sahip birbirine benzer çok sayıda değişkenleri temsil etmek için dizi
kullanılır. Bir değişken programın herhangi bir yerinde farklı değerlerin
saklanabileceği bir depolama aracı olarak düşünülebilir. Dizi ise birden çok depolama
aracının oluşturduğu bir topluluktur. Topluluğun içindeki her bir elemana onun yerini
belirten indeksi aracılığı ile ulaşılır. Visual Basic’te genellikle dizinin ilk elemanı 0
numaralı indeksle ulaşılan elemandır. Diziler farklı uzunlukta olabilir. Bir dizinin üç
elemanı varken diğerinin 30 elemanı olabilir, hatta bazı dizilerin başlangıçta hiç
elemanı olmayıp uzunluğu daha sonra belirlenebilir..
139
Dizi Tanımlamak
Dizileri normal bir değişken gibi veya alt ve üst sınırların belirtmek için To sözcüğü ile
tanımlıyabiliriz.
Dizileri Normal Değişkenler Gibi Tanımlamak
Diziler normal değişkenler gibi aşağıdaki format kullanılarak tanımlanır.
Dim|Public|Private Diziİsmi(ÜstSınır) As VeriTipi
Bu format içinde,
·
·
Dim, Public, and Private, aidiyeti anlatan Visual Basic sözcükleridir. Eğer Dim
kullanırsanız dizi tanımlandığı yordam içinde geçerlidir. Public diziyi program için
genel yapar, form modülünün veya modülün general declaration bölümünde private
tanımlanan dizi tanımlandığı modül içerisinde her yerde geçerlidir.
Diziİsmi tanımlanan dizinin adıdır.
Option base
Dizi tanımlandığında dizinin ilk elemanı 0ncı elemanıdır, çünki option
base varsayılan değeri 0’dır. Eğer modülün general declaration
bölümünde Option Base 1 yazarsanız tanımlanan dizinin alt sınır 1 olur.
·
ÜstSınır dizinin son elemanın pozisyonunu(indeksini) veriri. Eğer üst
sınır 6 olarak tanımlanmışsa dizinin ilk elemanı 0dan başlayacağı için
dizinin eleman sayısının 7 olacağına dikkat ediniz.
·
As tip bildiriminde kullanılan Visual Basic sözcüğüdür.
·
VeriTipi Visual Basic için geçerli standart veya kullanıcı tanımlı veri tiplerinden
birisidir.
Örneğin beş elemanlı tamsayı bir dizi aşağıdaki şekilde tanımlanır:
Dim iMyArray(4) As Integer
Dizinin elemanlarına aşağıdaki şekilde değer atanabilir:
iMyArray(0)
iMyArray(1)
iMyArray(2)
iMyArray(3)
=
=
=
=
9
342
2746
0
140
iMyArray(4) = 8901
To change the value of the fourth element of the array iMyArray dizisinin dördüncü
elemanının değerini 0 dan 45 e değiştirmek için aşağıdaki cümleyi yazın.
iMyArray(3) = 45
Dizileri To Sözcüğü İle tanımlamak
Dizilerin tanımında To sözcüğü kullanılırsa açıkça alt sınırı ifade edilebilir. Örneğin ilk
elemanın pozisyonu 1 son elemanının pozisyonu 5 olan, 5 elemanlı bir tamsayı dizi
aşağıdaki şekilde ifade edilebilir.
Dim iMyArray(1 To 5) as Integer
Dinamik Diziler
Dizileri tanımlarken eleman sayısı tanımladığımızda statik dizi oluştururuz. Dizileri
dinamik olarak tanımlamak ihtiyacımıza göre dizinin eleman sayısını değiştirmek yani
yeniden boyutlandırmak mümkündür. Bu şekilde oluşturulan diziler dinamik dizilerdir.
Bunun için önce diziyi eleman sayısız olarak tanımlarız., daha sonra aynı diziyi
istediğimiz eleman sayısı ile redim komutuyla yeniden tanımlarız.
ReDim [Preserve] Diziİsmi(ÜstSınır) As VeriTipi
Bu format içinde,
·
·
ReDim önceden eleman sayısız olarak tanımlanmış diziyi boyutlandırarak yeniden
tanımlamak için kullanılan Visual Basic sözcüğüdür.
Preserve seçimlik Visual Basic sözcüğüdür, dizinin içindeki eski değerlerin
korunarak yeniden boyutlandırılacağını gösterir. Eğer preseve sözcüğü
kullanılmazsa dizinin elemanlarına sayısal ise 0 değeri, string ise “” değeri,
variant ise empty değeri atanır.
·
Diziİsmi tanımlanan dizinin adıdır.
·
ÜstSınır dizinin son elemanın pozisyonunu(indeksini) veriri.
·
As tip bildiriminde kullanılan Visual Basic sözcüğüdür.
·
VeriTipi Visual Basic için geçerli standart veya kullanıcı tanımlı veri
tiplerinden birisidir.
Aşağıdaki listede dinamik dizi kullanımına örnek verilmiştir.
141
LISTE 1—Dinamik Dizi Kullanımı
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
`Create an array without any elements
Dim strMyArray() as String
`Dimension the array for 9 elements
ReDim strMyArray(8)
`Assign values to the array elements
strMyArray(0) = "I am a pitcher."
strMyArray(1) = "I am a catcher."
strMyArray(2) = "I play first base."
strMyArray(3) = "I play second base."
strMyArray(4) = "I play third base."
strMyArray(5) = "I play shortstop."
strMyArray(6) = "I play left field."
strMyArray(7) = "I play center field."
strMyArray(8) = "I play right field."
`Add an element and make it so all the values
`of the previous elements are kept intact
ReDim Preserve strMyArray(9)
`Assign a value to the new array element
strMyArray(9) = "I am the designated hitter."
Çok Boyutlu Diziler
Şimdiye kadar bir boyutlu dizileri kullandık. Matris işlemlerinde iki boyutlu, vektör
işlemlerinde ise üç boyutlu dizilere ihtiyaç duyarız. Visual Basic 60 boyutlu dizilere
kadar çok boyutlu dizi tanımlayıp kullanabilmemize imkan verir. Örneğin iki boyutlu
bir dizi(matris) aşağıdaki şekilde tanımlanır.
Dim|Public|Private Diziİsmi(ÜstSınır1, _
SubscriptOfRows) As DataType
Bu format içerisinde,
·
Dim, Public, and Private, aidiyeti belirten Visual Basic sözcükleridir.
Diziİsmi tanımlanan dizinin adıdır.
·
ÜstSınır1 dizi içindeki en yüksek kolon sayısı veya birinci boyutun üst sınırını
·
ÜstSınır2 dizi içindeki en yüksek satır sayısını veya ikinci boyutun üst sınırını
·
As tip bildiriminde kullanılan Visual Basic sözcüğüdür.
·
VeriTipi Visual Basic için geçerli standart veya kullanıcı tanımlı veri
·
tiplerinden birisidir.
142
Aşağıdaki örnekte üçboyutlu bir dizinin nasıl tanımlanacağına ve elemanlarına nasıl
değer atanacağına ilişkin bir örnek verilmiştir.
Dim iVar(1,2,1) as Integer
iVar(0,0,0) = 5
iVar(0,1,0) = 187
iVar(0,2,0) = 16
iVar(1,0,0) = 12
iVar(1,1,0) = 55
iVar(1,2,0) = 7
iVar(0,0,1) = 34
iVar(0,1,1) = 13
iVar(0,2,1) = 4500
iVar(1,0,1) = 612
iVar(1,1,1) = 9
iVar(1,2,1) = 784
Bir boyutlu dizilerde olduğu gibi To sözcüğü kullanılarak her bir boyutun alt ve üst
sınırı açıkça ifade edilebilir.
Dim dMyArray(1 To 5,
3 To 8,
3 To 5) As Double
Redim sözcüğü kullanılarak çok boyutlu dizilerin her boyutunun eleman sayısı
değiştirilebilir. Preserve kullanılırsa sadece sonunucu boyutun eleman sayısı
değiştirilebilir. Redim komutu ile boyut sayısı değiştirilemez.
Dizi Elemanlarına Döngüler Aracılığı İle Erişim
For...Next döngüsünü dizi elemanlarına erişmek değerlerini okumak ve değiştirmek
için kullanmak diziler ile çalışırken büyük kolaylık sağlar. Aşağıdaki listede dizi
elemanlarına erişim için for...next döngüsü kullanımına bir örnek verilmiştir. Örnekte
bir komut düğmesinin Click() olay alt yordamı içerisinde 20 elemanlık bir dizi
oluşturulmuş, birinci for...next döngüsünde dizi elemanlarına değer atanmış, ikinci
döngüde ise her elemanın değeri bir string içine yüklenmiştir.
LISTE 2—Diziler İçin For...Next Döngüsü Kullanımı
01
02
03
04
05
06
07
Private Sub cmdTraverse_Click()
Dim i%
Dim iMyArray%(19) As Integer
Dim BeginMsg$
Dim MidMsg$
Dim LoopMsg$
Dim FullMsg$
143
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
`Assign a value to each element in the array
`by using a loop to traverse to each element
`in the array.
For i% = 0 To 19
`Make the value of the element to be
`twice the value of i%
iMyArray%(i%) = i% * 2
Next i%
`Create the BeginMsg$ string
BeginMsg$ = "The element is: "
MidMsg$ = ", The value is: "
`Go through the array again and make
`a string to display
For i% = 0 To 19
LoopMsg$ = LoopMsg$ & BeginMsg$ & CStr(i%)
LoopMsg$ = LoopMsg$ & MidMsg$ & iMyArray(i%)
`Concatenate the loop message to the
`full message. Also add a line break
FullMsg$ = FullMsg$ & LoopMsg$ & vbCrLf
`Clean out the loop message so that
`new value next time through the loop
LoopMsg$ = ""
Next i%
txtTraverse.Text = FullMsg$
End Sub
144
7.d. Alt Yordam Hazırlamak ve Kullanmak
Form veya diğer nesnelerle ilgili olarak projelere dahil edilen yordamların dışında istediğiniz
işlemler için başka yordamlar hazırlayabilirsiniz. Formlara veya BAS uzantılı Module dosyalarına,
tanımlı olan mevcut yordamların dışında yeni bir yordam eklemek için Tools menüsündeki Add
Procedure komutundan yararlanılmaktadır (Şekil 7.d-1).
Tools menüsünden Add Procedure komutunu verirseniz ekrana Add Procedure diyalog kutusu
gelir. Bu diyalog kutusunda hazırlanacak yordamın tipi, adı ve geçerlilik alanı belirlenir. Yordamlar
Sub, Function, Prpperty ve Event şeklinde üç gruba ayrılmaktadır.
Şekil 7.d-1
Sub tipi yordamlar geriye bir değer döndürmezlerken Function tipi yordamlar geriye mutlaka bir
değer döndürürler. Örnek kullanıcının MsgBox deyimi ile ekrana gelen diyalog kutusunda yaptığı
seçimi temsil eden sayısal değeri bir değişkene aktarmak suretiyle yakalamak istiyorsanız MsgBox
deyimi yerine MsgBox() fonksiyonunu kullanmalısınız.
Cevap = MsgBox (“Bu Silme İşlemini Onaylıyor musunuz ?”, 4)
Bu nedenlerden dolayı hazırlanmak istenen yordamın geriye bir değer döndürmesi isteniyorsa
Procedure tipi olarak Function seçilmelidir. Ancak geriye döndürülmek istenen bir değer yokken bile
Function tipinde yordamlar hazırlanabilir.
Hazırlanmak istenilen yordamlar Form1’deki mevcut nesnelerle direk ilgili olmadığı için Object
liste kutusuna otomatik olarak (general) seçeneğine yazılır.
145
Nesnelerle ilgili olan yordamlar, nesnelere uygulanma olasılığı olan olaylara endeksli olduğundan
yordamı hazırlamak yeterli olur. Ancak Tolls menüsündeki Add Procudure komutu ile hazırlanan
yordamları hazırlamak yetmez. Söz konusu yordamın nasıl ve hangi olaylarla bağlantılı olarak
işletileceği konusunda önceden hazırlık yapılmalıdır.
Aslında Sub tipli yordam hazırlamak için Tolls menüsündeki Add Procedure komutuna başvurmak
zorunluluğu yoktur. Aktif formun veya BAS uzantılı modül dosyanın Code penceresinde Object liste
kutusunda (general) seçeneği varken Sub bildiri deyimi ile doğrudan yordam yazımı yapılabilir.
Normal şartlarda çağırılan bir yordamdaki program satırları sıra ile işletilir. Yordamdaki bütün
satırlar işletildikten sonra projenin işletimi söz konusu yordamın çağırıldığı program satırından bir
sonraki satıra geçer. Eğer çağırılıp işletilen yordamdan sonra işletilen başka bir yordam veya program
satırı yoksa ve proje End deyimi ile sona erdirilmezse Projenin işletimi aktif Formda kalır. Diğer
taraftan yordamlarda kullanılacak blok kontrol deyimleri sayesinde program satırlarının sıra ile
işletilmesi önlenebilir.
Bunun dışında yordamda bulunan bütün satırlar işletilmeden yordamdan çıkılabilir. Bu amaçla Exit
Sub deyiminden yararlanılmaktadır.
Add Procedure diyalog kutusunda yordamın tipinden başka ayrıca yordamın geçerlilik alanı
seçilmektedir. Bu amaçla Scope adı altında bir araya getirilen Public veya Private radyo
düğmelerinden biri seçilir. Başlangıçta Public radyo düğmesi seçili durumda olduğu için hazırlanacak
yordam projenin bütün form ve modüllerinde kullanılabilir. Eğer Add Procedure diyalog kutusunda
Private radyo düğmesini seçili duruma ondan sonra yordam hazırlarsanız, bu yordamı başka bir Form
veya Modül dahilinde kullanamazsınız.
1. Fonksiyon Hazırlamak
Bir fonksiyon hazırlamak için Sub tipi yordam hazırlama işleminde olduğu gibi Code penceresi
açık durumda iken Tools menüsünden Add Procedure komutu verilir. Bu komut verilince ekrana gelen
Add Procedure diyalog kutusunda Procedure tipli Function seçilir (Şekil 7.d-2)
146
Şekil 7.d-2
Bu diyalog kutusunda Procedure tipinden başka fonksiyonun adı belirlenir. Fonksiyonlar Function
bildiri deyimi ile başlatılır ve fonksiyonun sonunu belirtmek için End Function deyimi kullanılır.
Eğer fonksiyonun yalnızca içinde hazırlandığı Form veya modülde kullanılabilmesini istiyorsanız
Add Procedure diyalog kutusunda Private radyo değmesini seçili duruma getirmeniz gerekir.
Public Function Karekök ( X As Double) As Double
Select Case Sqn (X)
Case 1
Karekök = Sqr(X)
Exit Function
Case 0
Karekök = 0
Exit Function
Case –1
Karekök = -1
End Selevt
End Function
Fonksiyonların Sub tipi yordamlardan en önemli farkının fonksiyonların geriye bir değer
döndürmeleri olduğunu daha önce belirtmiştik. Geriye döndürülecek değerlerin tipi Fonksiyon
adından sonra belirtilir. Buna göre örnek olması için hazırladığım Karekök() fonksiyonunda geriye
147
Double tipte bilgi döndürülür. Visual Basic’te geriye değer döndürme işlemi, Fonksiyon adını
değişken gibi kullanıp ona değer aktarma şeklinde olmaktadır. Ancak Fonksiyon adını değişken gibi
kullanıp değer aktarma işlemi fonksiyondan çıkmaya neden olmamaktadır. Fonksiyonlardan çıkmak
için ayrıca Exit Function deyiminin kullanılması gerekir.
Private Sub Form_Click()
Dim Kök
Dim Sayı As Double
Sayı = InputBox ( “ Karekökü alınacak sayıyı girin”)
Kök= Karekök (Sayı)
Select Case Kök
Case 0
MsgBox (“Girilen sayı sıfır”)
Case -1
MsgBox (“Girilen sayı negatiftir”)
Case –1
MsgBox (“Girilen sayının karekökü
:” & Kök
End Select
End Sub
Eğer hazırladığınız fonksiyonun yalnızca içinde hazırladığınız Form ve modülde kullanılabilmesini
istiyorsanız Fonksiyon adından önce Private bildiri deyimini kullanmalısınız. Buna göre geçerlilik
alanı bildirilmeyen fonksiyonlar bütün Form ve modüllerde kullanılır.
2. Fonksiyon Çağırmak ile İlgili Program
Public Function Çarpım(X As Integer, Y As Integer)
Dim Z
Z = X * Y
Çarpım = Z
End Function
Private Sub Command1_Click()
'Call Çarpım(2, 3)
'Çarpım 2, 3
Text1.Text = Str(Çarpım(6, 8))
End Sub
148
7.e. DOSYA İŞLEMLERİ
Dosyalar üzerinde işlem yapma örneğinin kolay izlenebilmesi ve anla şılmasını sağlamak için tek proje yerine her i şlem için bir proje
hazırlayalım. Kayıt girişi işlemi ayrı, Kayıt düzeltme, Kayıt silme ve Liste alma i şlemleri için önce ayrı ayrı projeler hazırlayalım. Daha
sonra ayrı ayrı hazırladığımız projeleri bir tek projede birle ştirelim.
1. Dosyalara Kayıt Girmek
149
Bütün programlama dillerinde programcılar özellikle hard diskte veri tabanı dosyalarına yazılacak
bilgileri belirlerler. Veri tabanı dosyalarına bir kişi, bir kuruluş veya ticari işlemle ilgili yazılan
bilgilerin hepsine birden “kayıt” adı verilmektedir. Hazırlamak istediğimiz örnek veri tabanı
dosyasına yazılacak her kayıtta şu bilgiler olsun;
· Ad
· Soyad
· Adres
· Tel
· Sehir
Kayıt bilgilerinin her birine alan adı verilmektedir. Kayıtta bulunan bütün bilgiler karaktersel tipte
olsun. Bu amaçla hazırlanacak olan Giriş adlı projenin formunda, kayıtta bulunacak alanlarla aynı ada
sahip TextBox’lar ve gerekli Label’ler hazırlayalım (Şekil 7.e-1).
Şekil 7.e-1
Formun başlığını “Kayıt Girişi” ve proje içindeki projenin adını “GIRIS” olarak verelim. (Şekil
7.e-2). Ayrıca “Kayıt No” başlığına sahip olan Label nesnesinin hemen yanında bulunan ilk TextBox’a
Proje dahilinde geçerli olmak üzere “KayıtNo” ve diğerlerine sırayla “Ad”,”Soyad”,”Adres”,”Tel” ve
“Sehir” adlarını verelim (Şekil 7.e-1).
Formlara eklenen her kontrol veya nesne için geçerli olmak üzere ve nesneye uygulanabilecek her
bir olay için program kodu hazırlamak mümkündür. Ancak Visual Basic programları yalnızca
nesneler ve bu nesneler için hazırlanan program kodlarından meydana gelmezler. Visual Basic projesi
ayrıca program kodu içeren BAS uzantılı Module dosyalarını da içerebilir. Kayıt tipinde değişken
tanımlama satırlarının projeye dahil edilen formların dışında ayrı bir BAS uzantılı dosyaya yazılması
gerekir.
Diğer taraftan Formlara ait kod pencerelerinde Object liste kutusunda (general), Prog liste
kutusundaki yordam (olay) adları dışında (declaration) adında bir seçenek daha vardır. Bu seçenekte
Form dahilinde kullanılacak değişkenler deklare edilir veya tanımlanır. Dosyaya yazılacak bilgileri
belirlemek amacıyla kullanılan Kayıt tipindeki değişkenin bir Module dosyası içinde tanımlanması
gerekir. Projelere Module dosyası eklemek için Project menüsündeki Add Module komutundan
yararlanılmaktadır
150
Şekil 7.e-2
Projelere Module dosyası eklemek için Project menüsündeki Add Module komutundan
yararlanılır. Project menüsünden Add Module komutunu verirseniz, projeye modül ekleme işlemi
öncesinde ekrana Add Module diyalog kutusu gelir. Bu diyalog kutusundaki Module simgesi seçili
durumda iken Aç düğmesinde tıklama yapılırsa projeye modül ekleme işlemi tamamlanmış olur (Şekil
7.e-3).
Şekil 7.e-3
Daha önce hazırlanıp hard diske kaydedilmiş olan Module dosyalarından biri projeye dahil edilmek
istenirse Existing sekmesine geçilmelidir. Eğer projeye ilk kez Module dosyası ekleniyorsa ekrana
gelen bu Module penceresinin başlığı Module1.bas olur. Bu pencere, Formlar için ekrana getirilen
kod penceresinden görünüm olarak farklı değildir. Eğer normal bir modül dosyası hazırlamak istiyorsa
Add Module diyalog kutusundan Module seçeneği seçilmelidir.
Eğer bir Addin (İçine-ekle) dosyası hazırlanıp projeye dahil edilmek isteniyorsa bu kez Addin
seçeneğinin seçilmesi gerekir. Eğer projeye ilk kez Module dosyası ekleniyorsa ekrana gelen bu
Module penceresinin başlığı Module1.BAS olur.
Nasıl ki bir formda birden fazla Sub( yordam) bulunabiliyorsa bir Modülde de birden fazla yordam
ve kullanıcı tanımlı fonksiyon bulunabilir. Kayıt tipli değişkenin tanımlandığı program satırları bir
yordamın içine yazılmayıp Object liste kutusunda (general) ve Prog liste kutusunda (declaration)
seçeneği seçili durumda iken yazılır.
151
Şekil 7.e-4
Bir veya birden fazla normal değişkenden meydana gelen Kayıt tipli değişken tanımlama satırları
Type deyimi ile başlar ve End Type bildiri deyimi ile biter (Şekil 7.e-4). Kayıt tipli değişkenlere dahil
edilen karaktersel değişkenlerin uzunlukları ayrıca belirlenir. Type-End Type bildiri deyimleri ile
tanımlanan kayıt tipli değişkeni projenin diğer form veya modüllerinde kullanabilmek için söz konusu
kayıt tipli değişkenin Global bildiri deyimi ile tanımlanması gerekir.
Projede kullanılan ve GİRİŞ adı verilen forn için yazılan program kodları aşağıda şekilde
verilmiştir. Daha önce belirtildiği gibi en başta bilgi kaydedilecek dosyanın açılması gerekir. Bu
amaçla kullanılacak deyimin adı Open’dir.
Private Sub Form_Load()
Open “Adres.dat” For Random As #1 Len = Len (Alanlar)
KayıtNo = LOF (1) / Len (Alanlar)
KayıtNo = KayıtNo +1
End Sub
Open deyimi ile açılacak dosyanın adı “Adres.dat” olarak seçilsin. Open deyimi, Adres.dat
dosyasını o sırada geçerli olan sürücü ve klasörde bulamazsa dosyayı oluşturur. Programın daha
sonraki çalışmalarında dosya geçerli klasörde olacağı için Visual Basic dosyayı açmakla yetinir. Open
deyimi ile açılacak dosya adından sonra Open deyimine parametre olarak verilen For Random ile
dosyanın random yani rasgele erişimli olduğu belirlenir.
Formların biri hard diskte, diğeri de proje içinde geçerli olan iki adı vardır. Benzer durum kayıt
yazmak amacıyla açılan dosyalar için de geçerlidir. Dosyaların hard diskteki adlarından başka birde
proje içinde geçerli olan adları vardır. Random dosyaların proje içindeki adları sayısal bir değerdir.
Dosya adını temsil eden bu sayısal değerin önüne ayrıca “#” karakteri konulur. Dosyanın proje içinde
adı başka bir deyişle numarası 1 ile 255 arasında değişen bir değer olabilir.
Daha sonra dosyaya Put deyimi ile kayıt yaparken, kaydın yazılacağı dosyayı belirlemek için
dosyanın diskteki adı yerine, proje dahilindeki adı kullanılır. Open deyimine parametre olarak verilen
en son bilgi ise bir kaydın byte olarak uzunluğudur. Kaydın byte olarak uzunluğunu belirlemek için
Len() fonksiyonundan yararlanılır.
Random dosyalara kayıt yazarken her kayda bir kayıt numarası verilir. İlk kaydın numarası 1 olmak
üzere her yeni kaydın kayıt numarası 1 arttırılır. Kayıtlara düzenli ve artan bir sırada kayıt numarası
verilmezse dosyada gereksiz boşluklar olur. Bu nedenle dosyaya bir kayıt yazılmadan önce dosyaya o
ana kadar kaç kaydın yazılmış olduğu öğrenilir. Dosyadaki mevcut kayıtların sayısını öğrenmek için
dosyanın Byte olarak büyüklüğü kayıt uzunluğuna bölünür.
152
Daha önce verilen kod penceresinden tespit edileceği üzere dosyanın byte olarak büyüklüğünü
bulmak için Visual Basic fonksiyonlarından biri olan LOF() fonksiyonundan yararlanılır. Dosyanın
Byte olarak büyüklüğü kayıt boyuna bölünürse, dosyaya o ana kadar yazılmış olan kayıtların sayısı
bulunur.
Bulunan Kayıt sayısı, dosyaya yeni bir kayıt yazma işlemi öncesi 1 arttırılarak KayıtNo adlı
TextBox nesnesine yazılmaktadır. Yani formdaki KayıtNo adlı TextBox’a kayıt numarasını kullanıcı
girmeyecek. Proje hazırlanıp çalıştırıldığında dosyada henüz kayıt olmadığından Kayıt No etiketinin
karşısında bulunan TextBox’a 1 değeri yazılır (Şekil 7.e-5).
Şekil 7.e-5
Program çalıştırıldıktan hemen sonra imlecin ilk sırada bulunan Textbox’ta durmasını veya söz
konusu Textbox’a bilgi girişini engellemek için tasarım anında adı geçen Textbox seçili durumda iken
Properties penceresinde Textbox’a ait TabStop özelliğine False değeri aktarılır (Şekil 7.e-6).
Şekil 7.e-6
Programın çalışmasını sona erdirmeden önce Open deyimi ile açılan dosyanın kapatılması gerekir.
Dosya kapatmak amacıyla kullanılan deyim. Close. Close deyimine parametre olarak kapatılmak
istenen dosyanın proje içindeki adı yani numarası verilmelidir. Proje dahilinde çok sayıda dosya açılıp
kullanılıyorsa ve o an için artık kullanılmayacak dosyalar varsa bu dosyaların kapatılması önerilir.
Private Sub Çıkış_Click()
153
Close #1
End
End Sub
Bu proje başlatılır başlatılmaz Form_Load yordamına yazılan program satırları işletilerek
kayıtların yazılacağı Adres.Dat dosyası açılır. Ardından dosyada o ana kadar girişi yapılan kayıtlar
sayılır. Mevcut kayıt sayısına 1 eklenerek bulunan değer formdaki KayıtNo adlı TextBox’a yazılır. Bu
işlemden sonra imleç bir sonraki TextBox’ta bilgi girişi için hazır bekler. Kullanıcı kayda ait bilgileri
Form’daki diğer TextBox’lara girdikten sonra, girişini yaptığı bilgileri dosyaya yazmak için Kaydet
düğmesinde tıklama yapılır.
Kaydet düğmesinde tıklama yapıldığı zaman girişi yapılan bilgilerin dosyaya yazılabilmesi için Put
deyimini de içeren program satırlarını hazırlayıp Kaydet nesnesine ait Kaydet_Click yordamına dahil
edilmesi gerekir. Kaydet başlıklı düğmede tıklama yapıldığı zaman, metin kutularına girilen bilgileri
kayıt tipindeki değişkene aktaracak satırların yazılması gerekir. “Alanlar” adını vermiş olunan kayıt
tipindeki değişkenin adından sonra nokta işaretini yazınca, Visual Basic akıllı davranıp bu değişkenin
elemanlarını ekrana listeler (Şekil 7.e-7).
Şekil 7.e-7
Visual Basic tarafından otomatik olarak ekrana getirilen Kay ıt tipindeki değişkenin istenilen elemanı seçilebildiği gibi kendiniz de
yazabilirsiniz. Kaydet dü ğmesinde tıklama yapıldığı zaman işletilecek ve metin kutularına yazılan bilgileri dosyaya yazacak program
satırlarını aşağıda görülmektedir.
Private Sub Kaydet_Click()
Alanlar.Ad = Giriş.Ad
Alanlar.Soyad = Giriş.Soyad
Alanlar.Adres = Giriş.Adres
Alanlar.Tel = Giriş.Tel
Alanlar.Sehir = Giriş.Sehir
Cevap = MsgBox (“ Bu kayıt dosyaya yazılsın mı?”,4)
If Cevap = 6 Then
Put #1, KayıtNo, Alanlar
Giriş.Ad = ""
Giriş.Soyad = ""
Giriş.Adres = ""
Giriş.Tel = ""
Giriş.Sehir = ""
Ad.SetFocus
End If
154
End Sub
Visual Basic projesinde kullanılan tek formun hard diske Giriş.Frm adıyla kaydedildiğini ve forma
Giriş adının verildiğini biliyoruz. Ayrıca dosyaya yazılacak bilgileri temsil etmek üzere hazırlanan
Global özellikli kayıt tipi değişkenin adını Alanlar olarak seçilmişti. Kaydet düğmesi ile hazırlanan
program kodu Click olayına bağlandığı için Kaydet düğmesinde tıklama yapıldığı zaman dosyaya
kaydetme işlemi yapılır.
TextBox’lara girilen bilgileri dosyaya kaydedebilmek için özellikle TextBox nesnelerinin
içeriklerini tek tek “Alanlar” adlı kayıt tipi değişkenin elemanlarına aktarmanız gerekir. Çünkü Put
deyimine parametre olarak verilen bilgilerden biri kayıt tipi değişkendir. TextBox’lara girilen bilgiler
aşağıda verilen program satırları ile kayıt tipi değişken elemanlarına aktarılmaktadır.
Alanlar.Ad = Giriş.Ad
Alanlar.Soyad = Giriş.Soyad
Alanlar.Adres = Giriş.Adres
Alanlar.Tel = Giriş.Tel
Alanlar.Sehir = Giriş.Sehir
Bu işlemden sonra Put deyimi ile kayıt bilgilerini dosyaya yazmadan çnce MsgBox fonksiyonu ile
kullanıcıdan onay alınmaktadır. Burada kullanılan MsgBox fonksiyonuna dışarıdan iki parametre
verilmektedir. Birincisi kayıt işlemi öncesi onay almak için ekrana getirilen diyalog kutusuna yazılan
mesajdır. İkincisi ise MsgBox fonksiyonu ile ekrana getirilen diyalog kutusunda hangi düğmelerin
bulunacağını belirten sayısal bir değerdir. Bilindiği gibi MsgBox fonksiyonuna 2. sırada parametre
olarak verilen 4 sayısal değeri diyalog kutusunda Evet ve Hayır adında iki düğmenin yer almasına
neden olmaktadır.
Cevap = MsgBox( “Bu kayıt dosyaya yazılsın mı?”,4)
Şekil 7.e-8
Kullanıcı Form üzerinde bulunan TextBox’lara istediği bilgilerin girişini yapıp Kaydet düğmesinde
tıklama yaparsa, program işletimi içinde Msgbox fonksiyonunun bulunduğu satıra geçer ve MsgBox
fonksiyonu Şekil 7.e-8’ deki görüntüsü verilen diyalog kutusunu ekrana getirir.
MsgBox fonksiyonu tarafından ekrana getirilen diyalog kutusunda kullanıcı evet düğmesinde
tıklama yapar veya evet düğmesi seçili durumda iken Enter tuşuna basarsa MsgBox fonksiyonu geriye
6 sayısal değerini, Hayır düğmesinde tıklama yapılırsa 7 sayısal değerini geriye döndürür. Geriye
155
döndürülen değer “Cevap” adlı değişkene aktarılmaktadır. MsgBox fonksiyonu ile ekrana getirilen
diyalog kutusunda Evet düğmesinde tıklama yapılırsa aşağıda verilen program satırları işletilir.
If Cevap= 6 Then
Put#1, KayitNo, Alanlar
KayitNo = KayitNo +1
Giriş.Ad = ""
Giriş.Soyad = ""
Giriş.Adres = ""
Giriş.Tel = ""
Giriş.Sehir = ""
Ad.SetFocus
End If
Bu program satırından önce Put deyimi ile kayıt tipli Alanlar değişkenin içeriği hard diske yani
dosyaya yazılmaktadır. Hard diske yazma işleminden sonra KayıtNo değişkenin içeriği 1 arttırılıyor.
Daha sonra Formdaki TextBox’ların içeriklerine boşluk değerleri aktarılıyor. Kaydet düğmesinde
tıklama yapılarak gerçekleştirilen kayıt işleminden sonra imlecin yerini belirlemek için SetFocus
özelliğinden yararlanılır. Eğer kullanıcı MsgBox fonksiyonu tarafından ekrana getirilen diyalog
kutsundaki “Bu kayıt dosyaya yazılsın mı?” sorusuna Hayır diye cevap vermiş olsaydı, bu kez
MsgBox fonksiyonu geriye 7 sayısal değerini döndürür ve If ile End If işlem bloğu arasında kalan
satırları işletmezdi. Bu durumda tekrar Forma dönülürdü.
Kullanıcı formdaki TextBox’larda bulunan kayıt bilgilerini dosyaya yazmak istemiyorsa Vazgeç
düğmesini seçebilir.
Private Sub Vazgeç_Click()
Cevap = MsgBox( “Girilecek başka kayıt var mı?”,4)
If Cevap= 6 Then
Giriş.Ad = ""
Giriş.Soyad = ""
Giriş.Adres = ""
Giriş.Tel = ""
Giriş.Sehir = ""
Ad.SetFocus
Else
End
End If
End Sub
2. Dosyadan Kayıt Okumak
Kayıt okumak amacıyla hazırlayacağımız projeyi hard diske OKUMA.VBP ve Projede
kullanacağımız formu ise hard diske OKUMA.FRM adıyla kaydedelim. Proje çalıştırılır çalıştırılmaz
kullanıcıdan okunmak istenen kaydın no’su istenecek. Okunup ekrana getirilecek kaydın no’su
girildikten sonra kayıt dosyadan okunacak ve kaydın ayrıntıları Formda üzerine yerleştirilmiş olan
TextBox’lara yazılacak. Proje dahilinde kullanılacak form bir önceki projede dosyaya kayıt yazmak
amacıyla kullanılan forma oldukça benzemektedir (Şekil 7.e-9).
156
Şekil 7.e-9
Projenin OKUMA.FRM adıyla hard diske kaydettiğimiz formundaki ilk TextBox bilgi giriş
amacıyla kullanılacak. Diğer metin kutuları yalnızca bilgi görüntülemek amacıyla kullanılacak. Bu
amaçla ilk TextBox hariç bütün TexBox’ların TabStop özellikleri False duruma getirelim.
Proje çalıştırılır çalıştırılmaz önce kullanıcıdan bilgileri ekrana getirilmek istenen kaydın numarası
istenir. Bu sırada okunacak Kaydın Numarasının girileceği TextBox’a dosyada bulunan en son kaydın
numarası gelir. Yani Kayıt No girilen metin kutusuna hazır olarak gelen kayıt numarasından daha
büyük bir değerin giriş yapılamaz.
Dosyanın açılması ve dosyada bulunan toplam kayıt sayısını bulmak amacıyla kullanılan program
kodlarının proje başlatılır başlatılmaz işletilmesini sağlamak için “form” objesine ait Load olayına
bağlantı kuralım. Bu amaçla hazırlanan program kodları aşağıda verilmiştir.
Private Sub Form_Load()
Open “Adres.dat” For Random As #1 Len = Len (Alanlar)
KayıtNo = LOF (1) / Len (Alanlar)
End Sub
Hard diske OKUMA.FRM adıyla kaydedilen Form yüklenir yüklenmez otomatik olarak aktive
edilen Form_Load yordamında bulunan iki satırlık program kodu ile Adres.dat dosyası açılamakta ve
dosyada bulunan toplam kayıt sayısı bulunmaktadır.
Proje başlatılır başlatılmaz imleç bilgi girişi amacıyla kullanılan TextBox olan KayıtNo adlı
TextBox’a konumlanır. Bu sırada ayrıntılarını ekrana getirmek istediğiniz kaydın numarasını
girebilirsiniz. Kayıt numarası girişinin tamamlandığını belirtmek üzere kullanıcının enter tuşuna
basacağını öngörelim ve KayıtNo adlı TextBox için aşağıda verilen program kodlarını hazırlayalım.
Private Sub KayıtNo_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Get #1, KayıtNo, Alanlar
Okuma.Ad = Alanlar.Ad
Okuma.Soyad = Alanlar.Soyad
Okuma.Adres = Alanlar.Adres
157
Okuma.Tel = Alanlar.Tel
Okuma.Sehir = Alanlar.Sehir
End If
End Sub
Bu program satırında en son basılan tuş ASCII kodu 13 olan Enter ise, önce dosyadan GET deyimi
ile kayıt numarası verilen kayıt okunmaktadır. Get deyimi ile yapılan kayıt okuma işleminden sonra
kayda ait bütün bilgiler, Alanlar adlı Global ve Kayıt tipli değişkene aktarılmaktadır. Bu değişkenin
içeriğini ekranda gösterebilmek için TextBox nesnelerine aktarma işlemi yapılır. Alanlar adlı Global
ve kayıt tipli değişkeni tanımlayabilmek için bir önceki örnek projede olduğu gibi ayrı bir BAS
uzantılı module dosyasına dahil edilir.
Şekil 7.e-10
Proje çalıştırıldıktan sonra ekrana Formdaki ilk TextBox’a detayları ekrana getirilmek istenen
kaydın numarası girilip enter tuşuna basılacak olunursa kaydın içeriği ekrana getirilir.
Eğer dosyada olmayan kayıt numarası girilir entere basılırsa Visual Basic zil sesi ile uyarmakla
yetinir. Bu sırada kullanıcı Çıkış adlı düğmede tıklama yapacak olursa dosya Close deyimi ile
kapatılır. Ardından End deyimi ile projenin çalışması sona erdirir.
Private Sub Çıkış_Click()
Close #1
Unload.Okuma
End Sub
158
3. Kayıt Düzeltmek
Eğer kayıtta her hangi bir değişiklik yapılmışsa kaydın yeni şeklini tekrar hard diske yani dosyaya
yazalım. Ancak değişen kaydı hard diske yazmadan önce kullanıcıdan onay alalım.
Şekil 7.e-11
Kaydet düğmesi ile değişikliğe uğrayan kaydın tekrar dosyaya yazılması sağlanır. Vazgeç düğmesi
ile ekrana getirilen kayıt dosyaya yazılmak istenmediği zaman kullanılacak Bir önceki konuda olduğu
gibi proje başlatılır başlatılmaz daha önce verilen örnek projeler gibi kayıt girişi yapılan dosyayı Open
deyimi ile açalım. Bu amaçla program kodu penceresinden Object liste kutusunda Form nesnesi ve
Prog açılan nesne kutusunda Load olayı seçili durumda iken, dosyanın açılmasını sağlayacak program
satırlarını yazalım. Bir önceki projede aynı amaçla kullanılan satırlardan farklı değildir.
Private Sub Form_Load()
Open “Adres.dat” For Random As #1 Len = Len (Alanlar)
KayıtNo = LOF (1) / Len (Alanlar)
End Sub
Yine Adres.dat dosyası açıldıktan sonra Lof() fonksiyonu ile dosyanın byte olarak büyüklüğü ile
Len() fonksiyonu ile bir kaydın uzunluğu bulunup birbirine bölünerek dosyadaki toplam kayıt sayısı
hesaplanır. Program çalıştırılıp Form yüklendikten sonra kullanıcıdan ilk olarak düzeltilecek kaydın
numarası istenir. Düzeltilecek kaydın numarasının yazıldığı TextBox’a varsayım olarak dosyada
bulunan en büyük numaralı kaydın numarası gelir.
Şekil 7.e-12
159
Basılan tuşun Enter olması halinde kaydı dosyadan okuyup ekrana getiriyorduk. Ayrıca
anımsatmak gerekirse, klavyenin herhangi bir tuşuna basma işlemi sırasında meydana gelen olaya
Visual Basic dahilinde Key Press adı verilir (Şekil 7.e-12).
Bu program kodunun işletilmesi için imleç KayıtNo adlı metin kutusu nesnesinin içinde iken KeyPress
olayının meydana gelmesi gerekir. Eğer KeyPress olayına neden olan en son basılan tuş Enter ise
yordamda If ile End If deyimleri arasında kalan program satırları işletilir ve GET deyimi ile okunup
Alanlar adlı kayıt tipli değişkene aktarılan bilgiler daha sonra Düzeltme adlı Formda bulunan aynı adlı
TextBox’lara aktarılır.
Kayıt düzeltmek amacıyla hazırlanan bu projede Tab tuşu ile TextBox’lar arasında hareket etmeyi
engellemeye gerek yoktur. Tab tuşu ile bir seçenekten veya TextBox’tan ayrılma olayına LostFocus
adı verilmektedir. Kullanıcı ekrana getirip düzeltmek istediği kaydın numarasını girmeden Tab tuşuna
basarak KayıtNo_LostFocus veya Enter tuşuna basarak KayıtNo_KeyPress adlı yordamlardan birini
aktive edecek olursa, okunacak kayıt belli olmadığı için bir hataya neden olunur. Meydana gelme
olasılığı olan böyle bir hataya düşmemek için önlem alınmalıdır. Bunun için KayıtNo girilmeden Tab
tuşuna basılarak Get deyimi ile yapılacak kayıt okuma işlemini engellemek için aşağıdaki gibi bir
teknik kullanılmalıdır.
Şekil 7.e-13
Bu program kodunda iki fonksiyon ve “And” mantıksal operatörü vardır. Bazı eksiklerinden dolayı
yetersiz olan bu teknikle kullanıcı geçerli bir kayıt numarasını verip dosyadan okuma yapmadan
programdan çıkamaz. Çünkü geçersiz kayıt numarası gerildikçe SetFocus özelliği ile imlecin sürekli
olarak KayıtNo nesnesine girmesi sağlanmaktadır.
Okunup ekrana getirilen kayıtta kullanıcı istediği değişikliği yapabilir. Yapılan değişikliklerden
sonra kaydın yeni şeklini dosyaya tekrar yazmak için projenin Formuna Kaydet adlı bir düğme eklenir.
Bu düğmede tıklama yapılınca Kaydet_Click yordamı işletileceğinden kaydın son halini yazmada
kullanılacak Put deyimini bu yordama dahil edelim. Ancak ekrandaki kaydı dosyaya tekrar yazmadan
önce, kayıtta değişiklik yapılıp yapılmadığı konusunda araştırma yapılmalıdır.
.
160
Yukarıda ekran görüntüsü verilen program satırlarında yalnızca Ad ve Soyad’da değişiklik yapılıp
yapılmadığı konusunda araştırma yapıldı. Or mantıksal operatörüyle kayıtta yapılan değişiklikle ilgili
araştırmaya diğer TextBox’ların içeriklerini de dahil edebilirsiniz.
Kayıtta değişiklik yapılmışsa kaydın yeni şeklini dosyaya yazmadan önce kullanıcıdan onay
alınmaktadır. Bunun için iç içe iki IF-End IF işlem bloğu kullanılmıştır
Kullanıcı ekrana getirdiği kayıtta değişiklik yapmasına rağmen kaydın yeni halini dosyaya
yazmayıp vazgeçmesine veya başka bir kaydı ekrana getirebilmesine imkan sağlamak için Projenin
formuna Vazgeç adında bir düğme eklenir. Bu düğmede tıklama yapılınca işletilecek Vazgeç_Click
yordamı aşağıdadır (Şekil 7.e-15).
Şekil 7.e-15
Vazgeç düğmesine basılırsa ortaya çıkan MsgBox() diyalog kutusunda “Evet” ve “Hayır” tuşları
olmak üzere iki adet düğme vardır.
Kullanıcı bu soruya Evet cevabını verecek olursa önce Formdaki TextBox’ların içerikleri
temizlenir. Ardından dosyada bulunan kayıtların sayısı Lof() ve Len() fonksiyonları ile bulunup
KayıtNo değişkenine aktarılır. Yöneltilen soruya Hayır cevabı verilmesi halinde End deyimi ile
programın çalışması sona erdirilir. Formdaki çıkış düğmesi için yazılan program kodu bir önceki
örnek projede verilenden farklı değildir.
161
4. Dosyalardan Kayıt Silmek
Şekil 7.e-16
Bu form kayıt düzeltme işlemi için hazırlanan forma çok benzemektedir (Şekil 7.e-16). Diğer
konularda olduğu gibi Form yüklenince, başka bir deyişle proje çalıştırılınca silinecek kaydı içeren
dosya açılır ve dosyadaki kayıt sayısı bulunur.
Private Sub Form_Load()
Open “Adres.dat” For Random As #1 Len = Len (Alanlar)
KayıtNo = LOF (1) / Len (Alanlar)
End Sub
Proje çalıştırılıp dosya açıldıktan sonra imleç formdaki ilk TextBox’ta kullanıcıdan okunup
silinecek kaydın numarasını girmesini bekler. İstenen kayıt numarası girilip Enter veya Tab tuşuna
basılırsa, ilgili kayıt dosyadan okunup ekrana getirilir. Kayıt numarası girilip Enter tuşuna basıldığında
KayıtNo KeyPress olayı meydana gelir. KayıtNo_KeyPress yordamı bir önceki bölümde verilen aynı
adlı yordamdan pek farklı değildir (Şekil 7.e-17).
Şekil 7.e-17
Kayıt numarası girilen kayıt dosyada yoksa zil sesi ile uyarılır. Sil adlı düğmede tıklama yapılınca
Visual Basic dahilinde Sil_Click adında bir yordamı arar. Kayıt silmek için gerekli program kodları
Sil_Click yordamında yazılmıştır (Şekil 7.e-18).
162
Şekil 7.e-18
Sil Click yordamında kayıt silmek için daha doğrusu silinen kaydın dosyada yer kaplamasını
önlemek için Adres.Tmp adında geçici bir dosya oluşturulur. Silinen kayıt hariç dosyadaki bütün
kayıtlar bu dosyaya yazılır. Daha sonra bu geçici dosya asıl dosyanın üzerine kopyalanır. En son
olarak geçici dosya KILL deyimi ile hard diskten silinir
5. Menü Hazırlamak
Şimdi yukarıda sıra ile verilen GİRİŞ, OKUMA, DÜZELTME ve SİLME adlı projeleri bir araya
getirelim. Bu örnek projeleri birer modül olarak değerlendirip bir menüde birleştirelim. Bunun için
menü seçeneklerini içeren bir Form hazırlayıp, formu hard diske ANAFORM.FRM adıyla kaydedelim
(Şekil 7.e-19).
163
Şekil 7.e-19
Daha sonra hard diske ANA.VBP adıyla kaydedilen projeye GİRİŞ.FRM, OKUMA.FRM,
DÜZELTME.FRM ve SİLME.FRM adlı form dosyaları ve kayıt tipi değişken tanımlama satırlarını
içeren GİRİŞ.BAS adlı Module dosyaları projeye Project menüsündeki Add File komutu ile dahil
edilir.
Kullanıcı formdaki Kayıt Girişi başlıklı ilk düğmede tıklama yapınca proje içindeki adı
GİRİŞ olan form aktive olur. Bunun için menü görevi gören Ana formun KayıtGir_Click yordamı
aşağıdaki şekilde düzeltilir.
Private Sub KayıtGir_Click ()
GİRİŞ.Show
End Sub
ANA.VBP adlı projeye eklenen GİRİŞ formunda biraz değişiklik yaparak bu forma Menüye Dönüş
başlıklı ve Dönüş adında bir düğme ekleyelim. Menüde Dönüş düğmesinde tıklama yapılınca tekrar
projenin Ana adlı formu Show methodu ile aktif duruma getirmelidir.
Private Sub Dönüş_Click ()
Close #1
AnaForm.Show
End Sub
Çalışma anında Kayıt Giriş yapılan formdaki Menüye Dönüş başlıklı düğmede tıklama yapılınca
Ana adlı Form Aktif duruma getirilir. Bu sırada Giriş adlı formun bellekte olma özelliği devam eder.
Üzerinde çalışılan projede çok sayıda form varsa bütün formları bellekte tutmak bellek yetersizliğine
sorunlarına neden olabilir. Bu nedenle o sırada kullanılmayan formların UnLoad deyimi ile bellekten
çıkarılmaları gerekir.
164
Private Sub Dönüş_Click ()
Close #1
UnLoad GİRİŞ :AnaForm.Show
End Sub
7.f. Dosya ve Dizinler Üzerinde İşlem Yapmak
Bu bölümde Visual Basic projeleri dahilinde dosya ve dizinler üzerinde işlem yaparken kullanılan
bazı deyim ve fonksiyonlar hakkında bilgi verilecektir. Bu deyim ve fonksiyonlardan yararlanarak
Visual Basic projeleri dahilinde dosya kopyalayabilir, silebilir veya klasör hazırlayabilirsiniz.
1. CurDir, ChDir, MkDir ve RmDir Deyim ve Fonksiyonları
Bu deyim ve fonksiyonlar sayesinde çalışma anında geçerli klasör veya dizinin adını öğrenebilir,
başka bir dizine geçebilir, istediğinizi silebilir veya yeni bir dizin hazırlayabilirsiniz. Bu
165
fonksiyonlarının işlevini anlatmak için önce yeni bir proje hazırlayalım ve bu projenin Form_Click
yordamını aşağıdaki gibi düzenleyelim.
Private Sub Form_Click()
MsgBox CurDir
End Sub
Çalışma anında formun üzerinde tıklama yapılarak bu yordam işletilirse projenin çalıştırıldığı
sırada geçerli olan sürücü ve dizinin adı MsgBox deyimi ile ekrana yazılır. Bu projeyi hazırladığım
sırada C: sürücüsünün “\VB32” klasörü geçerli klasör durumundaydı.
Şimdi yukarıda ekran görüntüsü verdiğim Form_Click yordamında ChDir deyimi ile geçerli sürücü
ve dizini değiştirelim Form_Click yordamına eklediğimiz bu program satırı ile C: sürücüsünün kök (\)
dizisinin geçerli dizin olmasını sağlayalım.
Private Sub Form_Click()
ChDir “C: \ ”
MsgBox CurDir
End Sub
Bu değişiklikten sonra bu proje çalıştırılıp Form_Click yordamı işletilirse MsgBox deyimi bu kez
aşağıdaki gibi bir mesajı ekrana getirir (Şekil 7.f-1).
Şekil 7.f-1
CurDir fonksiyonu projenin çalıştırıldığı sırada geçerli olan sürücü ve dizinin adını belirler.
CurDir fonksiyonu parametre verilmeden deyim gibi kullanıldığı zaman geçerli sürücüdeki dizin
hakkında bilgi vermektedir. Diğer taraftan ChDrive fonksiyonu kullanılarak geçerli sürücüyü
değiştirebilirsiniz.
Private Sub Form_Click()
ChDrive “D”
ChDir “D: \Program Files ”
MsgBox CurDir
End Sub
Şimdi ise MkDir deyimi ile çalışma anında “D:” sürücüsünde kök dizisinin altında bir dizin
hazırlayalım. Bu amaçla Form_Click yordamını aşağıdaki gibi değiştirelim.
166
Private Sub Form_Click()
ChDrive “D”
ChDir “D: \ ”
MkDir “Örnejkler”
ChDir “D:\ Örnekler”
MsgBox CurDir
End Sub
İçeriği boş olan dizinleri silmek için RmDir deyiminden yararlanabilirsiniz.
Private Sub Form_Click()
ChDrive “D”
ChDir “D: \ ”
RmDir “Örnekler”
End Sub
2. FileCopy Deyimi
Bu deyimle bir sürücüden başka bir sürücüye, bir klasörden başka bir klasöre dosya
kopyalayabilir veya aynı klasör içinde dosyanın adını değiştirerek başka bir kopyasını
hazırlayabilirsiniz.
Private Sub Kopyala_Click()
FileCopy “C:\VB5Book \Ic.Doc”, “A:\Ic.Doc”
End Sub
3. Kill Deyimi – Dosya Silmek
Bilgisayarın herhangi bir sürücü ve dizinindeki bir veya birden fazla dosyayı bir seferde silmek
istiyorsanız Kill deyiminden yararlanabilirsiniz.
Private Sub Sil_Click()
Kill “A:\Ic.Doc”
End Sub
167
4. Name Deyimi – Dosya Adı Değiştirmek
İstediğiniz dosyanın veya dizinin adını değiştirebilirsiniz.
Private Sub Değiştir_Click()
Name
Text1.Text As Text2.Text
End Sub
5. FileLen ve FileDateTime Fonksiyonları
Diskte bulunan bir dosyanın byte olarak büyüklüğünü öğrenmek istiyorsanız FileLen
fonksiyonundan yararlanabilirsiniz. Bu fonksiyon dışardan parametre olarak büyüklüğü öğrenilmek
istenen dosyanın adını almaktadır. Dosya geçerli sürücü ve dizinde değilse, dosyanın yer aldığı dizini
dosya adına ekleyebilirsiniz.
Private Sub Büyüklük_Click()
Text2.Text = FileLen(Text1.Text)
End Sub
FileDateTime fonksiyonu sayesinde istediğiniz istenen dosyanın zaman bilgisini öğrenebilirsiniz.
Bu fonksiyona parametre olarak zaman bilgisi veya en son değiştirildiği tarihi öğrenilmek istenen
dosyanın adı verilir.
Private Sub Form_Click()
Dosya = FileDateTime(“C:\WINDOWS\Win.Com”)
MsgBox (Dosya)
End Sub
6. GetAttr Dosyaların Özniteliklerini Öğrenmek
GetAttr fonksiyonu ile çalışma anında istediğiniz dosyanın özniteliklerini öğrenebilirisiniz. GetAttr
fonksiyonu dışarıdan parametre olarak özniteliği öğrenilmek istenen dosyanın adını almaktadır. Eğer
GetAttr fonksiyonu kendisine parametre olarak verilen dosyanın özniteliği normal ise geriye 1 sayısal
değerini döndürür.
Geriye Döndürülen Değer
Dosyanın Özniteliği
0
Normal
1
Read only (Yalnız Okunur)
2
Hidden (Gizli Dosya)
4
System (Sistem Dosyası)
16
Directoy (Dizin)
7. SetAttr Dosyaların Özniteliklerini Değiştirmek
168
Diğer yandan çalışma anında SetAttr fonksiyon ile istediğiniz dosyanın özniteliğinde değişiklik
yapabilirsiniz. Eğer SetAttr deyimine ikinci parametre olarak 7 değerini verirseniz dosyaya Hidden,
ReadOny ve System özelliklerini bir seferde verilir.
Private Sub System_Click()
SetAttr, 7
End Sub
8. Dir Fonksiyonu
Bu fonksiyon DOS’un DIR komutu ile benzer işleve sahiptir. Bu fonksiyon sayesinde istediğiniz
klasördeki istediğiniz özelliklere sahip dosyaları bir formun üzerine yazabilir veya liste kutusu
nesnesine listeleyebilirsiniz.
Private Sub Form_Click()
Dosya = Dir (“*.*”)
End Sub
C:\ sürücüsündeki Windows klasöründeki EXE uzantılı dosyaların listelenmesi
Private Sub Form_Click()
Dosya = Dir (“C:\WINDOWS\ *.EXE”)
End Sub
8.a. Formlar ve Özellikleri
Visual Basic başlatıldığı zaman hazırlanan ve varsayılan adı Project1 olan projeye otomatik olarak
eklenen Form1 adındaki formu biraz yakından izleyelim. Daha konulardan bildiğiniz gibi projeye
dahil edilen her form tasarım anında Visual Basic penceresi içinde ayrı bir pencerenin içine
alınmaktadır (Şekil 8.a-1).
Şekil 8.a-1
169
Bütün pencerelerde olduğu gibi bir formu çevreleyen pencerenin başlık çubuğu vardır. Başlık
çubuğundan başka form nesnesini sınırlayan pencerenin sağ üst köşesinde Ekranı kapla, Simge
Durumuna Küçült ve Kapat düğmeleri bulunmaktadır. Üzerinde tire işareti olan düğmede tıklama
yapıldığı zaman formu içeren pencere form ile birlikte simge durumuna küçülmektedir.
Şekil 8.a-2 Denetim Menüsü
Eğer üzerinde çalıştığınız projede çok sayıda form varsa bazı formları simge durumuna küçültmek
isteyebilirsiniz. Form nesnesini çevreleyen pencerenin sol üst köşesinde Denetim Düğmesi
bulunmaktadır. Bu düğmede tıklama yaparsanız Denetim Menüsü açılır. Form nesnesini çevreleyen
pencerenin denetim menüsünde, pencereyi simge durumuna küçültmede kullanılan Simge Durumuna
Küçült ve Visual Basic penceresini kaplamasını sağlayan Ekranı Kapla gibi komutlar bulunmaktadır.
Formu içeren pencerenin denetim menüsündeki Close komutu ile form kapatılır. Formu içeren
pencereyi kapattıktan sonra, form üzerinde işlem yapmaya gerek duymanız halinde Project Explorer
penceresinden veya View menüsündeki Object komutundan yararlanabilirsiniz.
Formlarla ilgili olarak anlatılacak olanları 3 gruba ayırmak gerekir. Bunlardan birincisi ve syıca en
kalabalık olanı formun özelliklerini belirlemede kullanılan Properties’lerdir. Formların birçok
özelliğinin Properties penceresinden yararlanarak belirlendiğini biliyorsunuz. Formlarla ilgili olarak 2.
sırada anlatılması gerekenler ise formlara uygulanan Olaylar yani Event’lardır. Formun yüklenmesi
(Load) ve formun üzerinde fare ile tıklama yapılması (Click) akla gelecek Event’lardır. Formla ilgili
olarak 3. sırada anlatılması gerekenler, formlara uygulanan methodlardır. Örneğin formun üzerine
Print methodu ile sabit bir bilgi veya bir değişkenin içeriğini yazmak, formlara uygulanan işlemlere
örnek olarak verilebilir.
1. Properties
Formlar Visual Basic projelerinin en önemli nesneleridir. Bütün nesnelerde olduğu gibi formların
boyutlar, aktif olduğu sırada ekrandaki yeri, rengi, kenar çizgileri başlığı gibi özellikleri söz
konusudur. Üzerinde çalıştığınız projeye yeni bir form eklediğinizde veya daha önce hazırlanıp hard
diske kaydedilmiş bir formu projeye dahil ettiğinizde formun her özelliği için ayrı bir değişken Visual
Basic tarafından otomatik olarak tanımlanır.
Çalışma veya tasarım anında söz konusu form kapatıldığında ise bu forma ait bütün değişkenler
bellekten silinir. Forma ait olan ve formun hazırlanıp projeye dahil edilmesi ile birlikte otomatik
olarak tanımlanan değişkenlerden, kitabın bazı sayfalarında Sistem Değişkenleri diye söz edildi.
Forma ait veya form hakkında bilgi içeren değişkenlere Visual Basic dahilinde Properties veya
Özellik denilmektedir.
Bu değişkenlerinin çoğunun içeriklerini tasarım anında View menüsündeki Properties Window
(F-4) komutu ile ekrana getirilen Properties penceresinde değiştirebilirsiniz (Şekil 8.a-3). Buna göre
tasarım anında formların bir çok özelliği Properties penceresinden ayarlanabilmektedir.
170
Şekil 8.a-3
Formların bazı özellikleri var ki bunları ancak çalışma anında değiştirmek mümkün ve anlamlı
olmaktadır. Örneğin Print gibi çıkış deyimleri ile Formlara bilgi yazmadan önce yazma işleminin
başlayacağı yeri belirlemeye yarayan CurrentX ve CuurentY gibi değişkenlerin içeriğini tasarım
anında Properties penceresinde değiştirmek anlamlı değildir.
Şekil 8.a-4
Projelerde birden fazla form bulunabileceğinden Properties penceresinde sıralanan özelliklerin
hangi forma ait olduğunu Properties penceresinin başlık satırından sonraki ilk satırına bakarak tespit
edebilirsiniz. Visual Basic, adı gibi Görsel bir uygulama geliştirme aracı olduğu için Formların bir çok
özelliği için Properties penceresine başvurmaya gerek kalmadan fare ile ekranda çizim yapar gibi
işlem yapabilirsiniz. Örneğin formun boyutlarını fare ile belirliyebilirsiniz.
Yine Formların bazı özellikleri var ki çalışma anında bunlarda değişiklik yapmak mümkün değildir.
Formların bu özelliklerine ancak tasarım anında müdahale edilebilir. Çalışma anında formların
özelliklerinde değişiklik yapmak, normal bir değişkene bilgi aktarmaktan farklı değildir.
171
Daha önceki konulardan hatırlayacağınız gibi program kodu yazarak nesnelerin özelliklerinde
değişiklik yapmadan önce nesnenin (Form) adı ve ardından nesnenin değişiklik yapılmak istenen
özelliğinin adı yazılır. En son olarak aktarma operatörü (=) ile değişkene bilgi aktarma işlemi yapılır.
Örneğin formların başlık bilgileri Caption değişkeninde veya Caption özelliğinde saklanmaktadır.
Çalışma anında Formun başlığında değişiklik yapmak istiyorsanız Caption adlı Form değişkeninin
içeriğini aşağıdaki gibi değiştirebilirsiniz.
Private Sub Form_Click()
Form1.Caption = “Visual Basic”
End Sub
2. Formlara Simge Durumuna Küçültme Özelliği Vermek
Visual Basic dahilinde yeni hazırlanan formlarda varsayım olarak simge durumuna küçültme
özelliği bulunmaktadır. Ancak bazı durumlarda kullanılan formların simge durumuna küçülebilir
olması istenmez.
Visual Basic projesi dahilinde hazırladığınız formun simge durumuna küçülebilme özelliğinin
olmasını istemiyorsanız Properties penceresinde Forma ait MinButton özelliğine False değerini
aktarmanız gerekir (Şekil 8.a-6).
Şekil 8.a-5
Visual Basic projeleri dahilinde açılan Windows uyumlu pencerelerde varsayım olarak Simge
durumuna Küçült düğmesinden başka bir de pencerenin bütün ekranı kaplamasını sağlayan Ekranı
Kapla düğmesi bulunur. Eğer pencerede ekranı kapla özelliğinin olmasını istemiyorsanız MaxButton
özelliğine False değerini aktarmanız gerekir (Şekil 8.a-6)
172
Şekil 8.a-6
3. Formlara Ekranı Kaplama Özelliği Vermek
Visual Basic projeleri dahilinde Windows uyumlu pencerelerde varsayım olarak Simge Durumuna
Küçült düğmesinden başka bir de pencerenin ekranı kaplamasını sağlayan Ekranı Kapla düğmesi
bulunur (Şekil 8.a-5). Eğer pencerede ekranı kaplama özelliğinin olmasını istemiyorsanız Properties
penceresinde MaxButton özelliğine False değerini aktarmalısınız.(Şekil 8.a-7).
Şekil 8.a-7
4. Denetim Düğmesi ve Menüsü
Bütün Windows uyumlu pencerelerde olduğu gibi Visual Basic projeleri dahilinde hazırlanan
Form veya pencerelerde varsayım olarak Denetim düğmesi bulunmaktadır. Denetim düğmesinde
tıklama yaparsanız denetim menüsü açılır. Denetim Menüsünü açmak için Alt tuşundan
yararlanabilirsiniz. Alt tuşuna basarsanız denetim düğmesi seçili duruma gelir. Denetim düğmesi seçili
durumda iken aşağı ok veya enter tuşuna basılırsa formun veya pencerenin denetim menüsü açılır.
Şekil 8.a-8
Denetim Menüsündeki komutlarla pencerenin (Form) simge durumuna küçültmesi, ekranı
kaplaması ve kapatılması gibi işlemler yapılabilir. Eğer pencerenin simge durumuna küçülebilme
özelliği yoksa, Denetim menüsünde Simge Durumuna Küçült komutu bulunmaz
173
Şekil 8.a-9
Formlarda denetim düğmesinin ve dolayısıyla denetim menüsünün bulunmasını istemiyorsanız
Properties penceresinde ControlBox özelliğine false değerini aktarmanız yeterlidir (Şekil 8.a-9).
ControlBox özelliği False yapılan Formda, çalışma anında MaxButton ve Minbutton özelliklerinin
içeriklerine bakılmaksızın Ekranı Kapla, Simge durumuna Küçült ve Kapat düğmeleri formun sağ üst
köşesinden kaldırılır.
5. Çalışma Anında Formun Boyutlarını Fare İle Değiştirmek
Çalışma anında fare ile veya program kodu yazarak formların boyutlarını istediğiniz gibi
değiştirebilirsiniz. Eğer Visual Basic uygulamaları dahilinde hazırladığınız form veya pencerelerin
boyutlarında projenin çalışması sırasında değişiklik yapılmasını engellemek istiyorsanız, formu
hazırlarken Properties penceresinde forma ait BorderStyle özelliğinde değişiklik yapmalısınız.
Forma ait Border Sytle özelliği 2-Sizable değerini içeriyorken çalışma anında formun boyutlarını fare
ile değiştirebilirsiniz.
174
Şekil 8.a-10
Eğer çalışma anında formun sınırlarını çizgi ile belirlemek istemiyorsanız BorderStyle özelliğine
0-None değerini aktarmalısınız. BorderStyle özelliğine 0-None değeri aktarılan pencere veya form
ekrana getirildiği zaman pencerede başlık bilgisi hem de düğmeler kaybolur (Şekil 8.a-11).
Şekil 8.a-11
BorderStyle özelliğine 3-Fixed Dialog değerini aktaracak olursanız forma ait Maxbutton ve
MinButton özelliğinin True veya False olup olmadığına bakılmaksızın simge durumuna küçült ve
ekranı kapla düğmeleri pencerenin sağ üst köşesinden kaldırılır.
Formun BorderStyle özelliğine 4-Fixed ToolWindow değerini aktarırsanız çalışma anında Formun
ControlBox özelliğine bakılmaksızın denetim düğmesi kapatılır.
6. Form Başlığı ve Form Adı
175
Formun başlık bilgisini değiştirmek için Properties penceresinde Caption özelliğinden yararlanılır.
Properties penceresinde forma verilen başlık bilgisi eş zamanlı olarak formun başlığına yazılır
(Şekil 8.a-12).
Şekil 8.a-12
Çalışma anında formların başlıklarında değişiklik yapabilirsiniz.
Private Sub Form_Click()
Caption =” Tutanak”
End Sub
Ancak üzerinde çalışılan prpjede çok sayıda form varsa hangi formun başlığında değişiklik
yapılacağı belirtilmelidir. Gerçekte bir Object (nesne) olan formların özelliklerinde değişiklik
yaparken önce nesnenin ve ardından özellik adının yazıldığını biliyorsunuz. Nesne adı ile özellik adını
birbirinden ayırmak için aralarına nokta (.) konur.
Private Sub Form_Click()
Form1.Caption =”Tutanak”
End Sub
Formların başlıklarından başka bir de proje içinde geçerli olmak üzere adı vardır. Form ile ilgili
olarak yapılan her işlemde sürekli olarak o formun proje içindeki adına başvurulur. Yukarıda verilen
program kodundaki “Form1” aslında formun adıdır. Projeye eklenmiş olan formlara ad vermek veya
verilen adlarda değişiklik yapmak için Properties penceresinde Name özelliğinden yararlanılır
(Şekil 8.a-12).
176
Formlara ad verirken Formun adı ile Formun kullanım amacı arasında benzerlik olması önerilir.
Formun adı ile işlevi arasında benzerlik olması halinde program kodlarını incelemek ve anlamak daha
kolay olur. Çalışma anında program kodu yazarak Formların Name özelliklerini değiştiremezsiniz.
7. Formun Boyutlarını Belirlemek
Yukarıdaki sayfalarda formun boyutlarını çalışma anında ve tasarım anında Fare ile veya Denetim
menüsündeki Boyut komutu ile değiştirilebileceği belirtilmişti. Çalışma ve tasarım anında form veya
pencerenin güncel boyutları Visual basic tarafından otomatik olarak tanımlanan Width ve Height
değişkenlerinde tutulmaktadır. Yine hatırlatmak gerekirse Visual Basic’te varsayım olarak Twip
birimi kullanılmaktadır.
Şekil 8.a-13 Width Değişkeni
Tasarım anında fare ile formun boyutlarında yapılan değişikliklerden Width ve Height değişkenleri
anında etkilenir. Programcı isterse formun boyutlarını fare ile belirlemek yerine doğrudan Properties
penceresinde Twip cinsinden Width ve Height değişkenlerin içeriklerinde değişiklik yapabilir.
Şekil 8.a-14 Height Değişkeni
177
Formların boyutlarını çalışma anında program kodu yazarak Width ve Height değişkenleri
yardımıyla değiştirebilirsiniz.
Private Sub Form_Click()
Form1. Width
=
Form1.Width
-
Form1.Height
=
Form1.Height -
250
250
End Sub
8. Formun Masaüstündeki Yerini Belirlemek
Formun ekrandaki konumu Left ve Top özellikleri ile belirlenir. Başlangıçta yani proje
çalıştırıldığı zaman forma ait Left ve Top özellikleri 0 değerini içerdikleri için projenin başlangıç
formu ekranın sol üst köşesine yerleşir. Formun masaüstündeki konumunu tasarım anında Properties
penceresinden yararlanarak belirlemek yerine program kodu yazarak Left ve Top değişkenlerinin
içeriklerinde değişiklik yapabilirsiniz (Şekil 8.a-15 ve Şekil 8.a-16).
Şekil 8.a-15
Şekil 8.a-16
Formun masaüstündeki konumunu tasarım anında Properties penceresinden yararlanarak
belirlemek yerine program kodu yazarak Left ve Top değişkenlerinin içeriklerinde değişiklik
yapabilirsiniz.
Private Sub Form_Click()
178
Form1. Left
Form1.Top
=
=
Form1.Left
Form1.Top
+
+
250
250
End Sub
Diğer taraftan StartUpPosition özelliğinden yararlanarak form açılıp ekrana ilk getirildiği zaman
masaüstündeki yerini belirleyebilirsiniz. Bu özelliğe CenterScreen değerini aktarmanız halinde form
ekrana ilk getirildiği zaman form ekranın ortasına yerleştirilir (Şekil 8.a-17).
Şekil 8.a-17
9. Formlar İçin Font Seçimi
Form dahilinde yapılacak yazma ve çizme işlemlerinde geçerli olacak Font ve Punto değeri Visual
Basic tarafından otomatik olarak hazırlanan değişkenlerde saklanmaktadır. Üzerinde çalışılan projeye
yeni bir form eklendiği zaman Formda 8 punto büyüklüğünde Ms Sans Serif fontunun kullanılacağı
varsayılır. Form dahilinde geçerli olacak fontun adı ve Punto değeri Font adlı form değişkeninde
saklanmaktadır (Şekil 8.a-18).
Şekil 8.a-18
179
Properties penceresinde Font seçeneğinin sonuna konulan ve üzerinde 3 nokta olan düğmede
tıklama yaparsanız ekrana bir diyalog kutusu içinde ona kadar sisteme yüklenmiş olan fontlar
listelenir
(Şekil 8.a-19).
Şekil 8.a-19
Bilgisayara kurulu olan fontlardan istediğinizi seçip kullanabilirsiniz. Ancak Türkçe karakter
desteği olmayan fontları kullanmanız halinde Türkçe’ye özgü harfleri ekrana yazarken bazı sorunlarla
karşılaşabilirsiniz.
Diğer yandan program kodu yazarak çalışma anında istediğiniz şekilde Font ve punto değişikliği
yapabilirsiniz. FontName özelliğinden yararlanarak seçtiğiniz fonta koyu özelliği vermek istiyorsanız
FontBond değişkenine True değerini aktarmanız gerekir. Benzer şekilde yazıların italik olmasını
istiyorsanız ve altı çizili olmasını istiyorsanız FontUnderline adlı Form değişkenlerine True değerini
aktarmalısınız. FontStrikeThru değişkenin içeriği True iken yazıların üstü çizilir.
Private Sub Form_Click()
CurrentX = 700 : CurrentY = 700
FontSize = 20
FontName = “Ariel”
FontBond = True
FontItalic = True
Print “ Hasan DURGUT”
End Sub
Diğer yandan kullanılacak fontların programın yazımı sırasında programcı tarafından belirlenmesi
pratik değildir. Çünkü programın yazımı sırasında kullanılan bilgisayara yüklü olan bilgisayara yüklü
olan fontlar, yazılan programın çalıştırılacağı bilgisayara yüklü olan fontlar farklı olabilir.
180
10. Forma Resim Dosyası Yüklemek
Varsayım olarak başlangıçta formun zemini boş durumdadır. Eğer form içinde tasarım veya
çalışma anında hazır bir resim dosyasını kullanmak istiyorsanız forma ait Picture değişkeninden
yararlanabilirsiniz. Formların üzerinde değişik tip ve formatta (Bitmap, Icon, Metafile) dosyalar
kullanılabilir. Formun zemin rengini BackColor adlı form değişkeni ile değiştirebilirsiniz.
Şekil 8.a-20
Çalışma anında forma ikon ve bir resim dosyası eklemek için LoadPicture fonksiyonundan
yararlanılır. LoadPicture fonksiyonu ile hard disken okunan resim veya ikon dosyası forma ait Picture
değişkenine aktarılır.
Private Sub Form_Load()
Form1. Picture
End
=
LoadPicture(C:\VB5\Graphic\Resim.Bmp
Sub
Forma dahil edilecek resim dosyası, programın işletimi sırasında yani çalışma anında
belirlenebilir. Bu amaçla çalışma anında Forma dahil edilecek resim dosyasının adı kullanıcıdan
istenir. Kullanıcının seçtiği dosyanın adı bir değişkene aktarılır.
Private Sub Form_Load()
Resim = InputBox ( “Forma dahil edilecek resim dosyası”)
Form1. Picture
End
=
LoadPicture(Resim)
Sub
11. Zemin Rengi Seçimi
Formlarda zemin rengi varsayım olarak gridir. Eğer zemin rengi olarak griden farklı bir rengi
kullanmak istiyorsanız BackColor özelliğinden yararlanmanız gerekir (Şekil 8.a-21)
181
Şekil 8.a-21
Properties penceresinde ışıklı bantı BackColor değişkenin üzerinde götürecek olursanız geçerli renk
adının yazıldığı metin liste kutusu özelliğini kazanır. Bu liste kutusunu açarak daha önce Denetim
Masası uygulamasından yararlanarak menüler, masaüstü ve pencere başlıkları için seçilen renklerden
birini seçebilirsiniz.
Formların zemin renklerini tasarım anında olduğu gibi çalışma anında program kodu yazarak
değiştirebilirsiniz. Yapmanız gereken, zeminde kullanmak istediğiniz rengin kodunu formun
BackColor değişkenine aktarmaktan ibarettir.
Private Sub Form_Load()
Form1. BackColor
End
=
&H8OFF80
Sub
Kullanılacak renklerin sayısı bilgisayarın grafik özelliklerine bağlı olarak değişmekle birlikte
Visual Basic 16 milyon rengi desteklemektedir. Zamana bağlı olarak BackColor değişkenin içeriğini
değiştirmek için Form dahilinde renk geçişleri yapılabilir. Çalışma anında renk seçimi için RGB()
fonksiyonundan yararlanabilirsiniz. RGB() fonksiyonu dışarıdan 3 parametre almaktadır. Bu
parametreler sırası ile Kırmızı, Yeşil ve Mavi renkleri temsil eden sayısal kodlardır. Bu 3 parametre 0
ile 255 arasında değişen değeler alabilmektedir.
Eğer BackColor değişkenine aktarılmak üzere RGB() fonksiyonuna 255,0,0 değerleri verilirse, zemin
rengi tam kırmızı olur. Çünkü kırmızı renk için en yüksek değer verilirken, yeşil ve mavi renk için en
düşük değer verilmiş durumdadır. Eğer renk elde etmek amacıyla kullanılan RGB() fonksiyonu
RGB(0,0,255) şeklinde kullanılırsa bu kez zemin rengi tam mavi olurdu. Her üç parametrede 100
olarak seçilmiş olunsaydı RGB() fonksiyonu ile kırmızı, mavi ve yeşil renklerin aynı oarnda birbirine
karıştırılmış bir renk elde edilirdi.
Form_Load fonksiyonu dahilinde kullanılan “BackColor= &H80FF80” satırında “&H” karakterleri
renk kodlarını belirlemek üzere kullanılan sayıların 16 tabanlı olduğunu belirtmektedir. Yazılıştaki
182
“80” rakamı kırmızı renk oranını belirtirken , “FF” yeşil ve ikinci 80 ise mavi renk oranını
belirtmektedir.
12. Formun Başlangıç Durumunu Seçmek
Şimdiye kadar verilen örneklerde Visual Basic projesine dahil edilen bir form yüklendiği zaman,
tasarlandığı şekli ile ekrana geliyordu. Formun Simge Durumuna Küçültme ve Ekranı kaplama
özellikleri pasif durumda getirilmediyse daha sonra kullanıcı Formun ekranı kaplamasını veya simge
durumuna küçültmesini sağlayabiliyordu. WindowState adlı form özelliği ile yüklenen bir formun
başlangıç durumunu seçebilirsiniz.
Şekil 8.a-22
WindowState değişkeni varsayım olarak 0-Normal değerine sahiptir. Eğer formun yüklenir
yüklenmez ekranı kaplamasını veya hemen simge durumuna geçmesini istiyorsanız WindowState
değişkeninin içerisinde değişiklik yapmalısınız. Form ekrana getirilir getirilmez simge durumuna
geçmesini istiyorsanız WindowsState özelliğine 1-Minimized, ekranı kaplamasını istiyorsanız 2Maximized değerini aktarmanız gerekir. Formun ekrandaki durumunu program kodu yazarak çalışma
anında değiştirebilirsiniz.
Private Sub Form_Click()
Form1. WindowState = 2-Maximized
End
Sub
13. Formlar İçin İkon Seçmek
Eğer çalışma anında Visual Basic dahilinde ekrana getirilen formun görev çubuğunda varsayılan
ikondan farklı bir ikon ile temsil edilmesini istiyorsanız formlara ait Icon değişkeninden
yararlanabilirsiniz.
183
Şekil 8.a-23
Visual Basic dahilinde hazırlanan projede çok sayıda Form varsa her form için farklı ve formun
kullanış amacını anımsatan ikonlar kullanılabilir. Tasarım anında Properties penceresinde Icon
değişkenin üzerinde çift tıklama yapılırsa Visual Basic ile birlikte verilen ikonlar Load Icon diyalog
kutusu içinde listelenir.
Başlangıçta Visual Basic projeleri dahilinde açılan her form için Görev Çubuğunda bir düğme
hazırlanmaktadır. Eğer bu özelliği kapatmak ShowInTaskbar özelliğine False değerini aktarmanız
yeterlidir.
Şekil 8.a-24
14. Ölçekleme Birimini Seçmek
Visual Basic’te nesne veya formlarda varsayım olarak Twip ölçü birimi kullanılmaktadır. 1 inç
yaklaşık olarak 1440 Twip’e karşılık gelmektedir. Visual Basic dahilinde Twip’ten farklı ölçü
birimlerini kullanma imkanı kısıtlı da olsa vardır. Width ve Height ile formun genişliğini ve
yüksekliğini belirlerken, Left ve Top özellikleri ile Formun ekrandaki konumu belirlenmektedir.
Width, Height, Top ve Left için ölçü birimi mutlaka Twip olmak zorundadır.
184
Şekil 8.a-25
Formun boyutlarını ve ekrandaki yerini belirleme dışında, Form dahilinde kullanılmak üzere yeni
bir ölçü birimi kullanılabilir. Form dahilinde geçerli olmak üzere ölçü birimini değiştirmek için
ScaleMode değişkeninden yararlanılır (Şekil 8.a-25).
Form dahilinde kullanılabilecek ölçü birimi çalışma anında da değiştirilebilir. Bunun için
ScaleMode değişkenine kullanılmak istenen ölçü biriminin adını aktarmak yeterlidir.
Private Sub Form_Load()
Show
FontSize = 20
FontName = “Arial”
ScaleMode = 6-Milimeter
CurrentY = 10
CurrentX = 10
Print “Deneme yazısı”
End
Sub
ScaleLeft ve ScaleTop değişkenleri mevcut koordinat sistemini yeniden tanımlamaya yararlar.
Başlangıçta form penceresinin sol üst köşesinin koordinatının (0,0) olduğunu biliyorsunuz. Form
penceresinin sağ alt köşesinin koordinatı ise (Width, Height) değişkenlerinin içeriklerine veya formun
boyutlarına göre değişmektedir. ScaleLeft ve ScaleTop değişkenlerine Negatif değerinin aktarılması
işlemin yapıldığı program kodu çalıştırılınca formun bilgi yazılacak yerini aşağıya ve sağa doğru
çekmektedir. ScaleLeft ve ScaleTop değişkenlerine aktarılan Pozitif değerler ise formun bilgi
yazılacak yerini yukarıya ve sola doğru çekmektedir.
15. Farenin Şeklini Değiştirmek
Windows uyumlu programlarda fare işareti bulunduğu ortama göre yapılabilecek işlemleri işaret
etmek üzere şekil değişikliğine uğramaktadır. Benzer etkiyi Visual Basic programların dahilinde
vermek mümkündür. Bu amaçla MousePointer adlı Form değişkeninden yararlanılır (Şekil 8.a-26).
185
Şekil 8.a-26
MousePointer değişkenine aktarılabilecek ve fare işaretini temsil eden 13 adet sabit değer vardır. 0
numaralı olan ilki fare işareti görünümünü temsil eder. Fare işaretlerini ve bunları temsil eden sayısal
değerler aşağıda gösterilmiştir.
İçerik
Değer
Tanımlama
vbDefault
0
Default
Vbarrow
1
Arrow
VbCrosshair
2
Cross
VbIbeam
3
I beam.
VbIconPointer
4
Icon
VbSizePointer
5
Size
VbSizeNESW
6
Size NE SW
VbSizeNS
7
Size N S
VbSizeNWSE
8
Size NW SE
VbSizeWE
9
Size W E
VbUpArrow
10
Up Arrow.
VbHourglass
11
Hourglass
VbNoDrop
12
No Drop.
VbArrowHourglass
13
Arrow and hourglass.
vbArrowQuestion
14
Arrow and question mark
VbSizeAll
15
Size all.
VbCustom
99
Custom icon specified by the MouseIcon property.
186
Fare işaretini projenin çalışması sırasında alacağı görünümü tasarım veya çalışma anında
değiştirmek için MousePointer değişkenine simgeyi temsil eden sayısal değer aktarılır.
Private Sub Form_Click ()
Dim I
Screen.MousePointer = vbHourglass
‘11
For I = 0 To ScaleWidth Step 50
ForeColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Circle (I, ScaleHeight * Rnd), 400
Next
End Sub
Fare işareti olarak hard diskte bulunan ICO uzantılı dosyalardan birini kullanmak istiyorsanız önce
MousePointer özelliğine 99 değerini aktarmanız gerekir. MousePointer özelliğine 99 değerini
aktardıktan sonra MouseIcon özelliğinden yararlanarak ICO dosyası seçimi yapmalısınız (Şekil 8.a27)
Şekil 8.a-27
16. Formları Kullanılamaz Duruma Getirmek
Özellikle çok sayıda form içeren projelerde bazı durumlarda formlardan birinin kullanılamaz
duruma getirilmesi istenebilir. Bu formu kullanılamaz duruma getirmek için Enabled özelliğinden
yararlanılır (Şekil 8.a-28).
187
Şekil 8.a-28
Bu değişkenin içeriği True ise söz konusu Form üzerinde izin verilen her türlü işlem yapılabilir.
Enabled değişkeninin içeriği False olduğu sürece Form üzerinde herhangi bir işlem yapılamaz. Form
kapatılamaz ve simge durumuna küçültülemez.
Private Sub Command_Click()
Form1. Enabled
End
=
False
Sub
17. Çizgi Kalınlığını Seçmek
Formun üzerine Line fonksiyonu ile çizgi çizerken veya Circle ile daire çizerken geçerli olmak
üzere çizgi kalınlığını tasarım veya çalışma anında değiştirebilirsiniz. Bu amaçla DrawWidth adlı
form değişkeninden yararlanılır.
Şekil 8.a-29
DrawWidth değişkeni başlangıçta 1 değerine sahiptir. Bu değişkenin işlevini göstermek için Form1
adında bir tek form içeren örnek proje aşağıda gösterilmiştir.
Private Sub Command1_Click()
For S =1
To
30
Step
188
2
DrawWidth = S
Line (S
* 200, 300)-(S * 200,1500)
Next S
End
Sub
Çalışma anında Form_Click yordamını işletmek üzere Formun üzerine tıklama yapılınca aşağıda
verilen ekran görüntüsü elde edilir.
Şekil 8.a-30
18. Projelerde Birden Fazla Form Kullanmak
Projelerde ilk formun proje hazırlandığında otomatik olarak oluşturulup dahil edildiğini
biliyorsunuz. Projeye ikinci bir formu eklemek için Project menüsünden Add Form komutunu
vermeniz gerekir. İki form içeren proje çalışmaya başlatıldığında projenin ilk formu durumundaki
“Form1” otomatik olarak yüklenir. Projedeki ilk formun tersine ikinci form otomatik olarak
yüklenmez ve ekrana getirilmez. Projedeki 2.formun ayrıca Show veya Load komutu ile belleğe
yüklenmesi gerekir. Projedeki 2.formun yüklenmesini sağlamak için ilk forma ait Form_Click
yordamına Form2.Show satırını eklemek gerekir. Show deyimi (method) ile kendisinden önce yazılan
Form, daha önce belleğe yüklenmişse hemen aktif duruma getirilir. Form belleğe henüz
yüklenmemişse belleğe yüklenip hemen aktif duruma getirilir. Aynı anda birden fazla Form belleğe
yüklenebilir ama bunlardan yalnızca birisi aktif durumda olabilir.
19. Örnek / Formu yeniden boyutlamak
Private Sub Form_Resize()
Check1.Move 50, 50
Label1.Move 90, Check1.Height + 150
End Sub
189
Private Sub Check1_Click()
If Check1.Value = 1 Then
Form1.Height = 500 + Check1.Height + Label1.Height
Else
Form1.Height = 500 + Check1.Height
End If
End Sub
Private Sub Form_Load()
Check1.Caption = "Show me more"
Label1.Caption = "Teşekkür ederim"
Form1.Height = 500 + Check1.Height
End Sub
20. Örnek / Formu aktif hale getirmek
Form1
Sub Form2_load()
lngOrigParenthWnd = SetWindowWord(Me.hwnd, -8,
mdiMain.hwnd)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim lngResult&
lngResult = SetWindowWord(Me.hwnd, -8, lngOrigParenthWnd)
End Sub
Sub Command1_click()
Form2.Show
End Sub
190
Form2 General Declaration
Private Declare Function SetWindowWord Lib "user32" (ByVal
hwnd&,_
ByVal nIndex&, ByVal wNewWord&) As Long
Private lngOrigParenthWnd&
8.b. Formlara Uygulanan Olaylar
Visual Basic uygulaması dahilinde hangi nesne kullanılırsa kullanılsın, o nesne için tanımlı olan
birkaç olay mutlaka vardır. Formun üzerinde farenin tıklaması, farenin gezdirilmesi veya formun
boyutlarının değiştirilmesi işlemi birer olaydır.
Henüz herhangi bir nesne eklenmemiş bir form için Visual Basic tarafından otomatik olarak
tanımlanan olayların adlarını görmek için formun kod penceresi açılır. Bildiğiniz gibi kod
penceresinde 2 liste bulunmaktadır. Object liste kutusunda üzerinde çalışılan formun üzerine
yerleştirilmiş olan nesneler listelenmektedir. Nesnelerden başka Object kutusunda (general) adında bir
seçenek daha bulunmaktadır. Form dahilinde hazırlanan bütün yordamlarda geçerli olması istenen
değişkenler forma ait (general) kısmında tanımlanır (Şekil 8.b-1).
Şekil 8.b-1
Object liste kutusunda Form nesnesi seçili durumda iken kod penceresindeki Prog liste kutusunda
formlar için önceden tanımlı olan olaylar listelenir. Daha önceden tanımlı olan olaylardan biri çalışma
anında meydana geldiği zaman yapılacak işlemleri belirlemek için olayla aynı ada sahip bir yordam
hazırlanır.
Yordam adında ayrıca “Form” ön eki bulunur. Aslında burada yordam hazırlamaktan öte yordam
için program kodu girişi yapılır. Çünkü üzerinde çalışılan projeye yeni bir form dahil edildiği zaman,
form için önceden tanımlı her olay için otomatik olarak ayrıca bir yordam kalıbı hazırlanmaktadır.
191
Şekil 8.b-2
1. Formların Yüklenmesi – Form_Load Yordamı
Visual Basic programları dahilinde bir formun belleğe yüklenmesi veya Load edilmesi bir olaydır
(Event). Bu olaya karşılık olarak forma ait program kodu penceresinde Form_Load yordamının kalıbı
otomatik olarak hazırlanır. Formun yüklenmesi sırasında işletilmesini istediğiniz program kodlarını
Form_Load yordamına yazmanız gerekir.
Bir formun aktive olması için belleğe yüklenmesi yeterli olmaz. Formun ayrıca aktif form olarak
seçilmesi gerekir. Bu amaçla Show methodunun kullanılması gerekir.
Private Sub Form_Click()
Form2.Show
End Sub
2. Formların Aktif ve Pasif Duruma Getirilmesi
Eğer üzerinde çalıştığınız proje yalnızca bir forma sahipse, formların belleğe yüklenmesi veya
bellekten silinmesi gibi sorunlarla ilgilenmenize gerek yoktur. Belleğe yüklenen bir formu ekrana
getirmek veya aktive etmek için Show deyiminden yararlanılmaktadır. Show deyimi ile ekrana
getirilmek istenen form önceden belleğe yüklenmişse hemen aktive edilir. Ancak Show deyimi ile
ekrana getirilmek istenen form henüz belleğe yüklenmemişse önce belleğe yüklenir ondan sonra
ekrana getirilir. Buna göre Show deyimi gerektiğinde Load deyiminin işlevini de yüklenmektedir.
192
Private Sub Form_Activate()
Private Sub Form_Activate()
Cls
Cls
FontSize = 20
FontSize = 20
CurrentX = 700
CurrentX = 700
CurrentY = 700
CurrentY = 700
Print "Aktif Form"
Print "Aktif Form"
End Sub
End Sub
Private Sub Form_Deactivate()
Private Sub Form_Deactivate()
Cls
Cls
FontSize = 20
FontSize = 20
CurrentX = 700
CurrentX = 700
CurrentY = 700
CurrentY = 700
Print "Pasif Form"
Print "Pasif Form"
End Sub
End Sub
Private Sub Form_Load()
Form2.Show
End Sub
Bir Show deyimi ile ekrana getirilirken Activate olayı meydana gelir. Activate olayı meydana
geldiği zaman söz konusu forma ait Form_Activate yordamı otomatik olarak işletilir. Başlangıçta
işletilecek herhangi bir kod içermeyen Form_Activate yordamına formun aktive edildiği sırada
işletilmesini istediğiniz program kodlarını dahil edebilirsiniz. Pencereler arasında dolaşırken üzerinde
tıklama yapılarak aktif duruma getirilen formda Activate olayı, pasif duruma getirilen form da ise
Deactivate olayı meydana gelir.
3. Formların Bellekten Çıkarılması Olayı
Bir Visual Basic projesinin çalışması sona erdirilirken projenin formu bellekten silinir. Bu sırada
Unload olayı meydana gelir.
193
Şekil 8.b-3
Yukarıdaki Unload olayına ait ekran görüntüsüne dikkat ederseniz Form_Unload yordamı şimdiye
kadar hakkında bilgi verilen olay veya yordamlardan farklı olarak dışarıdan Cansel adında bir
parametre almaktadır. Cansel değişkenin içeriği –1 olduğu zaman Unload işlemi iptal edilmektedir.
Kullanıcıdan onay almak üzere ekrana getirilen diyalog kutusunda Tamam ve İptal adında iki düğme
olacaktır.
MsgBox() fonksiyonu tarafından ekrana getirilen bu diyalog kutusunda kullanıcı Tamam
düğmesinde tıklama yaparsa MsgBox() fonksiyonu geriye 1, İptal düğmesini seçerse 2 sayısal değeri
döndürülür. MsgBox() fonksiyonu tarafından geriye döndürülen değere göre Cansel değişkenin içeriği
değiştirilmelidir. Cansel değişkenin içeriği –1 iken Unload olayı iptal edilir. Başlangıçta Cansel
değişkeninin içeriği –1’dir.
Private Sub Form_Unload ( Cansel As Integer)
Mesaj = MsgBox(“ Projeden Çıkılacak”, 65 ,“Projeden Çıkış”)
If Mesaj = 2 Then
Cansel = -1
End If
End Sub
Visual Basic Projelerine dahil edilen Formlardan birini bellekten çıkarmak için Unload deyiminden
yararlanılmaktadır.
Private Sub Form_Load()
Form2.Show
End Sub
Private Sub Form_DbClick()
Unload.Form2.
End Sub
194
4. Formların Yeniden Boyutlandırılması
Bir önceki bölümde belirtildiği gibi varsayım olarak çalışma anında formların genişlik ve
yüksekliklerinde değişiklik yapılabiliyordu. Formların boyutlarında değişiklik yapılması sırasında
ReSize olayı meydana gelmektedir. Çalışma anında bir formun boyutlarında değişiklik yapılıp
yapılamayacağı forma ait BorderStyle değişkeninin içeriğine bağlıdır.
ReSize olayının etkisini göstermek için basit bir örnek yapalım. Bu örnek projede formun
boyutlarında değişiklik yapıldıkça Line() fonksiyonu ile Formun sol üst köşesinden sağ alt köşesine
doğru bir çizgi çizelim.
Private Sub Form_Resize()
Line (0, 0)-(ScaleWidth, ScaleHeight)
End Sub
Line Fonksiyonu dışarıdan ikisi seçimlik 4 parametre almaktadır. ScaleWidth özelliği formun iç
genişliğini, ScaleHeight özelliği ise iç yüksekliğini belirtmektedir. ReSize yordamı bu şekilde
hazırlanan örnek proje çalıştırılacak olursa Şekil 8.b-4’teki görüntü elde edilir.
Şekil 8.b-4
Şekil 8.b-5
Çalışma anında fare işareti formun sağ kenarına götürüp formun genişliğini biraz azaltınca
Şekil 8.b-5’te verilen ekran görüntüsü elde edilir.
Çalışma anında fare ile Formun genişliği azaltılınca ReSize olayı meydana geldi ve forma ait
Form_ReSize yordamı otomatik olarak çalıştırıldı. ReSize yordamında kullanılan Line() fonksiyonuna
parametre olarak formun güncel genişliğini ve yüksekliğini verildiği için Resize olayı sonrası tekrar
çizilen çizgi ilkinden farklı olacağından sonuçta formda iki çizgi olur.
5. KeyPress -Bir Tuşa Basma Olayı
195
Çalışma anında klavyenin yön ve kontrol (Control, Alt, Shift Vs.) tuşları dışında her hangi bir tuşa
basılması halinde KeyPress olayı meydana gelir. KeyPress olayı için Visual Basic tarafından
hazırlanan yordama basılan tuşun Ascii kodu parametre olarak gösterilir.
Private Sub Form_KeyPress (KeyAscii As Integer)
Show
FontSize = 20
Print Chr(KeyAscii) & “tuşuna basıldı”
End Sub
Private Sub Text1_KeyPress (KeyAscii As Integer)
Char = Chr(KeyAscii)
KeyAscii = Asc(UCase(Char))
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
Show
FontSize = 20
Print Chr(KeyAscii) & " tusuna basildi"
End Sub
Şekil 8.b-6
Formlar için KeyPress olayının olabilmesi için formda düğme ve metin kutusu gibi nesnelerin
olmaması gerekir. Bu olay veya yordam daha çok dışarıdan bilgi girişi yapılan nesneler için
kullanıldığı zaman işlevsel olmaktadır.
6. KeyDown olayı
KeyDown olayı tuşa basıldığı anda, bu olayı temsil eden yordamlar KeyPress olayına ait
yordamdan farklı olarak dışarıdan 2.bir parametreyi daha alırlar. Basılan tuşun Ascii kodu KeyCode
adlı parametreye aktarılır. Shift adındaki 2. parametreye ise bu olay meydana geldiği zaman Shift, Ctrl
ve Alt tuşlarının birinin basılı durumda olup olmadığı konusunda bilgi aktarılır. KeyDown olayı
sırasında Shift tuşu basılı durumda ise Shift değişkeni 1, basılı durumda değilse 0 değerini içeriri. Bu
olay sırasında Ctrl tuşu basılı durumda ise Shift parametresi 2 değerini ve Alt tuşu basılı durumda ise 4
değerini alır.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 13
And
Shift = 1 Then
196
MsgBox “Shift Tuşu basılı durumda iken Enter’e basıldı”
End If
End Sub
Shift Parametresinin İçeriği
Basılı Durumda Olan Tuşlar
0
Shift.Ctr ve Alt tuşları basılı durumda değil
1
Shift tuşu basılı durumda
2
Ctrl tuşu basılı durumda
3
Shift ve Ctrl tuşları basılı durumda
4
Alt tuşu basılı durumda
5
Shift ve Alt tuşları basılı durumda
6
Ctr ve Alt tuşları basılı durumda
7
Shift ,Ctr ve Alt tuşları basılı durumda
7. KeyUp olayı
KeyUp olayı KeyDown farklı olarak tuşa basıldığı sırada değil, tuşun serbest bırakıldığı yani
kullanıcının elini tuşun üstünden kaldırdığı zaman meydana gelir. Bu olayı temsil eden yordam
KeyPress olayına ait yordamdan farklı olarak dışarıdan 2.bir parametreyi daha alırlar. Basılan tuşun
Ascii kodu KeyCode adlı parametreye aktarılır. Shift adındaki 2. parametreye ise bu olay meydana
geldiği zaman Shift, Ctrl ve Alt tuşlarının birinin basılı durumda olup olmadığı konusunda bilgi
aktarılır.
Private Sub Form_KeyUp (Keycode As Integer, shift As Integer)
8. MouseDown Olayı
Bu olay çalışma anında formun üzerinde farenin herhangi bir tuşuna basılması halinde meydana
gelir. Bu olayı temsil eden Form_MouseDown yordamı dışarıdan 4 adet parametre alır.
Private Sub Form_MouseDown(button As Integer, shift As Integer, x As Single,
y As Single)
Private Sub MDIForm_MouseDown(button As Integer, shift As Integer, x As
197
Single, y As Single)
Private Sub object_MouseDown([index As Integer,]button As Integer, shift As
Integer, x As Single, y As Single)
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single,
Y As Single)
If Button =
1
Then
MsgBox (“Farenin sol tuşuna basıldı”)
End If
End Sub
Şekil 8.b-7
Button adlı ilk parametrede MouseDown olayı sırasında farenin hangi tuşuna basıldığı konusunda
bilgi bulunur. (1 sol tuş, 2 sağ tuş, 3 her iki tuş ) 2.nci parametrede Shift, Alt ve Ctr tuşlarının basılı
durumda olup olmadığı konusunda bilgi bulunur. 3 ve 4 parametrelerine MouseDown olayı meydana
geldiği zaman fare işaretinin form üzerindeki yeri hakkında Twip cinsinden bilgi aktarılır.
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As Single,
Y As Single)
If Button =
1
Then
MsgBox (“Farenin yeri :” & Str(X)
End If
End Sub
Şekil 8.b-8
198
& “,” & Str (Y) )
Şekil 8.b-9
Dim PaintNow As Boolean
Private Sub Form_MouseDown (Button As Integer, Shift As Integer, X As
Single, Y As Single)
PaintNow = True
End Sub
Private Sub Form_MouseUp (Button As Integer, Shift As Integer, X As Single, Y
As Single)
PaintNow = False
End Sub
Private Sub Form_MouseMove (Button As Integer, Shift As Integer, X As Single,
Y As Single)
If PaintNow Then
PSet (X, Y)
End If
End Sub
Private Sub Form_Load ()
DrawWidth = 10
ForeColor = RGB(0, 0, 255)
.
End Sub
9. MouseUp Olayı
MouseUp olayı kullanıcı farenin basılı durumda olan tuşundan elini kaldırdığı zaman meydana
gelir. MouseUp yordamı da dışarıdan 4 adet parametre alır. Bu olaydan form veya başka bir nesne
üzerinde fare ile taşıma veya boyut değişikliği yapılırken de yararlanılabilir.
199
Private Sub Form_MouseUp(button As Integer, shift As Integer, x As Single, y
As Single)
10. MouseMove Olayı
MouseMove olayı fare işaretinin form üzerindeki yeri değiştirildiği zaman meydana gelir. Bu
olayın meydana gelmesi için tıklama yapmaya gerek yoktur. Çalışma anında farenin yeri
değiştirildikçe bu olay meydana gelir ve olayı temsil eden yordamda herhangi bir program satırı varsa
işletilir.
Private Sub Form_MouseMove(button As Integer, shift As Integer, x As Single,
y As Single)
11. Formların Silinen Yerlerini Yeniden Yazmak ve Çizmek
Visual Basic projeleri genellikle birden fazla form içerirler. Programın çalışması sırasında büyük
bir olasılıkla pencereler veya formlar üst üste gelirler. Altta kalan formda daha önce Print ve Line gibi
bir deyimle bilgi yazımı yapılmışsa bazı bilgiler kaybolur.
Üzeri başka bir pencere ile kapatılan bir pencerenin eski halini korumak için Paint olayından
yararlanılmaktadır. Paint olayı formun üzerine başka bir form geldiğinde ve Formun boyutlarında
değişiklik yapıldığında meydana gelir.
Şekil 8.b-10
200
Şekil 8.b-11
Private Sub Form_Paint ()
Dim HalfX, HalfY
HalfX = ScaleLeft + ScaleWidth / 2
HalfY = ScaleTop + ScaleHeight / 2 .
Line (ScaleLeft, HalfY) - (HalfX, ScaleTop)
Line -(ScaleWidth + ScaleLeft, HalfY)
Line -(HalfX, ScaleHeight + ScaleTop)
Line -(ScaleLeft, HalfY)
End Sub
Private Sub Form_Resize
Refresh
End Sub
8.c. Formlara Uygulanan Metotlar
Visual Basic’te nesnelerin özelliklerinden başka, nesnelere uygulamak üzere önceden tanımlı olan
çok sayıda olay vardır. Önceden tanımlı olan olaylar nesneden nesneye değişiklik göstermektedir. Bir
önceki bölümde formlara uygulanabilen bazı olaylar hakkında bilgi verildi. Nesneler için anlatılması
gereken bir diğer konu ise nesneler üzerinde işlem yapmada kullanılan Method’lardır.
1. Cls Methodu
Cls metodu ile formların üzerine Print veya başka bir method ile yazılanlar silinir. Cls metodundan
formdaki diğer nesneler etkilenmez.
Private Sub Form_Click
Form1.Cls
End Sub
201
Şekil 8.c-1
Private Sub Form_Click ()
Dim Msg
AutoRedraw = -1
ForeColor = QBColor(15)
BackColor = QBColor(1)
FillStyle = 7
Line (0, 0)-(ScaleWidth, ScaleHeight), , B
Msg = "Merhaba Dünya"
CurrentX = ScaleWidth / 2 - TextWidth(Msg) / 2
CurrentY = 2 * TextHeight(Msg)
Print Msg
Msg = "Geri zemini temizleyin "
MsgBox Msg
Cls
End Sub
2. Line Methodu
Bu metot ile aktif veya belirtilen formun üzerine çizgi çizilir. Line metodu ile çizgi çizilmek
istenen Form aktif değilse, Line metodundan önce üzerinde çizgi çizilecek form veya nesne
belirtilmelidir.
Genel yazılışı
Line (Başlama X, Başlama Y) - ( Bitiş X, Bitiş Y), Çizgi Rengi, BF
object.Line [Step] (x1, 1) [Step] (x2, y2), [color], [B][F]
Genel yazılıştan görüleceği gibi Line metodu dışarıdan toplam 4 parametre alabilmektedir.
Bunlardan 3 tanesinin kullanımı isteğe bağlıdır. Çizginin başlayacağı yer belirtilmezse, çizginin
başlama yeri olarak Forma ait CurrentX ve CurrentY değişkenlerinin o an ki içerikleri baz alınır.
4 nci parametre olarak yalnızca “B” harfi verilirse, belirtilen başlangıç ve bitiş koordinatları esas
alınarak bir dikdörtgen çizilir. Eğer “B” harfi ile “F” harfi kullanılırsa dikdörtgenin içi çizgi rengine
boyanır.
202
Private Sub Form_Click
DrawWidth = 3
CurrentX=500
Currenty = 500
Line –(5000,1500),RGB(0,255,0)
End Sub
Şekil 8.c-2
Şekil 8.c-3
PrivateSubForm_Click
Şekil 8.c-4
Private Sub Form_Click
Şekil 8.c-5
Private Sub Form_Click
DrawWidth = 3
DrawWidth = 3
DrawWidth = 3
CurrentX=500
CurrentX=500
CurrentX=500
Currenty = 500
Currenty = 500
Currenty = 500
Line–(5000,1500)
Line–3000,1500),RGB_
Line–(3000,1500),_
End Sub
(0,255,0),B
End Sub
RGB(0,255,0),BF
End Sub
Eğer çizginin başlangıç koordinatı verilmeseydi, Formun sol üst köşesi olduğu varsayılırdı. Çünkü
başlangıçta CurrentX ve CurrentY değişkenleri 0 değerine sahip olurlar. Line metoduna ait üçüncü
parametrede çizgi rengi belirlenir. Line metoduna çizginin rengini belirtmek üzere üçüncü parametre
verilmezse çizgi rengi Forma ait ForeColor değişkeninin içeriğine göre belirlenir.
Tahmin edileceği gibi 4. parametrede “B” harfi kullanılmadan Full anlamına gelen “F” harfi
kullanılamaz. Eğer 4. parametrede “F” harfi tek başına kullanılacak olursa hata meydana gelir.
203
Şekil 8.c-6
Çizgi kalınlığını Forma ait DrawWidth özelliği ile sağlanır.
Sub Form_Click ()
Dim CX, CY, F, F1, F2, I
ScaleMode = 3
.
CX = ScaleWidth / 2
.
CY = ScaleHeight / 2
.
DrawWidth = 8
.
For I = 50 To 0 Step -2
F = I / 50
F1 = 1 - F: F2 = 1 + F.
Forecolor = QBColor(I Mod 15)
Line (CX * F1, CY * F1)-(CX * F2, CY * F2), , BF
Next I
DoEvents
If CY > CX Then
.
DrawWidth = ScaleWidth / 25
Else
DrawWidth = ScaleHeight / 25
End If
For I = 0 To 50 Step 2.
F = I / 50
F1 = 1 - F: F2 = 1 + F
Line (CX * F1, CY)-(CX, CY * F1)
Line -(CX * F2, CY)
Line -(CX, CY * F2)
Line -(CX * F1, CY)
' Draw lower-left.
Forecolor = QBColor(I Mod 15)
204
Next I
DoEvents
End Sub
3. Circle Methodu
Bu method veya deyimle istenen forma istene çap, renk ve kalınlıkta çember veya elipsler çizilir.
Genel yazılışı
Circle (Başlama X, Başlama Y), YarıÇap, Çizgi Rengi
object.Circle [Step] (x, y), radius, [color, start, end, aspect]
Şekil 8.c-7
Sub Form_Click ()
Dim CX, CY, Radius, Limit
ScaleMode = 3
CX = ScaleWidth / 2
CY = ScaleHeight / 2
If CX > CY Then Limit = CY Else Limit = CX
For Radius = 0 To Limit .
Circle (CX, CY), Radius,RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Next Radius
End Sub
205
Private Sub Form_Click
DrawWidth = 2
X = ScaleWidth / 2
Y = ScaleHeight / 2
Circle(X,Y),X/2,RGB(255,0,0)
End Sub
Şekil 8.c-8
Dairenin çapı ve başlama yeri istenildiği gibi değiştirilebilir. Aşağıda verilen örnekte dairenin çapı
ve başlama yeri, çalışma anında söz konusu formun boyutlarına bağlı olarak belirlendi.
3 ncü parametre ise dairenin rengi belirtilir. 4 ve 5 nci parametre ile çemberin çizilecek miktarını
belirtmeniz gerekir. Kullanılması isteğe bağlı olan 4 ve 5 nci parametreler kullanılmazsa çemberin tam
olduğu varsayılır. 6 ncı parametre olarak kullanılan değer 1 den küçük bir değer verilmesi halinde
çemberin genişliği artar.
Circle (X, Y ), X/2 , RGB ( 255 , 0 , 0 ), , , 0.7
Private Sub Form_Click
DrawWidth = 2
Circle(1000,1000),750
End Sub
Şekil 8.c-9
Private Sub Form_Click
DrawWidth = 2
Circle(1000,1000), 750,RGB (255 ,0 ,0)
End Sub
Şekil 8.c-10
206
Private Sub Form_Click
DrawWidth = 2
Circle (1000,1000),750,RGB (255 ,0 ,0),
, ,0.7
End Sub
Şekil 8.c-11
4. Pset Methodu
Bu method ile istenen formun üzerine veya forma dahil edilmiş olan resim kutusuna bir nokta
konulur.
Genel yazılışı
Pset(Pozisyon X, PozisyonY), Nokta Rengi
object.PSet [Step] (x, y), [color]
Pset metoduna forma konulacak noktanın rengi 3. parametre olarak verilmezse bunun o anda
geçerli renk olacağı varsayılır. Bu metoda 1. ve 2. parametre olarak verilen bilgiler ile noktanın
formun neresine konulacağı belirlenir.
Şekil 8.c-12
Sub Form_Click()
Dim CX, CY, Msg, XPos, Ypos
ScaleMode = 3
DrawWidth = 2
ForeColor = QBColor(4)
FontSize = 24
207
CX = ScaleWidth / 2
CY = ScaleHeight / 2
Cls
Msg = "Happy New Year!"
CurrentX = CX - TextWidth(Msg) / 2
CurrentY = CY - TextHeight(Msg)
Print Msg
Do
XPos = Rnd * ScaleWidth
YPos = Rnd * ScaleHeight
PSet (XPos, YPos), QBColor(Rnd * 15)
DoEvents
Loop
End Sub
Forma konulacak noktanın yerini belirlemek için Pset metoduna parametre olarak koordinat
değerleri için sürekli olarak formun sol üst köşesi baz alınır. Eğer formlara Pset metodu ile arka arkaya
nokta eklerken baz olarak forma eklenen bir önceki noktanın yeri alınmak isteniyorsa Pset metoduna
Step parametresi eklenmelidir.
Private Sub Form_Click
DrawWidth = 2
For S = 500 To 2500 Step 10
PSet(S,S)
Next S
End Sub
Şekil 8.c-13
5. Move Methodu
Bu metot ile formların ekrandaki konumlarında değişiklik yapılır. Formun ekrandaki konumu
forma ait Left ve Top değişkenlerinde saklanır. Bu iki değişken ile formun sol üst köşesinin koordinatı
belirlenir.
Genel yazılışı
Move(SolÜstKöşe X, SolÜstKöşe Y)
object.Move left, top, width, height
208
Move metodunun genel yazılışına göre dışarıdan iki parametre alınmaktadır. Bu parametrelerden
2’sinin kullanımı isteğe bağlıdır. 2. parametre kullanılmazsa formun ekrandaki konumunu Move
metodu ile değiştirirken formun boyutlarında değişiklik yapılabilir. Bunun için Move metodunun
kullanılması isteğe bağlı olan 3. ve 4. parametre verilir. 3. parametre ile formun genişliğinde ve 4.
parametre ile yüksekliğinde değişiklik yapılabilir.
Private Sub Form_Click
Move 1000, 2500, Width + 500, Height + 500
End Sub
Private Sub Form_Click ()
Dim Inch, Msg
Msg = "Choose OK to resize and move this form by "
Msg = Msg & "changing the value of properties."
MsgBox Msg
Inch = 1440
Width = 4 * Inch
Height = 2 * Inch .
Left = 0
Top = 0
.
Msg = "Now choose OK to resize and move this form "
Msg = Msg & "using the Move method."
MsgBox Msg
Move Screen.Width - 2 * Inch, Screen.Height - Inch, 2 * Inch, Inch
End Sub
6. Refresh Methodu
Projelere eklenen formlarla ilgili olarak temelde en çok 3 işlem yapılmaktadır. Bunlar formların
hard diskten belleğe okunması (Load) , ekranda gösterilip aktif duruma getirilmesi (Show) ve
ekrandan kaldırılıp gizlenmesidir (Hide). Form bellekte iken kullanıcı listelenen dosyalardan birini
silmiş olabilir. Bu durumda formun bellekteki kopyasındaki bilgiler ile diskteki bilgiler arasında
farklılıklar olur. Bu nedenle formun ReFresh metoduna tabi tutulması gerekir.
209
Şekil 8.c-14
Private Sub Form_Click ()
Dim FilName, Msg as String, I as Integer
File1.Pattern = "TestFile.*"
For I = 1 To 8
FilName = "TESTFILE." & I
Open FilName For Output As FreeFile
File1.Refresh
Close.
Next I
Msg = "Choose OK to remove the created test files."
MsgBox Msg
Kill "TESTFILE.*"
File1.Refresh
.
End Sub
7. TextWidth ve TextHeight Methodları
Bir form veya başka bir nesnenin üzerine yazılacak karaktersel sabit bir bilgi veya değişkenin
içeriği, formun üzerinde o anda geçerli olan Font ve Punto değerlerine bağlı olarak belli bir genişlik ve
yüksekliğe sahip olur. Sabit bir bilginin geçerli font ve punto değerine bağlı olarak form üzerinde
genişliği TextWidth, yüksekliği ise TextHeight ile öğrenilebilir. Bu metotların işlevini göstermeden
önce hiçbir nesne olmayan bir forma sabit bir bilgiyi yazalım. Formun genişliğini 4 inç yani 1440 * 4
Twip olsun.
Private Sub Form_Load()
Show
FontName = "Arial"
FontSize = 14
Print "Microsoft Visual Basic"
210
FontSize = 20
Print "Microsoft Visual Basic"
FontSize = 28
Print "Microsoft Visual Basic"
End Sub
Forma “Microsoft Visual Basic ” sabit bilgisini 14,20 ve 28 punto değerleri ile üç kez yazalım.
Şekil 8.c-15
Bu ekran görüntüsünden çıkarılması gereken sonuç şu olmalıdır. Bir sabit bilgi ister ekranda ister
yazıcıdan alınan kağıtta, kullanılan Font ve Puntoya bağlı olarak belli bir metin genişliğine sahip olur.
14 Punto ile yazılan metin form üzerinde yaklaşık 2 inç kadar yer kaplarken punto değeri 20 seçilince
aynı sabit bilgi tam tamına 4 inçlik bir genişliğe sığdı.
İşte TextWidth methodu bir bilginin geçerli olan font ve punto değerine bağlı olarak form üzerinde
kaplayacağı genişliği Twip cinsinden bulmaya yaramaktadır. TextHeight ise metnin yüksekliğini
bulmada kullanılmaktadır.
Private Sub Form_Load()
Show
FontName = "Arial"
FontSize = 14
Mesaj = "Microsoft Visual Basic"
Genişlik = TextWidth(Mesaj)
Yükseklik = TextHeight(Mesaj)
Print "Genişlik : "; Genişlik
Print "Yükseklik :"; Yükseklik
FontSize = 20
Genişlik = TextWidth(Mesaj)
Yükseklik = TextHeight(Mesaj)
Print "Genişlik : "; Genişlik
211
Print "Yükseklik :"; Yükseklik
End Sub
Bu yordamın dahil olduğu proje çalıştırıldığında aşağıda verilen ekran görüntüsü elde edildi.
Şekil 8.c-16
8.d. MDI Özellikli Formlar
Visual Basic uygulamaları dahilinde aynı anda birde fazla pencereyi açık tutma imkanı vardır.
Gerektiğinde aynı anda birden fazla pencereyi açık tutmaya imkan vermek için şimdiye kadar
212
projelerde kullanılan formlardan farklı olarak MDI (Multiple Document Interface) adı verilen çoklu
formlar kullanılır. Üzerinde çalıştığınız projeye MDI özellikli bir form eklemek istiyorsanız Project
menüsünden Add MDI Form komutunu vermelisiniz (Şekil 8.d-1). Project menüsünden Add MDI
Form komutunu verirseniz, daha önce Form1 adında normal bir form içeren projeye “MDIForm1”
adında MDI özellikli yeni bir form eklenir (Şekil 8.d-2)
Şekil 8.d-1
MDI özellikli Form projede tek başına yer alabileceği gibi çok sayıda alt form (Child) da içerebilir.
Diğer taraftan bir projede yalnızca bir tek MDI özellikli form bulunabilir. Üzerinde çalıştığım projeye
MDI özellikli bir form dahil ettikten sonra Project menüsündeki Add MDI Form komutu
kullanılamaz duruma gelir. Buna göre projelerde yalnızca bir MDI özellikli form bulunabilir
Şekil 8.d-2
Üzerinde çalıştığınız projeye MDI özellikli bir form ekledikten sonra istediğiniz sayıda alt formu
başka bir deyişle Child formu projeye dahil edebilirsiniz. Ayrıca projedeki normal formların sonradan
Child özellikli form olmalarını sağlayabilirsiniz. Daha önceki sayfalarda formlarla ilgili olarak verilen
Properties penceresinde MDIChild adında bir değişken veya özellik vardı. Bu değişken varsayım
olarak False değerine sahiptir. Projede MDI özellikli form yokken bu özelliği mantıksal True değeri
aktarılıp proje çalıştırılacak olursa hata meydana gelir.
213
Şekil 8.d-3
Projedeki MDI özellikli forma alt formlar dahil etmek için Project menüsünden Add Form komutu
ile yeni bir form dahil edip bu formun Child Form olması sağlanır veya projedeki mevcut formlara
Child özelliği verilir.
Örneğin üzerinde çalışılan projede biri normal form ve 2 adet ait formu olan bir MDI formun
olması istensin. Bu durumda proje oluşturulduğu sırada projeye otomatik olarak normal bir form
eklendiği için önce Project menüsündeki Add MDI Form komutu ile projeye MDI özellikli bir form
eklenir.Daha sonra alt (Child) form olarak kullanılmak üzere iki adet normal form daha projeye dahil
edilir. Visual Basic tarafından formlara varsayım olarak verilen adlara bağlı kalınırsa Project Explorer
penceresi
Şekil 8.d-4’teki gibi olur.
Şekil 8.d-4
Şimdi Form2 ve Form3 formlarına Child özelliğini verelim. Bu amaçla Properties penceresinde
ilgili forma ait bilgiler varken MDIChild değişkenine True değeri aktarmak yeterlidir. Form2 ve
214
Form3 formlarının MDIChild özelliklerini True yaptıktan sonra bu projeye ait pencere Şekil 8.d-5’teki
gibi olur.
Şekil 8.d-5
Proje penceresinde formların ikonalarına bakarak hangi formun normal, hangisinin MDI veya alt
(Child) form olduğunu anlamanız mümkündür. Bu örnek proje için MDI ve alt form hazırlığı
yapıldıktan sonra proje başlatılabilir.
Bu ilk formun dışında kalan formları aktif duruma getirmek için formların belleğe yükletilmesi ve
gösterilmesi gerekir. Bizim örnekte Form1 adlı form otomatik olarak yüklenilecektir. Projedeki MDI
özellikli formu belleğe yüklemek için Form1 adlı formun herhangi bir yordamına MDI formun
yüklenmesini sağlayacak program satırlarının eklenmesi gerekir.
Private Sub Form_Load
MDIForm1.Show
End Sub
Bu program satırı ile projenin başlangıç formu olan Form1’in belleğe yüklenilmesi biter bitmez
MDI özellikli form Show metodu ile belleğe yüklenilip aktive edilir. Form1’e ait Form_Load yordamı
bu şekilde düzenlenip proje çalıştırılırsa Şekil 8.d-6’daki ekran görüntüsü elde edilir.
215
Şekil 8.d-6
Çalışma anında alınan bu ekran görüntüsünde alttaki form MDI özellikli formdur. Bu sırada MDI
özellikli formun herhangi bir yerinde tıklama yapılacak olursanız bu kez MDI özellikli form aktif form
olur (Şekil 8.d-7).
Şekil 8.d-7
Bu şartlarda henüz Child Form2 ve Form3’ü kullanma veya ekrana getirme imkanı yoktur. Bu iki
formun diğer formlar gibi belleğe yüklenilmesi gerekir. Bu nedenle MDI özellikli formun Form_Load
yordamına aşağıdaki gibi iki program satırı eklenmelidir.
Private Sub MDIForm_Load
Form2.Show
Form3.Show
End Sub
1. MDI Formların Özellikleri
216
MDI formlarla ilgili olarak bazı işlemleri yapmak için yeni bir proje hazırlayacağım. Bu projeye
biri MDI özellikli olmak üzere 4 form ekleyeceğim. Ayrıca MDI özellikli formu, Project menüsündeki
Properties komutu ile ekrana getirilen Procject Properties diyalog kutusunda başlangıç formu olarak
seçeceğim. MDI özellikli formlar ile normal formların özellikleri arsında bazı farklılıklar
bulunmaktadır. Normal formların ekrandaki konumunu ve büyüklüklerini programcı tasarım veya
çalışma anında belirleyebilir.
Şekil 8.d-8
Windows ve Windows uyumlu programların pencerelerine dahil edilen alt pencere veya bilgiler
pencereye sığmıyorsa, pencerenin sağ kenarına otomatik olarak düşey ve yatay kaydırma çubukları
eklenir. Benzer durumda MDI özellikli pencereler için de geçerlidir. MDI özellikli pencereye dahil
edilen pencerelerin (Child Form) boyutları çalışma anında değiştirilip alt pencerelerden birinin
pencereye sığmaması halinde, MDI özellikli forma düşey kaydırma çubuğu otomatik olarak eklenir.
MDI özellikli formlara kaydırma çubuklarının eklenmesini istemiyorsanız Properties penceresinde
MDI özellikli Formun özellikleri varken ScollBars özelliğine False değerini aktarmalısınız (Şekil 8.d8).
Ayrıca Properties penceresinden yararlanarak MDI özellikli form hariç diğer 3 formun MDIChild
özelliklerine True değerini aktaralım. Ardından MDI özellikli başlangıç formuna ait Form_Load
yordamında alt programların yüklenmesini sağlayacak program satırlarını ekleyelim.
2. MDI Formlar İçin Araç Çubuğu Hazırlamak
Visual Basic’ te MDI özellikli formlara araç çubuğu eklemek için kullanılan Toolbar adında özel
bir kontrol bulunmaktadır. MDI özellikli formlara araç çubuğu eklemek için PictureBox kontrolünden
yararlanabilirsiniz (Şekil 8.d-9).
Toolbar’da Picture Box kontrolünü temsil eden düğmeyi seçili duruma getirdikten sonra MDI
özellikli forma eklenmiş olan ve formu boydan boya kaplatan Picture Box nesnesinin üzerine araç
çubuklarında düğmelerin büyüklüğüne sahip ikinci bir Picture Box nesnesi alınır. Çalışma anında bu
düğmenin üzerinde tıklama yapıldığı zaman yapılacak işlemleri belirlemek için program kodu yazılır.
217
Şekil 8.d-9
3. Çalışma Anında Projeye Yeni Child Formlar Eklemek
Visual Basic projeleri dahilinde çalışma anında yeni alt formlar hazırlamak mümkündür.
Private Sub MDI Form_Load
Dim YeniForm As New Form1
Yeniform.caption
= ”Deneme formu”
YeniForm.Show
Form1.Show
End Sub
4. Child Formların MDI Form İçindeki Yerleşimi
Child özellikli pencerelerin düzenleniş şekline Arrange methodu ile etkide bulunabilir. Child
formlar kademeli yerleşirse bu basamak şekline (Cascade) adı verilir. Arrange methodu ile özellikle
form ve pencereler 4 değişik tipte MDI pencereye yerleştirilmektedir. Arrange methoduna parametre
olarak “0” sayısal değeri verilirse formlar basamaklanır (Şekil 8.d-10). Arrange methoduna parametre
olarak “1” sayısal değeri verilirse formlar yataylanır (Şekil 8.d-11) Eğer pencereler üst üste konularak
dizilmek istenirse “2” parametresi kullanılmalıdır (Şekil 8.d-12).
Private Sub MDIForm_Load()
Form1.Show
Form2.Show
Form3.Show
MDIForm1.Arrange 0
‘ 0,1,2 kullanılır
End Sub
218
Şekil 8.d-10
Şekil 8.d-11
219
Şekil 8.d-12
5. Örnek /Arrange
Const FormSayı = 3
Dim F(1 To FormSayı) As New Form1
Private Sub Picture1_Click()
Static Sayı
Dim I, Ebat, Basla
Sayı = Sayı + 1
Select Case Sayı
Case 1
MDIForm1.Arrange 1
Case 2
MDIForm1.Arrange 2
220
Case 3
Ebat = MDIForm1.Width
MDIForm1.Width = Ebat / 2
Form1.WindowState = 1
For I = 1 To FormSayı
F(I).WindowState = 1
Next I
Basla = Timer
Do
Loop Until Timer = Basla + 3
MDIForm1.Arrange 3
End Select
End Sub
Const FormSayı = 5
Dim F(1 To FormSayı) As New Form1
Private Sub MDIForm_Load()
Dim I
Load Form1
For I = 1 To FormSayı
F(I).Caption = "Form" & I + 1
Next I
End Sub
6. Örnek / Activate, Deactivate Events
Form1
Private Sub Form_Activate()
MDIForm1.Label1.Caption = "Güncel form: " & Me.Caption
End Sub
221
MDIForm
Private Sub MDIForm_Load()
Form1.Caption = "Form #1"
Dim NewForm As New Form1
yaratır
Load NewForm
NewForm.Caption = "Form #2"
NewForm.Show
End Sub
' Form1’in başlığı
' Yeni bir child form
' Yeni formun başlığı
' Yeni bir form
8.e. Hazır Formlar ve Şablonlar
Verilen ekran görüntüsünde tespit edebildiğiniz gibi Visual Basic çok sayıda farklı görünüm ve
işleve sahip form tipini veya şablonunu sunmaktadır. Visual Basic ile birlikte hazır olarak verilen ve
yeni bir form hazırlamak üzere File menüsünden New komutu verildiği zaman işlevsel olan şablonlar
gerçekte birer normal Visual Basic formundan farklı değildir. Her Bir şablon Visual Basic’in
kurulduğu dizinin altında yer alan “\Template” adlı alt dizinde FRM uzantılı bir form dosyası ile
temsil edilmektedir
222
Şekil 8.e-1
1. About Dialog
Eğer Visual Basic ile hazırladığınız uygulamalar hakkında ekrana bilgi vermek istiyorsanız, bu
amaca yönelik olarak bir diyalog kutusunu veya boyutları değişmeyen bir form hazırlamanız gerekir.
Visual Basic bu amaçla kullanabileceğiniz About Dialog adında bir şablona sahiptir (Şekil 8.e-1). Bu
şablondan yararlanarak projeniz hakkında bilgi içeren diyalog kutusuna kolay bir şekilde
hazırlayabilirsiniz.
Add Form diyalog kutusunda About Dialog şablonunu seçerek Aç düğmesine basarsanız Visual
Basic aşağıdaki ekran görüntüsünü verir. Daha sonra bu form üzerinde istediğiniz değişiklikleri
yapabilirsiniz. Bu forma yeni nesneler ekleyebilir, varsayım olarak forma eklenen Picture Box
nesnesinin içerdiği resmi değiştirebilirsiniz.
223
Şekil 8.e-2
About Box şablonuna dayandırarak hazırlanan bu forma eklenmiş olan nesneleri görmek için
Properties penceresine bakabilirsiniz (Şekil 8.e-3).
Şekil 8.e-3
Visual Basic ile birlikte hazır olarak verilen ve yeni bir Form hazırlamak üzere File menüsünden
New Form komutu verildiği zaman işlevsel olan şablonlar gerçekte birer normal Visual Basic
formundan farklı değildir. Her bir şablon Visual Basic’in kurulduğu dizinin altında yer alan “
224
Template” adlı alt dizinde FRM uzantılı bir form dosyası ile temsil edilmektedir. Sık sık benzer
özelliklere sahip formlar hazırlıyorsanız, hazırladığınız formları şablon olarak kullanabilirsiniz.
1. Options Dialog
Page Setup gibi diyalog kutularını sıfırdan hazırlamak yerine Options Dialog adlı şablondan
yararlanabilirsiniz (Şekil 8.e-4). Bu şablon ile hazırlanan formda varsayım olarak Group1, Group2,
Group3 ve Group4 adında 4 sayfa veya sekme bulunmaktadır. Daha sonra Options Dialog şablonu ile
hazırladığınız bu formda istediğiniz değişiklikleri yapabilirsiniz.
Şekil 8.e-4
2. Log In Dialog Şablonu
225
Şekil 8.e-5
Özellikle çok kullanıcılı ortamlar için hazırlanan programlar çalıştırıldıklarında kullanıcıdan ilk
olarak adını ve şifresini girmesi istenir. Eğer yalnızca kullanıcı adı ve şifresi girişinde kullanılmak
üzere iki metin kutusuna sahip bir form hazırlamak istiyorsanız Log In Dialog adlı şablondan
yararlanabilirsiniz (Şekil 8.e-5).
3. FrmSplash Şablonu
Şekil 8.e-6
4. FrmTip Şablonu
226
Şekil 8.e-7
5. FrmODBCLogon Şablonu
Şekil 8.e-8
227
8.f. Kontroller
Formlara eklenecek her kontrol ToolBox penceresinde bir düğme ile temsil edilmektedir. Tasarım
anında çalıştığınız forma veya projeye yeni bir nesne veya kontrol eklemek istiyorsanız ToolBox
penceresi ekranda değilse ekrana getirmeniz gerekir. ToolBox penceresini ekrana getirmek için View
menüsündeki ToolBox komutundan yararlanabilirsiniz (Şekil 8.f-1). ToolBox penceresini ekrandan
kaldırmak için Toolbox penceresinin sağ alt köşesindeki düğmeden yararlanabilirsiniz veya Toolbox
penceresi aktif pencere iken Alt+F4 tuşlarına basabilirsiniz.
Şekil 8.f-1
Visual Basic başlatıldığında ToolBox penceresinde toplam 21 adet düğme bulunmaktadır. Bu 21
düğmeden üzerinde ok işareti hariç her biri bir nesneyi veya kontrolü temsil etmektedir (Şekil 8.f-2).
228
Şekil 8.f-2
ToolBox penceresinde bir düğme ile temsil edilmeyen kontrolleri kullanabilmek için söz konusu
kontrole ait OCX uzantılı dosyanın üzerinde çalışılan projeye dahil edilmesi gerekir. Projeye eklenen
her OCX uzantılı kontrol dosyası projenin büyümesine neden olur. Üzerinde çalıştığınız projeye OCX
uzantılı bir kontrol dosyası eklemek istiyorsanız Project menüsündeki Components komutundan
yararlanmanız gerekir
(Şekil 8.f-3).
Şekil 8.f-3
Üzerinde çalıştığınız projeye OCX uzantılı özel kontrol dosyalarından bir veya birden fazlasını
dahil etmek üzere Project menüsünden Components komutunu verecek olursanız ekrana Components
diyalog kutusu gelir. Bu diyalog kutusunda projeye eklenmek üzere istenen özel kontrol dosyası
seçilir.
229
Şekil 8.f-4
Yeni bir proje hazırlandığı zaman projeye otomatik olarak dahil edilen ve ToolBox araç çubuğunda
birer düğme ile temsil edilen kontrollerden başka Components diyalog kutusundan yararlanarak Visual
Basic ile birlikte verilen özel kontrolleri üzerinde çalıştığınız projeye dahil edebilirsiniz.
Projelere otomatik olarak dahil edilmeyen kontrollerden her biri ayrı OCX dosyası olarak hard
diskte bulunmaktadır. OCX uzantılı özel kontrol dosyaları varsayım olarak \WINDOWS\SYSTEM
klasörüne kopyalanmaktadır. Bu klasörde bulunan OCX uzantılı dosyaları istediğiniz zaman üzerinde
çalıştığınız projeye dahil edebilirsiniz. Eğer Components diyalog kutusunda yalnızca o ana kadar
projeye dahil etmiş olduğunuz OCX uzantılı özel kontrol dosyalarının ve diğer nesnelerin
listelenmesini istiyorsanız Selected Items Only onay kutusunu seçili duruma getirmeniz gerekir (Şekil
8.f-4). Selected Items Only onay kutusunu seçili duruma getirdikten sonra Components diyalog
kutusunda yalnızca o ana kadar üzerinde çalışılan projeye dahil edilmiş olan nesneler ve özel kontrol
dosyaları listelenir.
230
Şekil 8.f-5
Bilgisayara kopyalamanıza rağmen Components diyalog kutusunda listelenmeyen özel kontroller
varsa Browse düğmesinde tıklama yapabilirsiniz. Ekrana bilgisayara kurulu olan OCX uzantılı
dosyaların listelendiği Add ActiveX Control diyalog kutusu gelir (Şekil 8.f-6). Hangi özel kontrol
dosyasını üzerinde çalıştığınız projeye dahil etmek istiyorsanız o dosyayı seçip Aç düğmesinde
tıklama yapmanız gerekir.
Şekil 8.f-6
231
Şekil 8.f-4’te verilen ekran görüntüsünden tespit edeceğiniz gibi Components diyalog kutusunda
Controls, Designers ve Insertable Objects adında 3 sekme bulunmaktadır. Insertable Objects
sekmesi özel kontrol dosyalarından başka bilgisayara kurulmuş olan programlara ait nesnelerden
yararlanmak için seçilir
(Şekil 8.f-7).
Şekil 8.f-7
Üzerinde çalıştığınız projeye bir metin kutusu veya düğme eklemek için Projeye özel kontrol
dosyası eklemeye gerek yoktur. Çünkü sözü edilen iki kontrol Visual Basic projelerine otomatik
olarak eklenmektedir. Eğer üzerinde çalıştığınız proje dahilinde Microsoft Graph nesnesini
kullanmak istiyorsanız önce Graph nesnesini temsil eden özel kontrol dosyasını Components diyalog
kutusu aracılığı ile Toolbox penceresine dahil etmelisiniz. Toolbox penceresine dahil edilen kontrol
projenin istenilen formunda kullanılabilir.
1. Label Kontrolü
232
Daha önceki konulardan hatırlanacağı gibi kontroller veya nesneler formların üzerlerine
yerleştirilmektedir. Bu nedenle ToolBox penceresinde bir düğme ile temsil edilen kontrolleri
kullanabilmek için daha önceden kontrollerin yerleştirileceği formun hazırlanması gerekir.
Label kontrolü, üzerinde çalışılan forma sabit bir bilgiyi yazmak amacıyla kullanılmaktadır.
Şekil 8.f-8
Toolbox penceresinde üzerine “A” harfi olan düğmede tıklama yapılarak seçili duruma
getirilir
(Şekil 8.f-8). Bu düğme seçili duruma getirildikten sonra fare işareti formun bilgi
girişi için mesaj yazdırılacak yerine götürülür. ToolBox penceresinde üzerinde ok işareti
bulunan düğmenin dışında herhangi bir düğme seçili durumda iken fare işareti formun
üzerine götürüldüğünde şekil değişikliğine uğrar ve “+” işareti gibi görünür. Formun üzerine
mesaj yazmada kullanılacak Label nesnesinin boyutları fare ile belirlenip farenin sol tuşu
serbest bırakılır. Label nesnesi seçili durumda olduğu zaman Label nesnesinin form
üzerindeki yeri ve boyutlarını değiştirebilir veya Del tuşu ile silip formdan çıkarabilirsiniz.
Forma eklenen nesnenin özellikleri hakkında bilgiyi Properties penceresinde bulmanız
mümkündür. Çoğu zaman formlara birden fazla kontrol veya nesne eklendiği için hangi nesnenin
özelliklerini Properties penceresinde görmek istiyorsanız o nesneyi seçili duruma getirmeniz gerekir.
a. Label nesnesinin başlığını değiştirmek
Tasarım anında aktif forma eklenen ilk Label nesnesine Label1, ikinci sırada eklenen varsayım
olarak Label2 adı ve başlığı verilmektedir. Label nesnesinin başlığında değişiklik yapmak için
Caption özelliğinden yararlanılır. Bir Label nesnesinin Caption özelliği hem tasarım anında hem de
çalışma anında değiştirilebilir (Şekil 8.f-9).
Private Sub Label1_Click()
Label1.Caption = “ Merhaba Dünya ”
End Sub
Şekil 8.f-9
233
b. Label nesnesinin adını değiştirmek
Forma eklenen Label nesnesine Label1, ikincisine Label2
adının verildiğini biliyorsunuz. Visual Basic tarafından Label
nesnelerine varsayım olarak verilen adları değiştirmek için
Name özelliğinden yararlanılır (Şekil 8.f-10). Label ve diğer
nesnelerin adları ancak Properties penceresinde tasarım
anında değiştirilebilir. Nesnenin adları çalışma anında
değiştirilemez.
Şekil 8.f-10
c. Label nesnesi metninde font kullanımı
Properties penceresinde Font özelliğinin karşısında MS Sans Serif yazılıdır. Işıklı bantı font
özelliğinin sonuna götürünce üç adet nokta (...) olan bir düğme eklenir. Bu düğmede tıklama
yaparsanız ekrana Yazı Tipi diyalog kutusu gelir. Bu fontlardan hangisini kullanmak istiyorsanız o
fontu seçebilirsiniz.
Label nesnesinin boyutlarını fare ile değiştirmek yerine Properties penceresinde Label nesnesinin
Width özelliği için istediğiniz değeri girebilirsiniz. Bunun için ışıklı bant Properties penceresinde
Width özelliğinin üzerine götürülür. Ardından Label veya seçili durumda olan nesne için Twip
cinsinden genişlik değeri Width ve Height (yükseklik) değeri Twip cinsinden yazabilirsiniz.
Çalışma anında Label nesnesinin üzerinde tıklama yapıldığı zaman aşağıdaki program kodları
“Merhaba Dünya” yazısını ile elde etmek mümkündür.
Private Sub Label1_Click()
Label1.Caption = “Merhaba Dünya”
End
Sub
234
Şekil 8.f-11
Eğer Properties penceresinde AutoSize değişkenin içeriği True yapılırsa Label nesnesinin genişliği
Label metnine bağlı olarak otomatik olarak belirlenir (Şekil 8.f-11). Eğer AutoSize değişkeni False
değerini içeriyorsa ve Label metni Label alanına sığmıyorsa Label metninin bir kısmı formun üzerinde
görünmez.
Bazen Label nesnesinin genişliğini fazla arttırma imkanı yoktur. Böyle durumlarda Label metni
birden fazla satıra bölünür. Bu amaçla Label nesnesinin WordWrap özelliğine True değeri aktarılır
(Şekil 8.f-12).
Şekil 8.f-12
d. Label metnini çerçeve içine almak
Eğer Label nesnesinin sınırlarını çizgi ile belirlemek istiyorsanız Label nesnesine ait
BorderStyle değişkeninden veya özelliğinden yararlanılır. Label nesnesinin sınırlarını çizgi ile
belirlemek istiyorsanız BorderStyle değişkenine “1-Fixed Single” değilse “0-None” değerini
aktarmanız gerekir (Şekil 8.f-13).
235
Şekil 8.f-13
e. Label metninin label alanı içindeki yeri
Eğer Label metninin Label alanı içinde ortalamasını veya sağ tarafa hizalanmasını istiyorsanız
Label nesnesine ait Alingment özelliğinden yararlanmanız gerekir. Label metninin Label alanı
içindeki yeri hem tasarım hem de çalışma anında değiştirilebilir (Şekil 8.f-14).
Private Sub Form_Load()
Label1.Alignment = 2- Center
End Sub
Şekil 8.f-14
Eğer Label kutusunun üç boyutlu olarak görüntülenmesini istiyorsanız Label nesnesine ait
Apperance özelliğinden yararlanmanız gerekir. Apperance özelliğindeki 1-3D özelliğini seçerseniz
label kutusu boyutlanır (Şekil 8.f-15).
236
Şekil 8.f-15
2. TextBox Kontrolü
ToolBox’ta üzerinde “ab” harfleri olan düğme ile formlara metin kutusu nesnesi eklenir.
ToolBox penceresinde TexBox kontrolünü temsil eden düğme seçili durumda iken fare işareti formun
TexBox nesnesi eklenmek istenen yerine götürülür. Ardından farenin sol tuşu basılı durumda iken fare
sürüklenerek metin kutusunun boyutları belirlenir. Ekran görüntüsünden tespit edileceği gibi forma
eklenen ilk TetBox’in içeriği varsayım olarak “Text1” şeklindedir (Şekil 8.f-16.
Private Sub Form_Load()
Text1.Text = ““
End
Sub
Şekil 8.f-16
Çalışma anında metin kutusuna girilen bilgi, proje dahilinde varsayılan adı “Text1” olan metin
kutusu nesnesine aktarılır. Programcı daha sonra bu metin kutusunun içeriğini istediği gibi
değerlendirebilir. Yukarıda verilen program kodu ile Text1 adlı TextBox’ in içeriği form yüklenir
yüklenmez boşaltılır.
Bu program kodları üzerinde çalışılan projenin tek formuna dahil edildikleri için TextBox’ların
hangi Forma dahil oldukları konusunda bilgi vermeye gerek duyulmadı. Eğer bu program kodları BAS
uzantılı bir module dosyasına yazılmış olsaydı TextBox adlarından önce TextBox’ların dahil edildiği
formun adı belirtilirdi.
Private Sub Test()
Form1.Text1.Text = ““
End
Sub
237
Şekil 8.f-17
TextBox nesnelerine girilen değerler varsayım olarak sol tarafa göre hizalanır. Eğer TextBox
nesnesine girilecek bilgilerin sağ tarafa hizalanmasını istiyorsanız Alignment özelliğinden
yararlanmanız gerekir. Bunun için Alignment değişkenine 1-Right Justify özelliğini aktarmanız
gerekir. 2-Center’i seçerseniz TextBox nesnesine giren değerler ortalanır (Şekil 8.f-17).
a. TextBox nesnelerini kopyalamak
Üzerinde çalıştığınız projenin formuna arka arkaya birkaç TextBox nesnesi dahil etmek yerine
mevcut TextBox nesnesini kopyalayabilirsiniz. Formun üzerine yerleştirdiğiniz Text1 adındaki metin
kutusu nesnesini seçtikten sonra Edit menüsünden Copy komutunu verip metin kutusunun bir
kopyasını alabilirsiniz. Edit menüsünden Paste komutunu verip aynı nesnenin aynı form üzerinde
birden fazla kopyasının olmasını sağlayabilirsiniz.
Bu durumda nesne dizisinin elemanlarına erişim sağlamak için Index özelliğinden yararlanılır. Bu
şekilde çoğaltılan bütün TextBox nesneleri aynı ad ve içeriğe sahiptir. Ancak Visual Basic kopyalama
işlemi sırasında TextBox nesnelerinin Index özelliğinin içeriğini değiştirir (Şekil 8.f-18).
Şekil 8.f-18
238
Şekil 8.f-19
Private Sub Form_Load()
Text1(0).Text = “ Adana“
Text1(1).Text = “ Ankara“
Text1(2).Text = “ Afyon“
Text1(3).Text = “ Aydın“
End Sub
b. TextBox’a girilen bilgiyi satırlara bölmek
Eğer metin kutusuna girmek istediğiniz bilgiyi metin kutusu içinde birden fazla satıra bölmek
istiyorsanız, tasarım anında Properties penceresinde söz konusu metin kutusu nesnesine ait MultiLine
özelliğine True değerini aktarmalısınız. MultiLine özelliğine sahip TextBox’a bilgi girerken Enter tuşu
ile bir sonraki satıra inilebilir.
Şekil 8.f-20
Diğer yandan TextBox nesnesine program kodu yazarak aktarılan bilgiyi birden fazla satıra bölmek
için Chr fonksiyonundan yararlanılır. Bunun için label metnine satır sonu karakterini eklemek gerekir.
239
Private Sub Form_Load()
Text1.Text = “ Merhaba Dünya“ + Chr(13) + Chr(10) + “Merhaba İnsanlar”
End Sub
c. TextBox’ lara kaydırma çubuklarını eklemek
TextBox nesnelerine MultiLine özelliğini vermekten başka kelime işlem programlarında
olduğu gibi kaydırma çubukları (ScrollBar) eklenebilir. Kaydırma çubukları eklemek istenen metin
kutusunun mutlaka MultiLine özelliğine sahip olması gerekir. TextBox’lara kaydırma çubukları
eklemek için ScrollBars özelliğinden yararlanılır (Şekil 8.f-21).
Şekil 8.f-21
ScrollBars değişkenine 4 değişik değer aktarılabilir. Aktarılan değerleri yukarıda verilen ekran
görüntüsünde tespit edebilirsiniz. MultiLine özelliğine sahip TextBox’ların kenarlarına varsayım
olarak kaydırma çubukları konulmaz. Bu nedenle başlangıçta TextBox nesnesine ait ScrollBars
değişkeni “0-None” değerini içermektedir.
TextBox’a yatay kaydırma çubuğu eklemek istiyorsanız ScrollBars değişkenine “1-Horizontal”
değerini aktarmanız gerekir. Şekil 8.f-22’de verilen ekran görüntüsünü formdaki ilk Textbox
nesnesine ait ScrollBars özelliğine “1-Horizontal” değerini aktardıktan sonra çalışma anında
alınmıştır.
240
Şekil 8.f-22
Yatay kaydırma çubuğu, kutudan daha geniş satırlar söz konusu olduğu zaman işlevsel olmaktadır.
TextBox’a yalnızca düşey kaydırma çubuğu eklemek için ScrollBars değişkenine “2-Vertical” değeri
aktarılır (Şekil 8.f-23).
Şekil 8.f-23
TextBox’a hem yatay hemde düşey kaydırma çubuğu eklemek için ScrollBars değişkenine “3Both” değeri aktarılır (Şekil 8.f-24). ScrollBar değişkeninin içeriği ancak tasarım anında Propertiee
penceresinde değiştirilebilir.
Şekil 8.f-24
241
d. TextBox nesnesine girilecek bilgi miktarı
Bir TextBox nesnesine en fazla 64KB kadar metin girilebilir. Ancak programcı TextBox’a
girilecek bilgi miktarını veya karakter sayısını sınırlayabilir. TextBox’a girilecek karakter sayısı
MaxLength değişkeni aracılığı ile belirlenir. Bu değişkende varsayım olarak 0 değeri bulunur. Bu
sırada kutuya girilecek bilgi konusunda bir engelleme yapılmaz. Eğer bir metin kutusuna çalışma
anında 20 karakterden fazla bilgi girişine izin vermek istemiyorsanız MaxLength özelliğine 20
değerini aktarmanız gerekir.
Şekil 8.f-25
e. Tablndex özelliği
Çalışma anında forma dahil edilmiş olan bir sonraki nesnenin üzerine gitmek için Tab tuşuma,
sıradaki bir önceki nesnenin üzerine gitmek için Shift+Tab tuşlarına basılır. Forma eklenen ilk
nesnenin sıra numarası varsayım olarak 0, 2. sırada eklenen nesneninki 1’ dir. Ancak bu sıra çoğu
zaman sorunlar çıkarır. Bu nedenle programcının formlara dahil ettiği nesnelere kendi sıra numarasını
vermesi gerekir. Nesnelerin form içindeki sıra numarası Tablndex değişkeni aracılığı ile izlenir (Şekil
8.f-26).
.
Şekil 8.f-26
Bu genellemeye Label’ler dahil değildir Çünkü çalışma anında kullanıcının Label nesneleri
üzerinde yaptığı işlemler sınırlıdır. Dolayısıyla çalışma anında sıradaki nesne bir Label ise Tab tuşuna
basıldığı zaman Label nesnesi atlanılır. Formdaki nesnelerin sıra numarası veya TabIndex değerleri
tasarım veya çalışma anında değiştirilir.
242
f. TabStop ve locked özelliği
Bazı durumlarda formlara eklenen TextBox’lara kullanıcının müdahale etmesi istenmez.
Örneğin kayıt düzeltmek amacıyla hazırlanan bir formdaki Kayıt Numarası yazılı olan TextBox’ın
içeriğinin kayıt okuma işleminden sonra değiştirilmemesi gerekir. Bu ve benzeri bir nedenle
TextBox’ın atlanması istenmiyorsa TextBox’a ait TabStop özelliğinden yararlanılır (Şekil 8.f-27).
Şekil 8.f-27
Tab tuşuna basıldığı zaman sırada TabStop değişkeni False olan bir TextBox nesnesi varsa söz
konusu TextBox atlanır. Ancak fare ile TabStop özelliği false yapılan metin kutusuna geçebilirsiniz.
Eğer TextBox nesnesinin içeriğinin değiştirilmesine izin vermek istemiyorsanız Locked özelliğine
True değerini aktarmanız yeterlidir (Şekil 8.f-28).
243
Şekil 8.f-28
Başlangıçta False değerini içeren Locked özelliğine program kodu yazarak çalışma anında True
değerini aktarabilirsiniz. Locked özelliği True değerini içerdiği sürece TextBox nesnesinin içerdiği
bilgide herhangi bir değişiklik yapamazsınız.
g. Şifre karakteri
Özellikle ticari amaçlı programlarda programa girişte şifre istenir. Visual Basic programcıları
ek bir çaba harcamadan Kullanıcıdan şifre isterken TextBox nesnesinden yararlanabilirsiniz. Şifre
olarak girilen karakterler ekranda görünmemelidir. Girilen her karakterin yerine “*” gibi bir şifre
karakterinin ekranda ilgili yere yazılması gerekir. Forma eklenen TextBox nesnesini şifre girişinde
kullanmak için şifre olarak girilecek bilgilerin yerine yazılacak karakterleri PassWordChar
özelliğinden yararlanarak seçmeniz gerekir
(Şekil 8.f-29).
Şekil 8.f-29
Varsayım olarak başlangıçta PassWordChar değişkeninin içeriği boştur. Bu değişkene tasarım veya
çalışma anında istenen karakter atanabilir.
244
Şekil 8.f-30
Şimdi size basit şifre örneği vereceğim. Bu amaçla hazırlanan form yüklenir yüklenilmez çalışan
Form_Load yordamı dahilinde şifre karakteri seçilir ve TextBox’ın içeriği boşaltılır.
Private Sub Form_Load()
Text1.Text = “”
Text1.PasswordChar = “*”
End Sub
Kullanıcı şifre girmek üzere her bir tuşa bastığında çağrılan TextBox’a ait olan Text1_KeyPress
yordamına girişi yapılan şifrenin karakter ve tekrar sayısı hesaplanır. Girilen karakterler belirlenen
sayıda ve belirlenen şifre ile aynı ise kullanıcı programa girebilecek, değilse programın çalışması sona
erdirilecek.
Private Sub Text1_KeyPress(KeyAscii As Integer)
Static Sifre As String
Static Tur As Integer
Sifre = Sifre + Chr$(KeyAscii)
If Len(Sifre) = 5
Then
Tur = Tur +1
If
Tur > 2 Then
MsgBox (“Şifreniz yanlış”)
End
End If
If Sifre = “Basit” Then
MsgBox (“Şifreniz doğru”)
KeyAscii
= 0
245
Sifre = “”
Form2.Show
Else
Text1.Text = “”
KeyAscii = 0
Sifre = “”
End If
End If
End Sub
Eğer üzerinde çalıştığınız projenin formuna yerleştirdiğiniz metin kutularını daha önce açtığınız
veri tabanı dosyasının içeriğini görüntülemek veya değiştirmek amacıyla kullanmak istiyorsanız
DataField ve DataSource özelliklerinden yararlanmanız gerekir.
Şekil 8.f-31
h. Yazı ve zemin rengini seçmek
Forma eklenen Textbox nesnelerinde başlangıçta zemin rengi beyaz ve yazı rengi ise siyahtır.
Eğer metin kutusuna yazacağınız karakterlerin farklı bir renkte olmasını istiyorsanız ForeColor
özelliğinden yararlanmanız gerekir. Bu amaçla Properties penceresinde kendisi için yazı rengi
seçilmek istenen metin kutusuna ait özellikler listelenirken ForeColor özelliğinin üzerine gidilir ve
renklerin yer aldığı liste kutusu açılır. ForeColor özelliğine ait liste kutusunda Palette ve System
adında iki sekme bulunmaktadır
(Şekil 8.f-32).
246
.
Şekil 8.f-32
System sekmesinde daha önce Windows 95’in Denetim Masasından yararlanarak menüler,
kaydırma çubukları, başlık çubukları ve diyalog kutuları için belirlenen renkler listelenir. Palette
sekmesinde ise renk paleti ekrana getirilmektedir. Metin kutusu nesnesi için başlangıçta beyaz olan
zemin rengini değiştirmek istiyorsanız BackColor özelliğinden yararlanabilirsiniz.
i. Format fonksiyonu ile TextBox nesnesinin içeriğini
biçimlemek
Format Fonksiyonu ile TextBox nesnelerinin içeriklerini veya herhangi bir bilgiyi biçimlemek,
tarihsel bilgi olarak değerlendirilmesini sağlamak mümkündür. Şimdi bir metin kutusuna girdiğiniz
bilgiyi nasıl üçer hanelere ayırabileceğinizi görelim. Bu amaçla üzerinde çalıştığımız projenin formuna
bir metin kutusu nesnesi dahil edelim ve formun üzerinde tıklama yapıldığı zaman işletilmek üzere
aşağıdaki yordamı hazırlayalım.
Private Sub Form_Click()
Dim Sayı As Long
Sayı = Str (Text1.text)
‘ 65784929
Text1.Text = Format (Sayı , “###,###,###”)
‘ 65.784.929
End Sub
Bu yordamda önce Dim ve Long bildiri deyimleri ile sayısal bir değişken tanımlanır. Ardından
Text1 adındaki metin kutusunun Text özelliğinin içeriği Str fonksiyonu ile sayısal bilgi türüne çevirip
tanımladığımız değişkene aktaralım. Ardından sayısal bilgi içeren değişkeni ve metin kutusunu
biçimlemede kullanacağımız biçim kodunu Format fonksiyonuna parametre olarak verelim. Format
fonksiyonu kendisine 1.parametre olarak verilen bilgiyi, ikinci parametrede verilen biçim koduna göre
biçimleyip geri göndermektedir ( Şekil 8.f-33).
247
Şekil 8.f-33
Tam bu sırada formun üzerinde tıklama yapıp yukarıda ekran görüntüsünü verdiğimiz yordamı
işletince, metin kutusunun içeriği, Format fonksiyonuna ikinci parametre olarak verdiğimiz biçim
koduna göre biçimlenir (Şekil 8.f-34).
Şekil 8.f-34
Eğer metin kutusuna yazılan virgülden sonra iki hanesinin olmasını isterseniz format aşağıdaki
şekilde düzenlenirdi.
Private Sub Form_Click()
Dim Sayı As Long
Sayı = Str (Text1.text)
‘ 65784929
Text1.Text = Format (Sayı , “###,###,###,00”)
‘ 65.784.929.00
End Sub
Metin kutusu nesnesine girmiş bulunduğunuz bilginin bir kısmını seçebilirsiniz. Nesnenin seçili
duruma getirilen içeriği SelText değişkenine aktarılmaktadır. Aşağıda verilen program satırı ile metin
kutusu nesnesinin içeriğinin seçili durumda olan kısmı Format fonksiyonundan yararlanılarak büyük
harfe çevrilmekte ve ikinci bir metin kutusuna aktarılmaktadır.
Private Sub Form_Click()
Text2.Text = Format (Text1.SelText, “>”)
End Sub
3. Masket Edit Kontrolü
248
Visual Basic İle birlikte belli tip ve uzunluktaki bilgileri girerken kullanabileceğiniz Masked
Edit adında bir özel kontrol verilmektedir. Başlangıçta Components diyalog kutusundan yararlanarak
projeye dahil etmeniz gerekir.
Şekil 8.f-35
Forma eklenen ilk Masked Edit nesnesine varsayım olarak MaskEdBox1 adı verilmektedir. Masked
Edit nesnelerinin içerikleri başlangıçta boştur. Projeyi çalıştırırsanız Masked Edit nesnesi TextBox
nesnesinden farklı olmaz. Forma yerleştirmiş olduğunuz Masked Edit nesnesinin özelliklerini bir
diyalog kutusu aracılığı ile değiştirmek istiyorsanız Custom özelliğinden yararlanmanız gerekir.
Propeties penceresinde Masket Edit nesnesinin özellikleri listelenirken ışıklı bantı Custom özelliğinin
üzerine götürecek olursak özelliğe ait metin kutusuna bir düğme yerleştirilir.
Bu düğmede tıklama yapacak olursanız Masked Edit nesnesinin özelliklerinde değişiklik yapabilen
Property Pages diyalog kutusu ekrana getirilir. Bu diyalog kutusunda Masked Edit nesnesi ile ilgili
özellikler 4 sekmeye ayrılmış durumdadır (Şekil 8.f-36).
Şekil 8.f-36
249
Bu diyalog kutusunda ilk olarak nesne için Maske hazırlamak gerekir. Bu amaçla Mask
özelliğinden yararlanmak gerekir. Forma yerleştirdiğimiz Masked Edit nesnesini şehirler arası telefon
kodu ile birlikte telefon numarasını girmek için Şekil 8.f-37’teki gibi bir maske hazırlayalım. Maskeyi
hazırlarken girdiğimiz her “#” karakteri çalışma anında girilecek bir rakamı temsil edecektir.
Şekil 8.f-37
Properties Pages diyalog kutusunda forma yerleştirdiğim Masked Edit nesnesi için bu şekilde
maske hazırlayıp diyalog kutusunu Tamam düğmesi ile kapatınca hazırladığım maske tasarım anında
Masket Edit nesnesi içinde görüntülendi.
Şekil 8.f-38
Masked Edit nesnesinin Mask özelliğini değiştirmek için Custom özelliğine başvurmadan
Properties penceresinde direk Mask özelliğine başvurabilirsiniz.
250
Şekil 8.f-39
Masket Edit nesnesinin Mask özelliğini bu şekilde değiştirdikten sonra projeyi çalıştıracak
olursanız aşağıdaki gibi bir ekran görüntüsü ile karşılaşırsınız. Bu sırada direk olarak 3 haneli alan
kodunu girebilirsiniz.
Şekil 8.f-40
Alan kodunun giriş tamamlandıktan sonra ekleme noktası 7 haneli telefon numarasını
girebileceğiniz yerde hazır olarak beklemeye başlar. Aşağıda verilen ekran görüntüsünü projeyi
çalıştırdıktan sonra direk”322” yazdıktan sonra alırsak Şekil 8.f-41’ deki görüntü elde edilir.
Şekil 8.f-41
Verilen ekran görüntülerinden tespit edebileceğiniz gibi Maske yardımı ile bilgi girilecek yerler
tire(-) karakteri ile işaret edilmektedir. Eğer bilgi girilecek yerleri işaret ederken başka bir karakteri
kullanmak istiyorsanız Madket Edit nesnesinin PromptChar özelliğinden yararlanmanız gerekir
(Şekil 8.f-42).
251
Şekil 8.f-42
Hazırladığınız maskenin uzunluğu MaxLength
özelliğine aktarılır. Masked Edit nesnesinin Mask
özelliğini değiştirmek için Custom özelliğine
başvurmadan Properties penceresinde direk Mask
özelliğine başvurabilirsiniz. MasKed Edit nesnelerine
en fazla 64 karakter uzunluğunda bilgi girilebilir.
Eğer forma yerleştirmiş olduğunuz Masked Edit
nesnesine daha az veya daha fazla bilgi girmek
istiyorsanız MaxLenght özelliğinden yararlanmanız
gerekir (Şekil 8.f-43). Verilen örnekte MaxLenght
özelliği 15 karakter olarak belirlenmiştir.
Şekil 8.f-43
4. CommandButton Kontrolü
252
ToolBox penceresinde Command Box nesnesini temsil eden düğmeyi fare ile
seçili duruma getirdikten sonra formun üzerinde sürükleme işlemini yaparak
düğmenin boyutları fare ile belirlenir. Formlara eklenen ilk düğmenin veya
Command Box nesnesinin başlığı ve program içindeki adı varsayım olarak
Command1 seçilir. Bu düğmenin adını değiştirmek için Properties penceresinde
Command Box nesnesine ait Caption özelliğinde değişiklik yapılır
Düğme metninin ilk harfinin altının çizili olmasını sağlamak için düğme başlığının önüne “&”
işareti konur. Şekil 8.f-44’de “G” harfinin önüne konulduğu için tasarım ve çalışma anında “G”
harfinin altı çizili olur. Ancak aynı diyalog kutusunda veya pencerede ilk harfi aynı olan birden fazla
seçenek veya düğme varsa, düğme metninde hangi harfin altı çizili olmasını istiyorsanız “&” işaretini
o harfin önüne koymanız gerekir (Şekil 8.f-44).
Düğmenin başlığı Properties penceresinde olduğu gibi çalışma anında da değiştirilebilir.
Private Sub Form_Click()
Command1.Caption = “Kaydet”
End Sub
Şekil 8.f-44
Command Button nesnesine ait Cancel değişkeni başlangıçta False değerini içerir. Cansel
değişkeninin içeriği Properties penceresinde veya çalışma anında program kodu yazılarak
değiştirilebilir. Bu şekilde Esc tuşunu işlevi kullanılabilir.
Private Sub Form_Click()
Command1.Cansel = True
End Sub
Cancel özelliğinin etkisini görebilmek için İptal_Click yordamında MsgBox() fonksiyonu
yardımıyla ekrana mesaj yazdıralım.
253
Private Sub İptal_Click()
Onay = MsgBox(“Esc tuşuna basıldı programdan çokılacak”,4)
If Onay = 6 Then
End
End If
End Sub
Şekil 8.f-45
İptal_Click yordamı bu şekilde düzenlenmiş olan Proje çalıştırıldığında Esc tuşuna basılırsa Cansel
özelliği True olan düğmede tıklama yapılmış gibi İptal_Click yordamı çalıştırılır. Aynı form içinde
Cansel özelliği True yapılmış birden fazla düğme varsa TabIndex değişkeni daha küçük olan
düğmede tıklama yapılmış olur. Eğer başlangıçta yani söz konusu form ekrana geldiğinde Tablndex
değeri en küçük olan düğmenin yerine başka bir düğmenin seçili durumda olmasını istiyorsanız o
düğmeye ait Default değişkeninden yararlanılır.
Şekil 8.f-46
Forma eklenen düğmelerin Default değişkeni başlangıçta False değerine sahip olur. Default
değişkeni True yapılan düğmenin TabIndex değişkeni hangi değeri içerirse içersin düğmenin dahil
olduğu form çalışma anında aktif yapıldığında düğme seçili duruma gelir (Şekil 8.f-46).
Bir forma eklenen düğmeler başlangıçta varsayım olarak seçilebilir durumda yani Enabled özelliği
True değerine sahiptir. Kullanılamaz duruma getirilmek istenen düğmenin Enabled değişkeni False
duruma getirilmelidir (Şekil 8.f-47).
254
Şekil 8.f-47
Programın çalışması sırasında Çıkış düğmesine ait Enabled değişkeni True yapılmadığı sürece
düğme, fare ile yapılan tıklama ve diğer işlemlere duyarsız olur. Eğer program çalışırken o sırada
gerek duyulmayan düğmeleri ekrandan tamamıyla kaldırmak istiyorsanız Visible değişkeninden
yararlanabilirsiniz. Visible değişkeni False durumuna getirilen düğme ekrandan kaldırılır (Şekil 8.f48).
Şekil 8.f-48
Eğer Tab veya Shift+Tab tuşları ile nesneler arasında dolaşırken atlanılmak istenen bir nesne varsa
bu nesnenin TabStop değişkeni False durumuna getirilmelidir (Şekil 8.f-49). Bir nesnenin TabStop
özelliği tasarım anında olduğu gibi çalışma anında da değiştirilebilir
Private Sub Form_Click()
Form1.Command1.TabStop = False
End Sub
Şekil 8.f-49
255
a. Düğmelerin üzerine resim yerleştirmek
Şimdiye kadar verilen düğme örneklerinde düğmenin işlevini işaret etmek için düğmenin
başlığından veya Caption özelliğinden yararlanıldı.
Ancak düğmelerin işlevini işaret etmek için, düğmelerin üzerine resim ekleyebilirsiniz. Düğmelerin
üzerine resim yerleştirmek istiyorsanız ilk olarak Style özelliğinden yararlanarak düğmenin stilini
Graphical olarak değiştirmeniz gerekir.
Stilini Graphical olarak değiştirdiğiniz düğmenin üzerine resim koymak için Command Button
nesnesinin Picture özelliğinden yararlanılmaktadır.
Şekil 8.f-50
Style Graphical olarak değiştirdiğiniz düğmenin üzerine resim koymak için Command Button
nesnesinin Picture özelliğinden yararlanabilirsiniz. Bu düğmeler için ICO uzantılı resim dosyaları
kullanmak gerekir. Diğer yandan bazen düğme basılı iken düğmenin üzerinde farklı bir resim
görüntülenmesi istenir. Eğer düğmenin üzerinde başlık metnine yer vermek istemiyorsanız Caption
özelliğinin içeriğini silmeniz gerekir.
Şekil 8.f-51
Diğer yandan bazen düğme basılı durumda iken düğmenin üzerinde farklı bir resmin
görüntülenmesi istenir. Düğme basılı durumda iken düğmenin üzerinde başka bir resim görüntülemek
256
istiyorsanız Command Button nesnesinin DownPicture özelliğinden yararlanmanız gerekir (Şekil 8.f51).
Şekil 8.f-52
Command Button nesnesi seçilemez durumda iken veya Enabled özelliği True değeri içerdiği
zaman düğmenin üzerine başka bir resim görüntülenmesini istiyorsanız bu kez DisablePicture
özelliğinden yararlanmanız gerekir (Şekil 8.f-52).
b. ToolTipText özelliği
Eğer fare işaretini Visual Basic ile hazırladığınız proje dahilinde kullandığınız bir nesnenin
üzerine götürdüğünüzde ekrana araç çubuklarındaki gibi kısa bir açıklayıcı bilginin getirilmesini
istiyorsanız söz konusu nesnenin ToolTextTip özelliğinden yararlanmanız gerekir (Şekil 8.f-53).
Açıklama metnini Properties penceresinde ToolTipText özelliğine ait metin kutusuna yazabilirsiniz.
Şekil 8.f-53
5. CheckBox (Onay Kutuları)
257
Onay kutuları (Check Box) ve Radyo düğmeleri Windows uyumlu
profesyonel programlarda çok sık kullanılmaktadır. Onay kutuları aç-kapa
şeklinde çalışmaktadır.
Visual Basic projeleri dahilinde formlara onay kutusu nesnesi eklemek için
önce ToolBox penceresinde CheckBox kontrolünü temsil eden düğme seçili
duruma getirilir. CheckBox kontrolünü temsil eden düğme seçili durumda iken
formun üzerinde fare ile sürükleme yapılarak onay kutusunun Forma dahil
edilmesi işlemi tamamlanır.
Şekil 8.f-54
Formlara eklenen ilk onay kutusunun adı ve başlığı varsayım olarak Check1, ikinci sırada eklenen
kutuya ise Check2 adı ve başlığı verilir (Şekil 8.f-54). Diğer nesne başlıklarında olduğu gibi onay
kutusu başlığı metni içinde altı çizilmek istenen harfin önüne “&” karakteri konulmalıdır.
Onay kutusunda onay işareti varken seçili durumdadır, yoksa değildir. CheckBox’lar, küçük bir kare
ve küçük karenin sağında yer alan başlık bilgisinden meydana gelirler.
Eğer onay kutusu başlığı metni içinde altı çizili bir harf varsa onay kutusunun seçili olma veya
olmama durumunda değişiklik yapmak için Alt tuşu ile birlikte altı çizili harfe basılabilir.
Bir diyalog kutusu veya formunda istenilen sayıda Onay kutusu bulunabilir. Onay kutuları
birbirlerinden bağımsızdır. Birbirlerine etkileri yoktur CheckBox nesnesine ait Alignment
değişkeninden yararlanarak programcı kutuyu sağa ve başlığı ise sol tarafa alabilir. CheckBox’lara ait
Alignment özelliği başlangıçta varsayım olrak 0-Left Justify değerine sahiptir.
Şekil 8.f-55’de verilen ekran görüntüsündeki ilk onay ktusunun Alignment özelliği “0-Left Justify”
değerine ve ikinci onay kutusunun Alignment özelliği “1-Right justify” değerine sahip olması
sağlandı.
258
Şekil 8.f-55
Formlara eklenen CheckBox’ lar başlangıçta seçili durumda değildir. Bu onay kutusunun seçili
durumda olup olmadığı CheckBox’ a ait Value değişkeni ile izlenir. Onay kutularına ait Value
değişkenine ait properties penceresinde 1-Checked değerini aktarmak yeterlidir.
Şekil 8.f-56
Bazı durumlarda CheckBox’ın yapılan başka bir işlemden dolayı bloke edildiğini belirtmek için
CheckBox’a ait kutu 2-Grayed seçeneği ile gri renge boyanır (Şekil 8.f-56).CheckBox’ın seçili olma
özelliğini veya Value özelliğinin içeriği çalışma anında program kodu yazılarak değiştirilebilir.
Çalışma anında fare veya baoşluk tuşu ile kutuya onay işareti konulur veya kaldırılır. Eğer çalışma
anında kutu gri renge boyanmak isteniyorsa kond penceresinde Value özelliğine 2-Grayed değeri
aktarılmalıdır.
Private Sub Check2_Click()
Check2.Value = 2- Grayed
End Sub
Fare ile CheckBox sınırları üzerinde tıklama yapılırsa hem CheckBox’a ait Value değişkenin
içeriği değişir hem de Click olayı meydana gelir. Söz konusu onay kutusunda tıklama yapıldığında
otomatik olarak çalıştırılan yordamın aşağıdaki gibi düzenlendiğini varsayalım. Bu yordamda üzerinde
tıklama yapılan onay kutusunda (Check1) onay karakteri varsa, başka bir deyişle Value değişkeni “1Checked” değerine sahipse değişkenin içeriği”0-UnChecked” olarak değiştirilmektedir.
259
Private Sub Check2_Click()
If
Check1.Value = 1- Checked Then
Check1.Value = 0 – Unchecked
Elseif Check1.Value = 0- Unchecked Then
Check1.value = 1- Checked
End If
End Sub
6. OptionButton (Radyo Düğmeleri)
Radyo düğmeleri ile onay kutuları bir özellik dışında birbirinden farklı
değildir. Aynı form içinde yan yana konulan bütün onay kutuları seçili
durumda olabilir. Ancak Radyo düğmeleri böyle değildir. Bir forma dahil
edilen Radyo düğmelerinden ancak birisi seçili duruma getirilebilir.
Forma eklenen ilk Radyo düğmesine varsayım olarak Option1, ikinci
sırada eklenen Radyo düğmesine ise Option2 adı ve başlığı verilir
(Şekil 8.f-57). Forma eklediğiniz radyo düğmesinin adını ve başlığını
Properties penceresinde değiştirebilirsiniz.
Şekil 8.f-57
Alinment değişkenine “1-Right Justify” değeri aktarılan radyo düğmesinin başlığı sol tarafa,
düğme ise sağ tarafa alınır (Şekil 8.f-57). Radyo düğmelerinin Aligment özelliklerinin içeriği çalışma
260
anında program kodu yazılarak değiştirilemez. Bir düğmesinin seçili olup olmadığı düğmeye ait
Value değişkeni ile izlenir(Şekil 8.f-58). Tasarım anında varsayım olarak bütün radyo düğmelerine
ait Value değişkenleri False değerine sahiptir. Bu durumda çalışma anında ilk sıradaki radyo
düğmesi otomatik olarak seçili duruma getirilir. Seçili durumdaki radyo düğmesinin Value değişkeni
“-1”, seçili olmayanların ki ise “0” değerini içerir.
Şekil 8.f-58
Tasarım anında proje ilk çalıştırıldığında seçili durumda olması istenen radyo düğmesinin Value
değişkenine Properties penceresinde True değeri aktarılmalıdır.
Private Sub Form_Load()
Option1.Value=True
End Sub
7. Frame (Çerçeveler)
Radyo düğmeleri çerçevelerle gruplaşmadığı sürece birden fazla düğmenin
seçili duruma getirilmesi mümkün değildir. Eğer üzerinde çalışılan forma
eklenmek istenen nesneler çerçeve içine alınmak veya gruplaşmak isteniyorsa,
Forma önce çerçeve nesnesi eklenir. Forma çerçeve nesnesi eklemek için
ToolBox penceresinde çerçeve nesnesini temsil eden düğme seçili duruma
getirilir.
İlgili düğme seçili iken formun istenen yerine istenen büyüklükte çerçeve
eklenebilir. Forma eklenen ilk çerçeveye varsayım olarak Frame1 adı ve başlığı
verilir (Şekil 8.f-59).
261
Şekil 8.f-59
Çerçevenin varsayılan adını değiştirmek için çerçeveye ait Name başlığını değiştirmek için
Caption değişkeninden yararlanılır. Çerçevenin başlığı çalışma anında program kodu yazılarak
değiştirebilir.
Private Sub Form_Load()
Frame1.Caption = “Hizalama”
End Sub
Forma dahil edilen bir çerçevenin içine daha sonradan onay kutuları ve radyo düğmeleri gibi
nesneler eklenebilir (Şekil 8.f-60).
Şekil 8.f-60
8. VScrollBar (Düşey Kaydırma Çubuğu)
Diyalog kutuları veya pencerelerin içinde görüntülenmek istenen belge, çalışma tablosu veya
dosya listesi, bir seferde pencereye sığamıyorsa söz konusu bilginin o anda ekranda gösterilen kısmını
değiştirmek için kaydırma çubuklarından yararlanılır. Tasarım anında üzerinde çalışılan projedeki
262
formun birine düşey veya yatay kaydırma çubuğu eklemek için önce ToolBox penceresinde ilgili
düğme seçili duruma getirilir.
Şekil 8.f-61
ToolBox penceresinde düşey ve yatay düğmeler yan yana bulunmaktadır. Forma eklenen ilk düşey
kaydırma çubuğuna varsayım olarak Vscroll1 adı verilmektedir. Bir düşey kaydırma çubuğunda,
çubuğun üst kısmında ucu yukarı bakan, alt kısmında ise ucu aşağıya bakan ok işareti içeren iki düğme
bulunmaktadır. Kaydırma çubuklarında maksimum ve minimum değerleri vardır. Çubuktaki düğme en
alt noktada iken maksimum değere, en üst noktada iken minimum değere ulaşılmış olur.
Şekil 8.f-62
Kaydırma çubuğu içeren bir proje çalıştırıldığında kaydırma çubuğundaki kutu başlangıçta çubuğun
en üst noktasında yer alır. Düşey kaydırma çubuğunun maksimum değeri başlangıçta 32767 ve
minimum değeri ise o dır (Şekil 8.f-62). Kaydırma çubuğuna verilecek en yüksek değer Max
değişkenine, en düşük değer ise Min değişkenine aktarılır. Max ve Min değişkenlerinin içerikleri
tasarım ve çalışma anında istenildiği gibi değiştirilmektedir.
263
Şekil 8.f-63
Çalışma anında yeri değiştirilen kaydırma düğmesinin çubuk üzerindeki yerinin sayısal karşılığı
Value değişkeni ile izlenir. Value değişkeninin başlangıçtaki içeriği ile Min değişkeninin içeriği
aynıdır
(Şekil 8.f-63). Value değişkenin içeriği kaydırma çubuğuna ait LargeChange değişkeni
kadar artar. LargeChange değişkeni başlangıçta 1 değerine sahiptir.
Private Sub Form_Load()
Vscroll1.Value = Vscroll1.Max / 2
End Sub
Value değişkeninin içeriği LargeChange değişkeni kadar artıyorsa benzer şekilde yukarı kaydırma
düğmesinde yapılan her tıklama işleminden sonra Value değişkeninin içeriği SmallChange değişkeni
kadar azalır (Şekil 8.f-64).
Şekil 8.f-64
SmallChange değişkeni başlangıçta 1 değerine sahiptir. Düşey kaydırma çubukları daha çok veri
tabanı dosyasında okunan kayıtların bir pencere içinde ekrana getirilmesi veya Browse yapılması
sırasında kullanılır. Bu nedenle programcının söz konusu düşey kaydırma çubuğuna ait Max, Min,
SmallChange ve LargeChange değişkenlerin içeriklerini çalışma anında belirlemesi gerekir.
VScroll ile ilgili örnek program
264
‘Value =50 : Min=0 : Max=100
Private Sub VScroll1_Change()
Label1 = "Seçilen sayı: " + Str(VScroll1.Value)
End Sub
Private Sub VScroll1_Scroll()
Label1 = "Seçilen sayı: " + Str(VScroll1.Value)
End Sub
Private Sub Command1_Click()
Dim I, R
For I = 1 To VScroll1.Value Step 1
R = R + I
Next
Text1.Text = Str(R)
I = 1
Do While I
R = R +
I = I +
Loop
Text1.Text
<= VScroll1.Value
I
1
= Str(R)
End Sub
9. HscrollBar (Yatay Kaydırma Çubuğu)
Ekranda duruş şekli ve kaydırmanın yönü dışında, düşey kaydırma çubuğu ile yatay kaydırma
çubuğu arasında pek fark yoktur. Forma eklenen ilk yatay kaydırma çubuğunun adı Visual Basic
tarafından Hscroll1 olarak seçilir. Programcı tasarım anında yatay kaydırma çubuğuna istediği adı
verebilir. Düşey kaydırma çubukları için sözü edilen bütün değişkenler veya özellikler yatay kaydırma
çubukları için geçerlidir.
265
Şekil 8.f-65
HScroll ile ilgili örnek program
Private Sub HScroll1_Change()
‘Value =50 : Min=0 : Max=100
Text1.Text = Str(HScroll1.Value) + " mph"
End Sub
Private Sub HScroll1_Scroll()
Text1.Text = Str(HScroll1.Value) + " mph"
End Sub
Private Sub cmdExit_Click()
End
End Sub
10. ListBox (Liste Kutuları)
266
Windows uyumlu programlarda temelde iki çeşit liste kutusu
kullanılmaktadır. Bunlardan ilki normal liste kutusu, diğeri ise açılan liste
kutusudur. Açılan liste kutularına ComboBox adı verilmektedir.
Eğer liste kutusundaki seçeneklerin hepsi aynı anda liste kutusunun içine
sığmayacak kadar çok sayıda olsaydı, liste kutusunun sağ kenarına düşey
kaydırma çubuğu eklenirdi. Örneğin aşağıda verilen liste kutusundaki bütün
seçenekleri aynı anda liste kutusu içinde görebilme imkanı olmadığı için liste
kutusunun sağ kenarına düşey kaydırma çubuğu eklenmiş durumdadır.
Şekil 8.f-66
Kaydırma çubuğundan başka liste kutusu içinde hareket etmek için ok tuşlarından
yararlanabilirsiniz. Diğer nesnelerde olduğu gibi formun liste kutusu eklemek istenen yerine istenen
boyutlarda fare ile liste kutusu dahil edilir. Aktif forma dahil edilen ilk liste kutusuna List1 adı
verilmektedir. Tasarım anında liste kutusunun içi boş olduğundan liste kutusunun adı aynı zamanda
kutunun içine yazılır.
Şekil 8.f-67
Çalışma anında Liste kutusunun adı kutunun içinden silinir. Liste kutusunda listelenecek seçenekler
çalışma veya tasarım anında belirlenebilir. Liste kutusunda yer alacak seçenekleri tasarım anında
267
belirlemek istiyorsanız ListBox nesnesinin List özelliğinden yararlanmanız gerekir (Şekil 8.f-68).
Propreties penceresinde ışıklı bantı List özelliğinin üzerine götürdüğünüz zaman List özelliğinin
sonuna bir liste kutusu eklenir. Bu liste kutusundan yararlanarak Liste kutusu nesnesinin seçeneklerini
belirleyebilirsiniz.
Şekil 8.f-68
Bu liste kutusunu açtığınızda ekleme noktası seçenekleri girebilmeniz için hazır olarak bekler.
Ancak liste kutusunda yer alacak seçeneklerden birini yazdıktan sonra bir sonraki satıra geçmek için
enter tuşuna basmak gerekir. Enter tuşu ile bir sonraki satıra geçilmek istendiğinde ise liste kutusu
kapanmaktadır. Bu durumda her seferde ancak bir seçeneğin girişini yapabilirsiniz.
Çalışma anında liste kutusuna eleman veya seçenek eklemek için AddItem methodundan
yararlanılır. Aşağıda verilen program kodu ile üzerinde çalışılan proje çalıştırılırsa, projenin formuna
daha önce dahil edilmiş olan List1 adlı liste kutusunda 4 seçenek dahil edilir (Şekil 8.f-69).
Private Sub Form_Load()
List1.AddItem “Adana”
List1.AddItem “Ankara”
List1.AddItem “Antalya”
List1.AddItem “Aydın”
End Sub
Şekil 8.f-69
Bu değişiklikten sonra liste kutusunun dahil olduğu proje çalıştırılırsa aşağıda verilen ekran
görüntüsü elde edilir.
Şekil 8.f-70
268
Bu liste kutusuna AddItem ile birkaç seçenek daha dahil edilecek olursa, bütün seçenekler liste
kutusunda aynı anda görüntülenemeyeceği için liste kutusunun sağ kenarına otomatik olarak düşey
kaydırma çubuğu eklenir (Şekil 8.f-71).
Şekil 8.f-71
Visual Basic projesi dahilinde hazırlanan liste kutusunda seçim yapmak için diğer Windows
uyumlu programlarda olduğu gibi fareden faydalanılabilir. Seçili durumda olan seçeneğin metni liste
kutusuna ait Text adlı değişkende saklanır (Şekil 8.f-72). Liste kutularına ait Text değişkeni ancak
çalışma anında tanımlı olduğu için Properties penceresinde bulunmaz. Form üzerinde tıklama
yapıldığında ekrana diyalog kutusu içinde liste kutusunun seçili durumda olan seçeneği ekrana gelir.
Liste kutusu hareket ettikçe Liste kutusuna ait Text değişkeninin içeriği otomatik olarak değişir.
Private Sub Form_Click()
MsgBox (List1.Text)
End Sub
Şekil 8.f-72
Liste kutusunda seçilen veya üzerinde bulunulan elemanın sıra numarasını öğrenmek için liste
kutusu nesnesine ait ListIndex değişkeninden yararlanılır. Liste kutusunun üzerinde dolaştıkça
ListIndex değişkenin içeriği otomatik olarak değişir. Seçili durumda olan liste kutusu elemanının sıra
numarasını öğrenmek üzere Form_Click yordamına tek satırlık program kodu ekledim.
Private Sub Form_Load()
MsgBox (List1.Text)
MsgBox
(“Seçilen
elemanın
(List1.ListIndex))
sıra
numarası
:”
&
Val
End Sub
Visual Basic’te dizi değişkenlerinin ilk elemanlarının sıra numarası varsayım olarak 0 ‘dan
başlamaktadır. Bu nedenle aşağıda verilen ekran görüntüsü sizi yanıltmasın.
269
Private Sub Form_Click()
MsgBox("Sırano:"&Val(List1.ListI
ndex))
End Sub
Şekil 8.f-73
Liste kutusunda aynı anda birden fazla seçeneğin seçilip seçilemiyeceği liste kutusuna ait
MultiSelect değişkenin içeriğine bağlıdır (Şekil 8.f-74). MultiSelect değişkeninin içeriği “0-None”
ise liste kutusunda aynı anda ancak bir seçenek seçilebilir. MultiSelect değişkeni “1-Simple” değerine
sahipken ok tuşları ile kutu içinde hareket etmenin bir etkisi olmaz. MultiSelect değişkenin içeriği “2Extend” iken liste kutusunda seçme işlemi Word, Excel ve diğer Windows uyumlu programlarda
olduğu gibi Shift tuşu basılı tutulup seçenekler arasında hareket edilerek yapılır.
Şekil 8.f-74
Normal şartlarda liste kutusuna AddItem methodu ile dahil edilen seçenekler liste kutusuna dahil
edildikleri sırada gelirler. Eğer seçeneklerin liste kutusunda alfabetik sırada yer almaları isteniyorsa
liste kutusuna ait Sorted değişkeninden yararlanılmalıdır (Şekil 8.f-75).
Şekil 8.f-75
270
Sorted değişkeni başlangıçta False değerine sahiptir. Sorted değişkenin içeriği tasarım anında True
olarak değiştirilirse seçenekler liste kutusu içinde sıralı bir şekilde dururlar. Sorted değişkenin içeriği
çalışma anında değiştirilemez.
Windows uyumlu diğer programlarda olduğu gibi bazen seçeneklerin iki veya daha fazla sütun
halinde listelenmesi istenebilir. Bu durumda söz konusu liste kutusuna ait Columns değişkeninden
yararlanılır
(Şekil 8.f-76). Bu değişkenin içeriği varsayım olarak 0’ dır. Columns değişkeninin
içeriği 2 olarak değiştirilirse liste kutusundaki seçenekler 2 sütun halinde görüntülenir. Ancak bu
durumda liste kutusunun genişliği iki sütunun sığabileceği kadar olmalıdır.
Şekil 8.f-76
Tek sütun olarak düzenlenen başka bir deyişle Columns değişkenin içeriği 0 olan liste kutularında
sola ok tuşuna basıldığı zaman bir önceki, sağa ok tuşuna basıldığında ise bir sonraki seçeneğin
üzerinde gidilmektedir. Columns değişkeninin içeriği 1 olarak değiştirilse bile liste kutusunda
seçenekler yine yalnızca bir sütun olarak ekrana gelirler. Ancak bu durumda kullanıcı sağa ok tuşuna
bastığında liste yukarı değil sol tarafa doğru kayar. Ayrıca Columns değişkeni 1 değerine sahipken
liste kutusunun alt kenarına otomatik olarak yatay kaydırma çubuğu eklenir.
Şekil 8.f-77
Liste kutusuna ait Text değişkeninin içeriği liste kutusunda seçim yapıldıkça veya liste kutusu
içinde hareket edildikçe TextBox’a ait Text değişkenine aktarılır.
Private Sub List1_Click()
Text1.Text = List1.Text
End Sub
Liste kutusu üzerinde hareket edildikçe liste kutusuna ait Text değişkenin içeriği otomatik olarak
değişmektedir. Bu özelliğinden yararlanan List1_Click yordamı sayesinde Liste kutusunda üzerinde
bulunan seçenek TextBox nesnesine yazılır.
271
Private Sub List1_Click()
Text1.Text
List1.Text
=
End Sub
Şekil 8.f-78
Bir liste kutusunda bulunan seçeneklerin veya elemanların sayısını öğrenmek için Liste kutusu
nesnesine ait ListCount değişkeninden yararlanılır. ListCount değişkeni yalnızca çalışma anında
tanımlı olabilmektedir. Liste kutusunda bulunan elemanlardan herhangi birinin seçili olup olmadığını
öğrenmek için Selected değişkeninden yararlanılır. Sıra numarası Selected değişkenine parametre
olarak verilen liste kutusu elemanı seçili durumda ise Selected değişkeninin içeriği True, değilse False
olur.
Private Sub Form_Click()
MsgBox (List1.Selected (1))
End Sub
Şekil 8.f-79
Bu sırada Visual Basic’te liste kutusu ve dizi de ğişkenlerde ilk elemanın sıra numarasının “0” olduğunu hatırlatmak gerekir. Selected
değişkeni ile liste kutusunda herhangi bir eleman ın seçili olup olmadığını öğrenmenin yanında listelenen eleman seçili duruma getirilebilir
veya seçili durumda olan bir elemanın seçili olma özelli ği kaldırılabilir. Aşağıda verilen program kodu ile liste kutusuna dahil edilen form
yüklenir yüklenilmez liste kutusunun 3. eleman ı Selected değişkeni aracılığı ile seçili duruma getirilir.
Private Sub Form_Click()
List1.AddItem “Adana”
List1.AddItem “Adana”
List1.AddItem “Adana”
List1.AddItem “Adana”
List1.AddItem “Adana”
List1.Selected(2) = True
272
End Sub
Seçili duruma getirilmek istenen liste kutusu eleman ın sıra numarasını parametre olarak alan Selected dizi değişkenine True veya False
mantıksal değerleri aktarır.
Çalışma anında liste kutusuna eleman ekleme yanı sıra eleman silme gereği duyulabilir. Liste
kutusunun herhangi bir elemanını çıkarmak için Removeltem metdodu kullanılır. RemovelItem
metoduna liste kutusundan silinmek istenen elemanın sıra nosu parametre olarak verilir.
Private Sub Çıkar_Click()
List1.RemoveItem List1.ListIndex
End Sub
Liste kutusunda bulunan elemanları RemoveItem ile tek tek silmek yerine bütün elemanları bir
seferde liste kutusundan silmek istiyorsanız Clear methodundan yararlanabilirsiniz. Clear
methodundan önce elemanları silinmek istenen liste kutusunun adı yazılır.
Private Sub Çıkar_Click()
List1.Clear
End Sub
Eğer liste kutusu nesnesi içinde listelenen her seçeneğin bir onay kutusu ile temsil edilmesini
istiyorsanız liste kutusunun nesnesinin Style özelliğinden yararlanmanız gerekir. Style özelliğine 1Checkbox değerini aktarırsanız liste kutusundaki her seçeneğin önüne küçük bir kare şekli eklenir.
Şekil 8.f-80
a. Örnek / Liste kutusuna yatay hareket çubuğu eklemek
Module
Declare Function SendMessage Lib "user32" Alias "SendMessageA"
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long,
lParam As Long) As Long
Const WM_USER = &H400
273
Const LB_SETHORIZONTALEXTENT = WM_USER + 21
Sub CheckListBox()
Dim i%, res&
Dim Scrollwidth&
For i% = 0 To Form1.List1.ListCount
If Form1.TextWidth(Form1.List1.List(i%)) > Scrollwidth&
Then _
Scrollwidth& = Form1.TextWidth(Form1.List1.List(i%))
Next i%
res& = SendMessage(Form1.List1.hWnd,
LB_SETHORIZONTALEXTENT, Scrollwidth&, 0&)
End Sub
Form
Private Sub Form_Load()
CheckListBox
End Sub
b. Örnek / List kutusundan kayıt seçme
274
Private Declare Function SendMessage Lib "user32" Alias _
"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As
Long, _
ByVal wParam As Long,lParam As Any) As Long
Private Const LB_FINDSTRING = &H18F
Private Sub Text1_Change()
List1.ListIndex=SendMessage(List1.hwnd,LB_FINDSTRING,-1,_
ByVal CStr(Text1.Text))
End Sub
c. Örnek / ListBox’ta parça seçme
Private Sub Command1_Click()
Dim i As Integer
For i = 0 To List1.ListCount - 1
If List1.Selected(i) Then
MsgBox List1.List(i) & " seçildi"
End If
Next i
End Sub
275
11. ComboBox (Açılan Liste Kutuları)
Açılan liste kutuları normalde tek satır halinde gelirler. Forma eklenen ilk
açılan liste kutusuna Combo1 adı verilir (Şekil 8.f-81). Açılan liste kutusu
başlangıçta eleman içermediği için ayrıca varsayım olarak Combo1 adında bir
eleman otomatik olarak kutuya eklenir. Seçili durumda olan elemanın içeriği
Text adlı değişkende tutulur. Forma eklenen liste kutusunda herhangi bir
değişiklik yapmadan bu şartlarda proje çalıştırılırsa, liste kutusunun henüz
herhangi bir elemanı olmadığı için ekleme noktası liste kutusuna ait metin
kutusunun içinde bilgi girişi için hazır olarak bekler.
Şekil 8.f-81
Normal liste kutusunda olduğu gibi liste kutusuna seçenek dahil etmek için AddItem methodundan
yararlanılır. Liste kutularında olduğu gibi ComboBox’ta seçili durumda olan eleman sürekli olarak
ComboBox’a ait Text değişkeninde tutulur. Forma ComboBox nesnesi eklendiğinde başlangıçta Name
değişkeni ile Text değişkenin içeriği aynıdır. Ancak tasarım veya çalışama anında Text değişkenin
içeriği istenildiği gibi değiştirlebilir. Örnek olması için şehir adlarını içeren liste kutusunun Text
değişkenine tasarım anında “Adana” bilgisini aktaralım.
Şekil 8.f-82
Söz konusu açılan liste kutusunun dahil olduğu proje çalıştırıldığında liste kutusunda seçilen veya
girişi yapılan elemanın yazıldığı yere otomatik olarak Text değişkenine tasarım anında aktarılan bilgi
yazılır.
276
Şekil 8.f-83
Normal liste kutusunda olduğu gibi açılan liste kutusuna seçenek dahil etmek için AddItem
methodundan yararlanılır. Çalışma anında forma eklediğimiz açılan liste kutusuna eleman aktarmak
için aşağıda verilen program satırlarını hazırlayalım.
Private Sub Form_Load()
Combo1.AddItem "Adana"
Combo1.AddItem "Ankara"
Combo1.AddItem "Antalya"
Combo1.AddItem "Aydın"
End Sub
.
Şekil 8.f-84
Eğer kullanıcının çalışma anında liste kutusuna dışarıdan bilgi girmesini engellemek istiyorsanız,
açılan liste kutusu nesnesine Style özelliğinden yararlanmanız gerekir
Şekil 8.f-85
277
Forma yeni eklenen açılan liste kutusunun Style değişkeni “0-Dropdown Combo” sabit değerini
içermektedir. ComboBox Style olarak 2-DropDown List seçilirse kullanıcı dışarıdan bilgi girişi
yapamaz. Kullanıcı ancak ok tuşlarından yararlanarak liste kutusunun seçeneklerinden seçim yapabilir.
Eğer Style değişkenine 1-Simple Combo değeri aktarılırsa liste kutusunu açan düğme iptal edilir. Bu
durumda liste kutusunun elemanlarını açıp listelemek imkanı ortadan kalkar.
Şekil 8.f-86
Kullanıcı bu açılma özelliği olmayan liste kutusunun diğer elemanlarını görmek istiyorsa, aşağı ve
yukarı ok tuşlarını kullanmalıdır. İlk seçeneğin üzerinde iken yukarı oku işlevsizdir.
12. FileListBox (Dosya Listesi Nesnesi)
Üzerinde çalışılan projenin aktif formuna Dosya listesi nesnesi eklemek için
ToolBox penceresinden önce ilgili düğme seçili duruma getirilir. Forma eklenen
Dosya listesi kutusu nesnesine tasarım anında bile aktif sürücünün aktif dizininde
bulunan bütün dosyalar otomatik olarak yazılır (Şekil 8.f-87)
Şekil 8.f-87
278
Forma eklenen ilk dosya listesine Visual Basic tarafından File1 adı verilir. Diğer nesnelerde olduğu
gibi dosya listesi nesnesinin adı Name değişkeninde saklanılır(Şekil 8.f-88). Dosya Listesi nesnesinin
dahil olduğu form çalışma anında aktive olduğunda dosya listesindeki ilk dosyanın etrafı küçük
noktalarla çevrili durumda olur. Yani varsayım olarak başlangıçta hiçbir dosya seçili durumda
değildir. Bu sırada kullanıcı ok tuşları ile veya fare ile kaydırma çubuğundan yararlanarak dosya
listesi üzerinde dolaşabilir.
Şekil 8.f-88
Dosya listesi kutusunda başlangıçta aynı anda yalnızca bir dosya seçili duruma getirilebilir. Seçili
durumda olan dosyanın adı FileName adlı Dosya listesi nesnesine ait değişkende saklanır. Dosya
Listesi üzerinde dolaştıkça FileName değişkenin içeriği otomatik olarak güncelleşir. FormName
değişkenin işlevini göstermek için dosya listesi eklenen formun Form_Click yordamına aşağıda
verilen program satırını ekleyelim.
Private Sub Form_Click()
MsgBox (“Seçili Durumdaki dosya :” & File1.filename)
End Sub
279
Bu program satırı sayesinde çalışma anında formun üzerinde tıklama yapılınca MsgBox()
fonksiyonu ile o sırada seçil durumda olan dosyanın adı ekrana yazılır.
Şekil 8.f-89
FileName değişkeni ancak çalışma anında tanımlı olabilmektedir. Bu nedenle FileName değişkeni
Properties penceresinde bulunmaz. Bildiğiniz gibi Properties penceresinde seçili durumda olan
nesnenin içeriği tasarım anında değişebilen değişkenler bulunmaktadır.
Dosya listesi kutusunda o anda geçerli olan sürücünün geçerli olan dizininde bulunan bütün dosyalar listelenmektedir. Yani ba şlangıçta
listelenecek dosyalar konusunda bir ayrım veya seçim yapılamayacağı varsayılır. Listelenecek dosyaların seçimi işlemi için Liste kutusu
nesnesine ait Pattern değişkeninden yararlanılır (Şekil 8.f-90)
Şekil 8.f-90
Pattern değişkeninin başlangıçtaki içeriği bütün dosyalar anlamında “*.*” şeklindedir. Listelenecek dosyalar seçilirken joker
karakterinden (* ve ?) yararlanılabilir. Properties penceresinde içeri ğini “*.jpg” olarak değiştirip projeyi çalıştırırsak Şekil 8.f-91’deki
görüntüyü elde ederiz.
280
Şekil 8.f-91
Pattern değişkenin içeriğinde Properties penceresinde yapılan değişikliğin etkisi anında Forma eklenmiş dosya nesnesine yansır. Bunun
dışında çalışma anında Pattern değişkenin içeriğini istediğiniz gibi değiştirebilirsiniz.
Private Sub Form_Click()
File1.Pattern = “*.*”
End Sub
Yukarıdaki sayfada Dosya Listesi nesnesinden seçilen dosyanın adının FileName değişkeninde tutulduğu belirtilmişti. Dosya seçimi
kullanıcı tarafından anında yapılabildiği gibi program kodu ile yapılabilir.
Private Sub Form_Click()
File1.Pattern = “*.DLL”
End Sub
Dosya liste kutusunun hemen üstüne bir TextBox nesnesi konulur. Bu Textbox’a girilen bilgi FileName de ğişkenine aktarılır. TextBox’a
girişi yapılan dosya adı ve uzantısının FileName değişkenine aktarılması halinde Dosya Listesi kutusunda listelenen dosyalar FileName
değişkeninin yeni içeri ğine göre seçilir. TextBox’a girilen dosya ad ı uzantısını FileName değişkenine aktarmak için KeyPress olayından
yararlanılır.
Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
File1.filename = Text1.Text
End If
End Sub
Listelenecek dosyaların adı ve uzantısı TextBox’ a girilip enter tuşuna basılana kadar FileName değişkenine aktarılmaz. KeyPress olayı
yerine LostFocus olayından da yararlanabilir. Text1 adlı TextBox’ın içeriği File Name değişkenine aktarılabilir. Text1 adlı TextBox’tan tab
tuşu ile ayrılınca LostFocus olayı meydana gelir. Bu sırada TextBox’ın içeriği FileName değişkenine aktarılır.
Private Sub Text1_LostFocus()
File1.filename = Text1.Text
End Sub
281
Şekil 8.f-92
Hazırlanan dosya listesi nesnesine hangi özelliğe sahip dosyaların dahil edileceği Normal,
Archive, System, ReadOnly ve Hidden değişkenlerinin içeriğine bağlıdır. Başlangıçta Normal ve
Archive değişkenleri True, diğerleri False değerini içerir. Gizli dosyaların da listelenmesini
istiyorsanız Hidden değişkenine True değerini aktarmalısınız (Şekil 8.f-93).
Şekil 8.f-93
Hangi dizinin aktif dizin olduğu konusunda bilgi Dosya Listesi nesnesine ait Path değişkeninden
sağlanır. Path değişkeni ancak çalışma anında tanımlı olabilir.
Private Sub Form_Click()
MsgBox (“Geçerli sürücü ve dizin :” & File1.Path)
End Sub
Liste kutularında olduğu gibi Dosya Listesi kutularında bulunan dosyalardan varsayım olarak
yalnızca biri seçili duruma getirilebilir. Eğer aynı anda birden fazla dosyanın seçilebilmesi isteniyorsa
dosya listesi nesnesine ait MultiSelect değişkeninden yararlanılmalıdır (Şekil 8.f-94). Dosya listesi
kutusunda listelenen dosyaların sayısı ListCount değişkeninde saklanır. Bu değişkenin içeriği dosya
listeleme kriterleri değiştikçe otomatik olarak güncelleşir.
282
Şekil 8.f-94
a. Örnek / Dosya Silme
Private Sub DeleteFilesinDirectory()
Dim t%
If File1.ListCount - 1 = 0 Then
List1.Clear
For t% = 0 To File1.ListCount File1.ListIndex = t%
File1.Selected(t%) = True
List1.AddItem File1
Next t%
Dim antwoord
antwoord = MsgBox("Are you sure
If antwoord <> 6 Then Exit Sub
For t% = List1.ListCount - 1 To
List1.ListIndex = t%
List1.Selected(t%) = True
Kill Dir1 & "\" & List1
283
Exit Sub
1
about this?", 36)
0 Step -1
Next t%
End Sub
Private Sub Dir1_Change()
File1 = Dir1.Path
Call DeleteFilesinDirectory
End Sub
Private Sub Drive1_Change()
Dir1 = Drive1
End Sub
13. DirListBox (Dizin Listesi Kutusu)
Dosya listesinden başka bir de dizin kutusu vardır. Visaul Basic uygulamaları
dahilinde formlara dizin listesi dahil edilebilir. Bu amaçla ToolBox’tan ilgili düğme
seçilir. Tasarım anında forma eklenen Dizin Listesi kutusuna otomatik olarak
geçerli dizinin adı, alt dizinleri ile birlikte ekrana getirilir. Forma eklenen ilk dizin
nesnesine Dir1 adı verilir.
Eğer dizinde çok sayıda alt dizin varsa ve bu dizinlerin hepsi bir seferde dizin kutusuna sığmıyorsa,
dizin listesi kutusunun sağ kenarına otomatik olarak bir düşey kaydırma çubuğu eklenir.
Şekil 8.f-95
Seçili durumda olan dizinin adı dizin listesine ait Path değişkeninde saklanır. Ancak programın
çalışması sırasında tanımlı olabilen Path değişkenin içeriğinin program kodu yazılarak değiştirilmesi
halinde dizin listesi kutusunun içeriği kendiliğinden güncelleşir.
Dizin listesi nesnesinin üzerinde çift tıklama yapılarak Dizin Listesi nesnesine ait Path
değişkeninde değişiklik yapma işlemi sırasında Change olayı meydana gelir. Dizin listesi nesnesine
ait Path değişkeninin içeriği Change olayı meydana geldiğinde söz konusu TextBox’a aktarılır.
284
Private Sub Dir1_Change()
Text1.text = Dir1.Path
End Sub
Change olayı meydana geldikçe Path özelliğinin içeriği otomatik olarak değişmektedir. Bu sırada
dizin listesi nesnesine ait Path özelliğinin içeriği geçerli dizini göstermek için formdaki TextBox’a
aktarılır.
Şekil 8.f-96
Bunun için yine Dizin listesine ait Change olayından yararlanılır.
Private Sub Dir1_Change()
File1.Path = Dir1.Path
Text1.text = Dir1.Path
End Sub
a. Örnek / Dosya sayma
285
Private Sub Command1_Click()
stijd = Time
List1.Clear
List2.Clear
Dir1.Path = Left$(Drive1.Drive, 2) + "\"
File1.Path = Dir1.Path
' "C:\"
For t& = 0 To File1.ListCount - 1
If Right$(Dir1.Path, 1) <> "\" Then
List2.AddItem Dir1.Path + "\" + File1.List(t&)
Else
List2.AddItem Dir1.Path + File1.List(t&)
End If
Next
For t& = 0 To Dir1.ListCount - 1
List1.AddItem Dir1.List(t&)
Next
If t& = 0 Then GoTo finishedpoint
cnt& = 0
startpoint:
Dir1.Path = List1.List(cnt&)
File1.Path = Dir1.Path
For t& = 0 To Dir1.ListCount - 1
List1.AddItem Dir1.List(t&)
Next
For t& = 0 To File1.ListCount - 1
List2.AddItem Dir1.Path + "\" + File1.List(t&)
Next
cnt& = cnt& + 1
If cnt& < List1.ListCount Then GoTo startpoint
finishedpoint:
Label1.Caption = "Total:" + Str$(List2.ListCount)
etijd = Time
Label2.Caption = "Time slipped away... Started at " &
286
Format(stijd, "hh:mm:ss") & ". Ended after " & Format(stijd etijd, "hh:mm:ss")
End Sub
14. DriveListBox (Sürücü Listesi Nesnesi)
Sürücü listesi nesnesinden yararlanarak Dizin ve Dosya Listesi nesneleri için
geçerli olmak üzere sürücü seçimi yapılabilir. Üzerinde çalışılan aktif formuna
sürücü listesi eklemek için geçerli olmak üzere sürücü seçimi yapılabilir. Forma
eklenen ilk Sürücü Listesi nesnesine Drive1 adı verilir.
Sürücü listesi nesnesi aç ılan liste kutusu görünümündedir. O anda geçerli olan sürücünün ad ı tasarım anında bile sürücü listesi kutusuna
otomatik olarak yazılır.
Şekil 8.f-97
Seçili durumda olan sürücünün adı Sürücü listesi nesnesine ait Drive değişkeninde saklanır. Sürücü
nesnesinde değişiklik yapıldığında yani Change olayı meydana geldiğinde nesneye ait Drive
değişkeninin içeriği Dizin Listesi nesnesinin Path değişkenine aktarılır. Sürücü listesi nesnesinin Dizin
Listesi nesnesi ile birlikte çalışması sağlanır.
Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub
Örnek
287
Option Explicit
Private Sub File1_Click()
Dim Dosya_Adı As String
On Error GoTo Hata
Dosya_Adı = File1.Path + "\" + File1.filename
Caption = "İzleme [" & Dosya_Adı & "]"
MousePointer = vbHourglass
DoEvents
Image1.Picture = LoadPicture(Dosya_Adı)
MousePointer = vbDefault
Exit Sub
Hata:
Beep
MousePointer = vbDefault
Caption = "İzleme [Geçersiz resim]"
Exit Sub
End Sub
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub
Private Sub Drive1_Change()
'On Error GoTo DriveError
Dir1.Path = Drive1.Drive
Exit Sub
DriveError:
Drive1.Drive = Dir1.Path
Exit Sub
End Sub
Private Sub Form_Load()
Combo1.AddItem "Bitmaps (*.bmp)"
288
Combo1.AddItem "GIF (*.gif)"
Combo1.AddItem "JPEG (*.jpg)"
Combo1.AddItem "Icons (*.ico)"
Combo1.AddItem "Matafiles (*.wmf)"
Combo1.AddItem "DIBs (*.dib)"
Combo1.AddItem "Graphic
(*.gif;*.jpg;*.ico;*.bmp;*.wmf;*.dib)"
Combo1.AddItem "All Files (*.*)"
Combo1.ListIndex = 0
End Sub
Private Sub Form_Resize()
Const GAP = 60
Dim wid As Integer
Dim hgt As Integer
If WindowState = vbMinimized Then Exit Sub
wid = Drive1.Width
Drive1.Move GAP, GAP, wid
Combo1.Move GAP, ScaleHeight - Combo1.Height, wid
hgt = (Combo1.Top - Drive1.Top - Drive1.Height - 3 * GAP) /
2
If hgt < 100 Then hgt = 100
Dir1.Move GAP, Drive1.Top + Drive1.Height + GAP, wid, hgt
File1.Move GAP, Dir1.Top + Dir1.Height + GAP, wid, hgt
End Sub
Private Sub combo1_Click()
Dim pat As String
Dim p1 As Integer
Dim p2 As Integer
pat = Combo1.List(Combo1.ListIndex)
p1 = InStr(pat, "(")
p2 = InStr(pat, ")")
File1.Pattern = Mid$(pat, p1 + 1, p2 - p1 - 1)
End Sub
Örnek / Dosya seçme
289
Declare Function YolAd Lib "kernel32" Alias
"GetShortPathNameA" (ByVal lpszLongPath As String, ByVal
lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Sub Dir1_Change()
File1 = Dir1.Path
End Sub
Private Sub Drive1_Change()
Dir1 = Drive1
End Sub
Private Sub File1_Click()
Label1.Caption = DosyaAd(Dir1 & "\" & File1)
End Sub
290
Public Function DosyaAd(ByVal FileName As String) As String
Dim rc As Long
Dim ShortPath As String
Const PATH_LEN& = 164
ShortPath = String$(PATH_LEN + 1, 0)
rc = YolAd(FileName, ShortPath, PATH_LEN)
DosyaAd = Left$(ShortPath, rc)
End Function
15. Picture Box Kontrolü
Nasıl ki Formlara eklenen TextBox nesnesine tasarım veya çalışma anında metin
veya text girişi yapılıyorsa, Picture Box’lara ise önceden hazırlanıp hard diske
kaydedilmiş olan resimlerin aktarılması işlemi yapılır. Visual Basic uygulamaları
dahilinde Formlara eklenen resim kutularına BMP, WMF, ICO ve DIB uzantılı
resim dosyaları dahil edilmektedir. Ayrıca resim kutusu içinde Line ve Shape
kontrollerine yer verilebilir.
Bir forma eklenen ilk resim kutusuna Picture1 adı verilir. Diğer nesnelerde olduğu gibi Picture
Box’ın adı Picture Box’a ait Name değişkeninde saklanır (Şekil 8.f-98).
Şekil 8.f-98
Resim kutusunun Form üzerindeki konumu ve boyutları tasarım anında fare ile belirlenebilir. Ancak
diğer nesnelerde olduğu gibi Properties penceresinden yararlanarak resim kutularının boyutlarını
değiştirebilirsiniz. Resim kutusunun genişliği Width, yüksekliği Height, Formun üst kenarına uzaklığı
Top ve sol kenarına uzaklığı ise Left değişkeni ile belirlenir. Resim kutusuna ait Align değişkeninden
istifade ile resim kutusunun yerini belirleyebilirsiniz (Şekil 8.f-99).
291
Şekil 8.f-99
Üzerinde çalışılan projenin aktif formuna bir resim kutusu nesnesi eklendiği zaman resim kutusuna
ait Align değişkenine varsayım olarak 0-None değeri aktarılır. Yani başlangıçta resim kutusu formun
herhangi bir tarafına hizalanmaz. Resim kutusu nesnesine ait Align değişkenine 1-Align Top değeri
aktarılacak olunursa resim kutusu formun hem üst kenarına yanaştırılır hem de resim kutusunun
genişliği ile Formun genişliği birbirine eşitlenir. Align değişkenine 2-Alig Bottom değeri aktarılırsa
resim kutusu formun alt kısmına alınır.
Tasarım anında formdaki resim kutusu nesnelerine hard diskten resim dosyası eklemek için
Properties penceresinde Picture değişkeninden yararlanılır. Başlangıçta bu değişkenin içeriği boştur
ve resim kutusu nesnesi resim dosyası içermez (Şekil 8.f-100).
Şekil 8.f-100
Properties penceresinde ışıklı bant Picture özelliğinin üzerinde iken üç nokta (...) bulunan düğmede
tıklama yapılınca resim kutusu nesnesine eklenebilecek resim dosyalarının seçildiği Load Picture
diyalog kutusu ekrana gelir. Bu diyalog kutusunda bulunan bilgisayarda bulunan WMH, BMP ve ICO
uzantılı resim dosyalarından istenen seçilebilir.
Resim kutularına tasarım anında Properties penceresinde resim dosyası dahil edildiği gibi, çalışma
anında program kodu yazılarak istenen resim dosyasının içeriği Resim kutusu nesnesinin Picture
değişkenine aktarılır. Bunun için LoadPicture deyiminden yararlanılır. LoadPicture deyimi ile hard
diskten resim kutusuna aktarılmak istenen resim dosyası okunup resim kutusu nesnesine ait Picture
değişkenine aktarılır.
Private Sub Form_Click()
Picture1.Picture =LoadPicture (“C:\VB5\Graphics\Icons\Elements\Sun.Ico
292
End Sub
Şekil 8.f-101
Eğer resim kutusunun boyutlarının, kutuya dahil edilen resim dosyasının büyüklüğüne
bağlı olarak otomatik belirlemesini istiyorsanız resim kutusuna ait AutoSize değişkeninin
içeriğini True yapmalısınız (Şekil 8.f-101).
Üzerinde çalışılan forma eklenen resim kutularının çevresi varsayım olarak tek çizgi ile
çevrilir. Eğer resim kutusunun çevresine çizgi çizmek istemiyorsanız resim kutusu nesnesine
ait BorderStyle değişkenine 0-None değerini aktarmalısınız (Şekil 8.f-102).
Şekil 8.f-102
Kullanıcı çalışma anında dosya listesinde içeriğini görmek istediği dosyayı seçince söz konusu
resim dosyasının içeriği resim kutusunda görüntülenecek. Sürücü, Diziz ve Dosya listesi nesneleri
arasında nasıl bağlantı kurulduğunu daha önceden biliyorsunuz. Burada yeni şey Dosya listesinden
seçilen resim dosyasının LoadPicture fonksiyonu ile diskten okunup resim kutusuna ait Picture
değişkenine aktarmaktır. Dosya listesinde, resim kutusu içinde görüntülenemeyecek resim
dosyalarının listelenmesini önlemek için projenin Formu yüklenir yüklenilmez dosya listesi nesnesine
ait Pattern değişkenin içeriği aşağıda şekilde değiştirilir.
293
Private Sub Form_Load()
File1.Pattern = “*.BMP; *.ICO; *.WMF”
End Sub
Dosya listesinde listelenen herhangi bir dosyanın seçilmesi veya üzerinde tıklama yapılması
halinde söz konusu dosyanın diskten okunup resim kutusu nesnesine ait Picture değişkenine
aktarılmasını sağlamak için File1_Click yordamı aşağıdaki şekilde düzenlenir.
Private Sub File1_Click()
Picture1.Picture = LoadPicture ( File1.Path + “\” + File1.filename)
End Sub
Bu değişiklikten sonra proje çalıştırılıp dosya listesindeki dosyalar üzerinde dolaştıkça ilgili resim
dosyanın içeriği resim kutusu nesnesi içinde görüntülenir.
Şekil 8.f-103
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub
Private Sub Form_Load()
File1.Pattern = "*.*"
End Sub
Resim kutularına Print methodu ile yazı yazılabilir, Line, Pset, Cls ve Circle gibi formlara
uygulanabilen methodlarla çizgi veya daire çizilebilir, kutunun içeriği silinebilir.
Private Sub Form_Click()
Picture1. DrawWidth =2
Picture1.Line – (3000,2000)
End Sub
294
Yukarıda verilen program kodu ile çalışma anında Picture1 adlı resim kutusunun üzerinde tıklama
yapılması halinde resim kutusunun bir köşesinden diğer köşesine doğru çizgi çizilir.
Line veya Circle metotları ile resim kutusuna çizilen çizgi veya daireler Cls metodu ile silinebilir.
Cls metodu resim kutusuna dahil edilmiş olan ikon veya meta file dosyaları üzerinde etkili olmaz.
Resim kutusuna dahil edilmiş olan resim veya resim kutusuna ait Picture değişkenin içeriğini silmek
için yine LoadPicture fonksiyonundan yararlanılabilir.
Private Sub Form_Click()
Picture1. Picture = LoadPicture(“”)
End Sub
Forma yerleştirmiş olduğunuz resim kutusu nesnesine Panonun içeriğini aktarmak istiyorsanız
GetData methodundan yararlanabilirsiniz.
16. Image Kontrolü
Resim kutusuna dahil edilen resim dosyasının orijinal boyutları resim kutusundan küçük olduğu zaman resim
kutusunun üzerinde boşluklar meydana gelir. Image kontrolü ile programc ıya resim dosyalarını kullanmada daha
fazla esneklik sunulmaktadır.
Diğer kontrollerde olduğu gibi üzerinde çalışılan forma bir image nesnesi eklemek için ToolBox penceresinde bu nesneyi temsil eden dü ğme
seçili duruma getirilir.
Şekil 8.f-104
295
Bir forma eklenen ilk image nesnesine varsay ım olarak “Image1”” adı verilir (Şekil 8.f-104). Programcı tasarım anında bu adı istediği gibi
değiştirebilir. Formun Image nesnesi ile sınırlanan kısmında görüntülenecek dosyanın içeriği nesneye ait Picture de ğişkeninde saklıdır.
Programcı resim kutusu nesnesinin tersine, Image nesnesinin boyutlar ını kendisine eklenen resim dosyası ile birlikte değiştirebilir. Bunun
için önce image nesnesine ait Stretch değişkenine True değerinin aktarılması gerekir (Şekil 8.f-105).
Şekil 8.f-105
Image nesnesine ait Stretch değişkeninin içeriği True iken çalışma anında program kodu yazılarak nesnenin boyutlarında yapılan
değişikliklerden, nesneye dahil olan image veya resim dosyas ı da etkilenir (Şekil 8.f-106).
Şekil 8.f-106
Private Sub Form_Click()
Image1.Width = Image1.Width + 100
Image1.Height = Image1.Height + 100
End Sub
Bir forma aynı anda birden fazla Image nesnesi eklenebildiği gibi bu nesnelerin üst üste gelmeleri
sağlanabilir (Şekil 8.f-107).
Private Sub Form_Click()
Image2.Left = Image2.Left -150
Image2.Top = Image2.Top - 100
296
End Sub
Şekil 8.f-107
17. Line Kontrolü
Line nesnesi ile formlara daha önceden eklenmiş olan resim kutusu,
Image gibi nesnelerin üzerinde çizgi çizilir. Üzerinde çalışılan projenin
aktif formuna veya formdaki diğer nesnelerin üzerine düz çizgi koymak
için TollBox penceresinde Line kontrolünden yararlanılır
Forma eklenen ilk çizgiye Line1 adı verilmektedir. Forma eklenen
çizginin kalınlığı Line nesnesine ait BorderWidth değişkeni ile
belirlenir.
Çalışma anında Forma dahil edilen Line nesnesinin yeri değiştirilebilir. Line nesnesinin iki ucunun
koordinatları nesneye ait (X1,Y1) ve (X2,Y2) değişkenlerinde saklanmaktadır. Çizgilerin renkleri
BorderColor değişkeni ile belirlenir (Şekil 8.f-108).
297
Şekil 8.f-108
Line nesnesi için önceden tanımlı olan hiçbir olay veya Event yoktur. Bu nedenle kod penceresinde
o anda seçili durumu olan formda Line nesnesi olsa bile Line nesnesinin adı yer almaz.
18. Shape Kontrolü
Formlara dikdörtgen, kare, daire ve elips gibi geometrik şekiller eklemek için
Shape denetiminden yararlanılır. Shape nesneleri sürekli olarak düğmelerin ve onay
kutularının altında kalmaktadır.
Bir forma Shape nesnesi eklemek için ToolBax penceresinde Shape nesnesini temsil eden düğme
seçili duruma getirilir. Forma eklenen ilk Shape nesnesine varsayım olarak Shape1 adı verilir (Şekil
8.f-109).
Şekil 8.f-109
Forma eklenen Shape nesnesinin türü nesneye ait Shape değişkeni ile belirlenmektedir. Shape
değişkeni başlangıçta dikdörtgen anlamında “0-Rectangle” değerini içermektedir. Forma kare şekli
için Shape nesnesi eklediyseniz tasarım anında Shape değişkenine “1-Square” değerini eklemeniz
gerekir (Şekil 8.f-110).
298
Şekil 8.f-110
Forma eklenen Shape nesnesinin çizgi kalınlığı Properties penceresinde bulunan BorderWidth
değişkenine sayısal değer girilerek sağlanır. BorderWidth ‘in başlangıçtaki sayısal değeri 1 dir
BorderColor değişkeni ile de çizgiye istenilen renk verilir.(Şekil 8.f-111).
Şekil 8.f-111
Aşağıdaki program forma eklenen shape nesnesine ait şekilleri sıra ile göstermektedir.
Private Sub Form_Click()
If Shape1.Shape < 5
Shape1.Shape = Shape1.Shape +
End If
End Sub
19. Timer Kontrolü
299
1
Çalışma anında bazı işlemlerin belli zaman aralıkları ile tekrarlanması istenir.
Örneğin ekranda sistem saatini sürekli göstermek için Time fonksiyonu
kullanılırken en azından her dakikada bir sistem saati okunmalıdır. Bu ve benzeri
durumlar için Timer kontrolünden yararlanılır.
Çalışma anında bazı işlemlerin belli zaman aralıkları ile tekrarlanması istenir. Örneğin ekranda
sistem saatini sürekli göstermek için Time fonksiyonu kullanılırken en azından her dakikada bir sistem
saati okunmalıdır. Bu ve benzeri durumlar için Timer kontrolünden yararlanılır.
Timer kontrolü Visual Basic tarafından otomatik olarak
projeye dahil edildiği için ToolBox penceresinde üzerinde saat
olan düğme seçili durumda iken üzerinde çalışılan projenin
aktif formuna Timer nesnesi eklenebilir. Tasarım anında Timer
nesnesinin form üzerindeki boyutu sabittir. Timer nesnesi
çalışma anında formun üzerinde yer almaz. Forma eklenen ilk
Timer nesnesine Timer1 adı verilmektedir (Şekil 8.f-112).
Şekil 8.f-112
Timer nesnesinin tek en önemli özelliği Interval’ dir. Başlangıçta Interval değişkeni 0 değerine
sahip olduğu için Timer nesnesi işlevsiz olur. Interval değişkenine aktarılan bilgi Milisaniye
cinsindendir
Properties penceresinde Timer nesnesine ait Interval değişkenin içeriğini 1000 yapıp örnek projeyi
çalıştırırsak çalışan saat elde ederiz.
Private Sub Timer_Timer()
Text1.text = Time
End Sub
300
20. UpDown (Spin) Kontrolü
TextBox’ların hemen bitişiğinde üzerinde birinin ucu yukarı, diğerinin ucu aşağı
bakan iki küçük düğme vardır (Şekil 8.f-113).. Bu düğmelerin ikisine birden Spin adı
verilmektedir. TextBox’a klavyeden yararlanarak istediğiniz gibi sayısal bilgi
girebilirsiniz.
Ancak isterseniz sayısal bilgi girişi yapılabilen bu TextBox’ların içeriğini TextBox’ın hemen
yanındaki Spin’lerden yararlanarak değiştirebilirsiniz. Üzerinde ucu yukarı bakan ok işareti olan
düğmede tıklama yapılınca TextBox’ın içerdiği sayıda artma olur. Ucu aşağıya bakan düğmede
tıklama yapılınca bu kez TextBox’ın içerdiği sayıda azalma olur.
Şekil 8.f-113
Visual Basic projeleri dahilinde benzer işleve sahip TextBox hazırlamak mümkündür. Bunun için
COMCT232.OCX adlı özel kontrol dosyasından yararlanılır.
Şekil 8.f-114
301
Bu özel kontrol dosyasını üzerinde çalıştığınız projeye dahil etmek istiyorsanız Project
menüsündeki Components komutunu verip ekrana Components diyalog kutusunu getirip Microsoft
Windows Common Controls-2 adlı özel kontrol dosyasını seçili duruma getirmeniz gerekir.
ToolBox penceresine Animation ve UpDown kontrollerini temsil eden iki düğme eklenir.
ToolBox penceresinde UpDown kontrolünü temsil eden düğme seçili durumda iken forma UpDown
nesnesi yerleştirilebilir. Forma eklenen ilk UpDown nesnesine “UpDown1” adı verilmektedir.
UpDown nesnesi ancak bir TextBox ile kullanıldığı zaman işlevseldir. Bu nedenle örnek olması için
her Spinden önce bie TextBox nesnesini forma ekleyelim UpDown, TextBox’ın istenen yerine
konulabilir.
Şekil 8.f-115
Spin’in üzerinde ucu yukarı bakan ok işareti olan düğmesinde tıklama yaparsa UpClick, ucu aşağı
bakan düğmede tıklama yaparsa DownClick playı meydana gelir. Bu olaylardan yararlanarak
TextBox’ın içeriği değiştirilir.
Private
Sub UpDown1_UpClick()
Text1.Text = Text1.Text + 0.2
End Sub
UpDown kontrolü ile metin kutusu arasında bağlantı kurmak yerine bu işlemi program kodu
yazmadan Visual Basic tarafından otomatik olarak yapılmasını sağlayabilirsiniz. Bu amaçla UpDown
nesnesinin Buddy Control özelliğinden yararlanılmaktadır (Şekil 8.f-116).
Şimdi örnek olması için üzerinde çalıştığımız projenin formuna eklemi ş olduğuz iki
UpDown nesnesi ile formdaki metin kutuları arasında bağlantı kuralım. Bu amaçla
Properties penceresinde UpDown1 nesnesinin özellikleri varken BuddyControl özelli ğine
forma yerleştirmiş olduğuz ilk metin kutusunun adını yazalım.
Şekil 8.f-116
Ardından UpDown nesnesinin SyncBuddy özelliğine True değerini aktaralım (Şekil 8.f-117). Bu
iki işlemden sonra UpDown nesnesi ile Text1 nesnesi arasında bağlantı işlemi tamamlanmış olur.
302
Çalşma anında UpDown nesnesinin üst düğmesinde tıklama
yaparsanız TextBox nesnesinin içeriği 1 artar, alttaki düğmede
tıklama yaparsanız bu kez 1 azalır. TextBox’ın içeriğinin ne
kadar artacağını Increment özelliğinden yararlanarak
belirleyebilirsiniz (Şekil 8.f-118).
Şekil 8.f-117
Şekil 8.f-118
Diğer yandan Properties penceresinde UpDown nesnesine ait Custom özelliğinden yararlanarak
UpDown nesnesinin bazı özelliklerini bir diyalog kutusunda değiştirebilirsiniz.
Şekil 8.f-119
Property diyalog kutusunda UpDown nesnesine ait özellikler 3 ayrı sekmeye ayrılmış durumdadır.
303
Şekil 8.f-120
UpDown nesnesi ve başka nesneler arsında bağlantı kurulurken Buddy sekmesindeki
seçeneklerden yararlanılmaktadır. Şekil 38-9’da verilen ekran görüntüsünde UpDown nesnesi ile
Text1 adında metin kutusu arasında bağlantı kurulmuştur. TextBox veya Label nesnesine UpDown
nesnesi yardımı ile aktarılacak değerler konusunda ayarlama yaparken Scrolling sekmesindeki
seçeneklerden yararlanılmaktadır (Şekil 8.f-120). TextBox’a aktarılmasına izin verilecek en küçük ve
en büyük değer Min ve Max özellikleri ile belirlenir. Increment özelliği ile artırma ve azaltma
miktarını belirlenmektedir.
21. Slider Kontrolü
Slider kontrolünü temsil eden düğme seçili durumda iken formun üzerine istediğiniz
boyutta Slider nesnesi yerleştirebilirsiniz. Forma yerleştirilen ilk Slider nesnesine
“Slider1” adı verilemektedir.
Şekil 8.f-121
Windows 98 ile birlikte verilen sesleri kaydetmek üzere verilen Media Player programı gibi bu ve
benzeri işlemler için Slider kontrolnden yararlanabilirsiniz. Slider kontrolü Visual Basic tarafından
projelere dahil edilmediği için Project menüsündeki Components komutu ile ekrana getirilen
Components diyalog kutusunda Microsoft Windows Common Controls 6.0 adındaki özel kontrol
dosyası projeye dahil edilir (Şekil 8.f-122).
304
Şekil 8.f-122
Forma yerleştirilen Slider nesnesi başlangıçta 10 eşit parçaya bölünmüş durumdadır. Ayrıca Slider
nesnesinin Max ve Min değerleri bulunmaktadır (Şekil19-123).
Slider nesnesinin Max ve Min değerlerini Properties penceresinde tasarım anında belirlemek yerine
program kodu yazarak çalışma anında gelişen şartlara bağlı olarak belirliyebilirsiniz. Bunun dışında
ucu aşağıya bakan büyükçe ok işaretinin yerini Slider nesnesinin Value özelliği yardımıyla
izleyebilirsiniz (Şekil 8.f-124).
Şekil 8.f-123
Fare ile Slider nesnesinin düğmesini hareket ettirdikçe Value değişkeninin içeriği değişir. Value
değişkeninin içeriğini tasarım anında Properties penceresinde veya program kodu yazarak
değiştirebilirsiniz. Fare ile Slider nesnesinin düğmesinde değişiklik yaptıkça Change olayı meydana
gelir.
305
Şekil 8.f-124
Şimdi Slider kontrolünün işlevini basit bir şekilde anlatmak için üzerinde çalışılan projenin
formuna bir Picture Box nesnesi yerleştirelim. Ayrıca Picture Box nesnesi için resim dosyası seçimi
yapalım.
Şekil 8.f-125
Properties penceresinde Slider nesnesine ait Value değişkenine 5 değerini aktararak düğmenin
başlangıçta nesnenin tam ortasında yer almasını sağlayalım. Çalışma anında Slider nesnesinin düğmesi
sağa doğru hareket ettirildiği zaman Picture Box nesnesinin boyutları büyüyecek sola hareket
ettirildiği zaman ise küçülecektir.
Private Sub Slider1_Change()
Picture1.Width = Picture1.Width * Slider1.Value /5
Picture1.Height = Picture1.Height * Slider1.Value /5
If Picture1.Width > 4500 Then
Picture1.Width = 4500
Picture1.Height = 2775
End If
If Picture1.Width < 1000 Then
Picture1.Width = 1000
Picture1.Height =
800
End If
End Sub
306
22. SSTab Kontrolü
Son yıllarda piyasaya verilen programlarda çok sayıda seçenek içeren diyalog
kutularında, aynı anda bütün seçenekleri görüntüleme imkanı olmadığı için, diyalog
kutusunun seçenekleri birden fazla sayfaya veya sekmeye ayrılmaktadır.
Şekil 8.f-126
Birden fazla sekme veya sayfaya sahip diyalog kutusunu hazırlamak için Tabbed Dialog
kontrolünden yararlanılmaktadır. Components diyalog kutusunda Tabbed Diyalog kontrolünü seçili
duruma getirip Tamam düğmesinde tıklama yaparsanız Tabbed Diyalog kontrolü projeye dahil edilir
ve Toolbox penceresinde bir düğme ile temsil edilir (Şekil 8.f-126).
Şekil 8.f-127
307
Tooloox’ta SSTab düğmesi seçili durumda iken forma istediğiniz boyutta ve başlangıçta 3 sekmeye
sahip SSTab nesnesi dahil edebilirsiniz. Forma bu şekilde dahil edilen SSTab nesnesinde varsayım
olarak Tab 0, Tab 1 ve Tab 2 adında 3 sekme bulunmaktadır.
ToolBox’ta SSTab düğmesi seçilli durumda iken formun üzerinde istediğiniz boyutta ve
başlangıçta 3 sayfaya veya sekmeye sahip SSTab nesnesi dahil edebilirsiniz. SSTab nesnesinde yer
alacak sayfaların sayısı nesnenin Tabs özelliğinden yararlanılarak belirlenir.
Şekil 8.f-128
TabsPerRow değişkenine de aynı değer aktarılır. Bu sırada hangi sekmede tıklama yaparsanız o
sekme geçerli olur. Program kodu kullanarak da sekmeleri seçebiliriz. Bu sırada hangi sekmede
tıklama yaparsanız o sekme geçerli sekme olur. Şekil 8.f-129’da verilen ekran görüntüsünde çalışma
anında “Tab 1” adlı sekmenin üzerinde tıklama yaptıktan sonra alınmıştır.
Şekil 8.f-129
Seçili durumda olan sekmenin sıra numarası SSTab nesnesine ait Tab değişkenine aktarılmaktadır.
Çalışma anında fare ile sekmelerin arasında dolaşıldıkça Tab değişkeninin içeriği otomatik olarak
değişir.
Private Sub Form_load()
SSTab1.Tab =1
End Sub
308
Properties penceresinden yararlanarak sekmelere varsayım olarak verilen Tab 1, Tab 2 şeklindeki
başlıkları değiştirebilirsiniz. SSTab nesnesinin hangi nesnesinin başlığında veya Caption özelliğinde
değişiklik yapmak istiyorsanız SSTab nesnesinde o sekmenin üzerinde tıklama yapıp seçili duruma
getirmeniz gerekir. Şekil 8.f-120’de verilen ekran görüntüsünü tasarım anında ikinci sekmeyi seçili
duruma getirip Caption özelliğinde değişiklik yaptıktan sonra alınmıştır.
Şekil 8.f-120
Forma eklemiş olduğunuz SSTab nesnesinin özelliklerini belirlerken Properties penceresindeki
Custom özelliğinden yararlanabilirsiniz (Şekil 8.f-121). Işıklı bant Custom özelliğinin üzerinde iken
özelliğe ait metin kutusunun sonuna üzerinde üç nokta bulunan bir düğme eklenir.
Şekil 8.f-121
Custom özelliğine ait metin kutusunun sonuna eklenen düğmede tıklama yapacak olursanız SSTab
nesnesinin özelliklerinde değişiklik yapılabilen Properties Pages diyalog kutusu ekrana gelir. Bu
diyalog kutusunda SSTab nesnesi ile ilgili olarak yapılabilen seçim ve ayarlamalar General, Color,
Font ve Picture adında 4 sekmeye ayrılmış durumdadır (Şekil 8.f-122).
309
Şekil 8.f-122
General sekmesindeki seçeneklerle SSTab nesnesinde bulunacak sekmelerin say ısını, her satırda kaç sekmenin yer alacağını veya sekme
başlıklarını belirliyebilirsiniz. Style liste kutusundan yararlanarak sekmelerin biçimini de ğiştirebilirsiniz. Şekil 8.f-123’de verilen ekran
görüntüsünü Style liste kutusu açtıktan sonra alınmıştır.
Şekil 8.f-123
Verilen ekran görüntüsünden SSTab nesnesi ile iki ayr ı tipte sekme hazırlamak mümkündür.
görüntüsünü Style liste kutusundan ssStyle Property Page sekme tipini seçildikten sonra al ınmıştır.
310
Şekil 8.f-124’de verilen ekran
Şekil 8.f-124
SSTab nesnesinin Style özelliğini değiştirmek için Custom diyalog kutusundan yararlanmak yerine Properties penceresinden de
yararlanabilirsiniz.
Sekmeler SSTab nesnesine ayr ılan alanın üst kısmında tutulmaktadır. Ancak isterseniz sekmelerin SSTab nesnesine ayr ılan alanın alt
kenarına,sağ veya sol tarafında olmasını sağlayabilirsiniz. Bu amaçla Custom diyalog kutusunda Orientation liste kutusundan
yararlanabilirsiniz. SSTab nesnesinin Orientation özelli ği 4 ayrı değeri almaktadır. Sekmelerin SSTab nesnesinin alt kenar ına diklemesini
sağlamak üzere Orientation özelliğine “1-Tabs on Bottom” değerini aktarınca üzerinde çalıştığımız projedeki SSTab nesnesi Şekil 8.f125’de verilen şekle dönüştü.
Şekil 8.f-125
Başlangıçta Tab veya sekmelerin yükseklikleri 300 Twip seçilmekte ve bu değer SSTab nesnesinin
TabHeight özelliğinde saklanmaktadır. Custom özelliğinden yararlanılarak ekrana getirilen Property
Pages diyalog kutusundan veya doğrudan Properties penceresinden yararlanarak sekmelerin
yüksekliklerinde değişiklik yapabilirsiniz.
Style özelliğinde olduğu gibi SSTab nesnesinin Orientation özelliğinde değişiklik yapmak için
Custom diyalog kutusuna başvurmadan doğrudan Properties penceresinde TabOrientation
özelliğinden yararlanabilirsiniz.
Başlangıçta Tab veya sekmelerin yükseklikleri 3000 Twip olarak seçilmekte ve bu değer SSTab
nesnesinin TabHeight özelliğinde saklanmaktadır. Custom özelliğinden yararlanarak ekrana getirilen
Propert Pages diyalog kutusundan veya doğrudan Properties penceresinden yararlanarak sekmelerin
yüksekliklerinde değişiklik yapabilirsiniz (Şekil 8.f-126).
311
Şekil 8.f-126
SSTab nesnesindeki sekmelerin yüksekliklerinden başka genişliklerini istediğiniz gibi
belirleyebilirsiniz. Sekmelerin genişlikleri başlangıçta SSTab nesnesinin genişliğine bağlı olarak
otomatik olarak belirlenmektedir. SSTab nesnesinin genişliğini arttıracak olursanız, sekmelerin
genişlikleri buna paralel olarak artar. Diğer yandan SSTab nesnesinin Style özelliği
ssStylePropertyPages değerini içeriyorsa sekmelerin genişliği SSTab nesnesinin genişliğinden
etkilenmez.
Şekil 8.f-127
SSTab nesnesinin Style özelliğine ssStyleTabbedDialog değerini içeriyorken sekme genişliğinin bu
şekilde Visual Basic tarafından SSTab nesnesinin genişliğine bağlı olarak belirlenmesini
istemiyorsanız MaxTabWidth özelliğinden yararlanmanız gerekir. MaxTabWidth özelliği başlangıçta
0 değerini içerdiği için sekme genişliği Visual Basic tarafından belirlenmektedir.
312
Şekil 8.f-128
Eğer gerektiği zaman sekme başlıklarının birden fazla satır arasında paylaşılmasını istemiyorsanız
SSTab nesnesine ait WordWrap özelliğinden yararlanabilirsiniz (Şekil 8.f-128).
Eğer seçili durumda olan sekmenin etrafının
noktalarla çevrilmesini istemiyorsanız SSTab
nesnesine ait ShowFocusRect özelliğine False
değerini aktarmanız gerekir (Şekil 8.f-129).
Şekil 8.f-129
Şekil 8.f-130
313
Sekme başlıkları metni için font veya punto değişikliği yapmak istiyorsanız Font sekmesinden
yararlanabilirsiniz (Şekil 8.f-130). Sekme başlıklarında bir simgeye yer vermek istiyorsanız Picture
özelliğinden yararlanabilirsiniz. Tasarım anında hangi sekmeye başka nesneler eklemek istiyorsanız
önce o sekmeyi seçili duruma getirmeniz gerekir. Sekmede yalnızca resim kullanacaksanız sekmeye
ait Caption özelliğine boşluk değerini aktarmanız gerekir.
Şekil 8.f-131
Tasarım anında hangi sekmeye başka nesneler eklemek istiyorsanız önce o sekmeyi seçili duruma
getirmeniz gerekir (Şekil 8.f-132).
Şekil 8.f-132
23. DBGrid Kontrolü
Visual Basic’in DBGrid kontrolü yardımıyla istenen tablonun içeriği çok kolay bir şekilde Excel
veya dBASE tabloları gibi satır ve sütunlar halinde ekrana getirilir ve istenirse tablonun içerdiği
bilgilerde değişiklik yapılabilir. DBGrid kontrolü ile veri tabanı dosyaları üzerinde işlem yapabilmek
314
için daha önce söz konusu forma Data nesnesini dahil etmek gerekiyor. DBGrid kontrolünün nasıl
kullanıldığını anlamak için önce bir proje hazırlayalım ve projenin formuna bir Data nesnesi dahil
edelim.
Şekil 8.f-133
Konunun kolay anlaşılmasını sağlamak için Data nesnesinin RecordSource özelliğine daha önce
hazırlamış olduğumuz MDB uzantılı “Müşteri” adındaki veri tabanı dosyasındaki “Adresler”
tablosunun adını aktaralım (Şekil 8.f-133).
315
Şekil 8.f-134
DBGrid kontrolü ToolBox penceresinde bir düğme ile temsil edilmediği için Project menüsünden
Components komutunu verip ekrana Components diyalog kutusunda “Microsoft Data Bound Grid
Control 5.0 ” kontrolüne ait onay kutusunu seçili duruma getirip “Tamam” düğmesinde tıklama
yaparsanız üzerinde çalıştığınız projeye DbGrid kontrolü dahil edilir (Şekil 8.f-134).
Bu şekilde forma Dbgrid nesnesi dahil edildikten sonra ilk olarak, hangi Data
nesnesinden yararlanarak hangi tablo üzerinde işlem yapılacağı belirlenir. Bu
amaçla üzerinde çalıştığınız forma DBGrid nesnesini eklemeden önce, Data
nesnesini forma dahil etmeniz gerekir (Şekil 8.f-135)
Şekil 8.f-135
DBGrid nesnesine bilgileri hangi Data nesnesinden almak istiyorsanız o Data nesnesinin adını,
DBGrid nesnesine ait DataSource özelliğine aktarmanız gerekir (Şekil 8.f-136).
316
Şekil 8.f-136
Properties penceresinde DBGrid nesnesi için Data nesnesi seçimini yaptıktan sonra DBGrid
nesnesinden yararlanabilirsiniz. Data nesnesi seçiminden sonra projeyi çalıştıracak olursanız seçilen
tablonun içeriği DBGrid nesnesi içinde görüntülenmeye başlanır (Şekil 8.f-137).
Şekil 8.f-137
DBGrid nesnesinin genişliği forma eklenen data nesnesi aracılığı seçilen tablodaki tüm alanlar ı aynı anda görüntülemek için yeterli
değildir. Eğer DBGrid nesnesinin Formun üst kısmına yaslandırılmasını istiyorsanız DBGrid nesnesinin Align özelli ğine 1-AlingTop,
formun alt kısmına yanaştırılmasını istiyorsanız 2-Aling Bottom değerini aktarmalısınız (Şekil 8.f-138).
Şekil 8.f-138
Şekil 8.f-137’de verilen ekran görüntüsünü almak için Align özelliğine “1-AlingTop” değeri
aktarıldı. Ardından formun genişliğini biraz arttırıldı. Daha önce DBGrid nesnesinin Align özelliğine
317
“1-AlingTop” değerini aktardığımız için formun genişliğine paralel olarak Grid nesnesinin genişliği
kendiliğinden arttı. Bu ayarlamalardan sonra yalnızca Data ve DBGrid nesnesini içeren bir forma
sahip olan bu proje çalıştırılacak olursa, seçilen tablodaki her bir kayıt bir satıra gelmek üzere ekrana
getirilir.
Şekil 8.f-139
Bu sırada ok tuşları ile kayıtlar (satır) ve alanlar (sütun) arasında dolaşılabilir, istediğiniz kayıtta değişiklik yapabilir veya yeni bir kayd ın
girişini yapabilirsiniz. Ayr ıca çalışma anında fare ile sütunların genişliklerini istediğiniz gibi değiştirebilirsiniz. Ok tuşları ile kayıtlar ve
hücreler arasında dolaşırken üzerine gidilen hücrenin bütün içeri ği varsayım olarak seçili durumda olmaktadır.
Başlangıçta DBGrid nesnesi ile içeriği ekrana getirilen tabloya yeni kay ıtlar giremezsiniz. Grid nesnesi yardımıyla tabloya kayıt girmek
istiyorsanız DBGrid nesnesinin AllowAddNew özelliğine True değerini aktarmanız gerekir (Şekil 8.f-140).
Şekil 8.f-140
DBgrid nesnesinin AllowAddNew özelliği True değerini içeriyorken tablonun sonuna yeni bir kayd ın girişini yapmak için ok tuşları veya
fare ile dosyadaki en son kaydın herhangi bir alanına girilir. Ardından bir kez daha aşağı ok tuşuna basılırsa tablonun sonuna içeriği boş bir
kayıt eklenir (Şekil 8.f-141).
318
Şekil 8.f-141
Çalışma anında DBGrid nesnesi ile ilgili olarak yapılabilecek işlemler konusunda ayarlama
yaparken Properties penceresinde DBGrid nesnesine ait Custom özelliğinden yararlanabilirsiniz
(Şekil 8.f-142).
Şekil 8.f-142
Şekil 8.f-143
319
Şekil 8.f-143’de ekran görüntüsü verilen Property Pages diyalog kutusunda yapılabilen seçim ve
ayarlamalar General, KeyBpoard, Columns, Layout, Color, Font ve Split adında 7 sekmeye
ayrılmış durumdadır
Eğer veri tabanı dosyası üzerinde değişikliğe izin vermek istemiyorsanız AllowUpdate onay
kutusunu pasif duruma getirmeniz yeterlidir. Benzer şekilde kayıt silme işlemine izin vermek
istemiyorsanız AllowDelete özelliğine False değerini aktarabilirsiniz. Eğer DBGrid nesnesi ile söz
konusu tablonun bütün alanları yerine istediğiniz alanları üzerinde işlem yapmak istiyorsanız Property
Pages diyalog kutusunda Columns sekmesindeki seçeneklerden yararlanabilirsiniz (Şekil 8.f-144).
Şekil 8.f-144
Şimdiye kadar verilen ekran görüntülerinden tespit etmiş olabileceğiniz gibi DBGrid nesnesi
yardımıyla seçilen tablodaki bütün alanları görüntülemektedir. Eğer DBGrid nesnesi ile söz konusu
tablonun bütün alanları yerine istediğiniz alanları üzerinde işlem yapmak istiyorsanız Property Pages
diyalog kutusunda Columns sekmesindeki seçeneklerden yararlanabilirsiniz.
Başlangıçta Columns sekmesindeki seçenekler veya liste kutuları herhangi bir bilgi içermedikleri
için çalışma anında DBGrid nesnesi sınırları içinde tablonun bütün alanları birer sütun ile temsil edilir.
Şimdi örnek olması için “Adresler” tablosunun yanlızca “Adı”, “Soyadı” ve “Telefon” alanlarının
DBGrid nesnesi içinde yer almasını sağlayalım. Şekil 8.f-145’deki ekran görüntüsünde tespit
edebileceğiniz gibi tasarım anında DBGrid nesnesinde yalnızca iki sütun bulunmaktadır.
Şekil 8.f-145
Bu nedenle Property Pages diyalog kutusundaki Columns liste kutusunda yalnızca iki seçenek
bulunmaktadır. Eğer DBGrid nesnesi ile tablonun yalnızca iki alanı üzerinde işlem yapmak isterseniz
fazladan herhangi bir işlem yapmadan Property Pages diyalog kutusundaki “Columns” liste kutusunda
alan seçimini yapmanız gerekirdi..
320
Şekil 8.f-146
Şekil 8.f-146’daki ekran görüntüsünde tasarım anında DBGrid nesnesinde yalnızca iki sütun
olduğu için Columns liste “Column0” ve “Column1” adında iki seçenek bulunmaktadır. Bu liste
kutusunda sütun seçimi yapıldıktan sonra Data Field liste kutusunda alan seçimi yapılır.
Data Field liste kutusunda Data nesnesi ile seçilen tablodaki alanlar listelenir. Caption özelliğinden
yararlanarak sütunun başlığını belirleyebilirsiniz. Sütunun Caption özelliğine bilgi giremezseniz alanın
adı aynı zamanda sütun başlığı olarak kullanılır.
Şekil 8.f-147
Default Value özelliği ile tabloya yeni kayıt girişi sırasında alana otomatik olarak aktarılacak bilgi
belirlenir. Örneğin adres kayıtlarını girdiğiniz kişilerin çoğunluğu İstanbul’da oturuyorsa Şehir alanına
Default Value özelliğine “İstanbul” bilgisini aktarabilirsiniz. Şekil 8.f-148’de verilen ekran
görüntüsünü DBGrid nesnesine ait iki sütun için alan seçimini yaptıktan sonra alınmıştır.
321
Şekil 8.f-148
Bu seçim ve işlemlerden sonra Property Pages diyalog kutusunu kapatıp projeyi çalıştıracak
olursanız DBGrid nesnesi, her kaydın yalnızca Adı ve Soyadı bilgilerini ekrana getirir.
Şekil 8.f-149
Yukarıdaki sayfada belirtildiği gibi DBGrid nesnesi ile “Adresler” tablosundaki kayıtların Adı ve
Soyadı ve Telefon alanlarının içerikleri ekranda görmek istediğimiz veya Grid nesnesinde yalnızca bu
3 alanın olmasını istediğimiz için tasarım anında DBGrid nesnesine yeni bir sütun ekleyelim. Bu
amaçla ilk olarak tasarım anında DBGrid nesnesinin üzerinde farenin sağ tuşu ile tıklama yaparak
DBGrid nesnesi ile kısayol menüsünü ekrana getirilir (Şekil 8.f-150).
322
Şekil 8.f-150
Eğer tasarım anında Grid nesnesine bilgi girmek veya DBGrid nesnesine yeni bir alan eklemek
istiyorsanız kontrol menüsünden Edit komutunu verebilirsiniz. Edit komutunu verirseniz imleç
DBGrid nesnesindeki hücrelerden birinin içinde yanıp sönmeye başlar. Bu sırada DBGrid nesnesine
istediğiniz gibi bilgi girebilirsiniz.
Şekil 8.f-151
Edit modunda iken farenin sağ tuşu ile DBGrid nesnesinin üzerinde tıklama yapılarak ekrana
getirilen kısayol menüsünde farklı komutlar bulunmaktadır. Şekil 46-18’de verilen ekran
görüntüsünde görebilirsiniz.
Bu sırada DBGrid nesnesine ait kısayol menüsünden Append komutunu verirseniz DBGrid
nesnesine yeni bir sütun eklenir. Şekil 8.f-152’de verilen ekran görüntüsünü Append komutu ile sütun
sayısını üçe çıkardıktan sonra alınmıştır.
Şekil 8.f-152
Bu işlemden sonra DBGrid nesnesine ait kısayol menüsünden Properties komutunu verirp ekrana
Propery Pages diyalog kutusunu getirdim. Ardından Columns sekmesinde DBGrid nesnesine eklemiş
olduğum 3. sütun (Columns2) için alan seçimi yapıldı. Sonra Property Pages diyalog kutusunu kapatıp
projeyi çalıştıracak olursanız DBGrid nesnesi içinde seçilen tablonun yukarıda kendileri için ayarlama
yapılan 3 alan görüntülenir (Şekil 8.f-153).
323
Şekil 8.f-153
Örnek Program 1
Şekil 8.f-154
Option Explicit
Private Sub Form_Load()
Dim dbname As String
Dim db As Database
Dim qdef As QueryDef
Dim td As TableDef
' Open the database.
dbname = App.Path
If Right$(dbname, 1) <> "\" Then dbname = dbname & "\"
dbname = dbname & "PERSONEL.mdb"
Set db = OpenDatabase(dbname)
' List the table names.
For Each td In db.TableDefs
If Left$(td.Name, 4) <> "MSys" Then List1.AddItem
td.Name
Next td
db.Close
Data1.DatabaseName = dbname
324
End Sub
Private Sub List1_Click()
Dim TABLE_ADI As String
Dim sql As String
TABLE_ADI = List1.List(List1.ListIndex)
sql = "SELECT * FROM " & TABLE_ADI
Data1.Caption = TABLE_ADI
Data1.RecordSource = sql
Data1.Refresh
Data1.Visible = True
DBGrid1.Visible = True
End Sub
Örnek Program 2
Private Sub Form_Load()
Dim
Dim
Dim
Dim
dbname As String
db As Database
qdef As QueryDef
td As TableDef
dbname = App.Path
If Right$(dbname, 1) <> "\" Then dbname = dbname & "\"
dbname = dbname & "data.mdb"
Set db = OpenDatabase(dbname)
For Each td In db.TableDefs
If Left$(td.Name, 4) <> "MSys" Then List1.AddItem
td.Name
Next td
db.Close
Data1.DatabaseName = dbname
325
End Sub
Private Sub List1_Click()
Dim table_name As String
Dim sql As String
table_name = List1.List(List1.ListIndex)
sql = "SELECT * FROM " & table_name
Data1.Caption = table_name
Data1.RecordSource = sql
Data1.Refresh
Data1.Visible = True
DBGrid1.Visible = True
End Sub
24. DBList Kontrolü
Kayıt girişi sırasında kullanıcıların doğrudan bilgi girmesi yerine liste kutusu nesnesi yardımıyla
listelenen seçeneklerden seçim yapmak çok daha işlevseldir.
Visual Basic dahilinde liste kutusuna gerek duyulacak olursanız ListBox kontrolünden
yararlanabilirsiniz. Ancak liste kutusunda listelenecek seçenekler bir tablo veya veri tabanı
dosyasından alınacaksa DBList kontrolünden yararlanmanız gerekir. DBList kontrolü projelere
otomatik olarak dahil edilmediği için projeye dahil edilmesi gerekir. Bu amaçla önce Project
menüsünden Components komutunu vermeniz gerekir.
Projelere otomatik olarak dahil edilmeyen DBList kontrolünü projeye dahil etmek üzere Project
menüsünden Components komutunu verirseniz ekrana Components diyalog kutusu gelir (Şekil 8.f155).
Şekil 8.f-155
Bu diyalog kutusunda Controls sekmesindeki Microsoft Data Bound List Controls onay kutusunu
seçip Tamam düğmesinde tıklama yaparsanız ToolBox’a iki düğme dahil edilir. Bu düğmelerden ilki
DBList, ikincisi ise DBCombo kontrolünü temsil eder (Şekil 8.f-156,157).
326
Şekil 8.f-156
Şekil 8.f-157
DBList nesnesinden yararlanmak için Data kontrolünden başvurmak gerektiği için ayrıca forma bir
Data nesnesi dahil edilir ve Data nesnesi için veri tabanı dosyası ve tablo seçimi yapılır. Forma Data
nesnesi dahil ettikten sonra DBList nenesinin DataSource özelliğinden yararlanarak Data nesnesi
seçimi yapılır
(Şekil 8.f-158).
Şekil 8.f-159
DBList kontrolü için Data nesnesi seçimini yaptıktan sonra DBList nenesi ile hazırlanacak liste
kutusunda listelenecek bilgilerin hangi alandan seçileceği belirlenir. Bu amaçla ListFields özelliğinden
yararlanarak alan seçimi yapılmaktadır. Örnek olması için hazırlamak istediğimiz DBList nenesinde
Adresler tablosundaki “Adı” alanının içerdiği bilgileri listelemek için Adı alanını seçelim.
Şekil 8.f-160
ListFields özelliğinden yararlanarak alan seçimini yaptıktan sonra projeyi çalıştıracak olursanız
liste kutusu seçilen tablonun ilgili alanlarındaki bilgiler listelenir (Şekil 8.f-161).
327
Şekil 8.f-161
Bu sırada fareden veya ok tuşlarından yararlanarak liste kutusunda listelenen seçeneklerden
istediğinizi seçebilirsiniz. Liste kutusunda seçilen seçenek DBList nenesinin Text özelliğine
aktarılmaktadır. Liste kutusunda seçilen seçeneğin Text özelliğine aktarıldığını göstermek için forma
bir metin kutusu ve bir düğme yerleştirelim. Aktar başlıklı düğmede tıklama yapıldığı zaman seçilen
seçenek metin kutusuna yazılacaktır (Şekil 8.f-162).
Private Sub Aktar_Click()
Text1.Text = Dblist1.Text
End Sub
Şekil 8.f-162
Diğer yandan DBList kontrolü ile bir tablodan alınan bilgiler başka bir tabloda kullanılmak
istenebilir. Bu gibi durumlarda DBList nesnesinin DataSource ve DataFields özelliklerinden
yararlanılır.
25. DBCombo Kontrolü
Bu kontrol hakkında bilgi vermek için önce yeni bir proje hazırlayalım ve projenin forma bir
DBCombo nesnesi dahil edelim. DBCombo nesnesi Data nesnesine ihtiyaç duyduğu için forma ayrıca
bir Data nesnesi dahil edilir ve Data nesnesi ile Müşteri.mdb dosyasındaki Adresler tablosuna erişim
sağlamak için Data Source seçimini yapalım (Şekil 8.f-163).
328
Şekil 8.f-163
Bu hazırlıklardan sonra ilk olarak DBCombo nesnesi ile Data nesnesi arsında bağlantı kurmak için
ilk olarak DBCombo’nun RowSource özelliği ile Data nesnesi seçimi yapılır.
Ardından DBCombo nesnesinin FieldsList özelliği yardımıyla liste kutusunda bilgilerin seçilen
tablonun hangi alanından alınacağı belirlenir. DBCombo nesnesinde “Adresler” tablosundaki
Soyadları aktarmak istediğimiz için DataField özelliğine “Soyadı” alanını aktardık (Şekil 8.f-164).
Şekil 8.f-164
Bu işlemlerden sonra DBCombo ve Data nesnesi dahil edilen proje çalıştırılacak olunursa
Şekil 8.f-165’deki gibi bir görüntü elde edilir. Başlangıçta DBCombo nesnesinin Text özelliği
“DBCombo1” olan adını içeriği için liste kutusunda bu bilgi bulunur.
329
Şekil 8.f-165
Listelenecek seçeneklerden hangisini seçerseniz o seçenek DBCombo nesnesinin Text özelliğine
aktarılır. Data nesnesine ait düğmelerde tıklama yaparak erişim sağlanan tablonun kayıtları arsında
dolaşmanız halinde bundan DBCombo nesnesi etkilenmez. Çünkü şimdiye kadar yapılan seçim ve
ayarlamalara göre DBCombo nesnesi ancak Data nesnesi ile erişim sağlanan Adresler tablosunda
Soyadı alanın içeriğini listelemeye yarar.
Eğer DBCombo nesnesinden erişim sağlanan tablonun aktif kaydının ilgili alanın içeriğini
görüntülemek için kullanmak istiyorsanız RowSource ve ListField özellikleri yerine DataSource ve
DataField özelliklerinden yararlanmalısınız.
Örnek Program-1
Private Sub Form_Load()
Dim db As Database
Dim rs As Recordset
Set db =
DBEngine.Workspaces(0).OpenDatabase("C:\PERSONEL.mdb")
Set rs = db.OpenRecordset("PERBILGI")
While Not rs.EOF
‘PERBILGI table’sinde istediğiniz alan sıra numarasını girin
Combo1.AddItem rs.Fields(2)
rs.MoveNext
Wend
End Sub
Private Sub Text1_Change()
Combo1.ListIndex = SendMessage(Combo1.hwnd, CB_FINDSTRING, 1, ByVal CStr(Text1.Text))
End Sub
Module
Declare Function SendMessage Lib "user32"_
Alias "SendMessageA" (ByVal hwnd As Long,_
ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const CB_FINDSTRING = &H14C
330
Örnek Program-2
Private Sub Combo1_Change()
Dim Basla As Integer
Dim Katar As String
Static son As Integer
Basla = 1
Basla = Combo1.SelStart
If son <> 0 Then
Combo1.SelStart = son
Basla = son
End If
Katar = CStr(Left(Combo1.Text, Basla))
Combo1.ListIndex = SendMessage(Combo1.hwnd, CB_FINDSTRING, 1, ByVal CStr(Left(Combo1.Text, Basla)))
If Combo1.ListIndex = -1 Then
son = Len(Katar)
Combo1.Text = Katar
End If
Combo1.SelStart = Basla
son = 0
End Sub
Private Sub Form_Load()
Dim db As Database
Dim rs As Recordset
Set db =
DBEngine.Workspaces(0).OpenDatabase("C:\PERSONEL.mdb")
Set rs = db.OpenRecordset("PERBILGI")
While Not rs.EOF
Combo1.AddItem rs.Fields(2)
rs.MoveNext
Wend
End Sub
Module
331
Declare Function SendMessage Lib "user32"_
Alias "SendMessageA" (ByVal hwnd As Long,_
ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const CB_FINDSTRING = &H14C
8.g. Menü Hazırlamak (Menu Editor)
Menü üreticisini başlatmadan önce menü eklemek istediğiniz formu seçili duruma getirmelisiniz.
Menü üreticisini başlatmak için Tool menüsündeki Menu Editor komutundan yararlanılır (Şekil 8.g1).
Şekil 8.g-1
Visual Basic ile çalışırken Menu Editor’ü başlatmak için Tools menüsünden komut vermek yerine
direk CTRL+E tuşlarına birlikte basılabilir. ToolBar’daki bu düğmede tıklama yapar veya Tools
menüsünden Menu Editor komutunu verecek olursanız ekrana Menu Editor diyalog kutusu gelir
(Şekil 8.g-2).
332
Şekil 8.g-2
Hazırlayacağımız menünün adını ve başlığını Dosya olarak seçelim. Bu nedenle işe Menü Editör
penceresinde Caption ve Name metin kutularına “Dosya” adını yazmamız gerekir (Şekil 8.g-2).
Menünün kullanıcıya yansıyan şeklinde, menü başlığının ilk harfinin altı çizili olduğu için Caption
metin kutusunda "D” harfinin önüne “&” karakteri konulur (Şekil 8.g-3). Böylece “Dosya”
menüsünün tanımlanması işlemi bitmiş olur.
Şekil 8.g-3
Ancak bu menüde birkaç komuta yer vermek gerekirse ikinci bir menünün veya menüye ait
komutun girişini yapmak için Next düğmesinde tıklama yapılır veya pencerenin alt kısmında fare ile
menü adının hemen altında tıklama yapılır Şekil 8.g-4).
Şekil 8.g-4
333
Işıklı bant bu sırada herhangi bir menünün veya komutun üzerinde olmadığı için Caption ve Name
metin kutularının içerikleri boş olur. Bizim örnekte “Dosya” açılan menüsünde ilk sırada bulunan
komutun adı “Yeni” olsun. Bu nedenle Caption ve Name metin kutularına “Yeni” bilgisini yazalım.
Yeni başlıklı komutta “e” harfinin altı çizi olmasını istiyorsak bilgiyi girerken “&” karakterini “e”
harfinin önüne eklememiz gerekir.
Şekil 8.g-5
Şekil 8.g-5’ de görüldüğü gibi “Dosya” açılan menüsünde “Yeni” bir menü olmayıp bir komuttur.
Başka bir deyişle “Yeni” komutu olması gereken yerde değildir. Yeni komutunun hiyerarşik yer
bakımından bir basamak aşağıya alınması gerekir. Bu sağlamak için Menü editör penceresinde
üzerinde ucu sağ tarafa bakan ok işareti bulunan düğmede tıklama yapılmalıdır (Şekil 8.g-6).
Şekil 8.g-6
Word’de “Yeni” komutunu vermek için CTRL+N tuşları kullanılabilmektedir. Bu nedenle Yeni
komutu için Shortcut yani kısayol tuş vuruşu tanımlayalım.
Işıklı bandın üzerinde bulunduğu komut için kısayol tuş tanımlamak için Menü Editör
penceresindeki Shorcut liste kutusundan yararlanılır (Şekil 8.g-7).
334
Şekil 8.g-7
Komutların arasına çizgi koymak için Insert düğmesinde tıklama yapılır. Insert düğmesinde tıklama
yapılınca araya henüz adı ve başlığı olmayan bir komut eklenir. Komut başlığı olarak mutlaka tek tire
(-) kullanılmalıdır (Şekil 8.g-8).
Şekil 8.g-8
Visual Basic projeleri dahilinde hazırlanan bazı menü ve komutların menüde yer alması
engellenebilir veya gizlenebilir. Açılan bir menüyü veya menüdeki komutu ekrandan kaldırmak için
Visible özelliğinden, soluk göstermek için Enabled özelliğinden yararlanılır (Şekil 8.g-9).
335
Şekil 8.g-9
1. Menü ve Komutların Özellikleri
Seçme işareti yapmak için tasarım anında Checked onay kutusu seçili duruma getirilmelidir. Çok
sayıda özelliğe sahip olan menü ve komut nesnelerinin özelliklerini Properties penceresinde göstermek
ve değiştirmek imkanı yoktur.
Şekil 8.g-10
Menü komutlarının başlangıç özellikleri Menu Editor penceresinde seçilir. Çalışma anında istenen
komut nesnesinin Caption, Checked, Enabled ve Visible özellikleri program kodu yazılarak
değiştirilebilir. Aşağıda verilen ekran görüntüsünde Form_Load yordamına eklenen program satırı ile
proje çalıştırılır çalıştırılmaz menüdeki “Yeni” komutunun önüne seçme işaretinin kullanılması
sağlanmaktadır.
Private Sub Form_Load()
Yeni. Checked = True
End Sub
Açılan bir menüyü veya menüdeki komutu ekrandan kaldırmak için Visible özelliğinden
yararlanılır. Bu özellik Menü Editör penceresinde bir onay kutusu ile temsil edilmektedir.
Private Sub Form_Load()
Hücreler.Visible =False
Yeni. Visible
= False
Kaydet.Visible = False
End Sub
Bazen içinde bulunulan şartlarda kullanılma olanağı olmayan komutu menüden tümden silmek
yerine soluk renkte görünmesi sağlanır.
Private Sub Form_Load()
Kaydet. Enabled = False
Kapat.Enabled = False
336
End Sub
2. Örnek Program 1
Private Sub Form_Load()
mnuWhite.Enabled = False
mnuSmall.Enabled = False
End Sub
Private Sub mnuBlue_Click()
FORM1.BackColor = QBColor(1)
mnuBlue.Enabled = False
mnuRed.Enabled = True
mnuWhite.Enabled = True
Private Sub mnuRed_Click()
FORM1.BackColor = QBColor(4)
mnuRed.Enabled = False
mnuBlue.Enabled = True
mnuWhite.Enabled = True
End Sub
Private Sub mnuSmall_Click()
FORM1.WindowState = 0
mnuSmall.Enabled = False
337
End Sub
Private Sub mnuExit_Click()
End
End Sub
Private Sub mnuLarge_Click()
FORM1.WindowState = 2
mnuLarge.Enabled = False
mnuSmall.Enabled = True
End Sub
mnuLarge.Enabled = True
End Sub
Private Sub mnuWhite_Click()
FORM1.BackColor = QBColor(15)
mnuWhite.Enabled = False
mnuRed.Enabled = True
mnuBlue.Enabled = True
End Sub
3. Örnek Program 2
Option Explicit
Dim Element As Integer
Private Sub Form_Load()
' mnuItems[] array is 0.
Element = 0
mnuRemove.Enabled = False
End Sub
Private Sub mnuAdd_Click()
Element = Element + 1
338
' Add a new element to the mnuItems[] array.
Load mnuItems ( Element )
MnuItems ( Element ).Caption = "Item " + Str( Element )
MnuRemove.Enabled = True
End Sub
Private Sub mnuExit_Click()
End
End Sub
Private Sub mnuItems_Click(Index As Integer)
MsgBox "You selected Item " + Str( Index )
End Sub
Private Sub mnuRemove_Click()
Unload mnuItems ( Element )
Element = Element – 1
If Element = 0 Then
MnuRemove.Enabled = False
End If
End Sub
4. Pop-Up menüler...
Bildiğiniz gibi Pop-up menüler, WINDOWS 3.1 ile gelen ve bazı programlarda sağ fare tuşuna
basıldığında programla ilgili birtakım olayları gerçekleştirebilmenize yarayan menülerdir. Bu menüler
WINDOWS 95 kullananların ise artık eli ayağı durumundalar.
Visual Basic ile bu menüleri yaratmak çok kolay. Menü editörünü açın ve şekildeki gibi özellikler
taşıyan ve ismi "Pano" olan bir menü yaratın. Menünüzü yarattıktan sonra editörden çıkmadan sadece
"pano" isimli kısmı "görünmez" yapın. Editörden çıktığınızda yarattığınız menünün görülmediğini
fark edeceksiniz.
339
Form üzerindeki diğer kontrolleri de yarattıktan sonra programınızı çalıştırın ve text kutusunun üstüne
gidip "Sağ" fare tuşuna tıklayın. Karşınıza menü editörüyle yarattığınız menü bir pop-up menü olarak
çıkacaktır. Programınız çalışırken menülerin ayarlarıyla oynayabildiğinizden pop-up menüyü, normal
bir menü haline ikinci seçeneği seçerek dönüştürebilirsiniz.
Private Sub Form_Load()
pano.Visible = False
Option1.Value = True
End Sub
Private Sub Option1_Click()
pano.Visible = False
End Sub
Private Option2_Click()
pano.Visible = True Sub
End Sub
Private Sub tarih_Click()
Text1.Text = Text1.Text & Now
End Sub
Private Sub sil_Click()
Text1.Text = ""
End Sub
Private Sub Text1_MouseUp(Button As Integer, Shift As Integer,
X As Single, Y As Single)
If pano.Visible = True Then GoTo atla
If Button = 2 Then
PopupMenu pano
End If
Atla:
340
End Sub
Örnek / Popup Menü
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = 2 Then PopupMenu mnuFile
End Sub
Private Sub Label1_MouseDown(Button As Integer, Shift As
Integer, X As Single, Y As Single)
If Button = 2 Then PopupMenu mnuFile
End Sub
341
8.h. Araç Çubuğu Hazırlamak
Ekranın bir satırı boyunca bir araya getirilmiş düğmelerin hepsine birden Araç Çubuğu adı
verilmektedir. Visual Basic’te araç çubuğu hazırlamaya yönelik olarak Toolbar adında bir kontrol
bulunmaktadır. Ancak Toolbar kontrolü başlangıçta projeye dahil edilmediği için Toolbox
penceresinde bir düğme ile temsil edilmemektedir. Bu nedenle Project menüsündeki Components
komutundan yararlanıp Components diyalog kutusunu ekrana getirmeniz gerekir (Şekil 8.h-1).
Şekil 8.h-1
Components diyalog kutusunda “Microsoft Windows Common Controls” onay
kutusunu seçili duruma getirip diyalog kutusunu Tamam düğmesi ile kapatırsanız
Toolbar kontrolü de dahil olmak üzere üzerinde çalıştığınız projeye TabStrip,
Progrees Bar, Status Bar, List View, Image List, Slider ve ImageCombo adında
9 kontrol eder.
Şekil 40-2’de verilen ekran görüntüsünü üzerine çalışılan projenin formuna bir Toolbar nesnesi
dahil ettikten sonra alalım. Toolbar nesnesi dahil edildiği formun bütün genişliğini kapsamaktadır.
Başka bir deyişle Toolbar nesnesinin genişliği dahil edildiği formun genişliğine bağlı olarak otomatik
olarak belirlenmektedir. Properties penceresinde Toolbar nesnesinin genişliğinin değiştirilmesine izin
verilmez.
Şekil 8.h-2
342
Eğer forma yerleştirmiş olduğunuz Toolbar nesnesini formun başka bir kenarına almak istiyorsanız
Toolbar nesnesinin Align özelliğinden yararlanabilirsiniz. Eğer araç çubuğunu formun alt kenarına
almak istiyorsanız Align özelliğine “2-vbAlignBottom” değerini aktarmanız gerekir (Şekil 8.h-3).
Şekil 8.h-3
Şekil 8.h-4
Şekil 8.h-2’de verilen ekran görüntüsünde tespit etmiş olabileceğiniz gibi forma yerleştirdiğiniz
Toolbar nesnesinin sınırları pek belli değildir. Eğer Toolbar nesnesinin sınırlarının belli olmasını
istiyorsanız Toolbar nesnesinin BorderStyle özelliğinden yararlanmanız gerekir (Şekil 8.h-4).
Başlangıçta “0-ccNone” değerini içeren BorderStyle özelliğine Properties penceresinden
yararlanarak
“1-ccFixelSingle” değerini aktaracak olursanız Toolbar nesnesi aşağıdaki şekle
dönüşür.
Şekil 8.h-5
Toolbar nesnesi bu şekilde hazırlandıktan sonra sıra Toolbar nesnesinin üzerine menülerdeki
komutları temsil edecek düğmeleri yerleştirmeye gelir. Toolbar nesnesinin üzerine yerleştirilecek
düğmeler için Toobar nesnesinin Custom özelliğinden yararlanmanız gerekir.
343
Properties penceresinde ışıklı bantı Custom özelliğinin üzerine götürdüğünüzde Custom özelliğine
ait satırın sonuna bir düğme eklenmektedir. Bu düğmede tıklama yaptığınızda Toolbar nesnesinin bir
çok özelliğini değiştirebileceğiniz Property Pages deiyalog kutusu ekrana gelir. Ekrana gelen Property
Pages diyalog kutusunda seçim ve ayarlamalar için 3 sekme bulunmaktadır (Şekil 8.h-6).
Şekil 8.h-6
General sekmesindeki seçeneklerle Toolbar nesnesine yerleştirilecek düğmelerinin boyutlarını
belirliyebilir veya balon yardım tekniğinin kullanılıp kullanılmayacağı konusunda seçim
yapabilirsiniz. Toolbar nesnesine düğme yerleştirmek için Buttons sekmesine geçmek gerekir (Şekil
8.h-7).
344
Şekil 8.h-7
Şekil 8.h-7’de ki görüntüsü alondığı zaman üzerinde çalışılan projenin formuna yerleştirmiş
Toolbar nesnesinin üzerine konulmuş bir düğme yoktu. Bu nedenle Buttons sekmesindeki Insert
Button düğmesinin dışında bütün seçenekler kullanılamaz durumdadır.. Araç çubuğuna bir düğme
dahil etmek üzere Insert Button düğmesinde tıklama yapılınca araç çubuğuna bir düğme dahil edilir
ve Property Pages diyalog kutusu Şekil 8.h-8’deki şekle dönüşür.
345
Şekil 8.h-8
Bu şekilde araç çubuğuna bir düğme dahil ettikten sonra bu düğmenin özelliklerini belirlemeniz
gerekir. Örneğin çalışma anında fare işareti bu düğmenin üzerinde kısa bir süre bekletildiği zaman
ekrana küçük bir kutu içinde getirilecek yardım bilgisini ToolTip Text metin kutusuna yazmanız
gerekir.
Benzer şekilde Insert Button düğmesinde tekrar tıklama yaparak istediğiniz sayıda düğmeyi araç
çubuğuna dahil edebilirsiniz. Bu sırada başka herhangi bir işlem yapmadan Toolbar Properties diyalog
kutusunu Tamam düğmesi ile kapatacak olursanız Forma yerleştirmiş olduğunuz araç çubuğu Şekil
8.h-9’ da verilen şekle dönüşür.
Şekil 8.h-9
346
Toolbar nesnesine düğme ekleme işleminden sonra sıra düğmenin üzerine yerleştirilecek küçük
resim veya kona gelir. Toolbar nesnesinin üzerine yerleştirdiğiniz düğmeler için resim seçimi için
İmageList kontrolünden yararlanmanız gerekir.
Şekil 8.h-10
Toolbox penceresinde ImageList kontrolünü temsil eden düğmeyi seçili duruma getirdikten sonra
formun üzerine ImageList nesnesini yerleştirmeniz gerekir (Şekil 8.h-10). Forma yerleştirilen ilk
İmageList nesnesine “ImageList1” adı verilmektedir. Ayrıca ImageList nesnesi çalışma anında formun
üzerinde görüntülenemediği için standart büyüklüğe sahip olmaktadır.
Şekil 8.h-11
ImageList nesnesinden Toolbar nesnesinin üzerine konulacak düğmeler için resim seçerken
ImageList nesnesinin Custom özelliğinden yararlanılır (Şekil 8.h-11). Properties penceresinde forma
yerleştirmiş olduğumuz İmageList nesnesinin özellikleri varken ışıklı bantı Custom özelliğinin üzerine
götürüp bu özelliğe ait düğmade tıklama yaparsanzı ekrana Property Pages diyalog kutusu gelir. Bu
diyalog kutusunda ImageList nesnesi ile ilgili olarak yapılabilen işlemler 3 ayrı sekmeye ayrılmış
durumdadır.
347
Şekil 8.h-12
General sekmesindeki seçeneklerle İmageList nesnesine dahil edilecek resim veya ikonların
boyutları belirlenmektedir (Şekil 40-12). ImageList nesnesi için resim dosyası seçme işlemi Images
sekmesindeki seçeneklerle yapılmaktadır (Şekil 40-13).
348
Şekil 8.h-13
Bu ekran görüntüsünü aldığım sırada ImageList nesnesine dahil edilmiş olan herhangi bir nesne
yoktu. Bu nedenle yalnızca Insert Picture düğmesi kullanılabilir durumdadır. ImageList nesnesine
resim dosyası dahil etmek üzere Insert Picture düğmesinde tıklama yapmanız gerekir. Ekrana resim
dosyası seçimi yapılan Select Picture diyalog kutusu gelir (Şekil 8.h-14). Bu diyalog kutusunda
istediğiniz gibi resim dosyası seçimi yapabilirsiniz.
Şekil 8.h-14
Dosya seçiminden sonra Aç düğmesi ile Select Picture diyalog kutusu kapatılırsa tekrar Property
Pages diyalog kutusuna dönülür. Bu sırada diyalog kutusunda seçilen resim küçük bir kutunun içinde
görüntülenir. Bu sırada Remove Picture düğmesinde tıklama yaparak ImageList nesnesine dahil
edilen resim silinebilir.
349
Şekil 8.h-15
Tekrar Insert Picture düğmesinde tıklama yaparak ImageList nesnesinde istediğiniz resim dosyasını
dahil edebilirsiniz. Şekil 8.h-15’de verilen ekran görüntüsüne İmageList nesnesine 4 ayrı resim
dosyasını dahil edildikten sonra alınmıştır.
Bu şekilde resim seçme işleminden sonra Property Pages diyalog kutusunu Tamam düğmesinde
tıklama yaparak ImageList nesnesi ile ilgili olarak yapmak istediğimiz işlemleri tamamladık. Bu
işlemlerden sonra tekrar Toolbar nesnesine ait Property Pages diyalog kutusunu getirelim. Toolboar
nesnesinin üzerine yerleştirdiğiniz düğmelerde kullanılacak resimleri hangi ImageList nesnesinden
almak istiyorsanız ImageList liste kutusunda seçim yapmanız gerekir (Şekil 8.h-16). Formun üzerinde
değişik amaçlar için kullanmak üzere birden fazla ImageList nesnesi yerleştirmiş olabilirsiniz. Aşağıda
verilen ekran görüntüsünü aldığımız sırada üzerinde çalıştığımız formda “”ImageList1” adında
yalnızca bir ImageList nesnesi vardı.
350
Şekil 8.h-16
General sekmesinde ImageList nesnesi seçimini yaptıktan sonra düğmeler için resim seçimi
yapabilmek için Buttons sekmesine geçelim. ImageList nesnesine yerleştirmiş olduğumuz ilk resmi
Tolbar nesnesindeki ilk düğmede kullanmak istediğimiz için Image başlıklı sayı kutusuna “1” yazarız
(Şekil 8.h-17).
351
Şekil 8.h-17
Hazırladığımız araç çubuğuna Inser Button düğmesinden yararlanarak birden fazla düğme
yerleştirirseniz, hangi düğme için resim seçimi yapmak istediğiniz Index başlıklı sayı kutusunda önce
o düğmeyi seçmelisiniz. Ardından Image başlıklı sayı kutusna 2 değerini ve ToolTipsText başlıklı
metin kutusuna ise hazırlamak istediğiniz araç çubuğundaki 2. düğme için balon yardım metnini
girmelisiniz.
352
Şekil 8.h-18
Bu şekilde hazırlanan araç çubuğundaki düğmelerde çalışma anında tıklama yapsanız bile Visual
Basic size bir tepkide bulunmaz. Araç çubuğuna yerleştirdiğiniz düğmelere görev atayabilmeniz için
düğmelere Key özelliğinden yararlanarak ad vermeniz gerekir (Şekil 8.h-19). Araç çubuğundaki
düğmelerden birinin üzerinde tıklama yapmanız halinde ButtonClick yordamı işetilecektir. Ancak
araç çubuğunda birden fazla düğme bulunacağından özellikle çalışma anında tıklama yapılan
düğmenin belirlenmesi gerekir. Çalışma anında hangi düğmede tıklama yapılmışsa o düğmenin adı
Button nesnesinin Key özelliğine aktarılır. Button parametresinin Key özelliğinin içeriğine bakılarak
çalışama anında hangi düğmede tıklama yapıldığı öğrenilebilir.
Şekil 8.h-19
Forma yerleştirmiş olduğunuz araç çubuğundaki düğmelere çalışma anında tıklama yapıldığı zaman
yapılacak işlemleri belirlemek üzere önce program kodu yazılan pencereyi açmanız gerekir. Aşağıda
verilen ekran görüntüsünü tasarım anında Toolbar nesnesinin üzerinde çift tıklama yaptıktan sonra
aldım. Aşağıda verilen ekran görüntüsünden tespit edebileceğiniz gibi çalışma anında araç
çubuğundaki düğmelerden birine tıklama yapmanız halinde ButtonClick yordamı işetilecektir (Şekil
8.h-20).
Şekil 8.h-20
Ancak araç çubuğunda birden fazla düğme bulunacağından öncelikle çalışma anında hangi
düğmede tıklama yapılmışsa o düğmenin Button nesnesinin Key özelliğine aktarılır. Button
353
parametresinin Key özelliğinin içerisine bakılarak çalışma anında hangi düğmede tıklama yapıldığı
öğrenilebilir.
Private
Sub
Toolbar1_ButtonClick(ByVal
Button
As
ComctlLib.Button)
Select Case Button.Key
Case “Save”
MsgBox “Kaydet düğmesinde tıklama yaptınız”
End Select
End Sub
Anlatılan şekilde araç çubuğuna dahil ettiğiniz düğmelerde yapıldığı zaman yapılacak işlemleri
veya işletilecek yordamları belirleyebilirsiniz. Eğer araç çubuğundaki düğmelere resimden başka bir
düğmenin üzerine bilgi yazacaksanız Toolbar Control Özellikleri diyalog kutusunda Caption
özelliğinden yararlanabilirsiniz.
Şekil 8.h-21
Aşağıda verilen ekran görüntüsünü hazırlamış olduğum araç çubuğundaki birinci düğme başlık
bilgisini girdikten sonra çalışma anında aldım. Düğmeye başlık bilgisi verilence Visual Basic
düğmelerinin boyutları yeniden ayarlandı.
Anlatılan şekilde projenin formuna araç çubuğu olarak kullanmak üzere istediğiniz sayıda Toolbar
nesnesi ve istediğiniz sayıda düğme dahil edebilirsiniz. Hazırlamış olduğunuz bütün araç çubukları
aynı anda ekranda göstermek zorunda değilsiniz.
Şekil 8.h-22
Bu amaçla yukarıdaki sayfalarda hazırladığım ilk araç çubuğuna veya Toolbar nesnesine “Standart”
adını verelim. Ardından projenin formuna “Biçim” adında ikinci bir Toolbar nesnesi dahil edelim.
Forma yerleştirdiğim ikinci araç çubuğunda kullanılacak resimler için forma ikinci bir ImageList
nesnesi yerleştirelim. Bu işlemlerden sonra diyalog kutusu olarak kullanmak üzere üzerinde
çalıştığımız projeye ikinci bir form dahil edelim. Bu forma iki onay kutusu ve iki düğme yerleştirelim
(Şekil 8.h-23).
354
Şekil 8.h-23
Başlangıçta her iki araç çubuğu da ekranda görüntülenecek. Ancak bu araç çubuklardan birisi
ekrandan kaldırılmak istendiği zaman Görünüm menüsündeki Araç Çubukları komutu verilecek. Araç
Çubukları komutu ile Form2 ekrana gelecek. Bu nedenle Görünüm menüsündeki Araç çubuklar
komutu için aşağıda ekran görüntüsünü verdiğimiz yordamı hazırlayalım.
Private Sub Command1_Click()
If Check2.Value = Unchecked Then
Toolbar1.Visible = False
End If
If Check1.Value = Unchecked Then
Toolbar2.Visible = False
End If
End Sub
Şekil 8.h-24
Örnek / Kabartma ToolBar Hazırlamak
Şekil 8.h-25
Private Declare Function SendMessage Lib "user32" Alias
"SendMessageA" (ByVal HWnd As Long, ByVal wMsg As Long, ByVal
wParam As Integer, ByVal lParam As Long) As Long
355
Private Declare Function FindWindowEx Lib "user32" Alias
"FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long,
ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Const
Const
Const
Const
WM_USER = &H400
TB_SETSTYLE = WM_USER + 56
TB_GETSTYLE = WM_USER + 57
TBSTYLE_FLAT = &H800
Private Sub SetToolBarFlat(tlbTemp As Toolbar)
Dim lngStyle As Long
Dim lngResult As Long
Dim lngHWND As Long
lngHWND = FindWindowEx(tlbTemp.HWnd, 0&, "ToolbarWindow32",
vbNullString)
lngStyle = SendMessage(lngHWND, TB_GETSTYLE, &O0, &O0)
lngStyle = lngStyle Or TBSTYLE_FLAT
lngResult = SendMessage(lngHWND, TB_SETSTYLE, 0, lngStyle)
tlbTemp.Refresh
End Sub
Private Sub Form_Load()
Call SetToolBarFlat(Toolbar1)
End Sub
356
8.i. Ortak- Common Diyalog Kutuları
Common Dialog kontrolü projelere otomatik olarak dahil edilmediği için Project menüsündeki
Components komutu ile ekrana getirilen Components diyalog kutusundan yararlanmanız gerekir.
Şekil 8.i-1
Components diyalog kutusunda Common Dialog kontrolünü temsil eden onay kutusunu seçili
duruma getirip tamam düğmesinde tıklama yapacak olursanız üzerinde çalıştığınız projeye Common
Dialog kutusu dahil edilir ve Toolbox penceresine Coomon Dialog kontrolünü temsil eden bir düğme
yerleştirilir.
Şekil 8.i-2
357
Aktif forma eklenen ilk Common Dialog nesnesine CommonDialog1 adı verilmektedir. Çalışma
anında CommonDialog nesnesi formun üzerinde görünmez. Projeye eklenen CommonDialog
nesnesinden yararlanmak veya Windows’un Yazıcı, Aç ve Font gibi diyalog kutularından birini ekrana
getirmek için çalışma anında tanımlı olan Action değişkeninden yararlanılır. Başlangıçta bu
değişkenin içeriği 0 ‘dır. Common Dialog nesnesine ait Action değişkeninin içeriği 0 iken projedeki
Common nesnesi pasif duruma geçer. Eğer ekrana Yazıcı diyalog kutusunu getirmek istiyorsanız
Action değişkenine 5, Aç diyalog Kutusunu getirmek istiyorsanız bu kez Action değişkenine çalışma
anında 1 değerini aktarmalısınız. Action değişkeninin alabileceği değerler ve anlamları aşağıdaki
tabloda verildiği gibidir.
Aç, Farklı kaydet ve Yazıtipi diyalog kutularını ekrana getirmek için CommanDialog nesnesine ait
Action özelliğine değer aktarmak yerine ShowOpen, ShowSave, ShowColor, ShowPrint ve
ShowFont metolarından yararlanabilirsiniz.
Action İçeriği
0
1
2
3
4
5
6
Dialog Kutusu Türü
İşlevsiz
Dosya Açma
Yeni Adla Kaydet
Renk Paleti
Fontlar
Yazdırma
Help
Setting Description
No Action.
Displays Open dialog box.
Displays Save As dialog box
Displays Color dialog box.
Displays Font dialog box.
Displays Printer dialog box.
Runs WINHLP32.EXE
ShowOpen
ShowSave
ShowColor
ShowFont
ShowPrint
1. Aç Diyalog Kutusu
Private Sub DosyaAç_Click()
CommonDialog1.Action
1
End Sub
Private Sub DosyaAç_Click()
=
CommonDialog1.ShowOpen
End Sub
Çalışma anında Dosya Aç başlıklı düğmede tıklama yapılırsa, bu program satırı sayesinde
Common Dialog nesnesine ait Action özelliğine 1 değeri aktarılır ve ekrana Aç diyalog kutusu gelir.
Common Dialog nesnesi yardımıyla ekrana getirilen diyalog kutularının başlıkları o sırada kullanılan
Windows sürümünden etkilenmektedir.
358
Şekil 8.i-3
Aç diyalog kutusunda seçilen dosyanın adı diyalog kutusu nesnesine ait FileName değişkenine
aktarılır. Başlangıçta bu değişkenin içeriği boştur. Çalışma anında diyalog kutusunda istenen dosya
seçilip Aç düğmesinde tıklama yapılırsa seçilen dosyanın adı bulunduğu sürücü ve klasör adıyla
birlikte FileName değişkenine aktarılır.
Private Sub Form_Click()
MsgBox CommonDialog1.FileName
End Sub
2. Flags Özelliği
Aç diyalog kutusunda kullanıcının dosya seçip seçmediğini veya diyalog kutusunu iptal düğmesi
ile kapatıp kapatmadığını Common Dialog nesnesine ait Flags değişkeninden yararlanarak
öğrenebilirsiniz. Başlangıçta 0 değerini içeren Flags değişkenin içeriği çalışma anında Aç diyalog
kutusu ile ilgili olarak yapılan işlemlere bağlı olarak güncelleşmektedir.
359
Şekil 8.i-4
Eğer kullanıcı Aç diyalog kutusunu iptal düğmesinde tıklama yapacak olursa Flags değişkeni 0
değerini içermeye devam eder. Eğer Aç diyalog kutusunda bir dosyayı seçip diyalog kutusunu Aç
düğmesi ile kapatacak olsaydınız Flags değişkenine bu kez 1024 değeri aktarılırdı. Aç diyalog
kutusundaki Salt okunur aç onay kutusunu seçili durumda iken dosya seçimi yapıp diyalog kutusunu
Aç düğmesi ile kapatacak olursanız Flags değişkenine bu kez 1025 değeri aktarılır.
Private Sub Form_Click()
CommonDialog1.ShowOpen
MsgBox CommonDialog1.Flags
End Sub
Common Dialog nesnesi yardımıyla Visual Basic projeleri dahilinde ekranda getirdiğiniz Aç
diyalog kutusunda aynı anda birden fazla dosyanın seçilebilmesine imkan sağlamak istiyorsanız
tasarım anında Properties penceresinde veya program kodu yazarak çalışma anında Flags özelliğine
512 sayısal değerini aktarmanız gerekir. Aç diyalog kutusu ekrana gelir gelmez hangi tür dosyaların
listelenmesini istiyorsanız Properties penceresinde FileName özelliğinden yararlanarak dosya seçimi
yapmanız gerekir.
360
Eğer CommonDialog nesnesinin Flags özelliğine 4096 değerini aktarırsanız geçerli sürücü ve
klasörde olmayan bir dosyanın adını Dosya adı yazılan metin kutusuna yazıp Aç düğmesine tıklama
yaparsanız aşağıdaki gibi bir diyalog kutusu ekrana getirilerek size uyarıda bulunulur.
C:\VB5\Adres.txt
Bu dosya bulunamadı
Doğru yol ve dosya adının verildiğinden emin olun
Eğer Flags özelliğinin 8192 değerini içerdiği bir sırada geçerli klasörde olmayan bir dosyanın adını
Dosya Adı metin kutusuna doğrudan yazıp Aç düğmesine tıklama yaparsanız aşağıda ekran görüntüsü
verilen diyalog kutusu ile Visual Basic size uyarıda bulunur.
Aç
C:\VB5\Adres.txt
Bu dosya yok
Yaratmak istiyor musunuz?
Evet
Şekil 8.i-5
Hayır
3. DialogTitle Özelliği
Common Dialog nesnesi aracılığı ile ekrana getirilen diyalog kutusunun başlığı nesneye ait
DialogTitle değişkeninde saklanmaktadır. DialogTitle değişkeninin içeriği başlangıçta boştur. Çalışma
anında Action değişkenine aktarılan değere bağlı olarak Dialog Title değişkenin içeriği otomatik
olarak belirlenir.
Şekil 8.i-6
Common nesnesinin Dialog Title özelliğinde program kodu yazarak ta çalışma anında diyalog
kutusunun başlığını değiştirebilirsiniz.
361
Private Sub Form_Load()
CommonDialog1.DialogTitle = “Dosya Açma”
CommonDialog1.Action = 1
End Sub
Eğer Aç diyalog kutusunda geçerli sürücü ve klasördeki bütün dosyaların listelenmesini
istemiyorsanız Common Dialog nesnesine ait FileName değişkeninden yararlanabilirsiniz. Bunun için
tasarım anında Properties penceresinden yararlanarak FileName değişkenin içeriğinde değişiklik
yapabilirsiniz. Program kodu yazarakta dosyaları listeleyebilirsiniz.
Şekil 8.i-7
Private Sub Form_Load()
CommonDialog1.DialogTitle = “Dosya Açma”
CommonDialog1.Filename = “*.VBP “
CommonDialog1.Action = 1
End Sub
Dosya türü liste kutusu aracılığı istenen dosyaların diyalog kutusu içinde listelenmesi sağlanabilir.
Aynı liste kutusunu CommonDialog kontrolü ile ekrana getirilen Aç diyalog kutusunda oluşturmak
362
mümkündür. Bunun için Common kontrolüne ait Filter değişkeninden yararlanılır. Common
nesnesine ait Filter değişkeni aşağıdaki şekilde değiştirilip proje çalıştırılacak olursa Aç diyalog
kutusunun sol alt köşesindeki liste kutusuna “Text dosyalar” ve “Resimler” adında iki seçenek eklenir.
Private Sub Form_Load()
Dialog1.Filter =”Text dosyalar _
(*.txt)| .txt|Resimler (.bmp;*.ıco)|*.bmp;*.ıco”
Dialog1.Action = 1
End Sub
Normal şartlarda Aç diyalog kutusu Common Dialog nesnesi aracılığı ile ekrana getirilirken o
sırada geçerli olan sürücü ve klasördeki dosyalar listelenir.
Diyalog kutusu ekranda iken kullanıcı sürücü ve
klasör seçimi yapılabilir. O anda geçerli olan sürücü ve
klasörün adı Common Dialog nesnesine ait InitDir
değişkeninde saklanır. Eğer Aç diyalog kutusu ekrana
gelir gelmez belirli bir sürücü ve klasördeki dosyaların
listelenmesini istiyorsanız söz konusu sürücü ve
klasörün adını InitDir değişkenine aktarmalısınız.
Private Sub Form_Load()
Dialog1.InitDir = “C.\VB5”
Dialog1.Action = 1
End Sub
Şekil 8.i-8
4. Farklı Kaydet (Save As) Diyalog Kutusu
Aç diyalog kutusunda olduğu gibi Word ve Excel gibi programlarda kullanılan Farklı Kaydet
diyalog kutusunu ekrana getirmek için yine Common Dialog kontrolünden yararlanılır.
Private Sub Form_Load()
CommonDialog1.Action
=
2
363
End Sub
Üzerinde çalıştığınız projenin formunun Form_Load yordamına yazdığınız bu program satırı
sayesinde proje çalıştırılır çalıştırılmaz ekrana Farklı Kaydet diyalog kutusu gelir. Kullanıcı
kendisinden istediğiniz dosyanın adını doğrudan “Dosya adı” metin kutusuna yazabileceği gibi mevcut
dosyalardan birini seçebilir. Dosya adı metin kutusuna doğrudan yazılan veya listelenen dosyaların
içinden seçilen dosyanın adı Common Dialog nesnesine ait FileName değişkenine aktarılır. Eğer
dosya seçimi yapılıp Farklı Kaydet diyalog kutusunu Kaydet düğmesi ile kapatacak olursanız Flags
değişkenine 1024 değeri aktarılır. Eğer diyalog kutusunu İptal düğmesi ile kapatacak olursanız Flags
değişkenine bu kez 0 değeri aktarılır.
Şekil 8.i-9
Farklı kaydet diyalog kutusunda adı doğrudan girilen dosyalar için varsayılan uzantıyı belirlemek
için Common nesnesine ait DefaultExt değişkeninden yararlanılır. Bu değişkenin içeriği başlangıçta
boştur (Şekil 8.i-10).
364
Şekil 8.i-10
Farklı Kaydet diyalog kutusunu Kaydet düğmesi ile kapatacak olursanız adını girdiğiniz dosyanın
adına DefaultExt değişkenin içeriği eklenir ve FileName değişkenine aktarılır.
Benzer diyalog kutusunu Visual Basic projeleri dahilinde ekrana getirmek istiyorsanız Farklı
Kaydet diyalog kutusunu ekrana getirmek üzere forma eklemiş olduğunuz CommanDialog nesnesinin
Flags özelliğine 2 değerini aktarmanız gerekir.
Şekil 8.i-11
365
Farklı Kaydet diyalog kutusunun bu özelliğini anlatmak için Flags değişkenine Properties
penceresinden yararlanarak 2 değerini aktardıktan sonra Farklı Kaydet diyalog kutusunu ekrana
getirelim. Ardından geçerli klasörde bulunan bir dosyanın adını Dosya adı metin kutusuna yazıp
Kaydet düğmesinde tıklama yapınca Visual Basic Şekik 22-12’de verilen diyalog kutusunu ekrana
getirir.
Şekil 42-12
5. Font- Yazıtipi Diyalog Kutusu
Font diyalog kutusunu ekrana getirebilmek için çalışma anında Common nesnesine ait Action
özelliğine 4 değerini aktarmak gerekir.
Private Sub Fontlar_Click()
CommonDialog1.Action
= 4
End Sub
366
Bu yordam sayesinde çalışma anında Forma eklenen düğmede tıklama yapılınca ekrana Font ve
punto seçimi yapılan diyalog kutusu gelir (Şekil 8.i-13).
Şekil 8.i-13
Private Sub Fontlar_Click()
CommonDialog1.Action
Text1.FontName =
= 4
CommonDialog1. FontName
Text1.Text = CommonDialog1.FontName
End Sub
Çalışma anında seçilen fontun adını formdaki metin kutusuna yazarak font düğmesine basarsak
Yazıtipi diyalog kutusu fontlar seçilmiş olarak gelir. Bu şekilde font seçimi yapıp Yazıtipi diyalog
kutusunu kapatacak olursanız seçtiğiniz font Common nesnesine ait FontName değişkenine aktarılır.
Yazıtipi diyalog kutusunda font seçiminden başka punto yani büyüklüğünü belirliyebilir veya font
değişikliğinden etkilenecek bilgilerin koyu veya italik olmasını sağlayabilirsiniz.
367
Şekil 8.i-14
Private Sub Fontlar_Click()
CommonDialog1.Action = 4
Text1.FontName =
Text1.FontSize
CommonDialog1. FontName
=
CommonDialog1. FontSize
End Sub
Yazıtipi diyalog kutusunda font ve punto değerinden başka Yazıtipi Biçemi (Style)
seçilebilmektedir. Eğer tazıtipi biçemi olarak Bold veya Kalını seçip Yazıtipi diyalog kutusunu
Tamam düğmesi ile kapatacak olursanız Common nesnesine ait FontBold özelliğine True değeri
aktarılır. Benzer şekilde fonta İtalik özelliği verirseniz Common nesnesine ait FontItalic özelliğine
mantıksal True değeri aktarılır.
Şekil 8.i-15
368
Yazıtipi diyalog kutusunun bir çok özelliğini Properties penceresinde Custom özelliğinden
yararlanarak belirliyebilirsiniz. Bu diyalog kutusundaki Min ve Max sayı kutuları ile fontlar için en
küçük ve en büyük punto değerleri için sınır değerleri belirlenmektedir. Üstü çizili, Altı çizili ile renk
seçimi yapabilmek için Common nesnesine ait Flags özelliğine tasarım anında Properties
penceresinden yararlanarak veya program kodu yazarak çalışma anında 258 değerini aktarmanız
gerekir.
Eğer Yazıtipi diyalog kutusunda yalnızca TrueType teknolojisi ile hazırlanmış fontların
listelenmesini istiyorsanız Flags değişkenine 131074 değerini aktarmanız gerekir. Bu değeri Flags
değişkenine aktarıp Yazıtipi diyalog kutusunu ekrana getirecek olursanız Etkiler (Effects) adı altında
bir araya getirilen seçenekler diyalog kutusundan kaldırılır. Eğer Yazıtipi diyalog kutusunda hem
yalnızca TrueType fontların listelenmesini hem de Etkiler adı altında bir araya getirilen seçeneklerin
olmasını istiyorsanız 131330 (131074 + 256) değerini aktarmanız gerekir.
6. Print – Yazdır Diyalog Kutusu
Yazdır diyalog kutusunu ekrana getirmek için önce o sırada ekranda olacak formun üzerine bir
Common Dialog nesnesi yerleştirmeniz gerekir. Ardından çalışma anında Common Dialog nesnesine
ait Action değişkenine 5 değerini aktarmanız gerekir.
369
Private
Sub
Fontlar_Click()
CommonDialog1.Action
= 5
End Sub
Şekil 8.i-16
7. Renk – Color Diyalog Kutusu
Yazdırma öncesi kullanıcıya renk seçme şansını vermek istiyorsanız Common Dialog nesnesi
yardımıyla ekrana getirilen Renk diyalog kutusundan yararlanabilirsiniz. Özel renk tanımı yapılan
kısmın açılıp ekrana gelmesini istiyorsanız Common Dialog nesnesine ait Flags özelliğine Properties
penceresinden yararlanarak veya program kodu yazarak 3 değerini aktarmanız gerekir.
Private Sub Fontlar_Click()
CommonDialog1.Action = 3
End Sub
Renk diyalog kutusunun ekrana getirmek için CommonDialog nesnesinin Action özelliğine 3
değerini aktarmak yerine ShowColor methodunu kullanabilirsiniz.
Private Sub Fontlar_Click()
CommonDialog1.ShowColor
End Sub
370
Şekil 8.i-17
Private Sub Form_Click()
CommonDialog1.Action= 3
Form1.Backcolor = CommonDialog.Color
End Sub
Bu yordam sayesinde Renk diyalog kutusunda seçilen renk formun Backcolor özelliğine
aktarılacağı için Formun renginde değişiklik meydana getirir.
8.j. Hata Ayıklama
·
·
·
·
Tanımlanmayan Değişkenleri Belirlemek
Breakpointsler İle Kod Bloklarını Kontrol Etmek
o Watches İle Değişken Değerlerini Görüntülemek
o Program Kodunu İncelemek İçin Kod İçinde Gezmek
İleri Hata Ayıklama Araçları
Hata Yakalama
371
Tanımlanmayan Değişkenleri Belirlemek
Kodlama yaparken şekil 8j.1 de görülen syntax hatalarına benzer hatalar
yaptığınızda, geliştirme ortamı hatayı hemen belirler ve size düzeltme imkanı verir.
Syntax hataları imal hataları ve Visual Basic sözcüklerinin yanlış yerleştirilmesinden
kaynaklanır. Bu tür hataların bulunması ve düzeltilmesi kolaydır.
FIGURE 8.j.1 Syntax Hataları
Syntax hatalarını otomatik olarak yakalamak için, Tools menüsünün options
elemanının seçiminde ekrana gelen diyalog kutusunda Auto Syntax Check onay
kutusunun seçili olması gerekir.
Option Explicit seçilmemişse Visual Basic size değişkeni tanımlamadan kullanmanıza
imkan verir. Form veya Modül’ün general section bölümüne Option Explicit
yazarsanız kodunuz içinde kullanacağınız değişkenleri mutlaka Public, Private, Dim,
veya Static ile tanımlamanız gerekir.
Aşağıdaki örnekte intMyNum değişkeni üzerinde işlemler yapılmış ve sonucu
ekranda gösterilmek istenmiş ancak ismi intMyNim şeklinde yanlış yazılmıştır. Eğer
Option Explicit seçilmemişse derleme sırasında hata mesajı almazsınız ve programı
372
çalıştırdığınızda size hep 0 değerini verir. Programınız hatasız olmasına rağmen
doğru sonucu vermemektedir. Eğer Option Explicit seçilmiş olsaydı değişkenin yanlış
yazıldığını “bu değişken tanımlanmamış mesajından” anlayacaktınız.
01
02
03
04
05
06
07
Private Sub cmdUnWit_Click()
Dim intMyNum As Integer
intMyNum = 2 + 2
MsgBox CStr(intMyNim)
End Sub
Breakpointsler İle Kod Bloklarını Kontrol Etmek
BreakPointler ile Visual Basic kodunuzun çalışmasını istediğiniz noktada durdurabilir
ve kodunuzu inceleyebilirsiniz. BreakPointi dört şekilde tanımlayabilirsiniz.
·
·
Programı dudurmak istediğiniz kod satırını işaretleyin ve F9 tuşuna basın.
Satır üzerindeyken standart araç çubuğu üzerinde BreakPoint düğmesini
tıklayın.
·
Satır üzerindeyken Debug menüsünden Toggle Breakpoints üzerine tıklayın.
·
Kod penceresinden ilgili sstırın sağındaki margin üzerine tıklayın.
BreakPoint tanımladığınız satırın rengi kırmızı olur. Programı çalıştırdığınızda,
breakpoint tanımladığınız satırda program durur ve bu satırın regi sarıya dönüşür. Bu
satırın sağında bir ok belirir.
Hataların hepsi syntax hataları değildir. Çoğu hata mantık hataları ve yanlış tasarım
nedeniyle oluşur. Bu hataları bulmak zordur. Breakpointler kullanarak hatanın
oluşabileceğini düşündüğünüz kod alanını daraltabilirsiniz. Programı hatanın
olabileceği satırda durdurduktan sonra watchlar kullanılarak hatalı bölge
incelenebilir.
Watches İle Değişken Değerlerini Görüntülemek
Programı durdurduktan sonra herhangi bir değişken üzerinde fare ile bir süre
bekledikten sonra küçük bir pencere içerisinde değişkenin değeri görüntülenir. Bazen
373
birden fazla değişkenin değeri incelenmek istenebilir. Bunun için Watch penceresini
kullanmak gerekir.
1. Değerlerini görmek istediğiniz değişkenlerin bulunduğu satırlarda breakpoint
tanımlayın.
2. Her breakpointte, değerini görüntülemek istediğiniz değişkeni seçin ve farenin sağ
tuşuna tıklayın. Gelen menüden Add Watch elemanını seçin.
3. Seçtiğiniz değişkenlerin değerini görebilmek için Wiew menüsünden Watch
Window elemanını seçin.
Program Kodunu İncelemek İçin Kod İçinde Gezmek
BreakPointler konulup program çalıştırıldıktan sonra program ilk breakpointte durur.
Debug menüsünde Step Into elemanı veya F8 tuşu ile programın durduğu yerden
itibaren satır satır ilerlenir. Eğer satır bir fonksiyon çağrısı ise bundan sonraki adımda
çağrılan fonksiyonun içine girilir ve burada satır satır ilerlenir, fonksiyon bitiminde
çağıran yordamın ilgili satırın bir alt satırına inilir. Eğer çağrılan fonksiyondan çıkmak
isteniyorsa, Ctrl+Shift+F8 tuşuna basılır veya Debug menüsünden Step Out seçilir.
Debug menüsünde Step Over elemanı veya Shift+F8 tuşu ile programın durduğu
yerden itibaren satır satır ilerlenir. Eğer satır bir fonksiyon çağrısı ise fonksiyonun
içine girilmeden fonksiyon çalıştırılarak alt satıra inilir.
Satırlar arasında ilerlenirken bazı satırların atlanarak istenen satıra gitmek istenirse,
gidilmek istenen satır işaretlenir ve debug menüsünden Run To Cursor seçilir.
Tüm breakpointleri kaldırmak istiyorsak Debug menüsünden Clear All Breakpoints
elemanını seçeriz. Eğer belirli bir breakpointi kaldırmak istiyorsak, ilgili satırın sağ
margini üzerindeki renkli nokta üzerine tıklar veya ilgili satırı işaretleyip Debug
menüsünden Toggle Breakpoints elemanını seçeriz.
İleri Hata Ayıklama Araçları
Bunlardan birincisi Locals window’dur. Scope içerisindeki tüm değişkenler bu
pencere içerisinde görünürler. Bu pencereyi aktif hale getirmek için Wiew
menüsünden Local Windows seçilir. Basit değişkenler değerleriyle birlikte listelenirler.
374
Nesnelerin yanında bir (+) işareti belirir. Bu işarete tıklarsanız nesnenin özelliklerini
görebilirsiniz.
ŞEKİL 8.j.2 Locals Window
İkincisi Immediate window’dur. Test etmek istediğiniz satırları bu pencerede
çalıştırabilirsiniz. Aşağıdaki satırı immediate window içinde yazar enter tuşuna
basarsanız:
Print 2 * 3
Alt satırda 6 sayısını görürsünüz. Immediate window içerisinde değişken
tanımlayamazsınız, scope içerisindeki değişkenleri kullanabilirsiniz. Örneğin
programınızı intCounter değişkeninin tanımlandığı bir yordam içerisinde
durdurursanız, Immediate window içinde aşağıdaki satırı yazabilir ve sonucunu
görebilirsiniz.
Print intCounter
Immediate window içinde değişkenlere değer atayabilir nesnelerin çeşitli metotlarını
çalıştırabilirsiniz. Bu pencerede scope içindeki her satırı çalıştırıp, inceleyebilirsiniz.
375
ŞEKİL 8.j.3 Immediate window e
Wiew menüsünden ulaşılabilen Call Stack diyalog kutusunda tüm aktif yordamlar
listelenir. Listenin en üstünde programın şu anda işlettiği yordam alttaki satırlarda ise
bir üsttekini çağıran yordamlar bulunur.
ŞEKİL 8.j.4 Call Stack diyalog kutusu
Hata Yakalama
Programlar önceden tahmin edilemeyen hatalarla karşılaştığı zaman hatayı yakalayamazlarsa
çalışmalarını sonlandırırlar. Bunun için program çalışırken oluşabilecek hataları yakalayan,
ilgili hata mesajlarını veren ve programın çalışmasını devam ettirecek kodlara ihtiyaç vardır.
Bunlara hata yakalama (error handling-trapping) kodları denir.
376
Visual Basic yardım dosyalarından yakalanacak hataların listesini bulabilirsiniz. Daha
sonra bir hata yakalama rutini yazmalısınız. Hata yakalama rutini aşağıdaki şekillerde
yazılabilir.
On Error GoTo line : Hata oluştuğunda program line etiketli satıra yönelir
On Error Resume Next : Hata oluştuğunda program kontrolü bir alt satıra yönelir.
Örnek:
01 Private Sub Form_Load()
02
Dim intTest As Integer
03
Dim intRet As Integer
04
On Error GoTo EH
05
intTest = 5 / 0
06
Exit Sub
07
08 EH:
09
If Err.Number = 11 Then
10
MsgBox "Division by zero error occurred.", _
vbCritical
11
End
12
ElseIf Err.Number = 71 Then
13
intRet = MsgBox("That drive is not ready.", _
vbExclamation + vbAbortRetryIgnore)
14
Select Case intRet
15
Case vbRetry
16
Resume
17
Case vbAbort
18
End
19
Case vbIgnore
20
Resume Next
21
End Select
22
`
23
`
24
`
25
End If
26 End Sub
Yukarıdaki örnekte on error goto eh şeklinde bir hata yakalama rutini kullanılmıştır.
Hata oluştuğu zaman program akışı EH: etiketine yönelecektir. Programda iki türlü
hata oluşabileceği değerlendirilmektedir. Eğer 0a bölme hatası varsa 11 nolu hata
mesajı verip program sonlandırılacaktır. Eğer sürücünün hazır olmaması hatası ile
karşılaşılırsa 71 nolu hata mesajı ile ilgili kod icra edilecektir.
377
9.a. Veri Tabanı Dosyası Hazırlamak
Visual Basic programları dahilinde bütün popüler veri tabanı programları tarafından hazırlanan veri
tabanı dosyaları incelenebilir. Visual Basic uygulamaları dahilinde mevcut veri tabanı dosyalarını
incelemenin dışında veri tabanı dosyaları oluşturulabilir. Visual Basic’in veri tabanı özellikleri ile,
Microsoft Access veri tabanı programının ile hemen hemen aynıdır.
Visual Basic’in Profesyonel sürümü ile çalışma anında program kodu yazılarak MDB uzantılı veri
tabanı dosyası oluşturulabilir. Program kodu yazmadan veri tabanı oluşturmak için Add-Ins
menüsündeki Visual Data Manager komutundan yararlanılmaktadır (Şekil 9.a-1).
Şekil 9.a-1
Add-Ins menüsünden “Visual Data Manager” komutunu verirseniz Visual Basic ile birlikte verilen
Visual Data Manager uygulaması çalışmaya başlar ve ekrana VisData penceresi gelir (Şekil 9.a-2).
Şekil 9.a-2
Visual Basic ile birlikte verilen Visual Data Manager ile Access formatında veri tabanı dosyası
hazırlanabilir. MDB uzantılı veri tabanı dosyası hazırlamak isteyenler Visual Data Manager yerine
Microsoft Access’ten yararlanabilir. Yeni bir MDB dosyası hazırlamak için File menüsündeki New
komutundan yararlanılmaktadır. File menüsünden New komutu vermeniz halinde alt menü açılır.
Visual Basic ile Access, dBASE, FoxPro ve ParDox formatında dosyalar hazırlayabilirsiniz.
378
Şekil 9.a-2
Access 7.0 versiyonu ile uyumlu bir veri tabanı dosyası hazırlamak istediğiniz takdirde alt menüden
Version 7.0 MDB seçilir. MDB dosyası adının ve yazılacağı yerin belirlendiği Select Microsoft
Access Database to Create diyalog kutusu ekrana gelir (Şekil 43-3). Buraya dosya adı yazıp Kaydet
düğmesine bastıktan sonra ekrana Visual Data Manager penceresi içinde Database Window ve SQL
Statement adında iki pencere açılmaktadır. Database Window penceresi içinde, hazırlanan veri tabanı
dosyasının özellikleri listelenmektedir.
Şekil 9.a-3
Bu diyalog kutusunda oluşturulacak dosyanın adı ve kaydedilecek yer belirlenip Kaydet
düğmesinde tıklama yapılırsa, oluşturulacak dosyadan yapısının belirlendiği bir diyalog kutusu ekrana
gelir.
Veri tabanı dosyasının adını ve kaydedileceği yeri seçip kaydet düğmesinde tıklama yaptığınızda
Visual Data Manager penceresi içinde Database Window ve SQL Statement adında iki pencere
açılmaktadır. Database Window penceresi içinde, hazırlanan veri tabanı dosyasının özellikleri
listelenmektedir.
Daha önce dBASE, Clipper veya FoxPro gibi veri tabanı program geliştirme aracı ile DBF veri
dosyası kullanmış olanlar için Access uyumlu MDB dosyaları hakkında kısa bir bilgi verelim.
379
dBASE’deki veri tabanı dosyası kavramı ile Access’taki veri tabanı dosyası kavramı birbirinden
farklıdır. dBASE’deki veri tabanı dosyası kavramının Access’deki karşılığı Table’dır MDB uzantılı
veri tabanı dosyalarında birden fazla DBF gibi dosya veya Table bulabiliriz. Bu bilginin ışığın da Şekil
9.a-4 deki diyalog kutusu incelenirse MDB dosyasına henüz tablo dahil edilmemiş olduğunu tespit
edebilirsiniz.
Henüz hazırladığımız MDB veri tabanı dosyasına yeni bir Tablo dahil etmek için ilk yapmanız
gereken işlem Database Window penceresi içinde farenin sağ tuşu ile tıklama yapmaktır (Şekil 9.a-5).
Şekil 9.a-5
Şekil 9.a-6
Henüz tablo içermeyen “BilgiBank” adlı MDB dosyasına yeni bir tablo eklemek için farenin sağ
tuşu ile ekrana getirilen kısayol menüsünden New Table komutunu verirseniz, veri tabanı dosyasına
dahil edilecek tablonun adının ve kayıt yapısının belirlendiği Table Structure diyalog kutusu ekrana
gelir (Şekil 9.a-6).
BilgiBank.MDB dosyasına dahil edilecek ilk tablonun adı “Adresler” olsun. Veri tabanı dosyasına
dahil etmek istediğiniz tablonun adını Table Name metin kutusuna yazmanız gerekir.
Tabloya vermek istediğiniz adı girdikten sonra sıra tablonun kayıt yapısını belirlemeye gelir. DBF
dosyasında veya MDB dosyası tablolarında bilgiler kayıtlar şeklinde yer almaktadır. Her kayıt aynı
uzunluğa sahiptir. Bir kayıt çok sayıda bilgiden meydana gelebilir. Kayıt bilgilerinin her birine Field
(alan) adı verilmektedir.
380
Şekil 9.a-7
Tabloya vermek istediğiniz adı girdikten sonra sıra tablonun kayıt yapısını belirlemeye gelir. DBF
dosyasında veya MDB dosyası tablolarında bilgiler kayıtlar şeklinde yer almaktadır. Her kayıt aynı
uzunluğa sahiptir. Bir kayıt çok sayıda bilgiden meydana gelebilir. Kayıt bilgilerinin her birine Field
(alan) adı verilmektedir. Kayıtta bulunan her bir alan, adı, uzunluğu ve tipi ile tanımlanır. Access
tabloları dahilinde aşağıda belirtilen tipte bilgiler kullanılabilir.
·
·
·
·
·
·
·
·
·
·
·
Boolen
Byte
Integer
Long Integer
Currency
Single
Double
Date/Time
Text
Binary
Memo
Boolean tipli alanlara True, False, Yes, No gibi mantıksal bilgiler aktarılabilir. Bu tip alanların
uzunluğu 1 olabilir. Text tipli alanlara en fazla 255 karakter uzunluğundaki karaktersel bilgiler
saklanabilir. Memo tipli alanlarda ise en fazla 32KB uzunluğunda metin bilgileri saklanabilir.
Örnek olması bakımından BilgiBank.mdb dosyasına dahil etmek istediğimiz Adresler tablosunun
bir kaydında aşağıda adları ve tipleri belirtilen bilgiler yer alsın.
Alan Adı
Ad
Alan Tipi
Text
381
Alan Uzunluğu
10
Soyad
Telefon
Adres
Sehir
Text
Text
Text
Text
15
7
30
15
Kayıtta bulunan her bir alan, adı, uzunluğu ve tipi ile tanımlanır. Hazırlanacak tabloda bulunacak
alanların belirlendiği Table Structure diyalog kutusunda tabloya yeni bir alan eklemek için önce Add
Field düğmesinde tıklama yapılır (Şekil 9.a-8). Add Field düğmesinde tıklama yapılır. Add Field
düğmesinde tıklama yaparsanız tabloya eklenecek alanın adının ve özelliklerinin belirlendiği Add
Field diyalog kutusu ekrana gelir.
Şekil 9.a-8
Tablo içinde tanımlamak istediğiniz alanın adını Name metin kutusuna yazmalısınız. Alanın
başlangıçta Text tipinde 50 karakter genişliğinde olduğu varsayılmaktadır. Eğer daha sonra söz konusu
alana sayısal veya karaktersel tipteki bilgiler aktarılacaksa Type liste kutusunda alanın tipini
değiştirmeniz gerekir. Type liste kutusu açıldığında Visual Basic tarafından desteklenen alan tiplerini
görebilirsiniz (Şekil 9.a-9).
Şekil 9.a-9
382
Alanın adının ve tipinin yazımından sonra sıra, alanın genişliğini belirlemeye gelir. Alanın
genişliğine yazılabilecek değer ile alanın tipi arasında doğrudan bir bağlantı vardır. Örneğin tabloya
eklenen alana tarihsel bilgileri yazmak üzere alan tipi olarak Date/Time seçilirse alan genişliği yazılan
Size metin kutusu kullanılmaz duruma gelir.
Şekil 9.a-10
“Size” metin kutusuna, çalışma anında veri tabanı dosyası üzerinde işlem yaparken en fazla kaç
karakter bilgi yazmak istiyorsanız o değeri yazabilirsiniz (Şekil 9.a-10).
Şekil 9.a-11
383
Bu şekilde tabloya istenilen sayıda alan dahil edilebilir.Tabloya ikinci alanı dahil etmek için tekrar
Add Fields düğmesinde tıklama yapılıp ekrana Add Field diyalog kutusu getirilir.
Özelliklerini belirleyip tabloya dahil ettiğiniz alanı tablodan çıkarmak veya silmek istiyorsanız o
alanı seçip Remove Field düğmesinde tıklama yapabilirsiniz. Tablonun yapısını belirledikten sonra
Build the Table düğmesinde tıklama yapmanız gerekir (Şekil 9.a-11).
Şekil 9.a-12
Daha önce hazırladığınız tablonun özelliklerinde değişiklik yapmak istiyorsanız farenin sağ tuşu
ile söz konusu tablonun üzerinde tıklama yapıp tablo ile ilgili kısayol menüsünü ekrana getirmeniz
gerekir.
384
Şekil 9.a-13
Eğer tabloyu açıp bilgi girmek istiyorsanız tabloya ait kısayol menüsünden Open, tablonun adını
değiştirmek istiyorsanız Rename, tabloyu veri tabanı dosyasından silmek istiyorsanız Delete
komutunu verebilirsiniz. Tabloda değişiklik yapmak istiyorsanız Design komutunu verip “Table
Structure” diyalog kutusunu ekrana getirirsiniz.
Eğer tabloya yeni bir alan dahil etmek istiyorsanız “Table Structure” diyalog kutusundaki Add
Field düğmesinde tıklama yapmanız gerekir. Hangi alanı tablodan silmek istiyorsanız Tbale Structure
diyalog kutusundaki Fields List liste kutusunda o alanı seçip Remove Field düğmesinde tıklama
yapabilirsiniz.
1. Index Hazırlamak
Tabloda yer alacak alanları belirleme işleminden sonra en önemli tablo özelliği, tabloda kayıt
arama ve sıralama işlemlari yapılırken işe yarayan indexlerdir. Visual Basic dahilinde oluşturulan ve
bilgi girilen tablolardan hızlı bir şekilde kayıt okumak, sorgulamalar yapmak için Index dosyalarından
yararlanılır. Table Structure diyalog kutusundaki Add Index düğmesine tıklama yapılarak tablodan
kayıt okumanın nasıl yapılacağı veya nasıl bir indexleme yapılacağı belirlenir. Add Index düğmesinde
tıklama yaparsanız ekrana Add Index diyalog kutusu gelir (Şekil 9.a-14).
Şekil 9.a-14
Kayıt aramada kullanılan alanlara Anahtar adı verilmektedir. “Adresler” tablosundan “Soyad”
alanına göre arama yapmak istersek Soyad alanını index anahtarı olarak seçelim. Kayıt arama
işleminde kullanacağımız indexi tanımlamak için ilk olarak Add Index diyalog kutusunda Indexin
adını belirlemeniz gerekir. Indexin adı Name kutusuna yazılmalıdır. Indexin adı Name metin kutusuna
yazıldıktan sonra indexe temel oluşturacak alan Available Fields liste kutusunda seçilir (Şekil 9.a-15).
385
Şekil 9.a-15
Indexlemede istenen sayıda alan kullanılabilir. Ancak bu alanların yalnızca birinci (Primary) index
olarak kullanılabilir. Burada yalnızca “Soyad” alanı indexlemede kullanılacağı için bu index aynı
zamanda Primary Index olarak seçmek üzere diyalog kutusunda bulunan Primary onay kutusu seçili
duruma getirilir. Eğer tabloda soyadı (anahtar) aynı olan birden fazla kaydın olmasını istemiyorsanız
diyalog kutusundaki Unique onay kutusunu seçili duruma getirmelisiniz.
Tablo için ikinci bir indexi tanımlamak istiyorsanız tekrar Add Index düğmesinde ve hazırladığınız
indexi silmek istiyorsanız Remove Index düğmesinde tıklama yapabilirsiniz.
Bu seçim ve ayarlamalardan sonra OK düğmesinde tıklama yapılınca İndex oluşturulur ve tekrar
Structure diyalog kutusuna dönülür. Bu sırada Table Structure diyalog kutusunda hazırlanan indexsin
adı yer alır.
Şekil 9.a-16
Tablo için ikinci bir indexi tanımlamak istiyorsanız tekrar Add Index düğmesinde ve hazırladığınız
indexi silmek istiyorsanız Remove Index düğmesinde tıklama yapabilirsiniz (Şekil 9.a-16). Index
386
hazırlama işlemlerini tamamladıktan sonra Close düğmesinde tıklama yaparak bir tek tablo içeren
MDB uzantılı veri tabanı dosyasının hazırlanması işlemi tamamlanmış olur.
Dosyanın ve dosyada yer alacak tabloların hazırlanması işleminden sonra Visual Data manager’in
File menüsünden Exit komutu verilerek Visual Data Manager’dan çıkabilirsiniz.
2. Veri Tabanı Dosyalarını Açmak
Şekil 9.a-17
Tabloya ait kısayol menüsünden Open komutu verirseniz Adresler adlı tablo açılır. Tablo açıldıktan
sonra dosyaya yeni kayıt yazabilir, mevcut kayıtlarda değişiklik yapabilir veya istediğiniz kaydı
tablodan silebilirsiniz. Update düğmesinde tıklama yapılınca girilen bilgiler tabloya yeni bir kayıt
olarak yazılır (Şekil 9.a-17).
Şekil 9.a-18
Verilen ekran görüntüsünde tespit edebileceğiniz gibi hazırlanan tablo Database Window
penceresinde tablo adının önünde “+” işareti bulunmaktadır. İçinde “+” işareti olan küçük karede
tıklama yapıldığı zaman söz konusu tablonun bileşenleri (alanlar, indexler ve özellikler) listelenir.
Fields seçeneğinin önünde duran ve üzerinde “+” işareti olan düğmede tıklama yaparsanız tablonun
alanları Database Window penceresinde listelenir. Bu şekilde özellikleri listelenen tabloyu istediğiniz
gibi değiştirebilirsiniz.
387
9.b. Veri Kontrolü
Visual Basic’te veri tabanı dosyaları üzerinde işlem yapmaya yönelik Data adında bir
kontrol veya nesne bulunmaktadır. ToolBox penceresinde Data kontrolünü temsil eden d
seçili duruma getirilip formun üzerine fare ile sürükleme işlemi yapılınca Forma veri tabanı
nesnesi dahil edilir.
Forma eklenen ilk veri tabanı nesnesine Data1 adı ve başlığı verilmektedir. Data nesnesine ait
Caption değişkenin içeriği veya nesnenin başlığı Properties penceresinde veya çalışma anında
değiştirilebilir.
Şekil 9.b-1
Data nesnesinde, üzerinde ok işareti olan düğmelerden, veri tabanı dosyasının kayıtları arasında
dolaşmak için yararlanılır. Forma eklenen Data nesnesi ile hard diske kaydedilmiş bir veri tabanı
doyası arasında bağlantı kurulmadan Data nesnesinin bir işlevi olamaz. Forma eklenen Data nesnesi
ile hard diskteki hangi veri tabanı üzerinde işlem yapılacağı Properties penceresinde belirlenir. Bunun
için Data nesnesine ait DatabaseName değişkeninden yararlanılır (Şekil 9.b-2).
Şekil 9.b-2
Başlangıçta DatabaseName özelliğinin içeriği boştur. Bu sırada Properties penceresinde, üzerinde
bulunulan değişkenin içeriğinin yazılı olduğu satırın kenarında bulunan ve üzerinde üç nokta işareti
(...) olan düğmede tıklama yapılınca o sırada geçerli sürücü ve klasörde seçilebilecek veri tabanı
388
dosyalarının listelendiği DatabaseName diyalog kutusu ekrana gelir (Şekil 9.b-3). Bağlantı kurmak
istediğiniz veri tabanı dosyasının adını ezbere biliyorsanız DatabaseName diyalog kutusunu ekrana
getirmeden dosyanın adını doğrudan Properties penceresine yazabilirsiniz.
Şekil 9.b-3
DatabaseName diyalog kutusunda “Biblio” adlı MDB uzantılı dosyayı seçelim. Bu diyalog
kutusunda veri tabanı dosyası seçimini Aç düğmesinde tıklama yaparsanız seçtiğiniz veri tabanı
dosyası ile, forma dahil edilen Data nesnesi arasında bağlantı kurulur. Seçilen veri tabanı dosyasının
adı Properties penceresinde DatabaseName özelliğinin karşısına yazılır (Şekil 9.b-4).
Şekil 9.b-4
Ancak Data nesnesi ile veri tabanı dosyası arasında kurulan bu bağlantı henüz yeterli değildir.
Çünkü MDB uzantılı bir veri tabanı dosyasında birden fazla Table olabilir. Veri tabanı dosyasının
hangi tablosundan bilgi okunmak isteniyorsa söz konusu tablonun adı Data nesnesine ait
389
RecordSource değişkenine aktarılır. Bu iki işlemden sonra forma eklenen Data nesnesi ile hard
diskteki veri tabanı dosyası arasında bağlantı kurulmuş olunur (Şekil 9.b-5).
Şekil 9.b-5
Bir MDB uzantılı veri tabanı dosyası açılıp dosyadaki tablolardan biri seçildiğinde kayıt okuma
kafası tablodaki ilk kayda konumlanır. Tablonun açılması ile birlikte kayıt okuma kafasının ilk kayda
konumlanması sırasında Data nesnesi ile ilgili olarak Reposition olayı meydana gelir. Bu olaydan
yararlanarak formdaki “Data1” nesnesine ait Data1_Reposition yordamına aşağıda verilen program
kodlarını ekleyelim.
Private Sub Data1_Reposition()
Show
Cls
FontName = "Arial"
FontSize = 12
Print "Adı
:"; Data1.Recordset.Fields(" Ad ").Value
Print "Soyadı :"; Data1.Recordset.Fields("Soyadı").Value
Print "Adres :"; Data1.Recordset.Fields("Adres").Value
Print "Telefon :"; Data1.Recordset.Fields("Telefon").Value
Print "Şehir :"; Data1.Recordset.Fields("Şehir").Value
End Sub
“Data1” adında bir veri tabanı nesnesi içeren formun dahil olduğu proje çalıştırılınca Şekil 9.b-6’de
verilen ekran görüntüsü elde edilir.
390
Şekil 9.b-6
Tablodaki bir kaydın hepsine birden RecordSet adı verilmektedir. Kaydın hangi alanı üzerinde
işlem yapılmak isteniyorsa o alanın adı Fields özelliğine parametre olarak verilir. Alanın içeriği ise
Value değişkeninde saklanır. Bu işlem sırasında Reposition olayı meydana geldiği için Şekil 9.b-6’da
ekran görüntüsü verilen yordam tekrar işletilir ve tablodaki bir sonraki kaydın içeriği formun üzerine
yazılır.
Bu sırada Data nesnesinde üzerinde ucu sağa bakan ok işareti olan düğmede tıklama yapacak
olursanız, seçilen tablodaki bir sonraki kayıt aktif olur. Data nesnesinin düğmelerinden yararlanmadan
tablodaki kayıtların arasında dolaşabilirsiniz. MDB uzantılı veri tabanı dosyalarının tablolarında bir
sonraki kayda gitmek için MoveNext methodundan yararlanılmaktadır.
Private Sub Form_Click()
Data1.Recordset.MoveNext
End Sub
Buna göre çalışma anında formun üzerinde herhangi bir yerde tıklama yapılınca kayıt okuma kafası
tablodaki bir sonraki kaydın üzerine gider. Kayıt okuma kafasının yer değiştirmesi ile birlikte
Reposition olayı meydana geldiği için Data1.Reposition yordamı bir kez daha işletilir ve aktif kaydın
içeriği ekrana yazılır.
İşe yarar programlar yazarken bu teknikle veri tabanı dosyalarını incelemek veya kayıtların arsında
bu şekilde dolaşmak pratik değildir. Çünkü Visual Basic, veri tabanı dosyalarını inceleme ve üzerinde
işlem yapmak için henüz anlatılmayan bir çok kolaylıklar sağlamaktadır. Veri tabanı dosyasındaki
bilgileri formun üzerine yazmak için TextBox kontrolünden yararlanılmaktadır. TextBox nesnelerinin
DataFields özelliğinden yararlanarak, seçilen tablonun alanı ile TextBox nesnesi arasında bağlantı
kurulmaktadır. Şekil 9.b-7’de verilen ekran görüntüsünü aldığımız sırada tasarım anında forma
yerleştirmiş olduğum TextBox nesnesi seçili durumdaydı.
391
Şekil 9.b-7
TextBox’ların DataField özelliği, üzerinde çalışılan projede bir Data nesnesi olduğu zaman
anlamlıdır. Data nesnesi ile birlikte TextBox’lardan başla Image, Label ve Picture Box kontrolleri
kullanılabilir.
Properties penceresinde “Data1” nesnesinin DatabaseName özelliğine “Müşteri.mdb” ve
RecordSource özelliğine ise “Adresler” tablosunun adını aktaralım. Bu iki işlem veya seçim
yardımıyla formdaki Data1 nesnesi ile hard diskteki “Müşteri.mdb” dosyası arsında bağlantı kurulmuş
oldu.
Şimdi formdaki TextBox’larla “Data1” nesnesi arasında bağlantı kuralım. Formlarda birden fazla Data
nesnesini dahil etme imkanı olduğu için TextBox ile hangi Data nesnesi arasında bağlantı kurulmak
isteniyorsa TextBox’ın DataSource özelliğine ilgili Data nesnesinin adı aktarılmaktadır (Şekil 9.b-8).
Şekil 9.b-8
Bu seçim sayesinde formdaki Data nesnesi ile TextBox arasında kurulan bağlantı yeterli değildir.
Ayrıca söz konusu TextBox’ın tablodaki bir alanla ilişkilendirilmesi gerekir. Properties penceresinde
392
formdaki ilk TextBox’a ait DataField özelliği üzerinde tıklama yapınca ekrana “Adresler” tablosunda
bulunan alanların adları listelendi (Şekil 9.b-9).
Şekil 9.b-9
Formdaki ilk TextBox’ı “Adresler” tablosundaki “Ad” alanı ile ilişkilendirmek istediğim için bu
lidteden “Ad” alanını seçtim. Formdaki her TextBox için DataSource ve DataFielde seçimi yapılıp
proje çalıştırılırsa aşağıda verilen ekran görüntüsü elde edilir (Şekil 9.b-10).
Şekil 9.b-10
Bu kayıtta istenilen değişiklik yapılabilir. Kayıtta yapılan değişikliklerin hard diskteki dosyaya
yazılması veya kaydın güncelleştirilmesi konusunda kullanıcının ek işlem yapmasına gerek yoktur.
Çalışma anında Data nesnesinin üzerinde ucu sağa bakan ok işareti olan düğmede tıklama yapılınca
“Adresler” tablosunda bulunan bir sonraki kaydın bütün alanları otomatik olarak TextBox’lara aktarılır.
393
Şimdiye kadar verilen ekran görüntülerinden tespit etmiş olduğunuz gibi Data nesnesinin üzerine
nesnenin adı yazılmaktadır. Data nesnesinin Caption özelliğinden yararlanarak Data nesnesinin
üzerine yazılacak bilgiyi belirleyebilirsiniz (Şekil 9.b-11).
Şekil 9.b-11
1. Tablodaki Kayıtların Arasında Dolaşmak
Yukarıda verilen örnekte kayıtlar arasında dolaşmak için Data nesnesinde bulunan düğmelerden
yararlanılıyordu. Programcının kayıtlar arasında dolaşmak için ek bir işlem yapmasına gerek yoktur.
Data nesnesine ait düğmelerden yararlanmadan “Adresler” tablosunun kayıtları arasında dolaşmak
için üzerinde çalışılan projenin formuna Sonraki, Önceki ve EnSon adında üç düğme yerleştirelim
(Şekil 9.b-12).
394
Şekil 9.b-12
RecordSet nesnesine tablodaki bir sonraki kaydın içeriğini aktarmak için MoveNext methodundan
yararlanılır. MoveNext methodu kayıt okuma kafasını bir sonraki kaydın üzerine taşırken
MovePrevious methodu kayıt okuma kafasını bir önceki kayda konumlandırır.
Private Sub Sonraki_Click()
Data1.Recordset.MoveNext
End Sub
Private Sub Önceki_Click()
Data1.Recordset.MovePrevious
End Sub
Kayıt okuma kafasını tablodaki ilk kayda konumlandırmak için MoveFirst, en son kayda
konumlandırmak için MoveLast methodundan yararlanılır. “Data1” nesnesinin formun üzerinde
görünmesine gerek yoktur. Bu nedenle çalışma anında etkili olmak üzere Properties penceresinde Data
nesnesine ait Visible özelliğinin içeriği False yapılmalıdır (Şekil 9.b-13).
Şekil 9.b-13
Data nesnesini temsil eden düğmeler ekranda görünür durumda iken kullanıcı en son kaydın
üzerindeyken bir sonraki kayda gitmeye neden olan düğmede tıklama yapacak olursa Visual Basic her
395
hangi bir tepkide bulunmaz. Ancak kayıtlar arasında dolaşmak için forma eklenen düğmeler
kullanılmak istendiği zaman, dolayısıyla program kodu yazılarak kayıtlar arasında dolaşmak istendiği
zaman sorunlar çıkar.
İlk kaydın üzerinde iken Data nesnesine tekrar MovePrevious methodu uygulanırsa programın
çalışması kırılır. Eğer kayıtlar arasında program kodu yazarak dolaşmak istiyorsanız bazı önlemler
almanız gerekir. Bunun için RecordSet nesnesinin BOF ve EOF özelliklerinden yararlanılmalıdır.
Private Sub Önceki_Click()
İf Data1.RecordSet.BOF Then
MsgBox “Tablonun ilk kaydının üzerindesiniz”
Else
Data1.Recordset.MovePrevious
End If
End Sub
Diğer yandan Data nesnesinin BOFAction ve EOFAction özelliklerinden yararlanarak herhangi
bir teknikle dosyanın sonuna veya başına gidildiğinde Data nesnesinin nasıl davranması gerektiğini
belirleyebilirsiniz.
Şekil 9.b-14
EOFAction özelliği başlangıçta Move Last değerini içerdiği için dosyanın veya tablonun en son
kaydının üzerinde iken MoveNext methodunu kullanmanız halinde Visual Basic bir tepkide bulunmaz
ve tablodaki en son kayıt aktif kayıt olma özelliğini korur. Ancak Data nesnesinin EOFAction
özelliğine “EOF” değerini aktaracak olursanız, tablonun en son kaydının üzerinde ikem MoveNext
methodunu kullanmanız halinde kayıt okuma kafası tablonun sonuna gider ve ekranda görüntülenen
herhangi bir kayıt olmaz.
EOFAction özelliğinin işlevini tam olarak anlamak için üzerinde çalıştığımız projenin formuna
yerleştirmiş olduğumuz Data nesnesinin EOFAction özelliğine EOF değerini aktaralım. Ardından
396
tablodaki en son kaydı aktif duruma getirelim. Bu sırada Sonraki Kayıt düğmesinde tıklama yapıp
MoveNext metodunun kullanıldığı yordam işletilecek olunursa dosyanın sonuna gidilir. Accees
uyumlu veri tabanı dosyasında her tablonun sonunda EOF ve başında BOF olarak adlandırılan bir
bölge bulunmaktadır. Şekil 9.b-15’de verilen ekran görüntüsü Adresler tablosundaki en son kayıt aktif
kayıt durumunda iken “Sonraki Kayıt” başlıklı düğmede tıklama yapıp MoveNext metodu işletildikten
sonra alınmıştır.
Şekil 9.b-15
Eğer Data nesnesinin EOFAction özelliğine Add New değerini aktaracak olursanız tablodaki en son
kayıt aktif durumda iken MoveNext metodunu işletecek olursanız sanki AddNew metodu kullanılmış
gibi tablonun sonuna boş bir kayıt eklenir.
Benzer şekilde Data nesnesinin BOFAction özelliğinden yararlanıp tablodaki ilk kaydın üzerinde
iken MovePrevius metodu kullanıldığı zaman Visual Basic’ın nasıl davranması gerektiğini
belirleyebilirsiniz. BOFAction özelliği başlangıçta Move First bilgisini içerdiği için ilk kaydın
üzerinde iken MovePrevious metodunu işletecek olursanız Visual Basic size bir tepkide bulunmaz.
Data nesnesinin BOFAction özelliğine BOF değerini aktaracak olursanız tablodaki ilk kaydın üzerinde
iken Move Previous metodu bir önceki kayda gitmek istemeniz halinde tablonun BOF olarak
adlandırılan kısmına gidilir (Şekil 9.b-16).
397
Şekil 9.b-16
2. Tabloya Yeni Kayıt Girmek ve Kayıt Silmek
Tablonun üzerinde bulunan kaydı silmek veya tablodan çıkarmak için Delete methodundan
yararlanılır. Ancak dosyadan Delete methodu ile yapılan kayıt silme işlemi sonrası Data nesnesi ile
ilişkilendirilen söz konusu nesnelerin içerikleri güncelleşmez. Bunun için bazı ek işlemlerin yapılması
gerekir. Bu amaçla ReFresh veya aktif kaydı değiştiren MovePrevious gibi bir methodun
kullanılması gerekir.
Private Sub Sil_Click()
Data1.Recordset.Delete
Data1.Recordset.MovePrevious
End Sub
Üzerinde çalışılan veri tabanı dosyasının Data nesnesi ile erişim sağlanan tablosuna yeni bir kayıt
eklemek için AddNew methodundan yararlanılır.
Private Sub Yeni_Click()
Data1.Recordset.AddNew
398
End Sub
Formdaki Yeni Kayıt başlıklı düğmede tıklama yapılınca tablonun sonuna boş bir kayıt eklenir
(Şekil 9.b-17). Tablonun sonuna eklenen bu kayda ekrandaki TextBox’lar aracılığı ile bilgi girilir.
Ancak AddNew methodu ile tablonun sonuna boş bir kayıt eklemeden önce kullanıcıdan MsgBox()
fonksiyonu yardımıyla onay alabilirsiniz.
Şekil 9.b-17
Eğer Data nesnesi ile erişim sağlamak istediğimiz tabloda herhangi bir kayıt yoksa, forma
yerleştirilen metin kutularının içerikleri boş olur. Ayrıca bu sırada Data nesnesi işlevsizleşir. Bu
durumda ilk olarak tabloya AddNew methodu ile yeni bir kayıt eklemek gerekebilir.
3. CancelUpdate Metodu İle Kayıt Girişi İptali
Yukarıdaki sayfalarda anlatıldığı gibi AddNew metodu ile tablonun sonuna eklenen boş kaydın
alanlarına bilgi girilip başka bir kaydın üzerine gidilmesi halinde kendiliğinden güncelleşmektedir.
AddNew metodu kullandıktan sonra pişman olrsanız CancelUpdate metodu ile tablonun sonuna
eklemiş olduğunuz kaydı silebilirsiniz. CancelUpdate metodunun işlevini görmek için üzerinde
çalıştığımız projenin formuna “Vazgeç” başlıklı düğme yerleştirelim. Ardından bu düğmenin Click
yordamına CancelUpdate medodunu içeren bir program satırı yazalım.
Private Sub Vazgeç_Click()
Data1.Recordset. CancelUpdate
End Sub
Bu program satırı sayesinde AddNew medodu ile dosyanın sonuna eklenen kayıt silinir. Bu sırada
başka bir kaydın üzerine gidilmesi halinde dosyanın sonuna eklenen kayıt güncelleşir.
399
4. Edit Metodu ve Mode Özelliği
Şimdiye kadar verilen bilgilerden bildiğiniz gibi Data kontrolü ile erişim sağlamanın tablolar
üzerinde herhangi bir hazırlık yapmadan değişiklik yapmak mümkündür. Formdaki metin kutuları ile
tablodaki alanlar arasında bağlantı kurulduğu için metin kutularında yapılan değişiklikler anında
tabloya yansıtılmaktadır.
Ancak aktif kayıtta yaptığınız değişiklikleri CancelUpdate metodu ile iptal edebilmek istiyorsanız
aktif kayıtta değişiklik yapmaya başlamadan önce Edit metodu ile Edit moduna geçmeniz gerekir.
Aşağıda verilen program kodu sayesinde çalışma anında formun üzerinde tıklama yapıldığı zaman edit
moduna geçilir.
Private Sub Form_Click()
Data1.Edit
End Sub
Edit formunda iken aktif kayıtta yaptığınız değişiklikleri CanselUpdate metodu ile iptal
edebilirsiniz. Eğer Edit moduna geçilmeden kullanıcının aktif kayıtta değişiklik yapmasına izin
vermek istemiyorsanız Data nesnesinin ReadOnly özelliğinden yararlanabilirsiniz. Bu özelliği
anlamak için önce formun Click yordamına aşağıda ekran görüntüsü verilen iki program satırı
yazalım.
Private Sub Form_Click()
Data1.ReadOnly = True
Data1.Refresh
End Sub
Çalışma anında formun üzerinde tıklama yapılıp bu yordam işletilirse Data nesnesinin ReadOnly
özelliği True yapılarak Data nesnesi ile erişim sağlanan tabloda değişiklik yapılması engellenir.
Ancak Read Only özelliğinin devreye girmesi için Refresh metodunun kullanılması gerekmektedir.
Ancak kullanıcı aktif kayıtta değişiklik yapmak istediği zaman forma yerleştirmiş olduğumuz
“Düzenle” başlıklı düğmede tıklama yapacaktır.
Düzenle başlıklı düğmenin Click yordamında önce Data nesnesinin ReadOnly özelliğinde yapılan
değişikliğin etkili olmasını sağlamak için ayrıca ReFresh metodunun kullanılması gerektiğini
biliyorsunuz. “Düzenle” başlıklı düğme için yazılan program kodlarında Data nesnesinin ReadOnly
özelliği kaldırıldıktan sonra Edit metodu edit moduna geçilmekte ve UpdateRecord metodu aktif
kaydın son hali tabloya yazılmaktadır.
Private Sub Düzenle_Click()
Data1.ReadOnly = False
Data1.Refresh
Data1.Recordset.Edit
400
Data1.Recordset.Update
End Sub
Üzerinde bulunulan kayıtla ilgili olarak o sırda yapılan işlemler hakkında bilgi edinmek için Data
nesnesinin EditMode özelliğine bakabilirsiniz. Aktif kayıt üzerinde herhangi bir işlemin yapılmadığı
anlamda EditMode özelliği 0 değerini içermektedir. Edit metodu ile edit modunda iken EditMode
özelliğine 1 değeri aktarılmaktadır. Eğer AddNew metodu dosyanın sonuna henüz eklenen kaydın
üzerinde bulunuyorsa EditMode özelliği 2 değerini içermektedir.
5. Validate Olayı
Data nesnesi ile ilgili olarak yapılan MoveNext, MoveLast, AddNew, Delete vb. olaylardan önce
Validate olayı meydana gelmekte veya Data nesnesine ait Validate yordamına yazılmış olan program
satırları varsa işletilmektedir. Data nesnesi üzerinde yapılan işlemlerden önce onay alma veya uyarma
gibi bütün işlemlerin Validate olayından yararlanılarak yapılması önerilmektedir. Validate yordamı
dışarıdan Action ve Save adında iki parametre almaktadır.
Private Sub Data1_Validate(Action As Integer, Save As Integer)
End Sub
Action adlı ilk parametre ile Validate olayının meydana gelmesine neden olan olayın hangisi
olduğu öğrenilir. Örneğin Data nesnesindeki bir sonraki kayda gitmek üzere MoveNext methodu
kullanılırsa, bir sonraki kayda gitmeden önce Validate olayını temsil eden yordam işletilir ve bu
yordama Action parametresi ile 3 sayısal değeri gönderilir. Data nesnesine Delete methodu
uygulanmak istenirse silme işlemi öncesinde Data nesnesine ait Validate yordamı otomatik olarak
işletilir. Bu sırada Validate yordamına Delete methodunu temsilen 7 sayısal değeri gönderilir.
Private Sub Data1_Validate(Action As Integer, Save As Integer)
If Action
= 7
Then
Cevap 0 MsgBox (“Bu kayıt dosyadan silinsin mi ?”,4)
If Cevap = 7
Then
Action = 0
End If
End If
End Sub
Validate olayı meydana geldiği zaman işletilecek bu yordama önce yordama ait Action adlı
parametrenin içeriği kontrol edilir. Tablodan Delete methodu ile kayıt silme işlemi yapılmak istendiği
zaman Action parametresine 7 sayısal değeri aktarılıp Validate yordamı ondan sonra işletilir. Bunu
şöyle anlatmak gerekir; Eğer Action parametresinin veya değişkenin içeriği 7 ise kullanıcı veri tabanı
dosyasından kayıt silmek istemiştir. Programcı bu sonuçtan yola çıkarak kullanıcıyı olası
yanlışlıklarda konusunda uyarır. Çalışma anında üzerinde çalıştığımız projenin “Kayıt Sil” başlıklı
düğmede tıklama yapılınca aşağıdaki ekran görüntüsü elde edilir (Şekil 9.b-18).
401
Şekil 9.b-18
MsgBox fonksiyonu ile ekrana getirilen bu diyalog kutusunda kullanıcı kayıt silme işlemini
onaylıyorsa ek işlem yapmadan yordamdan çıkılır ve daha sonra kayıt silme işlemi planlanan biçimde
gerçekleşir. Eğer kayıt silme işlemi yapılmak istenmiyorsa Action değişkenine 0 değeri
aktarılmaktadır. Action değişkeninin içeriği 0 iken Data nesnesi üzerinde o sırada herhangi bir işlem
yapılmaz. Ancak kullanıcının Data nesnesi üzerinde başka bir işlem yapma isteği ile birlikte Action
değişkeninin içeriği kendiliğinden tekrar güncelleşir.
Action Değişkeninin İçeriği
Data Nesnesi Üzerine Yapılmak İstenen İşlem
1
MoveFirst ile dosyadaki ilk kayda gitmek
2
MovePrevious ile bir önceki kayda gitmek
3
MoveNext ile bir sonraki kayda gitmek
4
MoveLast ile dosyadaki en son kayda gitmek
5
AddNew ile dosyaya yeni bir kayıt yazmak
6
Update ile güncelleme yapmak
7
Delete ile dosyadan kayıt silmek
8
Find ile kayıt arama işlemi yapmak
9
Bookmark ile kayıt işaretleme
10
Close ile dosyayı kapatmak
11
UnLoad ile Formu dolayısıyla dosyayı bellekten silmek
6. Tabloda Kayıt Aramak
Data kontrolü ile erişim sağlanan tablodan istenen bir kaydı aramak için FindFirst, FindNext,
FindLast ve FindPrevious metodları kullanılmaktadır. Yukarıdaki hazırlamış olan forma önce “Kayıt
Arama” başlığına sahip bir düğme yerleştirelim (Şekil 9.b-19).
402
Şekil 9.b-19
Çalışma anında Kayıt Arama başlığına sahip düğmede tıklama yapıldığı zaman InputBox
fonksiyonu ile bir diyalog kutusu ekrana getirilecek. InputBox fonksiyonu ile ekrana getirilen diyalog
kutusunda Soyadı girilen kişiye ait bilgiler Adresler tablosundan aranıp ekrana getirilecektir. Bu
işlemleri yapacak program satırlarını Kayıt Arama başlıklı düğmenin Click yordamına yazalım.
Private Sub Arama_Click()
Soyadı$ = InputBox ( “ Aranan kişinin soyadı : ”)
Ölçüt =
“Soyadı
= ’
“ & Soyadı$
Data1.Recordset.FindFirst Ölçüt
End Sub
Şekil 9.b-20
403
&“ ’ ”
Çalışma anında Kayıt Arama başlıklı düğmede tıklama yapılırsa , InputBox fonksiyonu tarafından
aranacak soyadı bilgisini girebileceğiniz bir diyalog kutusu ekrana getirilir (Şekil 9.b-20). InputBox
fonksiyonu ile ekrana getirilen diyalog kutusuna girilen bilgi Soyadı$ değişkenine aktarılmaktadır.
(Şekil 9.b-21).
Şekil 9.b-21
FindFirst metodu ile arama yapmadan önce tablodan aranacak bilginin veya kayıt arama ölçütünün
tanımlanması gerekir. Ölçüt tanımı yapılan satırdaki “Soyadı”, tabloda aramaya temel oluşturan
alandır. Eğer “Adı” alanına göre arama yapmak istemiş olunsaydı Arama_Click yordamı aşağıdaki
gibi düzenlenir.
Private Sub Arama_Click()
Soyadı$ = InputBox ( “ Aranan kişinin adı : ”)
Ölçüt = “Adı
= ’ “ & Soyadı$
&“ ’ ”
Data1.Recordset.FindFirst Ölçüt
End Sub
Eğer Data kontrolü erişim sağladığımız tabloda aynı soyada sahip birden fazla kayıt olaydı,
FindFirst metodu ile ilk kaydı bulduktan sonra aynı soyada sahip ikinci ve üçüncü kaydı bulmak için
FindNext metodunu kullanılır.
Private Sub Tekrar_Click()
Data1.Recordset.FindNext Ölçüt
End Sub
404
Yukarıdaki sayfada aranacak kayıtla ilgili bilgi içeren Ölçüt değişkenini Arama_Click() yordamı
içinde herhangi bir bildiri deyimini kullanmadan tanımladığımız için bu değişkeni başka yordamlarda
kullanmak mümkün değildir. Bu nedenle formun Declaration kısmında Ölçüt değişkenini String bildiri
deyimini kullanarak tanımlandı.
7. Dosyayı Başka Kullanıcılara kapatmak (Exclusive Özelliği)
Çok kullanıcılı ortamlarda üzerinde çalıştığınız veya açmak istediğiniz dosyanın başka bir
kullanıcı tarafından açılıp üzerinde işlem yapılmasını istemiyorsanız Table nesnesine ait Exlusive
özelliğinden yararlanabilirsiniz. Başlangıçta Data nesnesinin Exlusive özelliği False değerini içerdiği
için dosyaya başka bir kullanıcı başka bir teknik veya programla erişim sağlayabilir (Şekil 9.b-22).
Şekil 9.b-22
Başlangıçta Data nesnesinin ReadOnly değişkeni False değerini içerdiği için tablonun kayıtlarında
istenen değişiklik yapılabilir. Data nesnesinin ReadOnly özelliğinin içeriği çalışma anında program
kodu yazılarak değiştirilebilir.
Private Sub Form_Load()
Data1.ReadOnly = True
End Sub
Veri tabanı dosyası tablosunun kayıtlarında değişiklik yapılmasını istemiyorsanız Properties
penceresinde Data nesnesine ait ReadOnly değişkenine True değerini aktarmanız yeterlidir (Şekil 9.b23).
405
Şekil 9.b-23
8. Options Özelliği İle tabloları Kontrol Altına Almak
Yukarıdaki sayfalarda anlatıldığı gibi Exclusive özelliği ile tabloya başka kullanıcının erişim
sağlamasını engellemek mümkündür. Ayrıca ReadOnly özelliği ile tablodaki kayıtlarda değişiklik
yapısında değişikliğe izin vermeyebilirsiniz. Ancak Exclusive özelliği çok kullanıcılı ortamlarda yeterli
olmaz. Çünkü aynı tabloya birden fazla kullanıcı kayıt girişi yapabilir veya birisi kayıt girişi yaparken
mevcut kayıtlarda değişiklik yapmak isteyebilir. Bu gibi durumlarda Options özelliğinden
yararlanılmaktadır. Options özelliği başlangıçta 0 değerini içermektedir (Şekil 9.b-24).
Şekil 9.b-24
Options özelliği 0 değerini içerirken Data kontrolü ile erişim sağladığım tablo üzerinde istediğiniz
işlemi yapabilirsiniz. Eğer Options özelliğine 1 değerini aktaracak olursanız çok kullanıcılı ortamlarda
406
başka kullanıcılar tablonun içeriğinde değişiklik yapamazlar. Benzer şekilde Options özelliğine 2
değerini aktaracak olursanız diğer kullanıcılar tabloyu açıp inceleyemezler.
9. Veri Tabanı Dosyası Formatını Seçmek
Formlara eklenen Data nesnesi aracılığı ile erişim sağlanan veri tabanı dosyasının tipi veya ait
olduğu veri tabanı programının adı Data nesnesine ait Connect değişkeninde tutulur. Başlangıçta Data
kontrolü ile erişim sağlanmak istenen veri tabanı Access ile hazırlanmış olduğu varsayılmaktadır (Şekil
9.b-25).
Şekil 9.b-25
Eğer erişim sağlanan veri tabanı dosyası Access formatında ise Connect değişkenine dosyanın
kaynağı aktarılmaz. Dsoya dBASE IV formatında ise “dBASE IV”, Paradox formatında ise “Parafdox”
ve FoxPro2.5 formatında ise FoxPro 2.5 bilgisi aktarılır.
10. Tablodaki Kayıt Sayısını Öğrenmek
Data nesnesi yardımıyla erişim sağladığınız tablonun aktif kaydının numarası RecordSet
nesnesinin RecordCount özelliğinde saklanmaktadır.
Private Sub Form_Click()
MsgBox Data1.Recordset.RecordCount
End Sub
407
Diğer yandan Data nesnesi ile erişim sağlanan tablodaki aktif kaydın numarası AbsolutePosition
özelliğinde saklanmaktadır. Bu özellikten yararlanarak Data nesnesinin başlığına aktif kaydın ve toplam
kayıt numarasını yazabilirsiniz. Bu işlemi yapmak üzere aşağıda ekran görüntüsü verilen program
satırlarını görelim. RecordSet nesnesinin AbsolutePosition özelliği tablodaki kayıtları 0’dan başlayarak
numaraladığı için bu özelliğe “1” değeri eklenir.
Private Sub Data1_Reposition()
KayıtNo = Data1.Recordset.AbsolutePosition
KayıtSayı = Data1.Recordset.RecordCount
Data1.Caption = Str(KayıtNo +1) + “/” + Str (KayıtSayı)
End Sub
Şekil 9.b-26
Bu program satırları sayesinde erişim sağlanan tablodaki aktif kaydın numarası ile birlikte tablodaki
toplam kayıt sayısı Data nesnesinin Caption özelliğine yazılır.
11. BookMark Özelliği İle kayıt İşaretlemek
Bazen bir kaydın üzerinde işlem yapmaya başlamadan önce söz konusu tabloda veya başka bir
tabloda başka bir kayda gidip gelme ihtiyacı duyulur. Bu gibi durumlarda tekrar dönülüp üzerinde işlem
yapılmak istenen kayıt BookMark özelliği ile işaretlenir. BookMark özelliğinin işlevsiz anlatılmak için
üzerinde çalıştığımız projenin formuna “İşaretle” ve “İşaretli kayda Git” başlığına sahip iki düğme
yerleştirelim (Şekil 9.b-27).
408
Şekil 9.b-27
Çalışma anında “İşaretle” başlıklı düğmede tıklama yapıldığında aktif kayıt işaretlenecek.
Ancak BookMark medonunun geriye gönderdiği değeri bir değişkende tutmak gerekir. Bu
amaçla formun (Declaration) kısmında “Konum” adında Variant tipinde bir değişken
tanımlayalım.
Dim Ölçüt As String
Dim Konum As Variant
Bu değişkeni form dahilinde değişik yordamlarda kullanabilmek için formun Declaration kısmında
tanımladım. Çalışma anında BookMark metodu ile işaretlenen kayda ait bilgi bu değişkende saklanacak.
BookMark metodunun kullanılış biçimini aşağıda görebilirsiniz.
Private Sub İşaretle_Click()
Konum = Data1.Recordset.Bookmark
End Sub
Çalışma anında “İşaretle” başlıklı düğmede tıklama yapılırsa aktif kayıt işaretlenir ve işaretleme ile
bilgi “Konum” değişkenine aktarılır. İşaretleme işleminden sonra herhangi bir teknikle tablodaki istenen
kaydın üzerine gidilip işaretli Kayda Git düğmesinde tıklama yapıldığı zaman, işaretlenen kaydın aktif
kayıt yapılmasını sağlamak için bu kez BookMark metodunun aşağıda gibi kullanılması gerekir.
Private Sub Git_Click()
Data1.Recordset.Bookmark = Konum
409
End Sub
Şekil 9.b-28
9.c. Veri Form Sihirbazı ile Form Hazırlamak
Tablolara bilgi girişi sırasında kullanmanız gereken formu ve gerekli ayarlamaları Data Form
Wizard yardımı ile otomatik olarak hazırlayabilirsiniz. Data Form Wizard başlatmada kullanılan
komut Add-Ins menüsünde bulunmaktadır. Ancak aşağıda verilen ekran görüntüsünde görebileceğiniz
gibi başlangıçta Add-Ins menüsünde Data Form Wizard adında herhangi bir komut yoktur (Şekil 9.c1).
410
Şekil 9.c-1
Eğer Add-Ins menüsünde Data Form Designer komutu yoksa önce Add-Ins menüsünden AddManager komutunu vererek Data Form Wizard’ın Add-Ins menüsünde bir komut ile temsil edilmesini
sağlamanız gerekir. Add-Ins menüsünden Add-Ins komutunu verecek olursanız ekrana Add-In
Manager diyalog kutusu gelir (Şekil 9.c-2).
Şekil 9.c-2
Add-In Manager diyalog kutusunda Visual Basic ile birlikte verilen yardımcı program ve
Wizard’lar listelenmektedir. Bu diyalog kutusundaki VB 6 Data Form Wizard seçeneğinin üzerinde
iken Loaded/Unloaded onay kutusunu seçili duruma getirecek olursanız, veri giriş formu hazırlamada
kullanılan Data Form Wizard sihirbazı Add-Ins menüsünde bir komut ile temsil edilir (Şekil 9.c-3).
Şekil 9.c-3
411
Daha önceki konulardan bildiğiniz gibi üzerinde çalıştığınız prıjeye yeni bir form dahil etmek için
Project menüsünden Add Form komutunu verdiğiniz zaman ekrana form tipi seçimi yapılan Add Form
diyalog kutusu gelmektedir (Şekil 9.c-4).
Şekil 9.c-4
Eğer Data Form Wizard’dan yararlanarak bir veri giriş ve görüntüleme formu hazırlamak
istiyorsanız Add- Ins menüsünden komut vermek yerine Add Form
diyalog kutusundan
yararlanabilirsiniz. Add Form diyalog kutusunda VB Data Form Wizard seçeneğini seçip Aç
düğmesinde tıklama yaparsanız Data Form Wizard çalışmaya başlar.
Daha önce hazırladığımız “Adresler” adlı tablo için bilgi giriş ve görüntüleme de dahil olmak üzere
her türlü işlemi yapmada kullanmak üzere Data Form Wizard yardımı ile bir form hazırlayalım. Bu
amaçla önce Add-Ins menüsünden Data Form Wizard komutunu verip Data Form Wizard’ın
çalışmasını sağlayalım (Şekil 9.c-5).
412
Şekil 9.c-5
Data Form Wizard’ın ilk adımını temsil eden Introduction başlıklı diyalog kutusunda Wizard’ın
çalışma şekli üzerinde etkili olan profil dosyası seçimi yapılmaktadır. Data Form Wizard için daha
önceden herhangi bir profil dosyası hazırlamadığımız için form hazırlama işlemine devam etmek üzere
Next düğmesinde tıklama yapalım (Şekil 9.c-6). Data Form Wizard’ın 2. adımını temsil eden
Database Type başlıklı diyalog kutusunda veritabanı tipi seçimi yapılmaktadır.
Şekil 9.c-6
413
Örnek olması için hazırladığımız form ile, daha önce Visual Data Manager ile hazırlamış olduğum
Access uyumlu veri tabanı dosyasındaki “Adresler” tablosu üzerinde işlem yapmak istediğimiz için
Database Type başlıklı diyalog kutusunda Access’i seçelim.
Data Form Wizard’ın 2. adımını temsil eden Database Type başlıklı diyalog kutusunda veri tabanı
dosyası formatı seçiminden sonra Next düğmesinde tıklama yaparak Data Form Wizard ile form
hazırlama işleminin bir sonraki adımına geçilir. Bir sonraki adımı temsil eden Database başlıklı
diyalog kutusunda veri tabanı dosyası seçimi yapılmaktadır (Şekil 9.c-7).
Şekil 9.c-7
Hazırlanacak form ile işlem yapılacak dosya belirlendikten sonra tekrar Next düğmesinde tıklama
yapılarak form hazırlama işlemi ile ilgili bir sonraki adıma geçilir. Data Form Wizard’ın bir sonraki
adımını temsil eden Form başlıklı diyalog kutusunda hazırlanacak formun görünüşü veya düzeni
seçilmektedir. Aşağıda ekran görüntüsü verilen form başlıklı diyalog kutusunda 5 değişik form
düzeninden birini seçebilirsiniz (Şekil 9.c-8).
Şekil 9.c-8
414
Eğer Data Form Wizard ile hazırlamak istediğiniz formda aynı anda tablodaki yalnızca bir kaydın
olmasını istiyorsanız Form Layout adı altında bir araya getirilen radyo düğmelerinden Single
Record’u seçmeniz gerekir. Eğer tablodaki kayıtların Excel tablosu şeklinde ekrana getirilmesini
istiyorsanız Grid radyo düğmesini seçmelisiniz. Kayıtlar birden fazla tablodan alınacaksa
Master/Detail radyo düğmesini seçebilirsiniz. Örnek olması için hazırlamak istediğimiz formda aynı
anda yalnızca bir kaydın olmasını istediğimiz için Single Record’ı seçelim.
Form düzeni seçimi yapılan diyalog kutusu ekranda iken Next düğmesinde tıklama yaparsanız tablo
seçimi yapılan Record Source başlıklı diyalog kutusu ekrana gelir. Aşağıda ekran görüntüsü verilen
bu diyalog kutusundaki Record Source liste kutusu yardımı ile tablo seçimi yapılır. Bu amaçla Record
Source liste kutusu açılır. Şekil 9.c-9’da verilen ekran görüntüsünü aldığımız sırada daha önce seçmiş
olduğumuz “Müşteri” adlı veri tabanı dosyasında “Adresler” adlı tablo olduğundan bu tablo listelendi
(Şekil 9.c-9).
Şekil 9.c-9
Record Source liste kutusu yardımı ile tablo seçimi yaptıktan sonra sıra tablodaki hangi alanlar için
bilgi giriş formunda metin kutusu hazırlanacağına karar vermeye gelir. Seçilen tabloda bulunan alanlar
Available Columns liste kutusunda listelenir (Şekil 9.c-9).
Tabloda bulunan alanları üzerinde ucu sağa bakan ok işareti olan düğmede tıklama yaparak
hazırlamak istediğiniz forma tek tek dahil edebilirsiniz. Üzerinde ucu sağa bakan iki ok işareti olan
düğmede tıklama yaparak bütün alanları bir seferde forma dahil edebilirsiniz. Şekil 9.c-10’da verilen
ekran görüntüsünü “Adresler” adlı tablodaki bütün alanları forma dahil ettikten sonra aldık.
415
Şekil 9.c-10
Record Source diyalog kutusu ekranda iken Next düğmesinde tıklama yapılarak düğme seçimi
yapılan Control Selection başlıklı diyalog kutusu ekrana getirilir(Şekil 9.c-11). Eğer Data Form
Wizard yardımı ile hazırlamak istediğiniz form ile tabloya yeni kayıt eklemeyi düşünüyorsanız Add
Button onay kutusunun seçili özelliğini kaldırabilirsiniz.
Şekil 9.c-11
Benzer şekilde tablodaki kayıtları silmede kullanılan Delete düğmesinin forma yerleştirilmesini
istemiyorsanız Delete Button düğmesine ait onay kutusunu pasif duruma getirmeniz gerekir. Control
416
Selection başlıklı diyalog kutusunda herhangi bir işlem yapmadan Next düğmesinde tıklama yaparak
Data Form Wizard’ın son adımını temsil eden Finished başlıklı diyalog kutusu ekrana gelir.
Şekil 9.c-12
Bu diyalog kutusu Data Form Wizard ile form hazırlama işleminin son adımını temsil ettiği için
Next düğmesi kullanılmaz durumdadır. Bu sırada Finish düğmesinde tıklama yapacak olursanız
Wizard, formu hazırlamadan önce bilgi vermek amacıyla ekrana “Data Form Create” diyalog kutusu
gelir (Şekil 9.c-13).
Şekil 9.c-13
Bilgi vermek amacıyla ekrana getirilen bu diyalog kutusunun Data Form Wizard’ı daha sonra
tekrar kullandığınızda ekrana getirilmesini istemiyorsanız “Don’t show this dialog ın the future” onay
kutusunu seçili duruma getirmelisiniz. Bu diyalog kutusunu OK düğmesi ile kapattıktan kısa bir süre
sonra seçtiğiniz tablonun seçtiğiniz alanlarına bilgi girişinde kullanabileceğiniz form hazırlanıp
projeye dahil edilir. (Şekil 9.c-14).
417
Şekil 9.c-14
Verilen ekran görüntüsünden tespit edebileceğiniz gibi Data Form Wizard yardımıyla hazırlanan
forma tablonun seçilen her bir alanı için ayrı bir metin kutusu eklendi. Metin kutularından başka forma
bir Data nesnesi ve Metin kutularından başka forma bir Data nesnesi ve 5 düğme eklendi. Add
düğmesi ile tabloya yeni bir kayıt ekleyebilir, Delete düğmesi ile Formda görüntülenen kaydı tablodan
silebilirsiniz.
Data Form Designer yardımıyla hazırlanan bu formda istediğiniz değişiklikleri yapabilirsiniz.
Özellikle forma eklenen düğmelerin başlıklarını ve adlarını değiştirebiliriz.
Ekle düğmesinde tıklama yapıldığı zaman tablonun sonuma boş bir kaydın eklenebilmesi için Data
Form Designer tarafından Ekle düğmesi için gerekli olan program satırlarını otomatik olarak
hazırlamaktadır. Vısual Basic kendisi için program kodu hazırlanmış olan nesnelerin adları sonradan
değiştirildiği zaman akıllı davranmıyor. Eğer kendisi için program kodu girişi yaptığınız nesnenin
adını daha sonradan değiştirme gereğini duyacak olursanız, hazırmış olduğunuz program satırlarını ad
değiştirme işleminden sonra ilgili yordamların içine taşımanız gerekir.
Private Sub Ekle_Click()
Data1.Recordset.AddNew
End Sub
Data Form Wizard hazırladığı forma otomatik dahil ettiği Data nesnesi için Reposition olayı
meydana geldiği zaman işletilmek üzere bazı program satırlarını hazırlamaktadır.
Private Sub Data1_Reposition()
Screen.mousePointer = vbDefault
On Error Resume Next
Data1.Caption
=
“Record
AbsolutePosition+1)
:”
&
(
Data1.
Recordset.
End Sub
Bu program satırları ile data nesnesinin üzerine aktif kayd ın numarası yazılmaktadır. Böylece hangi kaydın üzerinde olduğunuzu Data
nesnesinin başlığına bakıp anlayabilirsiniz. Data Form Wizard yardımı ile hazırladığınız form üzerinde çalıştığınız projenin başlangıç formu
olacaksa Project menüsünden Properties komutunu vererek proje ile ilgili seçim ve ayarlamalar ın yapıldığı Project Properties diyalog
kutusunu ekrana getirmeniz gerekir.
418
Üzerinde çalıştığınız projenin çalışma biçimi ile ilgili olarak seçim ve ayarlama yapmak için
Project menüsünden Properties diyalog komutunu verirseniz ekrana Project Properties diyalog kutusu
gelir. (Şekil 9.c-15).
Şekil 9.c-15
Projede birden fazla form varsa General sekmesindeki Startup Object liste kutusunda hangi
formun başlangıç formu olacağını belirleyebilirsiniz.
9.d. Birden fazla tablo üzerinde işlem yapmak
Data nesnesi hakkında bilgi verilen bölümde aynı proje içinde yalnızca bir tablo üzerinde işlem
yaptık. Bu bölümde ise aynı anda iki tablo üzerinde nasıl işlem yapılacağını göreceğiz. STOK.MDB
419
adında ve “Kartlar” ve “Hareketler” adına sahip iki tablo içeren bir veri tabanı dosyası hazırlayalım.
Bu amaçla Visual Database Manager uygulamasını başlatalım. Veri tabanı dosyası hazırlarken
kullanılan Visual Data Manager uygulamasını başlatmak için Add-Ins menüsündeki Visual Database
Manager komutundan yararlanmak gerektiğini biliyorsunuz.
Şekil 9.d-1
Add-Ins menüsünden Visual Database Manager komutunu verecek olursanız ekrana Visual
Database Manager penceresi gelir. Data Manager penceresinde yeni bir veri tabanı dosyası hazırlamak
için File menüsünden New komutunu vermek gerekiyor (Şekil 9.d-2). Daha önce hazırlayıp hard diske
kaydettiğiniz veri tabanı dosyasında değişiklik yapacak veya dosyadaki tablolara Data Manager
aracılığıyla kayıt girişi yapacaksanız Open Database komutu ile açmanız gerekir.
Şekil 9.d-2
Daha önceki konulardan bildiğiniz gibi Visual Database Manager penceresinde File-New komutu
verildiği zaman, hazırlanacak veri tabanı dosyası formatının seçildiği bir alt menü açılmaktadır.
Access formatında veri tabanı dosyası hazırlamak istediğimiz için alt menüden Access 7.0’ı seçelim.
New komutu ile ekrana gelen alt menüden dosya formatını seçtikten sonra ekrana hazırlanacak veri
tabanı dosyasının adının ve dosyanın kaydedileceği klasörün belirlendiği Select Microsoft Access
Database to Create diyalog kutusu gelmektedir (Şekil 9.d-3).
420
Şekil 9.d-3
Bu diyalog kutusunda hazırlamak istediğiniz dosyanın adını Dosya adı metin kutusuna yazıp
Kaydet düğmesinde tıklama yaparsanız seçtiğiniz klasör ve sürücüde henüz herhangi bir işlem
içermeyen MDB uzantılı bir dosya hazırlanır.
Bu şekilde MDB uzantılı veri tabanı dosyasını hazırladıktan sonra şimdi Kartlar ve Hareketler
adında iki tablo hazırlayıp bu veri tabanı dosyasına dahil edelim. Bu amaçla ilk olarak Database
Window penceresinin üzerinde farenin sağ tuşuna ile tıklama yaparak veri tabanı dosyası ile ilgili
kısayol menüsü Ekrana getirelim (Şekil 9.d-4).
Şekil 9.d-4
Yeni bir tablo hazırlayıp veri tabanı dosyasına dahil etmek için Database Window penceresi içinde
farenin sağ tuşu ile ekrana getirilen kısayol menüsünden New Table komutunu vermek gerekir. Daha
önceki konulardan bildiğiniz gibi Database Window penceresine ait kısayol menüsünden New Table
komutu verildiği zaman tablo yapısının belirlendiği Table Structure diyalog kutusu ekrana
gelmektedir. Şekil 9.d-5’teki verilen ekran görüntüsü “Kartlar” tablosunun yapısını belirledikten sonra
alındı.
421
Şekil 9.d-5
Bu şekilde dosyada yer alacak ilk tablonun kayıt yapısını belirledikten sonra tablo için Index
tanımlayalım. Ekranda Table Structure diyalog kutusu varken Index hazırlamak için Add Index
düğmesinde tıklama yapılır (Şekil 9.d-6). Add Index düğmesinde tıklama yapıldığı zaman ekrana
AddIndex diyalog kutusunun geldiğini daha önceki konulardan biliyorsunuz.
Şekil 9.d-6
Add Index diyalog kutusunda ilk olarak Name metin kutusuna hazırlamak istenen Indexin adı
yazılır. Ardından Indexleme hangi alan veya alanlara göre yapılacaksa söz konusu alan Available
Fields liste kutusunda seçilir (Şekil 9.d-7). Aynı koda sahip birden fazla Stok kartının tanımlanmasını
engellemek için Unique onay kutusunu seçili duruma getirilir. ( Aynı koda sahip birden fazla stok
hareketinin kaydını yapmak gerekirse bu kutu seçili duruma getirilmez)
422
Şekil 9.d-7
Hazırlamak istediğimiz index için alan seçimini yaptıktan sonra önce Ok değmesinde tıklama
yaparak indexin tabloya dahil edilmesi sağlanır (Şekil 9.d-8). Ardından Close düğmesinde tıklama
yaparak Add Index diyalog kutusunu kapatılır. Tanımlanan index Table Strucrure diyalog kutusunun
sol alt köşesindeki Index List liste kutusunda listelenir.
Şekil 9.d-8
Hazırlayıp “Stok” adlı MDB uzantılı veri tabanı dosyasına dahil etmek istenen ilk tablonun kayıt
yapısını bu şekilde belirledikten sonra Build the Table düğmesinde tıklama yaparak tablonun
423
hazırlanmasını ve Table Structure diyalog kutusunun kapanması sağlanır. Table Structure diyalog
kutusunu “Build the Table” düğmesi ile kapatınca kayıt yapısını belirlediğim tablo Visual Dtata
Manager dosyası içinde alt pencere durumundaki veri tabanı dosyasına ait pencerede yer almaya
başladı
(Şekil 9.d-9).
Şekil 9.d-9
Veri tabanı dosyasında yer almasını istediğim “Kartlar” adlı tabloyu bu şekilde hazırladıktan sonra
diğer tabloyu hazırlamak üzere tekrar Database Window penceresi içinde farenin sağ tuşu ile kısayol
menüsünü ekrana getirelim. Kısayol menüsünden New Table komutunu verip ekrana Strukture
Table diyalog kutusu gelir. Şekil 9.d-10’da verilen ekran görüntüsünde “Hareketler” adı verilen ikinci
tablonun kayıt yapısı belirlenmiştir.
424
Şekil 9.d-10
“Hareketler” adı verilen tablonun kayoıt yapısını bu şekilde belirledikten sonra şimdi tablo için bir
index hazırlayalım. Bu amaçla önce Add Index düğmesinde tıklama yaparak ekrana Add Index
diyalog kutusu getirilir. Şekil 9.d-11’de verilen ekran görüntüsünde Add Index diyalog kutusunda
hazırlamak istediğimiz index için gerekli ayarlama ve seçim işlemleri yapılmıştır.
Şekil 9.d-11
Aynı koda sahip birden fazla stok hareketinin kaydını yapmak gerekeceği için “Kartlar” tablosu
için hazırlanan indexten farklı olarak Unigue onay kutusu seçili duruma getirilmez. Bu işlemlerden
sonra önce OK. ve ardından Close düğmelerinde tıklama yaparak Add Index diyalog kutusu kapatılır.
En son olarak Table Structure diyalog kutusunda Build he Table düğmesinde tıklama yaparak
“Hareketler” tablosunun hazırlık işlemleri tamamlanır (Şekil 9.d-12).
Şekil 9.d-12
Bundan sonraki veri tabanı dosyaları ile ilgili bir çok işlemi bu iki tablo üzerinde gerçekleştirelim.
Daha önce “Adresler” tablosu için yaptığınız bir çok işlemi Kartlar ve Hareketler tabloları içinde
yapacağız.
425
Şekil 9.d-13
Hazırlayacağım örnek proje ile temel olarak iki işlem yapacağız. İlk işlemde Kartlar tablosuna stok
kartlarının girişini yapacağız. İkinci işlemde ise Hareketler tablosuna stok giriş ve çıkışlarının kaydını
yapacağız. Bu nedenle hazırlamak istediğimiz örnek projede 3 form olacak. Projenin ana formu için
menü hazırlamak yerine konumun kolay anlaşılmasını sağlamak için projenin ana formuna 3 düğme
dahil edelim (Şekil 9.d-13).
Proje çalıştırılır çalıştırılmaz projenin ana formu ekrana gelecek. Ana formdaki “Stok Kartları”
başlıklı düğmede tıklama yapıldığı zaman Stok kartları başlıklı form, “Stok Hareketleri” düğmesinde
tıklama yapıldığı zaman Stok hareketleri başlıklı form ekrana gelecek. Bu nedenle projeye önce iki
form dahil edeceğiz. Üzerinde çalıştığımız projeye yeni bir form dahil etmek için Project menüsünden
Add Form komutunu vermeniz gerektiğini biliyorsunuz. Bu formları sıfırdan hazırlamak yerine Data
Form Designer’den yararlanabilirsiniz.
Çalışma anında Stok kartları başlıklı düğmede tıklama yapıldığı zaman ekrana Stok Kartları başlıklı
“Kartlar” adındaki formun gelmesini sağlamak için “Stok Kartları” başlıklı düğmesinin Click
yordamına program satırları ekleyelim. Stok kartlarını girmede veya daha önce girilen kartları bulup
ekrana getirmede kullanmak üzere projeye dahil ettiğimiz ikinci forma Properties penceresinden
yararlanarak “Kartlar” adını verelim.
Private Sub Command1_Click()
Kartlar.Show
End
Sub
Şimdi önce Stok Kartları başlıklı form aracılığı ile Ticaret.mdb adındaki veri tabanı dosyasındaki
“Kartlar” tablosuna stok kartlarının girişini yapalım. Bu amaçla ilk olarak bu forma ToolBox’tan
yararlanarak bir Data nesnesi dahil edelim. Ardından Data nesnesi için Properties penceresinde
DatabaseName özelliği yardımı ile veri tabanı dosyası, RecorsSource özelliği yardımıyla tablo
seçimi yapalım (Şekil 9.d-14).
426
Şekil 9.d-14
Bu işlemden sonra Stok Kartları bağlığına sahip forma, Kartlar tablosunda bulunan her alan için
birer Label ve Textbox nesnesi dahil ettim. Ayrıca çalışma anında tabloya yeni Stok Kartların girişini
yapabilmek, kartların arasında dolaşabilmek ve mevcut kartlarda gerekirse değişiklik yapabilmek için
forma 3 düğme dahil edelim.
427
Şekil 9.d-15
Kayıtlar arsında dolaşırken Data nesnesinden yararlanmak istediğimiz için forma Önceki ve
Sonraki gibi başlıklara sahip düğmeleri dahil etmedik. Şimdi sırada forma eklediğimiz metin kutuları
ile seçtiğimiz tablonun alanları arasında bağlantı kurmaya geldi. Bu amaçla önce Formdaki ilk metin
kutusunu seçili duruma getirip tabloyu erişimde kullanılacak Data nesnesini seçelim. Çünkü bir
formda birden fazla Data nesnesi bulunabilir (Şekil 9.d-16).
Şekil 9.d-16
Şekil 9.d-17
Formdaki ilk metim kutusu için Data nesnesi seçimini yaptıktan sonra Textbox nesnesinin
DataField özelliğinden yararlanarak alan seçimi yapalım. (Şekil 9.d-17). Bunu yapmak için ışıklı bantı
Properties penceresinde DataField özelliğinin üzerine götürüp StokKodu alanını seçtim. Seçili
durumda olan metin kutusu nesnesi için DataSource özelliği yardımıyla Data nesnesi seçimini
yapmadan DataField özelliği ile alan seçimi yapamazsınız.
428
Benzer işlemi sırasıyla formdaki diğer metin kutuları içinde yapalım. Formdaki 2. metin kutusunun
DataField özelliğine “StokAdı”, 3.metin kutusu nesnesinin DataField özelliğine ise “Birim” alanın
adını aktaralım. Bu işlem ve hazırlıklardan sonra stok kartlarının girişine başlayabiliriz.
Ancak bilgi girişine başlamadan önce Yeni Kart düğmesinde tıklama yapılarak henüz herhangi bir
kayıt içermeyen dosyanın sonuna boş bir kaydın eklenmesi sağlanmalıdır. Belirtilen tablonun sonuna
boş bir kayıt eklemek için AddNew methodunun kullanıldığını daha önceden biliyorsunuz. Bu nedenle
Yeni Kart başlıklı düğmenin Click yordamını aşağıdaki gibi düzenleyelim.
Private Sub Ekle_Click()
Data1.Recordset.AddNew
Text1.SetFocus
End Sub
Bu değişiklikten sonra proje çalıştırılıp Yeni Kart düğmesi ile bu yordam işletilirse dosyanın
sonuna baş bir kayıt eklenir ve ekleme noktası ilk metin kutusunda hazır olarak bekler. Bu
hazırlıklardan sonra bu projeyi çalıştırınca ekrana ilk olarak üzerinde 3 düğme olan ve ana form görevi
yapan Stok Projesi başlıklı form gelir.
Bu sırada stok kartı girişi yapmak üzere Stok Kartları düğmesinde tıklama yaparsanız daha önce bu
düğmenin içinde kullanılan Show metodu yardımıyla ekrana Stok Kartları başlıklı form gelir
(Şekil 9.d-18).
429
Şekil 9.d-18
Stok Kartları formundaki Data nesnesi yardımıyla üzerinde işlem yapılmak istenen Kartlar tablosu
henüz herhangi bir kayıt veya bilgi içermediği için formdaki metin kutularının içeriği boş durumdadır
(Şekil 9.d-18).
Şekil 9.d-19
“Data1” nesnesi ile erişim sağladığım tabloya daha önce kayıt girişi yapmış olsaydık Stok Kartları
başlıklı form ekrana getirilir getirilmez tablodaki ilk kaydın içeriği ekrana getirilirdi. Tabloya yeni bir
kaydın girişini yapmak için ilk önce “Yeni Kart” düğmesinde tıklama yaparak tablonun sonuna içeriği
boş bir kayıt ekleyelim. Ardından formdaki metin kutularına bilgi girelim. Bu stok kartına göre depoda
10 adet 37 ekran Arçelik renkli TV bulunmaktadır.
Bu sırada Değiştir düğmesinde tıklama yapılırsa metin kutularının içeriği üzerinde bulunan kaydın
alanlarına, başka bir deyişle tabloya yansıtılır. Bu işlemi yapacak yordamı aşağıda verdim.
Private Sub Değiştir_Click()
430
Data1.UpdateRecord
End Sub
Metin kutularına girişini yaptığınız bilgileri “Değiştir” düğmesinde tıklama yapıp AddNew metodu
ile tablonun sonuna eklediğiniz kayda yansıttıktan sonra tekrar Yeni Kayıt düğmesinde tıklama
yaparak istediğiniz sayıda kaydın girişini yapabilirsiniz. Stok dosyasından kayıt silmek amacıyla
kullanmak üzere "”Kart Sil"”başlıklı düğmenin Click yordamına aşağıda ekran görüntüsünü verdiğim
program satırlarını dahil ettim.
Private Sub Sil_Click()
Data1.Recordset.Delete
Data1.Recordset.MovePrevious
End Sub
Eğer yeni bir kaydın girişini yaparken veya tablodaki mevcut kayıtlardan birini silerken silme
işlemi öncesi kullanıcıdan onay almak istiyorsanız Data nesnesine ait Validate olayından
yararlanabilirsiniz.
Private Sub Data1_Validate (Action As Integer, Save As Integer)
If Action = 7 Then
Secim = MsgBox( “Bu Kayıt silinsin mi? “,4)
If Secim = 7
Then
Action = 0
End If
End If
End Sub
431
Ancak hareket görmüş olan bir Stok kartını tablodan silmek hatalara neden olur. Bu nedenle ticari
programlarda hareket görmüş olan Stok Kartlarının silinmesine izin verilmez.
Anlatılan şekilde Kartlar tablosuna istenen sayıda kaydın girişini nasıl yapıldığını anlattıktan sonra
“Hareketler” tablosuna stok giriş ve çıkışlarını nasıl kaydedeceğimizi anlatalım. Bu amaçla projeye
dahil ettiğimiz forma ikinci Data nesnesi dahil edelim. Çünkü Hareketler tablosu üzerinde işlem
yaparken aynı zamanda Kartlar tablosu üzerinde işlem yapacağız. Stok giriş ve çıkışında kullanmak
için hazırladığımız form Şekil 9.d-20’de verildi.
Şekil 9.d-20
Forma eklemiş olduğum ilk Data nesnesi ile üzerinde işlem yapmak istediğimiz MDB uzantılı
“Ticaret” dosyasındaki “Hareketler” tablosunu ilişkilendirelim. Diğer yandan “Data2” nesnesinin
RecordSource özelliği için tablo seçimi yapmadan önce DatabaseName özelliğinden yararlanarak veri
tabanı dosyası seçimi yapalım (Şekil 9.d-21).
Şekil 9.d-21
Forma eklemiş olduğum “Data2” adındaki ikinci Data nesnesi ise “Kartlar” tablosu ile
ilişkilendirelim. Stok giriş ve çıkış işlemlerine ait kayıtları “Hareketler” tablosuna yazacağız ama bu
sırada Kartlar tablosundaki ilgili stok kaydının “Miktar” alanında artma veya azalma meydana
432
gelecektir. Diğer yandan henüz kaydı yapılmamış olan bir stokun giriş ve çıkışını engelleyeceğiz
(Şekil 9.d-22).
Şekil 9.d-22
Hareketler başlıklı formu bu şekilde düzenlenip proje çalıştırılıp, ana formdaki Stok hareketleri
düğmesinde tıklama yapılırsa Stok Giriş ve Çıkışları başlıklı form ekrana gelir ve ekleme noktası
formdaki ilk metin kutusunda hazır olarak bekler. Formdaki Stok hareketleri başlıklı düğmede tıklama
yapıldığı zaman Stok Giriş ve çıkışında kullanılmak üzere hazırlanan formun ekrana gelmesini
sağlamak için bu düğmeye ait Click yordamını aşağıdaki gibi düzenleyelim.
Private Sub Command2_Click()
Hareket .Show
End Sub
Şekil 9.d-23’te verilen ekran görüntüsünü çalışma anında Stok Hareketleri düğmesinde tıklama
yaptıktan sonra aldık. Hareket tablosuna daha önce kayıt girişi yapılmış olsaydı ilk kaydın içeriği
formdaki metin kutularında görüntülenirdi.
433
Şekil 9.d-23
Hareketler tablosuna bir Stok giriş veya çıkışın kaydını yapmak için ilk olarak “Yeni” düğmesinde
tıklama yapılır. Tablonun sonuna boş bir kayıt eklemek amacıyla hazırlanan YeniKayıt_Click yordamı
aşağıda verelim.
Private Sub YeniKayıt_Click()
Data1.Recordset.AddNew
Text1.SetFocus
End Sub
Çalışma anında Hareket tablosunun sonuna boş bir kayıt eklemek üzere “Yeni” başlıklı düğmede
tıklama yaparsanız AddNew methodu ile tablonun sonuna boş bir kayıt eklenir. Daha sonra Hareketler
tablosuna yazılmak üzere formdaki diğer metin kutularına bilgi girişi yapılır (Şekil 9.d- 24).
Şekil 9.d-24
Metin kutularına girilen bilgiler “Değiştir” düğmesinde tıklama yapılınca “Hareketler”
tablosundaki aktif kaydına yansıtılır. Bu amaçla “Değiştir” başlıklı düğmenin Click yordamını
aşağıdaki gibi düzenledim. Bu yordamda daha önce Kartlar tablosunda kayıtlı olmayan bir stokun giriş
veya çıkışını önlemek için önce kodu girilen stok, “Data2” nesnesi ile erişim sağlanan “Kartlar”
tablosunda aranmaktadır.
Private Sub Değiştir_Click()
Data2.Recordset.MoveFirst
Do While Data2.Recordset.EOF = False
If Data2.Recordset.Stokkodu = Text1.Text Then
Exit Do
Else
Data2.Recordset.MoveNext
End If
Loop
If Data2.Recordset.EOF Then
434
MsgBox “Bu stok kartının kaydı yok”
Else
Data1.UpdateRecord
End If
End Sub
DBCombo Kontrolü
DBCombo kontrolü, kayıt girişi yaparken veya mevcut kayıtları değiştirirken bir tablodaki bir
alanın içeriğini listelemek veya seçim yapmak amacıyla kullanılmaktadır. Yukarıdaki sayfalarda
hazırladığımız projede Stok giriş ve çıkışlarının kolay yapılmasını sağlamak için “Stok Kodu” başlıklı
metin kutusunu silip yerine bir DB Combo kontrolünü yerleştirelim (Şekil 9.d-25).
Veri tabanı dosyasındaki Kartlar tablosundaki kayıtları içerecek bu liste kutusunun seçeneklerini
belirlerken formdaki “Data2” nesnesinden yararlanalım. Çalışma anında Data2 nesnesinin ekranda
görüntülenmesini engellenmek için Visible özelliğine False değerini aktaralım.
Şekil 9.d-25
Data nesnesinden yararlanmadan DBCombo nesnesinden yararlanmak mümkün değildir.
DBCombo ile Data nesnesi arasında bağlantı kurmak için ilk olarak DBCombo’nun DataSource
özelliği ile Data nesnesi seçimi yapılır (Şekil 9.d-26). Üzerinde çalıştığımız Hareket adındaki formdaki
Stok Kodu başlıklı liste kutusunda “Data2” adındaki Data nesnesi ile erişim sağlanan Kartlar
tablosundan bilgi alınmasını sağlamak için Data2 nesnesini seçelim.
435
Şekil 9.d-26
Şekil 9.d-27
Ardından DBCombo nesnesinin DataField özelliği yardımıyla liste kutusunda bilgilerin seçilen
tablonun alanından alınacağı belirlenir (Şekil 9.d-27). DBCombo nesnesinde “kartlar” tablosundaki
stokların kodlarını aktarmak istediğim için DataField özelliğine “StokKodu” alanını aktaralım.
Şekil 9.d-28
Şekil 9.d-29
DBCombo nesnesi için DataField özelliği yardımıyla alan seçimi yapıldıktan sonra RowSource
özelliğinden yararlanarak Data nesnesi seçimi yapılmalıdır (Şekil 9.d-28). Bu seçimden başka
DBCombo nesnesinin ListField özelliği yardımıyla bir kez daha alan seçimi yapılmalıdır. DataField
özelliği ile çalışma anında DBCombo nesnesi içinde listelenecek bilgilerin alınacağı alan
belirlenmektedir (Şekil 9.d-29).
Bu ana kadar yapılan hazırlıklara göre Stok giriş ve çıkışı için ekrana Hareketler başlıklı form
getirildiği zaman ekleme noktası stok kodu seçimi yapılacak liste kutusunda hazır olarak
bekleyecektir. Veri tabanı dosyasındaki Kartlar tablosunu temel alan bu liste kutusunda girişi veya
çıkışı yapılacak stokun kodu seçilir. Aşağıda verilen ekran görüntüsünü çalışma anında Stok Kodu
seçimi yapılan liste kutusunu açtıktan sonra aldım. Bu sırada Kartlar tablosuna kaydı yapılış 4 stok
kartı vardı (Şekil 9.d-30).
436
Şekil 9.d-30
Bu liste kutusunda Stok Kodu seçimi yapıp tarihi girdikten sonra işlem seçimi yapılan diğer liste
kutusuna geçtim. İşlem alanına yalnızca “Giriş” veya “Çıkış” bilgilerini yazma imkanı olduğu için
tasarım anında İşlem başlıklı metin penceresinde ComboBox nesnesinin List özelliğinden yararlanarak
çalışma anında “Giriş” ve “Çıkış” seçeneklerin listelenmesini sağladık.
Data Form Wizard İle Birden Fazla Tablo Üzerinde İşlem Yapmak
Daha önce tablolar üzerinde işlem yaparken Data Form Wizard ile nasıl form hazırlandığını adım
adım anlatmıştım. Hatırlayacağınız gibi Data Form Wizard başlatıldığı zaman ilk olarak sizden
hazırlanacak form ile üzerinde işlem yapılacak tablonun dahil olduğu veri tabanı dosyasının formatını
seçmeniz isteniyordu. Başlangıçta veri tabanı dosyasının Access ile hazırlandığı varsayılıyordu.
Şekil 9.d-31
437
Data Form Wizard’ın Database Type başlıklı diyalog kutusunda veri tabanı dosyası formatı
belirlendikten sonra Next düğmesinde tıklama yapılarak seçimi yapılan Database başlıklı diyalog
kutusu ekrana geliyordu (Şekil 9.d-31).
Şekil 9.d-32
Aynı anda iki tablo üzerinde işlem yaparken daha önce hazırlamış olduğum “Stok” adındaki veri
tabanı dosyasından yararlanmak istediğim için bu diyalog kutusunda Ticeret.mdb dosyasını açalım
(Şekil 9.d-32). Ardından Next düğmesinde tıklama yaparak ile Form hazırlama işleminin bir sonraki
adımını temsil eden “Form” başlıklı diyalog kutusunu ekrana getirelim. Form başlıklı diyalog
kutusunda Data Form Wizard ile hazırlanacak ve seçilen tablo üzerinde işlem yaparken kullanılacak
formun görünümü seçilmektedir (Şekil 9.d-33).
Şekil 9.d-33
Eğer formun üzerinde aynı anda yalnızca bir kaydın görüntülenmesini istiyorsanız Master / Detail
radyo düğmesini seçmelisiniz.
438
Şekil 9.d-34
Master/Datail seçeneği ile hazırlanan formda aynı anda iki tablonun üzerinde işlem yapılırken
tablolardan birine “ana” tablo, diğerine ise “detay” tablo adı verilmektedir. Form tipi seçiminden sonra
Next düğmesinde tıklama yaparsanız Master (ana) tablonun seçildiği Master Record Source diyalog
kutusu ekrana gelmektedir (Şekil 9.d-34).
Örnek olması için hazırlamak istediğimiz formun üst kısmında Kartlar tablosundan bir kaydın
olmasını istediğim için Master Record Source başlıklı diyalog kutusunda önce Record Source liste
kutusunda Kartlar tablosunu seçelim. Ardından Kartlar tablosundaki bütün alanları hazırlayacağım
forma dahil edelim. Anlatılan şekilde Master Record Source diyalog kutusunda Master tablo seçimini
yaptıktan sonra tekrar Next düğmesinde tıklama yaparak Data Form Wizard’ın tablo seçimi yapılan
Detail Record Source diyalog kutusunu ekrana getirelim.
439
Şekil 9.d-35
Detail Record Source başlıklı diyalog kutusunda önce “Hareketler” tablosunu seçtim. Tablo
seçiminden sonra tablodaki alanlar Available Fields liste kutusunda listelenmektedir.
Şekil 9.d-36
Hareketler tablosundaki bütün alanları Selected Fields liste kutusuna kopyaladıktan sonra Next
düğmesinde tıklama yaparak ekrana Record Source Relation diyalog kutusunun gelmesini sağladık.
Record Source Relation diyalog kutusunda hazırlanacak forma dahil edilecek tablolar arasında
kurulacak bağlantıda hangi alanların kullanılacağı belirlenmektedir (Şekil 9.d-36).
Master (Kartlar) tablosu ile Detail(Hareketler) tablosu arsında bağlantıyı StokKodu alanından
yararlanarak kurmak istediğim için Master ve Detail liste kutuslarında “StokKodu” alanını seçili
duruma getirdim. Tablolar arasında nasıl bir bağlantı kurulacağı bu şekilde belirlendikten sonra tekrar
Next düğmesinde tıklama yapılırsa Data Form Wizard’ın bir sonraki adımını temsil eden Control
Selection diyalog kutusu ekrana getirilir (Şekil 9.d-37).
440
Şekil 9.d-37
Control Selection diyalog kutusunda forma dahil edilecek düğmeler belirlenmektedir. Eğer Data
Form Wizard yardımıyla hazırladığınız form aracılığıyla tablolara yeni kayıt girişi yapmak
istemiyorsanız Add Button onay kutusunu pasif duruma getirebilirsiniz. Bu diyalog kutusunda
herhangi bir seçim ve ayarlama yapmadan Next düğmesinde tıklama yaparak Data Form Wizard en
son adımını temsil eden Finished diyalog kutusunu ekrana getirilir.
Şekil 9.d-38
Finished başlıklı diyalog kutusunda, Wizard ile forma hazırlarken yaptığınız seçim ve ayarlamaları
profil dosyası olarak hard diske kaydedebilirsiniz. Profil dosyası hazırlamak için Finished diyalog
kutusundaki 3 nokta (...) işareti olan düğmede tıklama yapmak gerekir. Bu düğmede tıklama yapıldığı
zaman profil dosyası belirlendiği Save Profile diyalog kutusu ekrana gelmektedir (Şekil 9.d-39).
441
Şekil 9.d-39
Bu diyalog kutusuna profil dosyasının adını yazıp Kaydet düğmesinde tıklama yaparsanız bu
dosyanın adı Finished diyalog kutusundaki metin kutusuna yazılır. Şekil 9.d-40’da verilen ekran
görüntüsünü Finished diyalog kutusundaki Finish düğmesinde tıklama yaptıktan sonra aldık.
Şekil 9.d-40
Eğer Data Form Wizard yardımıyla hazırladığınız formun üzerinde çalıştığınız projenin başlangıç
formu olmasını istiyorsanız Project menüsündeki Project Properties komutu ile ekrana getirilen Project
Properties diyalog kutusundan yararlanmanız gerekir.
9.e. Program Kodu ile Veri Tabanı Hazırlamak
442
Visual Basic uygulaması dahilinde çalışma anında yeni bir DateBase nesnesi yani MDB uzantılı
veri tabanı dosyası oluşturmak için Visual Basic’in hazır CreateDatabase() fonksiyonundan
yararlanılır. 5.0 ve 6.0 versiyonunda CreateDatabase() gibi fonksiyonları kullanabilmek için daha
önceden Project menüsünden References komutunu verip ekrana Refrences diyalog kutusunu
getirmek gerekir
(Şekil 9.e-1).
Şekil 9.e-1
Project menüsünden Referances komutu verildiği zaman ekrana gelen diyalog kutusunda üzerinde
çalıştığınız Visual Basic proje dahilinde kullanılacak kitaplıklar seçilmektedir. Yeni bir Visual Basic
proje hazırladığınızda Referances diyalog kutusunda listelenen seçeneklerin ilk 4’ü seçili durumdadır
(Şekil 9.e-2).
Şekil 9.e-2
443
Şekil 9.e-3
Microsoft DAO 3.51 Object Library üzerinde çalışılan projeye References diyalog kutusu
aracılığı ile dahil edilmediği sürece CreateDatabase() gibi fonksiyonları kullanmak mümkün değildir
(Şekil 9.e-3). Eğer üzerinde çalıştığınız Visual Basic’in nesne bağlama ve katma özelliklerinden
yararlanmıyorsanız References diyalog OLE Automation seçeneğini iptal edebilirsiniz.
CreateDatabase() fonksiyonu dışarıdan ikisi seçimlik olan 3 parametre almaktadır. Oluşturulacak
veri tabanı dosyasının adını içeren ilk parametrenin kullanılması zorunludur.
Dosya = CreateDatabase(“TEST.MDB”)
Bu program satırı ile hard diskteki adı TEST.MDB ve program içindeki adı Dosya olan bir veri
tabanı nesnesi oluşturulur. Yeni oluşturulan Dosya adındaki Database nesnesinin ayrıca SET deyimi
ile set edilmesi gerekir. Bu nedenle yukarıda verilen program satırı;
SET Dosya = CreateDatabase(“TEST.MDB”)
şeklinde değiştirilmelidir. Bütün fonksiyonlar gibi CreateDatabase() fonksiyonu da geriye bir değer
döndürür. Burada geriye döndürülen değer yeni bir veri tabanı nesnesidir. Bu nesnenin bir kopyası
program çalıştığı sürece Database özellikli bir değişkende saklanılacağı için bu değişkenin daha
önceden tanımlanması gerekir. Database nesnesinin içeriğini program çalıştığı sürece bellekte
saklayacak değişken Database bildiri deyimi ile tanımlanır.
Dim Dosya As Database
SET Dosya = CreateDatabase(“TEST.MDB”)
444
Oluşturulacak veri tabanı dosyasının adından önce istenirse dosyanın yazılcağı sürücü ve dizin adı
belirtilebilir. Create() fonksiyonuna verilen 2. parametrede dil veya ülke kodu belirtilir.
Dim Dosya As Database
SET Dosya = CreateDatabase(“C:\ORNEK\TEST.MDB”,dbLangGeneral)
CreateDatabase() fonksiyonu ile Access formatında MDB uzantılı veri tabanı dosyası
oluşturulurken Visual Basic çok sayıda sabit bilgiden yararlanır. Bu sabit bilgilerin ışığında dosya
hazırlanır. Bu sabit bilgiler Visual Basic’in 3.0 versiyonunda Visual basic ile Birlikte verilen
DATACONS.TXT adlı dosyada bulunuyordu. Bu ndenle Visual Basic’in 3.0 versiyonu dahilinde
CreateDatabase() fonksiyonunu kullanmadan önce bu sabit bilgi dosyanın üzerinde çalışılan projeye
dahil edilmesi gerekiyordu. Ancak Visual Basic’in 4.0, 5.0 ve 6.0 versiyonunda buna gerek yoktur.
CreateDatabase() fonksiyonu ile MDB uzantılı veri tabanı dosyası hazırlanırken gerek duyulan sabitler
projeye otomatik olarak dahil edilmektedir.
Yukarıda verilen iki satırlık program kodu işletilecek olunursa, belirtilen sürücü ve klasörde
TEST.MDB adında Access formatında bir veri tabanı dosyası oluşturulur. Yeni bir veri tabanı dosyası
oluşturmak üzere hazırladığım 2 satırlık program kodlarını üzerinde çalıştığım örnek projedeki formun
Form_Click() yordamına dahil edelim.
Private Sub Form_Load()
Dim Dosya As Database
Set Dosya = CreateDatabase("c:\Belgelerim\TEST.MDB", dbLangGeneral)
End Sub
Form_Click yordamı bu şekilde hazırlanan proje başlatılıp çalışma anında formun üzerinde tıklama
yapılırsa söz konusu veri tabanı dosyası oluşturulur. Hard diskte bulunan bir veri tabanı dosyası
CreateDatabase() fonksiyonu ile tekrar oluşturulmak istenirse hata meydana gelir.
Bu şekilde oluşturulan TEST.MDB dosyası program çalıştığı sürece program dahilinde artık bir
nesnedir. Bu Database tipindeki nesnenin de kendisine özgü Properties veya özellikleri bulunur. Nasıl
ki daha önce hakkında bilgi verilen değişik nesneler üzerinde işlem yapmak için değişik amaç ve
işleve sahip metotlar kullanılıyorsa Database nesnesi üzerinde etkili olan metotlar vardır.
Bu şekilde oluşturulan bu TEST.MDB adlı veri tabanı dosyasının içeriği henüz boştur. Bu dosyada
bilgi kaydedilecek tablo henüz yoktur. Bunu göstermek için Visual Basic ile birlikte verilen Visual
data Manager’ı çalıştırıp hazırladığım TEST.MDB dosyasını açınca aşağıda verilen ekran görüntüsünü
elde edilir.
445
Şekil 9.e-4
Oluşturduğumuz TEST.MDB adındaki veri tabanı dosyasına şimdi bir Tablo ekleyelim. Önce bu
amaçla hazırladığımız örnek yordamı verelim. Daha sonra yordamda kullandığımız deyim ve
fonksiyonlar hakkında bilgi vereceğiz. Veri tabanına tablo eklemede kullanılan program satırları
projenin formuna ait Form_Click yordamına dahil edelim.
Sub Form_Click()
Dim Dosya As Database
Dim Tablo As New TableDef
Dim Idx As New Index
Dim Alan1 As New Field
Dim Alan2 As New Field
Dim Alan3 As New Field
Dim Alan4 As New Field
Dim Alan5 As New Field
Dim Alan6 As New Field
Set Dosya = OpenDatabase("C:\Belgelerim\TEST.MDB")
Tablo.Name = "ADRES"
Alan1.Name = "Ad"
Alan1.Type = 10
Alan1.Size = 15
Tablo.Fields.Append Alan1
Alan2.Name = "Soyad"
Alan2.Type = 10
Alan2.Size = 15
Tablo.Fields.Append Alan2
Alan3.Name = "Adres"
Alan3.Type = 10
Alan3.Size = 30
Tablo.Fields.Append Alan3
446
Alan1.Name = "Tel"
Alan1.Type = 10
Alan1.Size = 10
Tablo.Fields.Append Alan4
Alan1.Name = "Sehir"
Alan1.Type = 10
Alan1.Size = 10
Tablo.Fields.Append Alan5
Idx.Name = “PrimaryKey”
Idx.Unique = True
Idx.Primary = True
Idx.Fields = "Soyad"
Tablo.Indexes.Append Idx
Dosya.TableDefs.Append Tablo
End Sub
Şimdi mevcut bir veri tabanı dosyasına tablo eklemek amacıyla kullanılan bu yordamı kısım kısım
açıklayalım. Yukarıdaki sayfalarda belirtildiği gibi veri tabanı dosyaları ile ilgili olarak kullanılan her
nesne için önceden değişken tanımlama işlemi yapılmalıdır. Bunun için yordamın en başında veri
tabanı dosyası üzerinde işlem yapmada kullanılacak bütün nesneler için önceden değişken tanımlaması
yapıldı. Aşağıda tekrar verilen satırlarda Database, Table, Index ve Field nesneleri için değişken
tanımlama işlemleri yapılmaktadır. Veri tabanı dosyası nesnesi için değişken tanımlanırken Dim
bildiri deyimi ile birlikte Database bildiri deyimi kullanılmaktadır.,
Dim Dosya As Database
Dim Tablo As New TableDef
Dim Idx As New Index
Dim Alan1 As New Field
Dim Alan2 As New Field
Dim Alan3 As New Field
Dim Alan4 As New Field
Dim Alan5 As New Field
Dim Alan6 As New Field
Benzer şekilde Table nesnesi içi,n değişken tanımlamada TableDef deyimi kullanılmaktadır.
Yukarıdaki örnekte veri tabanı dosyasına Tablo eklemek amacıyla kullanılan değişkene Tablo adı
verildi. Eğer veri tabanı dosyasına birden fazla Table nesnesi eklemek veya birden fazla table nesnesi
içeren veri tabanı dosyası üzerinde işlem yapılmak istenirse TableDef bildiri deyimi ile birden fazla
Table tipli değişken tanımlamamız gerekirdi.
Aslında Dim Tablo As New TableDef program satırı ile yapılan değişken tanımlama bildiğimiz
değişken tanımlama işleminden oldukça farklı işleve sahiptir. TableDef bildiri deyimi ile değişken
447
tanımlamadan öte başlangıçta herhangi bir özelliği olmayan bir Table nesnesi tanımlanmaktadır.
Tanımlanan nesnenin yeni olduğunu belirtmek için TableDef bildiri deyiminden önce New bildiri
deyimi kullanıldı. Bu şekilde yapılan değişken tanımlama işlemine Nesne Tanımlama denilebilir.
TableDef bildiri deyimi ile Table nesnesi için değişken tanımlaması yapılan program satırından
sonraki satırda Index bildiri deyimi ile Index nesnesi için değişken tanımlaması yapılmaktadır. Veri
tabanı programlarının en önemli özelliklerinin başında Index kullanımı konusunda sağladıkları
kolaylıklardır. Bunun için veri tabanı dosyası ve Table nesnesi söz konusu olunca, Index dosyasından
yararlanmamak düşünülemez. Veri tabanı dosyasında bulunan her Table için ayrı indexleme yapılır.
Program dahilinde üretilecek bilgilerden saklanılacak olanlar için veri tabanı dosyası hazırlanırken
en başta dosyada saklanılacak bilgiler veya alanların adları, tipleri ve uzunlukları belirlenir. Bunun için
yordamın başında her Field nesnesi için Field tipi bir değişken tanımlaması yapılmalıdır. Field tipli
değişken tanımlamak için Filed bildiri deyimi kullanılır.
Yordamda kullanılacak nesneler için değişken tanımlama işlemi yapıldıktan sonra ilk olarak
kendisine Table nesnesi eklenecek veri tabanı dosyasının açılması gerekir. Hard diskteki adı
TEST.MDB olan veri tabanı dosyası üzerinde işlem yapabilmek için dosyanın OpenDatabase()
fonksiyonu ile açılması gerekir. OpenDatabase() fonksiyonu dışarıdan parametre olarak üç tanesi
seçimlik olan 4 bilgi almaktadır. İlk parametrede açılacak dosyanın adı belirtilir.
SetDosya = OpenDatabase (“C:\Belgelerim\TEST.MDB”)
Bu program satırı ile hard diskteki adı TEST.MDB olan Access formatındaki veri tabanı dosyası
açılıp Database tipli “Dosya” değişkenine Set edilir. Eğer açılmak istenen dosya çok kullanıcılı bir
ortamda kullanılıyor ve başka kullanıcıların dosyaya erişimi engellenmek isteniyorda OpenDatabase()
fonksiyonuna 2. parametre olarak “True” mantıksal değeri verilmelidir.
SetDosya = OpenDatabase (“C:\Belgelerim\TEST.MDB”, True)
Eğer açılan dosya üzerinde işlem yapılmasını istemiyorsanız dosyayı ReadOnly modunda
açmalısınız. Dosyayı ReadOnly modunda açabilmek için 3. parametreden yararlanılır. OpenDatabase)
fonksiyonuna 3. parametre olarak True mantıksal değeri verilirse dosyada değişiklik yapılmaz. Eğer
açılmak istenen dosya MDB uzantılı Access formatlı dosya değilse, söz konusu dosyanın 4.
parametresi belirtilmelidir.
SetDosya = OpenDatabase (“C:\Belgelerim\TEST.MDB”, True, False, Paradox)
Veri tabanı dosyası için hazırladığımız Table tipli nesnenin henüz adı belli değildir. Aşağıda verilen
program satırı ile Table nesnesinin adı belirlenmektedir.
Tablo.Name = ”ADRES”
Table nesnesine ADRES adını verdik. Table nesnesinin adı belirlendikten sonra sıra bu nesneye
Field veya alan eklemeye gelir. Alanın adından başka, alanın tipinin ve uzunluğunun mutlaka
belirtilmesi gerekir.
448
Alan1.Name = "Ad"
Alan1.Type = 10
Alan1.Size = 15
Alanın veya Field nesnesinin tipini belirtmeye yarayan Type değişkenine aktarılan sayı aşağıda
görülüyor. Field nesnesine ait Type değişkenine aktarılan 10 sayısal değerin gerçekte Text tipindeki
verileri temsil ettiği görülür. Field nesnesine ait Type değişkenine aktarılan 10 sayısal değerin Text
tipindeki verileri temsil ettiğini ezbere bilmiyorsanız, 10 yerine Type değişkenine dbText değerini
aktarabilirsiniz. Önce New Field bildiri deyimi ile oluşturulan daha sonra kendisine Name, Type ve
Size değişkenleri ile özellikleri belirlenen bir Field nesnesini Table nesnesine dahil etmek veya Field
nesnesinden Table nesnesi içinde yararlanmak için Append methodundan yararlanılır.
Constant
Value
Description
dbBoolean
1
Boolean (True/False) data
dbByte
2
Byte (8-bit) data
dbInteger
3
Integer data
dbLong
4
Long Integer data
dbCurrency
5
Currency data
dbSingle
6
Single-precision floating-point data
dbDouble
7
Double-precision-floating-point data
dbDate
8
Data value data
dbText
10
Text adta (variable width)
dbLongBinary
11
Binary data (bitmap)
dbMemo
12
Memo data
Table nesnesinde bulunan Field veya alanlar, Table nesnesine ait Fields adlı değişkeninde saklanır.
Field kendi başına bir nesne iken, Fields Table nesnesine ait bir değişkendir.
Tablo.Fields.Append Alan1
Bu program satırı ile örneğimize göre diskteki ADRES ve program içindeki “Tablo” olan Table
nesnesine Append methodu ile “Alan1” adlı Field nesnesi eklenmektedir.
Şimdi sıra Table nesnesine yapılacak kayıtlara erişimde kullanılacak olan Index’in belirlenmesine
geldi. Table nesnesine eklenen alanlardan istenen alan Index anahtarı olarak kullanılabilir. Index
449
nesnesinden Table nesnesi içinde yararlanabilmek veya Index nesnesini
Table nesnesine dahil
edebilmek için daha önce Index nesnesine ait Name, Unique, Primary ve Fields değişkenlerine bilgi
aktarılması gerekiyor.
Idx.Name = “PrimaryKey”
Idx.Unique = True
Idx.Primary = True
Idx.Fields = "Soyad"
Index’in adı Name değişkenine, Index anahtarı olarak kullanılacak alanın adı ise Index nesnesine
ait Fields değişkenine aktarılır. Table nesnesine ait Fields değişkeni ile Index nesnesine ait olanı
birbirleri ile karıştırmamak gerekir. Bir table nesnesinde birden fazla index kullanılabilir. Ancak
bunlardan yalnızca biri Primary index olarak seçilebilir. Bunun dışında aynı anahtar değerine sahip
birden fazla kayda izin verilip verilmeyeceğini Index nesnesine ait Unique değişkeni ile belirlenir.
Index nesnesinin gerekli olan bütün özellikleri bu şekilde belirlendikten sonra yine Append methodu
ile hazırlanan Index nesnesi Table nesnesine dahil edilmelidir.
Tablo.Indexes.Append Idx
Hazırladığımız Index nesnesine Idx adını verdiğimizi hatırlayalım. Bu işlemden sonra Table
nesnesi veri tabanı nesnesine dahil edilebilir duruma geldi. Table nesnesini Database nesnesine dahil
edebilmek için yine Append methodundan yararlanılır. Database nesnesinde bulunan Table’lar
Database nesnesine ait TableDefs adlı değişkende saklandığı için Database nesnesine Table nesnesi
eklemede kullanılan program satırı aşağıdaki gibi olmalıdır.
Dosya.TableDefs.Append Tablo
Bu örnek çalıştırıldıktan sonra hard diskteki adı TEST.MDB olan Access formatındaki veri tabanı
dosyasına ADRES adında bir tablo eklenir (Şekil 9.e-5).
450
Şekil 9.e-5
1. MDB Dosyasına Yeni Kayıt Yazmak
Şekil 9.e-6
Çalışma anında kullanıcı Formdaki TextBox’lara kaydın içeriğini girip Kaydet düğmesinde tıklama
yapınca TextBox’ların içerlikleri MDB dosyasının ADRES adlı tablosuna yazılacaktır. Bu nedenle
TEST.MDB veri tabanı dosyası ile dosyanın ADRES adlı tablonun açılması sağlanmalıdır. Veri tabanı
dosyasını ve dosyadaki tabloyu açmak için daha önceden Database ve RecordSet tipli iki değişkenin
tanımlanması gerekir. Veri tabanı dosyasına kayıt girmek amacıyla kullanılacak bu örnek projede
birden fazla yordam olacağı için Database ve RecordSet tipli değişkenlerin forma ait Declaration
kısmında tanımlanması gerekir (Şekil 9.e-7).
451
Şekil 9.e-7
Database tipli değişkene “Dosya”, RecordSet tipindeki değişkene ise “Kayıt” adını verelim.
Değişken tanımlama işleminden sonra dosyanın ve tablonun açılmasını sağlamalı veya tanımlanan
değişkenlere Set edilmelidir.
Form_Load yordamındaki Kayıt.Index = “PrimaryKey” satırı ile kullanılacak index dosyası seçilir.
Kayıt girişinde olmasa bile kayıt okumada mutlaka index dosyası açılmalıdır. Seçilen index dosyası o
anda kullanılan Table nesnesine ait “Index” adlı değişkende saklanır.
Kayıt girilecek tablodaki alanlarla aynı sayıda TextBox bulunan bir forma sahip proje çalıştırılınca
imleç formdaki ilk TextBox’a konumlanır. Veri tabanı dosyasına yazılmak istenen kaydın
ayrıntılarının ilgili TextBox’lara yazılması tamamlanınca formdaki Kaydet başlıklı düğmede tıklama
yapılmalıdır. Bu nedenle TextBox’lara girilen bilgilerin MDB dosyasına yazacak program kodlarının
Kaydet başlıklı düğmeye ait Click yordamına yazılması gerekir.
Private Sub KAYDET_Click()
Cevap = MsgBox("Bu kayıt dosyaya yazılsın mı?", 4)
If Cevap = 6 Then
Kayıt.AddNew
Kayıt.Fields("Ad") = Text1.Text
Kayıt.Fields("Soyad") = Text2.Text
Kayıt.Fields("Adres") = Text3.Text
Kayıt.Fields("Tel") = Text4.Text
Kayıt.Fields("Sehir") = Text5.Text
Kayıt.Update
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
452
Text1.SetFocus
End If
End Sub
Çalışma anında TextBox’lara bilgi girilip “Kaydet” düğmesinde tıklama yapıldığı zaman işletilen
Kaydet_Click yordamında en başta kullanıcıdan MsgBox() fonksiyonu ile kaydın tabloya yazılması
konusunda onay alınmaktadır.
Yöneltilen soruya Evet cevabının verilemsi halinde ilk olrak AddNew methodu ile tablonun sonuna
boş bir kayıt eklenir. Ardından TextBox’ların içerikleri tek tek kaydın alanlarına aktarılır. En son
olarak Update methodu ile RecordSet nesnesinin içeriklerinin tabloya yazılması sağlanır.
2. Veri Tabanı Dosyasındaki Kayıtların Arasında Dolaşmak
Proje başlatılır başlatılmaz hem veri tabanı dosyası açılır hem de dosyanın seçilen tablosundaki ilk
kaydı ekrana getirilir. Bu amaçla projenin formunun Form_Load yordamı aşağıdaki şekilde
düzenlenir.
Private Sub Form_Load()
Set Dosya= OpenDatabase("C:\Belgelerim\TEST.MDB")
Set Kayıt = Dosya.OpenRecordset("ADRES")
Kayıt.Index = "PrimaryKey"
Kayıt.MoveFirst
Text1.Text = Kayıt.Fields("Ad")
Text2.Text = Kayıt.Fields("Soyad")
Text3.Text = Kayıt.Fields("Adres")
Text4.Text = Kayıt.Fields("Tel")
Text5.Text = Kayıt.Fields("Sehir")
End Sub
453
Şekil 9.e-8
TEST adı verilen veri tabanı dosyası CreateDatabase() fonksiyonu ile hazırlanırken ikinci
parametre olarak “dbLangGeneral” yerine dbLangTurkish bilgisi verilseydi indexler Türkçenin
alfabetik sırasını gözetirdi.
Set Dosya = CreateDatabase( “C:\ORNEK\TEST.MDB “, dbLangTurkish)
Bu sırada “Sonraki kayıt” başlıklı düğmede tıklama yapılınca bu düğmeyle aynı ada sahip yordam
işletilir. Bir sonraki kaydı ekrana getirmek için MoveNext methodu ile kayıt okuma kafası bir sonraki
kayda konumlanır.
Private Sub İleri_Click()
Kayıt.MoveNext
Text1.Text = Kayıt.Fields("Ad")
Text2.Text = Kayıt.Fields("Soyad")
Text3.Text = Kayıt.Fields("Adres")
Text4.Text = Kayıt.Fields("Tel")
Text5.Text = Kayıt.Fields("Sehir")
End Sub
Bir önceki kayda gitmeyi sağlayan yordamın, bu yordamdan tek farkı, MoveNext yerine
MovePrevious methodunun kullanılmasıdır.
3. Veri Tabanı Dosyasında Kayıt Aramak
Tablolarda çok sayıda kayıt varsa ileri geri arama suretiyle kayıt arama bazen pratik olmaz. Bu
amaçla indexlerden yararlanarak hızlı bir şekilde istenen kayıt tabloda bulunabilir. Veri tabanı
454
dosyasının aktif tablosundan arama yapmak için Seek methodu kullanılır. Açık olan herhangi bir index
yokken Seek methodu kullanılamaz.
Kullanıcı çalışma anında tablodan kayıt araması yapmak istediği zaman Kayıt Arama başlıklı
düğmede tıklama yapacak. Bu düğmede tıklama yapılınca kullanıcıdan aranacak kaydın arama
anahtarı istenir. Üzerinde çalıştığımız TEST.MDB dosyasındaki tek Table olan ADRES tablosunda bir
tek index hazırlanmış ve index için Soyad alanı index anahtarı olarak gösterilmiştir. Buna göre bie
Seek methodu ile ancak Soyad alanına göre kayıt araması yapılabilir. Bu amaçla Kayıt Arama başlıklı
düğmede tıklama yapılınca SetFocus methodu ile imlecin Soyad TextBox’ına gitmesi sağlandı.
Private Sub KayıtArama_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Kayıt.MoveFirst
Text1.SetFocus
End Sub
Verilen program kodlarından tespit edileceği gibi Kayıt Arama başlıklı ve “Arama” adlı düğmede
tıklama yapılınca, Formdaki bütün TextBox’ların içerikleri silinmektedir. Bu sırada Tab tuşu veya fare
ile ekleme noktasını bir sonraki metin kutusuna aktaracak olursanız “Soyad” adlı bu metin kutusu ile
ilgili olarak LostFocus olayı meydana gelir. Bu nedenle kayıt arama işlemini yapacak program kodları
“Soyad” adına sahip metin kutusunun LostFocus yordamına dahil edilir.
Private Sub Soyad_LostFocus()
Kayıt.Seek "=", Text2.Text
Text1.Text = Kayıt.Fields("Ad")
Text2.Text = Kayıt.Fields("Soyad")
Text3.Text = Kayıt.Fields("Adres")
Text4.Text = Kayıt.Fields("Tel")
Text5.Text = Kayıt.Fields("Sehir")
End Sub
Yapılan tanımlamaya göre kullanıcı aramak istediği kaydın anahtarını girdikten sonra aramayı
başlatabilmesi için Soyad adındaki TextBox’ta iken Tab tuşuna basması gerekiyor. Soyad adlı
TextBox’ta Tab tuşuna basılması halinde işletilecek bu yordam ile Soyad TextBox’ın içeriğine göre
Seek methodu ile arama yapılır. Bu yordamda aranan kayıt bulunduktan sonra alanların içerikleri ilgili
TextBox’lara aktarılır. Aranan kaydın dosyada bulunup bulunmadığını öğrenmek için Table nesnesine
ait NoMatch değişkenin içeriğine bakılır. Seek methodu ile arama yapılan her arama işleminden sonra
Tabloya ait NoMatch değişkenin içeriği güncelleşir. Aranan kayıt varsa bu değişkenin içeriğine
mantıksal False (0) , aranan kayıt bulunamazsa bu kez NoMatch değişkenine mantıksal True (-1)
değeri aktarılır.
455
Private Sub Soyad_LostFocus()
Kayıt.Seek "=", Text2.Text
If Kayıt.NoMatch = 0 Then
Text1.Text = Kayıt.Fields("Ad")
Text2.Text = Kayıt.Fields("Soyad")
Text3.Text = Kayıt.Fields("Adres")
Text4.Text = Kayıt.Fields("Tel")
Text5.Text = Kayıt.Fields("Sehir")
End If
End Sub
Seek methodunun dışarıdan iki parametre aldığı görülür. Birincisinde “=”,”<” gibi operatörler,
ikincisinde ise arama anahtarı. Eğer arama anahtarınız Maaş gibi sayısal bilgi içeren bir alan ve
Tablodan maaşı 15.000.000’ dan fazla olan herhangi bir kişinin kaydı aranıyor olsaydı Seek methodu,
TabloNesnesi.Seek > 15000000
şeklinde kullanılırdı. Seek methodundan sonra tabloya ait NoMatch değişkeninin içeriği güncelleşir.
Arana kayıt bulunmuş ise bu değişkenin içeriği mantıksal yanlış veya 0 olur.
4. Kayıtlarda Değişiklik Yapmak
Çalışma anında “Değiştir” başlıklı düğmede tıklama yapılınca TextBox’ların en son içeriği Update
methodu ile tabloda aynı kaydın üzerine tekrar yazılacaktır. Bunun için de TextBox’ların içeriklerinin
tekrar alanlara aktarılması gerekir. Okunan bir kaydın içeriğinde değişiklik yapabilmek için daha
önceden Edit moduna geçmek gerekiyor. Bunun için Edit methodundan yararlanılır.
Private Sub Değiştir_Click()
Kayıt.Edit
Kayıt.Fields("Ad") = Text1.Text
Kayıt.Fields("Soyad") = Text2.Text
Kayıt.Fields("Adres") = Text3.Text
Kayıt.Fields("Tel") = Text4.Text
Kayıt.Fields("Sehir") = Text5.Text
Kayıt.Update
End Sub
5. Veri Tabanı Dosyasından Kayıt Silmek
456
Önce silinmek istenen kayıt bulunur. Ardından Delete methodu ile söz konusu kayıt dosyadan
silinir. Bu yordamda Delete methodu ile yapılan kayıt silme işleminden sonra MovePrevious methodu
ile tablodaki bir önceki kayda gidilmekte ve bu kaydın içeriği TextBox’lar aracılığı ile ekrana
getirilmektedir.
Private Sub KayıtSil_Click()
Kayıt.Delete
Kayıt.MovePrevious
Text1.Text = Kayıt.Fields("Ad")
Text2.Text = Kayıt.Fields("Soyad")
Text3.Text = Kayıt.Fields("Adres")
Text4.Text = Kayıt.Fields("Tel")
Text5.Text = Kayıt.Fields("Sehir")
End Sub
9.f. Recordset Nesnesi
Visual Basic’in veri tabanı özellikleri hakkında bilgi verilen daha önceki bölümlerden bildiğiniz
gibi üzerinde çalıştığınız projenin herhangi bir formuna bir Data nesnesi yerleştirmeniz halinde
Database ve RecordSet nesneleri otomatik olarak hazırlanmaktadır. Diğer yandan Data
kontrollerinden yararlanmadan tabanı dosyası üzerinde işlem yaparken Database ve RecordSet
nesnelerini kendimiz tanımlamak durumdayız. Veri tabanı dosyaları üzerinde işlem yaparken
kullanılan RecordSet gibi nesnelerin şimdiye kadar anlatılmayan özellikleri hakkında bilgi vermek için
yeni bir proje hazırlayalım (Şekil 9.f-1).
457
Şekil 9.f-1
Proje çalıştırıldığı zaman Stok veri tabanı dosyası açılacak ve Kartlar tablosundaki ilk kaydın
içeriği forma yerleştirmiş olduğumuz metin kutularına yazılacaktır. Bu amaçla ilk olarak formun
Declaration kısmında Database ve RecordSet tipinde iki değişken tanımlamak gerekir (Şekil 9.f-2).
Şekil 9.f-2
Hemen hatırlatmak gerekirse Data kontrolünü kullanmadan Visual Basic’in veri tabanı
özelliklerinden yararlanmak veya Database nesnesi yardımıyla dosya açmak için daha önceden Project
menüsündeki Referans komutu ile ekrana getirilen Referans diyalog kutusundan yararlanıp üzerinde
çalıştığımız projeye Microsoft Database Object kitaplık dosyasını dahil etmemiz gerekir
(Şekil 9.f-3).
458
Şekil 9.f-3
Projenin değişik yordamlarında kullanacağımız değişkenleri formun Declaration kısmında
tanımlayıp ve Projeye “Microsoft Database Object” kitaplık dosyasını dahil ettikten sonra Form_Load
yordamına aşağıdaki program satırlarını yazalım.
Private Sub Form_Load()
Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb")
Set Kayıt = Dosya.OpenRecordset("Kartlar")
Kayıt.Index = "KodIndex"
Form1.Text1 = Kayıt.Fields("StokKodu")
Form1.Text2 = Kayıt.Fields("StokAdı")
Form1.Text3 = Kayıt.Fields("Birim")
Form1.Text4 = Kayıt.Fields("Fiyat")
Form1.Text5 = Kayıt.Fields("Miktar")
End Sub
Daha önceki konulardan bildiğiniz gibi bu program satırları ile önce Stok.mdb dosyası
açılmaktadır. Ardından OpenRecordSet() fonksiyonu ile Stok veri tabanı dosyasındaki “Kartlar”
tablosu açılmakta ve bir RecordSet nesnesi hazırlanmaktadır. Visual Data Manager ile Kartlar
tablosunu hazırlarken StokKodu alanını temel alan ve “KodIndex” adındaki bir index tanımlamıştık.
Daha önce söz konusu tablo (RecordSet nesnesi) için hazırlanmış olan indexlerden hangisini
kullanmak istiyorsanız o index’in adını RecordSet nesnesinin Index özelliğine aktarmanız gerekir.
Projenin çalışması sona erdirildiği veya projedeki tek form kapatıldığı zaman açılan dosyanın
kapatılmasını sağlamak için Form_Unload yordamında Close metodunu kullanmalıyız. Close methodu
ile veri tabanı dosyasını kapatırsanız daha önce açılan tablolar ve indexler kendiliğinden kapanır.
Private Sub Form_Unload(Cansel As Integer)
Dosya.Close
459
End Sub
Bu işlemlerden sonra hazırlanan proje çalıştırılınca Kartlar tablosundaki ilk kaydın içeriği formdaki
metin kutusuna yazıldı. Daha önce hazırlanan index devreye sokulduğu için kayıtlar indexe temel
oluşturan alana göre sıralanıp öyle ekrana gelir (Şekil 9.f-4).
Şekil 9.f-4
İlk olarak tablolarda nasıl arama yapıldığı konusunda bilgi edinelim. Bu amaçla formun üzerine
Kayıt Arama başlığına sahip bir düğme yerleştirelim. Daha önceki konulardan bilindiği gibi kayıt
ararken “Seek” metodu kullanılmaktadır. Seek metodunun kullanış şeklini hatırlayalım.
Private Sub Arama_Click()
Ara = InputBox("Kayıt Arama")
Kayıt.Seek "=", Ara
If Kayıt.NoMatch = False Then
Form1.Text1 = Kayıt.Fields("StokKodu")
Form1.Text2 = Kayıt.Fields("StokAdi")
Form1.Text3 = Kayıt.Fields("Birim")
Form1.Text4 = Kayıt.Fields("Fiyat")
Form1.Text5 = Kayıt.Fields("Miktar")
Else
MsgBox "Aranan Kayıt Bulunamadı"
End If
End Sub
Çalışma anında Kayıt arama başlıklı düğmede tıklama yapılıp bu yordam işletilecek olunursa önce
InputBox()) fonksiyonu yardımıyla aranacak kaydın veya Stokun kodunun girilebildiği bir diyalog
kutusu ekrana gelir (Şekil 9.f-5).
460
Şekil 9.f-5
InputBox fonksiyonu ile ekrana getirilen diyalog kutusuna yazılan StokKodu önce “Ara” adı
verilen değişkene aktarılır. Ara değişkeni ise Seek metoduna parametre olarak verilmektedir. Daha
önceki konulardan bildiğiniz gibi Seek methodu ile indexlerden yararlanarak yapılan her arama
işleminden sonra RecordSet nesnesinin NoMatch özelliğinin içeriği değişmektedir. Seek metodu ile
yapılan arama işlemi sonucu aranan kayıt tabloda bulunduğu zaman NoMatch özelliğine mantıksal
yanlış (false) değeri aktarılmaktadır. Yazılan program kodlarına göre aranan kayıt bulunduktan sonra
kaydın içeriği formdaki metin kutularına aktarılmaktadır.
Aynı Stok koduna sahip birden fazla kaydın olmasını engellemek için Kartlar tablosu için
hazırladığımız indexe Unique özelliği verilmişti. Ancak “Hareketler” tablosunda aynı Stok koduna
sahip birden fazla kayıt bulunabileceği için Hareketler tablosu için hazırlanan indsex Unique
özelliğine sahip değildir. Aynı koda veya arama anahtarına sahip birden fazla kaydın söz konusu
olduğu durumlarda Seek metodu yeterli olmamaya başlar.
Bu gibi durumlarda FindFirst, FindNext, FindLast ve FindPrevios metotları kullanılmaktadır.
Arama işlemi yapılırken kullanılan bu 4 metodu anlatmak için “Kartlar” tablosu ile birlikte Stok veri
tabanı dosyasındaki “Hareketler” tablosunu açalım. Bu amaçla ilk olarak Hareketler tablosu için
formun Declaration kısmında “İşlemler” adında bir RecordSet nesnesi tanımlayalım.
Bu şekilde Hareketler tablosu için bir RecordSet nesnesi tanımlandıktan sonra içeriği ekrana
getirilen Stok Kartı ile ilgili giriş-çıkışları “Hareketler” tablosundan bulup formun alt kısmına
yazabilmek için üzerinde çalışılan projenin formunu düzenleyelim (Şekil 9.f-6).
461
Şekil 9.f-6
Form bu şekilde düzenlenip proje çalıştırıldığı zaman ilk olarak Kartlar tablosundaki ilk kaydın
içeriği formun üst kısmındaki metin kutularına yazılır. Bu işlemleri yapacak program kodları aşağıda
görebilirsiniz. Ardından içeriği ekranda görüntülenen Stok kartına ait ilk giriş veya çıkış işlemleri
Hareketler tablosundan aranıp formun alt kısmında bir sıra halinde düzenlenen metin kutularına
yazılır.
Private Sub Form_Load()
Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb")
Set Kayıt = Dosya.OpenRecordset("Kartlar")
Set
Islemler
=
Dosya.OpenRecordset("Hareketler",
dbOpenDynaset)
Kayıt.Index = "KodIndex"
Form1.Text1 = Kayıt.Fields("StokKodu")
Form1.Text2 = Kayıt.Fields("StokAdi")
Form1.Text3 = Kayıt.Fields("Birim")
Form1.Text4 = Kayıt.Fields("Fiyat")
Form1.Text5 = Kayıt.Fields("Miktar")
Ölçüt = Text1.Text
Ölçüt = "StokKodu ='" & Ölçüt & "'"
Islemler.FindFirst Ölçüt
Form1.Text6 = Str(Islemler.AbsolutePosition + 1)
Form1.Text7 = Islemler.Fields("Tarih")
Form1.Text8 = Islemler.Fields("Islem")
Form1.Text9 = Islemler.Fields("Aciklama")
Form1.Text10 = Islemler.Fields("Miktar")
End Sub
Proje çalıştırıldığı zaman işletilecek bu yordamda önce Stok veri tabanı dosyası, ardından Kartlar
ve Hareketler tablosu açılmaktadır. Ardından Kartlar tablosu için daha önce hazırlanmış olan
“KodIndex” adındaki index devreye sokulmaktadır. Bu örnekte Hareketler tablosunu açarken veya bu
tablo için RecordSet nesnesini tanımlarken OpenREcordSet() fonksiyonuna ikinci parametre olarak
“dbOpenDynaset” değeri aktarıldı. OpenRecordSet() nesnesine dbOpenDynaset veya
dbOpenSnopshot değerleri ikinci parametre olarak verilmeden tanımlanan RecordSet nesneleri,
FindFirst gibi metotları desteklemiyor. Yukarıda kodları verilen Form_Load yordamında Hareketler
462
tablosunda arama yaparken FindFirst metodu kullanıldı. Şekil 9.f-7’de verilen ekran görüntüsü proje
çalıştırıldıktan sonra alınmıştır.
Şekil 9.f-7
Çalışma anında “Sonraki Hareket” başlığına sahip düğmede tıklama yapıldığı zaman içeriği
ekranda görüntülenen Stok kartı ile ilgili bir sonraki Stok giriş veya çıkış kaydını formun alt kısmına
getirmek için Aşağıda program kodları verilen program satırları hazırlandı.
Private Sub Sonraki_Hareeket_Click()
Ölçüt = Text1.Text
Ölçüt = "StokKodu ='" & Ölçüt & "'"
Islemler.FindNext Ölçüt
Form1.Text6 = Str(Islemler.AbsolutePosition + 1)
Form1.Text7 = Islemler.Fields("Tarih")
Form1.Text8 = Islemler.Fields("Islem")
Form1.Text9 = Islemler.Fields("Aciklama")
Form1.Text10 = Islemler.Fields("Miktar")
End Sub
İçeriği ekranda görüntülenen Stok kartına ait ikinci Hareketler tablosunu aramak için FindNext
metodu kullanıldı. Bu yordam ikinci kez işletildiğinde ise bu kez söz konusu stok kartına ait 3. hareket
kaydı tablodan aranıp ekrana getirilir. Benzer şekilde FindLast veya FindPrevius metotlarını
kullanabilirsiniz. Eğer formun üst kısmındaki metin kutularına Kartlar tablosundaki bir sonraki Stok
kartının içeriğini yazmak istiyorsanız bu kez “Sonraki Stok Kartı” düğmesinde tıklama yapmanız
gerekir. Sonraki Stok Kartı başlıklı düğme için hazırlanmış olan program kodları aşağıda
görebilirsiniz.
Private Sub SonrakiKart_Click()
Kayıt.Index = "KodIndex"
Form1.Text1 = Kayıt.Fields("StokKodu")
Form1.Text2 = Kayıt.Fields("StokAdi")
Form1.Text3 = Kayıt.Fields("Birim")
Form1.Text4 = Kayıt.Fields("Fiyat")
463
Form1.Text5 = Kayıt.Fields("Miktar")
Ölçüt = Text1.Text
Ölçüt = "StokKodu ='" & Ölçüt & "'"
Islemler.FindFirst Ölçüt
Form1.Text6 = Str(Islemler.AbsolutePosition + 1)
Form1.Text7 = Islemler.Fields("Tarih")
Form1.Text8 = Islemler.Fields("Islem")
Form1.Text9 = Islemler.Fields("Aciklama")
Form1.Text10 = Islemler.Fields("Miktar")
End Sub
Bu yordam sayesinde önce Stok kartındaki bir sonraki kayıt aktif kayıt durumuna getirilmektedir.
Ardından söz konusu stok kartı ile ilgili ilk stok giriş veya çıkış kaydı Hareketler tablosundan bulunup
formun alt kısmına yazılmaktadır. Şekil 9.f-9’de verilen ekran görüntüsü çalışma anında “Sonraki Stok
Kartı” başlıklı düğmede tıklama yapıldıktan sonra alınmıştır.
Şekil 9.f-9
1. RecordSet Nesnesi ile DBGrid Nesnesini Birlikte Kullanmak
Şimdi örnek olması için formun alt kısmına metin kutularını silip bir DBGrid nesnesi yerleştirelim.
Bu amaçla ilk olarak Components diyalog kutusundan yararlanıp üzerinde çalışılan projeye DBGrid
kontrolünü dahil edelim. DBGrid nesnesinden yararlanabilmek için formun üzerine ayrıca bir Data
nesnesi yerleştirelim. Şekil 9.f-10’da verilen ekran görüntüsünü DBGrid kontrolü projeye dahil
edildikten sonra alınmıştır.
464
Şekil 9.f-10
Bu işlemden sonra ekrana Properties diyalog kutusunu getirip Data nesnesi için veri tabanı dosyası
ve tablo seçimi yapılır. Data nesnesi için veri tadanı dosyası seçilirken DatabaseName özelliğinden
yararlanılır. Properties penceresinden yararlanarak Data nesnesi için dosya ve tablo seçimi yapıldıktan
sonra DBGrid nesnesi için DataSource özelliğnden yararlanarak RecordSet seçimi yapılır
(Şekil 9.f-11).
Şekil 9.f-11
Bu seçim ve ayarlamalardan sonra Form_Load yordamı aşağıdaki gibi yeniden yazıldı.
Private Sub Form_Load()
Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb")
Set Kayıt = Dosya.OpenRecordset("Kartlar")
465
Kayıt.Index = "KodIndex"
Form1.Text1 = Kayıt.Fields("StokKodu")
Form1.Text2 = Kayıt.Fields("StokAdi")
Form1.Text3 = Kayıt.Fields("Birim")
Form1.Text4 = Kayıt.Fields("Fiyat")
Form1.Text5 = Kayıt.Fields("Miktar")
End Sub
Bu program satırları sayesinde Kartlar tablosu açılır ve ilk kaydın içeriği formdaki metin kutularına
yazılır. Data nesnesi ile DBGrid nesnesi arasında Properties penceresinden yararlanılarak bağlantı
kurulduğu için bu sırada proje çalıştırılacak olursa formun üst kısmına Kartlar tablosundaki ilk kayıt,
Grid nesnesinde ise Hareketler tablosundaki bütün kayıtlar görüntülenir. Ancak DBGrid nesnesinde
yalnızca içeriği formun üst kısmında görüntülenen Stok kartına ait hareket kayıtlarının listelenmesi
istendiği için Form_Load yordamına SQL dilinin Select deyiminin kullanıldığı satır eklendi
Private Sub Form_Load()
Set Dosya = OpenDatabase("c:\Kitap\Stok.mdb")
Set Kayıt = Dosya.OpenRecordset("Kartlar")
Kayıt.Index = "KodIndex"
Form1.Text1 = Kayıt.Fields("StokKodu")
Form1.Text2 = Kayıt.Fields("StokAdi")
Form1.Text3 = Kayıt.Fields("Birim")
Form1.Text4 = Kayıt.Fields("Fiyat")
Form1.Text5 = Kayıt.Fields("Miktar")
Data1.RecordSource="select*from[Hareketler]where[StokKodu]="&
Kayıt![StokKodu] & ""
Data1.Refresh
End Sub
Form_Load yordamına eklenen bu program satırı sayesinde Formun üst kısmının içeriği
görüntülenen stok kartına ait stok giriş ve çıkış kayıtları görüntülenir. Şekil 9.f-13’de verilen ekran
görüntüsü bu değişiklikler gerçekleştirilip proje çalıştırıldıktan sonra alınmıştır. Data nesnesine
Visible değişkenine Properties penceresinden yararlanarak True değeri aktarıldığı için çalışma anında
Data nesnesi ekranda gizlenmiş durumdadır.
466
Şekil 9.f-12
Bu sırada Sonraki Stok Kartı başlıklı düğmede tıklama yapıldığı zaman bir sonraki Stok kartının
içeriğinin formdaki metin kutularında görüntülenmesi istenirse bu düğmenin Click yordamı aşağıdaki
şekilde düzenlenir.
Private Sub SonrakiKart_Click()
Kayıt.MoveNext
Form1.Text1 = Kayıt.Fields("StokKodu")
Form1.Text2 = Kayıt.Fields("StokAdi")
Form1.Text3 = Kayıt.Fields("Birim")
Form1.Text4 = Kayıt.Fields("Fiyat")
Form1.Text5 = Kayıt.Fields("Miktar")
Data1.RecordSource = "select*from [Hareketler] where
[StokKodu]=" & Kayıt![StokKodu] & ""
Data1.Refresh
End Sub
Bu yordam sayesinde hem bir sonraki Stok kartının üzerine gidilir hem de DBGrid nesnesine bu
stok kartına ait giriş ve çıkış kayıtları yazılır. Şekil 9.f-20’deki ekran görüntüsü “Sonraki Stok Kartı”
başlıklı düğmede tıklama yapıldıktan sonra alınmıştır.
Şekil 9.f-20
2. DATA Kontrolü ile DAO Library’i Birlikte Kullanmak
Bu kitabın şimdiye kadar verilen bölümlerinde veri tabanı dosyaları üzerine işlem yaparken ya Data
kontrolünden ya da Microsoft DAO 3.5 Library kitaplığından yararlandık. Program kodu dahilinde
veri tabanı dosyası üzerinde işlem yaparken kullanılan OpenF,database() ve OpenRecordset() gibi
fonksiyonları kullanabilmek için Microsoft DAO 3.5 Librar’nin projeye dahil edilmesi gerekir. Diğer
yandan aynı anda Data kontrolünden hem de Microsoft DAO 3.5 Library ile kullanıma sunulan
fonksiyon ve motodlarından yararlanmak mümkündür.
467
Data kontrolü ile Microsoft DAO Library’nin birlikte nasıl kullanıldığını görmek için Müşteri
adındaki veri tabanı dosyasından yararlanacağız. Bu veri tabanı dosyasında Cari Kartlar ve Cari
İşlemler adında iki tablo bulunmaktadır. Şekil 9.f-21'’e verilen ekran görüntüsü verilen formun üst
kısmında Data kontrolünden yararlanılarak Cari İşlemler tablosunun aktif kaydı görüntülenecektir. Alt
kısmında ise formun üst kısmında içeriği görüntülenen kayda ait Cari Hesap kaydının içeriği
görüntülenecektir.
Şekil 9.f-21
Bu forma yerleştirmiş olduğumuz Data nesnesi ile Müşteri.mbd dosyasındaki Cari İşlemler tablosu
arasında bağlantı kurulur. Ayrıca formun üst kısmındaki TectBox nesneleri ile Cari İşlemler
tablosunun alanları arasında bağlantı kuruldu. Bu işlemlerden sonra proje çalıştırıldığında Şekil 9.f22'’deki ekran görüntüsü ile karşılaşılır.
Şekil 9.f-22
9.g. Sorgu Hazırlamak ve SQL Dili
Bu bölümde ilk olarak Visual Data Manager’den yararlanarak Stok.mdb veri tabanı dosyası için bir
sorgu hazırlayalım. Bu amaçla ilk olarak Stok.mdb veri tabanı dosyasını açıp Data Manager
penceresinde getirelim. Ardından Manager penceresinin sol tarafındaki Database Window
penceresinin sınırları için farenin sağ tuşu ile tıklama yaparak kısayol menüsünü açalım.
Şekil 9.g-1
Yeni bir sorgu hazırlamak için kısayol menüsünden New Query komutunu vermemiz gerekir.
Kısayol menüsünden New Query komutunu verirsek ekrana sorgu yapısının belirlendiği Query
Builder diyalog kutusu gelir (Şekil 9.g-2).
468
Şekil 9.g-2
Çok sayıda seçeneğin bulunduğu Query Builde diyalog kutusunda üzerinde çalışılan veri tabanı
dosyasında bulunan tablolar Tables liste kutusunda listelenmektedir.
Bu amaçla ilk olarak Tables kutusunda sorguya temel oluşturacak tablo veya tablolar seçilir. Sorgu
yardımıyla birden fazla tablodan bilgi derlenecekse fare ile söz konusu tablolar seçilmelidir. Seçilen
tabloda bulunan alanlar Fields to Show liste kutusunda listelenir(Şekil 9.g-3). Örnek olması için
hazırladığımız sorguda hem “Hareketler” tablosundan hem de “Kartlar” tablosundan alan seçmek
istediğimiz için üzerinde çalıştığımız veri tabanı dosyasındaki her iki tabloyu da seçelim. Query
Builder diyalog kutusundaki tablo ve alan adlarının üzerinde tıklama yapıldığı zaman seçili duruma
gelmektedirler. Seçili durumdaki alan veya tablonun adı üzerinde tıklama yapılırsa seçili olma özelliği
kalkar.
469
Şekil 9.g-3
Sorguya kaynaklık edecek tablolar bu şekilde seçildikten sonra Fields to Show liste kutusunda alan
seçimi yapılır (Şekil 9.g-4). Bu liste kutusunda alan adlarının önüne ilgili tablonun adı eklendiği için
alanın hangi tabloya dahil olduğunu hemen tespit edebilirsiniz.
Şekil 9.g-4
Hazırladığımız sorguya “Hareketler” tablosunun bütün alanlarını ve “Kartlar” tablosundan “Stok
Adı” alanını dahil etmek için aşağıdaki gibi alan seçimi yapılmalıdır. Bu şekilde alan seçimi
yapıldıktan sonra kayıt filtre etme kriterleri önceden biliniyorsa Query Builder diyalog kutusunun üst
kısmındaki Field Name liste kutusunda kayıt filtre ederken veya kriter belirlerken kullanılacak alan
belirlenir. Şekil 9.g-4’te verilen ekran görüntüsünde Field Name liste kutusunda “StokKodu” alanının
adı vardı. Ancak hazırlamak istediğimiz bu sorguda “Hareketler” tablosundaki “İşlem” alanında
“Giriş” bilgisi olan kayıtları görmek istediğimiz için Filed Name liste kutusunda “İşlem” alanını
seçelim. Ardından Value metin kutusunda “Giriş” yazalım (Şekil 9.g-5).
470
Şekil 9.g-5
Kayıt filtre etme kriterini belirlerken Operator liste kutusunda operator seçimi yapabilirsiniz.
Başlangıçta Operator liste kutusunda “=” operatorü seçili durumda olduğu için bu liste kutusunda
herhangi bir seçim yapmadık. Eğer “And” veya “Or” bağlacı ile ikinci bir kriter tanımlamak
istiyorsanız And Into Criteria veya Or Into Criteria düğmelerinde tıklama yapmanız gerekir. Bu
düğmelerde tıklama yapmanız halinde tanımladığınız kriter diyalog kutusunun alt kısmındaki Criteria
başlıklı metin kutusuna yazılır. Şekil 9.g-6’da verilen ekran görüntüsü And Into Criteria düğmesinde
tıklama yapıldıktan sonra alındı.
Şekil 9.g-6
Bu sırada diyalog kutusunun alt kısmına yazılan kriterde istediğiniz değişikliği yapabilir veya yeni
bir kriter tanımlayabilirsiniz. Hazırladığınız sorguyu test etmek istiyorsanız Run düğmesine ve
sorguyu veri tabanı dosyasına kaydetmek istiyorsanız Save düğmesinde tıklama yapmanız gerekir.
Save düğmesinde tıklama yaparsanız sorguya ad verilen bir diyalog kutusu ekrana gelir (Şekil 9.g-7).
471
Şekil 9.g-7
Bu diyalog kutusunda sorgunun adını belirleyip OK düğmesinde tıklama yaparsanız hazırladığınız
sorgu veri tabanı dosyasına kaydedilir (Şekil 9.g-8) ama Query Builder diyalog kutusu başka bir
sorguyu hazırlayabilmeniz için ekranda kalmaya devam eder. Query Builder diyalog kutusu kapatınca
hazırlanan sorgu Visual Data Manager penceresi içinde listelenmeye başlar.
Şekil 9.g-8
Hazırladığınız sorguyu Data manager penceresinde iken açabilir, sorgu yardımıyla sorguya temel
oluşturan tablodaki kayıtlarda değişiklik yapabilirsiniz.
Diğer yandan yeni bir sorguyu hazırlamak için Database penceresinde ait kısayol menüsünden New
Query komutunu vermek yerine Utility menüsünden Query Builder komutunu verirseniz ekrana sorgu
tasarımı yapan Query Builder diyalog kutusu gelir.
Şekil 9.g-9
472
1. Program Kodu Yazarak Sorgu Hazırlamak
Sorguların nasıl hazırlandığını anlatmak için işe yeni bir projeyi hazırlamakla başladım. Proje
dahilinde Database, RecordSet ve Query nesnelerini kullanacağım için projedeki formun
“Declaration” kısmında aşağıdaki gibi 3 değişken tanımlayalım (Şekil 9.g-9). Sorgu hazırlama işlemi
öncesi Query nesnesi tanımlamak için QueryDef bildiri deyiminden yararlanmak gerekmektedir.
Şekil 9.g-9
Ardından üzerinde çalıştığımız projenin formuna sorgu yardımıyla erişim sağlamak istediğimiz
“Adresler” adlı tablonun kayıt yapısını gözeterek aşağıdaki gibi 5 label ve metin kutusu nesnesi dahil
edelim (Şekil 9.g-10).
Şekil 9.g-10
Çalışma anında formun üzerinde tıklama yapıldığı zaman önce “Müşteri” adlı veri tabanının
dosyasının açılmasını Adresler tablosunu temel alan bir sorgunun hazırlanmasını sağlamak üzere
Form_Click yordamını aşağıdaki gibi düzenleyelim.
Private Sub Form_Click()
Set Dosya = OpenDatabase("C:\Kitap\Adres.mdb")
Set Sorgu = Dosya.CreateQueryDef("Sorgu", "SELECT
Adresler;")
Set Tablo = Dosya.OpenRecordset("Sorgu")
Text1.Text = Tablo.Fields("Ad")
Text2.Text = Tablo.Fields("Soyad")
Text3.Text = Tablo.Fields("Adres")
Text4.Text = Tablo.Fields("Tel")
Text5.Text = Tablo.Fields("Sehir")
End Sub
473
*
FROM
Bu yordamda önce OpenDatabase() fonksiyonu ile veritabanı dosyası açılmaktadır. Bu yordamdaki
2. program satırında SQL dilinin SELECT deyiminden ve CreateQueryDef() fonksiyonundan
yararlanılarak bir sorgu hazırlanmaktadır. Ekran görüntüsü verilen program kodlarında görebileceğiniz
gibi CreateQueryDef() fonksiyonu dışarıdan 2 parametre almaktadır. İlk parametre ile hazırlanıp veri
tabanı dosyasına dahil edilecek sorgunun adı belirtilmektedir. 2. parametrede ise sorgunun yapısını
belirlemede kullanılan SQL dilinin deyimleri veya satırları bulunmaktadır. CreateQueryDef()
fonksiyonunun kullanıldığı program satırını ikiye bölmek için “-“ karakterinden yararlandık.
SQL dilindeki “SELECT” deyimi ile sorguda yer alacak alanlar belirlenmektedir. Sorguya temel
oluşturan tablodaki bütün alanların sorguda yer almasını istiyorsanız SELECT deyiminin yanına “*”
işaretini yazmanız gerekir. Sorguya hangi alanları dahil etmek istiyorsanız o alanların adlarını
aralarına virgül koyarak SELECT deyiminin yanına yazmanız gerekir. FROM deyimi ile sorguya
temel oluşturacak tablo belirlenmektedir. Daha önceleri Data kontrolünden yararlanmadan veri tabanı
dosyasındaki tablolar üzerinde işlem yapmak için OpenRccordSet() fonksiyonu yardımıyla RecordSet
nesnesi hazırlıyorduk. Hangi tablo için RecordSet nesnesi hazırlanmak isteniyorsa o tablonun adı
OpenRecordSet() fonksiyonuna parametre olarak veriliyordu. Ancak yukarıda verilen yordamda
“Adres” adlı veri tabanı dosyasındaki “Adresler” tablosu üzerinde işlem yaparken hazırladığımız
sorguyu kullanmak istemediğimizden bu kez OpenRecordSet() fonksiyonuna bu sorgunun adını
parametre olarak verdik.
Bu program kodları sayesinde çalışma anında formun üzerinde tıklama yapıldığı zaman hem önce
“Sorgu” adında bir sorgu hazırlayıp veri tabanı dosyasına dahil edilecek hem de sorguya temel
oluşturan Adresler tablosundaki ilk kaydın içeriği ekrana getirilecektir.
Şekil 9.g-11
Bu sırada Visual Data Manager ile “Adres” adlı veri tabanı dosyasına bakacak olursanız dosyaya
”Sorgu” adında bir Query veya sorgunun dahil edildiğini görürsünüz (Şekil 9.g-12 ).
Şekil 9.g-12
474
Bu sırada sorgunun üzerinde çift tıklama yaparak sorgunun üzerinden, sorgunun kendisine temel
aldığı “Adresler” tablosunun kayıtlarını görüntüleyebilir, sorgu yardımıyla tabloya yeni kayıtların
girişini yapabilirsiniz. Şekil 9.g-13’te verilen ekran görüntüsünü sorgunun üzerinde çift tıklama
yaptıktan sonra alınmıştır.
Şekil 9.g-13
Data Manager penceresinde daha önce CreateQueryDef() fonksiyonu ile hazırlamış olduğunuz bir
sorgunun üzerinde farenin sağ tuşu ile tıklama yaparsanız sorgu ile kısayol menüsü açılır. Kısayol
menüsündeki Open komutu ile sorguyu açabilir. Delete komutu ile silebilir. Rename komutu ile adını
değiştirebilirsiniz.
Şekil 9.g-14
Sorguya ait kısayol menüsünden Design komutunu verirseniz sorgunun hazırlanma sırasında
kullanılan SQL dilinde yazılmış olan program satırları Visual Data Manager penceresinin sağ
tarafındaki SQL Statement penceresine yazılır. Şekil 9.g-15’te verilen ekran görüntüsü kısayol
menüsünden Design komutunu verdikten sonra alınmıştır.
475
Şekil 9.g-15
Bu sırada sorguyu hazırlamaya neden olan SQL dilindeki satırlarda değişiklik yapmak suretiyle
sorguda değişiklik yapabilirsiniz. Şimdi örnek olması açısından daha önce program kodu yazarak
CreateQueryDeff() fonksiyonu ile hazırladığımız sorguda, Visual data manager penceresinde
değişiklik yapacağız. Yapacağımız değişiklik sonucu bu sorgu sayesinde yalnızca “Şehir” alanında
“Adana” bilgisi olan kayıtlara erişim sağlanacaktır.
Şekil 9.g-16
Bu sırada Exercute düğmesinde tıklama yaparak sorguda yaptığınız değişikliğin etkisini
görebilirsiniz. Şimdiye kadar Visual Data Manager penceresinde sorgularla ilgili olarak anlatılanlardan
tahmin etmiş olabileceğiniz gibi tasarım anında CreateQueryDef() fonksiyonuna başvurmaya gerek
duymadan SQL Statement penceresine SQL dilinde program satırları yazarak sıfırdan kendiniz sorgu
hazırlayabilirsiniz. Data Manager penceresinde hazırladığınız sorgunun Visual Data Manager
penceresinin sol kısmında yer almasını veya daha sonra kullanmak istiyorsanız Save düğmesinde
tıklama yapmanız gerekir.
Şekil 9.g-17
Sorguda yaptığınız değişiklikleri kaydetmek istiyorsanız Evet düğmesinde tıklama yapmalısınız.
Sorguda yaptığınız değişiklikleri dosya yansıtmak isteyip Hayır düğmesinde tıklama yaparsanız,
sorgunun en son halinin başka bir ad altında kaydedilmesini sağlamak istediğiniz sorguya ad
verebileceğiniz bir diyalog kutusu ekrana gelir.
476
Eğer hazırladığınız Visual Basic projesinde yapılacak sorgulamalar önceden biliniyorsa, Visual
Data manager projesinden yararlanarak istediğiniz sayıda sorgu hazırlayabilirsiniz. Daha önceden
hazırlayıp veri tabanı dosyasına kaydettiğiniz hangi sorgudan yararlanmak istiyorsanız o sorguyu
açmak gerekir. Bu amaçla OpenQueryDef() fonksiyonundan yararlanılmaktadır. Şimdi örnek olması
için hazırlayıp “Adres” veri tabanı dosyasına eklediğimiz “Sorgu” adındaki sorgudan yararlanarak
“Adresler” tablosundaki bilgilere erişim sağlayalım. Bu amaçla aşağıda ekran görüntüsünü verdiğimiz
Form_Click yordamındaki program satırlarını aşağıdaki gibi değiştirelim. ve Form_Load yordamına
taşıyalım.
Private Sub Form_Load()
Set Dosya = OpenDatabase (“C:\Kitap\Adres.mdb”)
Set Tablo = Dosya.OpenRecordset (“Sorgu”)
Form1.Text1 = Tablo.Fields(“Ad”)
Form1.Text2 = Tablo.Fields(“Soyad)
Form1.Text3 = Tablo.Fields(“Adres)
Form1.Text4 = Tablo.Fields(“Tel”)
Form1.Text5 = Tablo.Fields(“Sehir”)
End Sub
Bu yordam sayesinde proje çalıştırıldığında sorgu koşullarına uyan ilk kaydın içeriği ekrana
getirilir. Eğer OpenRecordSet() methoduna “Sorgu”” adındaki sorguyu parametre olarak verseydik
daha önce yaptığımız tanımlamalara uygun olarak bu sorgu aracılığı ile yalnızca “Sehir” alanında
“Adana” bilgisi olan kayıtlar üzerinde işlem yapılabilinirdi. Sorguların hazırlanması dışında
kullanılması tablolardan pek farklı değildir.
Şimdiye kadar sorgu hazırlarken SQL dilinin yalnızca SELECT deyiminden yararlandık. SELECT
deyimi sayesinde bir tablodan koşula uyan kayıtlar seçilmektedir. Ayrıca SELECT deyimi ile
hazırlanan sorgu daha sonra kullanılmak üzere veri tabanı dosyasına kaydedilmektedir. Yukarıda
SELECT deyimi ile hazırladığım sorguyu RecordSet nesnesine parametre olarak vermiş ve sorguya
temel oluşturan tablo üzerinde işlem yapmıştık.
Örneğin bir Cari hesap programı dahilinde hazırladığınız ve bilgi kaydettiğiniz bir tabloda yalnızca
hesap bakiyeleri borç veren kayıtlarla ilgilenmek istiyorsanız SELECT deyiminden yararlanabilirsiniz.
SELECT deyimi belirtilen koşula uyan kayıtları seçer ve kayıtlar üzerinde işlem yapmanızı sağlar.
SQL dilinin DELETE deyimi sayesinde istenen tabloda istenen kayıtlar kolay bir şekilde
silinmektedir. Çalışma anında silmek istediğiniz kaydı ekrana getirdikten sonra Kart_Sil düğmesinde
tıklama yaparsanız kayıt silinir. Ancak burada anlatmak istediğimiz, bu sırada aynı stok koduna sahip
bütün kayıtların bir seferde Hareketler tablosundan silinmesidir. Bu amaçla SQL dilinin DELETE
deyiminden yararlanacağız.
Bu anlattıklarımıza göre Hareketler tablosundan silinecek kayıtlar çalışma anında belirlenecektir.
Ancak konunun kolay anlaşılmasını sağlamak için aşağıda verilen program satırlarını hazırladım. Bu
program satırları sayesinde “Hareketler” tablosundaki StokKodu alanından “Arçelik02” bilgisi olan
bütün kayıtlar bir seferde silinir.
477
Private Sub Sil_Click()
SQL$=“DELETE
FROM
Hareketler
=‘Arçelik02”;”Dosya.Execute SQL$
WHERE
StokKodu
End Sub
Bu yordamda önce DELETE deyimi olan SQL dilinde bir program satırı hazırlayıp SQL$ adını
verdiğimiz bir değişkene aktardık. Ardından SQL dilinde yazılmış olan bu program satırını içeren
Execute methoduna parametre olarak vererek Hareketler tablosunda StokKodu alanında “Arçrlik02”
bilgi olan bütün kayıtların silinmesini sağladık. Ancak DELETE deyimi ile kayıt silme işleminin
pratik olabilmesi için WHERE deyimi ile belirlenen koşulun çalışma anında belirlenmesi gerekir. Bu
nedenle Kart Sil başlıklı düğme için hazırladığım yordamı aşağıdaki gibi değiştirelim.
Private Sub Sil_Click()
Kod$ = “’” & Tablo.Fields(“StokKodu”) &” ’ ” & “;”
SQL$ = “DELETE FROM Hareketler WHERE StokKodu =” &Kod$
Dosya.Execute SQL$
Tablo.Delete
Tablo. MoveNext
Form1.Text1 = Tablo.Fields(“StokKodu”)
Form1.Text2 = Tablo.Fields(“StokAdi”)
Form1.Text3 = Tablo.Fields(“Birim”)
Form1.Text4 = Tablo.Fields(“Fiyat”)
Form1.Text5 = Tablo.Fields(“Miktar”)
End Sub
2. Tablo ve Index Hazırlamak
Çalışma anında SQL dilinin CREATE TABLE deyimini kullanarak tablo hazırlayabiliriz.
CREATE TABLE deyiminin nasıl kullanıldığını açıklamak için üzerinde çalıştığımız projenin
Form_Click yordamına aşağıda ekran görüntüsünü verdiğimiz program satırlarını yazalım.
Private Sub Form_Click()
Dim Dosya As database
Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb")
Dosya.Execute “CREATE TABLE CariKart”_
&”(HesapKodu TEXT, Unvan TEXT,Adres TEXT,Borç LONG,Alacak
478
LONG);”
End Sub
Bu yordamda önce Database tipinde bir değişken tanımladım. Ardından OpenDatabase()
fonksiyonu ile, tablo hazırlayıp dahil etmek istediğim veri tabanı dosyası açtım. En son olarak içinde
CREATE TABLE deyiminin kullanıldığı SQL satırı yazdım. SQL dili ile yazılmış program satırlarını
işletmek için Execute deyimi kullanılmaktadır.
Çalışma anında formun üzerinde tıklama yapılıp bu yordam işletilirse Müşteri veri tabanı dosyasına
“CariKart” adında bir tablo dahil edilir(Şekil 9.g-18). CREATE TABLE deyimi ile hazırlanan
tablonun yapısını size göstermek için Data Manager’dan yararlandık.
Şekil 9.g-18
Tablolar için Index hazırlamak için SQL dilinin CREATE INDEX deyiminden yararlanabilirsiniz.
CREATE TABLE deyimi ile hazırladığımız tablo için index hazırlamak için aşağıda ekran
görüntüsünü verdiğimiz yordamı hazırlayalım.
479
Private Sub Form_Click()
Dim Dosya As database
Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb")
Dosya.Execute “CREATE INDEX KodIndex ON CariKart “&”(HesapKodu
) :”
Dosya.Close
End Sub
Bu yordamda önce kendisi için index hazırlamak istediğimiz tablonun dahil olduğu veri tabanı
dosyasını açalım. Ardından içinde CREATE INDEX deyimine yer verdiğimiz bir SQL satırı hazırlayıp
Exercute deyimine parametre olarak verelim. Hazırladığımız SQL satırında CREATE INDEX
deyimine toplam 3 parametre verelim. İlk parametrede hazırlanmak istenen indexin adı verilmektedir.
İkinci parametrede ise indexin dahil edileceği tablonun adı verilmektedir. İndexe temel oluşturacak
alan veya alanlar ise3. parametrede verilmektedir.
Eğer hazırlamak istediğiniz İndexe Unique özelliği vermek istiyorsanız CREATE INDEX deyimini
aşağıdaki gibi kullanmanız gerekir.
Private Sub Form_Click()
Dim Dosya As database
Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb")
Dosya.Execute
“CREATE
UNIQUE
INDEX
KodIndex
CariKart“&”(HesapKodu );”
Dosya Close
End Sub
Indexe Primary özelliği vermek için WITH bağlacını kullanarak PRIMARY bilgisini CREATE
INDEX deyimine parametre olarak verebilirsiniz.
Private Sub Form_Click()
Dim Dosya As database
Set Dosya = OpenDatabase("C:\VB5\Müşteri.mdb")
Dosya.Execute “CREATE INIQUE INDEX _
KodIndex ON CariKart “ &”(HesapKodu )”_
& “WITH PRIMARY;”
Dosya Close
End Sub
3. Data Kontrolü İle Birlikte SQL Kodu Kullanımı
Data kontrolü hakkında bilgi verilen daha önceki bölümlerden hatırlayacağınız gibi Data kontrolü
yardımı ile taban dosyaları üzerinde işlem yapabilmek için Data kontrolünün database özelliğine
üzerinde işlem yapılmak istenen veri tabanı dosyasının adını aktarmak gerekiyordu.
480
ON
Şekil 9.g-19
DatabaseName özelliği ile erişim sağlanmak istenen veri tabanı dosyası belirlendikten sonra
RecordSource özelliği ile üzerinde işlem yapılmak istenen tabloyu belirlemek gerekiyordu. Properties
penceresinde RecordSource özelliğine ait liste kutusu açıldığında DatabaseName özelliğine aktarılan
veri tabanı dosyasındaki tablolar listelenmektedir (Şekil 9.g-20).
Şekil 9.g-20
Ancak RecordSource özelliğine ait liste kutusundan tablo adı seçmek yerine tablo ve kayıt seçimini
yapmak için SQL kodu yazabilirsiniz. Bu işlemin nasıl yapıldığını size anlatmak için üzerinde
çalıştığımız projenin formuna yerleştirmiş olduğumuz Data nesnesinin RecordSource özelliğini
aşağıdaki gibi düzenleyelim.
481
Şekil 9.g-21
Data nesnesi ile üzerinde işlem yapmak istediğim tablonun adı iki kelimeden meydana geldiği için
tablonun adını köşeli parantezlerin içine alalım. Eğer tablonun adı bir tek kelimeden meydana geliyor
olsaydı köşeli parantezlere gerek olmazdı. Data nesnesinin işlevini görmek için projenin formuna
ayrıca bir DBGrid nesnesi yerleştirelim. Grid nesnesinin DataSource özelliğine ekran görüntüsü Data
ve DBGrid nesnesi yerleştirmiş olduğumuz projeyi çalıştırdıktan sonra alınmıştır (Şekil 9.g-22).
Şekil 9.g-22
SELECT deyimi ile üzerinde işlem yapılacak tablo ve kayıtlar belirlenirken herhangi bir kayıt ve
alan seçme kriteri belirtilmediği için Grid nesnesi için tablodaki bütün alanlar ve kayıtlar görüntülendi.
Eğer Grid nesnesi için yalnızca Hesap Kodu, Adres, Borç alanlarının yer almasını istersek Data
nesnesinin RecorSource özelliğini Şekil 9.g-23’teki gibi yazmalıyız.
482
Şekil 9.g-23
RecordSource özelliği için yazdığım SQL kodunda birden fazla kelimeden meydana gelen alan
adlarını köşeli parantezlerin arasına alalım. Bu değişiklikten sonra DBGrid nesnesi yerleştirdiğim
projeyi çalıştırınca Şekil 9.g-24’teki görüntü elde edilir.
Şekil 9.g-24
Eğer ilgili tablodaki bütün kayıtların Grid nesnesi içinde listelenmesini istemiyorsanız
RecordSource özelliğine SQL koduna WHERE yardımcı deyimini dahil etmeniz gerekir.
4. Çapraz Sorgu Hazırlamak
Bazı özel sorgular için gereken SQL kodunu sıfırdan kendiniz hazırlamak yerine Access’ten
yararlanabilirsiniz. Örnek olması için Access yardımı ile “çapraz” adını verdiğim bir çapraz sorgu
hazırlayalım.
483
Şekil 9.g-25
Bu sorgu işletildiği zaman CariKart tablosunda bulunan Cari Hesapların borç ve alacak toplamları
ekrana getirilmektedir. Şekil 9.g-26’da verilen ekran görüntüsünü bu sorguyu Access dahilinde
açtıktan sonra aldık.
Şekil 9.g-26
Bu sorguya ait SQL kodlarını size göster için Access’in Görünüm menüsünden SQL Göster
komutunu verelim (Şekil 9.g-27, 29-28).
Şekil 9.g-27
484
Şekil 9.g-28
Bu çapraz sorguyu hazırlarken şimdiye kadar kullandığımız SQL deyimlerinden başka GROUP BY,
INNER JOIN ve PIVOT deyimleri kullanılır.
Bu sorguyu Access ile hazırlayıp veri tabanı dosyasına dahil etmek yerine Visual Basic ile birlikte
verilen Data Manager’dan yararlanarak hazırlayabilirsiniz. Şimdi Access yardımıyla hazırladığımız bu
sorguyu Visual Basic projesi dahilinde kullanalım. Bu amaçla ilk olarak Database ve RecordSet
tipinde iki değişken tanımlayalım (Şekil 9.g-29).
Şekil 9.g-29
Ardından üzerinde çalıştığım projenin formuna bir Data ve DBGrid nesnesi dahil edelim. Ardından
DBGrid nesnesinin DataSource özelliğine Data nesnesinin adını aktaralım. En son olarak Form_Load
yordamını aşağıdaki gibi düzenleyelim.
Private Sub Form_Load()
Set Dosya = OpenDatabase ( “C:\Kitap\Stok.mdb”)
Set Sorgu = Dosya.OpenRecordset (“Çapraz”)
Set Data1.Recordset = Sorgu
End Sub
Bu işlemlerde sonra üzerinde çalıştığım projeyi çalıştırınca aşağıdakine benzer bir akran görüntüsü
elde ederiz.
Şekil 9.g-30
485
9.h. ADO Data Kontrolü
Bu kitabın daha önceki bölümlerinde Visual Basic’in veri tabanı özellikleri hakkında bilgi verirken
genellikle Data kontrolü kullanıldı. Ancak Visual Basic’in 6.0 versiyonunda Data kontrolünden başka
ayrıca ADO Data Control adında bir kontrol daha bulunmaktadır. Veri tabanı dosyaları üzerinde işlem
yaparken Data kontrol yerine ADO Data Control’dan yararlanabilirsiniz. Bu kontrolden
yararlanabilmek için Project menüsündeki Components komutu verildiği zaman ekrana gelen
Components diyalog kutusundan yararlanıp ADO Data Control’ün projeye dahil edilmesi gerekir.
Şekil 9.h-1
Components diyalog kutusunda “Microsoft ADO Data Control” onau kutusunu seçip Tamam
düğmesinde tıklama yaparsanız, ADO Data Control projeye dahil edilir ve bu kontrol Toolbox’ta bir
düğme ile temsil edilir (Şekil 9.h-2).
Şekil 9.h-2
486
ADO Data Control’ün nasıl kullanıldığını anmak için yeni bir proje hazırlayalım ve projenin
formuna ADO Data Control’ü yerleştirelim. ADO Data Control görünüm olarak Data kontrolünden
pek farklı değildir (Şekil 9.h-3).
Şekil 9.h-3
Forma yerleştirilen ilk ADO Data Control’e “Adodc1” adı verilmektedir. Şek,l 30-4’te verilen
ekran görüntüsünde tespit edebileceğiniz gibi ADO Data Control’ün çok sayıda özelliği
bulunmaktadır.
Şekil 9.h-4
ADO Data Control ile üzerinde işlem yapılacak veritabanı dosyası, ADO Data Control’ün
ConnectionString özelliği ile belirlenmektedir. Ancak ADO Data Control ile veri tabanı dosyaları
üzerinde işlem yapılırken ODBC tekniği kullanıldığı için söz konusu veri tabanı dosyası için daha
önceden bazı ayarlamaların yapılması gerekmektedir (Şekil 9.h-4).
487
Şekil 9.h-5
ADO Data Control’ü ile veri tabanı dosyaları üzerinde işlem yapabilmek için ilk yapılması gereken
ayarlama Windows’un Denetim Masasındaki ODBC seçeneği ile yapılmaktadır. Şimdi örnek olması
için “C:” sürücüsündeki “Kitap” klasöründeki “Stok” dosyasına erişim sağlayabilmek için ODBC
seçeneği ile ayarlama yapalım
Veri tabanı dosyalarına ADO Data Control’ü ile erişim sağlayabilmek için Denetim Masasındaki
ODBC seçeneğinin üzerinde çift tıklama yaparsanız ekrana ODBS Veri Kaynağı Yöneticisi diyalog
kutusu gelir.
488
Şekil 9.h-6
Toplam 7 sekmenin bulunduğu bu diyalog kutusundaki Kullanıcı DSN sekmesinde, bu ekran
görüntüsünü aldığımız sırada tanımlı olan birçok DSN ( Data Source Name) bulunuyordu. Bu
sekmedeki tanımlamalar yerel bilgisayar tarafından kullanılabilmektedir. Eğer yapacağınız
tanımlamadan NT yüklü başka bir bilgisayarın da yararlanılmasını istiyorsanız DSN tanımlama
işlemini bu kez Sistem DSN sekmesinde yapmanız gerekir.
Kullandığım bilgisayardaki “Stok.mdb” adındaki Access formatındaki veri tabanı dosyası için DSN
tanımlamak istediğimiz için Ekle düğmesinde tıklama yapıp Yeni Veri Kaynağı Oluştur diyalog
kutusunu ekrana getirelim (Şekil 9.h-7).
489
Şekil 9.h-7
Bu diyalog kutusunda veri tabanı dosyası sürücüsü seçilmektedir. Kendisi için tanımlama yapmak
istediğimiz veri tabanı dosyası Access formatında olduğu için Microsoft Access Driver sürücüsünü
seçelim. Sürücü seçimi yapıp Son düğmesinde tıklama yaparsanız Şekil 9.h-8’de ekran görüntüsü
verilen ODBC Microsoft Access Kur diyalog kutusu gelir.
Şekil 9.h-8
Bu diyalog kutusunda ilk olarak Veri Kaynağı Adı metin kutusuna yapılmak istenen tanımlamaya
bir adın verilmesi gerekir. “C:” sürücüsündeki “Stok.mdb” dosyasına ADO Data ile erişim sağlamak
için yapmak istediğimiz tanımlamaya “Stok Dosyası” adını verelim. Data Source adı belirlendikten
490
sonra sıra Access formatındaki dosyayı belirlemeye gelir. Eğer söz konusu dosyayı daha önce
hazırlayıp hard diske kaydetmişseniz Seç düğmesinde tıklama yaparak dosya seçimi yapmanız gerekir.
Yeni bir dosya hazırlamak istiyorsanız Oluştur düğmesinde tıklama yapabilirsiniz. “Oluştur”
düğmesinde tıklama yaparsanız hazırlanacak dosya adının belirlendiği Yeni Veritabanı diyalog
kutusu ekrana gelir. Kendisi için Data Source tanımlamak istediğim dosyayı daha önce Visual Data
Manager programı ile hazırlamış olduğumuz için Seç düğmesinde tıklama yapıp ekrana Veritabanı
Seç diyalog kutusunu getirelim.
Şekil 9.h-9
Bu diyalog kutusunda kendisi için tanımlama yapmak istediğimiz Stok.mdb dosyasını seçip
Tamam düğmesinde tıklama yapıp Select Database diyalog kutusunu kapatınca, seçtiğimiz dosyasın
adı ODBC Microsoft Access Kur diyalog kutusu Şekil 9.h-10’da ki şekle dönüştü.
Şekil 9.h-10
491
Bu diyalog kutusundaki Açıklama başlıklı metin kutusunu tanımlamak istediğiniz Data Source
veya veri tabanı dosyası hakkında açıklayıcı bilgi girebilirsiniz. Dosya seçiminden sonra ODBC
Microsoft Accsee Kur diyalog kutusunu Tamam düğmesi ile kapatırsanız Data Source tanımlama
işlemini bitirmiş olursunuz (Şekil 9.h-11).
Şekil 9.h-11
Bu hazırlıklardan sonra ADO Data ile söz konusu veri tabanı dosyası üzerinde her türlü işlem
yapılabilir. Bu işlemlerden sonra üzerinde çalıştığımız projeye dönelim. Properties penceresinde ADO
Data nesnesinin özellikleri listelenirken Connection String özelliğinin üzerine gidelim.
492
Şekil 9.h-12
ADO Data Control’ü ile üzerinde işlem yapılacak dosyayı belirlemek için veya data Source
seçimini yapmak üzere ConnectionString özelliğine ait üzerinde 3 nokta (...) olan düğme tıklama
yaparak ekrana Property Pages diyalog kutusunu getirelim (Şekil 9.h-12).
Şekil 9.h-13
Bu diyalog kutusunda data Source seçimi yapmak için ilk olarak Use ODBC Data Source Name
radyo düğmesini seçmek gerekir. Ardından bu radyo düğmesine ait liste kutusunu açarsanız daha önce
tanımlanmış olan Data Source’lar listelenir (Şekil 9.h-13).
493
Şekil 9.h-14
Üzerinde işlem yapmak istediğimiz dosya için daha önce “Stok Dosyası” adında bir Data Source
tanımlamış olduğumuz için bu liste kutusunda sözünü ettiğimiz Data Source’u seçip Property Pages
diyalog kutusunu Tamam düğmesi ile kapatırsak ADO Data nesnesinin ComnnectionString özelliğine
“DNS=Stok Dosyası” bilgisi aktarılmış olur (Şekil 9.h-14).
Anlatılan şekilde ADO Data nesnesi ile erişim sağlamak istenen veri tabanı dosyası belirlendikten
sonra sıra üzerinde işlem yapılacak tabloyu belirlemeye geldi. ADO Data nesnesi için tablo seçimi,
RecordSource özelliği ile yapılmaktadır.
Properties penceresinde Data kontrolüne ait özellikler listelenirken RecordSource özelliğinin
üzerine gidildiği zaman DatabaseName özelliği ile belirlenen veri tabanı dosyasındaki tablolar
listeleniyordu. Ancak ADO Data nesnesinin RecordSource özelliğine ait liste kutusunda, erişim
sağlanan veri tabanı dosyasındaki tablolar listelenmemektedir. Tablo seçimi yapılırken SQL kodu
yazmak gerekmektedir. SQL dilinin SELECT deyimini doğrudan RecordSource özelliğine ait metin
kutusuna yazabileceğiniz gibi özelliğe ait düğmede tıklama yapabilirsiniz. RecordSource özelliğine ait
düğmede tıklama yapılırsa ekrana aşağıda verilen Property Pages diyalog kutusu gelmektedir (Şekil
9.h-15).
494
Şekil 9.h-15
ADO Data nesnesinin RecordSource özelliğine ait Pages diyalog kutusunda RecordSource adı
altında gruplanmış 3 seçenek bulunmaktadır. Başlangıçta Command Type başlıklı liste kutusunda “8adCmdUnknown” seçeneği seçili durumdadır. Command Type liste kutusunda 8-adCmdUnknown
seçili durumda iken işlem yapmak istediğiniz tablo için Command Text(SQL) başlıklı kutuya SQL
dilinin SELECT deyimi ile söz konusu veri tabanı dosyasındaki tablolardan istediğinizi seçebilirsiniz.
Stok.mdb dosyasındaki kartlar tablosu üzerinde işlem yapmak istediğimiz için Command Text(SQL)
başlıklı kutuyu Şekil 9.h-16’daki gibi düzenleyelim.
Şekil 9.h-16
Bu SQL kodu sayesinde “Stok.mdb” dosyasındaki “Kartlar” tablosunun bütün alanlarına erişim
sağlanabilir, kayıt girilirken ve mevcut kayıtlarda değişiklik yapılabilir. RecordSource özelliğine ait
495
Property Pages diyalog kutusunu tablo seçmek üzere SELECT deyiminin kullanıldığı SQL kodunu
yazdıktan sonra tamam düğmesi ile bu diyalog kutusunu kapatıp tekrar Properties penceresine dönelim
(Şekil 9.h-17).
Şekil 9.h-17
ADO Data nesnesi ile üzerinde işlem yapmak istenen tabloyu yukarıda anlatılan şekilde SQL kodu
ile belirlemek yerine doğrudan tablonun adını yazabilirsiniz. Ancak veri tabanı dosyasında hangi
tabloların olduğunu öğrenmek istiyorsanız veya üzerinde işlem yapmak istediğiniz tablonun adını
ezbere bilmiyorsanız RecordSource özelliğine ait Properties Pages diyalog kutusunu ekrana getirmeniz
gerekir. Eğer RecordSource özelliğine ait Properties Pages diyalog kutusunu tablo seçimini yapmak
üzere ekrana getirdiyseniz Command Type liste kutusunda 2-adCmdTable seçeneğini seçmeniz
gerekir
(Şekil 9.h-18).
Şekil 9.h-18
496
Command Type liste kutusunda “2-adCmdTable” seçeneğini seçmeniz halinde Table or Store
Procedure Name başlıklı liste kutusu kullanılabilir duruma gelir. Bu liste kutusunda ADO Data
nesnesinin ConnectionString özelliği ile seçtiğiniz veri tabanı dosyasındaki tablolar listelenir.
Hazırlamak istediğimiz örnek projede ADO Data kontrolü ile “Kartlar” adlı tablo üzerinde işlem
yapmak istediğimiz için Kartlar tablosunu seçelim. Şekil 9.h-19’da verilen ekran görüntüsünü
RecordSource özelliğine ait Property Pages diyalog kutusunda tablo seçimini yaptıktan sonra alalım.
Şekil 9.h-19
Bu işlemlerden sonra seçilen tablodaki kayıtların içeriğini ekranda görebilmek için projenin
formuna tablodaki her alan için bir metin kutusu nesnesi yerleştirmek gerekir. Şekil 9.h-20’de verilen
ekran görüntüsünün projenin formuna 5 adet metin kutusu ve Label nesnesi yerleştirdikten sonra aldık.
Şekil 9.h-20
Üzerinde işlem yapmak istediğim tablodaki her alan için bu şekilde birer metin kutusu
yerleştirdikten sonra her metin kutusu için öncelikle DataSource özelliği ile ADO Data nesnesi
seçimi yapmak gerekir. Şekil 9.h-21’de verilen ekran görüntüsünü aldığımız sırada üzerinde
çalıştığımız projenin “Adocd1” adında bir ADO Data nesnesi vardı.
497
Şekil 9.h-21
Metin kutusu nesnesi için DataSource seçimi yaptıktan sonra DataField özelliği ile alan seçimi
yapılır. Properties penceresinde DataField özelliğine ait liste kutusunda ADO Data nesnesinin
RecordSource özelliği ile seçilen tablodaki alanlar listelenir (Şekil 9.h-22).
Şekil 9.h-22
Bu iki seçim ve ayarlama formdaki her metin kutusu için yapılıp proje çalıştırılarak tablodaki
kayıtlar arasında dolaşılabilir. Şekil 9.h-23’de verilen ekran görüntüsünü projeyi çalıştırdıktan sonra
aldık. Bu sırda ADO Data nesnesine ait düğmelerden yararlanarak tablodaki istediğiniz kaydın
içeriğini ekranda görebilirsiniz.
Şekil 9.h-23
498
İçeriği formda görüntülenen kayıtta yaptığınız değişiklikler başka bir kaydın üzerine gitmeniz
halinde otomatik olarak veritabanı dosyasına yansıtılır. Eğer tablodaki kayıtlarda değişiklik
yapılmasını istemiyorsanız ADO Data nesnesinin Mode özelliğinden yararlanabilirsiniz.Eğer
kayıtların yalnız okunabilir olmasını istiyorsanız Mode özelliğine 1-adModeRead değerini
aktarmanız gerekir
(Şekil 9.h-24).
Şekil 9.h-24
1. Data Form Wizard ile Birlikte ADO Data Kontrolünü
Kullanmak
499
Daha önce Data Form Wizard hakkında bilgi verilen bölümde, Wizard ile hazırlanan formda veri
tabanı dosyasına veya verilere erişim tekniği olarak ADO Data kontrolünü seçmiştik.
Şekil 9.h-25
Şimdi bir kez daha Wizard ile ADO Data Control’ün kullanıldığı bir form hazırlayalım ve Data
Form Wizard tarafından hazırlanan program kodlarını görelim. Bu amaçla Şekil 9.h-26’daki formu
hazırlayalım.
Şekil 9.h-26
Yukarıda sayfalarda ADO Data Control’ü ile veri tabanı dosyası üzerinde işlem ODBC tekniğini
kullanmıştık. Ancak Data Form Wizard ile hazırlanan formdaki ADO Data Control‘de veriye erişim
sağlamak için Microsoft Jet veri tabanı motorunun kullanılacağı varsayılmaktadır. Bunu göstermek
için Data Form Wizard yardımı ile hazırladığımız formdaki ADO Data nesnesini seçili durumda iken
Properties penceresini ekrana getirelim. Üzerinde işlem yapılacak veri tabanı ADO Data Control’ün
ConnectionString özelliği ile belirlenmektedir.
500
Şekil 9.h-27
Bunu ayrıca Properties penceresinde ADO Data Control’ün Custom özelliğine ait düğmede
tıklama yapılarak ekrana getirilen Prpperty Pages diyalog kutusunda görebilirsiniz. Yukarıdaki
sayfada verilen örnekte veri tabanı dosyalarını ODBC tekniği ile erişmek istediğimiz için Use ODBC
Data Source Name radyo düğmesini seçmiştik.
Şekil 9.h-28
Tam bu sırada Use Connection String radyo düğmesi seçili durumda iken Build düğmesinde
tıklama yapabilirsiniz. Buld düğmesinde tıklama yaparsanız ekrana Data Link Properties diyalog
kutusu gelir (Şekil 9.h-29).
501
Şekil 9.h-29
Bu diyalog kutusundaki metin kutusuna ADO Data Control ile üzerinde işlem yapmak istediğiniz
dosyanın adını yazabilirsiniz. Üzerinde işlem yapmak istediğiniz dosyanın adını ezbere biliyorsanız bu
diyalog kutusundaki üzerinde 3 nokta (...) olan düğmede tıklama yapıp dosya seçimi yapılan Select
Access Database diyalog kutusunu ekrana getirebilirsiniz.
Bu sırada Data Link Properties diyalog kutusundaki Provider sekmesine geçip dosyalara erişim
sağlama tekniğini değiştirebilirsiniz. ADO Data ile erişim sağlanan dosyadaki hangi tablo üzerinde
işlem yapılacağı ADO Data nesnesinin RecordSource özelliği ile belirlenmektedir.
Şekil 9.h-30
502
Çalışma anında ADO Data ile erişim sağlanan veritabanı dosyasındaki ilgili tabloya yeni bir kayıt
için formdaki "“Add"”düğmede tıklama yapmanız gerekir. Şimdi size Data Form Wizard tarafından
Add düğmesi için hazırlanan program kodlarını yazalım.
Private Sub cmdAdd_Click
On Error Goto AddErr
datPrimaryRS.Recordsr.AddNew
Exit Sub
AddErr:
MsgBox Err.Description
End Sub
Buradaki datPrimaryRS, formdaki ADO Data nesnesinin adıdır. Tablonun sonuna yeni kayıt
eklemek için Data kontrolünde olduğu gibi Add metodu kullanılmaktadır. Buna göre Data kontrolü ve
RecordSet nesnesi ile ilgili olarak daha önce anlatılanlar ADO Data kontrolünde geçerlidir.
2. Program Kodu Yazarak ADO Nesnesi Hazırlamak
Yukarıdaki sayfalarda ADO Data kontrolü sayesinde veri tabanı dosyaları üzerinde işlem yaparken
ToolBoc’tan yararlanarak formun üzerine ADO nesnesi yerleştirelim. Ancak program kodu yazarak
ADO Data (RecordSet) nesnesi hazırlayabilir ve bu nesneden yararlanarak veri tabanı dosyaları
üzerinde işlem yapabilirsiniz.
503
Şekil 9.h-31
Ancak program kodo yazarak ADO Data Control ile veri tabanı dosyaları üzerinde işlem
yapabilmek için daha önceden Project menüsündeki References komutu ile ekrana getirilen diyalog
kutusundan yararlanarak Microsoft ActiveX Data Object adlı library dosyasını projeye dahil etmeniz
gerekir (Şekil 9.h-31).
Visual Basic’in bu özelliği hakkında size bilgi verebilmek için yeni bir proje hazırladım ve bu
projenin formuna 5 adet metin kutusu yerleştirdim. Bu proje çalıştırıldığı zaman seçeceğimiz tablodaki
ilk kaydın içeriği bu formdaki metin kutularına aktarılacaktır.
Şekil 9.h-32
Program kodu yazarak ADO Data Control’den yararlanmak veya başka bir deyişle ToolBox’tan
formun üzerinde nesne yerleştirmeden veri tabanı dosyaları üzerinde işlem yapabilmek için ilk olarak
Dim deyimi ile RecordSet ve Connection tanımlamak gerekir. Bu değişkenleri Form_Load
504
yordamında tanımladım. Tanımladığım RecordSet nesnesine “adoSet” ve Connection nesnesine
“Dosya” adını verelim..
Private Sub Form_Load
Dim adoSet As Recordset
Dim Dosya As Connection
Bu iki değişkeni Form_Load yordamı yerine formun Declaration kısmında tanımlayabilirsiniz. Bu
şekilde yapılan değişken tanımlama işleminden sonra Form_Load yordamına aşağıda ekran görüntüsü
vewrilen program kodlarını yazdım. Bu program satırlarında önce Set deyimi ile Connection nesnesi
set edilmektedir. Ardından Open methodu ile Connection nesnesini açıp devreye soktum.
Private Sub Form_Load
Dim adoSet As Recordset
Dim Dosya As Connection
Set Dosya = New Connection
Dosya.Open“PROVIDER=Microsoft.Jet.OLEDB.3.30;_
DataSource=C:\Kitap\Adres.mdb;”
Set adoSet = New Recordset
AdoSet.Open “select * from Adresler”, Dosya
Set Text1.Datasource =adoSet
Set Text2.Datasource =adoSet
Set Text3.Datasource =adoSet
Set Text4.Datasource =adoSet
Set Text5.Datasource =adoSet
End Sub
Open metodu bu örnekte 2 parametreye sahiptir. İlk parametrede veri tabanı dosyasına erişim
tekniği(Provider) ve ikinci parametrede ise data Source yani veri tabanı dosyası belirlenmektedir.
Open methodu ile Connection nesnesi açılıp devreye sokulduktan sonra Set deyimi ile RecordSet
nesnesini set ettim. Ardından Open deyimi ile “adoSet” adını vermiş olduğum RecordSet nesnesi ile
üzerinde işlem yapılacak tablo ve alanları belirledik. Form-Load yordamında en son olarak formdaki
bütün metin kutularını RecordSet nesnelerine set ettik.
Bu işlemlerden sonra sıra metin kutularına tablodaki hangi alandan bilgi alacağı veya hangi alan ile
hangi metin kutusu arasında bağlantı kurulacağını belirlemeye gelir. Bu amaçla formdaki ilk metin
kutusunu seçip Properties penceresini ekrana getirdim. Metin kutuları ile belirlenen tablodaki
alanlardan birisi arasında bağlantı kurma işlemi metin kutusunun DataField özelliği ile
belirlenmektedir.
505
Şekil 9.h-33
Ancak üzerinde işlem yapılacak dosya ve tablo, çalışma anında belirlendiği için Properties
penceresinde DataField özelliğine ait liste kutusunda listelenen herhangi bir alan adı olmaz. Bu
nedenle söz konusu metin kutusu ile arasında bağlantı kurmak istediğimiz alanın adını DataField
özelliğine kendiniz doğrudan yazmanız gerekir. Formdaki ilk metin kutusu ile “Adresler” tablosundaki
“Ad” alanı arasında bağlantı kurmak istediğiz için “Ad” yazalım.
Şekil 9.h-34
Aynı işlemleri formdaki diğer metin kutuları için yaptıktan sonra projeyi çalıştırdım. Form_Load
yordamına yazılan program kodları sayesinde adı belirtilen veri tabanı dosyasına erişim sağlanır ve
ilgili tablonun ilk kaydının içeriği ekrana getirilir.
506
Şekil 9.h-35
Tablodaki ilk kaydın içeriğini bu şekilde ekrana getirdikten sonra RecordSet nesnesi ile ilgili diğer
metotları kullanıp tablo veya kayıtlar üzerinde istediğiniz işlemi yapabilirsiniz. Örnek olması için
üzerinde çalıştığımız projenin formuna “Sonraki kayıt” başlıklı bir düğme yerleştirelim ve düğmenin
Click yordamını aşağıdaki şekilde düzenleyelim.
Private Sub Sonraki_Click()
AdoSet.MoveNext
End Sub
Ancak “adoSet” adını vermiş olduğum RecordSet nesnesini Dim deyimi ile Form_Load yordamı
içinde tanımlamış olduğum için bu nesneyi başka yordamlarda kullanabilmek amacıyla değişken
tanımlama satırını formun Declaration kısmına taşımıştık Çalışma anında forma yerleştirilmiş olan
düğmede tıklama yapılıp MoveNext metodunun kullanıldığı bu yordam işletilirse tablodaki bir
sonraki kaydın içeriği ekrana getirilir.
Diğer yandan Data Form Wizard ile veri tabanı dosyaları üzerinde işlem yapmaya yönelik olarak
form hazırlarken işlemin 3. adımını temsil eden “Form” başlıklı diyalog kutusunda ADO Code
tekniğini seçip yukarıda yapılan işlemleri otomatikleştirebilirsiniz.
507
Şekil 9.h-36
508
9.i. Data Environment
Visual Basic’in veri tabanı özelliklerini açıklamak amacıyla şimdiye kadar Data ve ADO Data
kontrolü ile Microsoft DAO 3,51 Object Library hakkında bilgi verildi. Visual Basic‘in 6.0
versiyonunda veri tabanı dosyaları üzerinde işlem yapmaya yönelik olarak Data Environment adında
bir özellik bulunmaktadır. Data Environment özelliği sayesinde daha az program kodu yazarak veri
tabanı uygulamaları geliştirmek mümkündür.Data Environment tekniği ile veri tabanı dosyaları
üzerine işlem yapabilmek için Project menüsündeki Components komutu ile ekrana getirilen
Components diyalog kutusunda ayarlama yapmak gerekir (Şekil 9.i-1).
Şekil 9.i-1
Data Environment tekniğinden yararlanabilmek için Components diyalog kutusundaki Designers
sekmesindeki Data Environment onay kutusunu seçili duruma getirmeniz gerekir. Components
dfiyalog kutusunda Data Environment onay kutusunu seçip projeye dahil ederseniz Project menüsüne
More ActiveX Designers adında ve alt menüye sahip bir komut eklenir. Ayrıca bu alt menüye Data
Environment adında bir komut dahil edilmektedir (Şekil 9.i-2).
509
Şekil 9.i-2
Üzerinde çalıştığınız projeye bir Data Environment nesnesi eklemek üzere Project menüsünden
komut verirseniz projeye” Data Environment1” adında bir Data Environment nesnesi dahil edilir
(Şekil 9.i-3).
Şekil 9.i-3
Data Environment nesnesi, Visual basic penceresi içinde bir alt pencere ile temsil edilmektedir. Bu
ayrıca Data Environment nesnesi üzerinde yapılabilecek işlemleri temsil eden düğmeleri için bir araç
çubuğu bulunmaktadır. Projeye Data Environment nesnesi dahil etme işlemi sırasında ayrıca bir
Connection nesnesi hazırlanmaktadır.
Data Environment nesnesi içinde istenilen sayıda Connection ve Command nesnesi olabilir.
Connection nesnesi ile, üzerinde işlem yapılmak istenen veri tabanı dosyasına erişim sağlanmaktadır.
Otomatik olarak hazırlanan Connection nesnesi sayesinde herhangi bir veri tabanı dosyasına erişim
sağlamak için önce Connection nesnesine ait kısayol menüsü açılır (Şekil 9.i-4).
510
Şekil 9.i-4
Connection nesnesinin özelliklerini değiştirmek veya Connection nesnesi ile erişim sağlayacak
veri tabanı dosyasını belirlemek için kısayol menüsündeki Properties komutundan yararlanılmaktadır.
Connection nesenesine ait kısayol menüsünden Properties komutunu verirseniz ekrana Şekil 9.i-5’te
verilen Data Link Properties diyalog kutusu gelir.
Şekil 9.i-5
511
Providor, Connection, Advanced ve All adında 4 sekmenin bulunduğu
Data Link Properties diyalog kutusundaki Provider sekmesinde veri tabanı
dosyasına erişimde hangi tekniğin kullanılacağı belirlenmektedir. Başlangıçta
veri tabanı dosyasına ODBC tekniği ile erişim sağlanacağı varsayılmaktadır.
Eğer veri tabanı dosyasına, Data nesnesinde olduğu gibi Jet veri tabanı
motoru ile erişim sağlamak istiyorsanız Microsoft Jet 3,51 OLE DB Providor
seçeneğini seçebilirsiniz.
Veri tabanı dosyalarına ODBC tekniği ile erişim sağlamak istediğim için Microsoft OLE DB
Providor For ODBC Driver seçeneğini seçili durumda iken Connection sekmesine geçelim.
Connection sekmesinde Data Source seçimi yapılmaktadır (Şekil 9.i-6).. Data Source tanımlama
işlemi ise Windows’un Denetim Masasındaki “ODBC” seçeneğinin üzerinde çift tıklama yapıldığı
zaman ekrana gelen ODBC Data Source Administrator diyalog kutusunda yapılmaktadır. Bir önceki
bölümde örnek olması için “Stok Dosyası” adında bir Data Source tanımlamıştık.
Şekil 9.i-6
Connection sekmesinde Data Source seçimini yaptıktan sonra Advanced sekmesine geçelim.
Advanced sekmesindeki seçeneklerle veri tabanı dosyası üzerinde yapılabilecek işlemler
belirlenmektedir (Şekil 9.i-7).
512
Şekil 9.i-7
Veri tabanı dosyası üzerinde yapılabilecek her işlem bu sekmede bir onay kutusu ile temsil
edilmektedir. Bu 3 sekmede yapılan bütün seçim ve ayarlamaları bir arada görmek istiyorsanız All
sekmesine geçmeniz gerekir (Şekil 9.i-8).
513
Şekil 9.i-8
All sekmesinde, hangi seçenekte değişiklik yapmak istiyorsanız fare ile o seçeneğin üzerinde çift
tıklama yapabilirsiniz veya söz konusu seçenek seçili durumda iken Edit Value düğmesinde tıklama
yapabilirsiniz. Bu sırada Property Value liste kutusunu açıp başka bir Data Source'’ seçebilirsiniz
(Şekil 9.i-9).
Şekil 9.i-9
Eğer aynı Data Environment ile birden fazla veri tabanı dosyasına erişim sağlamak gereği olsaydı,
öncelikle Data Environment nesnesinin üzerinde farenin sağ tuşu ile tıklama yapıp kısayol menüsünü
ekrana getirmek gerekirdi (Şekil 9.i-10).
514
Şekil 9.i-10
Data Environment penceresi içinde ikinci bir Connection nesnesi hazırlamak üzere kısa yol
menüsünden Add Connection komutunu verirseniz Connection hazırlama işlemini tamamlamış
olursunuz. Benzer şekilde Data Environment penceresindeki 2. Connection nesnesi için Data Dource
seçimi yapabilirsiniz (Şekil 9.i-11).
Şekil 9.i-11
Yukarıdaki sayfalarda anlatılan şekilde Connection nesnesi ile seçim ve ayarlamaları yaptıktan
sonra sıra Command nesnesi tanımlamaya gelir. Çünkü Data Environment nesnesi sayesinde veri
tabanı dosyaları üzerinde işlem yapılırken Command nesnesine gerek duyulmaktadır. Connection
nesnesi için yeni bir Command nesnesi hazırlamak istiyorsanız Command nesnesine ait kısayol
menüsünden Add Command komutunu vermeniz gerekir. Şekil 9.i-12’de verilen ekran görüntüsü
farenin sağ tuşu ile Connection nesnesinin üzerinde tıklama yapıp kısayol menüsünü açıldıktan sonra
alınmıştır.
515
Şekil 9.i-12
Connection nesnesine ait kısayol menüsündeki Delete komutu ile Connection nesnesini silebilir ve
Rename komutu ile adını değiştirebilirsiniz. Connection nesnesine yeni bir Command nesnesi dahil
etmek üzere kısayol menüsünden Add Command komutunu verirseniz Data Environment penceresi
içinde bir Command nesnesi hazırlanır. Şekil 9.i-13’te verilen ekran görüntüsü kısayol menüsünden
Add Command komutu verildikten sonra alınmıştır.
Şekil 9.i-13
Anlatılan şekilde bir Command nesnesi hazırladıktan sonra, bu nesnenin işe yarayabilmesi için bazı
ayarlamaların yapılması gerekmektedir. Bu amaçla farenin sağ tuşu ile Command nesnesine ait kısayol
menüsünü açıp Properties komutunu vermek gerekir. Şekil 9.i-14’te verilen ekran görüntüsü
Command nesnesine ait kısayol menüsünden Properties komutu verildikten sonra alınmıştır.
516
Şekil 9.i-14
General sekmesindeki Command Name metin kutusunu nesneye verilmek istenen adı
yazılmaktadır. Bu metin kutusunun içeriğini değiştirip Command nesnesine istediğiniz adı
verebilirsiniz. Yine bu sekmedeki Connection liste kutusu ile Connection seçimi yapılmaktadır. Şekil
9.i-15’te verilen ekran görüntüsü alındığı sırada projedeki Data Environment penceresinde yalnızca 2
Connection nesnesi vardı.
Şekil 9.i-15
Command nesnesine ait özelliklerin listelendiği bu diyalog kutusundaki Source of Data adı altında
bir araya getirilmiş olan 2 radyo düğmesi ile Connection nesnesi ile belirlenen veri tabanı dosyasının
(tablo ve alanlar) nasıl belirleneceği seçilmektedir. Eğer söz konusu nesneleri SQL kodu ile
belirlemek istiyorsanız SQL Statement radyo düğmesini seçtikten sonra SQL kodu yazmanız gerekir.
517
Connection nesnesi ile söz konusu veri tabanı dosyasının bir tablosu üzerinde işlem yapmak için
Database Object liste kutusunu açıp Table seçeneğini seçilmelidir (Şekil 9.i-16).
Şekil 9.i-16
Database Object liste kutusunda “Table” seçeneğini seçtikten sonra sıra üzerinde işlem yapılacak
tablonun seçimine gelir. Çünkü veri tabanı dosyasında birden fazla tablo olabilir. Bu nedenle Object
Name liste kutusunu açıp tablo seçimi yapılmalıdır (Şekil 9.i-17).
Şekil 9.i-17
Bu ekran görüntüsünü aldığım sırada “Connection1” nesnesi ile erişim sağlamak istediğim “Stok”
adlı veri tabanı dosyasında 2 tablo bulunuyordu. Bu işlemden sonra Command nesnesinin önüne, bu
nesnenin başka nesneler içerdiğini işaret etmek için artı (+) işareti konulur (Şekil 9.i-18).
518
Şekil 9.i-18
Comand nesnesine ait alt nesnelerin listelenmesini sağlamak için nesneye ait simgede tıklama
yapmak gerekir. Command nesnesinin Object Name özelliğine adı aktarılan tablodaki bütün alanlar,
Command nesnesine bağlı olarak Data Environment penceresi içinde listelenir (Şekil 9.i-19).
Şekil 9.i-19
Data Environment penceresi içinde listelenen bu alanları projenin herhangi bir formunda
kullanabilirsiniz. Bu işlemin nasıl yapıldığını görmek için Visual Basic penceresi içinde Form ve Data
Environment pencerelerinin aynı anda görüntülenmesini sağlayalım (Şekil 9.i-20).
Şekil 9.i-20
Command nesnesi ile eriğim sağlanan ilgili tablodaki hangi alanın içeriğini formun üzerinde
görüntülemek istiyorsanız fare ile Data Environment penceresinden sürükleyip formun üzerine
yerleştirmeniz gerekir. Şekil 9.i-21’de verilen ekran görüntüsü “StokKodu” alanını sürükleyip formun
üzerine yerleştirildikten sonra alınmıştır.
519
Şekil 9.i-21
Söz konusu alanı Data Environment penceresinden alıp formun üzerine yerleştirme işlemi
sırasında formun üzerinde label ve metin kutusu nesnesi konulur. Benzer şekilde diğer alanları
sürükleyip formun üzerine bırakabilirsiniz (Şekil 9.i-22).
Şekil 9.i-22
Forma bu şekilde yerleştirdiğiniz Label ve TextBox nesnelerinin biçim özelliklerinde istediğiniz
değişikliği yapabilirsiniz. Bütün bu hazırlıklardan sonra proje çalıştırılacak olursa, erişim sağlanan
tablodaki ilk kaydın içeriği ekrana getirilir (Şekil 9.i-23).
Şekil 9.i-23
Connection ve Command nesneleri varsayım olarak açık durumda oldukları için ayrıca ek bir işlem
yapmaya gerek yoktur. Ancak bilgi sahibi olmanız açısından Form_Load yordamını aşağıdaki şekilde
düzenlenebilir.
Private Sub Form_Load()
If DataEnvironment1.Connection1.State = adStateClosed Then
DataEnvironment1.Connection1.Open
End If
520
If DataEnvironment1.rsConnection1.State = adStateClosed Then
DataEnvironment1.rsConnection1.Open
End If
End Sub
Bu yordamda kullanılan Open metodu sayesinde Connection ve “rsCommand” adı verilmiş olan
RecordSet nesnesi açık durumda değilse açılır. Bu program kodunda Command nesnesinin önüne
eklenen “rs” harfleri RecordSet anlamındadır. Şimdi ise tablodaki kayıtların arasında dolaşabilmek
için forma 2 düğme yerleştirelim (Şekil 9.i-24).
Şekil 9.i-24
Çalışma anında “Sonraki Kayıt” başlıklı düğmede tıklama yapıldığı zaman işletilmek üzere bu
düğmenin Click yordamını aşağıdaki gibi düzenlenir. Daha önceki konulardan bildiğiniz gibi bir
sonraki kaydın üzerine gitmek için RecordSet nesnesine MoveNext metodu uygulanmaktadır.
Privatr Sub Sonraki_Click()
DataEnvironment1.rsCommand1.MoveNext
End Sub
Daha önce Data kontrolü ile ilgili olarakREcordSet nesnesi hakkında verilen bütün bilgiler
Command nesnesine ait RecordSet nesnesi için de geçerlidir.
521
9.j. Crystall Report ile Rapor Hazırlamak
Visual Basic ile birlikte Visual Basic projeleri dahilinde veya başka bir program ile hazırlanan veri
tabanı dosyalarından rapor hazırlamak amacıyla kullanılan Crystal Reports adında bir rapor üreticisi
verilmektedir. Ancak Visual Basic 6.0’ı daha önce anlatılan şekilde bilgisayara kuracak olursanız
Crystal Report programı kurulmaz. Eğer Crystal Report programı ile rapor dosyası hazırlamak ve bu
rapor dosyalarını Visual Basic projeleri dahilinde kullanmak istiyorsanız Visual Studio paketinden
çıkan 3.CD’den yararlanmak gerekir. Crystal Report programı için Add-Ins menüsünde Report
Designer adında bir komut hazırlanır (Şekil 9.j-1).
Şekil 9.j-1
Add-Ins menüsündeki bu komut verilip rapor üreticisi programı başlatıldıktan sonra ekrana Crystal
Reports penceresi gelir (Şekil 9.j-2). Crystal Reports ile kolay bir şekilde profesyonel kalitede raporlar
hazırlayıp Visual Basic projeleri içinde kullanılabilir.
522
Şekil 9.j-2
Crystal Reports ile hazırlanan rapor dosyalarına RPT uzantısı verilmektedir. Yeni bir rapor
hazırlamak için File menüsünden New komutu verilir veya araç çubuğundaki ilk düğmede tıklama
yapılır. File menüsünden New komutunu verirseniz ekrana Create New Report diyalog kutusu gelir.
Create New Report diyalog kutusunda rapor hazırlama yardımcısı (Expert) seçilmektedir (Şekil 9.j-3).
Şekil 9.j-3
Hazırlamak istediğiniz rapor, Create New Report diyalog kutusunda birer düğme ile temsil edilen
rapor hazırlama Expert’lerinden hangisine yakınsa onu seçmeniz gerekir. Standart bir rapor
hazırlamak istiyorsanız Standart düğmesinde, çapraz sorgu hazırlamak istiyorsanız Cross-Tab
523
düğmesinde ve mektup etiketleri hazırlamak istiyorsanız Mail Label düğmesinde tıklama yapmanız
gerekir. Custom düğmesinde tıklama yaparsanız Create Nwe Report diyalog kutusunun alt kısmına 5
düğme eklenir (Şekil 9.j-4).
Şekil 9.j-4
Standart düğmesinde tıklama yapılınca Expert çalışmaya başlar ve Expert’in ilk adımını temsil
eden diyalog kutusu ekrana gelir (Şekil 9.j-5). Rapor hazırlama Expert’in ilk adımını temsil eden
diyalog kutusunda hazırlanmak istenen rapora kaynaklık edecek veri tabanı dosyası seçilmektedir.
Şekil 9.j-5
524
Veri tabanı dosyasını seçmek için Data File düğmesinde tıklama yapılırsa Choose Database File
diyalog kutusu ekrana gelir (Şekil 9.j-6).
Şekil 9.j-6
Bu diyalog kutusunda rapora kaynaklık edecek veri tabanı dosyası seçilip önce Add düğmesinde,
ardından Done düğmesinde tıklama yapılınca rapor hazırlama Expert’in 2. adımını temsil diyalog
kutusu ekrana gelir. Rapor hazırlama Expert’in 2. adımını temsil eden diyalog kutusunda seçilen veri
tabanı dosyasındaki tablolar birer liste kutusu ile temsil edilmektedir.
Şekil 9.j-7
Bu sırada diyalog kutusunun üst kısmındaki “Step 1:Tables” sekmesinde tıklama yapıp rapor
hazırlama işleminin ilk adımına geçecek olursanız seçilen veri tabanı dosyasındaki tablo ve sorguların
listelendiğini görebilirsiniz. Rapor hazırlama işleminin ilk adımına dönmek için Back düğmesinde
tıklama yapabilirsiniz. Şekil 9.j-8’de verilen ekran görüntüsünde “Stok” adlı veri tabanı dosyasında
dört tablo bulunmaktadır.
525
Şekil 9.j-8
Rapor dahilinde yararlanmayacağınız tabloları Delete düğmesi ile bu diyalog kutusundan
silebilirsiniz. Eğer hazırlayacağınız rapor ile birden fazla veri tabanı dosyasından bilgi derleyecekseniz
tekrar Data File düğmesinde tıklama yapıp veri tabanı dosyası seçimi yapılan Choose Database File
diyalog kutusunu ekrana getirebilirsiniz.
Ekranda rapor hazırlama Expert’in 2. adımını temsil eden diyalog kutusu varken Next düğmesinde
tıklama yapıp rapora dahil edilecek alanların seçildiği sekmeye geçebilirsiniz. Aşağıda verilen ekran
görüntüsünde görebileceğiniz gibi seçilen tablolardaki alanlar Database Fields liste kutusunda
listelenmektedir (Şekil 9.j-9).
526
Şekil 9.j-9
Raporda yer almasını istediğiniz alanları Add düğmesinde tıklama yaparak rapora dahil
edebilirsiniz. Şekil 9.j-10’da verilen ekran görüntüsü raporda yer almasını istediğimiz alanları
göstermektedir. Rapora dahil edilen alanların adları aynı zamanda sütun başlığı olarak
kullanılmaktadır. Eğer alan adlarından farklı sütun başlıkları kullanmak istiyorsanız Report Fields
liste kutusunda alan seçtikten sonra Column Heading metin kutusuna istediğini başlık metnini
yazabilirsiniz.
Şekil 9.j-10
Rapor hazırlama Expert’in 4. adımını temsil eden Sort sekmesinde raporda yer alacak bilgilerin
nasıl sıralanacağı ve nasıl bir gruplama yapılacağı konusunda seçim yapılmaktadır. Raporda bilgilerin
StokKodu alanına göre sıralanmasını istediğimiz için Add düğmesi ile StokKodu alanını Group Fields
liste kutusuna kopyalayalım.
527
Şekil 9.j-11
Sort sekmesinde kayıtların nasıl sıralanacağı ve gruplanacağı konusunda seçim yapıldıktan sonra
Total sekmesine geçilir. Total sekmesinde sayısal bilgi içeren alanların içeriğinin toplanması
konusunda seçim yapılmaktadır. Rapora dahil edilecek bilgileri herhangi bir alana göre toplamak
istemediğimiz için Total sekmesinde herhangi bir seçim ve ayarlama yapmadık (Şekil 9.j-12).
Şekil 9.j-12
Rapor hazırlama sihirbazının 6. adımını temsil eden Select sekmesinde raporda yer almasını
istemediğiniz kayıtları filtre edebilirsiniz. Kayıt filtre etme işlemini hangi alana göre yapmak
528
istiyorsanız o alanı Add düğmesi ile Report Fields liste kutusundan Select Fields liste kutusuna
kopyalamanız gerekir (Şekil 9.j-13).
Şekil 9.j-13
Örnek olması için raporda StokKodu alanında “Arçelik” bilgisi olan kayıtların yer almasını
sağlamak için StokKodu alanını Select Fields liste kutusuna kopyalayalım. Alan kopyalama
işleminden sonra Select sekmesinin alt kısmında değişiklik meydana gelmektedir (Şekil 9.j-14).
Şekil 9.j-14
Başlangıçta herhangi bir koşula göre kayıtlar fitre edilmediği için diyalaog kutusuna yerleştirilen
liste kutusunda “any value” seçeneği bulunmaktadır. Şekil 9.j-15’te verilen ekran görüntüsünü almak
Select Fields liste kutusuna alan kopyalama işleminden sonra diyalog kutusuna yerleştirilen liste
kutusunda “Any value” seçeneğin yerine önce “Like” seçeneğini seçelim. Ardından liste kutusunun
hemen yanına yerleştirilen metin kutusna “Arçelik *” yazalım.
529
Şekil 9.j-15
Kayıtların nasıl filtre edileceğini bu şekilde belirledikten sonra rapor biçiminin seçildiği Style
sekmesinde rapor biçiminin başka rapora verilmek istenen başlık Title metin kutusuna yazılabilir
(Şekil 9.j-16).
Şekil 9.j-16
530
Bu işlemlerden sonra Preview Report düğmesinde tıklama yapılarak rapor hazırlanır. Rapor
hazırlama Expert’i ile hazırladığımız raporu aşağıda görebilirsiniz (Şekil 9.j-17).
Şekil 9.j-17
Crystal report uygulamasından çıkmadan önce hazırlanan raporun kaydedilmesi gerekir. Bunun için
File menüsündeki Save komutundan yararlanılır. File menüsünden Save komutunu verirseniz ekrana
rapora istenen adın verilebileceği File Save As diyalog kutusu gelir. Raporu “Arçelik.rpt” adıyla
kaydettikten sonra Crystal Report programın çalışmasını sona erdirelim.
Şekil 9.j-18
531
1. Report Kontrolü
Crystal Reports programı ile yukarıda anlatılan şekilde hazırlanan rapor dosyalarından yararlanarak
ekrana veya yazıcıya raporlar almak mümkündür. Ancak bu yeterli değildir. Crystal Reports ile
hazırlanan RPT uzantılı rapor dosyalarının Visual Basic projeleri dahilinde kullanılabilmesi gerekir.
Bunun için üzerinde çalışılan projeye Crystal Reports kontrolünü temsil eden özel kontrol dosyasının
eklenmesi gerekir (Şekil 9.j-19).
Şekil 9.j-19
Visual Basic’in Project menüsünde bulunan Components komutu ile ekrana getirilen Components
diyalog kutusunda Crystal Report kontrolü üzerinde çalışılan projeye dahil edilince ToolBox
penceresine rapor kontrolünü temsil eden bir düğme eklenir (Şekil 9.j-20).
532
Şekil 9.j-20
ToolBox pencersinde Crystal Reports kontrolünü temsil eden düğme seçili duruma getirildikten
sonra üzerinde çalışılan projenin aktif formuna rapor nesnesi eklenir (Şekil 9.j-21).
Şekil 9.j-21
Forma eklenen ilk Crystal Reports nesnesine Crystal Reports1 adı verilmektedir. Rapor nenesinin
adı nesneye ait Name değişkeninde tutulmaktadır. Tasarım anında Rapor nesnesine istenen ad
verilebilir (Şekil 9.j-22).
Şekil 9.j-22
Forma eklenen Report nesnesine kaynaklık edecek RPT uzantılı rapor dosyasının adı Report
nesnesine ait ReportFileName adlı değişkene aktarılır (Şekil 9.j-23).
533
Şekil 9.j-23
Bu özelliğe aktarılacak RPT uzantılı dosyayı ve bulunduğu klasörün adı ezbere biliniyorsa ışıklı
bant ReportFileName özelliğinin üzerinde iken üzerinde 3 nokta bulunan düğmede tıklama yapılırsa
ekrana Properties Pages başlıklı bir diyalog kutusu gelir. Bu diyalog kutusunda Report nesnesine
kaynaklık edecek rapor dosyası veya raporun hedefi belirlenir.
Report nesnesi yardımı ile veri tabanı dosyasından derlenen kayıtlar yazıcıya, ekrana veya bir
dosyaya gönderilebilir. Eğer raporu ekranda görmek istiyorsanız To Window, yazıcıdan almak
istiyorsanız To Printer ve raporun içeriğini bir dosyaya yazmak istiyorsanız To File radyo düğmesini
seçili duruma getirmeniz gerekir (Şekil 9.j-24).
Şekil 9.j-24
Rapor dosyasının adını ve yerini ezbere bilmiyorsanız ReportFileName başlığına sahip metin
kutusunun sonuna konulan düğmede tıklama yapmanız gerekir (Şekil 9.j-24). Bu düğmede tıklama
yaparsanız ekrana Choose Report diyalog kutusu gelir (Şekil 9.j-25).
534
Şekil 9.j-25
Reports nesnesine kaynaklık edecek RPT uzantılı rapor dosyasını seçip Aç düğmesinde tıklama
yaparsanız seçtiğiniz dosya Report nesnesinin ReportFileName değişkenine aktarılır. ReportFileName
değişkeninin içeriği çalışma anında program kodu yazılarak belirlenebilir.
Report nesnesi ile rapor almaya başlamak için Report nesnesine ait Action değişkeninden
yararlanılır. Action değişkenine “1” sayısal değeri aktarılacak olunursa rapor alınmaya başlanır.
Action değişkenine değer aktarma işlemini bir düğmede tıklama yapma olayına bağlayalım. Bunun
için Report nesnesini dahil ettiğimiz forma “Rapor” başlıklı bir düğme ekleyelim.
Yukarıda anlatıldığı gibi tasarım anında Report nesnesine ait Properties penceresinde gerekli seçim
ve ayarlamalar yapılıp çalışma anında Rapor başlıklı düğmede tıklama yapılınca rapor hazırlanıp
ekrana verilecektir. Bunun için Action değişkeninin içeriğini değiştiren program kodlarını Rapor
başlıklı ve adlı komut düğmesinin Click yordamına dahil edelim.
Private Sub Rapor_Click()
CrystalReport1.Action = 1
End Sub
Bu sırada Rapor başlıklı düğmede tıklama yapılacak olunursa Crystal Report nesnesine ait Action
değişkenine 1 sayısal değeri aktarılır ve ekrana bir pencere içinde Raporlama yapılır.
Hazırladığımız Rapora kaynaklık eden veri tabanı dosyasındaki tabloda az sayıda kayıt olduğu için bu
penceredeki raporun sayfaları arasında dolaşmaya yarayan düğmeler kullanılamaz durumdadır. Bu
pencere üzerindeki büyüteç resmi bulunan düğmede tıklama yapılacak olunursa raporun kağıt
üzerindeki tam görüntüsü ekrana getirilir (Şekil 9.j-26).
535
Şekil 9.j-26
Rapor nesnesine başlık vermek istiyorsanız Report nesnesine ait WindowTitle özelliğinden
yararlanmalısınız (Şekil 9.j-27).
Şekil 9.j-27
Henüz adı olmayan bu rapora ait penceredeki rapor formu 3 kısma ayrılmış durumdadır. Formun en
başında Page Header yani formun başlığı vardır. Formun en başına başlık bilgisi yazmak için Insert
menüsündeki Text Field komutundan yararlanabiliriz (Şekil23-28).
536
Şekil 9.j-28
Bunun için Text Field komutunu tuşlarsanız ekrana Edit Text Field diyalog kutusu gelir. Bu kutu
içindeki Text kutusuna formun başlığını yazıp Accept tuşuna basarsanız, yazdığınız yazı formun
üzerine aktarılır (Şekil 9.j-29,30).
Şekil 9.j-29
Şekil 9.j-30
537
Başlık yazısının hangi tarafa yaslanacağına başlık yazısının üzerine fareile çift tıklattığınızda
ekrana gelen Format String diyalog kutusundaki Alignment bölümünden seçeceğiniz Left, Centered
ve Right komutlarından herhangi biri ile verebilirsiniz (Şekil 9.j-31).
Şekil 9.j-31
Örnek olması için hazırladığımız raporun başlığına “Şilt ve Hediye Alan Personel Listesi””
bilgisini yazalım. Hatta örnek olması için rapor başlığına ilgisiz bir adet resim dosyası ilave edelim
(Şekil 9.j-32).
Şekil 9.j-32
Yazının başlığına resim ilave etmek için Insert menüsündeki Picture komutundan
yararlanabilirsiniz (Şekil 9.j-28). Bunun için Picrure komutu verilecek olursanız ekrana gelen Choose
Picture File diyalog kutusundan istenilen resim seçer ve formun istediğiniz kısmına
yerleştirebilirsiniz.(Şekil 9.j-33).
538
Şekil 9.j-33
Raporun başlığı için Font ve punto seçimi için Format menüsündeki Font komutundan
yararlanabilirsiniz (Şekil 9.j-34).
Şekil 9.j-34
Raporun başlığının yüksekliği istenildiği gibi azaltılıp arttırılabilir. Başlığa bilgi eklendikçe
başlığın yüksekliği otomatik olarak ayarlanır. Başlığın tasarımı bittikten sonra benzer işlemler raporun
alt kısmı yani Page Footer için de yapılabilir (Şekil 9.j-35).
Şekil 9.j-35
539
Rapora sayfa numarası eklemek için İnsert menüsünden Special Field Page Number Field ve
raporun her sayfasına günün tarihinin yazılmasını sağlamak için İnsert menüsündeki Special Field
Print Date Field komutundan yararlanabilirsiniz (Şekil 9.j-36).
Şekil 9.j-36
Şimdi geriye rapor formunun Details kısmı kaldı. Raporlar temelde rapora kaynaklık eden veri
tabanı dosyasından kayıt okuyup formun üzerine yazmaya dayandığı için Detail kısmında mutlaka veri
tabanı dosyasından okunacak bilgiler için alanlara (Fields) yer verilir.
Insert menüsünden Database Fields komutu verilince ekrana Insert Database Fields diyalog kutusu
gelir. Eğer Insert Database Field diyalog kutusu ekranda ise Insert menüsünden komut vermeye gerek
kalmadan istediğiniz alanı seçili duruma getirip Insert düğmesinde tıklama yapabilirsiniz. (Şekil 9.j37).
Şekil 9.j-37
Bu diyalog kutusunda seçilen tabloda bulunan bütün alanlar listelenir. Raporda hangi alan için yer
ayrılacaksa o alan bu diyalog kutusunda seçili duruma getirilip Insert düğmesinde tıklama yapılır.
Insert düğmesinde tıklama yapıldıktan sonra fare işaretinin ucuna seçilen alan ile aynı genişliğe sahip
bir dikdörtgen eklenir. Bu dikdörtgen raporun istenilen kısmına bırakılır (Şekil 9.j-38).
540
Şekil 9.j-38
Bu şekilde raporda yer alması istenen bütün Database Fields’ler için Raporun üzerinde yer ayırma
işleminden sonra raporun hazırlanması işlemi bitirilebilir. Normal olarak rapor başlığına Untitled
Report 1 bilgisi verilmiş durumdadır. Raporun varsayılan başlığını değiştirmek için Report
menüsünden Report Title komutu verilir (Şekil 9.j-39).
Şekil 9.j-39
Rapora başlık vermek üzere Report menüsünden Report Title komutunu veiriseniz ekrana Edit
Report Title ditalog kutusu gelir (Şekil 9.j-40).
541
Şekil 9.j-40
Bu diyalog kutusunda Title kutusuna Rapora verilmek istenen başlığın girişi yapılıp Accent
düğmesinde tıklama yapılınca Rapor dosyasına başlık bilgisi verme işlemi tamamlanır ( Şekil 9.j-41).
Şekil 9.j-41
Hazırlanan raporun yazıcıdan alınması için Print menüsünden Print Window komutunu
vermelisiniz. Bu komut verilince seçilen dosyadaki kayıtlar Rapor penceresine gelir.
542
2. Sıfırdan Rapor Hazırlamak
Create Report Expert’ten yararlanarak sıfırdan bir rapor hazırlayalım. Bu amaçla önce Crystal
Report programını başlatalım. Ardından File menüsünden New komutunu verip rapor hazırlama
tekniğinin seçildiği Create New Report diyalog kutusunu ekrana getirelim. Expert veya Sihirbazdan
yararlanmadan rapor hazırlarken başvurulan Custom Report düğmesi başlangıçta Create New Report
diyalog kutusunda yer almadığı için ayrıca Custom düğmesinde tıklama yapalım (Şekil 9.j-42).
Şekil 9.j-42
Expert’lerden yararlanmadan kendimiz rapor hazırlamak istediğimiz için Custom Report
düğmesinde tıklama yapıp bu düğmeyi seçili duruma getirdikten sonra, rapora kaynak oluşturan veri
tabanı dosyasını seçmek üzere Data File düğmesinde tıklama yapalım. Data File düğmesinde tıklama
yaparsanız veri tabanı dosyası seçimi yapılan Choose Database File diyalog kutusu ekrana
gelmektedir.
543
Şekil 9.j-43
Bu diyalog kutusunda rapora temel oluşturacak veri tabanı dosyasını seçip OK. düğmesinde
tıklama yaparsanız Crystal Report programı içeriği boş bir rapor hazırlayıp ekrana getiri. Crystal
Report programı ayrıca ekrana Insert Database Field penceresini getirmektedir.
Şekil 9.j-44
Insert database Field penceresinde, seçilen veri tabanı dosyasındaki tablolar ve tablolardaki alanlar
listelenmektedir. Insert Database Field penceresinden yararlanarak alanlar dahil etmeden önce raporun
kısımları hakkında bilgi alalım. Şekil 9.j-45’te verilen ekran görüntüsünde görebileceğiniz gibi
Crystal Report ile hazırlanan raporlar 5 ayrı kısımdan meydana gelmektedir (Şekil 9.j-45).
544
Şekil 9.j-45
Title başlıklı satıra rapora verilmek istenen başlık yazılmaktadır. Rapor kaç sayfadan meydana
gelirse gelsin, Title satırına yazılan bilgi bir kez kullanılır. Raporun her sayfasının başına yazılmak
istenen bilgi Page Header satırına ve rapor sayfasının alt kısmına yazılmak istenenler ise Details
satırına yazılır. Details satırı, seçilen tabloda kaç kayıt varsa o kadar tekrarlanır. Şimdi ilk olarak örnek
olması için raporun başlığını girelim. Raporun başlığını girmek için Insert menüsünden Text Field
komutunu vermek
Gerekir (Şekil 9.j-46).
Şekil 9.j-46
Raporun başlığını girmek üzere Insert menüsünden Text Field komutunu verirseniz ekrana rapor
başlığı olarak kullanabileceğiniz metni girebileceğiniz Edit Text Field diyalog kutusu gelir (Şekil 9.j47).
545
Şekil 9.j-47
İstediğiniz rapor başlığını bu diyalog kutusuna girip Accept düğmesinde tıklama yaparsanız fare
işaretinin ucuna, Edit Text Field diyalog kutusuna girdiğiniz metnin miktarına bağlı olarak bir
dikdörtgen eklenir.
Şekil 9.j-48
Edit Text Field diyalog kurusuna girdiğiniz metni sayfa başlığı olarak kullanmak üzere Page
header satırına yerleştirebilirsiniz. Rapor başlığı olarak kullanılmak üzere girilen metin çin font ve
punto değişikliğini yapmak için Format menüsündeki Font komutundan yararlanmak gerekir (Şekil
9.j-49).
Şekil 9.j-49
Format menüsünden Font komutunu vermeden önce raporun Title kısmına yerleştirmiş olduğunuz
nesnenin üzerine tıklama yaparak seçili duruma getirebilirsiniz. Format menüsünden Font komutu
verildiğinde ekrana Yazıtipi diyalog kutusu gelmektedir (Şekil 9.j-50).
546
Şekil 9.j-50
Yazıtipi diyalog kutusunda istediğiniz font, punto ve yazı rengini seçip tamam düğmesinde tıklama
yaparsanız bundan seçili durumdaki nesne etkilenir. Title satırının yüksekliği seçilen punto değerinden
otomatik olarak etkilenir (Şekil 9.j-51).
Şekil 9.j-51
Aynı zamanda yazı kutusunun üzerinde iken farenin sağ tuşuyla tıklama yapmanız halinde Şekil
9.j-52’de görülen diyalog kutu ekrana gelir. Bu diyalog kutusunda Change Font’u tıklarsanız ekrana
Yazıtipi diyalog kutusu gelir. (Şekil 9.j-52).
547
Şekil 9.j-52
Şekil 9.j-32
Rapora yerleştirmiş olduğunuz nesnelerin biçim özelliklerinde değişiklik yaparken Crystal Raports
penceresinin alt kısmına yerleştirilen araç çubuğundan da yararlanabilirsiniz (Şekil 9.j-32).
Benzer şekilde sayfa üstbilgisi olarak kullanmak üzere raporun Page Header kısmına İnsert
menüsündeki Text Field komutundan yararlanarak sabit bilgi yerleştirebilirsiniz. Şekil 9.j-54’de
verilen ekran görüntüsü raporun Page Header kısmına sütun başlıklarını yazdıktan sonra alınmıştır.
Şekil 9.j-54
Raporun Page Header kısmını bu şekilde düzenledikten sonra sıra Details kısmına geldi. Details
kısmına yazılacak bilgiler veri tabanı dosyasından alınacağı için, daha önce ekrandan kaldırdığımız
Insert Database Field penceresini ekrana getirmek gerekir. Bu amaçla Insert menüsünden Database
Field komutu verilir (Şekil 9.j-55).
548
Şekil 9.j-55
Insert menüsünden Database Field komutunu verip ekrana Database Field penceresini getirdikten
sonra rapora temel oluşturması için daha önce seçmiş olduğunuz veri tabanı dosyasındaki tablolardan
istediğiniz alanı seçip rapora dahil edebilirsiniz (Şekil 9.j-56).
Şekil 9.j-56
Insert Database Field penceresinde rapora dahil etmek istediğiniz alanı seçtikten sonra Insert
düğmesinde tıklama yapmanız gerekir (Şekil 9.j-57).
Şekil 9.j-57
Insert düğmesinde tıklama yaptıktan sonra fare işaretini raporun Detail kısmına götürelim. Insert
Database Field penceresinde listelenen alanlardan birini seçip insert düğmesinde tıklama yapıp
raporun Datails kısmında tıklama yaptığınızda Crystal Reports programı kendiliğinden alanın adını,
549
raporun Page Header kısmına yazmaktadır. Ancak Page Header kısmına yazılacak bilgileri daha
önceden yazdıysanız bu işlem sırasında Page Headse kısmına otomatik olarak yazılan alan başlıklarını
silmeniz gerekir.
Şekil 9.j-58
Hazırlamak istediğimiz raporun Page footer olarak adlandırılan kısmına sayfa numarasını ve günün
tarihini yazalım. Raporun page footer kısmına güncel tarih ve sayfa numarası yazmak için Insert
Special Field komutu verildiği zaman ekrana gelen alt menüden Page Number Field komutunu
vermeniz gerekir (Şekil 9.j-58).
Şekil 9.j-59
Raporun Summary kısmını kullanmak istemezsek bu kısmı ortadan kaldırabiliriz. Bu amaçla Edit
menüsünden Show/Hide Section komutunu verip ekrana Show/Hide Section diyalaog kutusunu
getirelim. Başlangıçta raporun bütün kısımları görüntülendiği için bütün kısımların önünde “S” harfı
bulunmaktadır.
(Şekil 9.j-60).
550
Şekil 9.j-60
Raporun Summary kısmını gizlemek için ışıklı bantı Summary seçeneğinin üzerine götürüp Hide
Section radyo düğmesini seçmek yeterlidir (Şekil32-61).
Şekil 9.j-61
Bu işlemlerden sonra rapor sayesinde ekrana listelenecek veya yazıcıya gönderilecek bilgiler
hakkında bilgi edinmek istiyorsanız Design modundan Preview moduna geçebilirsiniz. Preview
moduna geçmek için üzerinde Preview yazan düğmede tıklama yapabilirsiniz (Şekil32-62).
551
Şekil 9.j-62
Erişim sağlanan veri tabanı dosyasının ilgili tablosundaki bütün kayıtlara yer verildi. Eğer raporda
tabloda bütün kayıtların yer almasını istemiyorsanız Report menüsündeki Select Records Expert
komutunu verebilirsiniz (Şekil 9.j-63).
Şekil 9.j-63
Rapor sayesinde erişilen tablodaki bazı kayıtları filtre etmek üzere Report menüsünden Select
Record Expert komutunu verirseniz ekrana Choose Field diyalog kutusu gelir. Choose Field diyalog
kutusunun üst kısmında rapora dahil edilen alanlar, alt kısmında ise rapora temel oluşturması için
seçilen veri tabanı dosyasındaki bütün tablolar ve bu tablolardaki alanlar listelenmektedir (Şekil 9.j64).
Şekil 9.j-64
552
Rapora dahil etmiş olduğumuz Adı alanını seçili durumda iken OK. düğmesinde tıklama yapacak
olursak ekrana Select Records Expert diyalog kutusu gelir (Şekil 9.j-65). Select Records Expert
diyalog kutusunda iki sekme bulunmaktadır. İlk sekmenin adı, seçilen alan ile aynıdır. Eğer birden
fazla alana göre filtre etmek istemiş olsaydık New sekmesine geçerek ikinci bir alanı seçmemiz
gerekirdi.
Şekil 9.j-65
Verilen ekran görüntüsünde tespit edebileceğiniz gibi kayıt seçme kriteri olarak kullanabileceğiniz
çok sayıda seçenek bulunmaktadır. Kayıtlar alanında “Soyadı” bilgisi olan kayıtların rapora dahil
edilmesini veya listelenecek kayıtlar konusunda eşitlik arandığı için equal to seçeneğini seçelim.
Şekil 9.j-66
Kayıt seçme kriterinin belirlendiği liste kutusunda “equal to” seçeneğini seçince liste kutusunun
yanına başka bir liste kutusu konuldu (Şekil 9.j-67).
553
Şekil 9.j-67
Kayıt seçme kriterini liste kutusuna doğrudan yazabileceğiniz gibi liste kutusundan seçebilirsiniz.
Şekil 9.j-68
Bu liste kutusunda “ABDULKADIR” değerini seçtikten sonra Select Records Expert diyalog
kutusunu OK. düğmesi ile kapatalım. Ardından Preview moduna geçip raporun son durumuna bakalım
(Şekil 9.j-69).
9.k.Data Report İle Rapor Hazırlamak
Bir önceki bölümde Crystal Report programı yardımıyla raporların nasıl hazırlandığı ve Visual
Basic projeleri dahilinde nasıl kullanıldığı konusunda bilgi verildi. Ancak Visual Basic’in 6.0
versiyonunda rapor hazırlamaya yönelik olarak kullanılan bazı yeni kontroller bulunmaktadır.
Visual Basic 6.0’da rapor hazırlamak için ilk olarak üzerinde çalışılan projeye bir Data Report
penceresi dahil edilmektedir. Üzerinde çalıştığınız projeye bir Data Report penceresi eklemek
istiyorsanız Project menüsündeki Componets komutu ile ekrana getirlen diyalog kutusundaki
Designers sekmesinden yararlanarak Data Report’un yüklenmesi gerekir (Şekil 9.k-1).
554
Şekil 9.k-1
Üzerinde çalıştığınız projeye Data Report Designer yüklü iken Project menüsünde Add Data
Report komutu bulunmaktadır (Şekil 9.k-2). Eğer Project menüsünde Add Data Report komutu
bulunuyorsa Components kutusunu ekrana getirip ayarlama yapmanıza gerek yoktur.
Şekil 9.k-2
Üzerinde çalıştığımız projeye, rapor hazırlamak amacıyla kullanılan bir pencere eklemek üzere
Add Data Report komutunu verirseniz başlangıçta “DataReport1” adına sahip bir rapor nesnesi
hazırlanır ve projeye dahil edilir. Üzerinde çalıştığınız projeye bir Data Report nesnesi dahil etmek
için Projevt menüsünden komut vermek yerine Standart araç çubuğundaki ilgili düğmede tıklama
yapıldığı zaman açılan menüdeki komutu verebilirsiniz (Şekil 9.k-3).
555
Şekil 9.k-3
Standart araç çubuğundaki 2.düğmenin sağ tarafında bulunan ve liste kutusu gibi olan küçük
düğmede tıklama yaparsanız Project menüsündeki komutların bir çoğunun yer aldığı bir menü ekrana
gelir (Şekil 9.k-4).
Şekil 9.k-4
Verilen ekran görüntüsünde tespit edebileceğiniz gibi Data Report penceresinde, başlangıçta içeriği
boş olan 5 ayrı kısma sahiptir. En üstte raporun başlığı Report Header ve an altta ise Report Footer
kısmı bulunmaktadır. Projeye Data Report nesnesi dahil etme işleminin Project Explorer
penceresindeki aktif pencere iken ekrana Propetties penceresini getirip Data Report nesnesine
istediğiniz adı verebilirsiniz.
556
Şekil 9.k-5
Diğer yandan üzerinde çalıştığımız projeye bir Data Report penceresini dahil etmeniz halinde
ToolBox’ta değişiklik olmakta ve ToolBox’a 6 düğme dahil edilmektedir (Şekil 9.k-6).
Şekil 9.k-6
Data Report penceresi aktif pencere iken DataReport adı altında bir araya getirilen düğmeler
kullanılamaz. Tam bu sırada formlardan birini seçerseniz General adı altında gruplaşan düğmeler
kullanabilir duruma gelir (Şekil 9.k-7).
Şekil 9.k-7
Şekil 9.k-8
Şimdi ilk olarak raporun başlığını hazırlayalım. Bu amaçla ToolBox’ta RptLabel kontrolünü temsil
eden düğmeyi seçelim. Yukarıda belirtildiği gibi Data Report penceresi altif pencere iken ToolBox’ta
Data Report nesnesinin üzerine yerleştirile bilinen düğmeler olmaktadır (Şekil 9.k-8). ToolBox’ta
RptLabel düğmesi seçili durumda iken fare işaretini Data Report penceresine götürülürse fare işareti
557
şekil değişikliğine uğrar. Bu sırada sürükleme pozisyonunda raporun başlık kısmına istediğiniz
boyutta RptLabel nesnesi yerleştirebilirsiniz. Rapor başlığına yerleştirilen ilk RptLabel nesnesinin
başlığı başlangıçta “Label1” olarak seçilir (Şekil 9.k-9).
Şekil 9.k-9
Data Report nesnesi ile ilgili kontrolleri kullanmak için ToolBox’taki düğmelere başvurmak
zorunda değilsiniz. Raporun hangi kısmına kontrol yerleştirmek istiyorsanız, raporun o kısmına ait
kısayol menüsünü açmanız gerekir. Şekil 9.k-10’da verilen ekran görüntüsü raporun, rapor başlığı
olarak kullanılan kısmın üzerinde farenin sağ tuşu ile tıklama yapıldıktan sonra alınmıştır.
Şekil 9.k-10
Farenin sağ tuşu ile rapor başlığının (Report Header) üzerinde tıklama yapınca ekrana kısayol
menüsü gelir. Rapora kontrollerden herhangi birini yerleştirmek istiyorsanız kısayol menüsünden
Insert Control komutu verildiği zaman ekrana gelen alt menüdeki komutlardan yararlanmanız gerekir
(Şekil 9.k-10). Rapor başlığı olarak kullanmak üzere raporun Report Header kısmına yerleştirdiğimiz
RptLabel nesnesinin özelliklerini değiştirmek için ekrana Properties penceresini getirelim ve Caption
özelliğinde değişiklik yapalım (Şekil 9.k-11).
558
Şekil 9.k-11
Properties penceresinde RptLabel nesnesinin Caption özelliğinde yapılan değişiklik anında
DataReport penceresine yansır. Şekil 9.k-11’de ekran görüntüsü verilen RptLabel nesnesinin Font
özelliklerinde değişiklik yapılarak elde edilmiştir.
Rapora yerleştirmiş olduğunuz RptLabel nesnesinin yerini ve boyutlarını fare ile belirlemekte
zorlanıyorsanız Properties penceresinde Label nesnesinin Height ve Width özelliklerine
başvurabilirsiniz (Şekil 9.k-12).
Şekil 9.k-12
Raporun başlığından başka, raporun her sayfasında kullanmak üzere sayfa başlığı hazırlamak
istiyorsanız raporun Page Header kısmına RptLabel kontrolü yerleştirebilirsiniz. Benzer şekilde her
sayfanın alt kısmına Page Fooder konulmak üzere rapor alt başlığı hazırlayabilirsiniz. Şekil 9.k-13’te
verilen ekran görüntüsü raporun sayfa başlığı olarak kullanmak üzere Page Header kısmına 5 adet
RptLabel nesnesi yerleştirildikten sonra alınmıştır.
559
Şekil 9.k-13
Şimdi örnek olması için Page Footer kısmına sayfa numarası yerleştirelim. Page Footer kısmına
sayfa numarası yerleştirmek için kısayol menüsünden Insert Control-Current Page Number
komutunu vermelisiniz (Şekil 9.k-14).
Şekil 9.k-14
Raporun Page Fppter kısmının neresine sayfa numarası yerleştirmek istiyorsanız farenin sağ tuşu
ile oraya tıklama yaparak kısayol menüsünü açmanız gerekir (Şekil 9.k-15).
560
Şekil 9.k-15
Bu hazırlıklardan sonra sıra raporun Detail adı verilen kısmına yazılacak bilgileri belirlemeye gelir.
Detail kısmında satırlar halinde listelenecek bilgiler veri tabanı dosyalarından alınacağı için daha
önceden bazı hazırlıkların yapılması gerekir.
Şekil 9.k-16
Veri tabanı dosyalarından bilgi alırken Data Environment nesnesinden yararlanmak istiyorsak
Project menüsünden komut vererek üzerinde çalıştığımız projeye bir Data Environment nesnesi dahil
edelim (Şekil 9.k-16).
Daha önce Data Environment nesnesi hakkında bilgi verilen bölümden bildiğiniz gibi Data
Environment nesnesi ile ilgili olarak en başta Connection nesnesi ile erişim sağlanacak veri tabanı
dosyası belirlenmektedir. Bu amaçla Connection nesnesine ait kısayol menüsünden Properties komutu
verilerek ekrana Data Link Properties diyalog kutusu getirilir (Şekil 9.k-17)
561
Şekil 9.k-17
DataReport nesnesi için Data Environment nesnesi ile veri tabanı dosyalarına erişim sağlarken
Microsoft Jet’i kullanmak istediğimiz için Data Link Properties diyalog kutusunda Provider
sekmesinde Microsoft Jet’i seçip Connection sekmesine geçelim. Connection sekmesinde erişim
sağlamak istenen veri tabanı dosyası belirlenmektedir (Şekil 9.k-18).
Şekil 9.k-18
İçerdiği kayıtları Data Report nesnesi içinde listelemek istediğimiz “KAYITLAR”
tablosu “EM_PERS.mdb” dosyasında olduğu için bu dosyanın adını ve bulunduğu klasörü Select or
enter a database name metin kutusuna yazalım. Bu şekilde erişim sağlanmak istenen veri tabanı
dosyası belirlendikten sonra Advanced sekmesine geçip dosya üzerinde istenen işlemler belirlenir
(Şekil 9.k-19).
562
Şekil 9.k-19
Söz konusu dosyadan yalnızca okuma yapmak istediğimiz için Advanced diyalog kutusunda Read
onay kutusunu seçtiktan sonra Tamam düğmesi ile Data Link Properties diyalog kutusunu kapatalım.
Anlatılan şekilde Connection nesnesinin özelliklerini belirledikten sonra Connection nesnesi için bir
Command nesnesi hazırlamak gerekir. Bu amaçla Connection nesnesine ait kısayol menüsünü açalım
(Şekil 9.k-20).
Şekil 9.k-20
Connection nesnesine ait kısayol menüsünden Add Command komutunu verirseniz Data
Environment penceresinde bir Command nesnesi hazırlanır (Şekil 9.k-21).
563
Şekil 9.k-21
Anlatılan şekilde Connection nesnesine bağlı olarak işlev görecek bir Command nesnesi
hazırladıktan sonra bu nesneye ait kısayol menüsü farenin sağ tuşu ile açılıp kısayol menüsünden
Properties komutunu verelim. Connection nesnesi sayesinde erişim sağlanan veri tabanı dosyasındaki
hangi tablo üzerinde işlem yapılacağı Command nesnesi ile belirlenmektedir. Bu amaçla Command
nesnesine ait kısayol menüsündeki Properties komutu ile ekrana getirilen diyalog kutusunda önce
Database Object liste kutusunda Table seçeneği seçilir ardından Object Name liste kutusunda tablo
seçimi yapılır (Şekil 9.k-22).
Şekil 9.k-22
Bu seçim ve ayarlamalardan sonra seçilen tablodaki alanlar Command nesnesine bağlı olarak Data
Environment penceresi içinde listelenir (Şekil 9.k-23).
564
Şekil 9.k-23
Data Environment nesnesi ile ilgili olarak yapılan bu işlemlerden sonra DataReport nesnesi içinde
tablodaki hangi alana yer verilmek isteniyorsa o alan fare ile Data Environment penceresinden alınıp
DataReport nesnesinin Detail kısmına bırakılabilir (Şekil 9.k-24).
Şekil 9.k-24
Raporun Detail kısmına alanları Data Environment penceresinden almış olmamıza rağmen henüz
rapora Data Environment nesnesinin kaynaklık edeceği belli değildir. Çünkü üzerinde çalışılan
projede birden fazla Data Environment nesnesi olabilir. Data Report nesnesi için Data Environment
seçimi yapmak için Properties penceresinde DataReport nesnesinin özellikleri listelenirken
DataSourse özelliğine, raporda listelenecek bilgilere kaynaklık edecek Data Environment nesnesinin
adı aktarılır (Şekil 9.k-25).
565
Şekil 9.k-25
Data Report nesnesi için DataSource seçimi yapıldıktan sonra ayrıce DataMember özelliği ile
Command nesnesi seçimi yapılmalıdır. Çünkü aynı Data Environment nesnesi içinde birden fazla
Command nesnesi olabilir. Rapor için Data Environment seçimi yapılmadan Command nesnesi seçimi
yapılamaz. Şekil 9.k-26’da verilen ekran görüntüsünde üzerinde çalıştığımız projedeki Data
Environment nesnesindeki yalnızca bir Command nesnesi vardı.
Şekil 9.k-26
Bütün bu işlemlerden sonra raporu ekranda görüntüleyebilir veya yazıcıda yazdırabilirsiniz.
Private Sub Görüntüle_Click
DataReport1.Show
End Sub
566
Çalışma anında “Görüntüle” başlıklı düğmede tıklama yapılıp bu yordam işletilirse rapor ayrı bir
pencere içinde ekranda görüntülenir. Şekil 9.k-27’te verilen ekran görüntüsünde tespit edebileceğiniz
gibi satırlar halinde rapor penceresinde listelenen her kayda ayrılan yükseklik miktarı oldukça fazladır.
Şekil 9.k-27
Bunun önüne geçmek için Data Report penceresinde raporun Detail kısmının yüksekliğini azaltmak
gerekir. Detail kısmının yüksekliğini fare ile göz kararı ayarlamak yerine Properties penceresinden
yararlanabilirsiniz (Şekil 9.k-28).
Şekil 9.k-28
567
Şekil 9.k-29
Bu penceredeki Zoom liste kutusundan yararlanarak raporun değişik ölçeklerde büyütülüp/
Küçültülüp görüntülenmesini sağlayabilirsiniz. Ayrıca rapor penceresinde üzerinde yazıcı resmi olan
düğmede tıklama yaparak raporu yazıcıya gönderebilirsiniz. Eğer raporu bu şekilde ekrana
getirmeden, başka bir deyişle program kodu yazarak yazıcıya göndermek istiyorsanız PrintReport
metodunu kullanabilirsiniz.
Private Sub Yazdır_Click
DataReport1.PrintReport
End Sub
Eğer hazırladığınız rapor birden fazla sayfaya sahipse ve bütün sayfaları yazdırmak istemiyorsanız,
PrintReport metodunun yanına yazdırılacak ilk ve son sayfanın numarasını yazabilirsiniz.
Private Sub Yazdır_Click
DataReport1.PrintReport, 2, 4
End Sub
Eğer hazırladığınız raporu hard diskte bir dosyada yazmak istiyorsanız ExportReport metodundan
yararlanabilirsiniz. Şimdi örnek olması için hazırlamış olduğumuz raporu hard diske HTLM
formatında bir dosyaya yazalım. Bu amaçla formun üzerine bir düğme yerleştirip bu düğmenin Click
yordamına aşağıdaki program kodunu yazmamız gerekir.
Private Sub Yazdır_Click
DataReport1.ExportReport,
“C:\Hediye.htm”, True, False
End Sub
568
Şekil 9.j-69
Kayıt seçme işlemini ikinci bir alana göre de yapmak için New sekmesinde tıklama yapmak gerekir.
New sekmesinde tıklama yapınca alan seçimi yapılan Choose Field diyalog kutusu ekrana
gelmektedir.
Şekil 9.j-60
Adı alanından başka “Soyadı” alanına göre kayıt seçmek istediğimiz için işlem alanını seçip OK.
düğmesinde tıklama yapınca Select Records Expert diyalog kutusu aşağıdaki verilen şekle dönüşür.
569
Şekil 9.j-61
9.l. Yazıcıyı Kullanmak
Windows, ClipBoard nesnesinden başka Windows uyumlu uygulamalar için Printer nesnesini de
hazırlamaktadır. Bunun için Windows uyumlu herhangi bir programda yazıcıyı kullanmak için ayrıca
Printer nesnesini tanımlamaya gerek yoktur. Printer nesnesi bütün Windows uyumlu uygulamalara
açık olduğu için diğer uygulama geliştirme programları gibi Visual Basic’te Printer nesnesi üzerinde
işlem yapmada kullanılan birkaç metot veya deyim bulunmaktadır. Bu metotların dışında program
kodu yazarak Printer nesnesine gönderilecek bilgiler üzerinde etkili olacak Font ve punto bilgileri
printer nesnesine ait FontName ve FontSize değişkeninde saklanır. Yazma işleminde veya Printer
nesnesine bilgi göndermede etkili olacak Fontun adı Printer nesnesinin FontName değişkenine daha
önceden aktarılmalıdır.
Bütün yazıcılar aynı özelliklere sahip olmadıkları için Windows’un bilgisayara bağlı yazıcı
hakkında bilgilendirilmesi gerekir. Bu işlem sürücü dosyaları ile yapılmaktadır. Bu nedenle Visual
Basic ve Visual Basic uygulamalarından bağımsız olarak kullanılan bilgisayara bağlı olan yazıcıya ait
yazıcı sürücü dosyasının Windows’a tanıtılması gerekir.
Aşağıda verilen program satırları ile Ad ve Soyad değişkenlerinin içerikleri yazıcıya, başka bir
deyişle Windows tarafından hazırlanan Printer nesnesine yazılır.
Private Sub form_Click()
Ad = “Hasan”
Soyad = “DURGUT”
Printer.FontName = “Arial”
570
Printer.FontSize = 20
Printer.Print Ad
Printer.Print Soyad
End Sub
Çalışma anında Form1 adlı formda tıklama yapılması halinde işletilecek bu yordamda yazma
işlemi öncesinde font ve punto seçimi yapılır. Ardından Print metodu ile “Ad” ve “Sıyad”
değişkenlerin içerikleri Printer nesnesine gönderilir. Printer nesnesine bilgi gönderme işlemi ile
birlikte Yazdırma Yöneticisi aktive olur. Eğer kullanılan yazıcı Laser bir yazıcı ise bu örnekle
yazıcıdan hemen çıkış alınmaz. Çünkü Laser yazıcılar yazma işlemini sayfa bazında yaparlar.
Yazıcıya gönderilen bilgi bir sayfayı doldurmadığı sürece yazıcıdan hemen çıkış alınmaz. Gönderilen
bilginin miktarına bağlı kalmadan Laser yazıcıdan hemen çıkış almak için EndDoc metodundan
yararlanılır.
Printer.EndDoc
Bu program satırı yukarıda verilen örneğe eklenirse Laser yazıcı hemen yazmaya başlar. Bunun
dışında bazen yazdırma işlemine sayfa başı yapıldıktan sonra başlatılmak istenebilir. Yazıcıya sayfa
başı yaptırmak için NewPage metodundan yararlanılır. Printer nesnesinin bir de Page adında bir
değişkeni bulunmaktadır. Başlangıçta içeriği 1 olan bu değişkenin içeriği NewPage ile yeni bir sayfaya
geçilmesi ile birlikte 1 arttırılır. İstenirse bu değişkenin içeriği çıkış alma işlemi sırasında her sayfanın
başına veya sonuna yazdırılabilir.
Printer.Print Printer.Page
Print deyimi ile Printer nesnesine bilgi gönderirken aynen Formlara bilgi yazılırken gibi her Print
deyimi ile yazma işlemine yeni bir satırdan başlanır. Eğer aynı satıra birden fazla değişkenin içeriği
veya sabit bilgi yazılmak isteniyorsa, ya aynı Print deyimi ile birden fazla değişkenin içeriği yazılır ya
da Print deyiminin satır başı yapması önlenilir. Print deyiminin satır başı yapmasını önlemek için
virgül (;) karekterinden yararlanılır.
Private Sub form_Click()
Ad = “Hasan”
Soyad = “DURGUT”
Printer.FontName = “Arial”
Printer.FontSize = 20
Printer.Print
Printer.Print Ad, Soyad
Printer.Print Ad; Soyad
Printer.Print Ad
Printer.Print Soyad
Printer.EndDoc
End Sub
571
Print deyimi ile bir seferde birden fazla değişkenin içeriği yazıcıya gönderilirken, değişkenin
adlarının aralarına virgül(,) veya noktalı virgül (;) konulabilir. Ancak değişkenler birbirinden virgül ile
ayrıldıklarında yazıcıdan alınan çıkışta değişken içeriklerinin arasında boşluklar oluşur. Aynı durum
Print deyimi ile ekrana bilgi yazarken de geçerlidir (Şekil 9.l-1).
Private Sub Click_Load()
Ad = "Hasan"
Soyad = "DURGUT"
FontName = "Arial"
FontSize = 20
Print Ad; Soyad
Print Ad, Soyad
End Sub
Şekil 9.l-1
Satır genişliği Twip cinsinde printer nesnesine ait Width adlı değişkende saklanır. Programcı
çalışma anında kullanılan bilgisayardaki yazıcıya bağlı olarak Width değişkeninin içeriğine bakar ve
ona göre davranır. Printer nesnesine ait Width değişkeninin içeriği Visual Basic projeleri dahilinde
değiştirilemez.
Width özelliğinin içeriği seçili durumda olan yazıcının markasına, modeline ve seçilen kağıdın
boyutlarına göre değişmektedir. Yazıcılar penceresinde Dosya menüsündeki Özellikler komutu
verilince, seçili durumdaki yazıcının özelliklerinin listelendiği bir diyalog kutusu ekrana gelmektedir.
Bu diyalog kutusunda yazıcı ile ilgili her türlü ayarlama ve seçim yapılabilir.
572
Şekil 9.l-2
Printer nesnesine ait Width değişkenin içeriği bu diyalog kutusunda seçili olan kağıt genişliğine
bağlıdır.
a. Örnek / Yazıcı Test
Option Explicit
Private Sub Form_Load()
Width = Screen.Width * 0.8
Height = Screen.Height * 0.8
Move (Screen.Width - Width) \ 2, (Screen.Height - Height)
\ 2
End Sub
Private Sub Form_Resize()
TxtText.Move 0, 0, ScaleWidth, ScaleHeight
End Sub
573
Private Sub mnuExit_Click()
Unload Me
End Sub
Private Sub mnuPrint_Click()
Dim wrdwrp As New CWordWrap
Dim Buff As String
Then
If MsgBox("Print text?", vbYesNo Or vbQuestion) = vbYes
Printer.Print " ";
Printer.Font.Name = "Times New Roman"
Printer.Font.Size = 10
wrdwrp.HeaderText = "Word-Wrap Demo"
If txtText.SelLength > 0 Then
Buff = txtText.SelText
Else
Buff = txtText
End If
wrdwrp.PrintText Buff
End If
End Sub
Class Modules
Option Explicit
Private Const MARGIN_LEFT = 720
Private Const MARGIN_RIGHT = 720
Private Const MARGIN_TOP = 1440
Private Const MARGIN_BOTTOM = 1440
Private m_HeaderText As String
Private m_MarginLeft As Single
Private m_MarginTop As Single
Private m_MarginRight As Single
Private m_MarginBottom As Single
Public Property Let HeaderText(sText As String)
m_HeaderText = sText
End Property
Public Property Get HeaderText() As String
HeaderText = m_HeaderText
End Property
Public Property Let MarginLeft(nMargin As Single)
m_MarginLeft = nMargin
End Property
Public Property Get MarginLeft() As Single
MarginLeft = m_MarginLeft
End Property
574
Public Property Let MarginTop(nMargin As Single)
m_MarginTop = nMargin
End Property
Public Property Get MarginTop() As Single
MarginTop = m_MarginTop
End Property
Public Property Let MarginRight(nMargin As Single)
m_MarginRight = nMargin
End Property
Public Property Get MarginRight() As Single
MarginRight = m_MarginRight
End Property
Public Property Let MarginBottom(nMargin As Single)
m_MarginBottom = nMargin
End Property
Public Property Get MarginBottom() As Single
MarginBottom = m_MarginBottom
End Property
Public Sub PrintText(sText As String)
Dim i As Integer, j As Integer, sCurrWord As String
Screen.MousePointer = vbHourglass
DoNewPage False
i = 1
Do Until i > Len(sText)
sCurrWord = ""
Do Until i > Len(sText) Or Mid$(sText, i, 1) <= " "
sCurrWord = sCurrWord & Mid$(sText, i, 1)
i = i + 1
Loop
If (Printer.CurrentX + Printer.TextWidth(sCurrWord)) >
(Printer.ScaleWidth - m_MarginRight) Then
Printer.Print
If Printer.CurrentY > (Printer.ScaleHeight m_MarginBottom) Then
DoNewPage
Else
Printer.CurrentX = m_MarginLeft
End If
End If
Printer.Print sCurrWord;
Do Until i > Len(sText) Or Mid$(sText, i, 1) > " "
Select Case Mid$(sText, i, 1)
Case " "
Printer.Print " ";
575
Case Chr$(10)
Printer.Print
If Printer.CurrentY > (Printer.ScaleHeight
- m_MarginBottom) Then
DoNewPage
Else
Printer.CurrentX = m_MarginLeft
End If
Case Chr$(9)
j = (Printer.CurrentX - MARGIN_LEFT) /
Printer.TextWidth("0")
j = j + (10 - (j Mod 10))
Printer.CurrentX = MARGIN_LEFT + (j *
Printer.TextWidth("0"))
Case Else
End Select
i = i + 1
Loop
Loop
Printer.EndDoc
Screen.MousePointer = vbDefault
End Sub
Private Sub Class_Initialize()
m_MarginLeft = MARGIN_LEFT
m_MarginRight = MARGIN_RIGHT
m_MarginTop = MARGIN_TOP
m_MarginBottom = MARGIN_BOTTOM
m_HeaderText = "CWordWrap Class"
End Sub
b. Örnek / Yazdırma
Const satır_uzun = 40
Private Sub Afbreken(wat$, waar%)
Dim lcounter%, deel1$, lteller%
lcounter = 1
Do While lcounter < Len(wat$)
deel1 = Mid$(wat$, lcounter, satır_uzun)
If lcounter + Len(deel1) < Len(wat$) Then
For lteller = Len(deel1) To 1 Step -1
If Mid$(deel1, lteller, 1) = Chr(32) Then
Printer.Print Tab(waar%);
Printer.Print Mid$(wat$, lcounter,
lteller)
lcounter = lcounter + lteller
lteller = 1
576
End If
Next lteller
Else
Printer.Print Tab(waar%);
Printer.Print deel1
lcounter = Len(wat$)
End If
Printer.Print Tab(waar%);
Loop
End Sub
Private Command1_Clıck
Call Afbreken(text1.text,10)
End Sub
c. Örnek / Tab, satır ayarı
Option Explicit
Dim Girinti As Integer
Dim SatırUzun As Integer
Private Sub Command1_Click()
Printer.ScaleMode = vbMillimeters
Printer.Scale (0, 0)-(210, 290)
Call PrintExample
Printer.EndDoc
577
End Sub
Private Sub Form_Load()
Dim Katar As String
Katar = "En güzel anları unutmamak için ?" & vbCrLf
Katar = Katar + "fotoğraf makinası almayı unutmayın."
Text1.Text = Katar
Text2(0).Text = "15"
Text2(1).Text = "20"
End Sub
Private Sub PrintExample()
Girinti = CInt(Text2(0).Text) '15
SatırUzun = CInt(Text2(1).Text) '20
Printer.CurrentX = Girinti
Call CheckLine(Text1.Text)
End Sub
Public Sub Wrap(source As String)
Dim Say As Integer
Dim strPart As String
Dim intTeller As Integer
Say = 1
Do While Say < Len(source)
strPart = Mid$(source, Say, SatırUzun)
If Say + Len(strPart) < Len(source) Then
For intTeller = Len(strPart) To 1 Step -1
If Mid$(strPart, intTeller, 1) = Chr(32) Then
Printer.CurrentX = Girinti
Printer.Print Mid$(source, Say, intTeller)
Say = Say + intTeller
intTeller = 1
End If
Next intTeller
Else
Printer.CurrentX = Girinti
Printer.Print strPart
Say = Len(source)
End If
Printer.CurrentX = Girinti
Loop
End Sub
Public Sub CheckLine(source As String)
578
Dim positie
Dim soldan As Integer
Dim Say As Integer
Dim Katar As String
soldan = Len(source) ' 69
unutmamak için..)
Katar = source
Source(En güzel anları
For Say = 1 To soldan
If Mid$(Katar, Say, 1) = Chr(10) Then
If Len(Mid$(Katar, 1, Say - 2)) > SatırUzun Then
Call Wrap(Mid$(Katar, 1, Say - 2))
Else
Printer.CurrentX = Girinti
Printer.Print Mid$(Katar, 1, Say - 2)
End If
Katar = Right$(Katar, soldan - Say)
Say = 1
soldan = Len(Katar)
End If
Next Say
If Len(Katar) > SatırUzun Then
Call Wrap(Katar)
Else
Printer.CurrentX = Girinti
Printer.Print Katar
End If
End Sub
579