Site hosted by Angelfire.com: Build your free website today!

 

DEĞİŞKEN

 

 

Bilgi bellekte belli bir adresten başlayarak belli bir uzunluğu işgal ederler. Bu bilginin isimlendirilmesine değişken denir. Bilgiye isim verilerek, bilginin bellekteki başlangıç konumu belirlenir. Bilginin tipinin belirlenmesi de bellekteki uzunluğunu belirtir. Değişkenler genelde sayısal ve alfasayısal (string) olarak iki gruba ayrılabilir.

Sayısal Değişkenler: Tamsayı, uzun tamsayı, gerçel tek yoğunluklu, gerçel çift yoğunluklu değişkenlerdir.

Alfasayısal Değişkenler: Alfanumerik (karakter) değişkenlerdir.

1-Tamsayı Değişkenler

Ondalık sayı olmayan, tam sayıları saklayan değişkenlerdir. Bu değişkenlerin alacağı değerler –32.767 ile +32.768 arasında olmalıdır. Tamsayı değişkenleri tanımlamak için, değişken isimlerinin sonuna (%) işareti getirilir. Bu tür değişkenler hafızada 2 byte yer kaplarlar. Bir tamsayı değişkene ondalık bir değer verilirse, değişken bu ondalık sayıyı en yakın tamsayıya yuvarlar.

Örnek Tamsayı Değişken İsimleri

A%, Sayi%, Tamsayi%

X%=1234.567

Print X% 1235

2-Uzun Tamsayı Değişkenler

Tamsayı değişkenlere benzer ama tamsayı değişkenlerden çok daha yüksek sayıları depolayabilirler. –2.147.483.648 ile +2.147.483.647 arası sayılar depolayabilirler ve hafızada 4 byte yer kaplarlar. Uzun tamsayı değişkenleri belirleyen özel simge ampersand (&) işaretidir.

Örnek Uzun Tamsayı Değişken İsimleri

A&, Sayi&, UzunTamsayi&

X&=1234.567

Print X& 1235

3-Gerçel Tek Yoğunluklu Değişkenler

Bu tür değişkenler içerisinde ondalıklı sayı saklayan değişkenlerdir. Tam kısım ve ondalık kısım olmak üzere toplam 7 haneye kadar ekranda görüntüler. Bellekte 4 byte yer kaplar. Gerçel tek yoğunluklu değişkenlerin sonuna ünlem (!) işareti getirilir.

Örnek Gerçel Tek Yoğunluklu Değişken İsimleri

A!, Sayi!, KisaGercelsayi!

X!=123.123456789

Print X! 123.1235

4-Gerçel Çift Yoğunluklu Değişkenler

Genel olarak tek yoğunluklu değişkenlere benzerler. Fakat tam kısım ve ondalık kısım olmak üzere toplam 16 haneye kadar ekranda görüntüler. Bellekte 8 byte yer kaplar. Gerçel tek yoğunluklu değişkenlerin sonuna numara (#) işareti getirilir.

Örnek Gerçel Çift Yoğunluklu Değişken İsimleri

A#, Sayi#, UzunGercelsayi#

X#=123.12345678912345

Print X# 123.1234567891234

5-Alfasayısal (String) Değişkenler

String değişkenlere A-Z arasındaki harfleri, 0-9 arasındaki sayıları, özel işaretleri, kısaca bilgisayarda kullanılan her tür karakteri depolayabiliriz. String değişkenleri belirlemek için, değişken isminin sonuna dolar ($) işareti koyarız. Bunlar hafızada uzunluklarına göre yer kaplarlar.

Örnek String Değişken İsimleri

Ad$

Soyad$

Adres$

Ders$=”Bilgisayar”

Print Ders$ Bilgisayar

Örnek Basic Programı

Cls

Input ”Adınızı giriniz :”;Ad$

Input ”Soyadınızı giriniz :”;Soyad$

Input ”Okul numaranız:”;No%

Print Ad$; Soyad$; No%

End

 

Not

Bir değişkenin sonuna hiçbir işaret koymadığımızda, o değişken gerçel ve tek yoğunluklu olarak tanımlanmaktadır.. Eğer bu değişkene string ifade atanırsa da hata mesajı verir.

 

 

GİRİŞ / ÇIKIŞ KOMUTLARI

 

Print

Ekrana bilgi yazdırmayı sağlayan bir komuttur. Print komutuyla kullanılan iki ayıraç vardır. (,) ayıracı ekranı 16 karakterlik beş sütuna ayırır ve her ifadeyi bu sütunların başında itibaren görüntüler. (;) ise ifadeleri birbirine bitişik yan yana yazdırmak için kullanılır.

Print ”Bilgisayar”

Print ”Sonuç=”;A

Print A%

Print A; ”ile”; B; ”nin toplamı ; ”; A+B; ”dir”

Bu örnekte, ifadelerin aralarına noktalı virgül (;) konmazsa, alt satıra geçildiği an bu işareti bilgisayar otomatik olarak koyar.

Input

Bu komut klavyeden girilen veriyi okuyarak, bu verinin belirlenen bir değişkene aktarılmasını sağlar.

Input ”Bir sayı giriniz : ”;x Bir sayı giriniz : ? _

Input ”Bir sayı giriniz : ”,x Bir sayı giriniz : _

Print ”Bir sayı giriniz : ”; Bir sayı giriniz : ? _

Input x

Print ”Bir sayı giriniz : ” Bir sayı giriniz :

Input x ? _

Input ”İki sayı giriniz : ”;x,y İki sayı giriniz : ? _ (sayılar arasına virgül konur)

Input ”İki sayı giriniz : ”,x,y İki sayı giriniz : _

 

 

SORGU KOMUTLARI

 

If Then

Bazı ifadelerin yerine getirilmesinin belirli şartlara bağlı olduğu durumlarda kullanılan bir komuttur. If Then ifadesinden sonra tek komut kullanılacaksa yan tarafına yazılır. Birçok komut varsa alta yazılır ve End If ile bloklanır.

If a>b Then Print ”a sayısı b den büyük”

If Then Else

Şartın yanlış olduğu durumda ise Else kullanılarak başka ifade işleme alınır. End If ile Sonlandırılmalıdır.

If a>b Then

Print ”a sayısı b den büyük”

Else Print ”b sayısı a dan büyük”

End If

ElseIf

Else ve If deyimlerinin bir bileşkesi gibi çalışır.

If a=1 Then

Print ”a sayısı 1”

ElseIf a=2 Then

Print ”a sayısı 2”

ElseIf a=3 Then

Print ”a sayısı 3”

EndIf

End

 

 

DÖNGÜ KOMUTLARI

 

For Next

Eğer ifadeler birden fazla işlem görecekse başlangıç ve bitiş değerleri verilerek bu komutla döngüye sokulur. Next satırı ise döngün bitiş noktasını belirler. Step yardımcı komutu kullanılarak döngü değişkeninin artış değeri değiştirilebilir. Step kullanılmazsa artış birer birer yapılır.

For i=1 To 10

Print ”Döngü sayısı:”;i

Next i

For i=1 To 10 Step 3, Şeklinde olursa döngü değişkeni üçer üçer artar. 1,4,7,10 gibi.

For i=10 To 1 Step –1 Şeklinde olursa döngü değişkeni birer birer azalır. 10, 9, 8, 7 gibi.

While Wend

For Next döngüsüne çok benzemektedir. For next satırları arasındaki ifadeler belli sayıda işletilir. Bunda ise aradaki ifadeler, şartın geçerli olduğu sürece işletilir. Döngü sayısının belli olmadığı durumlarda kullanılır.

While I<10 2 4 6 8 10

I=I+2

Print I;

Wend

Do/Loop

Yapı itibariyle While Wend döngüsüne çok benzemektedir. Daha hızlıdır ve döngüden önce yada sonra olmak üzere daha geniş şart belirlemeleri yapılır. İstenildiği an döngüden çıkılır.

Do While I<10 Do

I=I+2 I=I+2

Print I; Print I;

Loop Loop While I<10

 

Aşağıdaki programlar aynı işlemi yapar, bir tuşa basıldığında döngüden çıkar.

Do Do

Print a Print a

a=a+1 a=a+1

If Inkey$ <> ” ” Then Exit Do Loop While Inkey$ = ” ”

Loop

 

 

STANDART KOMUTLAR

 

Cls

Ekranı temizleme komutudur. Program içerisinde istenilen yerde ve sayıda kullanılabilir.

Rem

Remark deyiminden gelen bu komut açıklama komutudur. Program Rem satırını işleme almaz. Programın anlaşılmayan yanlarına açıklama yazmak için kullanılır. Rem yerine (’) işareti de kullanılır.

Rem Bu bir açıklama deyimidir.

Labels/Goto

Bir işlemi birden fazla tekrarlayabilmek için yada program akışını belirlenen yere göndermek için kullanılır. Program akışı Goto komutundan sonra belirtilen Label üzerine gönderilir. Program yazılırken satır numarası verilmişse istenilen satıra gönderilebilir.

Tekrar:

Input ”Bir sayı giriniz:”;A

IF a=0 Then Goto Tekrar

 

EKRAN DÜZENLEME FONKSİYONLARI

 

Tab( )

Print komutuyla birlikte kullanılır ve ekranı daha etkin kullanmayı sağlar. Kursörü, Tab fonksiyonunda belirtilen sayıdaki sütuna götürür. Text ekranın sütun sayısı 80’ dır.

Print Tab(10); ”y” | y

Print ”x”; Tab(10); ”y” |x y

Spc( )

Tab komutundan farkı, yazılan string ifadeden sonra belirtilen sayı değeri kadar boşluk bırakır. Aynı örneği verelim.

Print Spc(10); ”y” | y

Print ”x”; Spc(10); ”y” |x y (x’den sonra 10 boşluk koydu)

 

Locate

İmleci (cursor) belirtilen satır ve sütun koordinatlarına gönderir. Locate komutuyla aynı satırda başka bir komut kullanılacaksa (:) ile sonlandırılır. Locate komutundaki üçüncü parametrede vardır. 0 imleci gizler, 1 imleci bulunduğu yerde gösterir.

Locate 10,5: Print”Deneme” 10.satır ve 5.sütuna Deneme yazar

Locate 10,5,0

a$=Input$(1) Bir tuşun okunması için bekler ve imleç gizlidir.

 

 

DİZİ

 

Birden çok değer alabilen ve gerektiğinde bu değerlerin tamamına ulaşabilen değişkenlere dizi denir. Dizi değişkenin alacığı tüm değerler aynı türden olması gereklidir.

Diziler, tek boyutlu indisli değişkenler diye de adlandırılır. Değişken tek indise sahiptir.

X(i) i=1,2 .. N X değişkeni N boyutunda bir dizidir ve N tane farklı değer alabilir.

For I = 1 To 10Print "X[" ; I ; "]=";Input X(I)Next I

 

 

MATRİS

 

İki boyutlu dizilere matris denir. Ayrıca iki boyutlu indisli değişkenlerde denilmektedir.

X(i,j) i=1,2 .. N j=1,2 .. M X değişkeni N*M boyutunda bir matristir.

For I = 1 To 10For J = 1 To 10

Print "X[" ; I ; J ; "]=";Input X(I,J)

Next JNext I

Dim

Dizi tanımlanırken, o dizinin eleman sayısı Dim komutuyla belirtilir. Dolayısıyla belleğin gereksiz kullanımı da önlenmiş olur. Virgülle ayrılarak bir çok dizi yan yana tanımlanabilir.

Dim X(20),Y%(30) X dizisi 20, Y dizisi 30 elemanlıdır.

Dim Ay$(12) Her ay için hafızada bir yer açılır.

Dim Isim$(10) Hafızada 10 isimlik yer açılır.

Dim A(2,3) A değişkeni 2*3=6 elemanlıdır ve hafızada 6 adet yer açılır.

 

 

MANTIKSAL OPERATÖRLER

 

Not

Bir şartın tersini sağlar. İstediğimiz şartın tam tersi gerçekleşince, ilgili komutun işlev görmesini sağlar.

If Not a=10 Then Print”a sayısı 10 değildir.”

Or

Belirtilen şartlardan herhangi birisinin gerçekleşmesi halinde belirtilen ifadeler işleme alınır.

While a>15 Or a<10

IF a>15 Or a<10 Then

And

Belirtilen şartlardan hepsinin gerçekleşmesi halinde belirtilen ifadeler işleme alınır.

While a>15 And c=0

Xor

Belirtilen şartlardan birinin gerçekleşmemesi durumunda geçerlidir. İki şart doğru ise yada her iki şart yanlış ise, Xor operatörü yanlış sonuç üretir.

A=10 B=20

If A=10 Xor B=10 Then

Print”sonuç doğrudur”

End If

 

RENK KONTROLÜ

 

0 Siyah 8 Gri

1 Mavi 9 Açık Mavi

2 Yeşil 10 Açık Yeşil

3 Açık Mavi(cyan) 11 Açık Morumsu Mavi

4 Kırmızı 12 Açık Kırmızı

5 Mor(Eflatun) 13 Açık Metalik Kırmızı

6 Kahverengi 14 Sarı

7 Beyaz 15 Parlak Beyaz

Color

Yazı ve zemin rengini değiştirmek için kullanılır.

Color 1 Yazı mavi

Color 1,7 Yazı mavi, yazı zemini beyaz

Gosub/Return

Gosub komutu, programın akışını belirtilen başka bir yere dallandırır. Return komutu ise program akışının gosub komutunun hemen altına dönmesini sağlar. Gobus yerine goto komutu kullanılırsa geri dönüş olmayacaktır.

Cls

Gosub deneme:

z = x + y

Print "sonuç="; z

End

deneme:

Input "1.sayı:"; x

Input "2.sayı:"; y

Return

Const

Programda kullanılacak sabitler tanımlanır. Bu komutla belirtilen sabitlere programın herhangi bir yerinde müdahale edilemez.

Const Pi=3,14, a=10

Str$

Sayısal bir değeri string ifadeye çevirir.

a$=Str(10)

Print a$ 10

Val

String ifadenin sayısal değerini bulur. String ifadenin sayısal bir değer olması gereklidir. 4V5 gibi bir string ifade girilirse sadece 4’ ü kabul eder.

a$=”10”

Print Var(a$) 10

Print Var(”10”) 10

On Goto

Belirtilen ifadenin aldığı değere göre farklı etiketlere dallanmayı sağlar. Geri dönüş yoktur, yani dallanmadan sonra komutlara göre program icra olur. Aşağıdaki örnekte program, klavyeden girilen sayı 1 ise toplama, 2 ise çıkarma, 3 ise bölme, 4 ise çarpma etiketlerine dallanır.

Secim$ = Input$(1)

a=Val(Secim$)

On a Goto toplama, cikarma, bolme, carpma

Select Case

Birden fazla seçeneğin kontrol edildiği bir yapıdır. Case bloklarının ve bloklarda kullanılan komut sayısının sınırı yoktur. Case satırlarından biri işletilmezse Case Else ile başka komutlar icra edilebilir. Case Else kullanılmasa da olur. Bu yapının bir End Select deyimiyle bitmesi gereklidir.

Cls

Tekrar:

Input ”Bir sayı giriniz:”;a

Select Case a Rem Select Case Tus$ Select Case Kelime$

Case 1 Rem Case ”1” Case ”bir”

Print ”1 tuşuna basıldı”

Case 2

Print ”2 tuşuna basıldı”

Case 3, 4, 5

Print ”3, 4, 5 tuşlarından birine basıldı”

Case 5 to 10

Print ”5 ile 10 arasında bir tuşa basıldı”

Case Else

Print ”1 ile 10 arası bir tuşa basınız.”

Goto Tekrar

End Select

End

 

 

GRAFİK

 

Screen

Ekran çözünürlüğünü değiştirerek gerekli olan ortamı ayarlar. Ekranın pixel sayısını, renk kalitesini ve görüntü adaptörünü belirler. Screen komutuyla grafik ekrana geçiş yapılmalıdır.

Screen 7 (320*200 – 16 renk – EGA,VGA)

Screen 12 (640*480 – 256 renk - VGA)

Circle

Genelde çember çizmek için kullanılır. Kullanılmayacak parametrelerin yeri boş bırakılır. (, , )

Circle(x,y),Yarıçap

Circle(x,y),Yarıçap, Çizgi rengi

Circle(x,y),Yarıçap, Çizgi rengi, Yay başlangıcı, Yay bitişi

Circle(100,100), 50, 4, 0, 3.14

Pset

Ekranın herhangi bir yerine pixel koymak için kullanılır.

Pset(x,y)

Pset(x,y), Çizgi rengi

Pset step(a,b) (Aktif noktadan a ve b kadar uzaklığa pixel koyar.)

Line

Belirtilen noktalar arasına düz bir doğru çizer.

Line(x1,y1)-(x2,y2)

Line(x1,y1)-(x2,y2), Çizgi rengi

Line(x1,y1)-(x2,y2), Çizgi rengi, b/bf (b kutu çizer, bf kutu içini doldurur.)

Paint

Belirtilen yeri kapalı bir alanla karşılaşıncaya kadar boyar. Belirtilen renkle karşılaşacağı renk aynı olmalıdır.

Circle(x,y),50,4

Paint(x,y),4 (çemberin içini kırmızı ile doldurur.)

Paint(x,y),1,4 (çizgi rengi kırmızı dolgu rengi mavidir.)

Paint(x,y),”a”,4 (çizgi rengi kırmız dolgu deseni ”a” stringine karşı gelen desen.

 

 

        Yüksek seviyeli diller kolay anlaşılır, kolay yazılabilir ve her bilgisayarda uygulanabilir. Düşük seviyeli dillerde ise bu kolaylıklar ortadan kalkmakta ve hız artmaktadır. Hızın önemli olduğu yerlerde hep düşük seviyeli diller tercih edilmiştir. C Programlama Dilinin diğer dillerden farkı ise bu iki grubun içine girmesidir.

        C dili 1970’li yılların başında Dennis M.Ritchie tarafından ortaya çıkmıştır. Dilin C olarak adlandırılmasını nedeni B dili üzerine bir yapı oluşturmasıdır.

        Çoğu işletim sistemi Assembler ile yazıldığı için makineye büyük ölçüde bağımlıdır. C’ de yazılan programlar Assembler’ e göre daha kısa zamanda yazılabilir, daha anlaşılır ve hatta daha hızlıdır. 1980’ dan sonra C’ ye doğru büyük bir eğilim vardır. C’ nin bir önemli özelliği de ifadelerden tasarruf sağlamasıdır. Matematiksel ifadeler C’ nin zengin operatörleri vasıtasıyla çok daha kısa ve basit bir biçime getirilebilir. Böylece klavye başında daha az zaman harcanılır.

 

DEĞİŞKEN

 

 

 

        Bilgi bellekte belli bir adresten başlayarak belli bir uzunluğu işgal ederler. Bu bilginin isimlendirilmesine değişken denir. Bir bilgiye isim vermek, bilginin bellekteki başlangıç konumunu belirler. Bilginin tipinin belirlenmesi de bellekteki uzunluğunu belirtir.  

 

DATA ( BİLGİ ) TİPLERİ

 

 

 

 

TİPİ

TANIMI

BELLEKTEKİ YERİ

 

unsigned char

 

İşaretsiz Karakter

 

1 Bayt

char

Karakter

1 Bayt

unsigned int

İşaretsiz Tamsayı

2 Bayt

int

Tamsayı

2 Bayt

unsigned long

İşaretsiz Uzun Tamsayı

4 Bayt

long

Uzun Tamsayı

4 Bayt

float

Gerçelsayı

4 Bayt

double

Uzun Gerçelsayı

8 Bayt

long double

Çok Uzun Gerçelsayı

10 Bayt

string

Karakter Dizisi

n Bayt

 

ARİTMETİK İFADELER

 

 

 

a=a+1

a++           ++a

a=a-1

a- -             - -a

a=a+b

a+=b

a=a-b

a-=b

a=a*b

a*=b

a=a/b

a/=b

a=a%b

a%=b

 

MANTIKSAL OPERATÖRLER

 

 

 

&&

And

| |

Or

!

Nor

 

NOT

 

 

 

        C programlama dilinde büyük küçük harf duyarlılığı vardır. Komutlar küçük harf ile yazılır. Programda açıklama satırları // ve /*     */ karakterleriyle belirtilir. // karakteri, tek satırı işleme almaz. /*       */ karakterleri arasındaki ifadeler işlemealınmaz.

 

GİRİŞ / ÇIKIŞ KOMUTLARI

 

printf

 

 

 

        Bir değişken veya işlemin değerini ekrana yazmak için kullanılan bir çıkış komutudur. Yazılım formatı şu şekildedir. printf( Format Stringi , Değer Listesi);

 

printf( "\n Ortalama: %d " , c );

 

\n             : Escape düzeni karakter. Kursör bir satır alta geçer.

Ortalama : Açıklama kısmı. Ekrana doğrudan basılır.

%d                      : Çıkış formatı. Ekrana basılacak değişkenin tipini belirtir.

c                          : Ekrana basılacak değişken.

 

        Programın yazılmasında bazı tuşlar yada olaylar (enter, tab, beep sesi gibi) klavyeden yazılamazlar. Bunların dolaylı yoldan ifade edilmesi gerekir. Bunların gerçekleşmesi için yapılan tanımlamalara Escape Düzeni karakterler denir. Bu karakterler printf komutu içerisinde istenildiği yerde kullanılabilir.

printf("\n Deneme Yazısı\n");

 

printf("a ve b nin toplamı : %d", c);                                                              a ve b nin toplamı : c

printf("a+b=%d  ve  a-b=%d",x,y);                                       a+b=x  ve  a-b=y

printf("Bilgisayar");                                                                                      Bilgisayar

printf("x = %d ,10");                                                                                     x=10 

 

Escape Düzeni Karakterler

 

 

 

\ n

Kursörü alt satırın başına getirir

\ r

Kursörü satırın başına getirir

\ b

Kursörü bir kolon geri çeker

\ t

Kursörü bir tab ileri alır

\ a

Zil sesi verir

 

% Kodları ( Format Kont. Kodları)

 

 

 

%d

Tamsayı

%f

Gerçel sayı

%c

Tam karakter

%s

String

%ld

Uzun tamsayı

%lf

Uzun gerçel sayı

 

scanf

 

 

 

        Klavyeden girilen değerleri değişkenlere aktararak bellekte saklanmalarını sağlar. Klavyeden giriş yapılması için programı geçici olarak durdurur. Formatı şu şekildedir. scanf(Format Stringi , Adres Listesi);

 

scanf("%d" , &a);

 

&, adres operatörüdür. Hafızada, değişken adreslerinin saptaması için kullanılır. Bu işlem Turbo C derleyicisi tarafından yapılır.

&a adresindeki iki baytlık bölgeye, %d ile tipi belirtilen tamsayı  atanacaktır.

scanf("%d,%d" ,&a,&b);                                           İki değişken arasına virgül konularak giriş yapılır.

scanf("%d  %d" ,&a,&b);                                          İki değişken arasına boşluk konularak giriş yapılır.

scanf("%d%d" ,&a,&b);                                            İki değişken arasına boşluk konularak giriş yapılır.

scanf("%d ve %d" ,&a,&b);                                      İki değişken arasına " ve " konularak giriş yapılır.

scanf("%s,%s" ,Ad,Soyad);                                       İki değişken arasına virgül konularak giriş yapılır. 

String ifadede, değişken önünde & adres operatörü kullanılma zorunluluğu yoktur. 

 

KONTROL KOMUTLARI

 

if

 

 

 

        Bazı ifadelerin yerine getirilmesinin belirli şartlara bağlı olduğu durumlarda kullanılan bir komuttur.

if (şart)  ifade;

 if (a=b) printf("a sayısı b ye eşit"); 

 

if / else

 

 

 

        Şartın yanlış olduğu durumda ise else kullanılarak başka ifade işleme alınır.

if(şart)  ifade 1;

else       ifade 2; 

if (a=b)  printf("a sayısı b ye eşit");

else        printf("eşitlik sağlanamadı"); 

 

if / else / if

 

 

 

        Şartın yanlış olduğu durumda başka bir şart söz konusu ise bu yapı kullanılır.

if(şart)  ifade 1;

else If(şart)      ifade 2;

else                  ifade 3;

if         (a!=0 && b==0)  printf("sonuç sonsuzdur  sayı/0");

else if (a==0 && b==0)  printf("sonuç belirsizdir  0/0");

else     printf("sonuç =%f",a/b);

 

switch

 

 

 

        Bu komut ile yapılan kontrolda seçenek durumuna göre program dallanır. case’e ait ifade yada ifade bloğu icra görür.

ch=getch( );

switch(ch);

{ case  ’1’: printf("1’e basıldı");   break;                    (break’ dan sonra blok dışına sıçrar)

   case  ’2’: printf("2’ye basıldı"); break;

 

 

DÖNGÜ KOMUTLLARI

 

do / while

 

 

 

        Eğer ifade birden fazla işlem görecekse ve kontrol, işlem gören ifadelerden elde edilecekse bu yapı kullanılır.

do

      ifade;

while (şart);

do

  { x++:

     printf("x değeri : %d",x);

   }

while (x<=10);

 

while

 

 

 

        do/while döngüsünden farklı olarak sadece döngü başında kullanılır. Bu nedenle döngü içine girmeden şart kontrolü yapılır.

while (şart)  ifade;

while (x!=100)

    { x++;

       printf("\a");

     }    

İkisi arasındaki fark ise birisi işlemden sonra şartı kontrol ediyor, diğeri ise şartı kontrol ettikten sora işlemi yapıyor.

 

for

 

 

 

        Döngülerin en yaygın kullanılanıdır. Diğer döngülerden pek farkı yoktur. Bu döngünün yapısında başlangıç değeri, şartın sağlanacağı değer ve artım değeri vardır.

for (başlangıç; şart; artım)       ifade;  

Eğer ifade birden fazla ise ifadeler { } içerisine yazılmalıdır. <![endif]>

for (x=0; x<=10; x++)    printf("\n %d",x);

 

DİZİLER

 

 

 

        Bir çok değer alabilen ve istenildiğinde bu değerlerin tamamına ulaşabilen değişkenlere dizi denir. Dizi elemanlarının tüm değerleri aynı türden olması gereklidir (int x[i], float x[j] gibi).

int  x[10];         x0  x1  ...  x9                tek boyutlu dizi (10 elemanlı)

int  x[3][10];    x0,0 x0,1  ...  x0,9            çift boyutlu dizi (30 elemanlı)

                         x1,0 x1,1  .... x1,9

                         x2,0 x2,1  .....x2,9              

main( )           

{ int i, x[10];

   for(i=1;i<=10;i++)

     { printf("%d. sayı=",i);

        scanf("%d",&x[i]);

      }

  }

 

getch ( )

 

 

 

        Klavyeden basılan bir karakteri belirtilen değişkene atar. Yalın kullanıldığında, klavyeden bir tuşa basıncaya kadar programı bekletir.

 

putch ( )

 

 

 

        Belirtilen karakteri ekrana basar. Tek karakter tek tırnak (’ ’) içine yazılır.

 

gets ( )

 

 

 

        scanf komutuna benzer. Sadece girilen string ifadeyi değişkene atar.

 

puts ( )

 

 

 

        printf komutuna benzer. Sadece belirtilen string ifadeyi ekrana basar. String ifadeler çift tırnak (" ") içine yazılırlar.

 

#define

 

 

 

        Sabitlerin tanımlandığı komut satırıdır. Programın en üstünde yer alır.

#define Pi 3.1415

#define Şifre 1234

#define topla(a,b) (a+b)

main( )

{int c;

 clrscr( );

 printf("%d",topla(5,7));

 getch( );

}

 

 

 

BASLARKEN

 

 

 

        Butun Turbo Pascal programlari bir program adiyla baslamak zorundadir.  Oncelikle ‘program’ yazar; bir bosluk birakir ve programinizin adinin ne olmasini istiyorsaniz bosluktan sonra da onu yazarsiniz.
        Turbo Pascal’in ayrilmis sozcukleri vardir. Bu sozcukler, programlama dilinde bir komut bildirir ve amaci disinda kullanilamazlar. Dolayisiyla siz de program adinizi bu ayrilmis sozcuklerin disinda bir sey olarak atamalisiniz.
        Mesela ‘program’ kelimesi bir ayrilmis sozcuktur ve programiniza bir isim atamaya yarar. Ayrica yazdiginiz programin calistirilabilir oldugunu da belirtir.
Daha sonra baska bir ayrilmis sozcuk olan ‘begin’ ifadesini bir satirda tek basina kullanirsiniz; ki bu da Turbo Pascal’a komutlari nereden itibaren calistirmaya baslayacagini belirtir. Programiniz ‘end.’ ifadesiyle son bulur.

                                program Ornek;

                                 begin
                                      ...;
                                      ...;
                                      ...;
                                 end.

 

write ve writeln

 

 

 

        Write ve writeln komutlari, Turbo Pascal’daki en temel komutlardir. Amaclari, ciktiyi   ekrana basmaktir. ‘Wirteln’ komutunun uygulamasi cok basittir. Sadece komutu yazin ve parantez icerisine -ayrica tek tirnak icinde olmak uzere- yazdirmak istediginiz seyleri yazin.

 
                     writeln('Merhaba, ');
                     writeln('guzel insanlar');

ciktiyi su sekilde verecektir;

 

        Merhaba,
        guzel insanlar.
        
        write(‘Merhaba,’);
        write(‘guzel insanlar.’);

 

ciktiyi su sekilde verecektir;

        Merhaba, guzel insanlar.

 

Readln

 

 

 

        Yazdigimiz programi kullanan bir kullanici klavyeden bir veri giriyorsa ve biz bu veriyi readln ifadesiyle okutuyorsak, Turbo Pascal bu veriyi tutabilmek icin bir degisken kullanir. Bu degiskenin ismini ve tipini ise programci yani siz belirliyorsunuz.
        Readln ifadesinin yapisi basittir. Hangi degiskenin girilen veriyi tutmasin istiyorsaniz o degiskeni readln ifadesinden hemen sonra parantez icinde yazarsiniz. Degiskenimiz girilen veriyi icine alir ve baska bir verinin kendisine atanmasina kadar muhafaza eder. Mesela kullanicinin yasini girmesini istiyoruz ve onu  yas adli bir degiskende tutacagiz. Sonuc olarak soyle bir ifadeyle amacimiza ulasabiliriz:

        readln(yas);

Tabii ki yas degiskeni programin baslangicindan once tanitilmis olmaliydi.

 

Libraries

 

 

 

        Kutuphaneler Turbo Pascal komutlarinin uzantilaridirlar.  kutuphaneler ‘uses’ ifadesinin ardindan yazilarak programa ilave edilirler. Bu ‘uses’ ifadesi, ‘program’ ifadesiyle programimiza yaptigimiz isim atamasinin ardindan kullanilir. Eger programimizi baslatmadan once ekrani temizlemek istiyorsak kullanmamiz gereken ‘clrscr’ (clear screen) komutu ‘crt’ kutuphanesinin icindedir. Ve,

        uses crt;

seklinde bu kutuphaneyi programimiza eklersek, ekrani silebilecegimiz bir komut elde etmis oluruz.

 

Degiskenler

 

 

 

        Matematik biliminde bir degisken, sabit olmayan bir numerik degerin yerini tutan bir karakterdir(rakamsal degeri degisebilen bir harf). Turbo Pascal’da da bu olay temelde aynidir. Bir degeri, bir degiskenin icerisine -benim genelde ‘esit hale getir isareti’ adini verdigim bir isaretle atarsiniz. Bu isaret basit olarak ‘iki nokta ust ustenin yanina gelmis bir esittir’dir, yani ‘:=’. Farz edelim ki sayi adini verdigim bir degiskenim var ve ben bunun icine ‘2’ degerini atadim. Demek ki artik sayi degiskenim 2 degerini belirtmeye baslamistir.
Ornek olarak asagidaki isaretler ve verdikleri sonuclari inceleyiniz.

Ifadeler:

        sayi := 2;
        writeln(‘SAYI: ‘,sayi);
Ekran ciktisi:
 
        SAYI: 2

 

veya

        sayi := 2+1;
        writeln(‘SAYI: ‘,sayi);

Ekran ciktisini bu sefer oncekinden farkli olarak:

        SAYI: 3

seklinde gozukecektir.

Bir kac farkli degisken tipi vardir. Bunlar; Integer, Real, String, Char ve Boolean’ dir.

        Integer degisken tipi tam sayilar sisteminin bir parcasini belirtir. Tam sayi derken ondalik kismi olmayan bir sayiyi kastettigimizi vurgulamis olalim. Fakat bu integer tipimiz ancak 32,767 den buyuk ve -32,767 den kucuk sayilari tutamaz. Ornek olarak;

        -32767...-3,-2,-1,0,2,3...32767

       Real degisken tipi ondalik kismi bulunan herhangi bir gercel sayiyi tutabilir. Bu 10.0 gibi sayilari da kapsar. 10.0 sayisinin degeri 10 ile ayni olmasina ragmen ondalik kismindan dolayi real degisken tipindedir. Gercel sayilar ekranda bilimsel bicimde gosterilirler. Bu ise simdi karisik gelebileceginden ilerideki konulara birakiyoruz. Real tipine ornek:

        1.23498 , 3.543 , -9.0 , 987.765

        String degisken tipleri kelime degeri olan degiskenlerdir. Bu tipin degiskenleri, herhangi bir karakter dizisini ve sayilari da iceren herhangi bir degeri tutabilir. Fakat onemli olan nokta su ki; bir string degisken herhangi bir sayi degerini tutuyor da olsa sadece bir grup karakter ifade eder ve kesinlikle real veya integer tipi degiskeni gibi degerlendirilmemelidir. Sunu da hatirdan cikarmayalim: Herhangi bir string degiskenine deger atamasi yapilirken atanan deger tek tirnak (‘) arasina konulur. Ornek:

        kelime := 'Merhaba';

        Char degisken tipi bildigimiz karakterleri  tutar. Fakat Turbo Pascal bu kelimeyi char adiyla kisaltmistir. Bu degisken tipleri tamamiyla string tipi gibi dusunulebilir. Fakat tek fark, char tipi tek karakter uzunlugunda bir karakter olabildigi gibi ASCII karakter tablosundaki herhangi bir karakter de olabilir. String’ler gibi sayi degerleri tutabilirler ama yine onlar gibi bu sayi degerleriyle islem yapamazlar. Ornek:

        'a' , 'A' , '3' , '!' , '&' , '{' , '+' , vb.

       Boolean degiskenleri sadece iki deger alabilir. TRUE (dogru) ve FALSE (yanlis). Bunlar kullanisli birer isaretcidirler (flag) ve karsilastirma amacli kullanilirlar. Fakat su anda bunlari cok sik kullanmayacagimiz icin haklarinda fazla bir bilgiye ihtiyacimiz yok. Dolayisiyla, sonra incelemek uzere bunlari atliyoruz.
        Su ana kadar ogrene geldigimiz degisken tipleri icinde, en cok kullanacaklarimiz: Integer, Real ve String tipleridir. Su anda hangi tur degisken tiplerinin Turbo Pascal’da kullanildigini biliyoruz ve onlari derleyiciye nasil tanitacagimizi da gorecegiz. Sunu hic akildan cikarmayalim ki; bir degiskeni bir kez tanimladiktan sonra artik ona sadece kendi tipinde degiskenler atayabiliriz. Mesela hic bir zaman integer veya real olarak tanimlamis oldugumuz degiskene ‘a’ karakterini atayamayiz.
        Degiskenler kullanilmadan once program baslangicinda tanitilmalidirlar. Bu islem ‘var’ ifadesiyle yapilir. Tanimlamak istedigimiz degiskenlerin isimlerini tipleriyle birlikte bir liste halinde ‘var’ ifadesinden sonra yazariz. Bu isleme degisken tanimlama diyoruz. ‘var’ ile ilgili su anda bilmemiz gerekenler ise sunlar: ‘var’ ifadesi ‘uses’ ifadesinden sonra, ‘begin’ den ise once gelir.
 

        var
          sayi1,sayi2 : Integer;
          kelime1,kelime2 : String;
          harf : Char;
          hata : Boolean;

        Yukaridaki degisken tanimlamasinda sayi1 ve sayi2, integer degiskeni olarak; kelime1 ve kelime2, string degiskeni olarak; harf, char degiskeni olarak ve hata ise Boolean degiskeni olarak atanmistir. Bu degiskenler artik programimizda rahatca kullanilabilir.

 

Sabitler

 

 

 

        Sabitler de  degiskenler gibidirler. Fakat bir yonuyle degiskenlere benzemezler; o da basta atadiginiz degerden baska hicbir deger icerememe ozelligidir. Bu tanimlama uzerinde dusununce, ilk etapta sabitlerin gereksiz oldugu gibi bir sonuc ortaya cikabilir. Ancak programiniz gittikce buyuk boyutlara gelmeye basladikca sabitler, bazi seylerin daha net gorunmesine katkida bulunacak ve programinizda olusabilecek hatalari ayiklamada oldukca ise yarayacaklardir.
Sabitler ‘const’ ifadesinin ardindan tanimlanmaya baslarlar; ki bu ifade ‘var’ ifadesinden hemen once programdaki yerini alir. Farkli olan baska bir yonu ise, sabit tanimlanirken atama isareti olarak ‘:=’ yerine ‘=’ isareti kullanilir. Ornek:

        const
          pi = 3.14;
          daireacisi = 360;

Sabit degerler atandiktan sonra program boyunca ayni kalirlar ve degistirilemezler.

 

div , mod

 

 

 

        Sunu gozlemlemek mumkundur ki sayilari birbirine bircok kez boluyorsak cevabi tamsayi olarak alamayiz. Mesela ‘3/2 = 1.5’. Burada 3 ve 2 gibi tamsayilarin birbirine bolunmesinde gercel (real) sayi elde ediyoruz. Buradaki tamsayilar arasi bolme islemi gibi islemlere ozel olarak Turbo Pascal’da iki ayrilmis sozcuk kullanilir. ‘div’ sozcugu bir sayinin digeri icinde kac kere bulundugunu bulmaya yarar. Yani

        writeln(‘Uc, onbir"in icinde ’,11 div 3,’kere var.’);


program parcacigi,

        Uc, onbir"in icinde 3 kere var.

sonucunu uretir.

11, 3’e bolundugunde tam olarak 3’e esit olmaz; fakat 11 sayisini 3’e boldugumuzde bolum hanesinde 3 sayisini gormekteyiz. Dolayisiyla ‘11 div 3 ifadesi 3 sonucunu verir.’ diyebiliyoruz. ‘mod’ sozcugu ise kalani verir. Soyle ki;

        writeln(‘Uc, onbir"e bolundugunde bolum 
        ’,11 div 3,‘ kalan ise ’,11 mod 3,’ olur.’);
 
seklinde bir program parcacigi,
 
        Uc, onbir"e bolundugunde bolum 3 kalan ise 2 olur.

ciktisini uretir.

3 sayisi 11’in icerisinden 3  defa (maksimum sayida) cikartildiginda (3*3 = 9) 11’ e ulasmak icin geride hala sayilar kaldigini goruyoruz. Sonucta o sayiya ulasmak icin kalan sayiyi ‘mod’ ile buluyoruz. Ikinci bir ornek:

        writeln(’25, 867"ye bolundugunde ‘,867 div 25,’ 
        bolumunu ve , ’867 mod 25’ kalanini verir.’);

asagidaki gibi bir ekran ciktisi verecektir.

        25, 867"ye bolundugunde 34 bolumunu ve 17 kalanini verir.

 

Boolean Onermeleri

 

 

 

        ‘If’ ifadesini ogrenmeye baslamadan once Boolean onermelerini bilmemiz gerekiyor. Oncelikle Boolean onermesi nedir? Bir Boolean onermesi basit sekilde TRUE (dogru) ya da FALSE (yanlis) degerlerinden birini alabilen bir karsilastirmadir. Peki niye Boolean denmis? E tabii her bilimsel terimde oldugu gibi bu terimler de bir bilim adaminin ismini almistir. Butun Boolean onermeleri <,>,= gibi isaretleri icermek zorundadirlar.

Asagida bu isaretler ile ilgili bir tablo goreceksiniz.
     

>

buyuktur

<

kucuktur

>=

buyuk veya esit

<=

kucuk veya esit

<>

esit degil

=

esittir

 

and - or

 

 

 

        Bir Boolean onermesi ‘and’ ve ‘or’ ayrilmis sozcuklerini de kullanarak birden cok karsilastirma ifadesini bunyesinde bulundurabilir. Bu iki kelimeyi ileride bazi durumlarda cok faydali bulacak ve sik sik kullanacaksiniz. Cunku bazen bir ifadenin calistirilmasindan once, birden cok sartin ayni anda saglanmasi gerektigi durumlar soz konusu olabilmektedir. Veya bazen de iki durumdan herhangi biri ortaya ciktiginda baska bir ifadenin isletilmesi gerekiyor olabilir. Su an icin sadece asagidaki ornegi inceleyelim:

        (not >= 80) and (not < 90)

‘and’ ve ‘or’ kullanirken iadeler etrafindaki paranteze dikkat ediniz. Bu onermeler ancak bu formda dogru kullanilabilir. ‘and’ kullandigimiz durumlarda bu ifadenin TRUE degerini alabilmesi icin ‘and’ in her iki tarafindaki karsilastirmalarin TRUE degerini almalari gerekmektedir. Yani yukaridaki ornekte eger not 80’ den buyuk ve 90’ dan kucuk bir integer degiskeniyse yukaridaki ifadenin Boolean degeri TRUE dur. Fakat bu ifadenin herhangi bir parcasi FALSE olursa ifadenin tumunun Boolean degeri FALSE olur. ‘and’ kullanarak yaptigimiz kombinasyonlara asagidaki gibi ornek verebiliriz:

        TRUE and TRUE = TRUE
        TRUE and FALSE = FALSE
        FALSE and TRUE = FALSE
        FALSE and FALSE = FALSE
‘or’ un durumu ise biraz degisiktir:
        (not >= 80) or (not < 90)

Burada iki karsilastirmadan herhangi biri TRUE oldugunda butun bir ifade TRUE degerini alir:

        TRUE or TRUE = TRUE
        TRUE or FALSE = TRUE
        FALSE or TRUE = TRUE
        FALSE or FALSE = FALSE

       Su anda ‘and’ ve ‘or’ un durumlari size fazla karisik ve gereksiz geldiyse fazla dert etmeyin. Ancak ileride cok yogun bir sekilde kullanim alani olacagi icin hatirlamaniz gerekecek.

 

if...then

 

 

 

         Programda cogu hallerde bilgisayarin, girise bagli olarak degisik reaksiyon gostermesini isteyebiliriz. Mesela kullanicinin 0 ile 100 arasinda bir sayi girmesini isteyelim. Eger 90’ dan yukari bir deger girerse ekrana ‘cok iyi’ yazdirmak istiyoruz.  Bu metoda secim (selection) denir ve cogunlukla ‘if’ ifadesiyle yapilir. Asagidaki formdadir:

        if (Boolean onermesi)
          then (ifade);

      ‘If’ ifadesinin ogrenilmesi hic de zor degildir. Sadece su formda dusunmek yeterli olacaktir. ‘If’ boyleyse ‘then’ soyle yap; (veya) ‘If’ not 90’ dan buyuktur then writeln(‘Cok iyi’); . Hic de zor degil, degil mi? Akilda tutulmasi gereken onemli nokta ‘if’ ifadesinin islemesi icin Boolean onermesinin gerektigidir. Yukaridaki ornekte Boolean onermesi "not 90’ dan buyuktur" kismidir. Bu kisim TRUE da olabilir FALSE da. Yani not 90’ dan buyuk (TRUE) da olabilir; kucuk (FALSE) de olabilir. ‘then’ sozcugunden sonra gelen ifadenin calistirilabilmesi icin, ‘if’ den sonraki Boolean onermesinin TRUE olmasi sarttir. Not’ un 90 ile 100 arasinda bir integer degiskeni oldugunu varsayarsak:

        if not > 90
          then writeln(‘Cok iyi’);

program parcacigi

        Cok iyi

ekran ciktisini verir.

 

else

 

 

 

        ‘If’ ifadesinin temel yapisini ogrendikten sonra ‘else’ parcasini buna nasil kaynastiracagimizi da ogrenebiliriz. Bu da gercekten cok basit. If boyleyse then soyle yap else (aksi taktirde) boyle yap;(veya) If notunuz 90’dan buyukse then writeln(‘Cok iyi’) else writeln(‘Daha cok calis’);. ‘else’ parcasi ise bilgisayara Boolean onermesinin FALSE olmasi durumunda yapilmasi gerekeni soyler. Simdi sunu inceleyelim:

        if notunuz > 90 
          then writeln(‘Cok iyi’);
          else writeln(‘Daha cok calis’);

Eger notunuz 90’ dan buyuk bir integer degeri ise asagidaki ekran ciktisini verir:

        Cok iyi

Eger buyuk degilse:

        Daha cok calis

gozukur.

 

else if

 

 

 

        Bir ‘if’ ifadesi icerisinde birden fazla Boolean onermesi olabilir. Diyelim ki, notunuz degiskeninde 0 ile 100 arasinda bir degerimiz tutuluyor. Biz de eger  o deger 90 ile 100 arasinda ise (90’ a esit olabilir) ‘Tebrikler’, eger 80 ile 90 arasinda ise (80’ e esit olabilir) ‘Cok iyi’ ve onun altindaysa ‘Daha cok calis’ yazdirmak istiyoruz. Simdi biraz okumaya ara verip, su ana kadar ogrendiklerimizle bunu nasil yapabileceginizi dusunun. Muhtemelen bu isi uc ayri ‘if’ ifadesi kullanarak yapmayi dusunmus olmalisiniz ve yapmis olsaydiniz da sonuc asagidaki gibi olurdu herhalde:

        if notunuz >= 90 
          then writeln('Tebrikler');
        if (notunuz < 90) and (notunuz >= 80)
          then writeln('Cok iyi');
        if notunuz < 80 
          then writeln('Daha cok calis');

        Yukaridakinden daha kolay ve iyi bir yol var. Bu yol ‘if’ ifadesi icerisinde ikinci bir ‘if’ olan ‘else if’ tir. Ayni ‘if’ gibi ‘else if’ in de hemen ardindan bir Boolean onermesi gelir. Eger ‘if’ in hemen ardindan gelen Boolean onermesi FALSE ise bilgisayar ‘else if’ ardindan gelen Boolean onermesine bakar. Su ornege bir goz atalim:

        if notunuz => 90
          then writeln('Tebrikler')
        else if notunuz => 80
          then writeln('Cok iyi')
        else 
          writeln('Daha cok calis');

        Ornegi daha iyi anlayabilmek icin notunuz degiskenin 85 oldugunu varsayalim. Boyle dusundugumuz icin ilk Boolean onermesi FALSE olacagindan bilgisayar ikinci Boolean onermesine atlar. Ikinci Boolean onermesi TRUE oldugu icin:

        Tebrikler

ekranda gorunur.

 

begin ... end

 

 

 

        Cogu zaman ‘if’ ifademizin TRUE oldugu zamanlarda isletilmek uzere, birden fazla ifade (statement) bulunur. Halbuki, ‘if’ ifadesinde ‘then’ sozcugunden sonra gelen ilk ifade icin bir secim yapiyoruz. Calistirilmasi gereken ifadeler birden cok olunca da haliyle ortaya buna bagli bir sorun cikiyor. Iste bu sorunun cozumu icin ‘begin’ ve ‘end’ ayrilmis sozcuklerini kullaniyoruz:

        if notunuz > 90
          then
            begin
              writeln('Tebrikler');
              writeln('Calismaniza devam ediniz');
            end
          else 
            writeln('Daha cok calis!');

Yani not degiskenimiz 90’ dan kucuk olursa:

        Tebrikler
        Calismaniza devam ediniz.
 
Kelimeleri ekranda gozukecektir.

 

for

 

 

 

        ‘for’ dongu yapisini anlamak icin hic de zor degildir. ‘for’ dongusu belli bir program parcaciginin ne kadar tekrar edilecegi sayisal olarak belli ise kullanilir. Butun ‘for’ donguleri sayici olarak kullanilacak bir integer tipi degiskene ihtiyac duyarlar. Asagidaki ornege bakalim:

        for n := 1 to 4 do
          writeln(n);

        Basit bir ‘for’ dongu yapisi goruyoruz. ‘n’ olarak gordugumuz degisken integer olarak tanimlanmis olmalidir. ‘for’ dan sonra ‘to’ ayrilmis sozcugu ve bu degiskene 1’ den 4’ e kadar degerler atanir. Iste bu sekilde ilk seferde ‘n’ nin degeri 1 olur. Ikincisinde iki ve tâ ki deger 4 olasiya kadar artan degerler almaya devam eder. 4 degerini aldiktan sonra artik basa donmez. Yani yukaridaki program parcacigi asagidaki gibi bir ekran ciktisi verecektir:

        1
        2
        3
        4

        Suna da dikkat etmelisiniz ki; ‘for’ dongusu ‘do’ dan hemen sonraki bir satiri calistiracaktir. Siz eger birden fazla satir calistirmak istiyorsaniz ‘begin’ ve ‘end’ sozcuklerini kullanmalisiniz. Yani asagidaki gibi bir program parcacigi:

        for n := 1 to 4 do
          writeln('merhaba');
          writeln('Iyi gunler');

Sanki writeln icindeki kelimeleri ikiser ikiser yazacakmis gibi gozukse de ekran ciktisi asagidaki gibi olacaktir:

        merhaba
        merhaba
        merhaba
        merhaba
        Iyi gunler

Halbuki writeln’ den once ve sonra ‘begin’ ve ‘end’ eklediginizde ise:

        for n := 1 to 4 do
          begin
            writeln('merhaba');
            writeln('Iyi gunler');
          end;

asagidaki gibi bir ekran ciktisiyla karsilasacaksiniz:

        merhaba
        Iyi gunler
        merhaba
        Iyi gunler
        merhaba
        Iyi gunler
        merhaba
        Iyi gunler

        Simdi de ‘for’ un daha kullanisli bir durumuna goz atalim. Diyelim ki kullanicidan yedi tane sayi girmesini istiyoruz. Ve bu sayilari birbirine ekleyip toplamini bulacagiz. Yedi tane arka arkaya ‘write-readln’ kullanmaktan cok daha kolay bir yolumuz var. Eger guzel bir dongu kurabilirsek bu ifadeleri (write-readln) sadece bir kere yazarak isin icinden siyrilabiliriz.

        toplam := 0;
        for n := 1 to 7 do
          begin
            write('Sayiyi giriniz ', n);
            readln(sayi);
            toplam := toplam + sayi;
          end;

        Yukaridaki program parcacigi yedi kere, bir sayi girilmesini isteyecek ve her seferinde girilen sayiyi toplam degiskenine ilave ederektir. Dongu sona erdiginde, butun girilen sayilarin toplamini elde ederiz. Dikkat etmeniz gereken bir nokta, toplam degiskenini dongu oncesinde sifirlama islemine tabi tutuyoruz (initialize). Bu gercekten onemli bir ayrintidir; cunku dongu icerisinde, toplam degiskeninin onceki degerine yeni girilen degeri ilave ediyoruz. Dolayisiyla ilk etapta toplami sifirlamazsak, icinde istenmeyen bir deger bulunduracaktir.
Bir ‘for’ dongusunde sayici degisken herhangi bir degerden baslayip herhangi bir degerde bitebilir. Onemli olan integer tipinde olmasidir. Yani diyebiliriz ki

        for n := -5 to 5 do

dongu kodundan bu dongunun ifadeleri 11 kere tekrarlanacagini anliyoruz. Bu arada daha buyuk tam sayidan baslayip asagiya dogru inmeye hakkinada sahipsiniz. ‘to’ ayrilmis sozcugu yerine ‘downto’ yu kullanmaniz, bu ozelligi aktif hale getirmek icin yeterli olacaktir.

        for n := 10 downto 5 do

        Unutmamaniz gereken son onemli sey ise hic bir zaman ‘for’ dongusunde ‘do’ dan sonra ‘;’ kullanmayin. Eger boyle yaparsaniz, bilgisayar dongu ifadelerinin orada sonlandigini sanacak ve kendi kendini tekrar edip duracaktir. Yani dongu icerisinde calistirmak istediginiz ifadelere en sonunda ve yalnizca bir defa ugrar.

 

while

 

 

 

        ‘while’ dongusunun ‘for’ dongusunden farkli olarak; ‘while’ dan hemen sonra gelen Boolean onermesinin durumuna bagli bir calisma mantigi vardir. Bir ornek ile aciklayalim:

        while sayim < 20 do sayim :="sayim" + 1;

        Sonuc olarak isletmeniz gereken birden fazla ifade varsa, ‘for’ dongusundeki gibi ‘begin’ ve ‘end’ kullanmalisiniz. Peki ‘while’ dongusunun kullanilmasi hangi durumlarda daha elverislidir? Eger biz ancak belli sart veya sartlar olustugunda dongumuzun calismasini istiyorsak bu tur durumlarda ‘while’ kullanmak daha uygun olur. Mesela ‘while’ donguleri hata tuzaklari icin cok kullanislidir. Hata tuzagi nedir diye soracak olursaniz: Hata tuzagi kullanicin, istenmeyen bir veri girmesinde isleyen bir dongudur. Mesela, bilgisayarin kullanicidan 1 ila 10 arasinda bir sayi girmesini istedigini varsayalim. Ama kullanici buna karsilik 11 sayisini girmis olsun. Bu durumda bilgisayar kullaniciya yanlis bir veri girdigini ve bu veriyi yeniden girmesi gerektiginin soylemelidir. Iste boyle bir amaca binaen yazilmis asagidaki program parcacigini inceleyelim:

        write(‘1 ile 10 arasi bir sayi girin:’);
        readln(sayi);
        while(sayi < 1) or (sayi > 10) do
          begin
            write(‘Hatali giris. 1 ile 10 arasi bir 
                   sayi girin:’);
            readln(sayi);
          end;

       Eger sayi degiskeni bir integer tipi ise ve kullanici da 1’den kucuk veya 10’dan buyuk bir sayi girdi ise ‘while’ dongusundeki bu Boolean onermesi TRUE degerini alir ve donguye girilir. Bu da asagidaki sonucu dogurur:

        Hatali giris. 1 ile 10 arasi bir sayi girin:_

ve simdi kullanicidan sayi degiskenine tekrar veri girilmesi istenmektedir. Bu islem dogru olarak yapildiktan sonra bilgisayar ‘end;’ ifadesini gorur ve kontrol icin bastaki Boolean onermesine geri doner. Eger kullanici bu sefer 1 ile 10 arasinda bir sayi girerse Boolean onermesi FALSE olur ve dongu tekrar isletilmez. Fakat kullanici tekrar hatali bir deger girerse Boolean onermesi TRUE olur ve hata dongusu ikinci bir defa daha isletilir. Ve dogru bir deger girene dek islem tekrar edilir.

 

repeat ... until

 

 

 

        ‘while’ ve ‘repeat...until’ donguleri arasinda sadece iki temel fark vardir. Bu dongu yapisinda Boolean onermesi ‘while’ in aksine dongunun bitis noktasina yerlestirilmistir. Bunun ise manasi sudur ki; ne olursa olsun ‘repeat...until’ dongusu en az bir kere isletilir. Fakat ‘while’ dongusu hic isletilme sansi bulmaya da bilir. Ikinci temel fark ise ‘repeat...until’ dongusu icine birden fazla ifade dahil edecekseniz, dongu sinirlarina ‘begin’ ve ‘end’ ifadelerini koymazsiniz:

        sayim := 0;
        toplam := 0;
        repeat
          sayim := sayim + 1;
          write('Notunuzu giriniz: ');
          readln(not);
          toplam := toplam + not;
        until sayim = 7;

        Yukaridaki dongu ‘repeat...until’ e guzel bir ornektir. Bu arada dongumuzde 4 ifade olmasina ragmen ‘begin’ - ‘end’ olmamasi da dikkatimizi cekmeli. Dongu icinde, bir sayici degiskenimiz var ve bunun sayesinde dongumuz nerede duracagini biliyor. ‘while’ ve ‘repeat...until’ dongulerini kullanirken sonsuz donguye girmemeye dikkat etmeliyiz. Sonsuz donguler oyle dongulerdir ki; bilgisayar donguyu surekli tekrar eder ve Boolean onermesi daima TRUE oldugu icin bir turlu dongu disina cikilamaz. Bir ornek, anlamamiza yardimci olacaktir:

        sayim := 0;
        toplam := 0;
        repeat
          write('Notunuzu giriniz: ');
          readln(not);
          toplam := toplam + not;
        until sayim = 7;

 

Sonsuz Donguler

 

 

 

        Yukaridaki program parcacigi bir onceki ile neredeyse aynidir. Tek farki ‘sayim := sayim + 1;’ ifadesidir. Bu ifadeyi cikarttigimizda, dongu icerisinde sayim hicbir zaman 7’ ye ulasamayacak ve hep sifir kalacaktir. Sonuc olarak ‘until sayim = 7’ onermesi hicbir zaman TRUE olamayacagi icin, dongu surekli kendini tekrar edecektir.

 

 

 

GİRİŞ

 

 

 

Veri: Veri tabanında kayıtlı fiziksel değer

Bilgi: Bu değerlerin anlamı veya işlenmiş halidir.

Veri Tabanı: Temelde bilgisayara dayalı bir veri saklama sistemidir. En önemli görevi veriyi depolamak ve bilgiyi işlemektir.

 

VERİ TABANI SİSTEMİ

 

 

 

      Veri Tabanı Sistemi dört temel elemandan oluşur: Veri, donanım, yazılım ve kullanıcılar.

1. Veri: Depolanan veri bir veya daha fazla veri tabanına bölünebilir. Ancak kullanımı daha rahat olduğu için tercih edilen yol verilerin tamamı sistemin içine tek bir veri tabanı içine toplamaktır. Sonuç olarak bir veri tabanı bütünleşik (entegre) ve paylaşılabilir bir depodur.

Bütünleşik sözcüğünün kullanılmasının sebebi, birden fazla ayrı veri dosyasının tekrarlamalar olmaksızın bütünleştirilmesidir. Örneğin, kurs ve çalışan dosyalarının olduğunu varsayalım. Çalışan dosyasında isim, adres, bölüm ve maaş bulunsun. Kurs dosyasında da katıldığı hizmet içi eğitimlerle ilgili bilgiler bulunsun. Kursa yeni başlayacak birisinde kişinin çalıştığı bölümle ilgili bilgilerin kurs dosyası içinde olmasına gerek yoktur. Bu bilgiler numara ya da isim anahtar gösterilerek öğrenilebilir. Bu bilgilerin iki dosyada da bulunması sadece yer israfıdır.

Paylaşılabilir sözcüğü ile veri tabanı içindeki veri parçalarının değişik kullanıcılar tarafından paylaşılması kasdedilir. Bu durumda bu kullanıcıların her biri aynı veri dilimine (belli farklı amaçlar için) ulaşılabilirler. Bu veri tabanının bütünleşik olmasının sonucudur. Yukarıda verilen örnekte de 'bölüm' bilgisi birden fazla amaçla kullanılmış, yani paylaşılmıştır. Burada önemli bir nokta da aynı veri parçasının n tane kullanıcının aynı anda ulaşabilmesidir. Buradan da bir veri tabanı sisteminin çoğunlukla çok kullanıcılı bir sistemle desteklenmesi gereği ortaya çıkmaktadır.

2. Donanım: Kullanılan yazılımın donanımla uygun olması, depolama birimleri ve donanımın güvenliği önemlidir.

3. Yazılım: Fiziksel veri tabanı ile sistem kullanıcıları arasındaki iletişi sağlayan yazılıma Veri Tabanı Yönetim Sistemi (VTYS) (Data Base Management System) adı verilir. Veri tabanına ulaşabilmek için kullanıcıdan gelen bütün istekler Veri Tabanı Yönetim Sistemi tarafından yerine getirilir. Bir VTYS, kullanıcıya donanımla ilgili bilgi bilmeye zorlamaz.

4. Kullanıcılar: Üç sınıf kullanıcı vardır. Uygulama programcısı: Bir programlama diliyle programı yazan, veri girişi, ekleme, silme, değiştirme işlemini yapan kişidir. Son kullanıcı: Uygulama programcısının hazırladığı programı kullanır. Veri Tabanı Yöneticisi:

Veri tabanı sistemi kullanan bir işletmede bütün verilere ulaşılabilen ve onlar üzerinde merkezi sorumluluğu olan yöneticilik ve teknik bilgiye sahip kişiye Veri Tabanı Yöneticisi denir. Bu kişinin en önemli görevi arasında, işletme/kurum/okula ait bilgilerin dağıtılmasına ve kontrolün yapılmasını sağlamaktır.

 

VERİ TABANININ ÜSTÜNLÜKLERİ

 

 

 

  • Tekrarların önlenebilir
  • Veriler arası uyuşmazlıklar ortadan kaldırılabilir.
  • Veriler paylaşılabilir.
  • Standartizasyon getirir.
  • Güvenlik önlemleri alınabilir. (muhasebe, idare, demirbaş, öğretmen bilgileri, öğrenci bilgileri ... bölümlerine hangi dosyaları kullanacaksa o dosyalara kullanım hakkı verilir.)
  • Çatışan istekler dengelenebilir.
  • Veriden Bağımsızlık: Veri tabanı sisteminin uygulamaların depolama yapısı ve erişim yöntemlerine karşı bağışıklığıdır.

 

VERİ TABANININ BİLEŞENLERİ

 

 

 

Alan (field): Veri tabanı içinde verilerin isimlendirilmiş en küçük birimidir. (okul no, ad, soyadı, yabancı dili ... gibi).

Kayıt (record): Birbirleriyle bağlantılı alanlar topluluğudur. Bir öğrenciye ait okul no, ad, soyadı, yabancı dili bilgilerinin bütünüdür.

Dosya (file): Aynı alanlara sahip kayıtların topluluğudur.

 

VERİLERİN KODLANMASI

 

 

 

        Veriler kodlanırken hep aynı tipte kodlanmalıdır. Kısaltma kullanılacaksa tüm verilerde kullanılmalı ya da hiç kullanılmalıdır. Örneğin mezun olduğu okul alanına, İlköğretim Okulu, İ.Ö.O., İlköğr. Ok. ... gibi yazılması sorgulama işleminin yapılmasında problemlere yol açar.

        Alan adları veri türleriyle uyumlu olmalıdır. Örneğin bir kayıttaki kişinin cinsiyetinin girileceği alana cins, cinsiyet alan adı verilebilir.

        Büyük-küçük harf kullanırken dikkat edilmelidir. Rastgele kullanılmamalıdır.

 

DAĞITILMIŞ VERİ TABANLARI

 

 

 

        Bu sistemde veriler tek bir ana belleğe yardımcı belleklerde bir ağ (network) içinde bulunur. Dolayısıyla, veriler birbirine kilometrelerce uzaktan bir veri hattı yoluyla bağlanmaktadır. Bankalardaki bilgisayar kullanımı buna örnek olarak verilebilir. Şubelerin bilgisayarları bankanın merkez şubesine bağlıdır. Merkez şube diğer şubeleri denetleyebilir. Yerel müşterilerle ilgili işlemler merkeze bildirilmeden yapılabilir.

 

ACSESS İLE VERİ TABANI YÖNETİMİ 

 

 

 

       Tablolar: Bir veri tabanı içinde verilerin depolandığı ve bu veriler arasındaki ilişkilerin belirtildiği temel bileşenlerdir.

        Sorgu: Veri tabanı içindeki tablolarla tutulan veriler ile ilgili standart dışı isteklerin karşılanması için kullanılan bileşenlerdir. Birbiriyle ilişkili bütün veriler tekbir tablo içinde tutulamazlar. Tabloların içindeki anahtar alanlar, bu bileşen yolu ile birbirleri ile ilişkilendirilerek istenilen bütün çıktılar elde edilebilir.

        Formlar: Veri tabanından yararlanacak kişilerin, veri tabanı tabloları içerisinde kolay ve etkin bilgi yüklemelerini sağlamaktır. Veri tabanına bilgi girişinde, kullanıcıya rahatlık sağlayan arayüzler form nesneleri sayesinde oluşturulabilir.

        Raporlar: Veri tabanı içinde çeşitli tablolarda tutulan verilerin kağıt formatında çıktısını almak için kullanılabilecek bir bileşendir. Verilerin kağıt üstünde görülmesini istediğimiz şekildeki çıktıları raporlar aracılığıyla tasarlanır.

        Modüller: Bağımsız program kodlarıdır. Modül içinde function ve sub tipi altprogramlar bulunur. Bu prosedürler içinde Visual Basic programlama dili komutları kullanılarak program parçacıkları yazılır.

 

VERİ TABANI TASARIMI

 

 

 

İstemlerin Saptanması

  • Veri tabanı içinde hangi verilerin yer alması istenmektedir.
  • Veri tabanından istenen rapor türleri nelerdir?

Veri tabanı İçinde yer alacak olan tabloların belirlenmesi

  • Veri tabanı içinde yer alacak olan tabloların belirlenmesinin son kullanıcı açısından bir önemi yoktur. Fakat veri tabanı tasarımcısı için sistemin verimi ve güvenirliği açısından çok önemlidir.
  • Her konu ile ilişkili bilgiler ayrı bir tablo içine yerleştirilmelidir. Örneğin personel bilgisi içine öğrenci bilgisi yerleştirilmemeli, personel sicil bilgisi tablosuna muhasebe verileri yüklenmemeli.
  • Aynı tablo içinde tekrara edilen alanlar bulunmamalıdır. Örneğin, bir personelin maşı diye bir alan olmamalı. Personelin maaşı verinin girildiği zamana bağlı olarak değiştiği için aynı veri tabanında personelin maaşı farklı olacaktır. Maaşı hesaplatmak en uygun yoldur.

 

Tablolar İçindeki Alanların ve Anahtar Alanların Belirlenmesi

 

 

 

        Her alanın içinde tek bir içerik olmalıdır. Örneğin adres alanı içinde mahalle, sokak, numara, ilçe, il olmamalıdır. Kuracağımız veri tabanına göre parçalamalar yapılabilir. Örneğin adres alanı için mahalle, sokak, numara, ilçe, il alanları tercih edilmelidir eğer veri tabanımızda aynı mahallede ve aynı sokakta oturan kişileri bulmak istiyorsak. Ya da aynı il ve ilçede oturanları listelemek istiyorsak il ve ilçe alanları mutlaka ayrı alanlarda olması tasarlanmalıdır.

        Her tablo için alanlardan biri mutlaka birincil anahtar (primary key) olarak tanımlanmalıdır. Bu alan, tekrarlanan verilere ait alan olmalıdır. Örneğin, personel için mebsis no, ürünler için ürün kodu gibi.

        Bazı alanlar farklı tablolarda tekrarlanabilir. Burada veri bütünlüğünün bozulmaması için dikkat edilmesi gereken nokta iki tablo arasındaki verilerin birbiriyle uyuşmasıdır. Örneğin, Tablo 1'de "sınıflar" alanına 9-F sınıfının yazıp, tablo 2'de 9-F'nin bulunmaması sorunlara yol açabilir.

 

ACCESS'DE VERİ TİPLERİ

 

 

 

Metin: Karakter türü (harf, rakam, özel karakter) bilgi içeren alanlar için kullanılan veri tipidir. Text türü bir alanın içereceği bilgi, 255 karakter uzunluğuna kadar olabilir. Önceden atanan değer 50'dir. Metin türü atanacak bilgiler, ad, soyad, adres gibi bilgilerle üzerinde hesaplama yapılmayacak rakamlar (örneğin, adreslerde bulunan kapı numaraları) ya da telefon numaraları.

Not: Not türü bilgiler de, metin türünde olan fakat 255 karakterden daha fazla karakter içeren bilgilerdir. Not türübir alan, 65,535 karaktere kadar bilgi içerebilir.

Sayı: Sayı türü, matematiksel işlemlere sokulacak türdeki bilgiler için uygundur (maaş, fiyat, miktar, ...). Sayı türündeki tanımlanmış Alan Boyutları ise şunlardır:

        Bayt , Tamsayı , Uzun Tamsayı , Tek , Çift ......

Tarih/saat: 100 yılı ile 9999 yılı arasındaki tarihleri ve zamanı ifade etmek için kullanılır.

Para Birimi: Parasal türdeki veriler için kullanılır. 1-4 arasında ondalık haneye sahip olabilir. Ondalık noktanın sol tarafına 15 ve sağ tarafında 4 haneye kadar hassasiyete sahiptir.

Otomatik Sayı: Otomatik sayı değerine sahip olan bir alandaki sayılar ya 1'er 1'er artan tam sayılardır ya da Acsess 97 tarafından atanan ratgele sayılardır. Sayıları rastgele seçmek için "Genel-Yeni değerler-Rastgele" seçilir.

Evet/Hayır: İki değerden birini seçmek zorunlu olduğunda kullanılır.

OLE Nesnesi: Excel tablosu, Word dökümanı, resim ya da ses bilgisi olabilecek türden bilgilerdir.

Köprü: Internet adreslerinin girileceği alanlardır.

 

Visual Basic Hakkında
Visual Basic 10 yıllık bir geçmişi olan görsel bir dildir. Fakat görsel dil olmadan önce sadece Basic’in olduğu dönemler 1950’li yıllara kadar dayanır. BASIC kelimesinin açılımı “Beginners All-purpose Symbolic Instruction Code” (Yeni başlayanlar için çok amaçlı sembolik talimat kodu) kelimeleridir. Basic kodu yazmak için GWBASIC ve QBASIC  editörleri kullanılarak yazılırdı ve Dos tabanlı idi ve görsel dillerdeki kadar program yazmak kolay değildi. Günümüzde Basic ile program yazmak artık rafa kaldırıldı diyebiliriz. Yıl 1991’de Basic dili güzel bir hamle yaparak Visual Basic’in  1.0 sürümü çıkarıldı. Basic dili diğer programlama dillerine oranla pek önemsenmediği için VB 1.0 sürümüde pek önemsenmedi. Bundan iki yıl sonra 1993 yılında Visual Basic 3.0 sürümü bir çok gelişme göstererek piyasaya çıktı. Tekrar bundan iki yıl sonra gelişimini sürdürerek 4.0 sürümü 32bit uygulama desteği ile piyasaya sunuldu. 1996 yılında Visual Basic 5.0 sürümü ile karşımıza çıktı. Ve en son olarak Visual Basic’in en güncel sürümü bir çok sürümü ile karşımızda. (Visual Basic’e kısaca VB denmektedir.) VB artık Windows tabanlı uygulamalar için önde gelen geliştirme araçlarından biri olarak piyasadadır. Visual’ın  kelime manası görsel anlamındadır. VB Görsel oluşu, programcının bu dili öğrenme sürecini kısaltmakta ve dilin kullanımı kolaylaştırmaktadır. Aynı zamanda Windows tabanlı olması kullanıcıda bir göz aşinalığını sağlar. VB’nin görsel olması kadar önemli olan  Olay güdümlü olmasıdır. Örneğin; kullanıcı penceredeki bir komut düğmesi üzerinde farenin düğmesine tıklandığında bir olay meydana gelir. Bu olay VB de  Click( ) olay yordamıyla işlenir. Visual Basic ortamının önemli bileşenleri şunlardır; 

VB6 ortamı da standart windows uygulamalarında olduğu gibi bir ana menü ve menüdeki seçeneklere erişimi hızlandıran araç çubuğu düğmeleri içerir. Menü seçeneklerinin sağındaki kısayol tuşlarını kullanarak işlerinizi daha hızlı halledebilirsiniz. Şimdilik hemen kullanmaya başlayabileceğiniz seçeneklerin açıklalamaları:
 



New Project : Açık olan projeyi kapatıp yeni bir proje açar.
Open Project : Daha önce kaydettiğiniz bir projeyi yükler.
Save Project :  Geliştirdiğiniz projeyi kaydeder.
Save Project As : Projeyi farklı bir isimle kaydetmek için kullanılır.
Save Form1 : Projenizin formunu kaydeder. ( Formunuzun Name özelliğini değiştirseydiniz  Form1 yerine bu isim gösterilir. )
Save Form1 As : Projenizin formunu farklı bir isimle kaydetmek için kullanırsınız.
Print : Dosya yazdırmak için kullanılır. Yazdırmadan önce Yazıcı Ayarları iletişim kutusunu görüntüler.
Print Setup : Yazıcı  Ayarları iletişim kutusunu görüntüler.
Dosya İsimleri : Son zamanlarda yüklediğiniz dosyalara kolayca erişebilmenizi sağlar. ( Tıpkı Word’de olduğu gibi...)
Exit : VB ortamını kapatır. ( Çıkmadan önce projede yaptığınız değişiklikleri kaydetmelisiniz.)
 

Edit menüsündeki en çok kullanılan seçenekleri zaten biliyor olmalısınız : Cut (Kes), Copy ( Kopyala), Paste (yapıştır), Undo (Geri Al), Redo (Yinele), Select All ( Tümünü seç). Bunları uygulayıp etkilerini görmeniz yeterlidir.
 

Code: Projenizin aktif formun  modülündeki formunu görüntüler.
Object: Projenizin formunu görüntüler.
Project Explorer: Project Explorer penceresini görüntüler. 
Properties Window: Properties  (özellikler ) penceresini görüntüler.
Form Layout Window: Form Layout  penceresini gösterir.
Toolbox: Araç kutusunu ( Toolbox penceresini) görüntüler.
Color Palette: Formun üzerindeki denetimlerin özelliklerini ayarlamanızı sağlayan renk paletini açar. Burada, Define Colors düğmesine tıklayarak özel  renkler de tanımlıyabilirsiniz.
 

Start: Projenizin sözdizimini kontrol eder. Bir hata yoksa çalıştırır.
End: Visual Basic ortamından çalıştırdığınız Visual Basic proğramını kapatır.

Windows ve Help menülerini hemen her Windows uygulamasında bulunan seçenekleri içerdiğinden açıklamaya gerek yoktur. Çevrimici  yardım, İngilizce biliyorsanız çok iyi bir yardımcı  kaynaktır. Bağlama duyarlı yardım sağlayabilir. Bunun için her hangi bir nesneye veya özelliğe tıkladıktan sonra (F1  tuşuna basarak veya menüden işaretliyerek ) yardım istemeniz yeterlidir. Ayrıca yardım istediğiniz konuyu arayabilirsiniz. (Başka bir kaynak –insan veya kitap- böyle hızlı ve sabırlı bir şekilde yardım sağlayamaz.)

Eğer bu programlama diline merak sardıysanız başlangıç için bu bilgiler size yeterli olcaktır. Şimdiden koaly gelsin

Quick-Basic Kursu
Bölüm 1 : QuickBasic'e Giriş

Bu kurs sizin bir QuickBasic derleyicisine ve editörüne sahip olduğunuzu varsaymıştır. Burada anlatılacak olanlar QuickBasic v4.5 'a göredir. QuickBasic'in daha kısılmış bir sürümü olan QBASIC v1.1 MS-DOS un son sürümlerinde beraber kurulmaktaydı. Sisteminizde DOS yüklü değilse QBASIC.EXE olmayabilir.
Windows 95 CD nizdeki \OTHER\OLDMSDOS\ klasörünüze açıp QBASIC.EXE yi C:\WINDOWS\COMMAND\ klasörünüze kopyalayın. Qbasic'in, QuickBasic den kısılmış olan en önemli özelliği dosyayı derleyip EXE haline getirememesidir.
Win95 CD niz yoksa ftpsearch.lycos.com , www.yahoo.com , www.altavista.com gibi arama sitelerine bağlanıp qbasic.exe yi aratıp bulun ve sisteminize kopyalayın.
NOT: Bu kursda QuickBasic kelimesi yerine kısaca Qbasic kullanılacaktır.
Ayrıca, QuickBasic' i nerde bulacağınız hakkında bana soru sormayın.

BASIC nedir?

BASIC kelimesi Beginners All-Purpose Symbolic Instruction Code kelimelerinin baş harflerinden oluşmuş bir kelimedir. Genel amaçlı yeni başlayanlar için bir programlama dilidir. Öğrenmesi kolay, yüksek seviyeli bir dildir. Basic kodları bir derleyici ile çalıştırılabilir(.EXE) ye dönüştürülebilir.

QuickBasic editörünün kullanımı

QuickBasic paketini bilgisayarınıza kurduğunuzda ; dos komut satırında

QB

yazıp ENTER'e bastığınızda karşınıza basic programınızı yazmanız için bir editör proramı yükler. Dos un EDIT ine benzer özelliklere sahiptir. Basic programınız yazdıktan sonra F5 tuşu ile çalıştırabilirsiniz. Programın çalışması bitince herhangi bir tuşa basarak, program hala çalışıyorsa CTRL-PAUSE tuşlarına basarak programın çalışmasını durdurup editöre dönebilirsiniz.
Not: QBASIC kullananlar komut satırında QBASIC yazarak çalıştıracaklar.

UYGULAMA:
dos komut satırında qb yazıp enter tuşuna basarak qbasic editörünü çalıştırın. Aşağıdaki resimde olduğu gibi editöre yazın.

Klavyeden F5 tuşuna basarak yazdığımız basic kodunun çalışmasını sağlayın. Bir problemle karşılaşmazsanız ekranındaki yazılar temizlenecek ve ekranın ilk satırında
yazacak. Editör ekranına dönmek için herhangi bir tuşa basın.
Not: ' (ayırma) işaretinden sonra yazılanlar açıklama içindir, yazılmasa da olur.

Qbasicde satır numaraları

Satır numaraları gereksizdir. Ama kullanabilirsiniz de. Kullanırsanız; numaraların birbirini takip etmesi şart değildir. QBasicde satır numaraları yerine okunurluğu kolaylaştırması için ETİKET kullanılır. Etiketi de sadece GOTO veya GOSUB ile gidilecek satırlara koymak yeterlidir.

10 A = A + 1
20 IF A > 20 THEN GOTO 50
30 PRINT A
40 GOTO 10
50 END

Yukardaki program kodları yerine; aynı işi yapan, satır numarası vermeden, etiket kullanarak yazılmış hali aşağıda.

basla:
A = A + 1
IF A > 20 THEN GOTO bitis
PRINT A
GOTO basla
bitis:
END

Bir satırda birden fazla komut da kullanılabilir. İki komutu ayırmak için : (2 nokta üstüste) kullanılır

CLS
PRINT "QBASIC"
PRINT "MERHABA DÜNYA !"

Üstteki ile alttaki kodlar aynı işi yapar. Farkı yoktur.

CLS : PRINT "QBASIC" : PRINT "MERHABA DÜNYA !"
PRINT yerine ? (soru işareti)
? "Merhaba Dünya !"
PRINT "Merhaba Dünya !"

Yukardaki iki satır aynı işi yapar. Yazarken ? işareti PRINT komutuna dönüşür. Bundan sonra eminim ki ? işaretini PRINT e tercih edeceksiniz.

Qbasicde yardım almak

QBasic in menülerinde HELP var. Fareyle tıkladığınızda bir yardım ekranı karşınıza gelecek. Ayrıca komutları yazdığımız bölümdeki kelimelerden faydalanarak da yardım alabiliriz. Örneğin OPEN yazın imleç(yanıp sönen gösterge) kelime üzerindeyken klavyeden F1 tuşuna bastığınızda OPEN komutu hakkında yardım ekranı gelir karşınıza. Burada Kısa açıklama, Detaylı açıklama, Örnek programı görebilirsiniz. Tabii burada yardım bilgileri Türkçe değil, İngilizce.

Quick-Basic Kursu
Bölüm 2: Qbasicde Veri Tipleri

Qbasicde INTEGER, SINGLE, DOUBLE gibi veri tipleri vardır. Veriler belleğe saklanmadan önce bellekde ne kadar yer kaplayacağını belirtmek için kullanılır. Değişkenin içeriği ancak bu şekilde bellekde düzenli bir şekilde yerleşir. Örnek

A% = 126

A değişkeniin yanındaki % işareti değişkenin bir INTEGER veri tipine sahip olduğunu gösteriri. Ona aktarılan bilgi bellekde 2 karakterlik yer kaplar.

Değişkenlerin veri tipini tanımlamak şart değildir. O zaman tanımlanmamış değişkenler basic tarafından SINGLE olarak kabul edilir.

Qbasicde Veri Tipleri

Qbasic diğer dillerdeki gibi tüm veri tiplerini kullanmanıza imkan vermez, fakat genellikle diğerlerine ihtiyaç duymayacaksınız. Qbasic ile kullanabileceğiniz veri tipleri INTEGER, LONG, SINGLE, DOUBLE ve STRING dir. Daha detaylı bilgi almak için menüden HELP/Contents 'i ve çıkan ekranda Data Types i tıklayın.

Veri tipleri nasıl kullanılır?
A% = 253
Y! = 3.141
Z& = 254144

A nın INTEGER olduğunu öğrenmiştik ama Y! ve Z&
! işareti SINGLE verilere sahip değişkenleri tanımlamak için, & işareti LONG verilere sahip değişkenler içindir.

ARAŞTIR: Şimdi siz DOUBLE ve STRING değişkenler için hangi işaretler kullanılması gerektiğini HELP den bulmaya çalışın.

Data tipi kullanımının bir başka yolu

Değişkenlerin data tiplerini tanımlamak için birkaç alternetif yöntem vardır. Bunlar:

DIM A AS INTEGER
DIM B AS SINGLE
DIM C AS LONG

Bu stil en güzel görüneni ve iyi programcıların kullandığı stildir. Tanımları düzgün yaptıktan sonra programın ilerki aşamalarında yalnızca değişken adını kullanmanız yeterlidir.

DEFINT A
DEFSNG B,K,N
DEFLNG C-D

Bu da başka bir stil Değişkenin başharfine göre tanımlanmamış olan tüm değişkenler DEF in yanındaki değişken türünde olur. İyi bir stil sayılmaz.

A% = 253
Y! = 3.141
Z& = 254144

Bu şekilde tanımlama yaptığınızda aynı değişkeni hep aynı şekilde yazmak zorundasınız. Yani A% nin değerini değiştirmek için A = 100 kullanmak sakıncalıdır.

DİKKAT:

A! = 22.125
A& = 46500
A% = 255
PRINT A!, A&, A%
PRINT A
Kullanıcı tanımlı Veri Tipleri

Kendi veri tipinizi belirleyebilirsiniz Bu size bellekte kaplayacak olan verilerinizi kullanmanızı kolaylaştıracaktır. Örneğin kişilerin adres bilgileri üzerinde işlem yapmak istiyorsanız, kişi için kendinizin belirlediği bir veri yapısı oluşturabilirsiniz.

TYPE Adrestipi
        Adresi AS STRING * 50
        PostaKodu AS STRING * 7
        Adi AS STRING * 30
        Telefonu AS STRING * 18
 END TYPE

Bu açıklamalar sanırım yetersiz olacaktır başlangıç için. Daha detaylı bilgi almak için TYPE yazısı üzerinde iken F1 e basarak yardım alabilirsiniz.

Tanımlamış olduğumuz ADRESTIPI veri tipini kullanmak için bellekde yer açmalıyız. Bunun için

DIM Personel AS Addrestipi

komutunu kullanırız. Şimdi bu değişkenin(PERSONEL) elemanlarına değer aktaralım

Personel.Adresi = "Ankara Caddesi" 
Personel.PostaKodu = "33522" 
Personel.Adi = "Murat Velioğlu" 
Personel.Telefonu = "0866-945 44 21"

Bu tip değişken kullanımı QBasic de yeni iseniz ve ya diğer BASIC dillere alışkanlığınız varsa garip gelecektir. Ama bu tip değişkenler diğer dillerde de kullanılmaktadır. Şu an için telaşlanmanıza gerek yoktur. Zamanla bu yapıya alışıp gerekli yerlerde rahatlıkla kullanacaksınız.

Veri Tipleri Özet Tablosu

VERİ TİPİ

TANIMLAMA
ŞEKİLLERİ

BELLEKTE KAPLADIĞI ALAN
(Byte)

AÇIKLAMA

INTEGER

DIM A AS INTEGER
DIM A%
DEFINT A

2 (16 bit)

-32768 ile 32767 sayıları arasındaki TAM sayıları tutabilir(2^15). Daha büyük sayılar yazmaya çalıştığınızda Owerflow(Taşma) hatası verir. Küsurlu rakamlar vermeye çalıştığınızda yakın olan sayıya tamamlar.
A% = 45.12 '--> 45
A% = 51.72 '--> 52

LONG

DIM A AS LONG
DIM A&
DEFLNG A

4 (32 bit)

-2147483648 ile 2147483647 sayıları arasındaki TAM sayıları tutabilir(2^31). Küsurlar INTEGERdeki gibidir.

SINGLE

DIM A AS SINGLE
DIM A!
DEFSNG A

4 (32 bit)

7 rakamdan oluşan küsurlu veya tam rakamları tutar.
A! = 3.141145
Daha fazla rakam girildiğinde bilimsel kullanım şekline dönüştürür.
A! = 12345678 ' -> 1.234568E+07
E+07 demek .(nokta) yı 7 rakam sağa kaydırılacak demektir
E-07 olsaydı sola kaydırma olacaktı.
A! = 50000000000 ' -> 5E+10
A! = 1 / 25000000 ' -> 4E-08

DOUBLE

DIM A AS DOUBLE
DIM A#
DEFDBL A

8 (64 bit)

15 rakamdan oluşan küsurlu veya tam rakamları tutar. Diğer özellikler SINGLEdaki gibidir.

STRING

DIM A AS STRING
DIM A$
DEFSTR A

Herbir karakter için 1 byte

Kullanıcı
Tanımlı

 

Tanımlanan genişliğe göre değişir

PÜF NOKTASI:
DIM BORCU AS LONG
şeklinde değişken tanımlandıktan sonra programın ilerleyen satırlarında
BORCU = 1250000
şeklinde kullanabiliriz. Ama karmaşık programlar yazdığınızda bu kullanım hangi değişkenin hangi veri tipinde olduğunu anlamanızda zorluk çıkarır. Kolayı: İmleç değişken üzerinde iken F1 tuşuna basarak değişkenin hangi modülde hangi veri tipinde kullanıldığını gösteren ekranı görebilirsiniz.

Quick-Basic Kursu
Bölüm 2: Qbasicde Veri Tipleri

Qbasicde INTEGER, SINGLE, DOUBLE gibi veri tipleri vardır. Veriler belleğe saklanmadan önce bellekde ne kadar yer kaplayacağını belirtmek için kullanılır. Değişkenin içeriği ancak bu şekilde bellekde düzenli bir şekilde yerleşir. Örnek

A% = 126

A değişkeniin yanındaki % işareti değişkenin bir INTEGER veri tipine sahip olduğunu gösteriri. Ona aktarılan bilgi bellekde 2 karakterlik yer kaplar.

Değişkenlerin veri tipini tanımlamak şart değildir. O zaman tanımlanmamış değişkenler basic tarafından SINGLE olarak kabul edilir.

Qbasicde Veri Tipleri

Qbasic diğer dillerdeki gibi tüm veri tiplerini kullanmanıza imkan vermez, fakat genellikle diğerlerine ihtiyaç duymayacaksınız. Qbasic ile kullanabileceğiniz veri tipleri INTEGER, LONG, SINGLE, DOUBLE ve STRING dir. Daha detaylı bilgi almak için menüden HELP/Contents 'i ve çıkan ekranda Data Types i tıklayın.

Veri tipleri nasıl kullanılır?
A% = 253
Y! = 3.141
Z& = 254144

A nın INTEGER olduğunu öğrenmiştik ama Y! ve Z&
! işareti SINGLE verilere sahip değişkenleri tanımlamak için, & işareti LONG verilere sahip değişkenler içindir.

ARAŞTIR: Şimdi siz DOUBLE ve STRING değişkenler için hangi işaretler kullanılması gerektiğini HELP den bulmaya çalışın.

Data tipi kullanımının bir başka yolu

Değişkenlerin data tiplerini tanımlamak için birkaç alternetif yöntem vardır. Bunlar:

DIM A AS INTEGER
DIM B AS SINGLE
DIM C AS LONG

Bu stil en güzel görüneni ve iyi programcıların kullandığı stildir. Tanımları düzgün yaptıktan sonra programın ilerki aşamalarında yalnızca değişken adını kullanmanız yeterlidir.

DEFINT A
DEFSNG B,K,N
DEFLNG C-D

Bu da başka bir stil Değişkenin başharfine göre tanımlanmamış olan tüm değişkenler DEF in yanındaki değişken türünde olur. İyi bir stil sayılmaz.

A% = 253
Y! = 3.141
Z& = 254144

Bu şekilde tanımlama yaptığınızda aynı değişkeni hep aynı şekilde yazmak zorundasınız. Yani A% nin değerini değiştirmek için A = 100 kullanmak sakıncalıdır.

DİKKAT:

A! = 22.125
A& = 46500
A% = 255
PRINT A!, A&, A%
PRINT A
Kullanıcı tanımlı Veri Tipleri

Kendi veri tipinizi belirleyebilirsiniz Bu size bellekte kaplayacak olan verilerinizi kullanmanızı kolaylaştıracaktır. Örneğin kişilerin adres bilgileri üzerinde işlem yapmak istiyorsanız, kişi için kendinizin belirlediği bir veri yapısı oluşturabilirsiniz.

TYPE Adrestipi
        Adresi AS STRING * 50
        PostaKodu AS STRING * 7
        Adi AS STRING * 30
        Telefonu AS STRING * 18
 END TYPE

Bu açıklamalar sanırım yetersiz olacaktır başlangıç için. Daha detaylı bilgi almak için TYPE yazısı üzerinde iken F1 e basarak yardım alabilirsiniz.

Tanımlamış olduğumuz ADRESTIPI veri tipini kullanmak için bellekde yer açmalıyız. Bunun için

DIM Personel AS Addrestipi

komutunu kullanırız. Şimdi bu değişkenin(PERSONEL) elemanlarına değer aktaralım

Personel.Adresi = "Ankara Caddesi" 
Personel.PostaKodu = "33522" 
Personel.Adi = "Murat Velioğlu" 
Personel.Telefonu = "0866-945 44 21"

Bu tip değişken kullanımı QBasic de yeni iseniz ve ya diğer BASIC dillere alışkanlığınız varsa garip gelecektir. Ama bu tip değişkenler diğer dillerde de kullanılmaktadır. Şu an için telaşlanmanıza gerek yoktur. Zamanla bu yapıya alışıp gerekli yerlerde rahatlıkla kullanacaksınız.

Veri Tipleri Özet Tablosu

VERİ TİPİ

TANIMLAMA
ŞEKİLLERİ

BELLEKTE KAPLADIĞI ALAN
(Byte)

AÇIKLAMA

INTEGER

DIM A AS INTEGER
DIM A%
DEFINT A

2 (16 bit)

-32768 ile 32767 sayıları arasındaki TAM sayıları tutabilir(2^15). Daha büyük sayılar yazmaya çalıştığınızda Owerflow(Taşma) hatası verir. Küsurlu rakamlar vermeye çalıştığınızda yakın olan sayıya tamamlar.
A% = 45.12 '--> 45
A% = 51.72 '--> 52

LONG

DIM A AS LONG
DIM A&
DEFLNG A

4 (32 bit)

-2147483648 ile 2147483647 sayıları arasındaki TAM sayıları tutabilir(2^31). Küsurlar INTEGERdeki gibidir.

SINGLE

DIM A AS SINGLE
DIM A!
DEFSNG A

4 (32 bit)

7 rakamdan oluşan küsurlu veya tam rakamları tutar.
A! = 3.141145
Daha fazla rakam girildiğinde bilimsel kullanım şekline dönüştürür.
A! = 12345678 ' -> 1.234568E+07
E+07 demek .(nokta) yı 7 rakam sağa kaydırılacak demektir
E-07 olsaydı sola kaydırma olacaktı.
A! = 50000000000 ' -> 5E+10
A! = 1 / 25000000 ' -> 4E-08

DOUBLE

DIM A AS DOUBLE
DIM A#
DEFDBL A

8 (64 bit)

15 rakamdan oluşan küsurlu veya tam rakamları tutar. Diğer özellikler SINGLEdaki gibidir.

STRING

DIM A AS STRING
DIM A$
DEFSTR A

Herbir karakter için 1 byte

Kullanıcı
Tanımlı

 

Tanımlanan genişliğe göre değişir

PÜF NOKTASI:
DIM BORCU AS LONG
şeklinde değişken tanımlandıktan sonra programın ilerleyen satırlarında
BORCU = 1250000
şeklinde kullanabiliriz. Ama karmaşık programlar yazdığınızda bu kullanım hangi değişkenin hangi veri tipinde olduğunu anlamanızda zorluk çıkarır. Kolayı: İmleç değişken üzerinde iken F1 tuşuna basarak değişkenin hangi modülde hangi veri tipinde kullanıldığını gösteren ekranı görebilirsiniz.

Quick-Basic Kursu
Bölüm 3: CLS , INPUT ve PRINT

Bu bölümde ekranı silme, program çalışırken değişkenlere veri aktarma ve bu verileri yazdırmayı öğreneceğiz.

CLS komutu

Bu komut çalıştırıldığında daha önceden ekrana yazılmış olan yazılar silinir. Genelde programlar, ilk olarak ekranı temizleyerek, sonraki yazılacaklara temiz bir ekran hazırlar.
Burada dikkat edilecek şey CLS den bir önceki zemin rengi ne ise ekran o renk ile doldurulur. CLS den önce bir renk ayarı yapılmamışsa ekran siyah renk ile doldurularak temizlenir.

COLOR , 4
CLS
PRINT "Merhaba"
Değişkenlere Veri aktarmak

Veri tiplerini açıklarken değişkenlerden bahsetmiştik. Değişkenler, bilgisayarın aklında tutması gereken şeyleri aktarırız. Değişkenler bir harf ile başlayıp 40 karaktere kadar bir isim alabilir. İçinde ingilizce harf ve rakamların dışında semboller olursa kabul edilmez.

4KAT
MÜŞTERİ
PERSONEL NO
MEDENI_DURUMU

Yukardaki değişken için kullanılan isimler hata oluşturacaktır.

PI = 3.14
PRINT PI 

1. satırda PI değişkenine 3.14 rakamını aktardık. Sonraki aşamalarda PI sayısına bir sayı aktarmazsak program sonlana kadar o değeri aklında tutar. Ve biz bunu gerekli olduğunda kullanırız. Örneğin 2. satırda olduğu gibi.
Yukarda olduğu gibi değişkenlere veriyi direkt aktardığımız gibi bir fonksiyonun ya da işlemin sonucunu da aktarabiliriz.

SAYI = 125
KARE = SAYI * SAYI
PRINT KARE

1. satır artık yabancı gelmiyor size. SAYI değişkenine aklında 125 rakamını tut dedik. KARE değişkenine de SAYI değikenin tuttuğu rakamı kendisiyle çarp ve sonucunu aklında tut dedik. Bu arada SAYI değişkeninin değerinde hiçbir değişiklik olmaz. Değişiklik olabilmesi için aktarma işlemi olması gerekir. = işaretinin sağındaki değer veya işlem solundaki değişkene aktarılır. Yukarda olduğu gibi = in sağ tarafında SAYI nın kendisiyle çarpımından SAYI değişkeni etkilenmemektedir.

Değişkenlere değerler aktarılırken tanımlanan tipine uygun değerler aktarılmalıdır. Sınırını aşan veya uygun olmayan veri aktarımlar kabul edilmeyecektir. Aşağıdaki satırlar hata oluşturacaktır.

A% = 33652 'Sınırı aşmıştır
A& = 2154.43 ' Bu tür değişkenler küsurlu sayıları aklında tutamaz o yüzden sayıyı yuvarlayarak 2154 yapar. Bu satırda bilgisayar bir uyarı varmez.
A$ = 65000 ' String değişkenlere değerler " (çift tırnak) lar ile aktarılır
A# = "Merhaba" ' Bu tür değişkene string veri aktarılamaz

INPUT Komutu

Değişkenlere A = 45 gibi bir satır yazarak bir değer aktarabiliyoruz. Bazen program çalışırken değişkenlere programı kullanan kişinin veri aktarması istenebilir. INPUT komutu ile istediğimiz değişkenlere program çalışırken değer aktarılabilir.
INPUT kullanılırken; INPUT un ardından verilecek mesaj tırnaklar arasında yazılır sonra (,) veya (;) konulur ve klavyeden yazdıklarımızı aktaracağımız değişken ismi yazılır.

CLS
INPUT "ADINIZ " ; AD$
INPUT "YAŞINIZ " , YAS%
PRINT "Sayın " ; AD$ ; YAS% ; " yaşındasınız."  

Yaşımızı sorduğunda rakam dışında birşey yazarsak, bir uyarı ile aynı soruyu tekrar sorulur.

DÜŞÜN: Burada virgül ile noktalı virgülün farkı ne?

PRINT Komutu

Ekrana bir mesaj veya bir değişkenin değerini yada bir fonksiyon yada işlemin sonucunu yazdırmak için kullanılır. PRINT yazmak yerine yalnızca ? yazın.

CLS
PRINT 3 * 8 + 12 ' Sonuç 36 olarak ekranda görünecek
YASI = 32
PRINT "Yaşı = " ; YASI ; " dir"
A% = 15
B! = 3.14
ADI$ = "Mesut"
PRINT A% , B! , ADI$
SA$ = "Akcan"
PRINT ADI$ ; SA$

DÜŞÜN: PRINT de kullanılan virgül ve noktalı virgülün farkı ne?
PRINT komutunda bir işlemin sonucunu da yazdıracağımızı söylemiştim.

PRINT 12+33 ' Ekrana toplamı(45) verir
PRINT 125+48*10 ' 605 yazar. Öncelik sırası: Parantez içi, * / + - dir
PRINT 12-(80/4-23)+54/9 ' sonuç: 21  ??
PRINT 1 + 1 ' Toplam olan 2 çıkar
PRINT "1" + "1" 
  ' 11 çıkar. Çift tırnak içindeki sayılar sayı olarak görülmez.
  ' Burada sayı olmadığı için toplama işlemi değil
  ' tırnaklar içindekileri birleştirme işlemi uygulanır
PRINT "QUICK" + "basic" ' QUICKbasic
PRINT 8 + "elma" ' !!! Hata !!!
PRINT "8" + "elma" ' 8elma
PRINT 8 ; "elma" ' 8 elma
PRINT 8/2 ; "elma"  ' 4 elma
Uygulama
CLS
PRINT "Çıkmak için 0 yaz"
basla:
INPUT "Bir sayı yaz "; SAYI
IF SAYI = 0 THEN END
CLS
PRINT "Verdiğiniz sayı "; SAYI
PRINT SAYI; " 'nın karesı "; SAYI ^ 2; " dır."
PRINT SAYI; " 'nın küpü "; SAYI ^ 3; " dır."
GOTO basla

PROBLEM:
Dairenin çevresini hesapalyıp ekrana yazan bir program yazın. Dairenin çevresi = Daire çapı * Pi sayısı

 

Quick-Basic Kursu
Bölüm 4: Kontrol blokları

Programlama dillerinde döngüler ve akış kontrol komutları çok sık kullanılır. Programları program yapan esas kısımlar bu komutlarla sağlanır. Qbasicde diğer programlama dillerindekine benzer yapıda döngüler ve mantıksal karşılaştırmalar yapılabilir.

IF ... THEN ... ELSE

Mantıksal karşılaştırma için kullanılır. Karşılaştırma işlemin sonucunda bir değer döner bu değer ya mantıksal DOĞRU dur ya da mantıksal YANLIŞ. Lise 1 deyken matematik dersinde 1 ve 0 lar ile, doğru ve yanlışlar ile işlemler yapardık. Birçok kişide ne işe yarıyor bunlar diye söylenip dururlardı. Demekki bir gerekliliği varmış. İşte onlar burada gerekecek, isterseniz MANTIK ile ilgili kısımları bir daha gözden geçirin. :)

Mantıksal karşılaştırma için basit bir örnek:

IF A = 40 THEN B = 40

Burada A değişkenin değeri 40 ise B nin değeri de 40 olacaktır. Eğer A nın değeri 40 dan farklı ise bu satırın hiçbir etkisi olmayacaktır.

Bir başka kullanımı:

A = 25
IF A > 40 THEN M$ ="Sayı 40 dan  büyük" ELSE M$= "Sayı 40 dan küçük"
PRINT M$

Üstte A değişkeninin değerinin 40 dan büyük olup olmadığı kontrol ediliyor. Mantıksal karşılaştırmanın sonucunda ancak iki değer dönebilir. DOĞRU veya YANLIŞ. Doğru olması durumunda THEN den sonraki işlem yapılır, YANLIŞ olması durumunda ise ELSE den sonraki işlem. A ya 25 aktardığımız için A>40 mantıksal karşılaştırmanın sonucu YANLIŞ olacaktır. Çünkü 25, 40dan büyük değil. Bu durumda M$ a "Sayı 40 dan küçük" değeri aktarılır.

DÜŞÜN: Üstteki programı denedikten sonra A = 40 olsaydı sonuç ne olurdu? diye düşünüp cevabı bulmaya çalışın. Sonra Qbasicde deneyerek düşündüğünüzü kontrol edin.

IF A = 40 ....  ' A , 40 a eşit mi?
IF A > 40 ....  ' A , 40 dan büyük mü?
IF A < 40 ....  ' A , 40 dan küçük mü?
IF A <> 40 .... ' A , 40 a eşit değilse
IF A <= 40 .... ' A , 40 a eşit ya da 40 dan küçük mü?
IF A >= 40 .... ' A , 40 a eşit ya da 40 dan büyük mü?
IF A      ' A nın değeri 0 dan farklı mı?
IF NOT A  ' A nın değili DOĞRU mu? 

IF ile karşılaştırma yaptığımızda dönen değerlere göre çok sayıda komut yürüteceksek aşağıdaki yapıyı kullanırız. Bu şekilde kullanımda karşılaştırma bloğunu bitiren END IF kullanmak zorundayız.

IF A > 40 THEN
        'doğruysa yapılacaklar
        ....
        ....
ELSE
        'Yanlışsa yapılacaklar
        ....
        ....
END IF

Örnek :

INPUT "ADINIZ " ; AD$
IF AD$ = "MESUT" THEN
        PRINT "SİZİN ADINIZ MESUT"
ELSE
        PRINT "SİZİN ADINIZ MESUT DEĞİL"
END IF
İç içe IF.
INPUT A
IF A > 40 THEN
        IF A < 60 THEN
                PRINT "SAYI 40 ile 60 arasında"
        ELSE
                PRINT "SAYI 60 yada 60dan büyük"
        END IF
ELSE
        IF A = 40 THEN
                PRINT "SAYI 40a eşit"
        ELSE
                PRINT "SAYI 40dan küçük"
        END IF
END IF
Mantıksal karşılaştırmalar

Şimdiye kadar bir satırda bir değişkeni karşılaştırdık. Bazen birkaç değişkenin karşılaştırılıp sonucunun alınması gerekebilir.

INPUT A
IF A>10 AND A<20 THEN PRINT "SAYI 10 ile 20 arasında"
INPUT A
IF A<10 OR A>50 THEN PRINT "SAYI 10 ile 50 arasında değil"
' yani sayı 10 dan küçük ya da 50 den büyük

Mantıksal karşılaştırmalarda kullanılacak terimler: AND , OR , XOR , EQV, IMP, NOT

Değer

Mantıksal karşılaştırma ve sonucu

X

Y

NOT
X

X
AND
Y

X
OR
Y

X
XOR
Y

X
EQV
Y

X
IMP
Y

1

1

0

1

1

0

1

1

1

0

0

0

1

1

0

0

0

1

1

0

1

1

0

1

0

0

1

0

0

0

1

1

1 -> Mantıksal Doğru
0 -> Mantıksal Yanlış
Bu terimlerden faydalanarak bitsel karşılaştırma da yapılabilir.
PRINT (155 AND 160)
yazdığımızda 128 sonucunu alırız. Çünkü 155 in 2 li sayı düzenindeki karşılığ 10011011, 160 ınki ise 10100000. İkisini altalta yazıp bitlerini AND ile karşılaştırdığımızda

10011011
10100000
--------
10000000

çıkar. O da 128 e eşittir. Desimal sayıları 2 li sayıya çevirmek için Hesap makinasını Bilimsel görünüme getirerek kullanabilirsiniz.. Dec = Decimal(10 lu sayı), Bin = Binary (2 li sayı), Hex = Hexadecimal (16 lı sayı)

ELSEIF, SELECT CASE

IF in bir başka kullanımı

INPUT "1 ile 3 arasında sayı girin " ; A
IF A = 1 THEN
        PRINT "SAYI = 1"
ELSEIF A = 2 THEN
        PRINT "SAYI = 2"
ELSEIF A = 3 THEN
        PRINT "SAYI = 3"
ELSE
        PRINT "HATALI SAYI"
END IF

Bunun yerine buna benzer yapıya sahip anlaşılırlığı ve kodlaması kolay olan SELECT CASE yapısı kullanılır.

INPUT "1 ile 3 arasında sayı girin " ; A
SELECT CASE A
        CASE 1
               PRINT "SAYI = 1"
        CASE 2
               PRINT "SAYI = 2"
        CASE 3
               PRINT "SAYI = 3"
        CASE ELSE
               PRINT "HATALI SAYI"
END SELECT
 
 

Quick-Basic Kursu
Bölüm 5: Döngüler

Tekrar edilen işlemler için döngüler kullanılır. Böylece bilgisayarın sürekli yapacağı işlemler için aynı komutları bir daha yazmak zorunda kalmayız.

GOTO döngüsü

En basit döngü GOTO ile yapılan döngüdür.

basla:
A = A + 1
PRINT A
GOTO basla

Yukardaki program bir sonsuz döngü oluşturur. Dordurmak için CTRL-PAUSE tuşlarına basınız. Aşağıdaki şekilde değişiklik yaparsak döngüyü kontrol altına almış oluruz.

basla:
A = A + 1
IF A>20 THEN END
PRINT A
GOTO basla

PROBLEM 1 : 1 den 30 a kadar olan çift sayıların karelerini ekrana yazan bir program yazın.

FOR ... NEXT döngüsü

Belirli sayılarda işlemlerin tekrar etmesi için kullanılır.

FOR N = 1 TO 25
        PRINT N
NEXT N

1 den 25 e kadar olan sayıları yazacaktır. Her döngüde N değişkeninin değeri 1 artacaktır. Eğer ilk satırı

FOR N = 1 TO 25 STEP 4 

yapacak olursak. N nin ilk değeri 1 olacak sonra her seferinde üzerine 4 eklenerek devam edecektir.

FOR N = 25 TO 1 STEP -1

yazılacak olursa 25 den 1 e doğru N nin değeri her seferinde 1 azaltılır.
NEXT in arkasına değişkeni yazmak şart değildir ama okunurluğu kolaylaştırmak için yazmakta fayda vardır.
FOR ları içi içe koyarak da kullanılabilir. İçerdeki FOR un NEXT i dışardakinin NEXT inden sonra gelmemesine dikkat etmelisiniz.

FOR N = 1 TO 10
        FOR M = 1 TO 4
                PRINT N * M ,
        NEXT M
        PRINT
NEXT N

FOR döngüsünden çıkma gereği olursa EXIT FOR ile çıkılabilir.

PROBLEM 2 : Problem 1 i FOR..NEXT dögüsüyle yapın

DO ... LOOP döngüsü
DO
        PRINT A
        A = A +1
LOOP

Bu da sonsuz döngü oluşturacaktır. Döngüyü kırmak, kontrol altına almak için çeşitli yollar var

EXIT DO ile döngüden çıkmak:

DO
        IF A > 40 THEN EXIT DO
        PRINT A
        A = A +1
LOOP

WHILE kullanarak döngüyü kontrol altına almak:

'1 . program 
CLS
DO WHILE A < 40 ' A, 40 dan küçükİKEN döngüye devam 
        PRINT A
        A = A + 1 
LOOP
'2 . program
CLS
DO 
        PRINT A
        A = A + 1
LOOP WHILE A < 40 ' A, 40 dan küçükİKEN döngüye devam

Yukardaki iki programı denediğinizde hiçbir fark göremeyeceksiniz. Şimdi ilk satırlarına A = 45 komutunu ekleyip deneyin ve farkı anlamaya çalışın. Eğer WHILE ı LOOP un yanına koyarsak döngüde şart aranmaksızın en az 1 kere döner. DO nun yanına konulursa döngü başlamadan şart kontrol edilir, şart uygun değilse döngü gerçekleşmez..

UNTIL kullanarak döngüyü kontrol altına almak:

CLS
DO UNTIL A > 40 ' şart DOGRU olanA KADAR dön. A , 40 dan büyük olana kadar devam
        PRINT A
        A = A +1
LOOP

WHILE için verdiğim açıklamalar bunda da geçerli UNTIL i DO nun yanına yada LOOP un yanına koyabiliriz.

Kısaca WHILE, şartın DOGRU olmasında; UNTIL, şartın YANLIŞ olmasında döngüye devam eder.

PROBLEM 3: Problem 1 i DO..LOOP dögüsüyle yapın

WHILE ... WEND döngüsü
CLS
WHILE A < 40 ' A , dan küçük İKEN devam 
        A = A + 2
        PRINT A
WEND

WHILE WEND, DOO LOOP un bir alternatifidir. Ama DO LOOP kadar kullanışlı değildir. Çünkü DO LOOP da karşılaştırma şartını başta veya sonda verebiliyoruz.

PROBLEM 4: Problem 1 i WHILE..WEND dögüsüyle yapın

Quick-Basic Kursu
Bölüm 6: Diziler

Dizilere neden ihtiyaç duyulur? Çünkü binlerce değişkeni tanımlamak uzun sürer ve kullanışlı olmaz. Örneğin 12 ay için ayrı ayrı değişken tanımlamak yerine yalnız bir boyutlu değişken tanımlamak yeterlidir.
DIM AY(12) gibi.

Dizi tanımlama. (Hafızada yer açma)
DIM AY1 AS STRING
DIM AY2 AS STRING
DIM AY3 AS STRING
..
..

Gördüğünüz gibi bu uzayıp gidecek. Bunun yerine

DIM AYLAR(12) AS STRING 

yeterli olacaktır. Bu tanımladığımız dizinin kullanımı

AYLAR(1) = "OCAK"   : AYLAR(2)  = "ŞUBAT" 
AYLAR(3) = "MART"   : AYLAR(4)  = "NİSAN"
AYLAR(5) = "MAYIS"  : AYLAR(6)  = "HAZİRAN"
AYLAR(7) = "TEMMUZ" : AYLAR(8)  = "AĞUSTOS"
AYLAR(9) = "EYLÜL"  : AYLAR(10) = "EKİM"
AYLAR(11) = "KASIM" : AYLAR(12) = "ARALIK"
buay% = VAL(LEFT$(DATE$, 2))
PRINT AYLAR(buay%)
OPTION BASE, LBOUND, UBOUND

Normalde, yani belirtmezseniz, boyutlu değişken tanımladığınızda; ilk boyut no 0 (Sıfır) olur. DIM A(10) dediğimizde 10 değil 11 adet değişken tanımlamış oluruz. Ama istersek ilk boyut numarasını kendimiz belirleyebiliriz.(Tabii 1 yada 0 olarak)
OPTION BASE 1
yazdığımızda bundan sonra tanımlanacak boyutlu değişkenler yani dizilerin ilk boyut numarası 1 olur.
DIM A(10) yazarsak 10 değişken tanımlamış oluruz.

Tanımlanmış bir dizinin ilk boyut numarasını öğrenmek için LBOUND, son boyutunu öğrenmek için UBOUND kullanılır.

OPTION BASE 1
DIM A(10) AS INTEGER
PRINT "İlk boyut no: " ; LBOUND(A)
PRINT "Son boyut no: " ; UBOUND(A)

Örnek:

CLS
DIM A(10) AS INTEGER
FOR N = 0 TO 10
        A(N) = N * 10
NEXT
 
FOR N=LBOUND(A) TO UBOUND(A)
        PRINT A(N) ,
NEXT

Bir başka özellikde boyut numaralarını kendimiz belirleyebilmemiz.

DIM A(10 TO 20) yazdığımızda A nın ilk boyut numarası 10 son numarası 20 olacaktır. Bundan sonra A(5) = 40 ya da A(22) = 65 yazacak olursanız hata oluşacaktır. Çünkü değişken dizi sınırları dışında. (Subscript out of range)

Çok boyutlu değişken tanımlama

Şimdiye kadar tek boyutlu değişkenler tanımladık.
DIM A(5, 6, 10)
yazarak üç boyutlu bir dizi oluşturabiliriz. Buna göre bellekde ( 5 x 6 x 10 ) + 3 adet değişken için yer açıldı. +3 adet 0. değişkenler için. Yine bir başka kullanım olarak
DIM A(5, 3 TO 12, 5 TO 15) gibi bir tanımlama da yapabiliriz.

OPTION BASE 1
CLS
DIM SAYI(10,10) AS INTEGER
FOR N = 1 TO 10
        FOR M = 1 TO 10
               SAYI(N,M)=N * M
        NEXT
NEXT
'Çarpım tablosu bellekte oluştu
INPUT "1. sayıyı girin " ; A
INPUT "2. sayıyı girin " ; B
'Çarpım tablosundan sonucu alıyoruz
'Dikkat edin verilen sayıları çarpmıyoruz
PRINT SAYI(A,B)
REDIM, ERASE

Diziler için bellkete ayırdığımız alanı genişletmek için kullanırız.

CLS
REM $DYNAMIC
' üst satır, değişkenlerin dinamik olacağını belirtir.
DIM A(15)
PRINT UBOUND(A)
REDIM A(30) ' Yeniden boyutlandı
PRINT UBOUND(A)
ERASE A ' Bellekde kapladığı alanı boşalt, sil
PRINT UBOUND(A) ' HATA. Çünkü dizi bellekden atıldı

Quick-Basic Kursu
Bölüm 7: Goto, Gosub, Sub, Function

Programlarımızdaki kodlar arttıkça veya programın işlevleri arttıkça bazı tekrar eden işlemler gerekli olabilir. Ya da içinde birkaç şey değiştirerek aynı işlemler yapmak gerekir. Bunun için alt programlar kullanılır. Ayrıca Fonksiyonlar ve Alt programlar kullanmak programınızın okunurluğunu kolaylaştıracaktır.

GOTO

Goto komutunu daha önce döngü oluştururken de görmüştük. Aslında Goto ve gosub komutlarına çok az ihtiyaç duyacaksınız. Sadece diğer basic dillerine uyumlu olsun diye konulmuş. Program kodunun herhangi bir yerinde işleyişini bırakıp başka bir noktadan çalışması için kullanılır. Goto ve ardında bir etiket yada satır numarası yazılmalıdır.

PRINT "MERHABA DÜNYA"
GOTO 10
PRINT "BU SATIRI GÖREBİLECEK MİSİNİZ?"
10 PRINT "PROGRAM SONA ERDİ"
END
GOSUB

Gosub ile alt programlar oluşturabiliriz. Gosub 'u da kullanmanıza gerek yoktur. Onun yerine SUB kullanmak daha iyi olacaktır. Gosub da goto gibi programın işleyişi bırakıp başka bir noktadan başlaması sağlanır. Fakat farklı olarak RETURN komutunu görünce kaldığı yere geri dönerek çalışmasına devam eder. Alt programa, istediğimiz yerden istediğimiz kadar atlayabiliriz. GOSUB ve ardından bir etiket ya da satır numarası yazılmalı. Gosub ile atladığımız yerde RETURN bulunmazsa geri dönüş olmaz.

CLS
GOSUB CIZGICIZ 
PRINT "MERHABA DÜNYA"
GOSUB CIZGICIZ
PRINT "QUICK BASIC"
GOSUB CIZGICIZ
PRINT "PROGRAMLAMA DİLİ"
GOSUB CIZGICIZ
END ' programı burada sonlandırmazsak
    ' alt program da çalışır ve hata oluşur
 
CIZGICIZ:
PRINT "----------------"
RETURN
'2. program
CLS
PRINT "çift sayılar(1-100)"
DO
        A = A + 1
        IF (A MOD 2) = 0 THEN GOSUB CIFTSAYI
LOOP UNTIL A = 100
END
 
CIFTSAYI:
PRINT A;
RETURN
SUB

GwBasic gibi diğer dillerde Sub veya Function özellikleri yoktur. O yüzden program kodları büyüdükçe okumak ve kontrol etmek epey zor olacaktır. İlk başta Sub ve Functionların faydalarını anlamak zor olabilir. Alıştığınızda bir defa yapacağınız işlemler için bile bunları kullacaksınız belki de.

Sub yapısı: [ ile ] arası şart değil gerekirse kullanılır

SUB altprogram_ismi (varsa parametreleri) [STATIC]
..
..
[EXIT SUB] ' alt programdan çıkılmak istenirse
..
..
END SUB ' alt program sonu

Bir sub veya function eklemek için EDIT menüsündeki New Sub... ya da New Function dan faydalanabilirsiniz ya da direkt yazabilirsiniz. Alt programı eklediğinizde bunlar ayrı bir sayfa olarak görünür. Sub veya Function listesini göemek ve istediğinizi incelemek için F2 tuşuna basın.

Uygulama:

Menüden File / New Program ile yeni bir projeye başlayın. SUB yaziyaz yazıp ENTER' e bastığımızda hemen iki alt satıra END SUB yazıldığını göreceksiniz. Kodlarımızı SUB ile END sub satırları arasında olmalı. Arasına şunları ekleyin

PRINT "================="
PRINT "==   MERHABA   =="
PRINT "================="

F2 tuşuna basın Altprogramları listeleyen ekran gelecek Untitled kaydedilmemiş basic dosyamız oluyor ve alt programların anası oluyor kaydettiğimide bu isim değişir. yaziyaz ise alt program ismi. Alt tarafta seçili olan ile ilgili işlemler var.
Edit in Active: Düzenlemek için aç
Edit in Split: Düzenleme ekranına ayrı bir bölme olarak aç
Delete : Modülü yani alt programı sil
Move : Modülü açık olan başka bir basic dosyaya taşı. Qbasic de aynı anda çok sayıda dosya açılabilir.

Siyah şerit Untitled üzerindeyken ENTER'e basın.
Şimdi oluşturduğumuz altprogramı çağıracağız. Çağırmak için yalnızca
yaziyaz
yazabiliriz. Ama programın okunurluğu açısından
CALL yaziyaz
ile çağırmak en doğrusu olacaktır. F5 ile programımızı çalıştırdığımızda çalıştığını göreceksiniz.
Kodları şu hale geririp çalıştırın. Buradaki kodlama kolaylaığını öğrenmeye çalışın

CLS
yaziyaz
yaziyaz

Parametre kullanımı:

Alt programımız çalışırken ona bazı değerler gönderip farklı şekillerde çalışmasını sağlayabiliriz. Az önceki SUB da parametre yoktu. Paramatre veri değişken tipinin ne olacağını belirtmekte fayda var. Belirtilmezse SINGLE olarak kabul edilir. Bazı örnekler:

SUB ekranayaz (satir AS INTEGER, sutun AS INTEGER)
aynı satırı şöyle de yazabiliriz
SUB ekranayaz (satir%, sutun%)

'Örnek program:
CLS
cizgi$ = STRING$(60, "-")
yaziortala 1, cizgi$
yaziortala 2, "Merhaba"
yaziortala 3, "Bugün Qbasic de Goto, GoSub, Sub ve Function'u öğrendim"
'farklı bir kullanım: CALL ile alt programı çağırma 
CALL yaziortala(5, "Qbasic Öğrenmek çok zevkli") 
yaziortala 6, cizgi$
 
SUB yaziortala (satir AS INTEGER, yazi AS STRING)
        uzunluk% = LEN(yazi)
        LOCATE satir, (80 - uzunluk%) / 2
        PRINT yazi
END SUB

PROBLEM:

1.      Yukardaki programı alt program kullanmadan yapmaya çalışın.

2.      Alt program kullanarak sağa yaslı yazı yardırmayı deneyin
yazisagayasla 4 , "Merhaba"
gibi

FUNCTION

Functionların yapısı SUB lar gibidir. Yukarda açıklananlar bunda da geçerli. Function'un farkı verilen değerler üzerinde işlem yapıp bir sonuç ile geri döndürmesi. Qbasic in kendi yapısındaki birçok komutun Function özelliği vardır. Örneğin : X = SQRT(81) yazdığımızda verilen 81 sayısı SQRT(karekök alma) fonksiyonu tarafından işlenir ve sonuç olarak 9 döner. Bu sonuç X değişkenine atanır.

Şimdi biz kendimiz bir fonksiyon oluşturalım

X = karesi(15)
PRINT X
PRINT "20 nin karesi = "; karesi(20)
PRINT "1.4 ün karesi = "; karesi(1.4)
FUNCTION karesi (sayi AS DOUBLE)
        DIM sonuc AS DOUBLE
        sonuc = sayi * sayi
        karesi = sonuc
END FUNCTION

Function da tek satır ile sonucu alabilirdik. Anlaşılır olması bakımından uzun yazıldı. Kısa olarak:

FUNCTION karesi (sayi AS DOUBLE)
 karesi = sayi * sayi
END FUNCTION
'2. örnek:
CLS
PRINT enbuyuksayi(15, 25)
FUNCTION enbuyuksayi (sayi1, sayi2)
         IF sayi1 > sayi2 THEN
                enbuyuksayi = sayi1
         ELSE
                enbuyuksayi = sayi2
         END IF
END FUNCTION
'3. örnek
DIM sayi(5)
CLS
sayi(0) = 20
sayi(1) = 30
sayi(2) = 66
sayi(3) = 88
sayi(4) = 36
sayi(5) = 23
x = ortalama(sayi())
PRINT x
FUNCTION ortalama (sayilar())
        FOR n = LBOUND(sayilar) TO UBOUND(sayilar)
                t = t + sayilar(n)
        NEXT
        ortalama = t / n
END FUNCTION
STATIC, SHARED, COMMON

STATIC:
Bazen tanımladığımız değişkenin değerini kaybetmeden SUB ve FUNCTION içinde de kullanmak gerekli olabilir. Alt program içinde değişkeni STATIC ile tanımlarsak değişken değerini kaybetmez aklında tutar. Yoksa her fonksiyon ve sub başlangıcında tanımlanan değişkenlerin değerleri sıfırlanır. Örnek:

CLS
yaziortala "merhaba"
yaziortala "Qbasicde Function ve Sub Kullanmak kodlamayı kolaylaştırıyor"
yaziortala "Öğrenmem gereken daha çok şey var sanırım."
SUB yaziortala (yazi AS STRING)
        STATIC satir AS INTEGER
        satir = satir + 1
        LOCATE satir, (80 - LEN(yazi)) / 2
        PRINT yazi
END SUB

Burada dikkat ederseniz SUB a satır numarasını göndermedik 0 dan başladı her SUB başlamasında 1 arttı ve yazılar alt alta ortalı olarak yazıldı. STATIC i DIM ile değiştirin farkı göreceksiniz.

SHARED:
Bazen de bir değişkenin değerini kaybetmeden tüm SUB ve FUNCTION içinde geçerli olması istenebilir. Buna değişkeni global (genel, her yerde geçerli) tanımlama diyoruz. Alt program içinde yapılan değişken tanımlamaları Local tanımlama(yerel, sadece alt program içinde geçerli)diyoruz. Global tanımlamayı Ana program içinde yapmalıyız

DIM SHARED satir AS INTEGER
CLS
satir = 2
LOCATE satir: PRINT "Merhaba"
yaziortala "Qbasic öğreniyorum"
satir = satir + 1
LOCATE satir: PRINT "Çalışan başarır"
yaziortala "İstiyorsan başarırsın"
SUB yaziortala (yazi AS STRING)
        satir = satir + 1
        LOCATE satir, (80 - LEN(yazi)) / 2
        PRINT yazi
END SUB
'basit birnek daha
DIM SHARED a
CLS
a = 5
PRINT a
CALL karesi
PRINT a
PRINT ussu(3)
PRINT a
PRINT ussu(4)
SUB karesi
        a = a * a
END SUB
FUNCTION ussu (kuvvet%)
        a = a ^ kuvvet%
        ussu = a
END FUNCTION

COMMON: 

Common, shared gibidir ama daha genel bir tanımlama yapılır. Qbasic ile CHAIN komutuyla başka bir bas dosyaya bağlantı kurabiliriz. Değişken Common ile tanımlama yapılırsa değeri bağlantı kurulan bas dosyada da geçerli olur. Zaten başlangıçta tek bas dosya üzerinde çalışacağınızdan bu gerekli olmayacak.

Quick-Basic Kursu
Bölüm 8: Karakterlerle ilgili işlemler

Kursun bu bölümünde karakterle ilgili komutları inceleyeceğiz.

PRINT

Verileri ekrana yazdırmak için kullanıyoruz.
PRINT ifade yada değişken , ;
ifade olarak bir fonksiyon ya da matematiksel işlem olabilir. Virgül verileri belli atlama noktalarına dizerek yazar, Noktalı virgül ise verileri boşluk bırakmadan yazdırır.

A$ = "Quick" : B$ = "Basic" : C$ = "v4.5"
PRINT A$ , B$ , C$
PRINT A$ ; B$ ; C$
PRINT A$ + B$ + C$ ' üstteki satırla aynı işi görür
PRINT A$ ; " " ; B$ ; " " ; C$
PRINT LEN(A$)
PRINT (4545 - 256) * 24 / 2 ^ 3 + 20

Matematiksel işlem uygulandığında işlem öncelik sırası: parantez içi , ^ , * ve / , + ve -
PRINT 10 - 3 * 2 işleminin sonucu 14 değil 4 dür. Çünkü * öncelikli olduğundan 3 * 2 işlemi önce yapılır. 10 dan 3 ü çıkarıp 2 ile çarpmak isterseniz
PRINT (10 - 3) * 2 olarak yazmalısınız.

TAB komutu ile sonraki yazacağımız metnin başlangış kolonunu belirtiriz
PRINT "1 - " ; TAB(5) ; "Qb 4.5"; TAB(20); "DOS"
PRINT "2 - " ; TAB(5) ; "Visual basic " ;TAB(20); "WIN"

SPC komutu ile de arada bırakılacak boşluk belirtilir.
PRINT "1 - " ; SPC(3) ; "Qbasic"; SPC(4); "DOS"
PRINT "2 - " ; SPC(5) ; "Visual basic" ; SPC(4) ;"WIN"

PRINT USING

Metin ya da rakamları belirtilen biçimde yazar. Biçimleme için özel karakterler kullanılır.

Sayısal değerler için

# : sayının konumunu

. (nokta) : küsuratı

, (virgül) : binler ayıracı

+ (artı) : sayının negatif veya pozitif işaretinin konumu

- (eksi) : negatif sayılarda, sayıdan sonra - konur

$$ : Dolar işareti ekler. PRINT USING "$$###.##" ; 458.62

** : Rakamların başına * koyarak her rakamın aynı genişlikte olmasını sağlar

**$ : ** ve $ bileşik

^^^^ : Sayıları üssü olarak gösterir. PRINT USING "##.##^^^^"; 234.56

Sözel değerler için

& : Değişkenlerin yerleştirileceği yeri belirler
PRINT USING "Gülen & ile ağlayan &"; "ayva"; "nar"

! (ünlem) : Metnin ilk karakterini verir
PRINT USING "!!"; "Mesut"; "Akcan"

_ (alt eksi) : Bu tablodaki özel karakterlerden birini yazdırmak istersek önüne _ konur
PRINT USING "! 1500_!"; "qbasic"

Herhangi bir karakter : (Bu tabloda verilen karakterlerin dışında karakter) Olduğu gibi aynı konumda yazılır

DIM AY AS DOUBLE
CLS
AY(0) = 454121.3654 : AY(1) = -6845.587 : AY(2) = 982.6
FOR N% = 0 TO 2
        PRINT USING "###,###.##+"; AY(N%)
NEXT
STR$

Bellekte sayı olarak tutulan bir değeri metne(STRing) dönüştürür.
STR$(sayısal değer ya da değişken)
Örnek:

CLS
A% = 1986 : B% = 15
PRINT "Bu yıl ";
PRINT A% + B%;
PRINT " yılındayız"
PRINT "Bu yıl ";
PRINT STR$(A%) + STR$(B%);
PRINT " yılındayız"

Yukarıdaki kodları denediğinizde A% ile B% yi toplayabilirken bunu STRing e yani metne dönüştürdüğünde toplamak yerine birleştirdi. Çünkü daha önce PRINT komutunda da görmüştük string verilerde sayısal işlem yapılamaz.

PRINT 1 + 1 ' sonuç: 2
PRINT "1" + "1" 'sonuç: 11 , ama sayısal 11 değil
VAL

Bellekte metin olarak tutulan rakamı, sayısal işlemlerde de kullanılabilecek halde sayı değerine(VALue) dönüştürür
VAL(sözel değer ya da değişken)
Örnek:

INPUT "Doğum yılınız"; T$
PRINT "Yaşınız "; 2001 - VAL(T$)

Örnekte metin olarak girdiğimiz T$ sayısal işleme sokulamaz VAL ile dönüşüm sağlanarak sayısal işlem yapılmıştır.

STRING$

Aynı karakterden çok sayıda kullanmanız gerekiyorsa kullanılır.
STRING$(sayı,karakter)

PRINT STRING$(2000,"*") ' ekranı * ile doldurur
PRINT STRING$(80,"=") ' Bir satırı = ile doldurur
SPACE$

Değişkene istenilen sayı kadar boşluk karakteri aktarır

FOR I=1 TO 5
 X$=SPACE$(I)
 PRINT X$;"MESUT"
NEXT
ASC

Bir karakterin ASCII kod karşılığını verir
ASC(karakter)

PRINT ASC("A")
PRINT ASC("MESUT") 'bu satırda sadece ilk harf olan M harfi dikkate alınır
CHR$

ASCII koduna denk gelen karakteri(CHaRacter) verir.
CHR$(ascii kod)

PRINT CHR$(65) 'ekrana A çıkar
FOR N% = 32 TO 255 ' 32 den 255 e kadar olan 
 PRINT CHR$(N%) 'ascii karakterleri yaz
NEXT
HEX$ , OCT$

HEX$: Verilen sayıyı 16'lık sayı sistemine(HEXadecimal) dönüştürür
HEX$(sayı)

OCT$: Verilen sayıyı 8'lik sayı sistemine(OCTal) dönüştürür
OCT$(sayı)

PRINT HEX$(2001) ' 7D1
PRINT OCT$(2001) ' 3721
INKEY$

Klavyeden girilen karakteri okur. ESC tuşunun ASCII kodu 27 dir.

DO
 A$ = INKEY$
 LOCATE 5, 5: PRINT A$
LOOP UNTIL A$ = CHR$(27) 'Çıkmak için ESC tuşuna basın

2. örnek: Çok basit bir editör

DO
 A$ = INKEY$
 PRINT A$;
LOOP UNTIL A$ = CHR$(27)
LCASE$ , UCASE$

LCASE$: Verilen metni küçük harflere(Lower CASE) dönüştürür.
UCASE$: Verilen metni büyük harflere(Upper CASE) dönüştürür. Her iki komutta da yalnızca İngilizce harfler dikkate alınır.

PRINT LCASE$("MERHABA Dunya")
PRINT LCASE$("Merhaba Dunya")
LEFT$ , RIGHT$ , MID$

LEFT : Metnin belli sayıda sol(LEFT)undaki karakterleri alır
RIGHT: Metnin belli sayıda sağ(RIGHT)ındaki karakterleri alır
MID: Metnin belli sayıda orta(MIDDLE)sındaki karakterleri alır

PRINT LEFT$("QuickBasicV4.5",5)
PRINT LEFT$("QuickBasicV4.5",4)
PRINT MID$("QuickBasicV4.5",6,5) '6. karakterden itibaren 5 karakter

MID$ ın farklı kullanımı: Burada verilen metin içinde değişiklik yapar

A$ = "O adam 25 yaşında"
MID$(A$,3)="kadın"
PRINT A$
LEN

Verilen metnin kaç karakterden oluştuğunu verir

A$ = "MESUT AKCAN"
G% = LEN(A$)
PRINT G% '11 , çünkü boşluklar da sayılır
FOR N%=1 TO G%
 PRINT LEFT$(A$,N%)
NEXT
LTRIM$ , RTRIM$

LTRIM$: Metnin solundaki boşlukları siler
RTRIM$: Metnin sağındaki boşlukları siler

PRINT LTRIM$(RTRIM$("         MESUT AKCAN     "))

Quick-Basic Kursu
Bölüm 9: Rakamlarla ilgili işlemler

ABS

Verilen sayının mutlak(ABSolute) değerini verir. Sayı negatif ya da pozitif olsa da sonuç pozitif olur.

PRINT ABS(-127)
PRINT ABS(254)
INT

Sayının tam kısmını verir. Sayı negatif ise bir küçük sayıyı verir.

A = 12.86: B = - 12.86
PRINT INT(A) , INT(B)
FIX

Sayının sıfıra yakın olan tam kısmını verir.

A = 45.9: B = -45.1: C = -45.8
PRINT FIX(A), FIX(B), FIX(C)
RANDOMIZE

Rastgele sayı üreticisini hazırlar.

RND

0 ile 1 arasında rastgele bir sayı üretir. RND komutu program her çalıştırılışında aynı sayıları üretir. Bundan kurtulmak için aşağıda verilen örnekte olduğu gibi RND den önce RANDOMIZE TIMER çalıştırılır. TIMER o anki saate göre saniye cinsinden bir sayı üretir

DEFINT A-Z
RANDOMIZE TIMER: CLS
rs = RND * 10 + 1
PRINT "1 - 10 arası bir sayı girin ";
10 INPUT s
a = a + 1
IF s < 1 OR s > 10 THEN PRINT "!! hatalı sayı !!": GOTO 10
IF s <> rs THEN PRINT "Bilemediniz, tekrar deneyin...": GOTO 10
PRINT a; "denemede bildiniz..."
DÖNÜŞTÜRME FONKSİYONLARI

Bellekde değişken değeri olarak tutulan sayıyı farklı formatlara dönüştürmek için bazı fonksiyonlar kullanılır.
CDDBL : Sayıyı DOUBLE formata dönüştürür.

A% = 15454 ' Bellekte 2 baytlık yer tutuyor
B# = CDBL(A%) ' Şimdi 8 baytlık Double formata dönüştü ve B değişkenine aktarıldı
PRINT LEN(A%), LEN(B#)

CINT : Sayıyı INTEGER formata dönüştürür. Sayı küsurlu ise; küsur .4 den büyükse yukarı değilse aşağı yuvarlanır ve küsur atılır.

A = 1245.85 : PRINT CINT(A)

CLNG : Sayıyı LONG formata dönüştürür. Sayı küsurlu ise CINT gibi.

CSNG : Sayıyı SINGLE formata dönüştürür

MATEMATİKSEL FONKSİYONLAR

TAN : Radyan olarak verilen açının TANjantını verir.

ATN : Radyan olarak verilen açının ArkTaNjantını verir.

PI = 4 * ATN(1)
PRINT PI

COS : Radyan olarak verilen açının kosinüsünü verir. Radyanı dereceye dönüştürmak için pi / 180 ile çarpın.

PI = 3.141593 : D = 30 ' derece
R = D * (PI / 180)
PRINT COS(R)

SIN : Radyan olarak verilen açının sinüsünü verir.

EXP : e sabitinin (~ = 2.718282) üstünü alır

LOG : Sayını doğal LOGaritmasını hesaplar.

MOD : İki sayının bölümü sonucunda kalanı verir. A = 45682 : PRINT A MOD 4 ' A nın 4 e bölümünde kalan sayı.

SGN : Sayının işaretini belirtir. Sayı; 0 ise 0, pozitif ise 1, negatif ise -1 değerini verir. ? SGN(-28)

SQR : Sayını karekökünü verir. ? SQR(81)

LEN , ASC, VAL

Önceki bölümde bunları görmüştük


Quick-Basic Kursu
Bölüm 10: Dosya İşlemleri-1

Bilgileri değişkenlere aktararak bellekte tutabiliyoruz ve onlarla ilgili işlemler yapabiliyoruz. Belleğe aktarılacak ve işlenilecek bilgiler çok sayıda ve belli bir düzende ve değişme ihtimali olan bilgileri program kodları içine yazmak mantıklı olmayacaktır. Qbasic'in kullanacağı bellek de sınırlıdır. Örneğin beşbin öğrencisi bulunan bir okulda öğrencilerin kayıtlarının tutulacağını düşünün. Bu bilgiler klavyeden RAM belleğe aktarılabilse bile bilgisayarı kapattığımızda bilgiler kaybolacaktır. Bu yüzden kalıcı bellekte kalmasını istediğimiz bilgiler için dosyalar kullanılır.

Üç türlü dosya açma yöntemi vardır. Sıralı, Rastgele erişimli ve Binary

OPEN

Disk üzerinde dosya oluşturmak ve değişiklik yapmak için OPEN komutu kullanılır.

OPEN dosyaadı [FOR açma tipi] [ACCESS erişim tipi] [lock] AS [#]dosyanumarası [LEN=kayıt genişliği] 

dosyaadı : "Sürücü : \ klasör\ dosyaadı" şeklinde açacağınız dosyayı tanımlayan metin
açma tipi : INPUT, OUTPUT, APPEND, RANDOM ya da BINARY tiplerinden biri
erişim tipi : Ağ ortamında dosyayı başkaları da açacaksa dosyaya erişim tipini belirleyebilirsiniz. READ(okuma), WRITE(yazma) veya READ WRITE (okuma ve yazma, RANDOM ve BINARY dosyalarda geçerlidir)
lock : dosya kilitleme
dosya numarası : açılan her dosyaya bir numara verilmelidir.
kayıt genişliği : Rastgele erişimli dosyalarda kayıt genişliğini belirtmek içindir.

Sıralı Erişimli Dosya Oluşturma ve Yazma

Çoğunlukla az sayıda veya belirli bir kayıt formatı olmayan metin içerikli dosya işlemleri için kullanılır. Örneğin DOSdaki EDIT programı bu tür dosyaları oluşturur veya açar. Sıralı erişimli dosya açmak istediğimizde bunu yalnızca OKUMA veya yalnızca YAZMA amaçlı olabilir. Dosya ne amaçla açılmışsa o amaçla kullanılır. Okumak için açtığımız dosyaya yazma yapamayız. Ancak dosya kapatıldıktan sonra yazma amaçlı olarak açıp yazdırabiliriz.

OPEN "c:\ORNEK\dosya.txt" FOR OUTPUT AS # 1

Bu satırı açıklayalım. C: sürücüsü içinde ORNEK klasörü içine dosya.txt adında yeni bir dosya oluşur. OUTPUT (YAZMA amaçlı) olarak dosya oluşur, yani okuma amaçlı olarak kullanılamaz.

Eğer C: sürücünüzde ORNEK klasörünüz yoksa "Path Not Found(Yol bulunamadı)" hatası oluşacaktır. Dos komut satırına çıkarak MD C:\ORNEK yazarak bu klasörü oluşturup tekrar çalıştırmayı deneyin.

AS # 1 ise açtığımız dosyanın dosya numarasının 1 olduğunu belirtiyoruz. Bu numara dosya yazma ve okuma için kullanılacaktır. Başka dosya açacağımızda, eğer dosya kapatılmadıysa aynı numarayı kullanamayız.

Evet bu satırı çalıştırdığımızda klasörümüz varsa içinde dosya.txt oluşacaktır.

Dikkat ! : Eğer dosya daha önceden varsa yeniden oluşacağı için önceki dosyanın varolan içeriği silinecektir

2. satırı ekleyelim

PRINT #1 , "Edep öğrenilmeden ilim öğrenilmez."

PRINT komutunu biliyorsunuz. Ekrana yazı yazmak için kullanılıyordu. Varsayılan yazma yeri ekran olduğu için yazma yeri yazılmadığında ekrana yazar. Bu satırda ekrana değilde #1 numara ile açılan dosyaya yazdırılacağını söylüyoruz. Gördüğünüz gibi burada dosya adını filan yazmamıza gerek yok, açık olan dosyanın numarası yeterli.

Şimdi kaydettiğiniz klasöre ulaşın. Windowsdaysanız dosya üzerinde çift tıklayarak, DOS da iseniz
EDIT C:\ORNEK\dosya.txt
yazarak dosya içeriğini görebilirsiniz. Windowsda dosya içeriğine bakarsanız Türkçe karakterlerin yerine farklı karakterler olduğunu göreceksiniz. Bu normaldir.

3. satırı ekleyelim.

PRINT "Dosya uzunluğu : " ; LOF(1)

LOF : Dosya numarasıyla belirtilen dosyanın uzunluğunu byte cinsinden verir

4. ve 5. satırı ekleyelim.

PRINT #1, "bir" , "iki" ;"yedi" ; TAB(30) ; "on"
WRITE #1, "bir" , "iki" , "yedi", "on"

WRITE komutu; verileri, arasına virgül koyarak dosyaya(yazma amaçlı açılan) yazar. PRINT komutunun ekrandaki etkisi ne ise aynen o şekilde dosyaya yazar. PRINT #de veriler arasına virgül , noktalı virgül , TAB SPC USING komutları da eklenebilir.

6. satır

CLOSE #1

Numarası belirtilen dosyayı kapatır. Bu satırı yazmasak da program çalışır ve hata vermez. Çünkü program sonlandığında programın açtığı tüm açık dosyalar kapatılır. Ama siz yine de alışkanlık olarak dosya ile ilgili işlem bittiğinde kapatma komutunu yazmayı unutmayın. Numara belirtilmezse tüm dosyalar kapatılır. Açık olan birden fazla dosyayı kapatmak için CLOSE #1,#3,#6 gibi bir komut kullanılabilir. Kapatılan dosya üzerinde işlem yapılamaz.

Dikkat ! : Dosyalar açıkken elektrik kesintisi veya kilitlenme durumunda açık olan dosyalarınıza zarar gelebilir.

Sıralı Erişimli Dosyadan Okuma

Aşağıdaki programı yazıp çalıştırın. Bu kodlar bir dosya oluşturacak

OPEN "c:\ORNEK\veriler.txt" FOR OUTPUT AS #1
WRITE #1, "Mesut", "Akcan", 1968, "Adana"
CLOSE #1

Üstteki programın oluşturduğu dosya üzerinde okuma işlemi yapacağız

OPEN "c:\ORNEK\veriler.txt" FOR INPUT AS #1

Dosyayı okuma amaçlı açacağımızı INPUT ekiyle belirtiyoruz. Eğer dosya yoksa File Not Found(Dosya bulunamadı) hatası oluşur

INPUT #1, A$, S$, DT%, DY$

INPUT komutunu hatırlarsanız daha önceden klavyeden veri girmek amacıyla kullanılmıştı. Şimdi ise dosyada kayıtlı olan veriler okunup belirtilen değişkenlere aktarılıyor.

CLS : PRINT A$, S$, DT%, DY$

Değişkenlere aktarılan değerler ekrana yazdırılıyor.

CLOSE

Dosya(lar) kapanıyor.

Satır Satır okuma

Daha çok düz metin içerikli dosyaları okumak için kullanılan bir yöntemdir. Dosya okuma amaçlı olarak açılır.
Kullanımı:
LINE INPUT # dosya numarası , String Değişken adı
Komut yürütüldüğünde dosyadaki ilk satırı komple okuyarak belirtilen değişkene aktarır. Aşağıdaki örneği inceleyiniz.

CLS : dosya$ = "c:\bootlog.txt"
OPEN dosya$ FOR INPUT AS #1
PRINT dosya$; " dosyası içeriği:"
PRINT "--------------"
DO WHILE NOT EOF(1)
        a = a + 1
        IF a > 21 THEN a = 0: SHELL "pause"
        LINE INPUT #1, K$
        PRINT K$
LOOP
Dosyaya Ekleme Yapma
OPEN "c:\ORNEK\veriler.txt" FOR APPEND AS #1

Daha önceden kayıtlı dosyaya yeni bilgiler eklemek gerekirse APPEND kullanılır. OUTPUT kullanılırsa eski bilgiler silinir.

WRITE # 1 , "Ahmet" , "Akgül" , 1972 , "Ankara"
CLOSE

Şimdi dosyadaki bilgileri okuyup ekrana yazalım

DEFINT A-Z
NO = FREEFILE: CLS
OPEN "c:\ORNEK\veriler.txt" FOR INPUT AS #NO
DO UNTIL EOF(NO)
INPUT #NO, A$, S$, DT, DY$
PRINT A$, S$, DT, DY$
LOOP
SEEK #NO, 1
'baştan tekrar okunuyor
PRINT "-------------"
INPUT #NO, A$, S$, DT, DY$
PRINT A$, S$, DT, DY$
CLOSE #NO

FREEFILE dosya numarası olarak kullanılmayan bir numara verir. Özellikle çok sayıda dosya açtığınızda hangi numaraların kullanıldığını bulmak zor olabilir. Bu durumlarda işe yarar bir komut.

EOF : Dosya sonu demektir(End Of File) Dosyadaki kayıtların bitip bitmediği bu komutla anlaşılır.

SEEK : Okumaya başlanacak konumu(byte) belirtir. Başlangıçta 1 dir. Bu komutu kullanmasaydık okuma konumu dosya sonuna geldiği için Input past end of file(Okuma dosya sonuna taştı) hatası çıkardı.

UYGULAMA

5 Personeli olan bir kurumda personel kayıtları bir dosyaya aktarılacak. Aktarılacak bilgiler: Personelin; adı, soyadı, doğum yeri, yaşı, maaşı. Bilgiler klavyeden aktarılacak

DEFINT A-Z: DEFSTR P: DIM m AS LONG
OPEN "c:\ornek\personel.txt" FOR OUTPUT AS #1
FOR n = 1 TO 10
CLS : PRINT STRING$(40, "-")
PRINT n; ". personelin bilgilerini giriniz"
PRINT STRING$(40, "-")
INPUT "Adı"; pa
INPUT "Soyadı"; ps
INPUT "Doğum yeri"; pd
INPUT "Yaşı"; y
INPUT "Maaşı"; m
WRITE #1, pa, ps, pd, y, m
NEXT
CLOSE
PRINT STRING$(40, "-")
PRINT "... işlem tamam ..."

PROBLEM : Bilgisayarınızdaki C: kök klasöründeki AUTOEXEC.BAT ve CONFIG.SYS dosya içeriğini ekrana yazan program yazınız. Dikkat : Bu dosyaların yedeğini almadan bunu denemeyin.

Quick-Basic Kursu
Bölüm 11: Dosya İşlemleri-2

Bu bölümde Random dosya oluşturma, dosyaya yazma ve okumayı öğreneceğiz.

Rastgele Erişimli(RANDOM) Dosya Oluşturma

Belli bir kayıt yapısı olan dosya türleri için uygundur. Dosyadaki tüm kaydı birden okuma yada yazma gibi bir problem olmadığından dolayı bellek için de uygundur. Çok sayıda kayıt işlemi yapılabilir. Sınır, bilgisayarınızın boş harddisk alanı kadardır. İstenilen kayıt numarası verilerek sadece o kayıt okunabilir veya yazılabilir. Böylece hızlı bir şekilde verilere ulaşılabilir.

Random dosyada kayıtlar için bir kayıt yapısı oluşturulmalıdır. Type ..... End Type ile kayıt yapısı belirlenir

TYPE kayit
        no AS INTEGER
        adi AS STRING * 10
        soyadi AS STRING * 10
END TYPE

Herbir kayıt için kullanılacak değişkenler belirtildi. Gördüğünüz gibi STRING * 10 diye yazarak string değişkenin bellekte kaç karakter kaplayacağını da belirtiyoruz. String harici değişken türlerinin standart genişlikleri olduğu için belirtilmez

Byte cinsinden genişlikler

STRING * n

n

INTEGER

2

LONG

4

SINGLE

4

DOUBLE

8

Tanımladığımız kayıt tipine uygun bir değişken için bellekde yer açalım. Sonraki satır random dosya açmak için

DIM ogr AS kayit
OPEN "c:\ornek\ogrenci.txt" FOR RANDOM AS #1 LEN = LEN(ogr)

Rastgele erişimli dosya oluşturmak için RANDOM eki kullanılır. Dosya yoksa yeniden oluşturulur. Varsa herhangi bir problem oluşmaz, dosya silinip yeniden oluşmaz. Açık dosyayı kapatmaya gerek olmadan YAZMA ve OKUMA amaçlı olarak kullanılabilir. Farklı olarak LEN komutu kullanılıyor. Burada herbir kaydın sabit diskte ne kadarlık yer kaplayacağını belirliyoruz. LEN = LEN(ogr) ile ogr değişkeninin bellekte ne kadar yer kapladığını hesaplayıp ona eşitlemesini sağlıyoruz. İstersek buraya LEN=22 de yazabilirdik. Çünkü no 2, adi 10, soyadi 10 bytelık yer kapladığı için toplam 22 olacaktı.

Rastgele Erişimli Dosyaya Yazma

Üstteki kodları yazıp çalıştırdığınızda boş bir dosya oluşur. Şimdi açık olan dosyaya kayıt yapacağız. Önce bellekte açtığımız ogr değişkenini dolduralım. ogr değişkeninin tipi daha önce TYPE komutuyla belirlenmişti. Değişken adı yanına bir nokta koyup tipe uygun değişken adlarından(alt değişken) birini yazıyoruz. ogr.adi gibi. Tüm alt değişkenleri doldurmak şart değildir. Doldurulmazsa; sayılar 0, stringler boş olarak diske yazılır. Doldurulmaması, diskte kapladığı alnı değiştirmez.

ogr.no = 5124
ogr.adi = "Ahmet"
ogr.soyadi = "Akgül"
PUT #1, 1, ogr

Sıralı erişimli dosyada YAZMAk için PRINT ya da WRITE kullanılıyordu. Rastgele erişimli dosyada ise yazmak için PUT komutu kullanılır.
PUT # dosya numarası , kayıt no , değişken
şeklinde kullanılır. Kayıt numarası belirtilmezse; herhangi bir okuma ya da yazma yapılmamışsa, ilk kayıt olarak yazılır. Okuma ya da yazma yapılmışsa bir sonraki kayda yazılır. Numara belirtilirse o kayda yazılır.
Üstteki kodları yazıp çalıştırın. c:\ornek\ogrenci.txt dosyası oluşacak ve içeriğine ilk kaydı girecek. Bir hex editör ya da viewer ile o dosyaya bakacak olursak

yukardaki kodları görürüz.. Sağ bölme kodların ASCII karşılığı, sol bölme ise 16'lı sayı sistemine(HEX) göre herbir byte'ın değeri. İlk 2 karakter(byte) integer değişken için ayrılan alan. Burada 04 ve 14 var. Sayı değerini hesaplamak için 256 * &H14 + &H04 kodlarını kullanabiliriz. Sonuç 5124 edecektir. Yani bizim kaydettiğmiz sayı. Integer değişkenin alabileceği maksimum değer 32767 dir. Öğrenci numarası bu sayıdan daha büyük olma ihtimali varsa; no değişkenini daha büyük sayıları tutabilen LONG olararak tanımlanmalıdır. Sonraki 10 karakter ogr.adi için. Gördüğünüz gibi ad 5 karakterli olduğu halde 10 karakterlik alan ayrılmış. Aynı ogr.soyadi 'nda olduğu gibi. Böylece, Tanımlanan TYPE e göre bir seferlik kayıtta 22 byte'lık alan harcanmış olur. Her kayıtta bu 22'nin katları olarak artar.

ogr.no = 625
ogr.adi = "Mehmet"
ogr.soyadi = "Ateş"
PUT #1, 3, ogr


Oluşan dosyayı incelediğimizde üstteki kodları görürüz. Burada farklı olarak PUT komutunu verirken kayıt numarasını da verdik. Ama 2. kaydı yaptığımız halde 3. kayıt alanına kayıt yaptık. Yani 2. kayıt alanını atlamış olduk. Atlamış olduğumuz alanlar da 0 değerleriyle dolduruldu(22 adet).
Rastgele erişimli demenin nedeni de budur. Kayıt için bir sıra takip etmek şart değildir. Rastgele bir numaraya bile kayıt yapılabilir. Bundan sonraki PUT komutunda kayıt numarası belirtilmezse 4 numaralı kayıt olur. Ama biz şimdi bu boş kalan 2. kayıt alanını dolduralım.

ogr.no = 5
ogr.adi = "Selami"
ogr.soyadi = "Güneş"
PUT #1, 2, ogr

Rastgele Erişimli Dosyadan Okuma

Dosyadan okuma için GET komutu kullanılır. Üstteki kodların devamına aşağıdaki kodları ekleyin. Dosyayı kapatmamız ve yeniden açmamız gerekmiyor.

GET #1, 3, ogr
CLS : PRINT "Öğrenci,"
PRINT "NO : "; ogr.no
PRINT "ADI : "; ogr.adi
PRINT "SOYADI : "; ogr.soyadi

İlkönce dosyadan GET komutuyla 3. kayıttaki bilgileri bellekte oluşturulan ogr değişkenine aktarıyoruz. Sonra ogr değişkeninin alt değişkenlerini PRINT ile yazdırıyoruz. Kayıt numarasını vermeseydik yine aynı sonucu alırdık. Çünkü bir önceki işlemde 2 numaralı kayda yazdırma yapmıştık. İşlem yapıldıktan sonra bir sonraki kayıda atlanacağından 3 numaralı kayıt çağrılır. Şimdi aşağıdaki kodları ekleyip çalıştırın.

ku = LOF(1) \ LEN(ogr): CLS
FOR n = 1 TO ku
        GET #1, n, ogr
        PRINT n; ". kayıttaki öğrencinin,"
        PRINT "No: "; ogr.no
        PRINT "Adı: "; ogr.adi
        PRINT "Soyadı : "; ogr.soyadi
        PRINT STRING$(30, "-")
NEXT
CLOSE : END

LOF(1) ile dosyanın boyutunu byte cinsinden alıyoruz, herbir kayıt uzunluğuna bölüyoruz. Kayıt uzunluğu 22 olduğu için LEN(ogr) yerine 22 de yazabilirsiniz. Burada dikkati çeken / değilde \ kullanılması. \ kalnsız bölmeler için kullanılır. Normalde kalan olmaması gerekir.
Dosya uzunluğunu kayıt uzunluğuna böldüğümüzde kayıt sayısı çıkar. For döngüsü ile tüm kayıtlar okunur ve ekrana basılır.

Tüm kodlar aşağıda

TYPE kayit
        no AS INTEGER
        adi AS STRING * 10
        soyadi AS STRING * 10
END TYPE
 
DIM ogr AS kayit
 
OPEN "c:\ornek\ogrenci.txt" FOR RANDOM AS #1 LEN = LEN(ogr)
 
ogr.no = 5124
ogr.adi = "Ahmet"
ogr.soyadi = "Akgül"
PUT #1, 1, ogr
 
ogr.no = 625
ogr.adi = "Mehmet"
ogr.soyadi = "Ateş"
PUT #1, 3, ogr
 
ogr.no = 5
ogr.adi = "Selami"
ogr.soyadi = "Güneş"
PUT #1, 2, ogr
 
GET #1, , ogr
CLS : PRINT "Öğrenci,"
PRINT "NO : "; ogr.no
PRINT "ADI : "; ogr.adi
PRINT "SOYADI : "; ogr.soyadi
 
ku = LOF(1) \ 22: CLS
FOR n = 1 TO ku
        GET #1, n, ogr
        PRINT n; ". kayıttaki öğrencinin,"
        PRINT "No: "; ogr.no
        PRINT "Adı: "; ogr.adi
        PRINT "Soyadı : "; ogr.soyadi
        PRINT STRING$(30, "-")
NEXT
CLOSE : END

Quick-Basic Kursu
Bölüm 12: Dosya işlemleri-3

Yalnız metin içermeyen dosyalar vardır. Örneğin; resim(BMP,JPG,GIF ...) ses(WAV,MP3 ...), video(AVI, MOV, MPG ...) gibi dosyalar. Bu tür dosyalar içinde metin aranmaz ve metinle ilgili işlemler de yapılmaz. Ama örneğin bir gif dosya yapısını öğrendiniz ve dosya içindeki resmi ekrana basmak istiyorsunuz. Bunun için dosyayı binary olarak açıp içindeki kodları resim kodlarına dönüştürmelisiniz. Çalışma sistemi RANDOM dosya gibidir ancak önceden bir kayıt yapısı belirleme gerekliliği yoktur. GET ve PUT ile dosyanın istenilen kısmını okuyabilir, değişiklik yapabilirsiniz.

Binary(ikili) Dosya Oluşturma ve Yazma
OPEN "c:\ornek\ikili.bin" FOR BINARY AS #1

Random dosyada olduğu gibi dosya yoksa oluşturulur. Varsa sorun çıkmaz. Üstteki kodu denerseniz, yok ise boş bir dosya oluşur.

A$ = "Mesut"
PUT #1, , A$

A$ değişkeni içeriğini PUT ile dosyaya yazdırdık. Kayıt numarası belirtmedik. Herhangi bir okuma veya yazma yapılmadığı için ilk 5 byte yazdırılır.

A$ = CHR$(13) + CHR$(10) + "Akcan"
PUT #1, , A$

İkinci satır oluşturuluyor. Sıralı erişimli dosyada satır atlamak için ikinci bir PRINT komutu kullanılıyordu ama burada byte byte işlem yapıldığı için satır atlama kodlarını da bizim girmemiz gerekir. CHR$(13) + CHR$(10) dan oluşan iki karakter sonraki satıra atlamayı sağlar. ENTER tuşunun yaptığını yapar

Üstteki kodları deneyip dosya içeriğini inceleyin sonra aşağıdaki kodları deneyin. Burada kayıt yeri olarak 2 yazılı. Değişken içeriği dosyanın 2. baytından başlayarak doldurulur. Tabii ki o kısımdaki eski bilgiler değişmiş olur.

PUT #1, 2, A$
CLOSE
Binary Dosya Okuma

Dosyadan byte byte bilgi okumak için GET komutu kullanılır.
GET # dosyano, bytekonum, değişken
şeklinde kullanılır. Konum belirtilmezse PUT da olduğu gibidir.

Binary dosyalarda çalışırken byte olarak okuduğumuz verilerden bir kısmı sayı içeriyor olabilir. Örneğin bir resim dosyasında ilk 3 bayt resim türünü,sonraki 2 byte renk derinliğini, sonraki 15 byte tanımlama vs.. olabilir. Bunları tek tek GET komutuyla diskden okutmak yerine gerekli bilgi bir seferde bir STRING değişkene atanır. MID$ ile gerekli bytelar değişkenden alınır. Fakat sayısal değerler byte'a dönüştüğünde farklı string değerlere sahip olur. Bir önceki dersde dosyayı HexViewer ile incelediğimizde görmüştük. Bu tür bilgileri dönüştürmek için QBASIC içindeki hazır fonksiyonlar kullanılır.

STRING'İ SAYIYA
CVI : 2 byte'lık String'i Integer sayı değerine dönüştürür. Örneğin
PRINT CVI("[x") --> Sonuç : 30811

CVS : 4 byte'lık String'i Single sayı değerine dönüştürür.
CVL : 4 byte'lık String'i Long sayı değerine dönüştürür.
CVD : 8 byte'lık String'i Double sayı değerine dönüştürür.

SAYIYI STRING'E
MKI$ : Integer sayı değerini String'e dönüştürür. Örneğin
PRINT MKI$(30811) --> Sonuç : [x

MKS$ : Single sayı değerini String'e dönüştürür.
MKL$ : Long sayı değerini String'e dönüştürür.
MKD$ : Double sayı değerini String'e dönüştürür.

Okuma ya da yazma konumu

LOC fonksiyonu ile yazılacak ya da okunacak kayıt numarası öğrenilir. Binary dosyada byte olarak konumu, random dosyada ise kayıt numarasını verir.

OPEN "c:\ornek\test.txt" FOR BINARY AS #1
a$ = MKI$(5214)
PUT #1, 8, a$
PRINT LOC(1)
CLOSE
UYGULAMA

BMP formatında bir resim bulun ve c:\ornek klasörüne kopyalayın. Dosyanın adını resim.bmp olarak değiştirin. Aşağıdaki kodları yazıp çalıştırın. Bu uygulama resim dosyanız hakkında bazı bilgileri ekrana yazacaktır.

CLS : dosya$ = "c:\ornek\resim.bmp"
OPEN dosya$ FOR BINARY AS #1
'PRINT "Dosya boyutu : "; LOF(1)
baslik$ = SPACE$(14): boyut$ = SPACE$(4)
GET #1, 1, baslik$: GET #1, 15, boyut$
bmptur = CVI(boyut$)
IF bmptur = 40 THEN ' 12 ise OS/2 BMP
        baslikbilgi$ = SPACE$(40)
        GET #1, 15, baslikbilgi$
        renkd = CVI(MID$(baslikbilgi$, 15, 4))
ELSE
        PRINT "Windows BMP resim dosyası değil": END
END IF
dosyag = CVL(MID$(baslik$, 3, 4))
PRINT "Dosya Genişliği:"; dosyag; "byte"
PRINT "Renk derinliği :"; renkd; "bit"
baslgen& = CVL(MID$(baslikbilgi$, 1, 4))
resGenislik = CVL(MID$(baslikbilgi$, 5, 4))
PRINT "Genişlik: "; resGenislik
resYukseklik = CVL(MID$(baslikbilgi$, 9, 4))
PRINT "Yükseklik: "; resYukseklik
PRINT
IF bmptur = 40 THEN
        PRINT "Sıkıştırma: ";
        skstrma = CVL(MID$(baslikbilgi$, 17, 4))
        IF skstrma = 0 THEN PRINT "Yok"
        IF skstrma = 1 THEN PRINT "Run Length - 8 Bits"
        IF skstrma = 2 THEN PRINT "Run Length - 4 Bits"
        kullRenk = CVL(MID$(baslikbilgi$, 33, 4))
        PRINT "Kullanılan renk sayısı:"; kullRenk
END IF
CLOSE
Dosyayı Silme

Dos komut satırında bir dosyayı silmek için DEL komutu kullanılır. Ama Qbasic içinden dosyası silmek istersek ne olacak?
Qbasic içinde de dosya silmek için bir komut var ama DEL değil KILL (öldürmek) Kullanımı:

KILL "sürücü:\dosyayolu\dosyaadı"

KILL "c:\ornek\resim.bmp"

Dikkat ! Bu şekilde sildiğiniz dosyaya özel programlar kullanmadan ulaşmanız mümkün değildir.

Dosya adını değiştirme

NAME komutu ile dosya adı değiştirilebilir.

NAME "test.txt" AS "veri.dat"
Konum değiştirme

Dos komut satırında CD ile bulunduğunuz klasörü öğrenebilirsiniz. Bu klasörden başka klasöre gegiş yapmak için Qbasicde CHDIR komutu kullanılır. Sürücü ve yol belirtilir

CHDIR "D:\PROGRAMLAR"
Klasördeki Dosyaların Listesi

Dos'da belirtilen klasördeki dosyaların listesini DIR ile alırız. Qbasicde ise FILES komutu kullanılır.

FILES dosya türü tanımı

FILES ' bulunduğun klasörde tüm dosyalar
FILES "*.bmp" ' BMP resim dosyaları
FILES "c:\ornek\*.txt" ' belirtilen klaörde txt dosyalar
FILES "?.B*" ' Dosya adı tek harfli, uzantısı B ile başlayan dosyalar.
Yeni Klasör Oluşturma

Dos'da MKDIR ya da MD komutu ile klasör oluşturulur. Qbasicde ise MKDIR ile

MKDIR "C:\ORNEK"

Eğer klasör yoksa yeni bir tane oluşur. Klasör varsa Path/File access error hatası belirir.

Klasörü Silme

Dos'da RMDIR ya da RD ile klasör silinir. Qbasicde ise RMDIR ile

RMDIR "C:\ORNEK"

Klasör içeriği boş değilse Path/File access error hatası belirir. Klasörü silmek için önce içindekileri silmek gerekir.

KILL "C:\ORNEK\*.*" 
RMDIR "C:\ORNEK" 
Dosya Kopyalama

Qbasicde dosya kopyalamak için bir komut yoktur. Kısayoldan SHELL komutu ile tüm dos komutlarını kullanabiliriz ama Shell komutu kullanmadan dosyayı nasıl kopyalarız? Örnek kodlar aşağıda. Çok büyük dosyalarda bu kodlar sorun çıkarır. Büyük dosyalar için ek kodlar gerekir. Bu sorunu çözmek de size ödev olsun :)

OPEN "c:\ornek\ikili.bin" FOR BINARY AS #1
g& = LOF(1) : a$ = SPACE$(g&)
GET #1, , a$
CLOSE
 
OPEN "c:\ornek\kopya.bin" FOR BINARY AS #1
PUT #1, , a$
CLOSE
PRINT "Dosya kopyalandı"

 

Visual İpuçlar

Burada işinize yarayacak 20 ipucu bulabilirsiniz.

 

İpuç No

İpucu

 

1

Değişkenleri tanımlamadan işleme sokmayın. Variant değişken tipi en fazla bellek harcayan değişken tipidir. General Declerations bölümüne "Option Explicit" yazarsanız değişkenlerinizi tanımlamanız zorunlu olacaktır, bu da programınızın hızlanmasına yardımcı olacaktır.

 

2

Nesnelerin Properties bölümünü aktiflemek için F4'ü, o özellikleri değiştirmek için ise F3'ü kullanın.

 

3

Değişken isimleri 255 karakterden yukarı olamaz. Eğer birden fazla projeyle çalışıyor ya da projelerinizi belli zaman sonra güncelliyorsanız değişkenlerinizi yaptıkları işle ilgili isimlerle çağırın. Örneğin isimlerin girildiği bir liste kutusunun ismi "lstIsim" olabilir.

 

4

Bir işi yapabilecek minimum kontrolleri tercih edin. Eğer niyetiniz sadece resim göstermek ise PictureBox yerine Image, sadece metin yazdırmak ise Label ya da Print komutunu kullanın. Bundaki hız farkı gözle görülür bir büyüklüktedir.

 

5

VB'deki Watch Window üzerinden değişkenlerin değerlerini real time olarak izleyebilirsiniz. Hatta değişken gruplarının bile...

 

6

Eğer kod çok karışıksa alt yordamlar kullanın. Bu aynı kodu defalarca yapıştırmaktan daha düzenli olacaktır. Ancak daha yavaş çalışacaktır.

 

7

Döngülerde döngü sayınız 255'ten az ise döngü değişkenlerinizi Integer yerine Byte olarak tanımlayın. Integerin üst sınırı 32768, Byte'ın ise 255'tir.

 

8

Prosedürden çıkarken değişkenleri de yok edin. Örneğin Set değişken=... Demişseniz çıkarken Set değişken=Nothing demeyi unutmayın. Özellikle veritabanı uygulamalarında muazzam ölçüde bellek kazancına sahip olursunuz.

 

9

Form_Load prosedürünün yerine Form_Initialize prosedürünü de kullanabilirsiniz.

 

10

Wizardları kullanmaktan çekinmeyin. Sonuçta onlar da sizin yapacağınız işleri yaparlar, hem de sizden daha çabuk...

 

11

Dizilerde maksimum 32768 eleman bulunur (Integer üst sınırı). 0-32767 numaraları ile indexleme yapabilirsiniz.

 

12

Bir prosedür 64 kb'dan büyük olamaz. Bu da büyük programlar için alt prosedürler kullanmanız gerektiği anlamına gelir.

 

13

Kontroller için ekstra veri gerekirse değişken yerine onların "Tag"larını kullanabilirsiniz.

 

14

Bir satır kodda en fazla 1023 tane harf olabilir. Tavsiyem editör panceresinde scroll çıkarmayın, onun yerine bir boşluk ve "_" kullanarak alt satıra geçin. Bu değişkenlerin değerlerinin alt satırda devam etmesini sağlar.

 

15

Resim kontrollerinde boyutları değişmeyecekse Scterch özelliğini kullanmayın. Zira bu her pikselin yeniden hesaplanmasını gerektirir.

 

16

Bir forma birçok nesneyi yerleştirmek yerine nesneleri birkaç forma paylaştırın. Yükleme zamanları farklı olacağından kontrol edilmesi de kolay olacaktır.

 

17

Kontrolleri gruplandırmak için Frame kullanın. Hem daha estetik olacaktır hem de tüm kontrolleri bir arada taşıyabileceksiniz.

 

18

Form Editor Toolbarını kullanırsanız nesnelerinizi yerleştirmek çok daha kolay olacaktır.

 

19

VB 5'teki Data Control Access 2000'i desteklemez. Bunun için DAO Reference'ını kullanmalısınız.

 

20

Aslında VB'da da büyük- küçük harf ayrımı vardır. Ancak editör bunları sizin yerinize düzeltir.

 

 

 

 

 

 

 

ÇeşitliProgram Kodları ve API Uygulamaları

 

 

 

 

 

 

 

 

 

 

 

 

Bu sayfada çeşitli program kodları ile çeşitli API'ler bulunmaktadır.
Ayrıca ActiveX Control Nesneleri sayfasında bulunan ocx'lerin bir kısmının kodları da buradalar. Bu kodları istediginiz gibi modifiye edebilir, uygulamalarınızda kullanabilirsiniz. Eger yeni veya acemi bir VB kullanıcısı iseniz buradaki projelerde yazan kodlardan bir şey anlayamayabilirsiniz. Eger böyle bir sorununuz olursa Yeni Başlayanlara sayfasına mutlaka bir göz gezdirin. API fonksiyonlarının kullanımı standarttır, sabitler vb... çok çeşitli ve anlaşılması zor ifadeler kullanılabilir. Yani tamamını anlamak zorunda değilsiniz. Elinizde bulunsun, zamanı gelince kullanırsınız.
Eğer sizin de yazdığınız program örnekleri varsa ve bunları burada yayınlamak istiyorsanız bu bana şeref verecektir. Yazdığınız program örneklerini ozkant001@hotmail.com adresine gönderin, ben de burada bunları yayınlayayım.

Kontrol Nesnesi

Açıklama

Ado.zip

VB içinden external bir veritabanına bağlantının nasıl yapıldığına ait örnek kodlar. ActiveX Data Objects kütüphanelerinin kullanımına ait güzel bir uygulama.

Ag.zip

"Ağ Sürücüsüne Bağlan" diyaloğu çıkartan kaynak kod.

Bitmenu.zip

Çoğu uygulamada kulanılan resimli menülerin API'lerine ait kodlar.

CD.zip

CD ROM'unuzu açıp kapatmaya yarayan kodlar.

Compname.zip

Bilgisayarınızın ağdaki adını API ile okuyabilen bir uygulama.

Dosya.zip

Dosya uygulamaları ile ilgili, İÜBK Başkanı Hüseyin ASLITÜRK'e ait örnek kod.

EasyMove.zip

"Easy Move" tipi yani üzerine tıkladığınızda istediğiniz yere gidebilen formların yapılışını gösteren uygulama kodu.

EyeSource.zip

Ekranda fareyi izleyen ocx'in kaynak kodu.

FileOp.zip

Dosya kopyalama ve silme islemlerini Windows API'leriyle yapın...

Format.zip

VB ile disk/disket formatlamanın kodları.

HideTask.zip

Windows 95 görev çubuğunu gizlemek istiyorsanız bu API uygulaması tam size göre...

IconExt.zip

Exe vb... dosyalardan ikon çikartabilen bir uygulama kodu.

KonusSaat.zip

Kaynak kodu bana ait olan konuşan saat, alarm verebiliyor, Windows'u kapatabiliyor, istenilen mesaji yazdırabiliyor.

List.zip

Liste kutusunu tıklamadan listeden öğe seçtirebilen program kodları.

ListDB.zip

Database'li uygulamalarda listbox ve küçük SQL stringlerinin kullanılmasını gösteren örnek kod.

ListDemo.zip

ListView kontrolünün kullanımına ait çok kapsamlı bir uygulama. Burada dosya bulmak için kullanılan FindFirstFile ve FindNextFile API'leri ile her dosyanın simgesini, türünü, yaratılma tarihini vb... görebiliyorsunuz, ayrıca ListView sınıfının hemen tüm özelliklerinin etkili bir şekilde kullanımını bu uygulamada görebilirsiniz.

LoadCounter.zip

Bu programcık kaç defa çalıştırıldığını sayarak size bildiriyor. Siz de belli bir sayı kadar çalışacak demo programları hazırlarsanız sanırım bu tür bir algoritma kullanmanız gerekecek. İncelemeniz tavsiye olunur.

MemStats.zip

Kullanıcı, sistem ve grafik kaynaklarını % olarak gösterebilen bir uygulama. Windows Gezgini'nde Windows Hakkında menüsünü tıkladığınızda ya da ShellAbout() API'sini kullandığınızda çıkan formun üzerinde Sistem Kaynakları %75 boş gibi bir yazı görürsünüz. İşte siz de programınızda bu tür kaynaklara erişmek isterseniz bu kodlar sizin için epey kullanışlı olabilir.

MouseSource.zip

Farenin ekrandaki yerini bulabilen ocx'in kaynak kodları.

OptMenu.zip

Check'li menülerin kullanımını biliyoruz. Peki menülerde check yerine option kullanmak istersek? Programcısının adresini de içinde bulunduran örnek program yerine göre kullanışlı olabilir. Ayrıca menü API'lerine bence iyi bir örnek teşkil ediyor.

OutbarSource.zip

Outbar ocx'in kaynak kodları.

Poligon.zip

Eğer formlarınızı dikdörtgen şeklinde tasarlamaktan bıktıysanız bu kod sizi sıkıntınızdan kurtaracaktır. Yıldız şelkinde bile form tasarlayabilirsiniz.

Recent.zip

Belgeler menüsünü temizleyebilen kaynak kodlar.

Registry.zip

Registry operasyonları için API'ler. Aynısını Regedit.ocx'i yazarken de kullandım.

RotCube.zip

Bu program bilgisayar grafikleri için temel sayılabilecek bir uygulama olabilir. Dizilerle bir küp oluşturularak bu küpün farenin hareketine göre yön değiştirmesi sağlanıyor.

Scan.zip

Tarayıcı yapımına ait örnek kodlar.

ScrSource.zip

Ekran çözünürlüğü ile ilgili ocx'in kaynak kodları.

SHBrowse.zip

Dizin seçtirme diyaloğu API'leri. Aynı zamanda SearchFolder kontrolünün API kodları.

Shell32dll.zip

Birkaç Shell32.dll API'si. Simge Değiştir, Restart Windows, Çalıştır, Oturumu Kapat diyalogları

ShellMenu.zip

Uygulamanız içinden sağ mouse menüsünü çağırabilmeniz için. Kaynak kodları bana ait değil, yalnız Gönder menüsü boş.

SHFileInfo.zip

Bir dosya hakkında API'ler yardımıyla bilgiler verebilen bir uygulama.

StripHTML.zip

HTML dosyalarını text dosyalarına dönüştürür.

SuperScr.zip

Bu programcık programlarınızda denklem gibi matematiksel ifadeleri bilinen formatında yazdırabiliyor (x^3 yerine x3 gibi).

SysMenu.zip

Bir formun sistem menüsüne nasıl ekleme ya da eksiltme yapılabileceğini gösteren örnek kod.

Taskswth.zip

O anki aktif uygulamaların listesini verir. Listeden bir elemana çift tıklayınca da o uygulamayı aktifler.

Vb32ras.zip

Remote Access API'lerini kullanabilen uygulamayı Microsoft'un sitesinden çekmiştim. Mevcut Dial-Up bağlantıları ve bunların bilgilerini gösterebiliyor. Bence işe yarar bir kod.

VBPiano.zip

Bu kodlarla VB içinden MIDI aygıtına nasıl hükmedeceğinizi öğrenebilirsiniz. Programcıları bu yolla bir piyano bile tasarlamışlar. Çok hoş bir program parçası.

Whatsthis.zip

What's This Help ID'lerin nasıl kullanıldığına ait bir uygulama.

Win95cal.zip

Bu program kodu ile dll dosyalaında bulunan bir calendarı kullanabilirsiniz.

WinSource.zip

Windows, System ve Temp klasörlerinin yerini bulan ocx'in kaynak kodu.

 

Yuzen.zip

Her zaman üstte formların yapılışını gösteren bir uygulama.

 

Visual BasicNedir?

Microsoft firması tarafından geliştirilen Visual Basic, atası olan QBASIC derleyicisinin geliştirilmiş ve Windows ortamına uyarlanmış olan sürümü olarak adlandırılabilir. Windows ortamına uyarlandığı için de Nesneye Yönelimli bir dildir. VBX kontrollerini destekleyen ilk dillerden biridir. VBasic'de, 1.0 sürümünden 6.0 sürümüne kadar bir çok yenilik ve değişiklik olmuştur. Bunlardan biri de, arayüzünün güçlü ve etkili bir görünüm kazanmasıdır. Visual Basic, devamlı geliştiği bu süre sonunda yüksek hızlı uygulamalar, OLE serverlar, ActiveX kontrolleri ve daha bir çok şey geliştirilebilecek hale gelmiştir.
Microsoft Windows için program geliştiren programcıların yüzde yirmibeşi Visual Basic'i tercih etmektedirler. Visual Basic'i en popüler programlama dillerinden biri yapan en önemli nedenlerden biri de büyük olasılıkla kolay olmasıdır. Visual Basic de program yazmak için çok fazla teknik bilgiye sahip olmak gerekmez. Sadece kontrolleri form üzerine yerleştirmek ve kodu yazmak yeterli. Kısaca Visual Basic, programcıyı, programın kullanıcıya yansıyan şekli için kod yazmak zorunda bırakmayan bir dildir.

Zamanla Microsoft dışındaki bazı şirketler tarafından benzer programlama dilleri geliştirildi. Muhtemelen bunların en popüleri Borland Delphi'dir.

VBasic'in 5.0 sürümüne eklenen en önemli değişiklik ve yenilikler:

Visual Basic ile WAV Dosyalarını Çalmak

Visual Basic'i kullanarak Windows ses dosyalarını (WAV) çalabilmeniz için, Api fonksiyonlarına ihtiyacınız var. İlk olarak bu fonksiyonu kullanarak ufak bir program yaptık. Bize gerekli olanlar: dosya seçiminde kullanacağımız bir sürücü listesi, dizin listesi ve dosya listesi, bir de seçilen dosyayı görebilmemiz için gereken bir etiket. Formunuzun üstüne bunları gösterildiği biçimde yerleştirin ve hemen kodlarımızı yazmaya başlayın...

Ses dosyalarını çalabilmek için öncelikle bir ses kartına ihtiyacınız var. İşte ses dosyalarını çalabilmeniz için gereken API fonksiyonu ve parametreleri. Bunları iyice inceledikten sonra programımızı yazmaya başlayabilirsiniz.

Declare Function sndPlaySound Lib "MMSYSTEM.DLL" (ByVal ses$, ByVal ozellik%) As Integer

Parametreler:

ses$
Çalınacak ses dosyasını belirtir.Eğer ses dosyası belirtilmezse o anda çalan dosya durdurulur.

ozellik%
Bu değişken yerine ses dosyasının nasıl çalınacağını belirten aşağıdaki sabitlerden biri
kullanılmalıdır.

SND_SYNC
Sistem olaylarını durdurur. Program kontrolü ses dosyası çalındıktan sonra geri döner.

SND_ASYNC
Ses arka planda çalar. Program kontrolü ses dosyasının hemen başında geri döner.

SND_NODEFAULT
Eğer belirttiğiniz ses dosyası bulunamadıysa hata mesajı verilmeden programa geri dönülür.

SND_LOOP
Çalmak istediğiniz ses dosyası sndPlaySound fonksiyonuna boş bir değer verene kadar tekrar eder. Eğer bu özelliği kullanıyorsanız aynı zamanda ses dosyasını geri planda çalmaya yarayan SND_ASYNC fonksiyonunu kullanmalısınız.

SND_NOSTOP
Eğer herhangi bir ses o anda çalınıyorsa istediğiniz dosya çalınmaz ve bu fonksiyonu atadığınız değer anında 0 (False) olur. Bu özellik aynı zamanda o anda bir sesin çalınıp çalınmadığını anlamanıza da yardımcı olur.

Not: sndPlaySound fonksiyonu eğer belirttiğiniz dosya sorunsuz olarak çalınırsa 1 değerini döndürür.

Gelelim programımızın kodlarına. Aşağıdaki birinci paragraf programın diğer modüllerinden ayrı bir yere yazılmalıdır. (WAVCAL.BAS gibi.)

Declare Function sndPlaySound 
Lib "MMSYSTEM.DLL" (ByVal ses$, ByVal ozellik%) As Integer
Global Const SND_SYNC = &H0
Global Const SND_ASYN = &H1
Global Const SND_NODEFAULT = &H2
Global Const SND_LOOP = &H8
Global Const SND_NOSTOP = &H10
 
Sub Form_Load ()
ChDir "c:\windows" 
label1.Caption = ""
file1.Pattern = "*.wav" ' Sadece WAV uzantılı dosyalarımız listelensin
End Sub
 
Sub Drive1_Change ()
dir1.Path = drive1.Drive ' Sürücü değiştiğinde dizin listesini yenile
End Sub
 
Sub Dir1_Change ()
file1.Path = dir1.Path ' dizin değiştiğinde dosya listesini yenile
End Sub
 
Sub File1_Click ()
ses$ = dir1.Path + "\" + file1.FileName 
If Mid$(ses$, 4, 1) = "\" Then ' Eğer ana dizindeysek araya \ karakterini sokma
ses$ = dir1.Path + file1.FileName
End If
 

Burada Genel Dialog kutusunu kullanmamamızın bir dez avantajını görüyorsunuz. Her ne kadar bu kodu yazmadan programımız çalışsa da liste kutumuz ana dizini gördüğünde ses dosyamızın yerini bulmakta bir sorun yaşanacaktır. Yani yukarıdaki kod parçası her seferinde bu sorunu gidermek için kullanılabilir.

  label1.Caption = " Ses: " + ses$
  ozellik% = SND_ASYNC And SND_NODEFAULT
  X% = sndPlaySound(ses$, ozellik%)
End Sub

Visual Basic ile Kes - Kopyala - Yapıştır!

Windows altında çalışan hemen hemen tüm metin editörleri panoyu kullanır. Peki metin editörleri metinin hangi parçasının seçildiğini nasıl anlıyor. Metnin belirli bir kısmını nasıl kesip alıyor? İstenilen metni bütün bir yazı içinde nasıl buluyor? Bu dediklerimizi yapmak için Visual Basic ile hazırlanmış tüm metin editörleri hemen hemen aynı teknikleri uygular. İşte bunlardan bir kaçı:

Metnin, kullanıcı tarafından seçilen kısmının anlaşılıp panoya kopyalanması için (Kopyala)

ClipBoard.SetText screen.ActiveControl.SelText

Metnin, kullanıcı tarafından seçilen kısmının anlaşılıp panoya kopyalanması ve seçilen yerin silinmesi için (Kes)

ClipBoard.SetText screen.ActiveControl.SelText  ' Seçilen metni ilk önce kopyala
screen.ActiveControl.SelText = "" ' Sonra işaretlenen yeri sil.

Panodan yapıştırılan kısmın kullanıcı tarafından seçilen kısmın üzerine yazılması için(Yapıştır)

screen.ActiveControl.SelText = ClipBoard.GetText() 

Metnin belirtilen kısmını anlamak ve metnin herhangi bir kısmını otomatik olarak seçtirmek için SelText komutunu, metnin hangi kısımdan seçilmeye başlanacağını tayin etmek için SelStart komutunu, Seçilecek metnin uzunluğunu ayarlamak için ise SelLength komutunu kullanıyoruz. Hatırlayacağınız gibi Microsoft Word kullanılırken CTRL+A tuş kombinasyonu tüm metni otomatik olarak seçebiliyordu. Sadece ufacık bir kod parçasıyla bunu gerçekleştirebiliriz.

text1.SelStart = 0   ' SelStart komutu metnin işaretlenen kısmının nereden
                     'başlayacağını belirtir. Biz işaretlemeye metnin 
                     'başından başlamak istiyoruz...
 
text1.SelLength = Len(text1.Text) 'Metnin işaretlenen kısmı metnin uzunluğu kadar olacak

Peki metin editörleri uzun bir yazının içinde istediğimiz kelimeyi nasıl arayıp buluyorlar?
Bunu anlamak için aşağıdaki kodu bir inceleyin.

Dim ara, nerede                       ' Kullanacağımız değişkenleri atayalım

                               ' Kullanıcıdan aranacak metni iste
ara = InputBox("Aranacak metni girin:", "Metin Teknikleri Örneği", , 1000, 1000)
nerede = InStr(text1.Text, ara)   ' Metni yazı içinde ara
If nerede Then   ' Bulunursa...
text1.SelStart = nerede - 1      ' Bulunan metnin başını işaretle
text1.SelLength = Len(ara)       ' Bulunan metnin uzunluğu kadar yazıyı işaretle
Else                            ' Metin bulunamazsa...
MsgBox "Metin bulunamadı!", 64
End If

Bütün bunları bildikten sonra oturup kendi metin editörünüzü kolayca yazabilirsiniz...

KeyPreview?

Visual Basic ile program yaparken sık sık başvurduğunuz Properties kutucuğundaki bir özellik hiç dikkatinizi çektimi? KeyPreview... Bu özellik sadece formları biçimlendirirken karşınıza çıkar. Ne işe yaradığına gelince, klavyeden girdiğiniz tuş vuruşlarının Visual Basic'ten önce programınız tarafından algılanmasını sağlar. Bunu yapabilmek için ise ilk önce bu özelliğin değerini True yapmalı sonra da formunuzun anlayacağı tuş vuruşlarını programınıza tanıtmalısınız. Örneğimizi uygulamak için öncelikle boş form üzerine de bir text kutusu yaratın ve formun General - Declarations kısmına aşağıdaki sabitleri yazın.

Option Explicit
Const KEY_F1 = &H70
Const KEY_F2 = &H71
Const KEY_ESCAPE = &H1B

Şimdi de bu yukarıda belirttiğiniz tuşlara basıldığında neler olacağını tayin edelim. Yukarıda belirtmediğiniz tuşlara bastığınızda (Aşağıda bunları kullanmış olsanız bile) Formunuz bunu daha önceden olduğu gibi sıradan tuş vuruşları olarak algılayacaktır.

Sub Form_KeyDown (KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
   Case KEY_F1: Text1.text = Date$  ' F1 tuşuna basıldığında metin kutusundaki metin
   ' silinsin ve yerine tarih atansın.
   Case KEY_F2: Text1.Text = Time$  'F2 tuşu ise metin kutumuza zamanı yazsın
   Case KEY_ESCAPE: Unload Me ' ESC tuşumuz ise aktif formu bellekten atsın.
  End Select
End Sub

Programlarınızda kullanabileceğiniz diğer tuş kodlarını Visual Basic ile gelen ve tüm diğer sabitlerin bulunduğu CONSTANT.TXT dosyasından bulabilirsiniz. Ayrıca yukarıda belirttiğimiz tuşları diğer tuş kombinasyonlarıyla da kullanabilirsiniz (Örnek CTRL+ALT+F5 gibi.)

Liste Kutusuna Yatay Kaydırma Çubuğu Eklemek!

Aralarından seçim yapabileceğimiz verileri listelemek için Liste kutularını kullanırız. Ama eminim aranızda bu kontrolün bir özelliğinden çok yakınanlarınız vardır. Bildiğiniz gibi bu kontrol yatay kaydırma çubuklarını kabul etmez. Ama artık şu meşhur Api fonksiyonlarından birini kullanarak bunun üstesinden gelebiliriz.

 
SendMessage(hWnd%, LB_SETHORIZONTALEXTENT, wParam%, lParam&)
 
hWnd%   - Liste kutusunun kontrolünü alır
wParam% - Liste kutusunun kaç piksele kadar kaydırılabileceğini tayin eder.
lParam% - Kullanılmaz

Not: Bu Api fonksiyonu sadece büyük harflerle yazılan sabitle kullanılır. Bu fonksiyonu daha iyi açıklayabilmek için üzerinde bir liste kutusu bir de komut butonu olan bir form yaratın, sonra da aşağıdaki kodları ilgili yerlere girin.

'Formun General - Declarations bölümüne yazılacak ve her sabit tek satırda olacak
Declare Function SendMessage& Lib "user" (ByVal hWnd%, ByVal wMsg%, ByVal wParam%, ByVal lParam&)
Declare Function GetFocus Lib "User" () As Integer
 
Sub Command1_Click ()
Const LB_SETHORIZONTALEXTENT = &H400 + 21 'Sabitler...
Const NUL = &O0
ScaleMode = 3
List1.SetFocus
ListHwnd% = GetFocus()
 
' İlk karşımıza gelecek değişken
ListString1$ = "Visual Basic"
 
' Bu değişkeni görebilmek için ise liste kutusunu yana doğru biraz kaydırmalısınız.
ListString2$ = "Center"
 
ExtraPixels% = TextWidth(ListString2$)
BoxWidth% = TextWidth(ListString1$) + 50
 
' Liste kutumuzun boyutlarını tekrar belirleyelim
List1.Move List1.Left, List1.Top, BoxWidth%
 
' Yatak kaydırma çubuğumuzu ekleyelim ve sınırlarını çizelim
X& = SendMessage(ListHwnd%, LB_SETHORIZONTALEXTENT, BoxWidth% +       ExtraPixels%, NUL)
 
' Örneğimizi liste kutusuna ekleyelim....
List1.AddItem ListString1$ + ListString2$
End Sub

Bu kadar kolay!
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 farkedeceksiniz. 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 Sub Option2_Click()
pano.Visible = True
End Sub
 
Private Sub tarih_Click()
Text1.Text = Text1.Text & Now
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:
End Sub

Son İşlemi Geri Almak

Windows programlarınızda kullanabilmeniz için gerekli olan herşeyi önünüze sunmuştur. Örneğin bir text editörü yapmak istediniz fakat "Geri Alma" işlemini bilmiyorsunuz. Dediğimiz gibi WINDOWS, size sunduğu bir API fonksiyonuyla sizi bu zahmetten kurtarıyor. Bir form yarattıktan sonra aşağıdaki kısacık kodu girin ve sonuca bir bakın. Programı çalıştırdığınızda her zaman bir önce yaptığınız işlemin kaydedildiğini ve butona basıldığında text kutucuğu üzerine geri geldiğini göreceksiniz. GERIAL.BAS adlı formunuzdan ayrı bir modül yaratıp ilk 4 satırı bunun içine kaydedin.

Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal
wParam As Integer, lParam As Any) As Long
Global Const WM_USER = &H400
Global Const EM_UNDO = WM_USER + 23
 
‘Şimdi formumuza geçebiliriz...
Private Sub Command1_Click()
'Text kutusundaki metin değişmeden önce her seferinde WINDOWS tarafından otomatik ‘olarak
saklanır.
 
UndoResult = SendMessage(Text1.hWnd, EM_UNDO, 0, 0) ‘API fonksiyonunu çağır.
'Eğer UndoResult = -1 ise bir hata oluşmuş demektir.
End Sub

Windows'tan Hızlı Çıkış

WINDOWS, programcıların işini kolaylaştırmak için elinden geleni yapar. Örneğin bazı programlar WINDOWS’u yeniden başlatmak Windows’tan çıkmak bilgisayarı boot etmek gibi bazı özelliklere sahiptir. Bunu nasıl mı sağlıyorlar? Tabii ki şu meşhur API fonksiyonlarını çağırarak... Örneğimizi uygulamak için öncelikle yeni bir modül yaratıp aşağıdaki satırı bu modüle girin.

Declare Function ExitWindows Lib "user" (ByVal kod As Long, ByVal rezerve As Integer) As Integer

WINDOWS oturumunu kapatmak için o anda aktif olacak bir yere (Form1_Load gibi...) aşağıdaki satırı girin.

Deger = ExitWindows(0,0)  ‘İşlem başarılamadıysa “Deger” “1” den farklı olur.

Windows’u kapatıp tekrar başlatmak için ise şu satırı kullanın:

Deger = ExitWindows(&H42,0)  ‘İşlem başarılamadıysa “Deger” “1” den farklı olur.

Yarattığınız modülleri kaydetmeyi unutmayın çünkü programı çalıştırdığınızda VB size projenizi kaydetmeyi isteyip istemediğinizi sormayacak ve direkt Windows’tan çıkacaktır. Program Windows’un bir API’sini çağırdığından diğer çalışmalarınızda kaydetmediğiniz dökümanlarınız varsa Windows’tan çıkılmadan bu hususlara dikkat edilecektir. Buna bağlı olarak API’yi kullandığınızda programınızın da sonlanmasına dikkat etmelisiniz, (Mesela sonuna END koyun.) çünkü Windows kapatılamazsa programa geri dönülür.

Program Yöneticisine Program Grubu Yarattırmak

Visual Basic ile gelen kurulum programı yarrattığınız uygulamayı sabit diske kopyaladıktan sonra onun için Program Yöneticisinde bir grup yaratabilir.
Kurulum programı VB ile yazıldığına göre biz de bunu basit bir DDE (Dynamic Data Exchange / Dinamik Veri Alışverişi) bağlantısı kurarak kolayca başarabiliriz. Örneğimiz için boş bir form üzerinde bir komut butonu bir de bağlantıya aracı olacak "metin kutusu" yerleştirin ve oluşturduğunuz komut butonuna aşağıdaki kodları girin. Metin kutusunun ise bağlantıyı taşımaktan başka hiç bir işlevi yok.

Sub Command1_Click()
Text1.LinkTopic = "ProgMan|Progman" 'Bağlantı kurulacak program
Text1.LinkMode = 2    'Kullanıcı bağlantısı yarat
 
Text1.LinkExecute "[CreateGroup(VBasic)]"
'Windows Program Yöneticisinde yeni bir grup yarat
 
Text1.LinkExecute "[AddItem(c:\vb\vb.exe, Visual Basic)]"   
'Burada belirttiğimiz dizini kendinize göre değiştirin.
Text1.LinkExecute "[AddItem(c:\vb\vb.hlp, Visual Basic Yardımı)]"
'Gruba iki yeni öğe ekle
 
Text1.LinkExecute "[ShowGroup(VBasic, 7)]"
'Grubu simge haline getir ve Visual Basic’e geri dön
 
On Error Resume Next  'Hata oluşursa işleme devam et. Sebep?
'Windows 3.0 ile VB bu aşamada uyumsuzluk çıkarır!
Text1.LinkMode = 0    ' bağlantıyı kes
End     ‘Son...
End Sub

Programı çalıştırdığınızda Program Yöneticinizde “VBasic” adında yeni bir grup oluşacak ve bu grubun içinde iki simge belirecektir. DDE kullanarak programlara bağlanmak onlara komut vermek ve bu sayede veri alışverişi yapmak çok kolaydır. DDE kullanarak Excel hücrelerinden veri kopyalama işlemini bile sadece kopyalanacak hücreleri tayin ederek kolayca gerçekleştirebilirsiniz.

Menüye Çok Kullanılan Dosyaları Eklemek

İşte Visual Basic programlarınıza profesyonellik katacak bir püf noktası daha. Word, Excel gibi popüler programlar Dosya menülerinde “En son kullanılan” dosyalar için bir alan tutarlar. Böylece kullanıcı bu dosyayı bir daha açmak istediğinde dosyanın yerini genel diyalog kutusunda aramak zorunda kalmaz, menüden bu dosyayı seçerek açılmasını sağlayabilir. Siz de buna benzer bir şey yapabilirsiniz. Öncelikle yanda görülen 1. Formu ve üzerindeki menüyü yaratmakla başlayın.

Private Sub eklenen_dosya_Click()
Label1.Caption = eklenen_dosya.Caption
End Sub
 
Private Sub Form_Load()
Label1.Caption = ""            ‘Son açılan dosyayı temsil eden etiketi temizle
eklenen_dosya.Visible = False  ‘Menü seçeneğini gizle
                              ‘(Program yeni başladı ve hiç dosya açılmadı)
CommonDialog1.filename = "*.*"
End Sub
 
Private Sub Ac_Click() ‘Dosya * Aç komutu çalıştırıldığında
CommonDialog1.DefaultExt = "*.*"      ‘Tüm dosyalar
CommonDialog1.Action = 1       ‘Dosya Aç 
eklenen_dosya.Caption = CommonDialog1.filename               ‘Genel diyalog kutusunda seçilen dosyayı
                                                             ‘Son menü seçeneğine ekle
eklenen_dosya.Visible = True                  ‘Son menü seçeneğini görünür hale getir.
Label1.Caption = CommonDialog1.filename
End Sub

Yukarıdaki kodları da yazdıktan sonra programınızı çalıştırın ve Dosya menüsünden Aç komutunu seçin. Herhangi bir dosya seçtikten sonra bunun, Dosya menüsünün en alt satırında eski ismi “eklenen_dosya” olan yere yerleştiğini göreceksiniz. İşte bu kadar basit

Visual Basic ve Renk

Visual Basic, Windows’un tüm renk öğelerine kolayca erişebilir. VB formunuz üzerindeki herhangi bir nesnenin rengini değiştirmek için iki yol sunuyor bunlardan birincisi RGB komutu. Formlarınızı yaratırken kullandığınız renk paletinden bir renk seçtiğinizde o rengin Özellikler kutucuğunda değişik kodlara dönüştüğünü görürsünüz. Visual Basic, siz rengi seçtiğiniz anda onu sistemin anlayabileceği 16’lık sayı düzenine çevirir. Visual Basic’i kullanarak her bir renk’ten 1’den 255’e kadar bir ton alabilir, bunları karıştırabilir ve böylece 16.581.375 adet değişik renk elde edebilirsiniz. İşte size RGB komutu kullanılarak form üzerine basit bir palet yaratan ufak bir program. RGB değerini değiştirerek çok değişik görüntüler elde edebilirsiniz. Örnekte ayrıca bir formun ortasının nasıl bulunacağını da görebilirsiniz.

Private Sub Form_Click()
   
ScaleMode = 1   ' Ölçü sistemini piksele çevir
CX = ScaleWidth / 2 ' Formun dikey ortasını bul
CY = ScaleHeight / 2    ' Formun yatay ortasını bul
DrawWidth = 3   ' Çizim genişliğini ayarla
r = 100
For I = 50 To 0 Step -1
F = I / 50
F1 = 1 - F: F2 = 1 + F  ' Hesaplamalar...
 
r = r + 10: b = b + 10
If b > 50 Then g = g + 5
 
ForeColor = RGB(r, g, b) ' Önalan rengini belirle
Line (CX * F1, CY * F1)-(CX * F2, CY * F2), , BF
Next I
 
End Sub

Programınızı yazdıktan sonra formunuzun üzerine bir kere tıklayın. Güzel bir renk paletinin oluştuğunu göreceksiniz. Visual Basic’in size sunduğu diğer bir renk komutu ise QBColor komutudur. Bu komutu kullanarak QBASIC’ten kalan sınırlı 15 tane temel rengi kullanabilirsiniz. Aktif formun arkaplan rengini maviye boyamak için şunun gibi bir komut kullanmalısınız:

Form1.ForeColor = QBColor(1)

Bütün Özellikleri Bir Komutta Atamak

VB’nin her yeni sürümü ile programcıların işini daha da kolaylaştıracak komutlar ve özellikler geliyor. İşte With (Birlikte) komutu bunlara en güzel örnek. Şimdi aşağıdaki satırları inceleyin ve bazı komutların ne kadar gereksiz olarak kullanıldığını görün:

Private Sub Form_Load()
Form1.Height = 4000
Form1.Caption = "With Örneği"
Form1.BackColor = QBColor(6)
End Sub

Burada dikkat ettiğiniz gibi “Form1” nesnesi her satırda tekrarlanmış. VB 4.0 ile bu soruna bir çözüm getirilerek With komutu yaratılmıştır. Aşağıdaki örnek size bu komutun nasıl kullanıldığı hakkında fikir verecektir.

Private Sub Form_Load()
With Form1                     'Form1'i kullanarak...
 .Height = 4000        'Yüksekliği 4000,
 .Caption = "With Örneği"      'Form başlığını "With Örneği",
 .BackColor = QBColor(6)       'Arkaplan rengini yeşil yap.
End With                       ‘Komutu bitir
End Sub

Bu komutu kullanırken With ve End With satırları arasına yine With ve End With satırlarını girebilirsiniz fakat bu iki komut arasına komplike komutlar ve döngüler eklememelisiniz. Bu hem programınızı yavaşlatır hem de ciddi hatalara sebep olabilir.

Tuşun "Default" Olması

İşte programlarınızda dikkat etmeniz gereken bir konu: Bir form yarattınız, içinde birçok metin kutusu var ve kullanıcının metin kutularından bir tanesinde Enter tuşuna bastığında formun bellekten atılmasını (veya başka bir formun yüklenmesini) ve yazdıklarınızın geçerli olmasını istiyorsunuz. Bunu en güzel örneği "Aç" ve "Kaydet" diyalog kutularında vardır. Kutu içinde hangi kontrol aktif olursa olsun (İptal hariç) Enter tuşuna basıldığında program "Tamam" tuşuna basılmış gibi davranır, bu akıllıca tasarlanmış bir özelliktir. Bu özelliği formun üzerinde sadece bir tuş taşıyabilir. Bir tuşu "Default" olarak atamak için formun yüklenmesi esnasında

Command1.Default = True

satırını kullanmalısınız. Bu özelliği formun tasarlanması aşamasında da "Properties" kutucuğundan atayabilirsiniz.

Alt Yordam ve Fonksiyon Satırlarını Ayırabilirsiniz

API’leri tanımlayan fonksiyonlar ve bunun gibi kod satırlarının oldukça uzun olduğu dikkatinizi çekmiştir, öyleki fonksiyon yanımını yazmaya başladığınızda pencereyi ne kadar büyütürseniz büyütün fonksiyonun başını göremezsiniz. Bazılarınız bundan rahatsız olabilir. Bunu çözmek için fonksiyon veya altyordam tanımını uygun bir yerinden bir alt çizgi (_) ile ayırabilirsiniz. İşte size bunu nasıl yapacağınıza dair bir örnek:

Declare Function windir Lib "kernel" Alias "getwindowsdirectory" _
(ByVal lpbuffer As String, ByVal nsize As Integer) As Integer

Bu iki satırı yazdığınızda bu satırlar VB tarafından bir satır olarak algılanacaktır.

TreeView Kontrolü

Windows 95’in Gezgininde sol klasör penceresi bu kontrolle oluşturulmuş. Kontrolün kullanımı gayet basit, nasıl kullanıldığını merak ediyorsanız hemen boş bir formun üzerine bir Treeview kontrolü yaratın ve aşağıdaki kodları yazmaya başlayın. Kontrolün kullanımı hakkındaki tüm açıklamalar kodların arasında verilmiştir.

Private Sub Form_Load()
Dim nodX As Node
' Bir metni ana başlık olarak atamak için aşağıdaki gibi bir komut kullanmalısınız.
  Set nodX = TreeView1.Nodes.Add(, , , "Müzik")
 
'Aşağıdakinin amacı 1. Başlığa bir alt başlık eklemektir.
' Eklediğiniz altbaşlıklar eklenme sıralarına göre görüntülenir.
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Jazz")
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Pop")
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Klasik")
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Rock")
' Pop alt başlığı altına 2.altbaşlık daha ekliyoruz.
  Set nodX = TreeView1.Nodes.Add(3, tvwChild, , "Techno")
  Set nodX = TreeView1.Nodes.Add(3, tvwChild, , "Rave")
' 2. Anabaşlığı ekliyoruz.
  Set nodX = TreeView1.Nodes.Add(, , , "Resim")
' Tüm ağacı göstermek için kontrolü tazele.
nodX.EnsureVisible
End Sub
 
' Ağacın dallarından birine tıklandığında...
Private Sub TreeView1_NodeClick(ByVal Node As Node)
mesaj$ = "Tıkladığınız Liste Seçeneği: " + Node.Text
tip = 64
baslik$ = "Treeview Örneği"
' Hangi dala tıklandığını söyle.
MsgBox mesaj$, tip, baslik$
End Sub

VB ile Animasyon

Windows 95’te dosya kopyalama işlemini gerçekleştirdiğinizde dosyanın kopyalandığını gösteren küçük bir animasyonla karşılaşırsınız. Bu animasyon aslında bir dizi resmin sırayla gösterilmesinden başka bir şey değildir. VB ile de böyle animasyonlar yapmak çok kolaydır. Bu örneğimizi uygulamak için önceden seçeceğiniz ve ard arda gösterildiğinde bir hareket oluşturacak 3 resim bulun. Bu üç resmi sırayla oluşturacağınız 3 görüntü kutusuna (image) yerleştirin. Formun üzerine bunlardan başka bir resim kutusu, timer kontrolü ve bir tuş ekledikten sonra aşağıdaki kodları yazmaya başlayın. Burada dikkat etmeniz gereken çok önemli bir şey var, o da Formun başlık çubuğundaki resmi de değiştireceğimizden Image kutularına yerleştireceğiniz resimleri simge (ICO) olmasıdır.

General - Declarations bölümüne yazılacak
Dim y As Integer
 
General bölümüne yazılacak
Private Sub degistir()
    y = y + 1: If y = 4 Then y = 1
‘Formun Simgesini değiştir
    Form1.Icon = Image1(y).Picture
‘Resim kutusundaki resmi değiştir.
    Picture1.Picture = Image1(y).Picture
End Sub
 
Private Sub Command1_Click()
End
End Sub
 
Private Sub Timer1_Timer()
‘Timer’ın kontrolünün her bir vuruşunda...
‘degistir alt yordamını cagir.
degistir
End Sub

Timer kontrolünün Interval özelliğini 500 gibi bir sayıyla değiştirmeyi unutmayıp programı çalıştırdığınızda resim kutusuna sırayla üç görüntü kutusundaki simgelerin geldiğini göreceksiniz. İşin ilginç tarafı başlık çubuğundaki simgenin de resim kutusuyla eş zamanlı olarak değişmesidir.

Metin kutusu tüyoları

Eğer VB ile uzun zamandır ilgileniyorsanız metin kutusunun kullanımı ile bir probleminiz kalmamıştır. Peki bu kontrol için birkaç püf noktasına ne dersiniz? Şifreli metin kutuları
Bir metin kutusunu pekala kullanıcı şifresi almak için kullanabilirsiniz. Bunun için metin kutusunun properties özelliklerinden PasswordChar üzerine giderek buraya kullanıcının tuşladığı her karaktere karşılık ekrana çıkacak karakteri girmelisiniz. Örneğin gerçek metni yıldız karakteriyle gizlemek istiyorsanız buraya "*" karakteri koymalısınız. Metin kutusunun bu özelliğini değiştirdiğinizde diğer özelliklerinin aynı kaldığını görürsünüz. Metin kutusunda yazılı olan şifreyi ise her zamanki gibi "Text" özelliği ile öğrenebilirsiniz. Kullanıcının gireceği karakter sayısını belirlemek için ise aşağıdaki püf noktamızı uygulayabilirsiniz. Uzunluk kontrollü metin kutuları
Bir metin kutusuna girecek maksimum karakter sayısını belirlemek için "MaxLenght" özelliğini kullanmalısınız. Metin kutusu sadece bu özelliğe vereceğiniz sayı kadar karakter kabul edecektir. Karakterleri Gözardı etmek
Metin kutusunun kabul edeceği karakterleri maskelemek için KeyAscii özelliğini kullanmalısınız. Aşağıdaki örneğimiz Text1 metin kutusunun sadece tuşlanan rakamları kabul etmesi için tasarlanmıştır. Klavyeden rakam dışında herhangi bir karakter tuşlanınca bip sesi verilir ve karakter değeri "0"a çevrilir.

Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
KeyAscii = 0
Beep
End If
End Sub

Salt okunur metin kutusu
Bir metin kutusundaki metnin kullanıcı tarafından değiştirilmesini istemiyorsanız. Tek yapacağınız metnin properties kutucuğuna gidip Locked özelliğine True değerini vermektir. Bunu yaptığınızda metin kutusundaki metin sabit kalacak, kullanıcı tarafından kopyalanabilecek fakat değiştirilemeyecektir. Metin kutusunda tırnak karakteri kullanmak
Alfa numerik değişkenler Visual Basic’te iki tırnak içine alındığından otomatik olarak bir problem karşınıza çıkıyor. Değişken içerisinde tırnak karakteri geçiyorsa bunu kullanamıyorsunuz. Bunu önlemek için aşağıdaki gibi bir kod satırı kullanabilirsiniz: Text1.Text = "Visual Basic ""Görsel Programlama Dili"" " Bu kod satırı Text1 metin kutucuğunda şu görüntüyü yaratacaktır: Visual Basic "Görsel Programlama Dili"

Uygulama Listesini Çağırmak

Windows 3.1’de masaüstüne çift tıkladığınızda, Windows 95’de ise CTRL+ALT+DEL tuşlarına bastığınızda karşınıza açık olan uygulamaların bir listesi gelir. Bu listeyi kullanarak istediğiniz uygulamayı sonlandırabilir veya aktif hale getirebilirsiniz. Bu örneğimizde de yukarıdakine benzer bir uygulama yazacağız. Boş formun üzerine iki komut butonu bir de Combo Box yerleştirin ve aşağıdaki kodları yazın.

'General Declarations Bölümüne yazılacak
DefInt A-Z
Declare Function GetWindow Lib "user" (ByVal hWnd, ByVal wCmd) As Integer
Declare Function GetWindowText Lib "user" (ByVal hWnd, ByVal lpSting$, ByVal nMaxCount) As Integer
Declare Function GetWindowTextLength Lib "user" (ByVal hWnd) As Integer
 
'GetWindows API’sinin "sabitleri"
Const GW_CHILD = 5
Const GW_HWNDFIRST = 0
Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
Const GW_HWNDPREV = 3
Const GW_OWNER = 4
 
Sub GorevListesi ()
CurrWnd = GetWindow(Form1.hWnd, GW_HWNDFIRST)
 
While CurrWnd <> 0
Length = GetWindowTextLength(CurrWnd)
 
ListItem$ = Space$(Length + 1)
Length = GetWindowText(CurrWnd, ListItem$, Length + 1)
 
If Length > 0 Then
Combo1.AddItem ListItem$
End If
 
CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
X = DoEvents()
Wend
End Sub
 
Form penceresine yazılacak...
Sub Command1_Click ()
f$ = Combo1.Text
'Eğer problem çıkarsa gözardı et.
On Local Error Resume Next
AppActivate f$
End Sub
 
Sub Command2_Click ()
f$ = Combo1.Text
On Local Error Resume Next
AppActivate f$
'Uygulamaya ALT+F4 yollayarak kapat.
SendKeys "%{F4}"
End Sub
 
Sub Form_Load ()
Call GorevListesi
'Herhangi bir uygulama açık değilse programdan çık
If Combo1.ListCount > 0 Then
Combo1.Text = Combo1.List(0)
Else
MsgBox "Hiç Bir Uygulama Açık Değil", 16
Unload Form1
End If
End Sub
 

Programı çalıştırdığınızda General - Declarations bölümünde tanımladığımız üç API fonksiyonu kullanılarak aktif uygulamalar çağırılır ve Combo kutusuna eklenir. Bu kutudan herhangi bir uygulamayı çağırarak penceresini aktif yapabilir veya uygulamayı kapatabilirsiniz. Not: Uygulamayı kapatma seçeneği ALT+F4 tuşlarını kabul etmeyen uygulamalar için geçerli değildir.

Çok Seçenekli Liste Kutuları

Liste kutuları Visual Basic 3.0’dan itibaren bir den çok seçeneği kabul eder duruma gelmişlerdir. Liste kutusu kontrolünün nasıl kullanılacağını önceki aylarda göstermiştik. Aşağıdaki örneğimiz birden fazla seçeneği kabul eden liste kutularının nasıl kullanıldığını göstermektedir.

 
Sub Command1_Click ()
Dim I
'2.Liste kutusunu temizle
List2.Clear
 
'Eğer seçili bir nesne varsa bunu 2.liste kutusuna gönder
For I = 0 To List1.ListCount - 1
If List1.Selected(I) Then
List2.AddItem List1.List(I)
End If
Next I
End Sub
 
Sub Command2_Click ()
msg$ = ""
msg$ = msg$ + "Seçili Öğeler"
For I = 0 To List2.ListCount - 1
If List2.Selected(I) Then
msg$ = msg$ + Chr$(13) + List2.List(I)
End If
Next I
MsgBox msg$, 64, "Seçililer"
End Sub
 
Sub Form_Load ()
Dim I
'1. Liste Kutusunu ekranda görünen yazı tipleriyle doldur.
For I = 0 To Screen.FontCount - 1
List1.AddItem Screen.Fonts(I)
Next I
End Sub

Program çalıştırıldığında ekran yazıtipleri 1. Liste kutusunda belirecektir, "Gönder" tuşuna basıldığında 1. Liste kutusunda seçtiğiniz yazı tipleri 2.liste kutusuna kopyalanacak, "Liste" tuşuna basıldığında ise 2.liste kutusunda seçili olan öğeler mesaj kutusu kullanılarak görüntülenecektir. Örneğimiz çok seçenekli liste kutularına tam erişim sağlamaktadır, siz de kodları programlarınızda kullanabilirsiniz. Not: Programınızı çalıştırmadan önce liste kutularının "Multiselect" özelliğini Properties kutucuğundan "2"(Extended) yapın.

Programlarınız için Registry Ayarları

Çoğunuz Windows 95’in kayıt bilgileri (Registry) hakkında az çok bir şeyler biliyorsunuzdur. Registry programların kendisi hakkındaki bilgileri sakladığı uygun bir alandır. Windows 3.1’de program bilgileri INI dosyalarında saklanırdı. Windows 95’de de 16 bitlik programlar halen INI dosyalarını kullanmalarına rağmen 32 Bitlik programlar artık registry’yi kullanıyor. Eğer 32 Bit’lik programlar hazırlıyorsanız siz de mutlaka registry bilgilerinin nasıl düzenlendiğini bilmelisiniz. Visual Basic registry’ye bilgi yazmak için kendi içerisinde bulunan bir API fonksiyonunu kullanır. Bu fonksiyon bir komut değildir fakat VB bu fonksiyonu tanımak için dışarıdan bir DLL kullanmamaktadır. SaveSetting, GetSetting, DeleteSetting komutlarının genel kullanımı şöyledir:
[KOMUT] "[PROGRAM ADI]", "[ANAHTAR]", "[ÖZELLİK]", "[DEĞER]
komutların yerine getireceği işlev değiştikçe yukarıdaki satırın bazı parametreleri kullanılmayabilir. İşte size registry’ye bilgi yazan, okuyan ve silen bir programcık, yaptığı ise basit: pencere büyüklüğünü ve pencerenin ekrandaki yerini registry’ye yazıp siz istediğinizde görüntülüyor.

Private Sub Command1_Click()
'Ayarları kaydet
SaveSetting "Deneme", "Ayarlar", "Top", Form1.Top
SaveSetting "Deneme", "Ayarlar", "Left", Form1.Left
SaveSetting "Deneme", "Ayarlar", "Width", Form1.Width
SaveSetting "Deneme", "Ayarlar", "Height", Form1.Height
End Sub
 
Private Sub Command2_Click()
GetSetting "Deneme", "Ayarlar", "Left"
GetSetting "Deneme", "Ayarlar", "Top"
GetSetting "Deneme", "Ayarlar", "Width"
GetSetting "Deneme", "Ayarlar", "Height"
 
mesaj$ = "Sol: " & Left & Chr$(13) & "Üst: " & Top & Chr$(13) & "Uzunluk: " & Width & Chr$(13) & "Yükseklik: " & Height
MsgBox mesaj$, 64, "Mevcut Registry Ayarları"
End Sub
 
Private Sub Command4_Click()
'Oluşturduğumuz registry ayarlarını silmek...
'Deneme isimli programın tüm ayarlarını silmek için
DeleteSetting "Deneme"
 
'Sadece "Ayarlar" anahtarını silmek için
'DeleteSetting "Deneme", "Ayarlar"
'Kullanabilirsiniz...
End Sub

VB ile Çevre Değişkenlerini Okumak

DOS komut satırından SET komutunu girdiğinizde normal şartlarda en fazla 255 karakter olan çevre değişkenini okuyabilirsiniz. Visual Basic ile de çevre değişkeninin herhangi satırındaki veriye rahatlıkla ulaşabilirsiniz. Bunun için Environ fonksiyonunu kullanmanız yeterlidir.

Dim EnvString, Indx, Msg, PathLen  ' Değişkenleri tanımla
Indx = 1 ' Satır = 1
 
Do
EnvString = Environ(Indx)      ' Değişkeni oku
If Left(EnvString, 5) = "PATH=" Then  ' PATH bölümünü ara
PathLen = Len(Environ("PATH"))        ' uzunluğunu bul
Msg = "PATH satırı = " & Indx & " uzunluğu = " & PathLen
Exit Do
Else
Indx = Indx + 1        ' PATH bölümü bulunamadı
End If ' bir sonraki satıra geç
If PathLen > 0 Then
MsgBox Msg     'PATH değişkeni bulunursa uzunluğunu ve
               'satırı görüntüle
Else
MsgBox "PATH tanımları bulunamadı."
End If

Dosya zaman, tarih ve uzunluk bilgileri

Visual Basic ile FileDateTime fonksiyonunu kullanarak, dosyanın oluşturulduğu veya üzerinde son değişiklik yapıldığı tarihi ve saati bulabilirsiniz. Aşağıdaki örnek bu fonksiyonun kullanımını göstermektedir. Dikkat edilmesi gereken tarih ve saat bilgilerinin Windows'un ayarlandığı biçimde geri dönmesidir. Bu yüzden bu fonksiyon kullanıldıktan sonra geri dönen değişkeni tekrar formatlamak gerekebilir. Bir sonraki örnek ise dosyanın uzunluğunu kolayca bulmanızı sağlayacaktır.

' TEST isimli dosyanın en son 12 Şubat 1993 tarihinde,
' saat 4:35:47'de değiştiğini varsayalım
 
Bilgi = FileDateTime("TEST")
 
' Türkiye şartlarına göre dönen değişken 12/2/93 4:35:47 PM
' şeklinde olacaktır.
' Not: Dosyanın açılmasına gerek yoktur.
 
Open "TEST" For Input As #1  ' TEST dosyasını aç
Uzunluk = LOF(1)  ' Dosyanın uzunluğunu al
Msgbox Uzunluk ' Dosya uzunluğunu göster
Close #1 ' Dosyayı kapat

Dosyalar Geri Dönüşüm Kutusu'na

VB4'ün 32-bit'lik sürümünü kullanıyorsanız, dosyaları programınız içinden Windows'un çöp kutusuna gönderebilirsiniz. VB'de KILL komutuyla sildiğiniz hiç bir dosya normal olarak çöp kutusuna gitmeyecek ve kullanıcı dosyasını geri getirmek istediğinde çöp kutusunda bulamayacaktır. Eğer becerikli bir kullanıcı arabirimi istiyorsanız bu özelliği göz ardı etmemelisiniz. Aşağıdaki örnek sadece dosyayı çöp kutusuna göndermeyi değil, VB 4.0 ile gelen ParamArray ifadesinin kullanımını da gösteren güzel kodlardan oluşmaktadır.

Option Explicit
Private Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Boolean
hNameMaps As Long
sProgress As String
End Type

Private Const FO_DELETE = &H3
Private Const FOF_ALLOWUNDO = &H40
Private Declare Function SHFileOperation Lib "shell32.dll" Alias _
"SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Public Function ShellDelete(ParamArray vntFileName() _
As Variant) As Long

Dim I As Integer
Dim sFileNames As String
Dim SHFileOp As SHFILEOPSTRUCT

For I = LBound(vntFileName) To UBound(vntFileName)
sFileNames = sFileNames & vntFileName(I) & vbNullChar
Next
sFileNames = sFileNames & vbNullChar

With SHFileOp
.wFunc = FO_DELETE
.pFrom = sFileNames
.fFlags = FOF_ALLOWUNDO
End With

ShellDelete = SHFileOperation(SHFileOp)

End Function

Örnekte ParamArray ifadesi kullanılarak fonksiyona birden fazla parametre tanıma özelliği kazandırılmıştır
Tek bir dosya silmek için
X = ShellDelete("DELETE.ME")
komutunu kullanabileceğiniz gibi,
X = ShellDelete("DELETE.ME", "LOVE_LTR.DOC", "COVERUP.TXT")
komutunu kullanarak adı geçen üç dosyayı da silebilirsiniz.

Komutlara Resim Eklemek

VB 3'de bazı API fonksiyonlarını kullanarak her menü komutunun kenarına bir resim yerleştirebiliyorduk. VB4'te ise bu işlem çok daha kolay bir hale getirilmiş. Program ile birlikte bilgisayarınıza kurulan fakat siz onu bulmadıkça gizlenen ImageList kontrolü sayesinde bir kaç satır kodla bu işi gerçekleştirebiliyorsunuz. Programı çalıştırdığınız anda ImageList içindeki küçük simgeler menü seçeneklerine yerleştirilecek ve program sonlanana kadar orada kalacaktır.

Private Sub Form_Load()
Dim i%
Dim hMenu, hSubMenu, menuID, x
hMenu = GetMenu(hwnd)
hSubMenu = GetSubMenu(hMenu, 0)
For i = 1 To 4
menuID = GetMenuItemID(hSubMenu, i - 1)
x = SetMenuItemBitmaps(hMenu, menuID, &H4, img.ListImages(i).Picture, img.ListImages(i).Picture)
Next
menuID = GetMenuItemID(hSubMenu, 5)
x = SetMenuItemBitmaps(hMenu, menuID, 0, img.ListImages(5).Picture, 0&)
End Sub

Dosya Kopyalamak

VB'de dosyaları bir yerden bir yere kopyalamak için FileCopy isimli bir komut olduğunu biliyor muydunuz?
FileCopy "C:\COMMAND.COM", "C:\COMMAND.XXX"
gibi bir komut verdiğinizde ana dizinde bulunan COMMAND.COM isimli dosyanın yine aynı dizinde COMMAND.XXX isimli bir kopyası oluşacaktır.

Resmi Simge Haline Getirmek

Visual Basic 4.0'da ExtractIcon metodunu kullanarak herhangi bir resmi simge haline getirebilirsiniz. Bunu yapmak için Imagelist kontrolünün ListImage özelliğini kullanmalısınız. Deneyin çok basit olduğunu göreceksiniz

VB5.0'da Sürükle ve Bırak!

VB'nin herhangi bir versiyonunda sürükleme ve bırakma işlemini gerçekleştirebilirsiniz. Peki ya OLE nesnelerini sürüklemek? Word'den Excel'e yazıları sürükleyip bırakabiliyorsunuz, ya da bir metni başka bir alana sadece fare ile seçip yerleştirebiliyorsunuz.
VB'de bunu yapabilirsiniz. VB5'den önceki sürümlerde bu pek mümkün görülmüyor; VB5 ise birlikte getirdiği özelliklerden biriyle bunu gerçekleştirmenize izin veriyor. Denemek için şunu yapabilirsiniz; form üzerine yan yana iki metin kutusu yerleştirin. Her iki metin kutusunun da OLEDragMode özelliğini 1-Automatic, OLEDropMode özelliğini 2-Automatic yapın. Formu çalıştırdığınızda artık metin kutularından bir tanesindeki metni seçip sürükleyerek öbür metin kutusuna yerleştirebilirsiniz. MS Word'ü ya da OLE destekleyen diğer programlarınızı da açıp bu özelliği deneyebilirsiniz, metin kutusundaki metni sadece sürükleyip bırakarak diğer dokümanlara kopyalayabildiğinizi göreceksiniz.

Hem Yazıcı Seçin Hem Yazdırın

Bazı kişiler Form.Print metodunu ya da Printer nesnesini kullanarak form veya metin içeriklerini yazıcıdan çıkarabildiklerini fakat kullanıcıya yazıcı seçme veya dosyaya yazdırma imkanı vermek istediklerini söylüyorlar. Sorunun çözümü çok basit tek yapmanız gereken yazdırma komutu vermeden önce COMMDLG.DLL dosyasında gizli olan Genel Diyalog Kutusunun Yazıcılar için olan bölümünü kullanmak.
Aşağıdakine benzer bir form oluşturur ve menü seçeneklerinden "Yazdır"a verdiğimiz kodları eklerseniz önce yazıcı seçimi ve özelliklerini gösteren diyalog kutusu ekrana gelecek sonra seçime göre metin kutusundaki yazılar uygun yazıcıya bastırılacaktır.

Private Sub yazdir_Click()
CommonDialog1.Action = 5
Printer.Print Text1.Text
End Sub

Matematik Fonksiyonları

Bu fonksiyonlar her ne kadar metinler ile sayılar arasında geçiş yapma özelliğine sahip olsalar da VB'de "matematik fonksiyonları" kategorisinde yer alırlar. Eğer VB'deki bazı matematik fonksiyonlarını öğrenmek istiyorsanız aşağıdaki listeye bakabilirsiniz.

Fonksiyon İşlevi
Abs(n)  n'nin mutlak değerini verir
Atn(n)  n'nin radyan cinsinden arktanjantını verir
Cos(n)  n açısının kosinüsünü verir.
Exp(n)  n kuvvete yükseltilen e sabitini verir
Rnd(n)  0 ile n arasında rasgele bir ondalıklı sayı üretir
Sgn(n)  n 0'dan küçükse -1, n 0'sa 0, n 0'dan büyükse 1 değerini verir
Sin(n)  n açısının sinüsünü verir
Sqr(n)  n sayısının karekökünü verir
Str(n)  numerik bir değişkeni alfanumerik bir değişkene çevirir
Tan(n)  n açısının tanjantını verir
Val(n)  Alfanumerik bir değişkenin numerik bir karşılığını verir

Formu Ortalamak

640*480 çözünürlükteki ekranlar için tasarladığınız uygulamanızın daha yüksek çözünürlüklerde ekranda rasgele bir yerde belirmesinden şikayetçiyseniz, işte size sadece 2 satırdan oluşan bir kod. Kodları her formun Load olayına ekleyebilir ya da ana modülde bir altyordam haline getirip yüklediğiniz tüm formlardan çağırabilirsiniz. Ortalanma işlemi her büyüklükteki form için başarılı olacaktır. Private Sub Form_Load()
Left = (Screen.Width - Width) \ 2
Top = (Screen.Height - Height) \ 2
End Sub

Programı geciktiren ne?

UZUN süredir üzerinde çalıştığınız projenizin yavaş çalıştığını mı farkettiniz? O zaman birinci formdan başlayarak neyin programınızı yavaşlattığınızı bulmanızı tavsiye ederiz. Bu işlemi yapmak çok basit:
Programınızı her zamanki gibi F5 tuşu ile değil de bu sefer F8 tuşu ile başlatın. Visual Basic her bir satırdan sonra durarak bir sonraki satırı çalıştırmak için sizden F8 tuşuna basmanızı isteyecektir.
Böylece VB'nin her bir satırı çalıştırmak için sizden aldığı zamanı öğrenebileceksiniz. Step Into denilen bu işlemi, tekrarlanan kodları optimize ederek ve gerekli yerlerde ' debug' penceresini kullanarak verimli bir biçimde değerlendirirseniz programınızın hızlandığını göreceksiniz.

Haftanın Kaçıncı Günündeyiz?

DATE$ değişkenini değişik formatlardan okutarak bulunduğunuz günü kolayca öğrenebilirsiniz.
Bir de WeekDay fonksiyonu var ki yeri bambaşka... Bu fonksiyonu o günkü tarihi hiç değiştirmeden sadece bir tarih atayarak o tarihin haftanın kaçıncı gününe geldiğini öğrenmek için kullanabilirsiniz.
Tarih = #2/12/69#
Gun = WeekDay(Tarih)
MsgBox Gun Hemen belirtelim, Visual Basic haftanın ilk günü olarak Pazar gününü kabul etmektedir. Ekrana gelecek ' 3' gibi bir sonuç verdiğiniz tarihin ' Salı' gününe denk geldiğini gösterir.

Dos Penceresi Kapansın

WINDOWS 95 altında bir DOS uygulaması çalıştırdığınızda eğer o programa ait bir PIF dosyası ya da kısayol yoksa, program penceresi çalıştırıldıktan sonra kapatılmaz ve ekranda kalır.
Bu durumu önlemek için Windows'un bir API'sini kullanabilir, program sonlandıktan sonra DOS penceresini ortadan yok edebilirsiniz. Windows 95 ile birlikte gelen USER32.DLL ve KERNEL32.DLL adlı iki dosyayı kullanarak tanımladığımız üç fonksiyon sadece iki adet parametre ile işi bitiriyor.


Declare Function FindWindow& Lib ' user32' Alias ' FindWindowA' _
(ByVal lpClassName As String, ByVal lpWindowName As String)
Declare Function SendMessage Lib ' user32' Alias ' SendMessageA' (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub Sleep Lib ' kernel32' (ByVal dwMilliseconds As Long)
Public Const WM_CLOSE = &H10
Private m_sEXEName As String
Private m_sDosCaption As String
Public Sub RunDosApp()
Dim vReturnValue As Variant
Dim lRet As Long
Dim i As Integer
vReturnValue = Shell(m_sEXEName, 1) ' Dosyayı çalıştır
AppActivate vReturnValue ' EXE penceresini aktif hale getir.
Do
Sleep (10000)
lRet = FindWindow(vbNullString, m_sDosCaption)
If (lRet <> 0) Then
vReturnValue = SendMessage(lRet, WM_CLOSE, &O0, &O0)
Exit Do
End If
Loop
End Sub

Dosya Yerinde mi?

PROGRAMINIZ çalışması için gerekli bir dosya silindiğinde bunu anlayabiliyor mu? Bir dosyanın verdiğiniz konumda bulunup bulunmadığını Visual Basic'teki Dir fonksiyonunu kullanarak bulabilirsiniz. Nasıl mı? Sadece istediğiniz dosya ismini bu fonksiyona atamanız ve dönen sonucu değerlendirmeniz yeterli olacaktır. Dönen değer boş bir değişken ise (' ' ) dosya belirttiğiniz yerde bulunmuyor demektir. Private Sub Form_Load()
Dosya = Dir(' C:\AUTOEXEC.BAT' )
If Dosya = ' ' Then
MsgBox ' Dosya Bulunmuyor!'
Else
MsgBox ' Dosya Bulundu!'
End If
End Sub Dir fonksiyonunu merak edenler için biraz daha açalım:
Genel kullanımı degisken=Dir[(YolAdı[, ekler])] olan bu fonksiyon sabit diskinizin istediğiniz bölümündeki herhangi bir bir dosya hakkında bilgiler almanıza yardımcı olur. ' Ekler' parametresi sayesinde gösterdiğiniz dosyanın dizin olup olmadığını ve hangi takılara sahip oldugunu (gizli, sistem gibi...) öğrenebilirsiniz. Eğer gösterdiğiniz dosya bulunamazsa fonksiyon hiç bir hata vermeyip sadece boş bir alfanumerik değişken döndürecektir

Diskteki Boş Alanı Bulmak

SİZE herhangi bir diskte kalan boş alanın nasıl bulunacağını veremeyeceğiz; çünkü bu durumda Visual Basic'in her bir sürümü için ayrı kodlar vermemiz gerekir. Aslında herhangi bir komutu bulunmayan boş disk alanı bulma işlemini VB uygulamalarınızın kurulumunu gerçekleştirmek için kullandığınız dosyalardan biri olan SETUPKIT.DLL (VB4'te STKIT416.DLL) dosyasını kullanarak gerçekleştirebilirsiniz. Declare Function DiskSpaceFree Lib ' SETUPKIT.DLL' () As Long
satırını formlardan bağımsız bir modüle yazdıktan sonra aşağıdaki üç satırı kullanarak sadece VB 3.0'da geçerli olacak programcığınızı tamamlayabilirsiniz.
Dim bos_alan&
' DiskSpaceFree() fonksiyonunun döndürdüğü değeri taşır.
ChDrive ' c:' ' Boş alanı bulmadan önce sürücümüzü seçelim.
free_space& = DiskSpaceFree() VB'nizin sürümü ne olursa oldun SETUPKIT dizinindeki projeyi açarak hangi DLL dosyasından yararlanacağınızı ve ne gibi kodlar yazmanız gerektiğini öğrenebilirsiniz

Çoklu Ortam Dosyalarını Çalıştırmak

Çokluortam dosyalarını kendilerine ait API'lerle çağırmak daha hızlı ve daha sağlıklı olsa da size hiç bir seçeneği ayarlama olanağı vermeyen bir DLL dosyasını çağırarak da sistemde tanımlı tüm çokluortam dosyalarını minimum zahmetle çalıştırabilirsiniz. ' Aşağıdaki satır formlardan bağımsız bir modüle konulacak
Declare Function mciExecute Lib ' MMSystem' (ByVal FileName as String) As Integer
' Fonksiyonu aşağıdaki gibi kullanabilirsiniz.
' Tırnak içindeki play komutu sabit kalmalıdır.
Sub Form1_Click ()
' x değeri dosyanın başarılı olarak çalışıp çalışmadığını döndürür.
x = mciExecute(' Play c:\windows\ding.wav' )
x = mciExecute(' Play test.avi' )
End Sub

VB Hangi Modda?

UZUN süredir Visual Basic'te program hazırlıyor ve Immediate penceresini değişkenlerin aldığı değerleri öğrenmek için verimli olarak kullanıyorsanız bir püf noktasını bilmenizde fayda var: Yazacağınız tek satırlık bir fonksiyonla Visual Basic 5'in çalışma modunda mı yoksa bekleme modunda mı olduğunu bulabilir ve bunu programınıza anlatabilirsiniz. InRunMode() fonksiyonunun kullanılması aşağıdaki gibidir: Function InRunMode(VBinst As VBIDE.VBE) As Boolean
InRunMode = (VBinst.CommandBars(' Run' ).Controls(' End' ).Enabled = True)
End Function

Metin Kutusu Aktifse...

WINDOWS aktif olduğunda içerdiği metnin tümü seçilen metin kutuları gibi hayatımızı kolaylaştıracak bir çok güzel özellik bulundurur. Siz de bu özellikleri programlarınıza koyduğunuzda programınızın kullanılmasını daha kolay bir hale getirirsiniz. Bir metin kutusunun içeriğinin TAB tuşuyla veya başka bir şekilde aktif olmasıyla seçilmesini, aşağıdaki kodları metin kutusunun Got_Focus özelliğine ekleyerek sağlayabilirsiniz. Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text) Eğer projenizde bir çok metin kutusu bulunuyorsa yukarıdaki iki satırı her metin kutusuna yazmanız zor olacaktır. Bunun için General - Declarations kısmına projenin her tarafından çağırılabilecek aşağıdaki altyordamı yazıp bu altyordamı herhangi bir metin kutusunun Got_Focus özelliğinden SelAllText yazarak çağırmanız daha uygun olacaktır. Public Sub SelAllText()
Screen, ActiveControl.SelStart = 0
Screen.ActiveControl.SelLength = Len(Screen,ActiveControl.Text)
End Sub

Dizin Seçtirmek

WINDOWS'UN aç, kaydet, farklı kaydet diyalog kutularını kullanarak kullanıcının bir dosyayı seçmesini veya kaydetmesini sağlayabilirsiniz. İş klasör seçmeye gelince genel diyalog kutuları yeterli olmayacaktır. Siz de klasör seçtirmek için VB ile gelen dirlistbox'ı kullanacaksınız. Aslında bu kontrolü kullanmanıza pek gerek yok. VB'e nasıl bir genel diyalog kutusu istediğinizi söylerseniz o sizin için o biçimde bir aç diyalog kutusu çıkaracaktır. Aşağıdaki fonksiyonu çağırdığınızda Win32'nin yeni özelliği olan dizin seçme kutusu ortaya çıkacaktır. Option Explicit
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const MAX_PATH = 260
Private Declare Sub CoTaskMemFree Lib ' ole32.dll' (ByVal hMem As Long)
Private Declare Function lstrcat Lib ' kernel32' Alias ' lstrcatA' _
(ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib ' shell32' _
(lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib ' shell32' _
(ByVal pidList As Long, ByVal lpBuffer As String) As Long
Public Function BrowseForFolder(hWndOwner As Long, sPrompt _
As String) As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
With udtBI
.hWndOwner = hWndOwner
.lpszTitle = lstrcat(sPrompt, ' ' )
.ulFlags = BIF_RETURNONLYFSDIRS
End With
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then
sPath = Left$(sPath, iNull - 1)
End If
End If
BrowseForFolder = sPath
End Function

Buton Yardımları

VB kullanıcıları her zaman dışarıdan temin ettikleri ' tooltip' kontrollerini kullanarak butonların üzerine gidildiğinde bir süre sonra ortaya çıkan yardım kutucuklarını programlarına koymayı uygun bulmuşlardır. Aslında sadece bir etiket kontrolünü kullanarak tooltip oluşturmak mümkündür.
Öncelikle form üzerinde bir buton, bir de etiket kontrolü oluşturun. Etiket kontrolünü sarıya boyayarak içine uygun açıklamayı yazın ve istediğinizbüyüklüğe getirin. Etiketi formun sınırları dışına taşıyın. (Formu büyütüp etiket kontrolünü uç noktalardan birine getirin ve kontrolü daraltın.) Bunları yaptıktan sonra komut butonunun ' MouseMove' bölümüne giderek aşağıdakine benzer bir satır yazın:
Label1.Move 100,150 MouseMove olayı ile birlikte ' timer' nesnesini kullanarak daha geç çıkan tooltip'ler oluşturabilirsiniz, hem de hiç bir kontrol kullanmadan.

AVI Filmleri Oynatmak

AVI dosyalarını görüntülemek için Windows'un bir parçası olan medya aygıtını kullanabilirsiniz.

Declare Function mciSendString Lib ' mmsystem' (ByVal strCommand As String, ByVal strReturn As String, ByVal iReturnLength As Integer, ByVal hCallback As Integer)
Yukarıdaki satırı General - Declarations bölümüne yazdıktan sonra satırı herhangi bir altyordamdan aşağıdaki gibi çağırabilir, nReturn değişkenini okuyarak AVI dosyasının oynatılıp oynatılmadığını anlayabilirsiniz. Dim nReturn as Long
nReturn = mciSendString(' Open deneme.avi type AVIVideo Alias Video' , ' ' ,0,0)
nReturn = mciSendString(' Play Video FullScreen' ,' ' ,0,0)
nReturn = mciSendString(' Close Video' ,' ' ,0,0)

İçeriği BMP Olarak Kaydetmek

Resim içeren herhangi bir form veya kontoldeki resmi nasıl BMP olarak kaydedeceğinizi gösteriyoruz. Örnek programımız öncelikle form üzerinde renkli daireler çiziyor daha sonra da form içeriğini C: sürücüsünde TEST.BMP olarak kaydediyor. Tüm bu işlemleri gerçekleştirmek için form üzerine bir kez tıklamanız yeterli.

Private Sub Form_Click()
Dim CX, CY, Limit, Msg, Radius  '  Değişkenleri tanımla
ScaleMode = 3   '  Ölçeği piksel olarak tanımla
AutoRedraw = -1 '  AutoRedraw özelliğini aç.
Width = Height  '  Yüksekliği genişliğe eşitle
CX = ScaleWidth / 2 '  X posizyonunu ayarla
CY = ScaleHeight / 2
Limit = CX
For Radius = 0 To Limit
Circle (CX, CY), Radius, RGB(Rnd * 255, Rnd * 255, Rnd * 255)
DoEvents
Next Radius
Msg = ' Form üzerindeki görüntüyü kaydetmek için Tamam'a tıklayın.' 
MsgBox Msg
SavePicture Image, ' c:\TEST.BMP'   ' Görüntüyü kaydet
End Sub

Arka Plana Degrade Atmak

HEMEN hemen tüm büyük programların kurulum arka planlarında maviden siyaha geçiş vardır. VB'nin uygulamalar için oluşturduğu kurulumlarda da bunu görmek mümkündür. Peki nasıl oluyor da oluyor, form üzerine degrade nasıl atılıyor? Aşağıdaki küçük alt yordamı kullanarak bunu siz de kolayca gerçekleştirebilirsiniz.

Sub Gradient(TheObject As Object, Redval&, Greenval&,_
Blueval&, TopToBottom As Boolean)
Dim Step%, Reps%, FillTop%, FillLeft%, FillRight%, FillBottom%, HColor$
Step = (TheObject.Height / 63)
If TopToBottom = True Then FillTop = 0 Else FillTop = TheObject.Height - Step
FillLeft = 0
FillRight = TheObject.Width
FillBottom = FillTop + Step
For Reps = 1 To 63
TheObject.Line (FillLeft, FillTop)-(FillRight, FillBottom),_
RGB(Redval, Greenval, Blueval), BF
Redval = Redval - 4
Greenval = Greenval - 4
Blueval = Blueval - 4
If Redval <= 0 Then Redval = 0
If Greenval <= 0 Then Greenval = 0
If Blueval <= 0 Then Blueval = 0
If TopToBottom = True Then FillTop = FillBottom Else FillTop = FillTop - Step
FillBottom = FillTop + Step
Next
End Sub
Örneğin mavi renkte, yukarıdan aşağıya bir degrade için Gradient Me, 0, 0, 255, 1 komutunu kullanabilirsiniz. 1 değeri yerine 0 yazdığınızda ise degradenin sırasını değişecektir.

Programım Birden Fazla Çalışmasın

AYNI anda bir çok dosya açma yeteneğine sahip, MDI formlardan oluşan bir uygulamanın birden fazla kopyasının yüklenmesi mantıksız bir durum olurdu. Düşünsenize, program ile ilişkilendirilmiş bir dosyaya tıklandığında dosya ayrı bir MDI form içinde açılacağına o uygulamanın ayrı bir kopyası yükleniyor... Eğer siz de uygulamanızın sadece bir kopyasının yüklenmesini istiyorsanız aşağıdaki kodları kullanabilirsiniz.

Private Sub Form_Load()
If App.PrevInstance Then
Kaydet$ = App.Title
App.Title = ' ... İkinci Kopya.' 
Form1.Caption = ' ... İkinci Kopya.' 
AppActivate Kaydet$
SendKeys ' % R' , True
End
End If
End Sub

Metin Kutusuna Kolay Geçiş

BAZI programlarda metin kutularının karşısında bir etiket kutusu ve bu etiket kutusunun içinde altı çizili bir karakter görürsünüz. ALT tuşuyla bu karakteri kullandığınızda otomatikman o metin kutusu aktif olur ve istediğiniz değerleri yazabilirsiniz. Bunu kendi programlarınızda uygulamanız çok kolaydır... Önce bir etiket kutusu oluşturun ve açıklamayı yazarak bir karakterin önüne & işaretini getirin. Daha sonra bu etiket kutusunun karşısına bir metin kutusu getirin ve rasgele 3-5 kontrol daha oluşturup programı ateşleyin. ALT tuşuyla birlikte önüne & karakteri getirdiğiniz harfe her bastığınızda ilgili metin kutusu aktif hale gelecektir. Olayın mantığı şöyle: etiketlerin aktif olma gibi bir özelliği yok, dolayısıyla siz onu aktif yapmak istediğinizde TabIndex'i bir büyük olan kontrol devreye giriyor ve aktif oluyor. Bu yüzden dikkat etmeniz gereken bir husus var, bir etiket oluşturduktan sonra başka hiç bir kontrol oluşturmadan ilgili metin kutusunu oluşturun, buna dikkat etmezseniz Properties kutucuğundaki TabIndex değerleriyle boğuşmak durumunda kalabilirsiniz.

Aktif Kontrolü Öğrenmek

KONTROL isimlerini görevlerine göre adlandırma gibi iyi bir alışkanlığınız varsa bu püf noktamız oldukça hoşunuza gidecek. Örneğin araştırma için kullandığınız bir metin kutusuna ' txtbul' gibi bir isim verdiyseniz bir kaç gün sonra projenizi tekrar açtığınızda muhtemelen kontrolün ismini unutacaksınız. İsmini tekrar hatırlamak için Properties kutucuğunu bile açmanıza gerek yok. Tek yapmanız gereken uygulamayı çalıştırmak ve kontrolün üzerine bir kez tıklayarak onu aktif hale getirmek. Break tuşuna basıp Debug penceresine ?Screen.ActiveControl.Name satırını girdiğinizde VB bir sonraki satıra kontrolün ismini yazacaktır.

Kontrolleri Ayırmak

GÜNLÜK hayatınızda sık sık karşınıza çıkan, belki de pek dikkat etmediğiniz bir arabirim püf noktası verelim. Windows 95 altında çalışırken Windows Gezgini'ni açtınız diyelim. Karşınıza ince bir çizgiyle ayrılmış iki ayrı pencere gelir. Ortadaki çizgiyi sağa veya sola ötelediğinizde pencereler buna göre yeniden durum alarak ya genişler ya da daralır. Aynı durum formun büyüklüğüyle oynandığında da karşınıza çıkar ve formun yeni büyüklüğüne göre kontroller yeni yerlerini alır. Yukarıda anlattığımız iki işlemi programlarınızda uygulamak pek de zor değildir. Form üzerine bir Liste bir de Text kutusu oluşturun. Liste kutusunun ismini ' listsol' metin kutusunun ismini textsag olarak belirleyin. Form üzerinde bu iki kontrol dışında bir de resim kutusu oluşturarak ismini ' ayirac' olarak atayın. Programı çalıştırıp ortadaki ayıracı sağa sola kaydırın, formu küçültüp büyültün, tıpkı Windows Gezgini gibi şekil alacaktır.

' Aşağıdaki kodlar boş bir BAS modülünün içinde
' General-Declarations bölümüne yazılacak.
 
Option Explicit
Private Const SPLT_WDTH As Integer = 5
Private currSplitPosX As Long
Dim CTRL_OFFSET As Integer
Dim SPLT_COLOUR As Long
 
' Aşağıdaki kodlar formun ilgili
' yerlerine yerleştirilecek.
 
Private Sub Form_Load()
CTRL_OFFSET = 5
SPLT_COLOUR = &H808080
currSplitPosX = &H7FFFFFFF
listsol.AddItem ' Listedeki 1. öğe' 
listsol.AddItem ' Listedeki 2. öğe' 
textsag.Text = ' Örnek bir metin' 
End Sub
Private Sub Form_Resize()
Dim x1 As Integer
Dim x2 As Integer
Dim height1 As Integer
Dim width1 As Integer
Dim width2 As Integer
On Error Resume Next
height1 = ScaleHeight - (CTRL_OFFSET * 2)
width1 = listsol.Width
x1 = CTRL_OFFSET
x2 = x1 + width1 + SPLT_WDTH - 1
width2 = ScaleWidth - x2 - CTRL_OFFSET
listsol.Move x1 - 1, CTRL_OFFSET, width1, height1
textsag.Move x2, CTRL_OFFSET, width2 + 1, height1
ayirac.Move x1 + listsol.Width - 1,
CTRL_OFFSET, SPLT_WDTH, height1
End Sub
 
Private Sub ayirac_MouseDown(Button As
Integer, Shift As Integer, x As Single, y As Single)
 
If Button = vbLeftButton Then
ayirac.BackColor = SPLT_COLOUR
currSplitPosX = CLng(x)
Else
 
If currSplitPosX <> &H7FFFFFFF Then ayirac_MouseUp
                               Button, Shift, x, y
 
currSplitPosX = &H7FFFFFFF
End If
End Sub
 
Private Sub ayirac_MouseMove(Button As
Integer, Shift As Integer, x As Single, y As Single)
 
If currSplitPosX& <> &H7FFFFFFF Then
If CLng(x) <> currSplitPosX Then
ayirac.Move ayirac.Left + x, CTRL_OFFSET,
 SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
currSplitPosX = CLng(x)
End If
End If
End Sub
 
Private Sub ayirac_MouseUp(Button As Integer,
         Shift As Integer, x As Single, y As Single)
 
If currSplitPosX <> &H7FFFFFFF Then
If CLng(x) <> currSplitPosX Then
ayirac.Move ayirac.Left + x, CTRL_OFFSET,
 SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
 
End If
currSplitPosX = &H7FFFFFFF
ayirac.BackColor = &H8000000F
If ayirac.Left > 60 And ayirac.Left < (ScaleWidth - 60) Then
listsol.Width = ayirac.Left - listsol.Left
ElseIf ayirac.Left < 60 Then
listsol.Width = 60
Else:   listsol.Width = ScaleWidth - 60
End If
Form_Resize
End If
End Sub

CDBL Fonksiyonu VAL'a Karşı

VAL () fonksiyonunu hemen hepiniz biliyorsunuzdur. Metin formatında olan sayıları numerik bir değişkene çevirmek için bu fonksiyonu kullanırız. Peki bu fonksiyonun kardeşi olan CDbl'yi hiç duymuş muydunuz? CDbl fonksiyonunu kullanmak içerisinde hane barındıran metinleri numerik hale getirmek için en iyi yoldur. Aşağıda iki fonksiyonun kullanımlarını ve arasındaki farkları göreceksiniz. Kod: print Val(' 12345' )
Sonuç: 12345 Kod: print Val(' 12,345' )
Sonuç: 12 Kod: print CDbl(' 12,345' )
Sonuç: 12345 Kod: print CDbl(' 12345' )
Sonuç: 12345 Peki bu iki fonksiyonun farkı ne? Bir kaç satır fazla kodla yapılabilecek, sık sık rastlamayacağımız bu durum için niye iki ayrı fonksiyon üretilmiş? Cevabı çok basit: CDbl fonksiyonu değişik ülkelerde farklı metrik ve ondalık değerler kullanılabileceği düşünülerek tasarlanmış ve sayı içinde virgülün yerini değişse bile bunu tutarak sadık bir yardımcı durumuna gelmiş.

ENTER Tuşu Ses Çıkarmasın

BİR metin kutusuna bilgi girerken ENTER tuşuna bastığınızda sisteminizden bir Bip sesi duyarsınız. Bu sistemin bir özelliğidir ve normaldir. Bu sizi rahatsız ediyorsa ya da kullanıcının Enter tuşuna bastığında bir sonraki metin kutusuna yönlenmesini istiyorsanız form üzerinde bir metin kutusu oluşturarak programınıza aşağıdaki kodları yerleştirebilirsiniz.

Private Sub Text1_KeyPress(KeyAscii As Integer) 
If KeyAscii = Asc(vbCr) Then
KeyAscii = 0 '  Bir sonraki kontrole
             '  atlamak için 0 yerine 10 kullanın.
End If
End Sub

"Birlikte Aç" Kutusu Nasıl Çıkartılır?

İşte size küçücük bir püf noktası, yaptığı iş ise çok basit: dosya ilişkilendirmeye yarayan "Birlikte Aç" kutusunu karşınıza getiriyor ve paramatre olarak verdiğiniz dosyayı istediğiniz bir programla açmanıza olanak tanıyor.

Private Sub Command1_Click() ' Komut butonuna tıklandığında
Dim x As Long
x = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL dosyaadi.xxx")
End Sub

Sistem Ne Durumda?

Üzerinde çalıştığınız program bir takım Windows 95 API'leri veya ağ desteği kullanıyor fakat API'ler Windows 95 Güvenli Kip'teyken çalışmıyorsa programınızı bu yönde programlayabilir Windows 95'in hangi kipte çalıştığını anlamasını sağlayabilirsiniz. Örnek programımız Windows 95'in nasıl başlatıldığını yine bazı API'leri kullanarak anlayabiliyor. Aşağıdaki kodları formdan bağımsız bir modüle yerleştirdikten sonra diğer satırları form üzerinde bir komut butonu oluşturarak içerisine yerleştirin.

Option Explicit
Public Declare Function GetSystemMetrics Lib
"user32" (ByVal nIndex As Long) As Long
Public Const SM_CLEANBOOT = 67
 
Private Sub Command1_Click()
Select Case GetSystemMetrics(SM_CLEANBOOT)
Case 1: MsgBox "Sistem Güvenli Kipte çalışıyor."
Case 2: MsgBox "Sistem Ağ destekli güvenli kipte çalışıyor"
Case Else: MsgBox "Sistem normal olarak işliyor."
End Select
End Sub

Belgeler Menüsü Kullanımı

Programı oluşturmak için öncelikle üzerinde bir metin kutusu, iki opsiyon kutusu bir de komut butonu bulunan bir form oluşturun. Opsiyon kutularının ismini opsiyon(0) ve opsiyon(1) olarak (Tabii ki Control Array) tanımlayarak aşağıdaki kodları uygun alanlara girin.

Private Sub Command1_Click()
Dim r As Long
Dim shFlag As Long
Dim shData As String
shFlag = SHARD_PATH
 
Select Case opsiyon(0).Value = True
Case True:
shData = (Text1)
Case False:
shData = vbNullString
End Select
 
r = SHAddToRecentDocs(shFlag, shData)
End Sub
 
' Aşağıdaki satırlar formdan
' bağımsız bir BAS modülüne girecek.
Public Const SHARD_PIDL = &H1&
Public Const SHARD_PATH = &H2&
Public Declare Function SHAddToRecentDocs Lib
"shell32.dll" (ByVal dwFlags As Long, ByVal 
dwData As String) As Long
Programı çalıştırdıktan sonra opsiyon kutularını kullanarak ister metin kutusundaki dosyayı belgeler menüsüne ekler, isterseniz belgeler menüsünü tamamen boşaltırsınız.

CAPSLOCK ve NUMLOCK'U Kodla Değiştirmek

Visual Basic 4.0 paketi tuş kilitlerini değiştirmek ve görüntülemek için "Keyboard State Control"'unu (KEYSTA32.OCX) birlikte getiriyor. Bu kontrolü kullanarak ve küçük bir kod satırı yazarak programınız çalışırken CAPS LOCK, NUM LOCK ve SCROLL LOCK kilitlerini açıp kapayabilirsiniz. Peki programınızı derleyip kurulum paketinin oluşturduğunuzda ne olacak? Şüphesiz ilgili kontrol de uygulamanız ile birlikte programı kurduğunuz sisteme kopyalanacak. Bizce bu kadar küçük bir işlemi gerçekleştiren bir kontrolü kullanarak uygulamanızı kalabalıklaştırmak anlamsız, aynı işlemi bir WIN32 API'sini kullanarak da gerçekleştirebilirsiniz. Örneğimizi uygulamak için üzerinde üç tane komut butonu bir de etiket kontrolü olan bir form oluşturun ve ilk aşamada boş bir BAS modülünün General - Declarations bölümüne aşağıdaki satırları girin.

Public Const VK_CAPITAL = &H14
Public Type KeyboardBytes 
kbByte(0 To 255) As Byte
End Type
 
Public kbArray As KeyboardBytes
Public Declare Function GetKeyState Lib "user32"
(ByVal nVirtKey As Long) As Long
Public Declare Function GetKeyboardState Lib
"user32" (kbArray As KeyboardBytes) As Long
Public Declare Function SetKeyboardState Lib
"user32" (kbArray As KeyboardBytes) As Long
 
'Aşağıdaki kodlar oluşturduğnuz formun 
'General  - Declarations bölümüne girmelidir:
Private Function CapsLock() As Integer
CapsLock = GetKeyState(VK_CAPITAL) And 1 = 1
End Function
 
Private Command1_Click()
GetKeyboardState kbArray
 
kbArray.kbByte(VK_CAPITAL) = 
IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
 
SetKeyboardState kbArray
Label1 = IIf(CapsLock() = 1, "Açık", "Kapalı")
End Sub
 
Private Sub Command2_Click()
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 1
SetKeyboardState kbArray
Label1 = IIf(CapsLock() = 1, "Açık ", "Kapalı")
End Sub
 
Private Sub Command3_Click()
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 0
SetKeyboardState kbArray
Label1 = IIf(CapsLock() = 1, "Açık ", "Kapalı")
End Sub

Sistem Klasörlerini Öğrenmek

Programınızın kullanacağı geçici bir dosya oluşturmak istiyorsunuz. Ya da Windows'un bulunduğu klasörü programınıza bildirmek istiyorsunuz. Bu işlemleri gerçekleştirmek çok basit çünkü Windows 3 adet API kullanarak bu klasörleri bulmanıza izin veriyor. Örneğimizi uygulamak için resimde görüldüğü gibi üç adet etiket kontrolü bir adet de komut butonunu formunuz üzerine yerleştirin.

'Ayrı bir BAS modülüne girecek:
Option Explicit
Public Declare Function GetSystemDirectory
Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
 
Public Declare Function GetTempPath Lib "kernel32"
Alias "GetTempPathA" _
(ByVal nSize As Long, ByVal lpBuffer As String) As Long
 
Public Declare Function GetWindowsDirectory
 Lib "kernel32" Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
 
'Formun General - Declarations bölümüne girecek:
Private Function GetSystemDir() As String
Dim r As Long
Dim nSize As Long
Dim tmp As String
tmp = Space$(256)
nSize = Len(tmp)
r = GetSystemDirectory(tmp, nSize)
GetSystemDir = TrimNull(tmp)
End Function
 
Public Function GetTempDir() As String
Dim r As Long
Dim nSize As Long
Dim tmp As String
tmp = Space$(256)
nSize = Len(tmp)
r = GetTempPath(nSize, tmp)
GetTempDir = TrimNull(tmp)
End Function
 
Private Function GetWinDir() As String
Dim r As Long
Dim nSize As Long
Dim tmp As String
           
tmp = Space$(256)
nSize = Len(tmp)
r = GetWindowsDirectory(tmp, nSize)
GetWinDir = TrimNull(tmp)
End Function
 
Private Function TrimNull(item As String)
Dim pos As Integer
pos = InStr(item, Chr$(0))
If pos Then
TrimNull = Left$(item, pos - 1)
Else: TrimNull = item
End If
End Function
 
Private Sub Command1_Click()
Label1 = GetWinDir()
Label2 = GetTempDir()
Label3 = GetSystemDir()
End Sub

Ekran Çözünürlüğünü Bulmak

Program 800*600 çözünürlükte çalıştığını nasıl anlıyor, ekranın diğer kısımlarını doldurup kendini nasıl ortalıyor. Aşağıda SystemParametersInfo API'sini kullanarak komut butonuna basıldığında tüm ekrana yayılan ve ekran çözünürlüğünü gösteren bir program veriyoruz.

'Aşağıdaki kodlar formlardan bağımsız
bir BAS modülüne girecek...
 
Option Explicit
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
 
Public Const SPI_GETWORKAREA& = 48
Public Declare Function SystemParametersInfo Lib
"user32" Alias "SystemParametersInfoA" (ByVal uAction
As Long, ByVal uParam As Long, lpvParam As Any,
ByVal fuWinIni As Long) As Long
 
'Form1'e girecek…
Private Sub Command1_Click()
Dim rc As RECT
Dim r As Long
Dim msg As String
 
r = SystemParametersInfo(SPI_GETWORKAREA, 0&, rc, 0&)
msg = "Ekran Çözünürlüğü" & vbCrLf
msg = msg & "Genişlik - " & rc.Right & vbCrLf
msg = msg & "Yükseklik - " & rc.Bottom & vbCrLf & vbCrLf
Text1 = msg
Me.Move rc.Left * Screen.TwipsPerPixelX, _
rc.Top * Screen.TwipsPerPixelY, _
rc.Right * Screen.TwipsPerPixelX, _
rc.Bottom * Screen.TwipsPerPixelY
End Sub

Disk Bilgilerini Öðrenmek

Aþaðýdaki programcýk dilediðiniz sürücünün seri numarasýný ve etiketini komut butonuna basýldýðýnda size veriyor. "PathName$ = " satýrýný deðiþtirerek istediðiniz sürücüyü seçebilirsiniz...

' Formdan ayrý bir BAS modülüne girecek:
Option Explicit
Declare Function GetVolumeInformation Lib
"kernel32" Alias "GetVolumeInformationA"
(ByVal lpRootPathName As String, ByVal
lpVolumeNameBuffer As String, ByVal
nVolumeNameSize As Long, lpVolumeSerialNumber
As Long, lpMaximumComponentLength As Long,
lpFileSystemFlags As Long, ByVal
lpFileSystemNameBuffer As String, ByVal
nFileSystemNameSize As Long) As Long
 
'Aþaðýdaki kodlarýn hepsi formun General -
Declarations bölümüne girecek
Private Sub cmdVolumeInfo_Click()
Dim r As Long
Dim PathName As String
Dim DrvVolumeName As String
Dim DrvSerialNo As String
PathName$ = "c:\"
 
rgbGetVolumeInformationRDI PathName$,
DrvVolumeName$, DrvSerialNo$
 
'Sonuçlarý Görüntüle
Print: Print "  Sürücü Ýstatistikleri  ", ":  "; UCase$(PathName$)
Print: Print "  Disk Etiketi     ", ":  "; DrvVolumeName$
Print "  Seri Numarasý", ":  "; DrvSerialNo$
End Sub
 
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, 
(Screen.Height - Me.Height) \ 2
End Sub
 
Function GetHiWord(dw As Long) As Integer
If dw& And &H80000000 Then
GetHiWord% = (dw& \ 65535) - 1
Else: GetHiWord% = dw& \ 65535
End If
End Function
 
Function GetLoWord(dw As Long) As Integer
If dw& And &H8000& Then
GetLoWord% = &H8000 Or (dw& And &H7FFF&)
Else: GetLoWord% = dw& And &HFFFF&
End If
End Function
 
Private Sub rgbGetVolumeInformationRDI(PathName$,
DrvVolumeName$, DrvSerialNo$)
Dim r As Long
Dim pos As Integer
Dim HiWord As Long
Dim HiHexStr As String
Dim LoWord As Long
Dim LoHexStr As String
Dim VolumeSN As Long
Dim MaxFNLen As Long
Dim UnusedStr As String
Dim UnusedVal1 As Long
Dim UnusedVal2 As Long
 
DrvVolumeName$ = Space$(14)
UnusedStr$ = Space$(32)
 
r& = GetVolumeInformation(PathName$, _
DrvVolumeName$, Len(DrvVolumeName$), VolumeSN&, _
UnusedVal1&, UnusedVal2&, UnusedStr$, Len(UnusedStr$))
 
If r& = 0 Then Exit Sub
pos% = InStr(DrvVolumeName$, Chr$(0))
If pos% Then DrvVolumeName$ = Left$(DrvVolumeName$, pos% - 1)
If Len(Trim$(DrvVolumeName$)) = 0 Then DrvVolumeName$ = "(no label)"
 
HiWord& = GetHiWord(VolumeSN&) And &HFFFF&
LoWord& = GetLoWord(VolumeSN&) And &HFFFF&
HiHexStr$ = Format$(Hex(HiWord&), "0000")
LoHexStr$ = Format$(Hex(LoWord&), "0000")
DrvSerialNo$ = HiHexStr$ & "-" & LoHexStr$
End Sub

İnternet Kısayolları

Aşağıdaki kodları kullanarak kolayca bir kısayol oluşturabilir, üzerine çift tıklayarak web tarayıcınızın ilgili adrese bağlanmasını sağlayabilirsiniz.

' Masaüstünde PC World Online isimli bir kısayol oluştur
Open "c:\windows\desktop\PC World Online.url" For Output As #1
' Gerekli İçeriği yaz
Print #1, "[InternetShortcut]"
' Adresi Yaz
Print #1, "URL=" & "http://www.pcworld.com.tr"
Close #1    'Tamamla

Balon Yardım Örneği

Programı oluşturmak için öncelikle iki ayrı form oluşturun. Oluşturacağınız ikinci form balon yardımı oluşturacak, bu formun işlevini yerine getirebilmesi için Border Style özelliğini None yapın. 1. form'a, kontrolleri yerleştirin ve her bir komut butonuna CMD ismini vererek bir Control Array oluşturun. Formlardan bir BAS modülüne aşağıdaki satırları girin.

Type POINTAPI
        X As Long
        Y As Long
End Type
 
Public Const SW_SHOWNOACTIVATE = 4
Public Const GW_CHILD = 5
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long,
ByVal yPoint As Long) As Long
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long,
ByVal nCmdShow As Long) As Long
 
FORM 1'İN KODLARI:
 
General - Declarations
Private Sub DisplayHelp(Help$)
Dim lpPoint As POINTAPI
Dim ret As Integer
 
If Len(Help$) > 0 Then
frmHelp.Hide
frmHelp.Label1.Caption = Help$ '& "  "
Call GetCursorPos(lpPoint)
frmHelp.Top = (lpPoint.y + 18) * Screen.TwipsPerPixelY
frmHelp.Left = (lpPoint.x - 2) * Screen.TwipsPerPixelY
frmHelp.Width = frmHelp.Label1.Width + (12 * Screen.TwipsPerPixelX)
frmHelp.Height = frmHelp.Label1.Height + (6 * Screen.TwipsPerPixelY)
frmHelp.ZOrder
ret = ShowWindow(frmHelp.hwnd, SW_SHOWNOACTIVATE)
 
Else
frmHelp.Hide
End If
End Sub
 
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
Timer1.Interval = 500
Timer1.Enabled = True
List1.AddItem "Item 1"
List1.AddItem "Item 2"
List1.AddItem "Item 3"
End Sub
 
Private Sub Timer1_Timer()
Dim curhWnd As Integer
Dim p As POINTAPI
Static LasthWnd As Integer 
 
If GetActiveWindow() = Form1.hwnd Then  ' Form'un aktif olduğundan emin ol
Call GetCursorPos(p)    ' İmlecin yerini belirle
 
' Fare imleci hangi kontrol üzerinde?
curhWnd = WindowFromPoint(p.X, p.Y)
 
' Aynı kontrol mü?
' Eğer aynı kontrol ise tekrar baloncuğu çizme.
 
If curhWnd <> LasthWnd Then
LasthWnd = curhWnd   ' Şimdiki HWnd değerini aklında tut.
Timer1.Interval = 1  ' Kontrol etme aralığını düşür
Select Case curhWnd
Case cmd(0).hwnd: DisplayHelp (cmd(0).Tag)
Case cmd(1).hwnd: DisplayHelp (cmd(1).Tag)
Case cmd(2).hwnd: DisplayHelp (cmd(2).Tag)
Case cmd(3).hwnd: DisplayHelp (cmd(3).Tag)
Case List1.hwnd:  DisplayHelp (List1.Tag)
Case Text1.hwnd:  DisplayHelp (Text1.Tag)
 
'Eğer fare imleci kontrolün dışına çıkarsa form2'yi gizle
Case frmhelp.hwnd
frmhelp.Hide
Case Else:
DisplayHelp ""
Timer1.Interval = 1000
End Select
End If
End If
End Sub
 
FORM 2'NİN KODLARI
Private Sub Form_Load()
Me.Caption = ""
Me.BackColor = &HFFFF&
Label1.Left = 4 * Screen.TwipsPerPixelX
Label1.Top = 20
Tüm kodları girdikten sonra her kontrolü seçerek TAG özelliğine gidin ve görülmesini istediğiniz açıklamayı yazın. Projenizi çalıştırın ve Timer 1'in Interval aralığına göre kontrollerin balon yardımlarını gösteren uygulamanıza bakın. İşte bu kadar.

Yazdığınız Metin Değişmesin

Öyle bir metin kutusu istiyorsunuz ki kullanıcı üzerine bir şeyler yazdığında değiştiremesin, istediğiniz metin dosyasını bu kutuya yüklediğinizde kullanıcı sadece bunu aşağı yukarı kaydırsın. Örneğimiz için alelade bir form üzerine yine alelade bir metin kutusu oluşturun. DENEME.TXT adında ve uzunca bir metin içeren örnek dosya oluşturun.

Form_Load ()
'Deneme dosyamızı yüklüyoruz...
Open "DENEME.TXT" For Input As #1    
Text1.Text = Input$(LOF(1), 1)
Close #1
End Sub
 
Private Sub Text1_KeyPress(keyascii As Integer)
' Kullanıcı bir tuşa bastığında ASCII değerini
0 yaparak tuş vuruşunu gözardı et.
keyascii = 0
End Sub

Masaüstü Resmini Değiştirmek

Visual Basic ile masaüstü resmini değiştirmek çok kolaydır. Sadece USER32.DLL dosyasında bulunan bir fonksiyonu çağırmak yeterlidir. Öncelikle FORMdan ayrı bir BAS modülüne aşağıdaki tek bir satırı girin.

Declare Function SystemParametersInfo Lib "user32" Alias
"SystemParametersInfoA" (ByVal uAction As Long, ByVal
uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni
As Long) As Long

Fonksiyonu programınıza tanıttıktan sonra şekildeki gibi bir form oluşturun ve ilgili bölümlere kodları yazın.

Private Sub Form_Load()
Dim Temp As String
 
Temp = InputBox("Lütfen WINDOWS 
klasörünü girin", "", "C:\WINDOWS\")
 
If Temp = "" Then End   'Vazgeç'e basıldı
If Right$(Temp, 1) <> "\" Then Temp = Temp + "\"
list1.Tag = Temp
Temp = Temp + "*.bmp"
Temp = Dir$(Temp)
Do While Temp$ <> ""
Temp = Dir$
 
'Dosya bulunamazsa döngüden çık.
If Temp = "" Then Exit Do
list1.AddItem Temp
Loop
  
list1.AddItem "(Yok)"
Show
list1.SetFocus
list1.ListIndex = 0
End Sub
 
'Küçük açıklama: Formun yüklenme aşamasında 
'Setfocus olayını kullanırsanız VB hata verir.
 
Private Sub list1_DblClick()
Dim Temp As String
Dim BMPFile As String
Temp = Tag
If list1.Text = "(Yok)" Then
BMPFile = "(Yok)"
Else
BMPFile = Temp + (list1)
End If
 
SystemParametersInfo SPI_SETDESKWALLPAPER, 0, 
ByVal BMPFile, SPIF_UPDATEINIFILE
 
End Sub
 
'Değiştir tuşu
Private Sub Command1_Click()
list1_DblClick
End Sub
Programınızı çalıştırdıktan sonra karşınıza BMP dosyalarınızın yerini soran bir mesaj kutusu gelecektir. Mesaj kutusuna uygun bir dizin girdikten sonra artık liste kutusundaki ilgili resme çift tıklayarak veya değiştir tuşuna basarak resmi masaüstüne yükleyebilirsiniz. Program aynı zamanda WIN.INI dosyasını da haberdar ediyor.

Kes, Kopyala, Yapıştır

Bir TextBox'ta Kes, Kopyala, Yapıştır, Geri Al işlemlerinin yapılması için iki tane çok kolay yol mevcut. Aşağıdaki örnekler SendKeys methodunu kullanıyor. İşte birinci örnek:

Sub DoEditThing(whatThing As String, onWhat As Object)
    Select Case whatThing
        Case "Copy"
            onWhat.SetFocus
            SendKeys "^C"
        Case "Cut"
            onWhat.SetFocus
            SendKeys "^X"
        Case "Paste"
            onWhat.SetFocus
            SendKeys "^V"
        Case "Undo"
            onWhat.SetFocus
            SendKeys "^Z"
    End Select
End Sub

Aşağıdaki kod aynı işi yapan ikinci örnek:

Sub DoEditThing(whatThing As String, onWhat As Object)
Dim Send$    
   Select Case whatThing
        Case "Copy"
            Send = "^C"
        Case "Cut"
            Send = "^X"
        Case "Paste"
            Send = "^V"
        Case "Undo"
            Send = "^Z"
    End Select
    If Len(Send) Then 
        onWhat.SetFocus 
        SendKeys Send
    End If
End Sub

Şimdi, yukarıdaki iki örnekten birini formunuza ekledikten sonra aşağıdaki kod satırıyla istediğiniz işlemi yapabilirsiniz. DoEditThing Copy|Cut|Paste|Undo*, On_Which_Object**

* - Bir tanesini seçin; Copy, Cut, Paste veya Undo
** - TextBox'ı seçin; (ör. Text1)

System Dizinini Bulmak

Örneğin INI dosyalarını kullanan bir uygulama yazdığınızda, çoğunlukla \System dizinine ihtiyaç duyarsınız. Genellikle bu dizinin yolu "C:\Windows\System\" şeklindedir. Fakat bazı kullanıcılar windows'u farklı sürücü veya dizine kurabilirler. Ve işte bu sorunu çözmek için kullanacağınız kod aşağıda. Bu kodu bir Module'nin declarations section kısmına kopyalayın:

Declare Function GetSystemDirectory Lib "Kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
 
Function VBSysDir() As String
    Dim Gwdvar As String, Gwdvar_Length As Integer
    Gwdvar = Space(255)
    Gwdvar_Length = GetSystemDirectory(Gwdvar, 255)
    VBSysDir = Left(Gwdvar, Gwdvar_Length)
End Function

Daha sonra aşağıdaki kodu kullanarak \System dizininin yolunu bulabilirsiniz: MsgBox VBSysDir & " is the System Directory", vbInformation, "System Directory"

Hızlı Form

Move methodunun, Left ve Top ayarlarından %45 daha hızlı çalıştığını biliyormuydunuz? Özellikle yavaş sistemlerde çok işe yarıyor. Move methodu için kullanacağınız kod aşağıda:

Sub ...
   Form.Move x, y
End Sub...
Bu kadar kolay.

NotePad'ý Çalýþtýrmak

Bazen yazdýðýnýz uygulamanýn Readme dosyasýný görüntülemek için Not defterini çalýþtýrmak kullanýþlý olur. 1. Formun üzerine bir CommandButton yerleþtirin.
2. Aþaðýdaki kodu formun Declarations Section bölümüne kopyalayýn.

   Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
   Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long
   Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
   Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
   
   Const SYNCHRONIZE = 1048576
   Const NORMAL_PRIORITY_CLASS = &H20&
   
   Private Type PROCESS_INFORMATION
      hProcess As Long
      hThread As Long
      dwProcessId As Long
      dwThreadId As Long
   End Type
 
   Private Type STARTUPINFO
      cb As Long
      lpReserved As String
      lpDesktop As String
      lpTitle As String
      dwX As Long
      dwY As Long
      dwXSize As Long
      dwYSize As Long
      dwXCountChars As Long
      dwYCountChars As Long
      dwFillAttribute As Long
      dwFlags As Long
      wShowWindow As Integer
      cbReserved2 As Integer
      lpReserved2 As Long
      hStdInput As Long
      hStdOutput As Long
      hStdError As Long
   End Type

3. Þimdi, aþaðýdaki kodu da Command1_Click olayýna kopyalayýn:

   Dim pInfo As PROCESS_INFORMATION
   Dim sInfo As STARTUPINFO
   Dim sNull As String
 
   sInfo.cb = Len(sInfo)
   success& = CreateProcess(sNull, "notepad.exe e:\anexis\vbpage\vbisland.html", ByVal 0&, ByVal 0&, 1&, NORMAL_PRIORITY_CLASS, ByVal 0&, sNull, sInfo, pInfo)
 
   MsgBox "Notepad has been started. Click OK to end it."
   
   ret& = TerminateProcess(pInfo.hProcess, 0&)
   ret& = CloseHandle(pInfo.hThread)
   ret& = CloseHandle(pInfo.hProcess)
 
   MsgBox "Notepad has been shut down.
4. F5'e basarak uygulamayý çalýþtýrýn.

Task Bar'ı Gizlemek

Windows95 Taskbarı saklayıp, geri getirmek için bir çözüm yolu var. Aşağıdaki kodu kullanarak bu işi kolaylıkla yapabilirsiniz. Önce, aşağıdaki kodu formun General Declarations bölümüne kopyalayın:

    Dim hWnd1 As Long
 
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 
 
    Const SWP_HIDEWINDOW = &H80
    Const SWP_SHOWWINDOW = &H40

Saklamak için aşağıdaki kodu kullanın:

    hWnd1 = FindWindow("Shell_traywnd", "")
    Call SetWindowPos(hwnd1, 0, 0, 0, 0, 0, SWP_HIDEWINDOW)

ve görüntülemek içinde aşağıdakini kullanın:

    Call SetWindowPos(hwnd1, 0, 0, 0, 0, 0, SWP_SHOWWINDOW)

Ses Kartı Var mı?

Şimdi bir çok programda bir olay gerçekleştiğinde küçük sesler duyuluyor. Eğer sizde böyle bir şey yapmak için sisteminizde ses kartı olup olmadığını öğrenmek istiyorsanız aşağıdaki kodu kullanabilirsiniz. Denemek için aşağıdaki kodu bir Modulenin içine kopyalayın.:

    Declare Function waveOutGetNumDevs Lib "winmm.dll" Alias "waveOutGetNumDevs" () As Long

Bu kodu da formunuzun Form_Load olayı altına kopyalayın:

    Dim i As Integer
    i = waveOutGetNumDevs()
    If i > 0 Then
        MsgBox "Your system supports a sound card.", vbInformation, "Sound Test"
    Else
        MsgBox "Your system cannot play Sound Blaster Files.", vbInformation, "Sound Test"
    End If
Şimdi F5 tuşuna basarak kodu deneyebilirsiniz.

Dosya Uzantýsýný Bulmak

Aþaðýdaki fonksiyon bir dosyanýn uzantýsýný döndürüyor.

Function GetExtension(Filename As String)
Dim PthPos, ExtPos As Integer
 
    For i = Len(Filename) To 1 Step -1 ' Go from the Length of the filename, to the first character by 1.
        If Mid(Filename, i, 1) = "." Then ' If the current position is '.' then...
            ExtPos = i ' ...Change the ExtPos to the number.
            For j = Len(Filename) To 1 Step -1 ' Do the Same...
                If Mid(Filename, j, 1) = "\" Then ' ...but for '\'.
                    PthPos = j ' Change the PthPos to the number.
                    Exit For ' Since we found it, don't search any more.
                End If
            Next j
            Exit For ' Since we found it, don't search any more.
        End If
    Next i
    
    If PthPos > ExtPos Then
        Exit Function ' No extension.
    Else
        If ExtPos = 0 Then Exit Function ' If there is not extension, then exit sub.
        GetExtension = Mid(Filename, ExtPos + 1, Len(Filename) - ExtPos) 'Messagebox the Extension
    End If
            
End Function
Fonksiyonu aþaðýdaki gibi çaðýrabilirsiniz. FileExt = GetExtension("c:\windows\vb\vb.exe")

Masaüstü Ýkonlarýný Dizmek

Aþaðýdaki kod aktiv desktop ta bulunan ikonlarý düzenliyor. Önce, Bu kodu bir formun General Declarations bölümüne kopyalayýn:

    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 
    Private Const GW_CHILD = 5
    Private Const LVA_ALIGNLEFT = &H1
    Private Const LVM_ARRANGE = &H1016

Ýkonlarý düzenlemek için de aþaðýdaki kodu kullanýn:

    Dim hWnd1 As Long
    Dim hWnd2 As Long
    Dim Ret As Long
 
    hWnd1 = FindWindow("Progman", vbNullString)
    hWnd2 = GetWindow(hWnd1, GW_CHILD)
    hWnd1 = GetWindow(hWnd2, GW_CHILD)
    Ret = SendMessage(hWnd1, LVM_ARRANGE, LVA_ALIGNLEFT, 0)

Office 97 Araç Çubuğu Yaratmak

Office 97 ile gelen araç çubuğu uygulamaya güzel bir görünüm katıyor. Aslında bunu VBasic ile yapmak içi bir kontrol gelmiyor. Fakat API fonksiyonlarını ve eski Common Controls ToolBar'ı kullanarak bu tür araç çubukları oluşturmak mümkün. 1. Önce yeni bir proje hazırlayın ve Common Controls ActiveX kontrolünü ekleyin.
2. Bir formun üzerine ToolBar kontrolünü yerleştirin ve butonları oluşturun.
3. Şimdi projeye bir Module yerleştirin ve aşağıdaki kodu modülün General Declarations kısmına yerleştirin:

    
Public 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
Public Declare Function SendTBMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
 
Public Const WM_USER = &H400
Public Const TBSTYLE_FLAT = &H800
Public Const TBSTYLE_TRANSPARENT = &H8000
Public Const TB_SETSTYLE = (WM_USER + 56)
Public Const TB_GETSTYLE = (WM_USER + 57)
 
Public Sub MakeToolbarFlat(theToolbar As Control)
 
    Dim Res As Long
    Dim Style As Long
 
    Style = SendTBMessage(FindWindowEx(theToolbar.hwnd, 0&, "ToolbarWindow32", vbNullString), TB_GETSTYLE, 0&, 0&)
    Style = Style Or TBSTYLE_FLAT Or TBSTYLE_TRANSPARENT
    Res = SendTBMessage(FindWindowEx(theToolbar.hwnd, 0&, "ToolbarWindow32", vbNullString), TB_SETSTYLE, 0, Style)
 
    theToolbar.Refresh
 
End Sub

4. Aşağıdaki kodları da formun Form_Load olayına kopyalayın:

    
Call MakeToolbarFlat(Toolbar1)
 
Toolbar1, tabiki ToolBar kontrolünün adı.

Tüm Formlar Kapansın

Çok sayıda açık form içeren uygulamalardaki tüm formları bir kerede kapatmak mı istiyorsunuz. İşte aşağıda bu işi yapan kod parçası.

Public Sub UnloadAllForms(sFormName As String)
Dim Form As Form
   For Each Form In Forms
      If Form.Name <> sFormName Then
         Unload Form
         Set Form = Nothing
      End If
   Next Form
End Sub
Aşağıdaki kodu Ana formunuzun Form_Unload olayına yerleştirin. Call UnloadAllForms Me.Name

Tüm TextBox'lar Temizlensin

Bazen bir form üzerindeki tüm textboxları temizlemek zorunda kalırsınız. İşte aşağıda bunu yapmak için kullanacağınız kod.

Sub ClearAllTextBoxes(frmTarget As Form)
For i = 0 To (frmTarget.Controls.Count - 1)
    Set ctrlTarget = frmTarget.Controls(i)
    'If it's a textbox, clear it
    If TypeOf ctrlTarget Is TextBox Then
        ctrlTarget.Text = ""
    End If
Next i
End Sub
Aşağıdaki kodu da örneğin bir komut butonunun Click olayına yerleştirerek textboxları temizleyebilirsiniz. ClearAllTextBoxes FormName

Dosya Kopyalamak

Aşağıdaki kod parçası da yüzde ölçüsünü kullanarak dosya kopyalamaya yarıyor. Göze güzel görünen uygulamalar yapmak için iyi bir şey.

Function CopyFile (src As String, dst As String) As Single
'L. Serflaten 1996
 Static Buf$
 Dim BTest!, FSize!
 Dim Chunk%, F1%, F2%
 
 Const BUFSIZE = 1024
 
'This routine will copy a file while providing a means
'to support a percent gauge.  Ex. your display routine
'is called "PercentDone" and accepts the values 0-100.
'Error support is provided.
'
'A larger BUFSIZE is best, but do not attempt to exceed
'64 K (60000 would be fine)
'
'The size of the copied file is returned on success
'0 is returned on failure
 
   If Dir(src) = "" Then MsgBox "File not found": Exit Function
   If Len(Dir(dst)) Then
      If MsgBox(UCase(dst) & Chr(13) & Chr(10) & "File exists. Overwrite?", 4) <> 6 Then Exit Function
      Kill dst
   End If
 
   On Error GoTo FileCopyError
   F1 = FreeFile
   Open src For Binary As F1
   F2 = FreeFile
   Open dst For Binary As F2
 
   FSize = LOF(F1)
   BTest = FSize - LOF(F2)
   Do
      If BTest < BUFSIZE Then
         Chunk = BTest
      Else
         Chunk = BUFSIZE
      End If
      Buf = String(Chunk, " ")
      Get F1, , Buf
      Put F2, , Buf
      BTest = FSize - LOF(F2)
      ' __Call percent display here__
      'PercentDone ( 100 - Int(100 * BTest/FSize) )
   Loop Until BTest = 0
   Close F1
   Close F2
   CopyFile = FSize
   Exit Function
 
FileCopyError:
   MsgBox "Copy Error!"
   Close F1
   Close F2
   Exit Function
End Function
Önce formunuza bir ProgressBar kontrolü ekleyip ardından aşağıdaki kodu kullanarak dosya kopyalayabilirsiniz. ProgressBar1.Value = CopyFile (Which_File*, To_Where**) * = Kopyalanacak dosya
** = Kopyalanacağı yer

Dosya Adını Çıkarmak

Bazen full path'i olan bir dosyanın (ör: C:\windows\hello.txt) sadece dosya adı (hello.txt) gerekebilir. İşte onu aradan çıkarmak için aşağıdaki kodu kullanabilirsiniz.

Function StripPath(T$) As String
Dim x%, ct%
    StripPath$ = T$
    x% = InStr(T$, "\")
    Do While x%
        ct% = x%
        x% = InStr(ct% + 1, T$, "\")
    Loop
    If ct% > 0 Then StripPath$ = Mid$(T$, ct% + 1)
End Function
Aşağıdaki kodu kullanarakta dosya adını File değişkenine aktarabilirsiniz. File = StripPath("c:\windows\hello.txt")

Windows Kapansın

Bu kod setup programlarında sistemi resetlemek istediğiniz zaman kullanışlı olur. İşte aşağıdaki kodu kullanarak bu işi kolaylıkla yapabilirsiniz. 1. Aşağıdaki kodu bir formun Declarations section bölümüne kopyalayın:

    Const EWX_LogOff As Long = 0
    Declare Function ExitWindows Lib "User32" Alias "ExitWindowsEx" (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long

2. Aşağıdaki kodu da bir nesnenin olayına kopyalayın (ör: Command1_Click):

    ExitWindows EWX_LogOff, &HFFFFFFFF

Not: Bu kod sadece Exe dosyasından çalışır. Eğer VBasic içinden çalıştırırsanız tüm programlarınızı kapatın.

Textbox Popup Menüleri Çıkmasın

Bildiğiniz gibi textboxların üzerinde sağ tuşa bastığınızda bir Popup Menu çıkar. Bunun çıkmasını istemiyorsanız aşağıdaki kodu kullanabilirsiniz. Kodu formun General Declarations bölümüne kopyalayın:

Sub Text1_MouseDown
        if button=2 then
               text1.enabled=false
               popupmenu <MENUNAME>
               text1.enabled=true
               text1.setfocus
        end if
End Sub

Dosya Taşımak

VBasic'de Name deyimini kullanarak dosya adını değiştirebilirsiniz. Ayrıca Name deyimi dosya taşımaya da yarar. Aşağıdaki örneği inceleyiniz.

    Name "D:\resim.jpg" As "C:\resim.jpg"

API ile Disket Formatlamak

API kullanarak bir diskete format atmak için aþaðýdaki kodu kullanabilirsiniz.
Not: Bu kod harddiske format atabilir, bu nedenle dikkatli olmalýsýnýz. Önce, Bu kodu bir formun General Declarations bölümüne kopyalayýn:

Private Declare Function SHFormatDrive Lib "shell32" _
    (ByVal hwnd As Long, ByVal Drive As Long, ByVal fmtID As Long, _
    ByVal options As Long) As Long
Private Declare Function GetDriveType Lib "kernel32" Alias _
    "GetDriveTypeA" (ByVal nDrive As String) As Long
 

 

Forma iki CommandButtons ekleyin:

Birincinin adý: "cmdFormatDrive"

Ýkincinin adý: "cmdDiskCopy"

 

 

 

Private Sub cmdFormatDrive_Click()

    Dim DriveLetter$, DriveNumber&, DriveType&

    Dim RetVal&, RetFromMsg%

    DriveLetter = UCase(Drive1.Drive)

    DriveNumber = (Asc(DriveLetter) - 65) ' Change letter to Number: A=0

    DriveType = GetDriveType(DriveLetter)

    If DriveType = 2 Then  'Floppies, etc

        RetVal = SHFormatDrive(Me.hwnd, DriveNumber, 0&, 0&)

    Else

        RetFromMsg = MsgBox("This drive is NOT a removeable" & vbCrLf & _

            "drive! Format this drive?", 276, "SHFormatDrive Example")

        Select Case RetFromMsg

            Case 6   'Yes

                ' UnComment to do it...

                'RetVal = SHFormatDrive(Me.hwnd, DriveNumber, 0&, 0&)

            Case 7   'No

                ' Do nothing

        End Select

    End If

End Sub

 

Private Sub cmdDiskCopy_Click()

' DiskCopyRunDll takes two parameters- From and To

    Dim DriveLetter$, DriveNumber&, DriveType&

    Dim RetVal&, RetFromMsg&

    DriveLetter = UCase(Drive1.Drive)

    DriveNumber = (Asc(DriveLetter) - 65)

    DriveType = GetDriveType(DriveLetter)

    If DriveType = 2 Then  'Floppies, etc

        RetVal = Shell("rundll32.exe diskcopy.dll,DiskCopyRunDll " _

            & DriveNumber & "," & DriveNumber, 1) 'Notice space after

    Else   ' Just in case                         'DiskCopyRunDll

        RetFromMsg = MsgBox("Only floppies can" & vbCrLf & _

            "be diskcopied!", 64, "DiskCopy Example")

    End If

End Sub

 

 

 

Forma birde Drive1 adlý DriveList ekleyin:

 

 

 

Private Sub Drive1_Change()

    Dim DriveLetter$, DriveNumber&, DriveType&

    DriveLetter = UCase(Drive1.Drive)

    DriveNumber = (Asc(DriveLetter) - 65)

    DriveType = GetDriveType(DriveLetter)

    If DriveType <> 2 Then  'Floppies, etc

        cmdDiskCopy.Enabled = False

    Else

        cmdDiskCopy.Enabled = True

    End If

End Sub

Web Sayfası İçin Kısayol Yaratmak

Çoğu kişi bunun nasıl yapılacağını bilmek istiyor. Aslında çok kolay. Aşağıdaki kod varsayılan tarayıcınızı açarak yazmış olduğunuz adresi getirmeye başlar. Aşağıdaki kodu bir modulenin içine kopyalayın:

    Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    Public Const SW_NORMAL = 1

Bu kodu da bir nesnenin herhangi bir olayına kopyalayın (ör: Command1_Click):

    Dim X
    X = ShellExecute(hwnd, "Open", "http://www.geocities.com/SiliconValley/Software/5465/", &O0, &O0, SW_NORMAL)
 

Visual BasicÖrnek Projeler

Bu bölümde bulunan projeler ziplenmiş haldedir. Bilgisayarınıza indirdikten sonra Winzip veya benzeri programları kullanarak açıp kullanabilirsiniz. Projelerin hepsi VBasic 5.0 da çalışıyor. 6.0 sürümünde denemedim ama sanırım çoğu çalışır. Elime yeni projeler geçtikçe bu bölüme eklemeye çalışacağım.

WinKapat

Windowstan çıkmanızı sağlar.

SeriNo

HardDiskin seri nosunu verir.

KesikWin

Yuvarlak bir form elde etmenizi sağlar.

Tonlama

Bu kod ile Diagonal, Yatay, Dikey ve Solid Renk tonlamaları yapabilirsiniz.

ArkaDose

Formların üzerini Bmp resimleri ile kaplamanızı sağlar.

Sys-Tray

Başlat çubuğundaki Küçük Hoparlör ve Dil simgesini bilirsiniz. İşte bu kod formunuzun ikonunu oraya yerleştiriyor.

İlkHarfBüyük

Text kutusuna yazı girerken Space tuşuna her basışta ilk harf otomatik olarak büyük yazılır.

AlanHesap

Girdiğiniz sürücünün Sektör ve Byte sayısını, Toplam ve Boş disk alanını hesaplar.

Faktöriyel

Girdiğiniz sayının faktöriyelini hesaplar.

Çevirmen

Girdiğiniz rakamı yazıya çevirir.

Capslock

Capslock ve Numlock'u Visual Basic içinden değiştirmeye yarayan kod.

Çizim

Bir PictureBox'ın üzerine yuvarlak şekiller çizip içini rasgele renklerle doldurmaya yarar.

CompName

Windows'u kurarken yazdığınız bilgisayar ismini verir.

Çözünürlük

Bu kod ile çözünürlüğü değiştirebilirsiniz.

Dialog

VBasic'de Dosya Aç ve Farklı Kaydet diyaloglarının çıkarılmasını gösteren bir örnek.

DizinYarat

Bu kod ile Dizin yaratıp, içine dosya kopyalayabilir ve dizini silebilirsiniz.

DosyaArama

Yazdığınız dosya ismini harddiskte arayan ve girdiğiniz Path altındaki dizin ve dosya sayısını gösteren bir örnek kod.

FormTaşı

Bu kod ile formları ortasından tutup taşıyabilirsiniz.

GeriDönüşüm

Sildiğiniz dosyaları Geri Dönüşüm Kutusuna gönderen bir kod.

GrupYarat

Windows'un programlar grubu altında bir grup yaratmak için gerekli olan kod. Yarattığınız grup altında kısayol yaratmanızda mümkün.

HelpFile

Hlp uzantılı dosyaların kullanımını gösteren bir örnek.

FileInfo

Seçtiğiniz dosyanın bilgilerini ve ikon görüntüsünü verebilen bir kod.

ListBox

ListBox kontrolü hakkında bir örnek kod.

PlayMid

Mid dosyalarını çalabilmenizi sağlayan bir örnek kod.

OpenCd

Bu kod ile Cd kapağını açıp kapayabilirsiniz.

PicMenu

Yaptığınız uygulamalarda resimli menü kullanmak istiyorsanız bu kodu kullanın.

PicZoom

Image kontrolüne yerleştirdiğiniz resimi büyütebilmenizi sağlayan kod.

Regedit

Visual Basic içinden bazı registry işlemlerinin yapılışını gösteren bir kod.

RunProg

Bu kod o anda çalışan programların listesini verir ve üzerinde bazı işlemler yapmanızı sağlar.

AlarmSaat

Alarmlı bir saat örneği.

SağTıkla

Windowsta bir dosyanın üzerine sağ tıkladığınızda çıkan menüyü Vbasic'de çıkarmanızı sağlar.

Şekil

Dikdörtgen, Kare gibi şekiller oluşturmanızı sağlayan kod.

Taşıma

Bir formu taşınamaz hale kod kullanarak getirebilirsiniz.

TelÇevir

Vbasic içinden Telefon Çeviriciyi kullanmanızı sağlayan bir kod.

CdRom

CdRom sürücünüzün hangi sürücü harfinde olduğunu gösterir.

Circle

Formun ortasına farklı renklerde bir çok daire çizer.

SysColor

Bu kod ile Windowsun renk derinliğini öğrenebilirsiniz.

CountDown

Bu da bir gerisayım yapan kod örneği.

Ctrl-Alt-Del

Bu kod ile Ctrl-Alt-Del tuşlarını iptal edebilirsiniz.

Encrypt

Girdiğiniz bir yazıyı şifreleyip tekrar açabilen kod.

FindText

Bu kod ile bir metin içinde kelime arama ve tekrar arama yapabilirsiniz.

Image

Bu da bir resim editörü. Resimi renksiz yapabilir, 180 derece çevirebilirsiniz. Zoom yapma özelliği de var.

Loto

49 sayı içerisinden 6 sayı seçen bir kod.

Online

Bu kod ile online olup olmadığınızı bulabilirsiniz.

OnlyNumbers

Bir textbox'a sadece rakam girmeyi istiyorsanız bu kodu kullanın.

Roman

Numerik rakamları Roman rakamlarına çeviren ve tersini yapan bir kod.

Rotate

Bu kod form üzerindeki bir yazıyı çevirmeye yarıyor.

TicTacToe

Bu da iki kişilik bir zeka oyunu.

ZamanTopla

Bu kod "23:21:48" şeklinde yazdığınız iki zamanı topluyor.

Visual Basic İle MP3 Player Oluşturmak

Sizlerle bu ay basit bir MP3 Player oluşturacağız. Visual Basic içinden MP3 çalmak için MP3Play adlı bir OCX bulunmaktadır. Bu OCX’i ailenizin Web sitesi PC Magazine Online Dergide Adı Geçen Dosyalar bölümünden download edebilirsiniz. Dosyanın adı MP3Play.zip. Bu OCX MP3lerin ilk 30 saniyesini çalabilmektedir. Programı kayıt ettiğiniz taktirde MP3leri tam bir biçimde çalabiliyor. Bu OCX’i biraz tanıyalım.

MP3Play.Open => Bir MP3’ü açmaya yarar.

MP3Play.Play => Bir MP3’ü çalmaya yarar.

MP3Play.Stop => Çalan MP3’ü durdurur.

MP3Play1.Pause => Çalan bir MP3’ü dondurur.

MP3Play.Close => MP3’ü kapatır.

MP3Play1.Authorize => MP3Play kontrolünü kayıt etmeye yarar.

MP3Play kontrolünü download ettiğinizde içinden bir tane örnek hazırlanmış MP3 Player örneği çıkacaktır. Buradaki komutları öğrenerek kendi MP3 Player’ınızı yapabilirsiniz. Ancak bu kontrol içinden çıkan örnek karışık bir örnektir. Yazımızın devamında kendimizin nasıl bir MP3 Player yapacağımızı anlatacağım.

Öncelikle aşağıdaki gibi bir örnek form hazırlayın.

Command butonlarının yazı tiplerini ‘Marlett’ olarak belirleyin. Böylece sembolleri kolayca yerleştirebilirsiniz.

MP3Play.OCX ile gelen örnekte bir çok metin kutusu kullanıcının kafasını karıştırmakta. Onların bir çoğu hata döndürmek için kullanılmıştır. Örnek formumuzda biz bunları kullanmayacağız. Şimdi formumuza zip paketinden çıkan MP3 Play kontrolünü ekleyin. Ancak bundan önce her kontrolü olduğu gibi bunu da Windows’a tanıtmalıyız. Windows\System dizini altındaki Regsvr32(Register Server) programının üzerine MP3play.OCX ini sürükleyip bırakın. Ekrana OCX’in kaydedildiğine dair bir mesaj gelecektir.

Şimdi Visual Basic penceresine geri dönüp kontrolü formumuza ekleyelim. Öncelikle çalınacak MP3’ün nerede olduğunu ‘Çalan parçanın ismi’ adlı yere yazıyoruz. (Örn:C:\MP3s\Deneme.MP3) Daha sonra Play butonunun click olayına şu kodu giriyoruz:

Private Sub Command3_Click()

MP3Play1.Open Text2.Text, " "

MP3Play1.Play

End Sub

Bu kodu girdiğimizde text2’ye yazdığımız parça açılıp çalınacaktır. Bunu bir CommonDialog kontrolü ile de yapmak mümkündür. Şimdi Pause butonunun click olayına şu kodları girin

Private Sub Command4_Click()

MP3Play1.Pause

End Sub

Bu kodu girdiğimizde Player’ın pause olayını da halletmiş oluyoruz. Son olarak Stop butonunun click olayına aşağıdaki kodu girin:

Private Sub Command2_Click()

MP3Play1.Stop

End Sub

GRAFİK PROGRAMLAMA  
Dikey Tarama (Vertical Retrace, Vertical Blank):

Eski basit osiloskop düzenlerinde ve bazı gösterge cihazlarında katod ışını, tarama yaparak değil , çizime göre (rasgele-random) bir hareket yaparlardı. Örneğin bir üçgen çizmek için, katod ışınının üç yönde hareket etmesi gerekiyordu. Bu sistem, o günkü basit cihazların ekran yapıları için yeterliydi. Karmaşık grafiklerin çizilmesi, bu sistemi çok zorluyordu. Ayrıca hareket eden bir grafiğin çizilmesi sırasında, her bir çerçevenin çizimi, farklı sürelerde tamamlanıyordu. Karmaşık grafikler çok uzun zaman alıyordu. Basit grafikler ise çok kısa sürede çiziliyordu. Bu homojen olmayan hız dağılımı, multimedya uygulamalarının gerçekleştirilememesine yol açıyordu. Bunun üzerine, ekranın, baştan sona her satırını tek tek tarayarak grafik çizen satır taramalı sistem geliştirildi. Bu sistemle her bir çerçeve eşit sürede çizilebilir hale geldi. Satır tarama sistemli bir katod ışın tüpü olan bilgisayar ekranı, görüntüleri satır satır çizer. Katod ışınının hareketi, soldan sağa ve yukarıdan aşağıya doğrudur. Boş veya çizilecek bir grafik olsun, her satır bu şekilde taranır. Retrace, aslında katod ışının yatay veya dikey tarama bitiminde sırasında hızla, tekrar ilk konumuna gelmesi hareketidir. Yatay tarama sonunda katod ışının bir alt satıra ve tekrar başa (en sağdan sol kenara) gelmesine Horizontal Retrace denir. Dikey tarama sırasında katod ışının tekrar başa (en alttan üst kenara) dönmesine ise Vertical Retrace denir. Dikey tarama, katod ışınının yukarıdan aşağıya ekranın tüm satırlarını taramasıdır. Bu tarama işlemi saniyede 75 kez (donanıma ve ayarlarına göre değişebilir) tekrarlanır. Tarama frekansının 75 Hz olduğunu bu şekilde anlarız. Tarama frekansı ne kadar yüksek olursa insan gözü o kadar rahatlar. Tarama frekansı düşük olduğu zaman, göz taramayı farkeder ve algılamak için uğraşır, yorulur. Tarama işlemi sırasında ekrana bir şey çizersek, çizimde kesiklikler ve anlık (fakat farkedilir) bozukluklar olur. Bu bozuklukların oluşmasını engellemek için dikey taramanın tamamlanmasını bekleyip, çizimimizi taramadan sonra yapmalıyız. Bu işleme Dikey Taramanın Beklenmesi (Waiting for Vertical Retrace,WaitVB) denir. Sayfalama tekniği (örneğin Double Buffering) ile beraber dikey taramanın beklenmesi işlemi yapılırsa sorunsuz animasyonlar oluşturulabilir. Eğer grafiklerimiz dikey taramanın tamamlanmasından daha kısa bir sürede hesaplanabiliyor ve çizime hazır hale getirilebiliyorsa, dikey taramayı beklemek, animasyonların bir 386’da ve bir Pentium’da aynı hızda görüntülenebilmesini sağlayabilir. Pratikte pek kullanılmayan bu faydaya, eski oyun ve demoları yeni bilgisayarlarınızda çalıştırırken rastlamanız mümkün. Saniyede 75 çerçeve (fps –Tarama frekansımız=75) ile uygulamanızın grafik hızı sabit tutulmuş olur. Bu değerden daha yüksek bir hıza çıkılamaz fakat daha düşük bir hız her zaman mümkündür.

l Piksel: Grafikler iki boyutlu düzlemlerde noktaların birleşiminden meydana gelir. Bilgisayar ekranında bu noktalara piksel denir. Piksellerin büyüklüğü kullanılan ekran çözünürlüğüne göre değişir. Piksel, ekranda tam olarak bir fiziksel yapı değildir, bir görüntüdür,ışık kümesidir. Grafik modda en küçük birim pikseldir. Metin (text) modunda ise en küçük birim, gerçekte bir piksel topluluğu olan karakterdir. Bir pikseli ifade etmek için 3 parametre kullanılır. Bunların ikisi, iki boyutlu düzlemde(ekranda) pikselin yerini gösteren (x ve y) kordinatı, diğeri ise rengini gösterir. Bilgisayar grafiği bellekte tutulurken sadece renk değeri saklanır. Kordinat ise pikselin saklandığı yerin bellekteki sırası yardımı ile hesaplanır.

MCGA (VGA 320x200x256 modu – Mod 13h)

Bilmemiz gereken terimlere ve önemli noktalara değindikten sonra PC’de grafik programlamaya başlayabiliriz. Bu bölümde baştan sona bir grafik kütüphanesini oluşturacağız. Bir standart olması ve basitliği nedeni ile kütüphanemizi mod 13h için tasarlayacağız. Diğer modlarda çalışmak isteyenlere şunu söyleyebiliriz: Kütüphane içindeki fonksiyonların yapısını anlayarak daha sonra, istediğiniz ekran moduna, bu fonksiyonları aktarmanız zor olmayacaktır.

MCGA 320x200x256 renk (8 bit) ekran modu, demo ve oyunlarda belki de PC tarihinde (metin modundan sonra) en çok kullanılan mod olmuştur. Bu modun, bu kadar popüler olmasının nedenleri bellidir:

l MCGA hafıza düzenlemesi ve hesaplamaları en basit moddur.

l Eski 4-16 renkli oyunlara göre 256 kullanılabilmesi bir avantajdır.

l Renk başına 8 bit yani 1 bayt yer ayrılır.

l 320x200=64000 bayt ile tüm ekran tek segmentte tutulabilir.

l Hemen hemen tüm ekran donanımları, bilgisayarlar bu modu destekler.

l SVGA modlarına göre çok daha hızlı grafik işlemleri yapılabilir.

Derleyiciler (özellikle Borland derleyicileri) bu modu tam olarak desteklemez. Gerekli BGI veya kütüphane, sonradan yüklenmeli yada programcıların yaptığı gibi kendi grafik kütüphanemizi yazmalıyız.

MCGA moduna, VGA kartlarının desteklediği ve içerdiği en yüksek renk sayısına sahip mod olduğu için VGA olarak da isimlendirilmektedir.

l Kordinat Düzlemi: Ekrana bir çizim yapmadan önce, çizimin nereye yapılacağını bilmemiz gerekir. İki boyutlu bir düzlemde bir noktanın yeri iki parametre ile belirtilir. Bunlar, belirtilmek istenen noktanın, referans(orijin) alınan bir noktaya yatay ve dikey uzaklığıdır. Ekranda referans olarak kullanılan nokta yani orijinimiz sol-üst köşedir. Bu köşe (0,0) olarak gösterilir.

MCGA modunda ekran, yatayda 320 piksel ve dikeyde 200 piksel uzunluğundadır. 2 boyutlu düzlemde bir nokta tarif edilirken, x(yatayda uzaklık) önce ve y(dikeyde uzaklık) sonra olmak üzere (x,y) şeklinde gösterilir.

Sol üst köşe: (0,0)

Sağ üst köşe: (319,0)

Sol alt köşe: (0,199)

Sağ alt köşe: (319,199)

Ekranın ortasında bir noktayı ise (160,100) şeklinde tanımlayabiliriz.

Bir pikselin ekranda gösterilmesi için, video belleğine uygun şekilde renk d eğerinin yazılması gerekir. MCGA modunda video tamponu ( video belleğinin sistem belleğindeki eşiti) A000h segmentinde (fiziksel belleğin A0000h noktasından itibaren) bulunmaktadır. Bu segment baz alınır ve basit offset hesaplamaları ile grafik çizilir.

Bellekte pikselin yerini bulmak için basitçe şu şekilde bir formül kullanabiliriz.

Pikselin (Offset) Adresi= (Yatay_Çözünürlük * y) + x

MCGA için bu formül:

Offset = (320 * y) +x

Ekranın ortasına sarı renkli bir nokta çizmek için (320 * 100) + 160 = 32160 offset adresine 14 renk değerini yazarız.

32160 = 7DA0h

A000:7DA0 = 14

Ekranın sol köşesinde sarı bir kare (3x3piksel) düşünelim. Bellekteki görünümü aşağıdaki şekilde olacaktır.

Ekran modunu değiştirmek için BIOS’un (Basic Input/Output System) fonksiyonlarını kullanabiliriz. Kesme 10h, BIOS’un video fonksiyonlarını içeren parçasıdır. Kesme 10h’ın 0’ıncı fonksiyonu Video modunu ayarlamak için kullanılır.

Kesme 10h, Fonksiyon 00h

(Video Modunu Ayarlama)

AH = 00h (fonksiyon)

AL = 13h (ekran modu)

320x200x256 MCGA modunun BIOS numarası 13h’dır. Standart ekran kartlarının desteklediği diğer modlar, basitçe şu şekilde listelenebilir.

* CGA ve EGA sistemlerinde renkler gri tonlamalarıdır.

Grafik modlarının çoğunda A000h video segmentidir. (04h,05h,06h grafik modları için segment B800h’dır.) Text modda ise segment, mono ekranlar için B000h, renkli ekranlar için B800h dır.

Evet mod 13h’ın bu teknik bilgilerini aldıktan sonra ekrana ilk grafiğimizi çizdirebiliriz. Aşağıdaki örnekler ekranın ortasına sarı bir nokta çiziyor. (Basit fakat mcga kodlamasını öğrenmek için ideal ;)

Örneği C,Pascal ve Assembly kodları olarak veriyoruz. Bu, grafik programlamasının, sizi o kadar sıkmayacağını, esnek olduğunu ve bir çok dilde yapılabileceğini anlamanıza yardımcı olacaktır.

//C Örneği mcga1.c

#include <dos.h>

#include <conio.h>

unsigned char far *ekran=(unsigned char *)MK_FP(0xA000,0);

main()

{

short int x=160,y=100;

unsigned char renk=14;

REGS r;

r.h.ah=0x00; // Fnk = 00h (Mod Ayarla)

r.h.al=0x13; // Mod = 13h (320x200x256)

int86(0x10,&r,&r);

// (160,100) 'e bir nokta koy:

*(ekran+(y*320)+x)=renk;

getch();

r.h.ah=0x00; // Fnk = 00h (Mod Ayarla)

r.h.al=0x03; // Mod = 03h (Text mod)

int86(0x10,&r,&r);

}

{Pascal Örneği mcga1.pas}

uses crt,dos;

var

r:registers;

const

ekran:word=$a000;

x:integer=160;

y:integer=100;

renk:byte=14;

begin

r.ah:=$00; {fnk=mod ayarla}

r.al:=$13; {mod=320x200x256}

intr($10,r);

{(160,100)'e bir nokta koy}

mem[ekran:(y*320)+x]:=renk;

readkey;

r.ah:=$00; {fnk=mod ayarla}

r.al:=$03; {mod=text mod}

intr($10,r);

end.

;Assembly Örneği mcga1.asm

.model tiny

.code

.startup

jmp basla

ekran dw 0a000h

x dw 160

y dw 100

renk db 14

basla:

mov ah,00h ; fnk=mod degistir

mov al,13h ; mod=320x200x256

int 10h

;(160,100)'a bir nokta koy.

mov es,ekran

mov ax,320

mul y

add ax,x

mov di,ax

mov al,renk

stosb

xor ax,ax

int 16h

mov ah,00h ; fnk=mod degistir

mov al,03h ; mod=text mod

int 10h

int 20h

end

Mcga1 örneğinin yaptığı iş çok basit:

1. Grafik Moda geç.

2. Noktanın konulacağı bellek adresini hesapla.

3. Renk değerini, hesaplanan bellek adresine koy.

4. Bir tuşa basılana kadar bekle.

5. Text Moda geri dön.

özgür taştepe

ozgurt@softhome.net

Delphi Kullanarak Oyun Programlama -VII-

Merhaba. Bu ay Fatih Şahin'nin yapmış olduğu oyunu ve DGC Component Package'i anlatmayı bitiriyoruz.

Diğer ay DelphiX Component Package'i en ince ayrıntısına kadar öğrenmeye başlayacağız.

procedure TForm1.ShowIntro;

var

MYPos: Integer;

Dir : Integer;

xl : integer;

yl : integer;

begin

If not ShowTitle then exit;

MYPos := -1500;

Dir := 1;

Timer1.Enabled := False;

DGCScreen1.FadePaletteOut(15);

DGCScreen1.Back.Erase(0);

DGCScreen1.Flip;

DGCScreen1.Back.Erase(0);

DGCScreen1.Flip;

DGCScreen1.Back.Erase(0);

DGCScreen1.FadePaletteIn(1);

While ShowTitle do

begin

Application.ProcessMessages;

DGCScreen1.Back.Erase(0);

DGCScreen1.DrawMap(DGCScreen1.Back,0,0,0,MYPos,10,False);

Inc(MYPos,Dir);

if (MYPos < -1500) or (MYPos > 0) then Dir := -Dir;

with DGCScreen1.Back.Canvas do

begin

Brush.Style := bsClear;

Font.Size := 12;

Font.Color := clBlue;

TextOut(12,22, 'KONDOPLAY GAME PROGRAMMING GR.');

Font.Color := clYellow;

TextOut(10, 20, 'KONDOPLAY GAME PROGRAMMING GR.');

Font.Size := 8;

Font.Color := clWhite;

TextOut(25, 50, 'Use ARROW KEYS for Movement');

TextOut(35, 60, 'UP ARROW KEY = Jump');

TextOut(35, 70, 'LEFT ARROW KEY = Move Left');

TextOut(35, 80, 'RIGHT ARROW KEY = Move Right');

TextOut(35, 90, 'UP+LEFT ARROW KEY = Jump to Left');

TextOut(35, 100, 'UP+RIGHT ARROW KEY = Jump to Right');

Font.Size := 8;

Font.Color := clYellow;

TextOut(45, 150, 'Press SPACE Button to Start');

TextOut(205, 170, 'Press Escape to Quit');

Release;

end;

DGCScreen1.Flip;

end;

DGCScreen1.FadePaletteOut(15);

If Quit then exit;

DGCScreen1.Back.Erase(0);

DGCScreen1.Flip;

DGCScreen1.Back.Erase(0);

DGCScreen1.Flip;

DGCScreen1.Back.Erase(0);

xPos := 0;

Py := 152;

Speed := 0;

anim := 14;

AnimDir := 0;

yon :=0;

artis[1]:=1;

solyon[1]:=26;

sagyon[1]:=22;

kareno[1]:=0;

karesayisi[1]:=8;

artis[2]:=1;

solyon[2]:=26;

sagyon[2]:=22;

kareno[2]:=0;

karesayisi[2]:=8;

artis[3]:=1;

solyon[3]:=26;

sagyon[3]:=22;

kareno[3]:=0;

karesayisi[3]:=8;

artis[4]:=1;

solyon[4]:=32;

sagyon[4]:=30;

kareno[4]:=0;

karesayisi[4]:=4;

artis[5]:=1;

solyon[5]:=26;

sagyon[5]:=22;

kareno[5]:=0;

karesayisi[5]:=8;

cicekanim[1]:=36;

cicekanim[2]:=36;

cicekanim[3]:=36;

cicekanim[4]:=36;

havadadurus:=false;

havacount:=0;

randomize;

for yl := 0 to 14 do

begin

for xl := 0 to 199 do

begin

DGCScreen1.SetMapTile(0,xl,yl,MapHold[yl][xl]);

end;

end;

DGCScreen1.FadePaletteIn(1);

GameOver := False;

end;

procedure TForm1.DGCScreen1Initialize(Sender: TObject);

var

x,y : integer;

begin

for y := 0 to 14 do

begin

for x := 0 to 199 do

begin

MapHold[y][x] := DGCScreen1.GetMapTile(0,x,y);

end;

end;

end;

end.

DELOIRE

Evet, beklenen an: DJGPP gelecek ay dergimiz ile birlikte verilecek. Buna mukabelen bu sayıdan itibaren DJGPP anlatacağız.

Delorie’nin gelecek ay CD’mizde verilecek olan KGG Package sürümü KGG tarafından hazırlanmış kolaylıkla install edilebilir DJGPP v2 sürümüdür. Gelecek aya kadar bekleyemem diyorsanız ve Internet bağlantınız var ise aşağıdaki adresden DJGPP v2 KGG package’i download edebilirsiniz.

ftp://ftp.tbd.org.tr/pub/kgg/compilers/djgpp.zip

DJGPP’yi gerekli dosyalar elinde olup da tam kuramayan bir çok okuyucumuz var. Bunun nedeni DJGPP için iyi bir install programı olmayışı. Aslında DJGPP bir çok zip’li dosyanın (paketin) aynı dizine açılmasıyla kuruluyor. Fakat hangi paketlerin kurulum için gerekli olduğunu toplam 300 MB’ı bulan yüzlerce DJGPP paketleri içinden seçmek biraz zor.

Biz, sizin için seçtiğimiz paketlerden oluşan kurulmuş haldeki DJGPP’yi (tipik şekilde) zip formatında sıkıştırarak sizlere sunuyoruz. Bu zip’li dosyayı C:\DJGPP dizini altına açmanız ve autoexec.bat dosyanıza şu satırları eklemenizle birlikte kuruluş işlemini bitirmiş oluyorsunuz.

SET DJGPP=C:\DJGPP\djgpp.env

SET PATH=%PATH%;C:\DJGPP\BIN

Autoexec.bat dosyanızı bu değişikliklerle yeniden çalıştırmak için bilgisayarınızı kapatıp yeniden açmanız önerilir. Bu andan sonra derleyicinizi kullanabilirsiniz.

Hemen ilk programımızı yazalım. Bu programı yazmak için DJGPP içinde bulunan pico editörü veya herhangi bir text editörünü kullanabilirsiniz.

//========================

// DJGPP Test Programı KGG 1999

// Derleme: gcc ilk.c -oilk.exe

//========================

#include <stdio.h>

#include <conio.h>

main()

{

printf("Kondor Geliştirme Grubu iyi çalışmalar diler.");

getch();

}

"ilk.c" ismi ile dosyayı kaydedip, hemen deneme yapabilirsiniz.

GCC ilk.c -oilk.exe

Evet komut satırından ilk.exe yazınca görebileceğiniz gibi DJGPP ile iyi çalışmalar dileriz.

Özgür Taştepe

ozgurt@softhome.net

Kondor Geliştirme Grubu

http://kondor.tsx.org

Bu ay sizlere Visual Basic içinden Registry’i nasıl kullanacağımızı anlatacağım. Visual Basic içinden Registry’yi kullanmak bize büyük yarar sağlayacaktır. 16 bit uygulamalar program kayıtlarını tutmak için hala .ini dosyalarını kullanıyorlar. Oysa Registry daha kullanışlı ve daha güvenilir bir araç. Mesela programımızın en son kapatıldığı zamanki koordinatlarını Registry’ye kaydedebilir ve programımız tekrar açıldığında bu koordinatlar üzerinde çalışmasını sağlayabiliriz. Visual Basic kendi içindeki bir fonksiyonla buna olanak tanır.

SaveSetting App.Title, "Ayarlar", "sol", Me.Left

Örnek olarak yukarıdaki fonksiyonu incelersek SaveSetting fonksiyonu ile programımız çalıştığında ne kadar sol da olduğunu Registrye kaydeder. Bunu programın Query_Unload olayına girersek programımız kapatıldığı zaman bu ayarı kaydeder. Program tekrar açıldığında bu değeri okutmak için şöyle bir kod kullanabiliriz:

Me.Left = GetSetting(App.Title, "Ayarlar", "sol")

Burada programı az önce kaydettiğimiz değeri okumak için GetSetting komutunu kullandık. Bu komut kaydedilen değeri okumaya yarar. Bu komut kullanışlı bir komut olmasının yanında istediğimiz herhangi bir anahtara kayıt yapmamızı engeller. Bu değeri söyle bir anahtara kaydeder:

HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings/ProjeAdı

Visual Basic bu komutu kullandığımızda değerleri bu anahtara kaydeder. Ama istediğimiz bir anahtara kayıt yapmak istersek ne yapmalıyız? Her zaman olduğu gibi Windows Apileri kullanarak bu olayı gerçekleştirebiliriz.

ANAHTARLAR OLUŞTURMAK

Bu olayı gerçekleştirmek için bir modül kullanmamız gerek. Önce modül içinde kullanacağımız "declare"leri tanıyalım.

Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long

Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long

Public Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long

Public Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long

RegOpenKey: Herhangi bir anahtarı açar.

RegCloseKey: Herhangi bir anahtarı kapatır.

RegCreateKey: Bir anahtar yaratır.

RegDeleteKey: Herhangi bir anahtarı siler.

RegDeleteValue: Herhangi bir değeri siler.

RegEnumKey: Sıralı okuma.

Kullanacağımız fonksiyonları kısaca tanıdıktan sonra sıra modül içindeki tanımlamaları yapmaya geldi.

Public Const HKEY_CLASSES_ROOT = &H80000000 ‘Bu anahtarı açmak için

Public Const HKEY_CURRENT_USER = &H80000001 ‘Bu anahtarı açmak için

Public Const HKEY_LOCAL_MACHINE = &H80000002 ‘ Bu anahtarı açmak için

Public Const HKEY_USERS = &H80000003 ‘Bu anahtarı açmak için

Public Const HKEY_PERFORMANCE_DATA = &H80000004 ‘Bu anahtarı açmak için

Public Const HKEY_CURRENT_CONFIG = &H80000005 ‘Bu anahtarı açmak için

Public Const HKEY_DYN_DATA = &H80000006 ‘ Bu anahtarı açmak için

Public Const REG_SZ = 1

Public Const REG_BINARY = 3 ‘İkili değer için

Public Const REG_DWORD = 4 ‘Dword değeri için

Public Const ERROR_SUCCESS = 0& ‘Hata döndürmek için

Şimdi tanımlamaları yapmaya başlıyoruz.

Option Explicit

Public Const HKEY_CLASSES_ROOT = &H80000000

Public Const HKEY_CURRENT_USER = &H80000001

Public Const HKEY_LOCAL_MACHINE = &H80000002

Public Const HKEY_USERS = &H80000003

Public Const HKEY_PERFORMANCE_DATA = &H80000004

Public Const HKEY_CURRENT_CONFIG = &H80000005

Public Const HKEY_DYN_DATA = &H80000006

Public Const REG_SZ = 1

Public Const REG_BINARY = 3

Public Const REG_DWORD = 4

Public Const ERROR_SUCCESS = 0&

Public Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long

Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long

Public Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long

Public Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long

Public Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long

Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long

Public Sub AnahtarYarat(hKey As Long, strPath As String)

Dim hkeycur As Long

Dim RegDurum As Long

RegDurum = RegCreateKey(hKey, strPath, hkeycur)

If RegDurum <> ERROR_SUCCESS Then

End If

RegDurum = RegCloseKey(hkeycur)

End Sub

Public Sub AnahtarSil(ByVal hKey As Long, ByVal strPath As String)

Dim RegDurum As Long

RegDurum = RegDeleteKey(hKey, strPath)

End Sub

Public Sub DegerSil(ByVal hKey As Long, ByVal strPath As String, ByVal strValue As String)

Dim hkeycur As Long

Dim RegDurum As Long

RegDurum = RegOpenKey(hKey, strPath, hkeycur)

RegDurum = RegDeleteValue(hkeycur, strValue)

RegDurum = RegCloseKey(hkeycur)

End Sub

Public Function StringOku(hKey As Long, strPath As String, strValue As String, Optional Default As String) As String

Dim hkeycur As Long

Dim DegerTipi As Long

Dim TBuf As String

Dim TBufUzun As Long

Dim Sifir As Integer

Dim RegDurum As Long

If Not IsEmpty(Default) Then

StringOku = Default

Else

StringOku = ""

End If

RegDurum = RegOpenKey(hKey, strPath, hkeycur)

RegDurum = RegQueryValueEx(hkeycur, strValue, 0&, DegerTipi, ByVal 0&, TBufUzun)

If RegDurum = ERROR_SUCCESS Then

If DegerTipi = REG_SZ Then

TBuf = String(TBufUzun, " ")

RegDurum = RegQueryValueEx(hkeycur, strValue, 0&, 0&, ByVal TBuf, TBufUzun)

Sifir = InStr(TBuf, Chr$(0))

If Sifir > 0 Then

StringOku = Left$(TBuf, Sifir - 1)

Else

StringOku = TBuf

End If

End If

Else

End If

RegDurum = RegCloseKey(hkeycur)

End Function

Public Sub DegerKaydet(hKey As Long, strPath As String, strValue As String, strData As String)

Dim hkeycur As Long

Dim RegDurum As Long

RegDurum = RegCreateKey(hKey, strPath, hkeycur)

RegDurum = RegSetValueEx(hkeycur, strValue, 0, REG_SZ, ByVal strData, Len(strData))

If RegDurum <> ERROR_SUCCESS Then

End If

RegDurum = RegCloseKey(hkeycur)

End Sub

Public Function BuyukDegerAl(ByVal hKey As Long, ByVal strPath As String, ByVal strValue As String, Optional Default As Long) As Long

Dim RegDurum As Long

Dim DegerTipi As Long

Dim TBuf As Long

Dim TBufUzun As Long

Dim hkeycur As Long

If Not IsEmpty(Default) Then

BuyukDegerAl = Default

Else

BuyukDegerAl = 0

End If

RegDurum = RegOpenKey(hKey, strPath, hkeycur)

TBufUzun = 4

RegDurum = RegQueryValueEx(hkeycur, strValue, 0&, DegerTipi, TBuf, TBufUzun)

If RegDurum = ERROR_SUCCESS Then

If DegerTipi = REG_DWORD Then

BuyukDegerAl = TBuf

End If

Else

End If

RegDurum = RegCloseKey(hkeycur)

End Function

Public Sub BuyukDegerKaydet(ByVal hKey As Long, ByVal strPath As String, ByVal strValue As String, ByVal lData As Long)

Dim hkeycur As Long

Dim RegDurum As Long

RegDurum = RegCreateKey(hKey, strPath, hkeycur)

RegDurum = RegSetValueEx(hkeycur, strValue, 0&, REG_DWORD, lData, 4)

If RegDurum <> ERROR_SUCCESS Then

End If

RegDurum = RegCloseKey(hkeycur)

End Sub

Public Function ByteOku(ByVal hKey As Long, ByVal strPath As String, ByVal strValueName As String, Optional Default As Variant) As Variant

Dim DegerTipi As Long

Dim buf() As Byte

Dim TBufUzun As Long

Dim RegDurum As Long

Dim hkeycur As Long

If Not IsEmpty(Default) Then

If VarType(Default) = vbArray + vbByte Then

ByteOku = Default

Else

ByteOku = 0

End If

Else

ByteOku = 0

End If

RegDurum = RegOpenKey(hKey, strPath, hkeycur)

RegDurum = RegQueryValueEx(hkeycur, strValueName, 0&, DegerTipi, ByVal 0&, TBufUzun)

If RegDurum = ERROR_SUCCESS Then

If DegerTipi = REG_BINARY Then

ReDim buf(TBufUzun - 1) As Byte

RegDurum = RegQueryValueEx(hkeycur, strValueName, 0&, DegerTipi, buf(0), TBufUzun)

ByteOku = buf

End If

Else

End If

RegDurum = RegCloseKey(hkeycur)

End Function

Public Sub ByteKaydet(ByVal hKey As Long, ByVal strPath As String, ByVal strValueName As String, Veri() As Byte)

Dim RegDurum As Long

Dim hkeycur As Long

RegDurum = RegCreateKey(hKey, strPath, hkeycur)

RegDurum = RegSetValueEx(hkeycur, strValueName, 0&, REG_BINARY, Veri(0), UBound(Veri()) + 1)

RegDurum = RegCloseKey(hkeycur)

End Sub

Public Function HepsiniAl(hKey As Long, strPath As String) As Variant

Dim RegDurum As Long

Dim Sayac As Long

Dim hkeycur As Long

Dim strBuf As String

Dim TBufUzun As Long

Dim strisim() As String

Dim Sifir As Integer

Sayac = 0

RegDurum = RegOpenKey(hKey, strPath, hkeycur)

Do

TBufUzun = 255

strBuf = String(TBufUzun, " ")

RegDurum = RegEnumKey(hkeycur, Sayac, strBuf, TBufUzun)

If RegDurum = ERROR_SUCCESS Then

ReDim Preserve strisim(Sayac) As String

Sifir = InStr(strBuf, Chr$(0))

If Sifir > 0 Then

strisim(UBound(strisim)) = Left$(strBuf, Sifir - 1)

Else

strisim(UBound(strisim)) = strBuf

End If

Sayac = Sayac + 1

Else

Exit Do

End If

Loop

HepsiniAl = strisim

End Function

Public Function ButunDegerleriAl(hKey As Long, strPath As String) As Variant

Dim RegDurum As Long

Dim hkeycur As Long

Dim DegerIsimUzun As Long

Dim DegerIsim As String

Dim Sayac As Long

Dim VeriBuf(4000) As Byte

Dim TBufUzun As Long

Dim DegerTipi As Long

Dim strisim() As String

Dim Tip() As Long

Dim Sifir As Integer

RegDurum = RegOpenKey(hKey, strPath, hkeycur)

Do

DegerIsimUzun = 255

DegerIsim = String$(DegerIsimUzun, " ")

TBufUzun = 4000

RegDurum = RegEnumValue(hkeycur, Sayac, DegerIsim, DegerIsimUzun, 0&, DegerTipi, VeriBuf(0), TBufUzun)

If RegDurum = ERROR_SUCCESS Then

ReDim Preserve strisim(Sayac) As String

ReDim Preserve Tip(Sayac) As Long

Tip(UBound(Tip)) = DegerTipi

Sifir = InStr(DegerIsim, Chr$(0))

If Sifir > 0 Then

strisim(UBound(strisim)) = Left$(DegerIsim, Sifir - 1)

Else

strisim(UBound(strisim)) = DegerIsim

End If

Sayac = Sayac + 1

Else

Exit Do

End If

Loop

Dim Son() As Variant

ReDim Son(UBound(strisim), 0 To 1) As Variant

For Sayac = 0 To UBound(strisim)

Son(Sayac, 0) = strisim(Sayac)

Son(Sayac, 1) = Tip(Sayac)

Next

ButunDegerleriAl = Son

End Function

Fonksiyonlar ve tanımlamalar çok uzun olduğu için hata yapmamaya dikkat edin.Bu kodları yeni bir modül oluşturun ve içine kopyalayın. Bu kodları yazdıktan sonra sıra programımızı tasarlamaya geliyor. Önce tanımladığımız fonksiyonları nasıl kullanacağımız anlatıyorum.

l Yeni Anahtar Oluşturmak

Yeni bir anahtar oluşturmak için şöyle bir prosedür izlememiz gerekiyor:

AnahtarYarat HKEY_....... , "Anahtarİsmi"

Yani HKEY_LOCAL_MACHINE üzerinde bi anahtar yaratmak istersek: AnahtarYarat HKEY_LOCAL_MACHINE "Software\Anahtarİsmi" şeklinde bir komut vermemiz gerekir.

l Mevcut Anahtarı Silme

Eğer mevcut olan bir anahtarı silmek istersek:

AnahtarSil HKEY........ , "AnahtarAdı"

Yani HKEY_CURRENT_USER üzerinde bir anahtar silmek istersek: AnahtarSil HKEY_LOCAL_MACHINE, "Software\

AnahtarAdı" şeklinde bir kod kullanmalıyız.

l Yeni String Değeri Oluşturmak

Yeni bir string değeri oluşturmak istersek:

DegerKaydet HKEY_LOCAL_MACHINE, "Software\AnahtarAdı", "YeniDeger", "Merhaba"

Böyle bir kod yazdığımızda Software\Microsoft altında YeniDeger adında bir değer oluşacak ve içeriğinde "Merhaba" yazacaktır.

l String Okumak

Mevcut bir string değerini okumak istersek:

txtoku = StringOku(HKEY_LOCAL_MACHINE"Software\AnahtarAdi", "deger", "")

şeklinde bir kod girmemiz gerekir. Burada textoku olarak belirtilen bir text kutusudur. Kod bu şekilde okuduğu değeri text kutusuna aktaracaktır.

l Mevcut Bir Değeri Silmek

Eğer mevcut bir değeri silmek istersek:

DegerSil HKEY_LOCAL_MACHINE , "Software\AnahtarAdı" , "DegerAdı"

Şeklinde bir kod yazmamız gerekecektir. Bu şekilde Software\Anahtar\ altındaki DegerAdı adlı değer silinecektir.

l Yeni Dword Değeri Oluşturmak

Yeni bir Dword değeri oluşturmak istersek:

BuyukDegerKaydet HKEY_LOCAL_MACHINE, "Software\AnahtarAdı", "DegerAdı", "Merhaba"

şeklinde bir kod kullanmamız gerekir. Bu şekilde Software\AnahtarAdı altında DegerAdı isminde bir Dword değeri oluşacak ve içeriğinde "Merhaba" yazacaktır.

l Mevcut Dword Değerini Okumak

Mevcut bir Dword değerini okumak için:

Text1 = BuyukDegerAl HKEY_LOCAL_MACHINE, "Software\AnahtarAdı", "Dword1", ""

şeklinde bir kod kullanmalıyız. Bu şekilde kod değeri okuyup text1 kutusuna aktaracaktır.

l Yeni Binary(Byte) Değeri Oluşturmak

Yeni bir Byte değeri oluşturmak için öncelikle yeni bir fonksiyon atıyoruz.

Dim OkunacakByte(2) as Byte

OkunacakByte(0) = "0"

OkunacakByte(1) = "0"

OkunacakByte(2) = "0"

ByteKaydet HKEY_CURRENT_USER, "Software\AnahtarAdı", "Byte1", OkunacakByte

şeklinde bir kod kullanmamız gerekecektir. Bu şekilde Byte1 adlı yeni bir Dword değeri oluşacak ve içerdiği değer "0 0 0" olacaktır. Bu sıfırları kullanıldığı yere göre özelleştirmek mümkün. Dword değerini silmek içinde yine DegerSil fonksiyonunu kullanabilirsiniz.

Örnek Bir Kod

Formumuzu ve modülümüzü hazırladıktan sonra şimdi bir kod ile deneyelim.

Yapacağımızı program, programımızın başlık çabuğundaki ismini değiştirecektir.

Öncelikle formunuza bir text kutusu, bir label, bir command butonu, birde frame ekleyin.

Yukarıdaki gibi formumuzu hazırladıktan sonra Tamam butonuna iki ikere tıklayın ve Command1_Click olayına şu kodu girin:

DegerKaydet HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\DenemeProgrami", "BaslikAdi", Text1

Form1.Refresh

Form_Load

Sonra formun boş bir alanına iki kere tıklayın ve Form_Load olayına şu kodu girin:

Text1 = StringOku(HKEY_LOCAL_MACHINE,"Software\Microsoft\Windows\DenemeProgrami", _ "BaslikAdi")

Form1.Caption = Text1

Ve programı derleyin. Artık program her açıldığında text1 içine yazdığınız her şey kaydedilecek ve programı yeniden açtığınızda programınızın başlık ismi olacaktır. Böylece kullanıcıya programınızı özelleştirme imkanı sunmuş olacaksınız :) Gelecek ay geriye kalan 2 fonksiyonu tanıyacağız. Ayrıca Start Menüsünden Sık Kullanılanlar menüsünü nasıl gizleyeceğimizi de anlatacağım.

Gelecek ay görüşmek üzere...

Hakan Yamanoğlu

hakan_mp3@yahoo.com

I. Korumalı mod ile ilgili kavramlar

1. Betimleyici(Descriptor)

2. Korumalı mod ile ilgili register ve flag’lar

3. Tablolar

l Genel betimleyici tablo (GDT)

l Yerel betimleyici tablo (LDT)

l Kesme betimleyici tablo (IDT)

4. Korumalı mod’la ilgili komutlar

II. Korumalı mod’a geçiş

Betimleyici: Betimleyici tablo denilen tabloda tutulan, ait olduğu segment’in taban adres, limit, erişim hakları, öncelik seviyesi, segment tipi gibi bilgilerin tutulduğu 8 byte’lik yapıya denir. Tablo içerisindeki yeri ise selektörler (CS,DS,ES,FS,GS,SS)’in indeksi tarafından belirlenir.

Betimleyiciler iki ana gruba ayrılırlar:

1. Sisteme ilişkin betimleyiciler

l Kod betimleyicisi (Code segment)

l Data ve stack betimleyicisi (Data and Stack segment)

2. Sisteme ilişkin olmayan betimleyiciler

l Müsait 80286 görev durum segment betimleyici (Available 80286 TSS)

l Yerel betimleyici tablo betimleyicisi (LDT)

l Meşgul 80286 görev durum segment betimleyicisi (Busy 80286 Task State Segment)

l Normal çağırma kapısı betimleyicisi (Call gate)

l Görev kapısı betimleyicisi (Task gate)

l 80286 kesme kapısı betimleyicisi (80286 interrupt gate)

l 80286 tuzak kapısı betimleyicisi (802086 trap gate)

l Müsait 80x86 görev durum segment betimleyicisi (Available 80x86 TSS)

l Meşgul 80x86 görev durum segment betimleyicisi (Busy 80x86 TSS)

l 80x86 normal çağırma kapısı betimleyicisi (80x86 call gate)

l 80x86 kesme kapısı betimleyicisi (80x86 interrupt gate)

l 80x86 tuzak kapısı betimleyicisi (80x86 trap gate)

Betimleyicinin yapısı (tanımlanmış alanlar):

0-15 bitler (16 bit) > Segment limit

16-39 ve 55-63 (32 bit) > Segment base

40-47 (8 bit) > Erişim hakları

52. bit (AVL) > Kullanılmaz (işletim sistemleri için rezerve)

54. bit (D) > Aşağıda açıklanmıştır

D bitinin işlevi:

Kod ve data (stack) segmenti durumlarına göre dört durum vardır:

1. Kod segment betimleyici(D=0): Bu durumda makina komutları 80286 komutları gibi işlev yapar.80286 komut setinde 32 bit komutları kullanmak için iki ön ek (66h ve 67h) gerekir.80286 ve altındaki işlemcilerde D biti 0 olmalıdır.

2. Kod segment betimleyicisi(D=1): Betimleyiciye ilişkin segmentteki komutlar 80386 ve üstü işlemcilerin komutları gibi yorumlanır.

3. Data veya Stack segment (D=0): Bu durumda data ve stack segmentler 64K ‘dan büyük olmazlar. 80286 ve alt model işlemcilerde D=0 olmalıdır.

4. Data veya stack segment (D=1): Betimleyicinin gösterdiği veri alanı 64K ile sınırlı

değildir. 80386 ve üst model işlemcilerde D=1 olmalıdır.

Erişim hakları: Betimleyicinin bu kısmında korumalı mod’un temellerini oluşturan koruma mekanizmasının en önemli öğeleri yer alır. Sıra ile açıklayalım:

47. bit (P biti): Bu bit’in durumuna göre işlemci segmentin mevcut olup olmadığına karar verir. Eğer P=0 ise segment bellekte değildir(disktedir) , P=1 ise segment bellektedir. P=0 durumundaki bir segmente erişim gerçekleştirilirse, işlemci bunu 0Dh (13d) "Genel Koruma Hatası" ile keser.Bu bit sayesinde sanal bellek mekanizması kurulabilir(ileride anlatılacaktır)

44-46 bitler (DPL): Segmentin öncelik seviyesini belirten bitlerdir.0-3 arasında değişen öncelik seviyesi aralığında, 0 seviye en önceliklidir. Örnek vermek gerekirse: kod segmenti 0 olan program CS’i 1 olan programdan önceliklidir. Başka bir deyişle DPL=2 olan program DPL=1 olan programın segmenine dallanma (jmp) veya çağırma (call) yapamaz. Yalnız ileride anlatılacak olan kapılar (gates) ile bu mümkündür.

44. bit (S biti): S=0 sisteme ilişkin , S=1 ise sisteme ilişkin olmayan segment betimleyicisi göstermektedir.

Aziz Kurtuluş

Eveet, artık DGC componentlerini açıklamayı bitirdik. Artık bu bilgiler ışığında basit ama güzel animasyonlar ve oyunlar yapabiliriz. Ama ilk önce her zamanki gibi DGC ‘yi temin edebileceğiniz Internet adresini verelim: ‘http://www.ex.ac.uk/~PMBearne/DGC.html’. Bu arada DGC component package’ini eklemede özellikle Delphi 3’te birçok sorunla karşılaşılıyor. Bu konuda bana e-mail atabilirsiniz. Elimden geldiğince yardım etmeye çalışacağım.

Bu ay ilk önce DGC ile birlikte gelen IMAGE LIBRARY EDITOR programını kullanmayı ve bu program ile oluşturduğumuz dosyayı kullanarak Sprite hareketlendirmeyi örnek kodla birlikte öğreneceğiz.

DGCImageLibrary Editor

DGC setup programını kurduktan sonra Başlat*Programlar*DGC menüsünden Image Library Editor programını çalıştırın. Delphi kullanabilen herkesin kolaylıkla kullanabileceği bir program olduğundan sadece önemli bölümlerini açıklayacağım.

Toolbar’daki bu button’a basarak 8bit(256 Renk) BMP dosyasını seçin. Resmi transparent olarak kullanmak için resmin arkaplan renginin siyah,beyaz,mavi gibi tek renk olmasına dikkat edin.

Yukarıdaki işlemi yaptıktan sonra bu butona basarak çıkacak olan pencereden transparent olarak kullanacağınız rengi seçin.

Daha sonra bu butona basarak resmi ekleyin.

Bu işlemler tamamlandıktan sonra artık kayıt işlemini yapabilirsiniz. Artık Delphi’de, oluşturduğumuz imagelib dosyasını kullanarak kodlamaya başlayabiliriz. İlk olarak From üstüne TDGCScreen ve TDGCImageLib componentlerini koyalım. TDGCScreen>Object Inspector>ImageLibrary property’sini DGCImageLib1 olarak belirtelim. Aynı şekilde DisplayMode property’sini değiştirerek farklı ekran çözünürlüklerinde çalışabiliriz.

Örnek programımızda kullanmak için Image Library’e 2 farklı resim ekleyelim. Resimlerin 8bit (256 Renk) BMP olmasına dikkat edin.

Image Library Editorü ile oluşturduğumuz dosyayı programımıza eklemek için TDGCImageLib>Images property’sini seçerek çıkan pencereden Open Library butonuna basarak Imagelibrary dosyasını seçin.

Bu işlemleri tamamladıktan sonra artık kodlamaya geçebiliriz. Aşağıdaki kod ImageLib deki resimleri kullanarak sağ ve sol yön tuşları ile hareket etmesini sağlar.

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DGC, DGCILib;

type

TForm1 = class(TForm)

DGCScreen1: TDGCScreen;

DGCImageLib1: TDGCImageLib;

procedure FormKeyPress(Sender: TObject; var Key: Char);

procedure DGCScreen1Flip(Sender: TObject);

procedure DGCScreen1Initialize(Sender: TObject);

private

{ Private declarations }

procedure Keypress;

public

{ Public declarations }

end;

var

Form1: TForm1;

image: Byte;

X : Integer;

implementation

{$R *.DFM}

//Form1->Object Inspector->Events->OnKeypress

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

if key=#27 then Close;// ESC tuşu - programdan çıkış

end;

//DGCScreen1->Object Inspector->Events->OnFlip

procedure TForm1.DGCScreen1Flip(Sender: TObject);

begin

// Yon tuşları kontrolü

Keypress;

//ImageLib deki image transparent olarak ekrana çiziliyor.

DGCScreen1.Front.Draw(X, 100, DGCScreen1.Images[image], True);

// arkaplana 5 numaralı renkte X1,Y1,X2,Y2 ebatında dikdörtgen çiziliyor

DGCScreen1.Back.EraseRect(Rect(19, 90, 270, 170), 5);

end;

procedure TForm1.Keypress; //Yön tuşları basma kontrolü

begin

if DGCScreen1.KeyDown(VK_LEFT) then

begin

image:=1; //ImageLib deki 2 resim

Dec(X,1{yürüme hızı}); //veya X:=X-1;

if X<20 then X:=20; //X sol sınırı

End;

if DGCScreen1.keyDown(VK_RIGHT) then

begin

image:=0; //ImageLib deki ilk resim

Inc(X,1{yürüme hızı}); //veya X:=X+1;

if X>220 then X:=220; //X sağ sınırı

End;

End;

//DGCScreen1->Object Inspector->Events->OnInitialize

procedure TForm1.DGCScreen1Initialize(Sender: TObject);

begin

X:=25; //X değeri 25 olarak atanıyor.

end;

end.

Bu aylık bu kadar. Gelecek ay animated sprite kodlamayı ve bu sprite’ların collision (çarpma, değme) kontrolünü yapmayı öğreneceğiz. Artık bu bilgilerle PACMAN olarak bilinen basit oyunlar yapacak bilgiye sahip olacağız. Diğer ay görüşmek üzere Delphi ile kalın. Hatasız kodlamalar dileği ile...

C++Builder 3

GÜN GEÇMİYOR Kİ, bilişim pazarında yeni bir yazılım geliştirme aracı çıkmasın; öyle ki bunların hepsi de en hızlı şekilde, en hatasız işleyen programları ürettiklerini iddia etmekteler. Özellikle günümüzde çok popüler olan nesneye dayalı programlama alanında, Internet ve veritabanı uygulamalarında kendilerinin en iyi yazılım olduğunu iddia eden araçlar bolca mevcut; ama bütün bunların hepsini aynı anda entegre bir biçimde sunabilecek ölçüde bir ürün arıyorsanız belki de C++Builder aradığınız ürün. Bu yazının amacının C++Builder’la neler yapabileceğinizi anlatmak olduğunu, “yazılım sektörünün en iyisi” olduğuna inandırmak gibi bir kaygı taşımadığını belirtmek isterim. Eminim kafanızdan geçen soru şu:

NEDEN C++BUILDER?

Diğer RAD (Rapid Application Development) - hızlı uygulama geliştirme - araçlarının tersine, C++Builder tam anlamıyla esnektir; yani C++Builder ile oluşturamayacağınız uygulama bulunmamaktadır. İster bir veritabanı uygulaması, ister bir ActiveX kontrolü yaratmak olsun, C++Builder sayesinde bunların üstesinden en kısa zamanda gelmek mümkündür. Elbette ki, C++Builder yaratmayı planladığınız programı otomatik olarak oluşturmayacaktır; sadece size bunu oluşturmak için gerekli platformu hazırlayacak ve sizin emirlerinizi uygulayacaktır. Burada esnekliği sağlayan en önemli özellik, C++Builder’ın görsel bileşenlerinin oluşturduğu kullanıcı ara birimin yanısıra, C++Builder’i diğer RAD araçlarından farklı kılıp hayat veren tabanındaki C++ dilidir. C++ gerçek anlamda nesneye dayalı (OOP) bir dildir; yani inheritance, polymorphism ve encapsulation özelliklerini tam olarak barındırır. Bu özelliklerden inheritance sayesinde, hem mevcut bileşenleri geliştirebilir hem de sil baştan yeni bileşenler yaratabilirsiniz. Görsel bileşenler kütüphanesinde (VCL -Visual Component Library) yer alan 120 civarındaki öğe sayesinde, Windows işletim sistemi altında görmeye alıştığımız her türlü uygulamayı hazırlamak çok kolay bir hale gelmektedir. Hatta gerektiğinde C, Assembly ve Pascal ile yazılmış olan kaynak kodları kullanabilmeye izin vermesi, Windows API’sine direkt komutlar gönderebilmesi C++’ın gücüne destek vermektedir. Hazırda bulunan DLL (Dynanmic Link Library), ActiveX ve bunun gibi diğer Windows nesnelerini kendi programlarınızda kullanabilir, ve tabii ki kendiniz de bunlardan yaratabilirsiniz. MFC, ve OWL framework desteğiyle hem bileşenleri hem de nesneleri kullanabilir, DOS altında çalışacak konsol uygulamalar yazabilir, C++Builder’ın ayrı yumurta ikizi olan Delphi’de oluşturulmuş formları, unit’leri ve component’leri kullanabilirsiniz. Tüm bu sayılanları yaparken ANSI C++, Windows 95, Windows NT, Win32 API, ActiveX, OLE Automation, ODBC, DCOM, MAPI, Unicode WinSock, ISAPI ve NSAPI standartlarına bağlı kalırsınız. Günümüzde Internet’in çok popüler olması, program geliştirme araçlarını “Internet uyumlu” olmaya zorladı; böylece bu araçlar kendilerine sürekli eklemeler yaptılar. C++Builder’da Internet uygulamaları geliştirmek için bulunan komponentler, sonradan “Internet uyumlu” olma kaygısı içinde eklenmemiştir. Bunlar zaten C++Builder 1.0’da entegre bir şekilde mevcuttu ve 3.0 ile yeni ilaveler yapıldı. Barındırdığı 17 protokol bileşeni sayesinde Internet’e erişim sağlayabilecek programlar (ağ tarayıcıları gibi) ve diğer bileşenler sayesinde, Internet üzerinde veritabanı uygulamaları yazabilirsiniz. ActiveForms ve Web Deployment ile ağ üzerinde client/server uygulamaları geliştirebilir, Web Server Extension ile herhangi bir ağ tarayıcısına veriyi HTML olarak gönderebilir, WebBridge yardımıyla NSAPI, ISAPI DLL’leri ve WinCGI, CGI uygulamaları oluşturabilirsiniz. C++Builder sonuçta bir HTML editörü değildir ama zengin Internet desteği ile çok karmaşık olan ağ üzerinde veritabanı uygulamalarının bile kolaylıkla üstesinden gelmenizi sağlayacaktır. Veritabanı uygulamaları için hazırlanmış olan gerek veriye erişim, gerek verinin görsel olarak sunulmasını sağlayan bir çok öğe yine işinizi büyük ölçüde kolaylaştırıyor. Bu uygulamalarda BDE (Borland Database Engine) sayesinde Paradox, Oracle,Sybase, dBASE, InterBase DB2 ve diğer birçok veri tabanına, ODBC üzerinden Access ,FoxPro gibi veritabanlarına bağlanabilirsiniz. QuickReport öğeleri sayesinde güzel görünümlü raporlar yaratabilirsiniz. C++Builder’ın Client/Server Suite sürümünü ile network üzerinde karmaşık veritabanları, son teknoloji “multi-tier” uygulamalar yaratabilirsiniz.

C++Builder’ı kullanarak yapabilecekleriniz, tek başına “Neden C++Builder?” sorusunun cevabını vermeye yeterli değildir. Bunları yaparken hızlı ve “bug”sız yani hatasız bir şekilde olması da çok önemlidir. C++ derleyicisi, en hızlı derleyicilerden biri olup, Incremental Linker ve bir çok optimizasyon sayesinde, büyük projeleri derlerken bile yalnızca gereken yerleri derleyip sürat kazanmanızı sağlar. Bu hızın yanında programın doğru derlenmesi de çok önemlidir. Şurası bir gerçektir ki, hatasız olarak derlenen bir C++ kodu çok büyük bir ihtimalle çalışır. Tabii yine de mantık hataları yapmış iseniz programınız istediğiniz gibi çalışmayacaktır. Elbette bir program yazılırken bu tür hatalar sık sık yapıldığı için, “Debugger” (hata ayıklamaya yarayan bir mekanizma) olması gerekir. Özellikle C++Builder 3’te, ikiz kardeş Delphi dışında başka hiçbir yerde olmayan, hataları kısa sürede bulmanıza yarayan bir çok yardımcı araç geliştirilmiştir. Madem hız ve doğruluk gibi kıstaslardan bahsediyoruz, C++Builder’ın RAD’ından ne kastettiğimizi açıklayalım: Visual Form Designer, Component Palette ve Object Inspector’u kullanarak dilediğiniz görünümdeki formları kısa sürede yaratabilirsiniz.

Ayrıca bu yarattığınız formları Object Repository’ye kaydedip tekrar tekrar kullanabilirsiniz. Böylece her defasında “benzer özellikleri” taşıyan formları baştan yaratmak zorunda kalmazsınız (inheritance sayesinde kaydetmiş olduğunuz formun eski özelliklerine eklemeler yapabilir, fonksiyonlarında değişiklikler yapabilirsiniz). Başta Database Form Wizard olmak üzere; sihirbazlar sayesinde zahmetli işleri bir kaç soruya cevap vererek çok kısa bir zamanda yapabilir, hatta. kendi Wizard’larınızı bile yaratabilirsiniz. Aynı formlarda olduğu gibi menüleri, data modüllerini kaydedip yeniden kullanabilirsiniz. C++ Builder 3’de yeni eklenen Code Insight sayesinde; if-else, switch benzeri blokları, kod yazarken “hamallık” gibi gelen detayları ; Ctrl+J ‘ye basıp gelen menüden istediğiniz komutu seçerek kodunuza eklenmesini sağlar, böylece detaylarla değil de kendi işinizle uğraşarak zaman kazanmış olursunuz.

C++Builder’da da diğer Borland ürünlerinde olduğu gibi programcının ihtiyaç duyabileceği her şey düşünülmüş. Bunun için bazı yardımcı araçlar da programcının kullanımına sunulmuş. Bunlardan Image Editor, programınızın ikonunu , Speed Button’larda ve başka yerlerde kullanılan resimleri yaratabileceğiniz/değiştirebileceğiniz bir araç. Neredeyse her Windows programında görmeye alıştığımız yardım dosyalarını hazırlayabilmek için Microsoft Help WorkShop, ve veritabanı uygulamalarında table yaratma, içeriklerini izleme, alias yaratma gibi işlevleri gerçekleştiren Database Desktop, Database Explorer, Interbase Client ve Database Administrator gibi programlar pakete dahil edilmiş. Ayrıca programcının yapmış olduğu programı kullanıcıya en doğru biçimde yüklenmesini sağlamak için InstallShield Express’te bu yardımcı araçlar arasına eklenmiş. (Bahsedilen bu araçların bazıları her sürümlerde olmayabilir.)

Evet “Neden C++Builder?” sorusuna verdiğim bu uzun cevabı özetlemek gerekirse: Çünkü, C+Builder’la aklınıza gelebilecek her türlü programı en kısa zamanda yazabilirsiniz. Elinizde hazır bulunan DLL gibi birçok nesneyi yeniden yaratmak yerine uyumluluğu sayesinde kendi programlarınızda kullanabilirsiniz.

C++BUILDER 3.0’DA NELER YENİ?

Windows altında çalışan görsel programlar oluşturabilen ve en az Delphi kadar kuvvetli bir aracın özlemini çeken C++ programcıları, C++Builder’la istediklerini elde etmiş oldular. Belki çok fazla istenildiği için C++Builder 1.0 (ilk sürüm) biraz aceleyle çıktı. Bu yüzden bazı hatalar, yardım dosyalarının eksiklikleri falan hep “patch”lerle (yamalarla) giderildi. Delphi 3’ün ardından aynı yeniliklere sahip C++Builder 3 ile bu ilk sürümün hataları eksiklileri giderilip yeni bir çok eklemeler yapıldı. Yardım dosyalarında bulunan hatalı bağlantılar eksik bağlantılar giderildi, kapsamı zenginleştirildi. Bence yapılan en önemli, en işe yarar değişiklikler hata ayıklamaya mekanizmasında oldu. Debug Inspector sayesinde hem bileşenleri hem de yerel değişkenleri Object Inspector benzeri bir şekilde rahatça inceleyebilme imkanı, yine fareyi değişkenlerin üzerinde gezdirerek o değişkenin değerini görme imkanı (ToolTip) klasik watchlara olan ihtiyacı neredeyse sıfıra indirdi. Event Log sayesinde koyduğunuz breakpoint öncesinde gelen Windows mesajlarını incelenebilmesi ve zaten daha evvel de bulunan diğer hata ayıklama araçları sayesinde hata bulmak için eskiden harcadığınız süre inanılmaz derecede düşüyor. Exceptionların istediklerinizi kendiniz halledip istediklerinizin de otomatik olarak halledilmesini sağlayarak olur olmaz programın durmasını engelleyebiliyorsunuz Bu yeni sürümde ilk göze çarpan değişiklik tabii ki programı çalıştırdığınızda karşınıza çıkan yassı menü ve büyümüş Form Designer. Biraz bileşenlerin bulunduğu paleti karıştırdığınızda yeni bileşenler geldiğini de göreceksiniz. “Package”lar sayesinde daha küçük exe dosyaları yaratma imkanı ve InstallShield’le bunları kolayca dağıtabilme, PVCS Version Manager sayesinde proje sürüm kontrolü... C++Builder 3’te yeni olan özelliklerin yalnızca birkaçı.

C++BUILDER’LA PROGRAMLAMAYI NASIL ÖĞRENEBİLİRİM?

Tabii ki bu sorunun yanıtı sizin bilgi seviyenize bakar. Çok iyi Delphi biliyorsanız, kısa sürede yazılmış bir kaç örnek programı inceleyerek bile C++Builder’a geçebilirsiniz. En iyi öğrenme yolunun iyi bir kitap (kendi seviyenize göre) alıp okuyup, bilgisayar başında bol bol denemeler yapmak olduğuna inanıyorum. Bunu yaparken C++Builder’ın yardım dosyaları sizin en iyi yardımcılarınızdan biri olacaktır. Doğru kitabı seçmeniz, vaktinizi ve paranızı boşa harcamamanız için çok önemli. Onun için bir kitap almadan iyi bir araştırma yapmanızı öneririm. www.amazon.com’da C++Builder’ı ararsanız yazılmış bütün kitaplar hakkında detaylı bilgi edinebilirsiniz. C++Builder çok yeni olduğundan yazılan kitaplar iki elin parmaklarını geçemez. Örneğin client/server hakkında bir kitap arıyorsanız, maalesef bulamazsınız! Size böyle bir durumda hakkında bolca kitap yazılmış Delphi 3 kitaplarından birini almanızı tavsiye ederim. Çünkü Delphi 3 ile C++ Builder 3 nerdeyse ikiz denecek kadar benziyor. Tek zorluk Object Pascal’la yazılmış kodu C++’a çevirmeniz gerekecektir. Piyasada bulunan kitapların çoğu yeni başlayanlara yönelik. Eğer daha ileri düzeyde kitaplar arıyorsanız “High Performance Borland C++Builder” ve birçok “Nasıl?” sorunuza cevap olacak “C++Builder How To” yu tavsiye edebilirim. Başlangıç seviyesinde olanlar için ise Charlie Calvert’in kitabını - her ne kadar C++Builder 3 için olanını okumamış olsam da (Delphi için olanını okudum) - tavsiye edebilirim.

C++BUILDER HAKKINDA GENEL BİLGİLER

C++Builder hakkında elde etmek istediğiniz her türlü bilgiyi www.inprise.com\bcppbuilder veya www.bimeks.com.tr adreslerine bağlanarak edinebilirsiniz. Eğer Internet erişiminiz yoksa Borland’ın (Artık ismi Inprise ama Borland’a çok alıştım) Türkiye temsilcisi Bimeks’e (0216) 472 0434 numaralı telefondan ulaşabilirsiniz. Inprise’ın sayfasına bağlandığınız taktirde C++Builder’la ilgili diğer adresleri, 3.0’daki yeniliklerin tamamını, hangi C++Builder paketinin sizin için en uygun olduğunu ve haber grupları, kitaplar hakkında birçok bilgi ve link bulacaksınız. Fiyatları merak edenler için: Standard paket 120$, Professional paket 795$ ve Client/Server paketi 3095$.

Elinizde zaten bunlardan biri varsa terfi sürümlerini daha ucuza alabilirsiniz. Bir sonraki ay C++Builder 3’ün Client/ Server Suite paketiyle network üzerinde veritabanı uygulamalarını, InterBase ve SQL Monitor gibi yardımcı programları inceleyeceğiz. Daha sonra yine Borland’ın ürünlerinden JBuilder’ı inceleyeceğimizi Java kullanıcılarına müjdelerim.

 

Ve stop olayını da hallettikten sonra Player’ımız hazırlanmış oluyor. Şimdi süre yazan text kutusuna, çalan parçanın süresini yazabiliriz. Bunun için MP3play1.ActFrame olayına şu kodu girin:

Private Sub MP3Play1_ActFrame(ByVal ActFrame As Long)

Text1 = (ActFrame * MP3Play1.MsPerFrame) \ 1000

End Sub

Programımızı çalıştırdığımızda artık bir MP3 ile deneyebiliriz. İçerisinde ‘...’ simgesi bulunan text kutusunu da bir CommonDialog çağırmak için kullanabiliriz.

Yazının başında da anlattığım gibi Dialog Medien firmasının MP3Play kontrolü ücretli bir kontroldür. Kayıt etmediğiniz taktirde MP3lerin ilk 30 saniyesini çalabilmektedir. Şimdi anlatacağım ikinci yöntemle MP3lerin tamamını çalabileceğiz.

Windows Media Player’ın 6.x sürümünden itibaren Microsoft MP3’lere de destek verdi. Yani Windows Media Player Kontrolünü kullanarak da MP3’leri çalabiliriz. Öncelikle formumuza yeni bir Windows Media Player kontrolü ekleyin. Bu kontrol ile MP3leri çalmak için:

MediaPlayer1.Open "c:\MP3s\deneme.MP3"

şeklinde bir kod kullanabiliriz. MP3leri durdurmak için:

MediaPlayer1.Stop

MP3leri dondurmak için:

MediaPlayer1.Pause

kodlarını kullanabiliriz.

Bu ay basit bir MP3 Player’ın nasıl hazırlanacağını gördük. Gelecek ay OCX kullanmadan MP3’leri nasıl çalacağımızı, MP3 Player için nasıl bir Play List Editor oluşturacağımızı ve ID3 taglarının nasıl okunacağını anlatacağım. Gelecek ay görüşmek üzere...

Hakan Yamanoğlu

hakan_MP3@yahoo.com

the_passenger@kgg-tr.org

Delphi Kullanarak

Oyun Programlama -V-

Yeniden merhaba. Bu ay DGC Map Editör kullanmayı ve oluşturduğumuz map’i programlarımızda kullanmayı göreceğiz. Konumuza geçmeden önce DGC7 Beta versiyonunun çıktığını bir kez daha hatırlatmak isterim. DGC7 Beta versiyonunu http://www.ex.ac.uk/~PMBearne/

DGC.html adresinden temin edebilirsiniz.

DGC nin bu versiyonu DirectX 6 desteklemekte. Şu ana kadar pek incelemedim ama 16bit desteklemesi ilgimi çekti açıkçası. Ama hala eksiklikler var. Örneğin Map Editör de hala 16bit bitmap kullanılamıyor. Ama yakın zamanda bir kişi bunu yapacaktır. Eğer sabredemiyorsanız kendinizde bir Map Editör yapabilirsiniz.

Evet, İlk olarak DGC ile birlikte gelen Map Editör’ü kullanmayı öğrenelim. Nedir bu Map Editör, ne işe yarar? Map editörü kullanarak oyunumuzun arkaplanını oluşturabilir ve arkaplanı "scroll" edebiliriz, yani kaydırabiliriz. Buna en iyi örnek Mario oyunu olur sanırım.

Map Editörü çalıştırmak için Başlat*Programlar*DGC*Map Editor’den Map Editörü çalıştıralım. Menüden MAP seçeneğine gelip INSERT’ü seçelim. Karşımıza bir pencere çıkacak. Buraya Map ismi verdikten sonra haritamızın X ve Y uzunluğunu girelim. Bu bizim haritamızın boyutunu belirleyecektir.

Bu işlemden sonra haritamızda kullanacağımız Tile’ların bulunduğu image library dosyasını File*Open Image Library’den yükleyelim. Tile yani haritamızda kullanacağımız toprak, taş, ev gibi nesnelerin boyutu 16*16*256 renk veya 32*32*256 renk olmalıdır. Eğer büyük nesneleri sığdıramıyorsanız mecburen nesneyi 16*16 veya 32*32 boyutlarında bölmelisiniz. Map Editör’de bunları birleştirebilirsiniz. Map Editör hakkında daha fazla bilgi vermeyeceğim, çünkü kullanımı çok zor değil.

Evet artık hazırladığımız Map dosyasını nasıl kullanacağımızı görelim. Kondoplay grubunun bir üyesi olan Fatih Şahin arkadaşımızın yapmış olduğu Mario oyununu size parça parça vereceğim. Şu ana kadar gördüğümüz pek çok şey bu oyunda mevcut.

Formumuza TDGCScreen, iki adet TDGCImageLib, TDGCMapLib ve bir tanede Timer Component’i koyalım. TDGCScreen1 Component’inin ImageLibrary özelliğini DGCImageLib1, MapLibrary özelliğini MapLib1, TileLibrary özelliğini de DGCImageLib2’ye eşitleyelim. Görünüm açısından DisplayMode’u 3230*200 olarak ayarlayabilirsiniz.

DGCImageLib1’e oyunda kullanılan Sprite’ların bulunduğu *.iml dosyasını , DGCImageLib2’ye haritada kullanılan nesnelerin bulunduğu *.iml dosyalarını, DGCMapLib1’e de Map editörde oluşturduğumuz haritamızı ekleyelim. Timer1 nesnesinin Enabled özelliğini de False olarak değiştirelim. Artık kodlamaya başlayabiliriz.

unit marunit;

// Programlayan FATİH ŞAHİN

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

DGCMap, DGCILib, DGC, mmsystem, ExtCtrls;

const

yaratiksayisi=15;

ciceksayisi =10;

HIZ = 2;

yukselis:array[0..53] of integer=(-5,-5,-6,-6,-5,-5,-5,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-1,-1,0,
0,0,0,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,5,5,5,6,6,5,5);

type

TForm1 = class(TForm)

DGCScreen1: TDGCScreen;

DGCImageLib1: TDGCImageLib;

DGCMapLib1: TDGCMapLib;

DGCImageLib2: TDGCImageLib;

Timer1: TTimer;

procedure DGCScreen1Flip(Sender: TObject);

procedure FormKeyPress(Sender: TObject; var Key: Char);

procedure DGCScreen1Initialize(Sender: TObject);

procedure UpdateTrack;

Procedure CheckLeft;

Procedure CheckRight;

Procedure CheckBottom;

Function CheckBottomTile(x,y :integer):boolean;

Procedure Checkup;

Function CheckupTile(x,y:integer):boolean;

private

{ Private declarations }

XPos,

PX,PY,

Speed,

anim,

AnimDir,

animcount,

kayma,

havacount,

yon : integer;

sira,sira1: integer;

dur,

dusus1,dusus2,

durus1,durus2,

durus3,

yukaritus,

yerde,

yukari1,yukari2,

havada,

yukselebilir,

dusebilir,

havadadurus : boolean;

counter,

kareno,

karesayisi,

yaratikx,

artis,

solyon,

sagyon,

yaratikyon :array[1..yaratiksayisi] of integer;

donus,yaratikvar : array [1..yaratiksayisi] of boolean;

cicekanim,cicekcount : array[1..ciceksayisi] of integer;

MapHold : Array[0..14, 0..199] of byte;

procedure CheckKeyboard;

procedure yaratikgoster(no,karakterx1,karakterx2,karaktery,baslangic : integer);

Procedure cicekanimate(no,x,y:integer);

procedure Animate;

Function CheckTile(X,Y : Integer):boolean;

procedure ShowIntro;

Procedure yuksel(a:integer);

public

{ Public declarations }

end;

var

Form1 : TForm1;

HumFreq : Array[0..3] of Integer = (11000,19500,26300,33100);

ShowTitle : Boolean = True;

ShowHelp : Boolean = False;

Quit : Boolean = False;

GameOver : Boolean = False;

implementation

Önümüzdeki ay kaldığımız yerden devam edeceğiz. Şimdilik hoşçakalın.

Kartal TURGUT

Kartaltr@superonline.com

mr_eagle@hotmail.com

C++

C++ Dinamik Bellek Yönetimi uygulamalarında dikkat edilmesi gereken noktalara devam ediyoruz: Bu ay doğrudan Dinamik Bellek Yönetimi ile ilgili olmasa da, yine de onun eksik uygulanması sonucunda ortaya çıkan ve "operator overloading" kullanılan class’larda dikkatsiz bir programcının başını ciddi biçimde belaya sokabilecek bir tuzaktan söz edeceğiz: Varsayalım ki oluşturacağınız class’in içinde "assignment" operatörünü (=) overload etmek istiyorsunuz. class’inizin içinde de, yaygın olarak rastlandığı gibi, "data member" olarak bir "pointer" bulunuyor. Bunu kod olarak şöyle deklare edebiliriz:

class Eleman {

public :

Eleman(int _KimlikNo, const char * _Isim);

//constructor fonksiyon

~Eleman ();

// destructor fonksiyon

Eleman& operator=(const Eleman& Yeni);

// assignment operator overloader fonksiyonu

private:

int KimlikNo;

char * Isim;

// pointer data member; constructor icinde new ile initialize edilecek

};

Şimdi yukarıda deklare ettiğimiz "operator overloader" fonksiyonun yanlış ama öğretici bir tanımlanmasını görelim.

Eleman& Eleman::operator= (const Eleman& Yeni)

{

KimlikNo = Yeni.KimlikNo;

delete [ ] Isim;

// pointer data member yok edildi, simdi yeni bir bellek adresi ataniyor

Isim = new char [ strlen(Yeni.Isim) + 1 ];

strcpy(Isim, Yeni.Isim);

// a = b = c = d gibi zincirleme assignment’lerin yapilabilmesi icin yeni nesneye bir referansin

geri donus degeri olarak verilmesi sarttir

return *this;

}

Peki bu fonksiyon tanımlamasındaki hata nerede? Geri dönüş değeri de dahil olmak üzere her şey tamam gözüküyor, öyle değil mi? İşin aslı bu fonksiyon tanımlaması bir çok uygulamada işinizi görecektir de, ama eğer uygulamanızda alias kullanımına yer veriyorsanız bu tanımlamayı kullanmak büyük bir hatadır. Aşağıdaki örneğe bir göz atalım.

Eleman SatisMemuru;

Eleman & Satis = SatisMemuru;

Artık Satis, SatisMemuru nesnesi icin bir "alias", yani ikinci bir addan başka bir şey değildir. Bu kafa karışıklığı yaratsa da kimi zaman kullanılan bir yöntemdir. Fakat aşağıdaki satır her şeyi mahveder.

SatisMemuru = Satis;

Önce bu deyimin zararsız olduğu düşünülebilir. Ama Eleman class’ının nesneleri için overload edilmiş olan assignment operatörünün yeni tanımına baktığımızda sorun anlaşılır. Şöyle ki, bu fonksiyon tanımlanırken sol taraftaki nesnenin pointer data member’i tamamen yok edilmiş, ama bu işlem yapılmadan önce sol taraftaki nesneyle sağ taraftaki nesnenin eş (identical) olup olmadığına bakılmamıştır. Oysa yukarıdaki assignment’te Satis, yalnızca bir alias olduğundan kendine özgü bir bellek adresi yoktur. Yani "delete [ ] Isim;" deyimi aslında aynı anda hem Satis hem de SatisMemuru nesnelerini etkilemektedir gibi düşünülebilir. Elbette pointer data member yok edildikten sonra fonksiyon tanımı içinde daha sonra geçen

Isim = new char [ strlen(Yeni.Isim) + 1 ];

fonksiyonunun ne gibi sakıncalar doğuracağını söylemeye gerek yok. Belki de çok ufak gibi görünen ve bu yüzden gözden kaçan bir olasılık, basit bir assignment işlemini bile bütün bir veriyi yok eder konuma sokmuştur. Oysa overloader fonksiyonun tanımının hemen başında kullanılacak olan bir "if (Isim != Yeni.Isim)" deyimi bütün bu sorunu ortadan kaldırırdı

Oyun Programcılığı

Hatırlarsınız iki sayı önce DJGPP’den bahsetmişdik. Oyun programcılığı için elinizin altında olabilecek en mükemmel araç. Quake oyununu bilirsiniz: Quake çıkana kadar yapılamayan bir çok 3D efekti DJGPP’nin sistemli, hızlı ve küçük çıktı büyüklüğü sayesinde sayesinde yapıldı. Delorie aslında mükemmeliğin ötesi bir derleyici. Delorie sayesinde DOS’tan Windows’a geçen programcılar doğdukları yere, tekrar DOS’a dönmeye başladılar. Türk grupları içinde söz konusu olan bu. Hiçbir ticari kaygısı olmayan, zevk için program yazan kitle DJGPP ve DOS’ta karar kılıyor. Aslında piyasada bir güzel derleyici daha var. Watcom DOS Geliştiricileri için DJGPP’ye alternatif bir seçenek; fakat ticari olması ve epeyce pahalı olması, DOS söz konusu olduğu zaman tahtı gene DJGPP’ye bırakmasına neden oluyor.Windows programcıları, mükemmel oyunlar yazmak istiyorsanız tek tavsiyemiz Visual C. DirectX ve OpenGL programlaması Visual C söz konusu olduğunda çok basit olarak yapılabiliyor. Windows’un A’dan Z’ye herşeyine, mümkün olan en büyük sınırlar içinde erişmek istiyorsanız Visual C tam istediğiniz şey olmalı. Assembler’de bunun zor yolu olarak sunulabilir.

Bir çok kişi oyun yazmanın zor olduğunu zanneder. Çok yorucu ve gereksiz bir iş olduğu öne sürülür. Halbuki programcıların çoğunun geçimini kazanmak için uğraştığı nice database uygulaması düşünüldüğünde pek o kadar da zor bir şey değil.

Oyun yapmak kolaydır. İşe direk "ben 3D kodlayacağım" ya da "olmadık efektler yapacağım" diyerek başlamadığınız sürece... İşe 2D ile başlayın derim. Çoğu programcı için (ara sıra "coder" arasıra "programcı" kullanıyoruz , bunun haklı bir nedeni var. Şimdi burada konuyu bölmeyip bir ara anlatacağımızı söyleyerek kaldığımız yerden devam edelim.) 2D oyunlarda arkaplanı kaydırmak ya da oyuncunun hareketlerinin nasıl oluşturulacağı problemdir.

Platform oyunu yazdığınızı düşünün. Yapmanız gereken nedir? DOS kullanıcılarının çok bildiği 64K’lık Mario oyununu hatırlayın. Oyuncunun kontrol ettiği karakter ekranın belirli bir bölgesinde sabittir. Oyun karakterinin yürüme efekti belirgindir. (arda arda gelen sprite’lar) Arka planda uzunca bir platform resmi sola doğru kaydırılır (scrool). Arka plandaki platform bir algoritma tarafından üretilebilir yada çoğu oyunun kullandığı gibi gerçekten up uzun bir resimdir. (Devam edecek)

Özgür Taştepe- ozgurt@softhome.net

PASCAL VE DELPHI KULLANARAK

OYUN PROGRAMLAMA - II

Bu ay sizlere T.PASCAL’da sprite , DELPHI’de DGC Componentlerini açıklamaya çalışacağım.

n Sprite Örneği:

Giriş yazımızda da açıkladığımzı gibi Sprite, oyunlarda kullanılan, kullanıcının veya bilgisayarın kontrol ettiği hareketli veya hareketsiz nesnelerdir. Örnek verirsek tank,uçak,insan,araba vs.. Daha fazla bilgi için aşağıdaki örnek programa bakabilirsiniz. Not: Aşağıdaki örnek size fikir vermek amacı ile verilmiştir. Diğer aylarda daha gelişmiş örnekler vermeye çalışacağım.

PROGRAM Sprite;

USES crt;

CONST maxSpr=2; {Sprite Sayısı}

ScrSze=64000;{Bellekte tutulacak Ekran alan}

TYPE {Sprite}

a_scrn= ARRAY [1..ScrSze] OF byte;

sprite= RECORD

xCOR, yCOR : word;

width, height : byte;

vVEL, hVEL : word;

it: ARRAY[1..500] OF byte;

END;

VAR

sprites : ARRAY[1..MaxSpr] OF sprite;

point1 : Pointer;

point2 : ^a_scrn;

i,j,k : word;

{Sprite’in hareketleri, ekran köşelerine çarpması belirleniyor}

PROCEDURE PutSprite( VAR spriter : sprite );

VAR i : word;

BEGIN

WITH Spriter DO BEGIN

IF (xCOR + hVEL > 320 - width) OR (xCOR + hVEL < 1) THEN

hVEL:=hVEL * -1;

IF (yCOR + vVEL > 200 - height) OR (yCOR + vVEL < 1) THEN

vVEL:=vVEL * -1;

xCOR:=xCOR + hVel; yCOR:=yCOR + vVEL;

FOR i:=0 TO (width * height)-1 DO

IF it[i+1] <> 0 THEN

Point2^[(yCOR + (i DIV width)) * 320 +

xCOR + (i MOD width)]:= it[i+1];

END;

END;

BEGIN

ASM mov ax,13h; Int 10h; END;{320*200*256Renk ekran modu}

GetMem(point1, ScrSze);GetMem(point2, ScrSze);

{Ekran Point1 pointer’ina kopyalanıyor}

Move(mem[$a000:0000],point1^, ScrSze);

Randomize; {MaxSpr ile belirlenen sayı kadar Sprite oluşturuluyor}

FOR J:=1 TO MaxSpr DO BEGIN

sprites[j].xCor := Random(10)+1; {Sprite’in X konumu}

sprites[j].yCor := Random(170)+1; {Sprite’in Y konumu}

sprites[j].width := 5; {Sprite’in eni}

sprites[j].height :=5; {Sprite’in boyu}

sprites[j].hVEL := 1;

sprites[j].vVEL := 1;

K:=1;

{Aşağıda sprite rengi veriliyor}

FOR i:=1 TO sprites[j].width * sprites[j].height DO BEGIN

IF I DIV k = i / k THEN sprites[J].it[I]:= 14;

{14 rakamini değiştirerek farklı renkler elde edebilirsiniz.}

END;

END;

REPEAT

Move(Point1^, Point2^, ScrSze); {Ekran belleğe kopyalanıyor}

FOR J :=1 TO MaxSpr DO BEGIN

putsprite( sprites[J] );

END;

Move(point2^, mem[$a000:0000], ScrSze); {Bellekte bulunan ekran basılıyor}

UNTIL KeyPressed;

ASM mov ax,03h; Int 10h; END;

END.

n Delphi Game Creator

Bu ay Delphi Game Creator Componentlerini açıklamaya başlıyorum. Eğer hala elinizde DGC Componentleri bulunmuyorsa www.ex.

ac.uk/~PMBearne/DGC.html adresinden elde edebilirsiniz. Aşağıda DGC componenetlerini tek tek açıklıyorum. Daha sonra bu bilgileri kullanarak hep beraber örnekler yapacağız.

n Delphi Game Creator Componentleri :

l TDGCScreen: Bu component’i programınızda kullanmanız zorunludur. İlk önce bu component form üzerine konmalıdır. DGCScreen componentini form üzerine yerleştirdikten sonra Object Inspector’ den Properties ayarlarını kullanarak ekran çözünürlüğünü, projede kullanıcağınız ImageLibrary, MapLibrary ve TileLibrary dosyalarını buradan seçebilir ve ayarlıyabilirsiniz. Events bölümündende OnFlip ve OnInitialize procedure’leride en çok kullanacağınız bölümler olacak.

n Properties:

l Property BackBuffers : integer; : BackBuffers arka yüzey sayısını oluşturur. En güçlü performans sayısı 2 dir.

l Property BeepOnException : Boolean; : Bu property True olarak atanırsa program yanlışlarında Beep mesajı çalışır.

l Property DirectDraw2 : IDirectDraw2; : Bu property ‘read-only’dir. DirectDraw API fonksiyonlarını çağırmak için kullanılır.

l Property DisplayMode : TDisplayMode; : Ekran çözünürlülüğünü ayarlamak için kullanılır. Tüm ekran modları tam ekran(Full screen) özelliğine sahiptir ve Windows modunda çalışamaz.

Desteklenen modlar TDisplayMode = (dm640x480x8, dm320x200x8, dm800x600x8, dm1024x768x8, dm640x400x8, dm320x240x8);

Örnek: Run-time

DGCScreen1.DisplayMode:=dm640x480x8;

l Property FlippingEnabled : Boolean; : Eger bu property True olarak atanırsa OnFlip event’i otomatik olarak aktif olacaktır.

Örnek: Run-time

DGCScreen1.FlippingEnabled:=False; //Default

l Property ImageLibrary : TDGCImageLib; : DGC ile gelen ImageLibrary programında yaptığınız *.IML(veya farklı) uzantılı dosyaları projede kullanmanızı sağlar. Eger bu işlemi ‘design time’da (form dizayni) yaparsanız bu dosya images dizinine kopyalanacak ve bir daha bu dosyaya ihtiyaç duymayacaksınız. Tabi bu EXE dosyasinin kabarmasına neden olacaktır. Bu işlem için DGCImageLib component’inde *.IML dosyasi <Images> property’sinden yüklenmelidir.

Örnek:

Run-time

DGCScreen1.SetImageLibrary(DGCImageLib1, True);

ImageLibrary’deki 2. resmi 50,50 koordinatlarında transparan olarak gösterir. Eğer True değeri False olsaydı transparan olmayacaktı.

DGCScreen1.Front.Draw(50, 50, DGCScreen1.Images[2], True);

l Property Images[Index: Integer] : DGCImageLibrary’deki image’ların numarası [Index:Integer] verilerek o indexdeki resim görüntülenir.

Örnek: Run-time

ImageLibrary’deki 2. resmi 50,50 koordinatlarında transparan olarak gösterir. Eğer True değeri False olsaydı transparan olmayacaktı.

DGCScreen1.Front.Draw(50, 50, DGCScreen1.Images[2], True);

Aşağıdaki kod ImageLibrary deki index(image) sayısını verir

NbrOfImages := DGCScreen1.ImageLibrary.ImageCount;

l Property MapLibrary(TDGCMapLib): DGC ile birlikte gelen Map Editör ile oluşturduğunuz Map dosyalarını yüklemek için kullanılır. Design Time ve Run Time olarak kullanılabilir.

l Property ScreenHeight : Integer; : Kullanılan çözünürlükteki ekran yüksekliğini verir.

l Property ScreenWidth : Integer; : Kullanılan çözünürlükteki ekran genişliğini verir.

l Property TileLibrary : TDGCImageLib; : MapLibrary’i oluşturan ImageLibrary buradan yükleniyor. Buradaki ImageLibrary’i oluşturan resimler 16x16x256Renk boyutlarında olmalı.

l Property Tiles[Index: Integer]: MapLibrary’i oluşturan ImageLibrarydeki resimlere ulaşmak için kullanılır. Map’de bulunan nesnelerin çarpma,vurma,kayma,alma gibi işlemlerin kontrol edilmesine yardımcı olur.

Örnek :

Var Tile : TDGCMapPos;

//Füzenin çarpma kontrolü yapılıyor.

Tile := DGCScreen1.GetTileDrawn(Missile[Loop].XPos,Missile[Loop].YPos);

//Aşağıdaki 4 rakamı MapLibrary’i oluşturan ImageLibrary’deki 4. Image(KAYA).

If Tile.Tile = 4 then // Füzenin çarptığı Kaya Mı ?

begin

Missile[Loop].Explode := True; // Kayayı Patlat.

Missile[Loop].ExpCell := 3;

Missile[Loop].AnimInc := 0;

Missile[Loop].AnimSpeed := 5;

end;

n Methods:

l Procedure DrawMap(MapSurface: TDGC-

MapSurface; MapIdx, MapX, MapY,SrcX, SrcY: Integer; Transparent: Boolean); : Belirtilen Map Library deki Map’i ekrana çizer.

l MapSurface: Harita üzerine çizmek istediğiniz TDGCSurface

l MapIdx: MapLibrary deki Map’in index’i

l MapX, MapY: Çizilecek Map’in başlangıç tile’ı

l SrcX, SrcY: Map çiziminin pixel (nokta) olarak başlangıç koordinatları

l Transparent: Transparen çizim veya değil

Örnek:

DGCScreen1.DrawMap(DGCScreen1.Back, 1, 2, 2, 5, 5, True).

// Map numarası 1 - Başlangıç Tile’ı 2,2 - Map başlangıç koordinatları 5,5 ve

// Transparan çizim.

l Procedure FadePaletteIn (Delay: Integer);: Açıktan koyuya renk değişimi (Ekran Kararması). Bir çeşit intro özelliği. Delay fade hızını belirliyor.

Örnek: FadePaletteIn(100);

l Procedure FadePaletteOut(Delay: Integer);: Koyudan açığa renk değişimi (Ekran Aydınlanması). Bir çeşit intro özelliği. Delay fade hızını belirliyor.

Örnek: FadePaletteOut(1);

l Function GetMapTile(MapIdx, MapX, MapY: Integer): Byte; : Map’deki Tile’ları belirlemeye yaramaktadır. Daha da açarsak bu fonksiyonu kullanarak MapLibrary de kullanılan ImageLibrary içindeki image’ları kontrol ederek Map üzerinde değişiklik yapılabilir.

MapIdx: MapLibrary deki Map’ların index’i

MapX: Map deki X konum

MapY: Map deki Y konum

Örnek:

for y := 0 to 599 do

begin

for x := 0 to 14 do

begin

// MapLibrary deki ilk Map’in değerleri MapHold değişkenine atanıyor.

// MapLibrary’i oluşturan tüm image’lar okunuyor ve dizine aktarılıyor.

MapHold[y][x] := DGCScreen1.GetMapTile(0,x,y);

end;

end;

l Function GetTileDrawn(X, Y: Integer): TDGCMapPos; : Bu fonksiyon çizilen Map’deki X, Y koordinatlarındaki Tile’i alır.

Örnek :

var

Tile: TDGCMapPos;

begin

//Map Ekrana çiziliyor.

DGCScreen1.DrawMap(DGCScreen1.Back, 0, 5, 5, 0, 0, False);

//Çizilen Map’in X,Y koordinatlarındaki Tile, Tile değişkenine atanıyor.

Tile := DGCScreen1.GetTileDrawn(0, 0);

//Tile değişkeni MapLibrary’i oluşturan ImageLibrary index numarasına

eşitleniyor.

end;

Gelecek ay buluşmak üzere şimdilik hoşçakalın.

Kartal Turgut-

kartaltr@superonline.com-mr_eagle@hotmail.com

PROGRAMLAMADA PORT KULLANIMI

l Port: Çevre birimlerini programlamak , onlarla bilgi (okuma/yazma) alışverişi yapmak için kullanılan elektriksel yollara denilir. Bir ya da birden fazla iletişim adresi vardır. İşlemcilerin (denetleyicilerin) programlanması ve onlardan bilgi alınması bu port numaralarıyla yapılmaktadır. Örnek vermek gerekirse yazıcıya veri göndermek veya almak 378h numaralı port ile mümkündür. IN komutu ile herhangi bir port adresinden 1 byte’lik veya 1word’luk (2 byte) veri okunabilir. Aşağıdaki komut ile timer (saat sayacı) portundan 1 word okunuyor:

IN AX,Y0h

OUT komutu ise belirtilen porta 1 byte veya 1 word veri yazar. Aşağıdaki kod işlemcinin RESET ucunu uyarıp,bilgisayarın yeniden açılmasına sebep olur:

MOV DX,EYh

MOV AL,REh; RESET (Cold reset)

OUT DX,AL

Portlara birden fazla değer yazmak veya okumak için INSB, INSW, INSD, OUTSB, OUTSW, OUTSO komutları kullanılabilir.Bu komutlarda B-byte, W-word ve D-Dword anlamında olup, aktarılacak veri CX registeri ile belirlenir.

REP INSB - cx’te belirtilen kadar byte,byte verioku

REP OUTSW - cx’te belirtilen kadar word/word veri yaz

Portlar, çevre birimleri ile iletişimin en alt düzeyidir. Kesmelerin yapamadıklarını portlarla yapabilirsiniz. Hız açısından da etkilidir. Port programlamasında çok dikkatli olmak gerekmektedir. Yanlış porta yanlış değer göndermek, sistemin bozulmasına yol açabilir. Örnek vermek gerekirse HDD programlanması port ile yapılacaksa, dikkat etmemek harddiskte bozulma olmasına neden olabilir. .Bu sebepten dolayı windows gibi yeni işletim sistemleri port ve kesmeleri denetim altına almıştır.

Son olarak port programlaması ile ilgili bir örnek verelim.Aşağıdaki örnek PIT (Programmable Interval Timer = Programlanabilir zamanlayıcı) ile sistem saati hızlandırılıyor:

.MODEL TINY ; En küçük bellek modeli seçiliyor.

.CODE ; kod segment

.RADIX 16 ;sayılar hexadecimal olarak algılanacak.

ORG 100 ;.com dosyanın offset adresi

START:

JMP SETTIMER ;kodların başlangıç adresine atlanıyor

COUNTER EQU 500 ; sayaç tanımlanıyor.

SETTIMER:

CLI ; kesmeleri devre dışı bırak.

MOV AL,00110110B ; sayaç modu ayarlanıyor.

OUT 43,AL

JMP $+2 ; Geciktirme kodu

MOV CX,COUNTER ;saat sayacı ayarlanıyor

MOV AL,CL

OUT UO,AL

JMP $+2 ; Timer portuna sayacın yüksek ve düşük

MOV AL,CH ; byteleri aktarılıyor.

OUT 40,AL

JMP $+2

STI

MOV AH,YC/INT 21 ; DOS’a çıkılıyor.

END START

END

 

 

 

 

1.GIRIS

      Windows altinda  calisan bir programlama sistemi olan  visual basic Windows tabanli
uygulamalar yazmak  isteyen herkes icin heyecan verici bir atilimdir.Visual Basic (VB )  , olay gudumlu program yapisi ve kullanimi kolayn gorsel araclariyla , Windows grafiksel ortaminin tum avantajlarindan yararlanarak , guclu uygulamalari kisa surede yazmaniza olanak verir.
          VB programlama sistemi , Windows ' un karmasikligini sasirtici derecede basite indirgeyerek , Basic dilinin bilinen yetenekleriini  , gorsel tasarim araclariyla birlestirir. VB basitlik  ve kullanimda  kolaylik saglarken  Windows '  u ideal bir calisma ortami yapan performanstan ve grafiksel ozelliklerden de fedakarlik etmez. Menuler , yazi tipleri , iletisim kutulari  , kaydirma yapabilen metin kutulari ve daha bircok grafiksel eleman kolayca tasarlanabilir.
 
           
.Veri giris ozellikleri sayesinde ,  pek cok  bilinen veri tabani formati icin size , veri tabani ve front-end  uygulamalar yaratma olanagi verir.
3.DEGISKENLER VE SABITLER

3.1.VB VERI TURLERINI BELIRTMEK

     VB,veri turleri(DATA TYPES) adli bir grup standart veri gosterimi tanimlar.

Veri Turleri

        Veri Turunun Adi       

        Degerlerin Erimi       

            Depolama Miktari          

               integer

    -32.768 ile 32.767 arasi  

              2 byte        

                  long

     -2.417.483.648 ile

       2.417.483.647 arasi  

              4 byte

              string

  0 ile 65.500 karakter arasi

       Her karaktere 1 byte

             currency 

 

              8 byte

                 single   

 

              4 byte

                 double

 

               8 byte

                 variant

               

 

3.2.DEGISKENLER VE SABITLER YARATMAK

       VB,bellekteki konumlara adlar vermenize olanak saglar;bu adlari kullanarak depolanmis verilere erisilebilir.Adlandirilmis bir bellek konumuna degisken(VARIABLE)denir.Bellekte depolama alani ayirmak istediginizi VB'e bildiren Dim bildirisi,asagidaki sozdizimine(syntax) sahiptir:

       Dim degisken,[As tur]

Koseli ayrac icinde gosterilen tumce istege baglidir        Dim USDolar As Currency

Eger As sozcugunu atlarsaniz,VB degiskeni variant turunde kabul eder.

       Bir  sayisal degisken icin bellek ayirdiginizda,VB degiskene ilk degerini kendi verir.Eger degiskenin belirli bir deger almasini istiyorsaniz,programinizda ona bir deger atamaniz(ASSIGN) gerekir.Bir degiskene acikca bir deger atamak, programin daha kolay okunmasini ve belirsiz degerlerden kacinmanizi saglar.

       Sabit degerler icin, VB sabit tanitimlarinda(COSTANT DECLERATIONS)bulunmanizi saglar.Bu sabitler icin icerikleri hep ayni kalan bellek yerleri ayrilir.Const bildirisi bir sabit deger tanitir ve asagidaki forma sahiptir:   

        Const ad=deger

Sabitler icin tur bildirilmesine gerek yoktur.

         Const GMH=2.54

VB TUR TANITIM KARAKTERLERI

            Tur Tanitim Karakterleri            

            Belirttigi Veri Turu          

                             %

                   integer

                              &

                      long

                               !                         

                     single

 

                      double

 

                    currency

 

                       string

3.2.1.ADLAR ICIN KURALLAR

·        Adin ilk karakteri harf olmali

·        Adin daha sonra gelen karakterleri yalnizca harf,sayi ya da alt cizgi olabilir.

·        Ad 40 karakterden fazlasini icermez.

·        Sub,Now,End gibi VB'de ozel anlam tasiyan anahtar sozcukler,ad olarak kullanilamaz.

       Gecersiz bazi bildiriler:

        Dim 2 kisi toplami As Currency

         Const PRINT=3

         Dim ilk*maas As Long

3.3.KULLANICI TANIMLI TURLER YARATMAK

          VB'te yerlesik olarak bulunan veri turleri,kolaylikla tek bir metin ya da sayisal bilesenle ifade edilebilen bilgiler(ad,boyut,sicaklik gibi)icin genellikle kullanislidir.Ancak,gruplandirilmasi gereken bilgi bilesenleriyle calisirken,bu veri turleri elverissiz olabilir.

           Kullanici tanimli bir veri turu,var olan VB turlerinin(integer,string,double v.b.)birlesiminden olusur.VB ,asagida gosterildigi gibi,Type anahtar sozcugu ile,kullanici tanimli bir tanitiminin baslangicini isaret eder.

Type personel

             ad As string

              soyad As string

              adres As string

               telefon As long

End Type

               Henuz veri icin bellekte yer ayrilmadi,yalnizca verinin yapisini VB bildirildi.Yeni turu yukaridaki gibi tanimladiktan sonra,her zaman ki gibi degiskenler yaratabilirsiniz.

                Dim Muhper As personel

                Dim Emekliper As personel

                 Cogu programlama dilinde ,birden cok bilesen iceren degiskenlere kayit(RECORD)adi verilir ve kaydin her ayri bilesenine eleman(ELEMENT)denir.Yalnizca bir tek bilesene gonderme yapmak istediginizde,degisken adinin ardindan bir nokta(.) ve bilesenin adini kullanabilirsiniz.

                  Muhper.telefon=3225555

                   Kullanisli olmanin yaninda,ayni zamanda programlarinizin daha kolay okunmasini ve gereksinmelerinize en iyi sekilde yanit bulmanizi saglarlar.

3.4.YEREL VE MODUL DUZEYI DEGISKENLERI

        Bir degiskenin etkinlik alani(SCOPE),degiskene hangi prosedurlerin erisimi olacagini belirler.Her biri yalnizca kendi ozel proseduru icinde erisilebilir olanlar yerel degiskenler (LOCAL VARIABLES)olarak adlandirilir.Formun genel tanitimlar bolumunde bir single degiskeni tanitirsak,modul duzeyi degiskeni(MODULE-LEVEL VARIABLE)yaratmis oluruz.Bu sekilde tanitilan degiskenler,formdaki her prosedure erisebilirler.Modul(MODULE) oncelikli dosya anlamina gelir,cunku bir forma ait tum kodlar tek bir dosyada tutulur.

         Bir degiskenin etkinlik alanini sinirlamak yararlidir, cuunku degisken adlarini baska yerlerde kullanmamiza olanak verir.Yerel etkinlik alani, prosedurlerin ayri birer birim olmasina olanak saglar, yani programin diger kisimlarinda yapilan degisiklikler belirli bir prosedurun isleyisini etkilemez.

3.5.GENEL DEGISKENLER             

        Modul duzeyi degiskenleri yalnizca bir form icinde gorulebilir.Eger birden cok formu olan bir program yazarsaniz, formlar arasindaki bilgiyi paylasmak icin bir yol bulmaniz gerekir.VB etkinlik alaninin bir ucuncu duzeyini genel degiskenleri(GLOBAL VARIABLES) SUNAR.Genel degiskenler kod modullerinde tanitilir ve programin herhangi bir bolumunden erisebilirler.

         Genel degiskenler yaratmak icin Dim yerine Global anahtar sozcugu kullanilir.

          Global degisken[As tur]

          Etkinlik alani kurallari sabitler icin de gecerlidir.Const bildirisiyle tanimlanan sabitlere, onlari bir prosedurde mi yoksa bir modulde mi tanimladiginiza bagli olarak, yerel ya da modul-duzeyi etkinlik alani verilir.Genel sabitler yaratmak icin Const bildirisine Global anahtar sozcugu ile baslariz:

           Global Const Pi=3.14

Genel sabitler ve degiskenler, bir form icinde tanitilamazlar.

3.6.KOD MODULLERI

       Dosyalari BAS uzantisina sahip olan kod modulleri,VB'in File menusunden New Module komutunu verdigimizde,ya da Toolbar uzerindeki New Module dugmesine tikladiginizda yaratilirlar.Koddan baska bir sey icermeyen uygulama dosyalaridir.Bir kod modulundeki genel tanitimlar, programin tamami tarafindan paylasilabilirler.          

            .OLE  ile birlikte , MS Word kelime islemcisi   , MS Excel spreadsheet  ve MS  Project  is projesi planlama sistemi gibi uygulamalarin islevsel ozelliklerinden  deyaralanmamizi saglar.
           
.Bitirdiginiz uygulamaniz   ,  bir run -time dinamik baglantili kutuphane kullanan (DLL) ve serbestce dagitimini yapabileceginiz gercek bir .EXE dosyasi haline getirilebilir.
 
        Olay gudumlu programlamanin yaptigi , her adimi degismez sira ile izleyen programlar yazmaktansa , kullanicinin eylemlerine (ORNEGIN BIR  KOMUT SECMEK , BIR PENCEREYE TIKLAMAK  , YA DA  FAREYI HAREKET ETTIRMEK )  yanit  veren programlar yazmaktir . Programci , bir program yazmak yerine , kullanicin baslattigi olaylarla tetiklenen , isbirligi icinde calisan mini prograamlardaan olusaan uygulamalar yaratir.
         Simdi , ilerleyen bolumlerde karsilasacak oldugunuz  VB  bildirilerinin sozdizimlerinde kullanilan isaret ve yazim sekilleri hakkinda bilgi verelim. Bu sozdizimi satirlarinda ,  italik harflerle gosterilen  ogeler  , vermeniz gereken bilginin tumunu gosterir ; ornegin bir yerde  degisken gordugunuzde oraya degisken adi girmeniz gerekir. Normal metinlerle gösterilmis ogeler ,  yazildiklari gibi girmeniz gereken  karakter ve anahtar sozcukleri ifade eder. Koseli ayraclar icindeki ogeler istege baglidir ; yani  bunlari  atlasaniz bile bildiri gecerlidir . Aralarinda  dikey cubuk (I) bulunan ,  kume ayraclari icinde bulunan ogeler , secenekleri  belirtir ; bu seceneklerden biri secilmelidir . Kume ayraclari ya da  koseli ayraclar grubunun ardinda uc nokta  ( . . . ) varsa , ayraclar icindeki  ogeler tekrarlanabilir.

2.VB'E BASLANGIC

2.1. EKRANI KESFETMEK

        VB basladiktan sonra ekranda bes pencere gorunur ( SEKIL 1) .Ekranin üst tarafinda ana pencere  vardir. Bu pencere File ve Edit menulerini diger menuleri , bir de arac cubugu (TOOLBAR ) icerir. Ekranin ortasinda gordugunuz Form 1 baslikli bos pencere , form penceresi (FORM WINDOW)  adiin tasir. Sol yanda , arac kutusu ( TOOLBOX) adi verilen bir palet penceresi goruyorsunuz. Sag yanda gordugunuz pencere ozellikler ( PROPERTIES ) penceresi , onun altindaki ise proje ( PROJECT ) penceresidir

2.1.1. ANA PENCERE

      Ana pencere , icinde sekiz acilan menu olan bir menu cubugu ve ayrica bir de toolbar icerir. Bu toolbar uzerindeki dugmeler , sikca kullanilan komutlar icin kisa yollar saglar. Son olarak , ana penceredeki toolbarin saginda form penceresinde o anda secili olan nesnenin boyut ve konumunu bildiren iki  goruntu alani yer alir. 
 

2.1.2. PROJECT PENCERESI

      Project penceresi , yaratmakta oldugumuz VB programinin calismasi icin gerekli olan butun dosyalarin listesini verir. Eger formu disk uzerine farkli bir adla kaydetmezseniz , VB ongordugu dosya adi olan Form1.frm 'yi kullanir. Bir uygulama , her biri ayri bir dosyada saklana pek cok formdan olusabilir ve bu formlar ayri olarak saklanabildiklerinden ,  baska uygulamalarca da paylasilabilir.
       Project penceresi ayrica , formu goster ( VIEW FORM) ve kodu goster ( VIEW CODE )  etiketli  iki dugme icerir. Baska birsey belirtmediginiz surece , Project penceresinden  bir dosya sectiginizde  , VB o dosyaya karsilik gelen formu goruntuler. Bu gorunum , uygulamanizin  kullanici arabirimini (USER INTERFACE ) tasarlamanizi saglar. Kullanici arabirimi , bir uygulamanin  , kullanicinin gordugu ve etkilesime girdigi yuzudur. Project  penceresindeki View Code dugmesine tiklarsaniz  , dosyaya karsilik gelen  kodu (CODE) gorursunuz. Kod terimi , bir programlama dilindeki  bildiriler ( STATEMENTS  ) icin  kullanilir ; dolayisiyla programlama islemine  kodlama
(CODING) da diyebilriz . VB ile bir program yaratirken  , iki is birden yaparsiniz ; kullanicinin ekranda ne gorecegini  belirleyen form tasarimi ve programin isleyisini  denetleyen kodlama  . Kod penceresinden form penceresine  geri donmek icn  , ister  form penceresi uzerine tiklayip onu etkinlestirir , ister Project  penceresindeki  View Form dugmesine tiklarsiniz.

2.1.3.FORM PENCERESI VE TOOLBOX
 
        Uygulamaniz  calisrken goreceginiz pencerelerin her birine form adi verilir. Uygulamanizi tasarlarken  , bu form , uygulamanizin cesitli parcalarini  cizebileceginiz bir kagit gibi davranir. Formun uzerine yerlestirdiginiz  uygulama bilesenlerine  nesne (OBJECT) ya da kontrol  (CONTROL) adi verilir. Ornegin resim kutulari  , secenek  dugmeleri  , kaydirma cubuklari  birer nesnedir. Kontroller toolbox paleti kullanilarak yaratilir.  Her kontrol  , bir Toolbox ' ta bir simge (arac) ile gosterilir. Toolbox icne yeni araclar eklenebilir.
         Programinizin gorunumunu  , Toolbox 'tan secip bir formun uzerine yerlestirerek tasarlanir. Tasarim evresinde  , VB goruntu nesneleri yaratmaniza ve programiniz yazmaniza yardimci olacak  araclar saglar. Form uzerindeki nesnelerin boyutlarini  , konumlarini ve diger ozelliklerini degistirebilirsiniz. Nesneler  etkin degildir ve yazdiginiz kod uygulanmaz ; ornegin bir form uzerine bir kaydirma cubugu yerlestirirseniz , bu nesnenin boyut ve konumunu degistirebilirsiniz , ama  onu  kullanarak hicbir seyi kaydiramazsiniz.
        Tasarimini bitirdiginiz uygulamayi calistirdiginizda , VB  tasarim  araclarini ortadan  kaldirir.  Pencere duzenlemesi  sabittir , ekrandaki nesneler etkinlestirilebilir ve kullanici , goruntu nesneleri ile etkilesime girebilir. Uygulama denetimi uzerine almistir ; VB  Program bildirilerinizi uygular.

2.1.4.PROPERTIES PENCERESI

       VB ' te ozellikler (PROPERTIES) , bir nesnenin davranisini belirleyen  duzenekler anlamina gelir. Bu ozelliklerin  degeleri  ,  nesnenin uygulama icindeki gorunumunu ve davranisini belirler. Bazi ozellikllere verebileceginiz degerler icin kisitlamalar vardir. Ornegin , bir nesnenin Visible ozelligi ya True ya da False olabilir ( yani bir nesne ya gorunur , ya da gorunmez durumdadir ). Diger bazi ozellikler , ornegin bir  form penceresinin basligi  , hemen her degere getirilebilir.  Her  nesnenin tum ozellikleri icin bir deger belirtmek  zorunda degilsiniz ; bircok ozelligin ongorulen degeri , sizin icin uygun olabilir.
        Properties penceresini etkinlestirmek icin bircok yol vardir :
Pencerenin uzerine  tiklayabilir  , WindowWindows menusunden Properties komutunu secebilir , F4  tusuna basabilir ya da Toolbar uzerindeki Properties Window dugmesiine tiklayabilirsiniz.
        Properties penceresinin ust kismindaki  acilan liste kutusu , nesne kutusu adini tasir. Bu kutu uygulamadaki her nesnenin adini ve turunu goruntuler.
        Nesne kutusunun alltinda , ayarlar kutusunu ve  ooozellikler listesini goru rsunuz. Ozellikler     listesi , nesne kutusundaki her bir nesnenin tum  ozelliklerinin o anki degerlerini gorebilmeniz icin  , uzun ve kaydirilabilir bir liste sunar. Bu listeden bir ozellik sectiginizde  , sectiginiz ozelligin o anki degeri  ,  listenin uzerindeki ayarlar kutusunda gorulur. Bu  kutuya  yeni birsey yazarak ya da kutudaki acilan listeden bir deger secerek  ,  nesnenin istediginiz  ozelliginin degerini  degistirebilirsiniz.

2.2.KOD YAZMAK

      Kodlama (bir programin isleyisini denetleyen bildirileri yazma sureci ) programlamanin kalbidir. Uygulamanizin arabirimini tamamladiginiza gore , sira onu calistiracak programi yazmaya gelir. VBprogramlama dilinde yazdiginiz komutlar , bilgisayarin kontrolunu dolayli yoldan gerceklestirseler de , onlarin bilgisayari dogrudan kontrol ettikleri dusunulebilir.

2.3.OLAY PROSEDURLERI

      Daha once , nesnelerin ozellikleri ve bir nesneyi etkileyen ozelliklerin nasil degistirilecegi hakkinda bilgiler edindiniz. Benzer sekilde , her nesne belirli zamanlarda calistirilan bir dizi prosedur ile iliskilendirilebilir. VB programlama dilinde  prosedur (PROCEDURE) , bir bildiriler grubudur. Bir prosedur cagrildiginda , icindeki bilgiler calistirilir. Yazdiginiz tum calistirilabilir kodlar  her zaman bir cesit prosedur icinde yer alirlar.
       Bir nesneyle iliskilendirilen her prosedur , bir olaya  baglanir , dolayisiyla birer olay prosedurudurler. Olay terimi  , kullanicinin  yaptigi bir eylemi gosterir. Olaylara ornek  olarak  , kullanicinin fare dugmesini basip birakmasiyla tetiklenen Click olayini , ya da kullanicinin form penceresinin boyutlarini degistirmesiyle ortaya cikan Resize olayini gosterebiliriz. Olaylar , tasarim sirasinda degil , yalnizca calisma aninda ortaya cikar.

2.3.1.PROSEDUR TANITIMLARI

     Prosedur tanitim satirinda , Sub anahtar sozcugu , prosedurun baslangicini gosterir. Olay prosedurlerinin  adlari icin su kurallara uyulmalidir :
      1.Adin ilk kismi , form uzerinde yaratmis oldugunuz bir nesnenin adi ,  ya da (eger ilgili nesne formun kendisiyse) Form  olmalidir.
      2.Adin son kismi bir olay (EVENT) adi olmalidir.
      3.Adin iki kismi arasinda bir alt cizgi ( _ )  bulunmalidir.

2.3.2.DEGISKEN TANITIMLARI

      Bilgisayar programlarinda bir degeri saklamak icin , bilgisayar belleginde bir yer ayirmalisiniz. Bu isi  ,  degisken tanitimlari (VARIABLE DECLARATIONS) yoluyla yaparsiniz. Degiskenler (VARIABLES) , bilgisayar belleginin ayrilmis (rezerve) bolumleridir.Dim bidirisi , ne kadarlik bellek ayrilacagini ve bu bellek alanina ne ad verilecegini soyler. Programlarinizda degisken tanitimlari yyapacaginiz zaman , Dim bildirisini kullanirsiniz.

2.4.PROGRAMI CALISTIRMAK

      Uygulamayi baslatmak icin F5 tusuna basilmasi gerekir.

2.5.PROGRAMI DISKE KAYDETMEK

      VB' in File menusunden  Save Project komutunu verin. Save As iletisim kutusuyla , sizden uygulamanizin form kodunu ve goruntu duzenini  kaydetmek  icin bir dosya adi ve dizin ister.
       Ileride uygulamayi acip calistirabilmek  icin , once  VB calistirilmali  ve daaha ssonra da File  menusunden  Open Project komutunu  vermelisiniz. Open Projcet iletisim kutusu ,  tum proje dosyalarinin  (*.MAK )listesini verir. Dosya adini secip OK  tiklanisa proje calisacaktir. Uygulama calistirmak icin F5 tusuna basilmalidir.

3.DEGISKENLER VE SABITLER

3.1.VB VERI TURLERINI BELIRTMEK

     VB,veri turleri(DATA TYPES) adli bir grup standart veri gosterimi tanimlar.

Veri Turleri

        Veri Turunun Adi       

        Degerlerin Erimi       

            Depolama Miktari          

               integer

    -32.768 ile 32.767 arasi  

              2 byte        

                  long

     -2.417.483.648 ile

       2.417.483.647 arasi  

              4 byte

              string

  0 ile 65.500 karakter arasi

       Her karaktere 1 byte

             currency 

 

              8 byte

                 single   

 

              4 byte

                 double

 

               8 byte

                 variant

               

 

3.2.DEGISKENLER VE SABITLER YARATMAK

       VB,bellekteki konumlara adlar vermenize olanak saglar;bu adlari kullanarak depolanmis verilere erisilebilir.Adlandirilmis bir bellek konumuna degisken(VARIABLE)denir.Bellekte depolama alani ayirmak istediginizi VB'e bildiren Dim bildirisi,asagidaki sozdizimine(syntax) sahiptir:

       Dim degisken,[As tur]

Koseli ayrac icinde gosterilen tumce istege baglidir        Dim USDolar As Currency

Eger As sozcugunu atlarsaniz,VB degiskeni variant turunde kabul eder.

       Bir  sayisal degisken icin bellek ayirdiginizda,VB degiskene ilk degerini kendi verir.Eger degiskenin belirli bir deger almasini istiyorsaniz,programinizda ona bir deger atamaniz(ASSIGN) gerekir.Bir degiskene acikca bir deger atamak, programin daha kolay okunmasini ve belirsiz degerlerden kacinmanizi saglar.

       Sabit degerler icin, VB sabit tanitimlarinda(COSTANT DECLERATIONS)bulunmanizi saglar.Bu sabitler icin icerikleri hep ayni kalan bellek yerleri ayrilir.Const bildirisi bir sabit deger tanitir ve asagidaki forma sahiptir:   

        Const ad=deger

Sabitler icin tur bildirilmesine gerek yoktur.

         Const GMH=2.54

VB TUR TANITIM KARAKTERLERI

            Tur Tanitim Karakterleri            

            Belirttigi Veri Turu          

                             %

                   integer

                              &

                      long

                               !                         

                     single

 

                      double

 

                    currency

 

                       string

3.2.1.ADLAR ICIN KURALLAR

·        Adin ilk karakteri harf olmali

·        Adin daha sonra gelen karakterleri yalnizca harf,sayi ya da alt cizgi olabilir.

·        Ad 40 karakterden fazlasini icermez.

·        Sub,Now,End gibi VB'de ozel anlam tasiyan anahtar sozcukler,ad olarak kullanilamaz.

       Gecersiz bazi bildiriler:

        Dim 2 kisi toplami As Currency

         Const PRINT=3

         Dim ilk*maas As Long

3.3.KULLANICI TANIMLI TURLER YARATMAK

          VB'te yerlesik olarak bulunan veri turleri,kolaylikla tek bir metin ya da sayisal bilesenle ifade edilebilen bilgiler(ad,boyut,sicaklik gibi)icin genellikle kullanislidir.Ancak,gruplandirilmasi gereken bilgi bilesenleriyle calisirken,bu veri turleri elverissiz olabilir.

           Kullanici tanimli bir veri turu,var olan VB turlerinin(integer,string,double v.b.)birlesiminden olusur.VB ,asagida gosterildigi gibi,Type anahtar sozcugu ile,kullanici tanimli bir tanitiminin baslangicini isaret eder.

Type personel

             ad As string

              soyad As string

              adres As string

               telefon As long

End Type

               Henuz veri icin bellekte yer ayrilmadi,yalnizca verinin yapisini VB bildirildi.Yeni turu yukaridaki gibi tanimladiktan sonra,her zaman ki gibi degiskenler yaratabilirsiniz.

                Dim Muhper As personel

                Dim Emekliper As personel

                 Cogu programlama dilinde ,birden cok bilesen iceren degiskenlere kayit(RECORD)adi verilir ve kaydin her ayri bilesenine eleman(ELEMENT)denir.Yalnizca bir tek bilesene gonderme yapmak istediginizde,degisken adinin ardindan bir nokta(.) ve bilesenin adini kullanabilirsiniz.

                  Muhper.telefon=3225555

                   Kullanisli olmanin yaninda,ayni zamanda programlarinizin daha kolay okunmasini ve gereksinmelerinize en iyi sekilde yanit bulmanizi saglarlar.

3.4.YEREL VE MODUL DUZEYI DEGISKENLERI

        Bir degiskenin etkinlik alani(SCOPE),degiskene hangi prosedurlerin erisimi olacagini belirler.Her biri yalnizca kendi ozel proseduru icinde erisilebilir olanlar yerel degiskenler (LOCAL VARIABLES)olarak adlandirilir.Formun genel tanitimlar bolumunde bir single degiskeni tanitirsak,modul duzeyi degiskeni(MODULE-LEVEL VARIABLE)yaratmis oluruz.Bu sekilde tanitilan degiskenler,formdaki her prosedure erisebilirler.Modul(MODULE) oncelikli dosya anlamina gelir,cunku bir forma ait tum kodlar tek bir dosyada tutulur.

         Bir degiskenin etkinlik alanini sinirlamak yararlidir, cuunku degisken adlarini baska yerlerde kullanmamiza olanak verir.Yerel etkinlik alani, prosedurlerin ayri birer birim olmasina olanak saglar, yani programin diger kisimlarinda yapilan degisiklikler belirli bir prosedurun isleyisini etkilemez.

3.5.GENEL DEGISKENLER             

        Modul duzeyi degiskenleri yalnizca bir form icinde gorulebilir.Eger birden cok formu olan bir program yazarsaniz, formlar arasindaki bilgiyi paylasmak icin bir yol bulmaniz gerekir.VB etkinlik alaninin bir ucuncu duzeyini genel degiskenleri(GLOBAL VARIABLES) SUNAR.Genel degiskenler kod modullerinde tanitilir ve programin herhangi bir bolumunden erisebilirler.

         Genel degiskenler yaratmak icin Dim yerine Global anahtar sozcugu kullanilir.

          Global degisken[As tur]

          Etkinlik alani kurallari sabitler icin de gecerlidir.Const bildirisiyle tanimlanan sabitlere, onlari bir prosedurde mi yoksa bir modulde mi tanimladiginiza bagli olarak, yerel ya da modul-duzeyi etkinlik alani verilir.Genel sabitler yaratmak icin Const bildirisine Global anahtar sozcugu ile baslariz:

           Global Const Pi=3.14

Genel sabitler ve degiskenler, bir form icinde tanitilamazlar.

3.6.KOD MODULLERI

       Dosyalari BAS uzantisina sahip olan kod modulleri,VB'in File menusunden New Module komutunu verdigimizde,ya da Toolbar uzerindeki New Module dugmesine tikladiginizda yaratilirlar.Koddan baska bir sey icermeyen uygulama dosyalaridir.Bir kod modulundeki genel tanitimlar, programin tamami tarafindan paylasilabilirler

4.BILDIRILER.,ANLATIMLAR VE PROSEDURLER

      VB dilinde bir bildiri(STATEMENT),Turkce'deki bir tumcenin dengidir: yani bir bilgisayara verilen anlamli bir komutu belirtir.Bildiriler icinde, degerleri ve islecleri bir araya getirerek anlatimlar(EXPRESSIONS) yaratabilirsiniz.

4.1.ATAMA BILDIRILERI

       Bir programdaki en basit ve en cok kullanilan bildiri,atama(ASSIGNEMENT) bildirisidir.Bu, bir degisken adi ardindan atama operatoru(=), ardindan da bir anlatim icerir.

        baszaman=Now

         net=brut-gider

          Atama bildirileri bilgi depolamak icin kullanilir.Atama operatorunun saginda bulunan anlatimin degeri hesaplanir ve sonuc,operatorun solundaki degiskende depolanir.Degiskenin veri turu,hesaplanan anlatim degerine uygun olmalidir.Eger veri turleri birbirine benzerse,, ancak ayni degilse(ornegin, bir tamsayi degerini bir floating point degiskende saklamak istersek),VB anlatimin sonucunu degiskenin turune donusturur.

4.2.ANLATIMLAR VE OPERATORLER

       Anlatimlar genellikle gerceklestirilecek hesaplamalari gosterirler, ancak tek bir sabitten olusacak kadar basit olabilirler.Bir operator(OPERATOR),genellikle hesaplamanin turunu belirtir.VB aritmetik operatorlerden baska string birlestirme operatoru, karsilastirma ve mantiksal operatorler saglar.

        Anlatimlar kendi baslarina gecerli bildiriler degillerdir, cunku tam degillerdir.Anlatim:

         .Bir degismez deger,bir anlatimdir.

          .Sirasiyla bir anlatim, bir islec ve baska bir anlatimdan olusan birlesim yine bir anlatimdir. 

Bu kurallara gore, 1 ya da 3 birer anlatimdir,3+1'de bir anlatimdir.

4.2.1.ANLATIM TURLERI

        Bir anlatimin turu , operandlarin turu tarafindan saptanir.Bir sabit icin anlatimin turu, sabitin turu ile aynidir.Bir operator iceren bir anlatimda, VB sonucun turunu saptamak icin operandlarin her ikisinin turunu de kullanir.Eger iki farkli turu karistirirsak,VB genellikle sonucu en genis erime sahip olan ture ayarlar.

        Anlatimlar, operatorlerin ve sabitlerin yaninda, degiskenler ve sabitlerin yaninda, degiskenler ve ayraclar da icerir.Ayrac icindeki alt anlatimlar her zaman ilk once hesaplanir.

4.2.2.ARITMETIK OPERATORLER

Operator

Islem

+

Toplama

-

Cikarma

*

Carpma

^

Us Alma

/

Hareketli-nokta bolme

\

Tamsayi bolme

Mod

Mod

4.2.3.STRING BIRLESTIRME OPERATORU

      Bir anlatimdaki operandlar string degerleri oldugunda, (+) operatoru dizilimleri ard arda birlestirir.Ard arda birlestirme operatorunu, iki ya da daha fazla stringi birlestirmek icin kullanabiliriz.Birlestirme sonucunda tamamiyla yeni bir string elde edilir: isleme giren operandlarin degerlerinde herhangi bir degisiklik olmaz.

4.2.4.KARSILASTIRMA OPERATORLERI

      Iki deger karsilastirildiginda islemin sonucu bir mantiksal degerdir; yani True ya da False olabilir.

Operator

Islem

>

       Buyuktur

<

       Kucuktur

>=

Buyuk ya da esittir

<=

Kucuk ya da esittir

=

        Esittir

<>

      Esit degildir 

4.2.5.MANTIKSAL OPERATORLER

      Bu operatorler, operandlar olarak mantiksal degerlere sahiptir ve mantiksal sonuclar verirler.

     Operator      

      Islem       

          Not

         Degil  

          And

            Ve

           Or

           Veya      

          Xor

     Exclusive or 

           Eqv

         Denktir

           Imp

      Gerektirme

4.2.6.ONCELIKLER

     VB, ilk once hangi islemin yapilmasi gerektigini belirlemek icin operator onceligi adi verilen bir dizi kural kullanir.Mantiksal operatorlerin tumu karsilastirma operatorlerinden daha alt oncelige sahiptir.

             Operator             

                     Islem               

                    ^

                   Us alma  

                    *

       Carpma,Hareketli-nokta bolme      

                     \  

              Tamsayi bolme 

                   Mod

                       Mod

                   + -

            Toplama , cikarma

             > < > = < = = < >      

                 Karsilastirma         

                   Not

                       Degil

                    And

                          Ve

                     Or

                        Veya

                     Xor

                  Exclusive or

                     Eqv

                     Denktir

                      Imp

                   Gerektirme

4.3.PROSEDURLER

     Bir prosedur, ozel bir hizmeti gerceklestiren bir komutlar kumesidir: mesela MsgBox proseduru.Deger donduren VB prosedurleri fonksiyonlar olarak adlandirilirlar; ornegin InputBox fonksiyonu.

     Bir proseduru kullanmak (cagirmak)icin, ilk ogesi prosedurun adi olan bir bildiri yazarsiniz.  

P>4.2.5. MANTIKSAL OPERATÖRLER

Bu operatorler, operandlar olarak mantiksal degerlere sahiptir ve mantiksal sonuçlar verirler.

Operator

Islem

Not

Degil

And

Ve

Or

Veya

Xor

Exclusive or

Eqv

Denktir

Imp

Gerektirme

4.2.6. ÖNCELIKLER

VB ilk önce hangi islemin yapilmasi gerektigini belirlemek için operatör önceligi adi verilen bir dizi kural kullanir.

Mantiksal operatörlerin tümü karsilastirma operatörlerinden daha alt öncelige sahiptir.

Operatör

Islem

^

Üs alma

* /

Çarpma, Hareketli-nokta bölme

\

Tamsayili bölme

Mod

Mod

+ -

Toplama, çikartma

> < > = <= = < >

Karsilastirma

Not

Degil

And

Ve

Or

Veya

Xor

Exclusive or

Eqv

Denktir

Imp

Gerektirme

4.3 PROSEDÜRLER

Bir prosedür, özel bir hizmeti gerçeklestiren bir komutlar kümesidir; mesela MsgBox prosedürü. Deger döndüren

VB prosedürleri fonksiyonlar olarak adlandirilirlar: örnegin InputBox fonksiyonu.

Bir prosedürü kullanmak (çagirmak) için, ilk ögesi prosedürün adi olan bir bildiri yazarsiniz. Bir prosedür

çagrisi, eksiksiz bir VB bildirisidir ve prosedür sizden baska bir bilgi istemeyebilir. Eger prosedürün bazi bilgilere

gereksinimi varsa, prosedüre göndermek istediginiz degerleri, aralarina virgüller koyarak girmelisiniz. Bir prosedüre ya da

fonksiyona bu sekilde ´´geçirdiginiz´´ degerlere onun argümanlari olarak adlandirilir. Prosedür çagrilarina örnekler:

MsgBox ´´ 4. Bölüm ``

Beep

Bir fonksiyon bir degere dönüstügü için, fonksiyonlar bir anlatimin söz konusu oldugu her yerde kullanilabilir.

Ancak anlatimlar kendi baslarina geçerli bildiriler degildirler. Bundan dolayi, bir fonksiyon çagrisi her zaman bir diger

bildirinin baglaminda, en siklikla da bir atama bildirisinin baglaminda bulunur. Asagida bazi geçerli fonksiyon

çagrilari gösterilmektedir:

Sin (x) ^ 2

Format ( Now, ´´hh : mm)

Son zamanlarda nesneye yönelik programlama dillerinin tasarimcilari, metod adi verilen, prosedür ve

fonksiyonlarin özel bir türünü sundular. VB, tam olarak nesneye yönelik olmamasina karsin, formlar ve komut

dügmeleri gibi nesnelerin her biri için metodlar içerir. Metodlar da prosedürler ve fonksiyonlar gibi çalisirlar, ancak

özellikler ( properties ) ve alan adlari (fieldnames) gibi belirli nesnelerin bilesenleridir.

5 PROGRAM KONTROLÜ

5.1. IF BILDIRISI

If bildirisinin klasik formu, iki seçenek arasindan bir seçim belirtir. Program kodunuzda if bildirisini kullanarak

kosula bagli dallanma olarak bilinen durumu saglariz.

If mantiksal anlatim Then

[bildiri]

[Else

[bildiri] ... ]

End If

If bildirisi bilesik bir bildiridir, yani tek bir birim olarak degerlendirilir. Asagidaki kod parçalari birbirine denktir:

If response = ´´ Korku ``

Print ´´ Korkak ``

Else

End If

If response = ´´ Korku ``

Print ´´ Korkak ``

End If

Ikinci if bildirisi, tümüyle birincisi içinde yer alan bir bildiridir. VB, bir Else paragrafini, baska bir If bildirisinin

islevselligi ile birlestiren ElseIf adli bir bildiri de sunar. Asagida her iki bildiri için örnek verilmistir:

If takim = ´´ cimbom``

Then

çikti = ´´ sampiyon ``

Else

If takim = ´´ fener´´

Then

çikti = ´´ ali

sen``

Else

çikti =

´´ karadeniz

firtinasi ``

End If

End If

If takim = ´´ cimbom `` Then

çikti = ´´ sampiyon ``

ElseIf takim = ´´ fener `` Then

çikti = ´´ ali sen ``

Else

çikti = 

´´ karadeniz firtinasi ``

End If

ElseIf paragrafi birçok kez tekrarlanabilir.

5.2. DO LOOP BILDIRISI

VB Do bildirisi, bir grup bildiriyi tekrar tekrar isleyebilir; bu bildiri için söz dizimi ise:

Do

[bildiri] ...

Loop

Do anahtar sözcügü, Loop anahtar sözcügüne kadar olan tüm bildirileri içeren bir bilesik bildirinin baslangicini isaret eder.

Döngülerin basina veya sonuna While veya Until anahtar sözcükleri ile testler ( kontroller ) eklenebilir. Bu anahtar

sözcüklerin sonuna bir kosul gelmelidir. Kosul döngünün basinda ve False ( saglanamama durumu ) halinde program

döngüye girmeyecektir. Oysa kosul döngü sonunda ve kosul False olsa dahi döngü bir kez gerçeklestirilecektir.

Döngü basinda test

Döngü sonunda test

Do { While | Until } anlatim

[ bildiri ] ...

Loop

Do

[ bildiri ] ...

Loop { While | Until } anlatim

Örnek olarak:

Do

Parola = InputBox ( ´´PAROLA`` )

Loop While Parola < > ´´ Serkan ``

sayaç = 1

Do While sayaç < = 25

Print sayaç

sayaç = sayaç + 1

Loop

Do

Parola = InputBox ( ´´PAROLA`` )

Loop Until Parola = ´´ Serkan ``

sayaç = 1

Do Until sayaç > 25

Print sayaç

sayaç = sayaç + 1

Loop

5.3. FOR DÖNGÜLERI

VB ´deki For bildirisi asagidaki sözdizimine sahiptir:

For degisken = ilkdeger To sondeger [ Step artis ]

[bildirisi] ...

Next degisken

For bildirisi içindeki sayaç degiskenini ilkdeger ile baslatip, sondeger`e ulasana degin, döngü her

çalistirildiginda artis miktari kadar arttiran veya azaltan bir döngü yaratir.

For sayaç = 1 To 15 Step 3

Print sayaç

Next sayaç

Çikti:

1

4

7

10

13

5.4. DIZILERI KULLANMAK

Bir kayit ( record ) degiskeni, her biri ayri ada ve veri türüne sahip olan belirli bir sayida birlesik eleman içerir. Bir

dizide ise, her eleman ayni türdedir ve elemanlar adlandirilamaz, numaralandirilirlar. Bir dizinin bir elemanina

gönderme yapmak için, dizi degiskeninin adindan sonra ayraç içinde eleman numarasini kullanirsiniz. Bir dizi

elemanini belirten sayi, indeks ( INDEX ) olarak adlandirilir. Index degerleri her zaman tamsayidir ( 0 numaradan

baslayarak. )

VB. kullanici tanimli türlerde dahil, herhangi bir veri türü için diziler yaratmaniza olanak verir. Standart dizi

tanitimi için sözdizimi:

{ Dim | Global }ad ( diziBoy ) [ As tür ]

Ayraç içindeki deger diziBoyu, dizinin boyutu olarak adlandirilir.

Bir dizi tanitimi yapmak için bir Dim bildirisi yazdiginizda, dizinin boyunu etkili bir sekilde önceden belirlemis

olursunuz; ancak sorun, dizi boyutu önceden bilinmedigi zaman çikar. Bu sorunu çözmek için VB, bir diziyi yeniden

boyutlandiran ReDim adli bir bildiri saglar. ReDim bir tanitim ( DECLERATION ) degil; programin akisi süresince

birçok kez çalistirabilen bir komuttur. ReDim kullanabilmek için, bastaki dizi tanitimindan diziBoyu degerinin

kaldirilmasi gerekir.

ReDim ( Preserve ) degisken ( diziBoy ) [ As tür ]

Preserve anahtar sözcügünün katilabilmesi ve diziBoy degerinin herhangi bir tamsayi anlatimi olabilmesi disinda, bu

sözdizimi Dim bildirisinin sözdizimine benzer. ReDim bildirisi, Preserve olmadan kullanildiginda, dizinin önceden var olan

içerikleri göz ardi edilir ve tamamiyle yeni bir dizi yaratilir. Bunun yaninda eger yeni dizinin boyutu eskisinden küçükse,

yeni boyuttan daha büyük indeksleri olan degerler korunamazlar.

5.5. KONTROL DIZILERINI KULLANMAK

VB´ te, veri degerleri içeren diziler disinda, kontrol nesneleri içeren diziler de yaratmak mümkündür. Hemen hemen

ayni islemi gerçeklestiren birçok kontrolünüz varsa, bu tür diziler kullanmak çok yararlidir. Kontrol dizileri, ayni olay

prosedürlerine sahiptir. Örnegin üç komut dügmesinden olusan bir diziye sahipseniz, hangi dügmenin tiklandigina

aldirmadan, ayni Click prosedürü çagrilir.

VB bir kontrol dizisindeki elemanlari birbirinden ayirmak için, herbirine indeks degeri atar. Özellikler penceresini

kullanarak, bu degerleri görebilirsiniz; ve bu indeks degerleri prosedüre geçirir.

6. PROSEDÜRLERI VE FONKSIYONLARI KULLANMAK

6.1. GENEL PROSEDÜRLER

Döngüler gibi prosedürlerde, programin bir bildiri grubunu birden fazla çalistirmasina olanak verir. Fakat

prosedürler, bildirileri, tekrar tekrar çalisan gruplar yerine, istediginizde çalisan gruplar içinde toplamanizi saglar.

Örnegin bir olay prosedürü, kullanici bir islem gerçeklestirildiginde; bir genel prosedür ise, uygulamanin kodu

tarafindan çagrildiginda çalisir.

VB bir prosedür adiyla karsilastiginda, programin o anda kaldigi yeri hatirlar ve adina rastladigi prosedürü

çalistirmak için harekete geçer. Prosedürü tamamlayinca, programda kaldigi yere döner ve çalismaya oradan devam

eder; bu sürece prosedür çagrisi denir.

Birinci çagri

Ikinci çagri

Prosedür

Son = 10

YazdirLoop

Son = 17

YazdirLoop

Sub YazdirLoop

Dim sayaç As Integer

For sayaç = 1 To son

Print sayaç

Next sayaç

End Sub

Ana program ve onun çagirdigi prosedür arasindaki iletisim için, genel ya da modül düzeyi degiskenleri

tanitmalisiniz. Ayrica her prosedür içinde farkli degisken adlari kullanmalisiniz; böylece bir prosedürün bir digerini

çagirmasi durumunda, kendi degiskeninin degerinin degismesi riskini önlemis olursunuz.

VB bu sorunlari, tüm prosedürlere parametreler vermenizi saglayarak çözer. Parametreler, bir prosedüre

yereldirler, ancak ilk degerlerini prosedürü çagiran kod ile alirlar. Çagiran program parçasi, prosedür adindan sonra

bir grup deger belirterek, bu degiskenlere ( parametrelere ) ilk degerlerini atar. Bu tür bir prosedür çagrisinin sözdizimi

söyledir:

isim [deger[ , deger ] ... ]

Parametrelere sahip bir prosedür tanitiminin sözdizimi söyledir:

Sub ad ( [ parametre [ As tür ] [ parametre [ As tür ]] ... ])

Bir önceki örnege yeniden göz atalim:

Birinci çagri

Ikinci çagri

Prosedür

YazdirLoop

YazdirLoop

Sub YazdirLoop ( sayaç As Integer )

Dim sayaç As Integer

For sayaç = 1 To son

Print sayaç

Next sayaç

End Sub

6.2. ISLEV PROSEDÜRLERI

Bir genel prosedür çagrisinda iletisim hatti yalnizca tek yönde çalisir; yani çagiran program parçasindan prosedüre

bazi degerler geçirilir, ancak prosedür bazi islemler gerçeklestirse de geriye bir deger döndürmez. VB´ in yerlesik

fonksiyonlarinin yaptigi gibi, çagiran program parçasina bir deger döndüren özel prosedürler, yani fonksiyon

prosedürleri ( fonksiyon ) kullanabilirsiniz.

Asagidaki sözdiziminde de görüldügü gibi, bir fonksiyon tanitiminda, fonksiyonun parametreleri ile birlikte geri

döndürecegi degerin türünü de belirtmelisiniz:

Function ad ( parametre [ As tür ] [ , parametre [ As tür ] ] ... ]

[ bildiriler ]

ad = anlatim

[ bildiriler ]

End Function

Fonksiyonlara bir örnek vermek istersek:

Function Max ( X As Integer, Y As Integer ) As Integer

If X > Y Then

Max = X

Else

Max = Y

End If

End Function

Bir islev bir degere döner, bu yüzden bir anlatim geçerli oldugu bir yerde çagrilabilir. Bu nedenle, islevin parametreleri

anlatimin diger bölümlerinden ayrilabilmeleri için ayraçlar içine alinir.

Print Max ( 11 , 10 )

kare = Max ( 5 , 13 ) * Max ( 5 , 13 )

Prosedür ( genel veya fonksiyon ) yazmak için Formun kod penceresine girip Toolbar ´dan Insert ve buradan da

Procedure seçilmesi gerekir. Önünüze gelecek olan ekrandan yazacaginiz prosedürün fonksiyon mu, özellik mi ,

prosedür mü olacagina, ayni zamanda public veye private olacagina da karar verebilirsiniz.

6.3. PARAMETRELERIN ÇALISMASI

6.3.1. REFERANS ILE GEÇIRMEK

Parametrelerden ilk sözedildiginde yerel degiskenler olarak tanitilmislardi. Ama parametreler gerçek birer yerel

degisken olsalardi, prosedürler kullanissiz olurlardi. Asagidaki örnege göz atalim : 

Sub Artir ( X As Integer )

x = x + 1

End Sub

Prosedür çagrisindaki parametre degeri x ´e atanir, prosedür bu degeri artirir ve çikarken yerel degisken x yok edilirdi.

Gerçekte x, çagiran program parçasindaki bir degere bir referanstir ve x ´teki her degisim özgün degeri degistirir. X

parametresi bir referans oldugundan, degerini saklamak için hiç bellek ayrilmaz.

6.3.2. DEGER ILE GEÇIRMEK

Parametreleri yerel degiskenler gibi kullanabilirsiniz. Eger parametre tanitimina ByVal anahtar sözcügü ile

baslarsaniz, VB parametre için yerel bellek ayirir ve karsilik gelen argümanin degerini parametreye kopyalar.

Örnek:

Sub Artir ( ByVal x As Integer ) 

x = x + 1

End Sub

Parametreleri referans ile geçirmek genelde daha verimlidir. Ancak deger ile geçirmek de size isinize yarayacak bir

yerel degisken verir. Çagiran program parçasi, geçirdigi degerin degismesini istemedigi sürece, integer, long veya single

türündeki her parametre tanitimi ByVal sözcügünü içermelidir.

6.3.3. DIZI PARAMETRELERI GEÇIRMEK

Bir dizi ( ARRAY ) parametresini, diger parametreler gibi bildirebilirseniz; yalnizca parametre tanitiminda dizi

boyutunu atlarsiniz.

Örnegin: 

Function Ortalama ( Dizi ( ) As Double,

ByVal Eleman As Integer ) As Double

Çagirirken ise:

h = Ortalama ( Dizi1 ( ) , 100 )

seklinde yazilabilir.

            Dosya içindeki baytlar  , diskte depolanma sekli :
1   2   3   4   5   6   7   8   9    10     11     12    13     14    15
(a)   e   c   h   o        o   f    f <CR> <LF>    s      e&

 

3.DEGISKENLER VE SABITLER

3.1.VB VERI TURLERINI BELIRTMEK

     VB,veri turleri(DATA TYPES) adli bir grup standart veri gosterimi tanimlar.

Veri Turleri

        Veri Turunun Adi       

        Degerlerin Erimi       

            Depolama Miktari          

               integer

    -32.768 ile 32.767 arasi  

              2 byte        

                  long

     -2.417.483.648 ile

       2.417.483.647 arasi  

              4 byte

              string

  0 ile 65.500 karakter arasi

       Her karaktere 1 byte

             currency 

 

              8 byte

                 single   

 

              4 byte

                 double

 

               8 byte

                 variant

               

 

3.2.DEGISKENLER VE SABITLER YARATMAK

       VB,bellekteki konumlara adlar vermenize olanak saglar;bu adlari kullanarak depolanmis verilere erisilebilir.Adlandirilmis bir bellek konumuna degisken(VARIABLE)denir.Bellekte depolama alani ayirmak istediginizi VB'e bildiren Dim bildirisi,asagidaki sozdizimine(syntax) sahiptir:

       Dim degisken,[As tur]

Koseli ayrac icinde gosterilen tumce istege baglidir        Dim USDolar As Currency

Eger As sozcugunu atlarsaniz,VB degiskeni variant turunde kabul eder.

       Bir  sayisal degisken icin bellek ayirdiginizda,VB degiskene ilk degerini kendi verir.Eger degiskenin belirli bir deger almasini istiyorsaniz,programinizda ona bir deger atamaniz(ASSIGN) gerekir.Bir degiskene acikca bir deger atamak, programin daha kolay okunmasini ve belirsiz degerlerden kacinmanizi saglar.

       Sabit degerler icin, VB sabit tanitimlarinda(COSTANT DECLERATIONS)bulunmanizi saglar.Bu sabitler icin icerikleri hep ayni kalan bellek yerleri ayrilir.Const bildirisi bir sabit deger tanitir ve asagidaki forma sahiptir:   

        Const ad=deger

Sabitler icin tur bildirilmesine gerek yoktur.

         Const GMH=2.54

VB TUR TANITIM KARAKTERLERI

            Tur Tanitim Karakterleri            

            Belirttigi Veri Turu          

                             %

                   integer

                              &

                      long

                               !                         

                     single

 

                      double

 

                    currency

 

                       string

3.2.1.ADLAR ICIN KURALLAR

·        Adin ilk karakteri harf olmali

·        Adin daha sonra gelen karakterleri yalnizca harf,sayi ya da alt cizgi olabilir.

·        Ad 40 karakterden fazlasini icermez.

·        Sub,Now,End gibi VB'de ozel anlam tasiyan anahtar sozcukler,ad olarak kullanilamaz.

       Gecersiz bazi bildiriler:

        Dim 2 kisi toplami As Currency

         Const PRINT=3

         Dim ilk*maas As Long

3.3.KULLANICI TANIMLI TURLER YARATMAK

          VB'te yerlesik olarak bulunan veri turleri,kolaylikla tek bir metin ya da sayisal bilesenle ifade edilebilen bilgiler(ad,boyut,sicaklik gibi)icin genellikle kullanislidir.Ancak,gruplandirilmasi gereken bilgi bilesenleriyle calisirken,bu veri turleri elverissiz olabilir.

           Kullanici tanimli bir veri turu,var olan VB turlerinin(integer,string,double v.b.)birlesiminden olusur.VB ,asagida gosterildigi gibi,Type anahtar sozcugu ile,kullanici tanimli bir tanitiminin baslangicini isaret eder.

Type personel

             ad As string

              soyad As string

              adres As string

               telefon As long

End Type

               Henuz veri icin bellekte yer ayrilmadi,yalnizca verinin yapisini VB bildirildi.Yeni turu yukaridaki gibi tanimladiktan sonra,her zaman ki gibi degiskenler yaratabilirsiniz.

                Dim Muhper As personel

                Dim Emekliper As personel

                 Cogu programlama dilinde ,birden cok bilesen iceren degiskenlere kayit(RECORD)adi verilir ve kaydin her ayri bilesenine eleman(ELEMENT)denir.Yalnizca bir tek bilesene gonderme yapmak istediginizde,degisken adinin ardindan bir nokta(.) ve bilesenin adini kullanabilirsiniz.

                  Muhper.telefon=3225555

                   Kullanisli olmanin yaninda,ayni zamanda programlarinizin daha kolay okunmasini ve gereksinmelerinize en iyi sekilde yanit bulmanizi saglarlar.

3.4.YEREL VE MODUL DUZEYI DEGISKENLERI

        Bir degiskenin etkinlik alani(SCOPE),degiskene hangi prosedurlerin erisimi olacagini belirler.Her biri yalnizca kendi ozel proseduru icinde erisilebilir olanlar yerel degiskenler (LOCAL VARIABLES)olarak adlandirilir.Formun genel tanitimlar bolumunde bir single degiskeni tanitirsak,modul duzeyi degiskeni(MODULE-LEVEL VARIABLE)yaratmis oluruz.Bu sekilde tanitilan degiskenler,formdaki her prosedure erisebilirler.Modul(MODULE) oncelikli dosya anlamina gelir,cunku bir forma ait tum kodlar tek bir dosyada tutulur.

         Bir degiskenin etkinlik alanini sinirlamak yararlidir, cuunku degisken adlarini baska yerlerde kullanmamiza olanak verir.Yerel etkinlik alani, prosedurlerin ayri birer birim olmasina olanak saglar, yani programin diger kisimlarinda yapilan degisiklikler belirli bir prosedurun isleyisini etkilemez.

3.5.GENEL DEGISKENLER             

        Modul duzeyi degiskenleri yalnizca bir form icinde gorulebilir.Eger birden cok formu olan bir program yazarsaniz, formlar arasindaki bilgiyi paylasmak icin bir yol bulmaniz gerekir.VB etkinlik alaninin bir ucuncu duzeyini genel degiskenleri(GLOBAL VARIABLES) SUNAR.Genel degiskenler kod modullerinde tanitilir ve programin herhangi bir bolumunden erisebilirler.

         Genel degiskenler yaratmak icin Dim yerine Global anahtar sozcugu kullanilir.

          Global degisken[As tur]

          Etkinlik alani kurallari sabitler icin de gecerlidir.Const bildirisiyle tanimlanan sabitlere, onlari bir prosedurde mi yoksa bir modulde mi tanimladiginiza bagli olarak, yerel ya da modul-duzeyi etkinlik alani verilir.Genel sabitler yaratmak icin Const bildirisine Global anahtar sozcugu ile baslariz:

           Global Const Pi=3.14

Genel sabitler ve degiskenler, bir form icinde tanitilamazlar.

3.6.KOD MODULLERI

       Dosyalari BAS uzantisina sahip olan kod modulleri,VB'in File menusunden New Module komutunu verdigimizde,ya da Toolbar uzerindeki New Module dugmesine tikladiginizda yaratilirlar.Koddan baska bir sey icermeyen uygulama dosyalaridir.Bir kod modulundeki genel tanitimlar, programin tamami tarafindan paylasilabilirler.          

4.BILDIRILER.,ANLATIMLAR VE PROSEDURLER

      VB dilinde bir bildiri(STATEMENT),Turkce'deki bir tumcenin dengidir: yani bir bilgisayara verilen anlamli bir komutu belirtir.Bildiriler icinde, degerleri ve islecleri bir araya getirerek anlatimlar(EXPRESSIONS) yaratabilirsiniz.

4.1.ATAMA BILDIRILERI

       Bir programdaki en basit ve en cok kullanilan bildiri,atama(ASSIGNEMENT) bildirisidir.Bu, bir degisken adi ardindan atama operatoru(=), ardindan da bir anlatim icerir.

        baszaman=Now

         net=brut-gider

          Atama bildirileri bilgi depolamak icin kullanilir.Atama operatorunun saginda bulunan anlatimin degeri hesaplanir ve sonuc,operatorun solundaki degiskende depolanir.Degiskenin veri turu,hesaplanan anlatim degerine uygun olmalidir.Eger veri turleri birbirine benzerse,, ancak ayni degilse(ornegin, bir tamsayi degerini bir floating point degiskende saklamak istersek),VB anlatimin sonucunu degiskenin turune donusturur.

4.2.ANLATIMLAR VE OPERATORLER

       Anlatimlar genellikle gerceklestirilecek hesaplamalari gosterirler, ancak tek bir sabitten olusacak kadar basit olabilirler.Bir operator(OPERATOR),genellikle hesaplamanin turunu belirtir.VB aritmetik operatorlerden baska string birlestirme operatoru, karsilastirma ve mantiksal operatorler saglar.

        Anlatimlar kendi baslarina gecerli bildiriler degillerdir, cunku tam degillerdir.Anlatim:

         .Bir degismez deger,bir anlatimdir.

          .Sirasiyla bir anlatim, bir islec ve baska bir anlatimdan olusan birlesim yine bir anlatimdir. 

Bu kurallara gore, 1 ya da 3 birer anlatimdir,3+1'de bir anlatimdir.

4.2.1.ANLATIM TURLERI

        Bir anlatimin turu , operandlarin turu tarafindan saptanir.Bir sabit icin anlatimin turu, sabitin turu ile aynidir.Bir operator iceren bir anlatimda, VB sonucun turunu saptamak icin operandlarin her ikisinin turunu de kullanir.Eger iki farkli turu karistirirsak,VB genellikle sonucu en genis erime sahip olan ture ayarlar.

        Anlatimlar, operatorlerin ve sabitlerin yaninda, degiskenler ve sabitlerin yaninda, degiskenler ve ayraclar da icerir.Ayrac icindeki alt anlatimlar her zaman ilk once hesaplanir.

4.2.2.ARITMETIK OPERATORLER

Operator

Islem

+

Toplama

-

Cikarma

*

Carpma

^

Us Alma

/

Hareketli-nokta bolme

\

Tamsayi bolme

Mod

Mod

4.2.3.STRING BIRLESTIRME OPERATORU

      Bir anlatimdaki operandlar string degerleri oldugunda, (+) operatoru dizilimleri ard arda birlestirir.Ard arda birlestirme operatorunu, iki ya da daha fazla stringi birlestirmek icin kullanabiliriz.Birlestirme sonucunda tamamiyla yeni bir string elde edilir: isleme giren operandlarin degerlerinde herhangi bir degisiklik olmaz.

4.2.4.KARSILASTIRMA OPERATORLERI

      Iki deger karsilastirildiginda islemin sonucu bir mantiksal degerdir; yani True ya da False olabilir.

Operator

Islem

>

       Buyuktur

<

       Kucuktur

>=

Buyuk ya da esittir

<=

Kucuk ya da esittir

=

        Esittir

<>

      Esit degildir 

4.2.5.MANTIKSAL OPERATORLER

      Bu operatorler, operandlar olarak mantiksal degerlere sahiptir ve mantiksal sonuclar verirler.

     Operator      

      Islem       

          Not

         Degil  

          And

            Ve

           Or

           Veya      

          Xor

     Exclusive or 

           Eqv

         Denktir

           Imp

      Gerektirme

4.2.6.ONCELIKLER

     VB, ilk once hangi islemin yapilmasi gerektigini belirlemek icin operator onceligi adi verilen bir dizi kural kullanir.Mantiksal operatorlerin tumu karsilastirma operatorlerinden daha alt oncelige sahiptir.

             Operator             

                     Islem               

                    ^

                   Us alma  

                    *

       Carpma,Hareketli-nokta bolme      

                     \  

              Tamsayi bolme 

                   Mod

                       Mod

                   + -

            Toplama , cikarma

             > < > = < = = < >      

                 Karsilastirma         

                   Not

                       Degil

                    And

                          Ve

                     Or

                        Veya

                     Xor

                  Exclusive or

                     Eqv

                     Denktir

                      Imp

                   Gerektirme

4.3.PROSEDURLER

     Bir prosedur, ozel bir hizmeti gerceklestiren bir komutlar kumesidir: mesela MsgBox proseduru.Deger donduren VB prosedurleri fonksiyonlar olarak adlandirilirlar; ornegin InputBox fonksiyonu.

     Bir proseduru kullanmak (cagirmak)icin, ilk ogesi prosedurun adi olan bir bildiri yazarsiniz.  

P>4.2.5. MANTIKSAL OPERATÖRLER

Bu operatorler, operandlar olarak mantiksal degerlere sahiptir ve mantiksal sonuçlar verirler.

Operator

Islem

Not

Degil

And

Ve

Or

Veya

Xor

Exclusive or

Eqv

Denktir

Imp

Gerektirme

4.2.6. ÖNCELIKLER

VB ilk önce hangi islemin yapilmasi gerektigini belirlemek için operatör önceligi adi verilen bir dizi kural kullanir.

Mantiksal operatörlerin tümü karsilastirma operatörlerinden daha alt öncelige sahiptir.

Operatör

Islem

^

Üs alma

* /

Çarpma, Hareketli-nokta bölme

\

Tamsayili bölme

Mod

Mod

+ -

Toplama, çikartma

> < > = <= = < >

Karsilastirma

Not

Degil

And

Ve

Or

Veya

Xor

Exclusive or

Eqv

Denktir

Imp

Gerektirme

4.3 PROSEDÜRLER

Bir prosedür, özel bir hizmeti gerçeklestiren bir komutlar kümesidir; mesela MsgBox prosedürü. Deger döndüren

VB prosedürleri fonksiyonlar olarak adlandirilirlar: örnegin InputBox fonksiyonu.

Bir prosedürü kullanmak (çagirmak) için, ilk ögesi prosedürün adi olan bir bildiri yazarsiniz. Bir prosedür

çagrisi, eksiksiz bir VB bildirisidir ve prosedür sizden baska bir bilgi istemeyebilir. Eger prosedürün bazi bilgilere

gereksinimi varsa, prosedüre göndermek istediginiz degerleri, aralarina virgüller koyarak girmelisiniz. Bir prosedüre ya da

fonksiyona bu sekilde ´´geçirdiginiz´´ degerlere onun argümanlari olarak adlandirilir. Prosedür çagrilarina örnekler:

MsgBox ´´ 4. Bölüm ``

Beep

Bir fonksiyon bir degere dönüstügü için, fonksiyonlar bir anlatimin söz konusu oldugu her yerde kullanilabilir.

Ancak anlatimlar kendi baslarina geçerli bildiriler degildirler. Bundan dolayi, bir fonksiyon çagrisi her zaman bir diger

bildirinin baglaminda, en siklikla da bir atama bildirisinin baglaminda bulunur. Asagida bazi geçerli fonksiyon

çagrilari gösterilmektedir:

Sin (x) ^ 2

Format ( Now, ´´hh : mm)

Son zamanlarda nesneye yönelik programlama dillerinin tasarimcilari, metod adi verilen, prosedür ve

fonksiyonlarin özel bir türünü sundular. VB, tam olarak nesneye yönelik olmamasina karsin, formlar ve komut

dügmeleri gibi nesnelerin her biri için metodlar içerir. Metodlar da prosedürler ve fonksiyonlar gibi çalisirlar, ancak

özellikler ( properties ) ve alan adlari (fieldnames) gibi belirli nesnelerin bilesenleridir.

5 PROGRAM KONTROLÜ

5.1. IF BILDIRISI

If bildirisinin klasik formu, iki seçenek arasindan bir seçim belirtir. Program kodunuzda if bildirisini kullanarak

kosula bagli dallanma olarak bilinen durumu saglariz.

If mantiksal anlatim Then

[bildiri]

[Else

[bildiri] ... ]

End If

If bildirisi bilesik bir bildiridir, yani tek bir birim olarak degerlendirilir. Asagidaki kod parçalari birbirine denktir:

If response = ´´ Korku ``

Print ´´ Korkak ``

Else

End If

If response = ´´ Korku ``

Print ´´ Korkak ``

End If

Ikinci if bildirisi, tümüyle birincisi içinde yer alan bir bildiridir. VB, bir Else paragrafini, baska bir If bildirisinin

islevselligi ile birlestiren ElseIf adli bir bildiri de sunar. Asagida her iki bildiri için örnek verilmistir:

If takim = ´´ cimbom``

Then

çikti = ´´ sampiyon ``

Else

If takim = ´´ fener´´

Then

çikti = ´´ ali

sen``

Else

çikti =

´´ karadeniz

firtinasi ``

End If

End If

If takim = ´´ cimbom `` Then

çikti = ´´ sampiyon ``

ElseIf takim = ´´ fener `` Then

çikti = ´´ ali sen ``

Else

çikti = 

´´ karadeniz firtinasi ``

End If

ElseIf paragrafi birçok kez tekrarlanabilir.

5.2. DO LOOP BILDIRISI

VB Do bildirisi, bir grup bildiriyi tekrar tekrar isleyebilir; bu bildiri için söz dizimi ise:

Do

[bildiri] ...

Loop

Do anahtar sözcügü, Loop anahtar sözcügüne kadar olan tüm bildirileri içeren bir bilesik bildirinin baslangicini isaret eder.

Döngülerin basina veya sonuna While veya Until anahtar sözcükleri ile testler ( kontroller ) eklenebilir. Bu anahtar

sözcüklerin sonuna bir kosul gelmelidir. Kosul döngünün basinda ve False ( saglanamama durumu ) halinde program

döngüye girmeyecektir. Oysa kosul döngü sonunda ve kosul False olsa dahi döngü bir kez gerçeklestirilecektir.

Döngü basinda test

Döngü sonunda test

Do { While | Until } anlatim

[ bildiri ] ...

Loop

Do

[ bildiri ] ...

Loop { While | Until } anlatim

Örnek olarak:

Do

Parola = InputBox ( ´´PAROLA`` )

Loop While Parola < > ´´ Serkan ``

sayaç = 1

Do While sayaç < = 25

Print sayaç

sayaç = sayaç + 1

Loop

Do

Parola = InputBox ( ´´PAROLA`` )

Loop Until Parola = ´´ Serkan ``

sayaç = 1

Do Until sayaç > 25

Print sayaç

sayaç = sayaç + 1

Loop

5.3. FOR DÖNGÜLERI

VB ´deki For bildirisi asagidaki sözdizimine sahiptir:

For degisken = ilkdeger To sondeger [ Step artis ]

[bildirisi] ...

Next degisken

For bildirisi içindeki sayaç degiskenini ilkdeger ile baslatip, sondeger`e ulasana degin, döngü her

çalistirildiginda artis miktari kadar arttiran veya azaltan bir döngü yaratir.

For sayaç = 1 To 15 Step 3

Print sayaç

Next sayaç

Çikti:

1

4

7

10

13

5.4. DIZILERI KULLANMAK

Bir kayit ( record ) degiskeni, her biri ayri ada ve veri türüne sahip olan belirli bir sayida birlesik eleman içerir. Bir

dizide ise, her eleman ayni türdedir ve elemanlar adlandirilamaz, numaralandirilirlar. Bir dizinin bir elemanina

gönderme yapmak için, dizi degiskeninin adindan sonra ayraç içinde eleman numarasini kullanirsiniz. Bir dizi

elemanini belirten sayi, indeks ( INDEX ) olarak adlandirilir. Index degerleri her zaman tamsayidir ( 0 numaradan

baslayarak. )

VB. kullanici tanimli türlerde dahil, herhangi bir veri türü için diziler yaratmaniza olanak verir. Standart dizi

tanitimi için sözdizimi:

{ Dim | Global }ad ( diziBoy ) [ As tür ]

Ayraç içindeki deger diziBoyu, dizinin boyutu olarak adlandirilir.

Bir dizi tanitimi yapmak için bir Dim bildirisi yazdiginizda, dizinin boyunu etkili bir sekilde önceden belirlemis

olursunuz; ancak sorun, dizi boyutu önceden bilinmedigi zaman çikar. Bu sorunu çözmek için VB, bir diziyi yeniden

boyutlandiran ReDim adli bir bildiri saglar. ReDim bir tanitim ( DECLERATION ) degil; programin akisi süresince

birçok kez çalistirabilen bir komuttur. ReDim kullanabilmek için, bastaki dizi tanitimindan diziBoyu degerinin

kaldirilmasi gerekir.

ReDim ( Preserve ) degisken ( diziBoy ) [ As tür ]

Preserve anahtar sözcügünün katilabilmesi ve diziBoy degerinin herhangi bir tamsayi anlatimi olabilmesi disinda, bu

sözdizimi Dim bildirisinin sözdizimine benzer. ReDim bildirisi, Preserve olmadan kullanildiginda, dizinin önceden var olan

içerikleri göz ardi edilir ve tamamiyle yeni bir dizi yaratilir. Bunun yaninda eger yeni dizinin boyutu eskisinden küçükse,

yeni boyuttan daha büyük indeksleri olan degerler korunamazlar.

5.5. KONTROL DIZILERINI KULLANMAK

VB´ te, veri degerleri içeren diziler disinda, kontrol nesneleri içeren diziler de yaratmak mümkündür. Hemen hemen

ayni islemi gerçeklestiren birçok kontrolünüz varsa, bu tür diziler kullanmak çok yararlidir. Kontrol dizileri, ayni olay

prosedürlerine sahiptir. Örnegin üç komut dügmesinden olusan bir diziye sahipseniz, hangi dügmenin tiklandigina

aldirmadan, ayni Click prosedürü çagrilir.

VB bir kontrol dizisindeki elemanlari birbirinden ayirmak için, herbirine indeks degeri atar. Özellikler penceresini

kullanarak, bu degerleri görebilirsiniz; ve bu indeks degerleri prosedüre geçirir.

6. PROSEDÜRLERI VE FONKSIYONLARI KULLANMAK

6.1. GENEL PROSEDÜRLER

Döngüler gibi prosedürlerde, programin bir bildiri grubunu birden fazla çalistirmasina olanak verir. Fakat

prosedürler, bildirileri, tekrar tekrar çalisan gruplar yerine, istediginizde çalisan gruplar içinde toplamanizi saglar.

Örnegin bir olay prosedürü, kullanici bir islem gerçeklestirildiginde; bir genel prosedür ise, uygulamanin kodu

tarafindan çagrildiginda çalisir.

VB bir prosedür adiyla karsilastiginda, programin o anda kaldigi yeri hatirlar ve adina rastladigi prosedürü

çalistirmak için harekete geçer. Prosedürü tamamlayinca, programda kaldigi yere döner ve çalismaya oradan devam

eder; bu sürece prosedür çagrisi denir.

Birinci çagri

Ikinci çagri

Prosedür

Son = 10

YazdirLoop

Son = 17

YazdirLoop

Sub YazdirLoop

Dim sayaç As Integer

For sayaç = 1 To son

Print sayaç

Next sayaç

End Sub

Ana program ve onun çagirdigi prosedür arasindaki iletisim için, genel ya da modül düzeyi degiskenleri

tanitmalisiniz. Ayrica her prosedür içinde farkli degisken adlari kullanmalisiniz; böylece bir prosedürün bir digerini

çagirmasi durumunda, kendi degiskeninin degerinin degismesi riskini önlemis olursunuz.

VB bu sorunlari, tüm prosedürlere parametreler vermenizi saglayarak çözer. Parametreler, bir prosedüre

yereldirler, ancak ilk degerlerini prosedürü çagiran kod ile alirlar. Çagiran program parçasi, prosedür adindan sonra

bir grup deger belirterek, bu degiskenlere ( parametrelere ) ilk degerlerini atar. Bu tür bir prosedür çagrisinin sözdizimi

söyledir:

isim [deger[ , deger ] ... ]

Parametrelere sahip bir prosedür tanitiminin sözdizimi söyledir:

Sub ad ( [ parametre [ As tür ] [ parametre [ As tür ]] ... ])

Bir önceki örnege yeniden göz atalim:

Birinci çagri

Ikinci çagri

Prosedür

YazdirLoop

YazdirLoop

Sub YazdirLoop ( sayaç As Integer )

Dim sayaç As Integer

For sayaç = 1 To son

Print sayaç

Next sayaç

End Sub

6.2. ISLEV PROSEDÜRLERI

Bir genel prosedür çagrisinda iletisim hatti yalnizca tek yönde çalisir; yani çagiran program parçasindan prosedüre

bazi degerler geçirilir, ancak prosedür bazi islemler gerçeklestirse de geriye bir deger döndürmez. VB´ in yerlesik

fonksiyonlarinin yaptigi gibi, çagiran program parçasina bir deger döndüren özel prosedürler, yani fonksiyon

prosedürleri ( fonksiyon ) kullanabilirsiniz.

Asagidaki sözdiziminde de görüldügü gibi, bir fonksiyon tanitiminda, fonksiyonun parametreleri ile birlikte geri

döndürecegi degerin türünü de belirtmelisiniz:

Function ad ( parametre [ As tür ] [ , parametre [ As tür ] ] ... ]

[ bildiriler ]

ad = anlatim

[ bildiriler ]

End Function

Fonksiyonlara bir örnek vermek istersek:

Function Max ( X As Integer, Y As Integer ) As Integer

If X > Y Then

Max = X

Else

Max = Y

End If

End Function

Bir islev bir degere döner, bu yüzden bir anlatim geçerli oldugu bir yerde çagrilabilir. Bu nedenle, islevin parametreleri

anlatimin diger bölümlerinden ayrilabilmeleri için ayraçlar içine alinir.

Print Max ( 11 , 10 )

kare = Max ( 5 , 13 ) * Max ( 5 , 13 )

Prosedür ( genel veya fonksiyon ) yazmak için Formun kod penceresine girip Toolbar ´dan Insert ve buradan da

Procedure seçilmesi gerekir. Önünüze gelecek olan ekrandan yazacaginiz prosedürün fonksiyon mu, özellik mi ,

prosedür mü olacagina, ayni zamanda public veye private olacagina da karar verebilirsiniz.

6.3. PARAMETRELERIN ÇALISMASI

6.3.1. REFERANS ILE GEÇIRMEK

Parametrelerden ilk sözedildiginde yerel degiskenler olarak tanitilmislardi. Ama parametreler gerçek birer yerel

degisken olsalardi, prosedürler kullanissiz olurlardi. Asagidaki örnege göz atalim : 

Sub Artir ( X As Integer )

x = x + 1

End Sub

Prosedür çagrisindaki parametre degeri x ´e atanir, prosedür bu degeri artirir ve çikarken yerel degisken x yok edilirdi.

Gerçekte x, çagiran program parçasindaki bir degere bir referanstir ve x ´teki her degisim özgün degeri degistirir. X

parametresi bir referans oldugundan, degerini saklamak için hiç bellek ayrilmaz.

6.3.2. DEGER ILE GEÇIRMEK

Parametreleri yerel degiskenler gibi kullanabilirsiniz. Eger parametre tanitimina ByVal anahtar sözcügü ile

baslarsaniz, VB parametre için yerel bellek ayirir ve karsilik gelen argümanin degerini parametreye kopyalar.

Örnek:

Sub Artir ( ByVal x As Integer ) 

x = x + 1

End Sub

Parametreleri referans ile geçirmek genelde daha verimlidir. Ancak deger ile geçirmek de size isinize yarayacak bir

yerel degisken verir. Çagiran program parçasi, geçirdigi degerin degismesini istemedigi sürece, integer, long veya single

türündeki her parametre tanitimi ByVal sözcügünü içermelidir.

6.3.3. DIZI PARAMETRELERI GEÇIRMEK

Bir dizi ( ARRAY ) parametresini, diger parametreler gibi bildirebilirseniz; yalnizca parametre tanitiminda dizi

boyutunu atlarsiniz.

Örnegin: 

Function Ortalama ( Dizi ( ) As Double,

ByVal Eleman As Integer ) As Double

Çagirirken ise:

h = Ortalama ( Dizi1 ( ) , 100 )

seklinde yazilabilir.

            Dosya içindeki baytlar  , diskte depolanma sekli :
1   2   3   4   5   6   7   8   9    10     11     12    13     14    15
(a)   e   c   h   o        o   f    f <CR> <LF>    s      e&

7.3.1.   ARDISIK  DOSYALARI  AÇMAK  VE  KAPAMAK
 
          Open bildirisi ,VB ' e hangi dosyaya erisim yapacaðýný söyler ;

          Open dosya adý For  { Input  |  Output  }  As #  dosya no

          Giris için Input , çýkýs için ise Output anahtar sözcüðü kullanýlýr .
Örnekler :

           Open  " C:\CONFIG.SYS "  For Input As  #1

           Open  " SEKO.TXT "  For Output As  #4

Dosyayý çýkýs için açýyorsanýz  , dosya diskte olmasa bile yaratýlýr . Dosya   ka -
patmakta kullanýlan Close bildirisi asaðýdaki sözdizimine sahiptir :

            Close #dosyano

7.3.2.  ARDISIK  DOSYALARDAN  OKUMA  YAPMAK

            Line Input # bildirisi , metnin her satýrýný okumak için yeterlidir .Bildiri -
 nin sözdiziminde görüldüðü gibi , okuyacaðýnýz dosyanýn numarasýný belirtirsiniz .
 Ayrýca okunan satýrý tutacak olan string türünde bir parametre saðlayabilirsiniz :

             Line Input  #dosya no , stringdeðiskeni

 EOF islevi , bir dosyada verilerin sonuna gelindiðini anlamamýzý saðlar . Argü -
man olarak  bir  dosya numarasý alýr  ve  dosyadaki  tüm  veriler okunduðunda .
True deðerine dönüsür .

7.3.3.  ARDISIK  DOSYALARA  YAZMAK

              Print bildirisi kullanýlýr ; sözdizimi :

              Print  #dosya no  [, anlatým [ {,|;} anlatým ] ... ] [ {,|;}]
 
Eðer anlatýmlar arasýnda noktalý virgüller kullanýlýrsa , bu anlatýmlarýn deðerleri ,
aralarýnda bosluk býrakmadan dosyaya yazýlýr , ancak virgüllerle ayrýlmýs anla-
týmlarýn deðerleri , 14 karakter uzunluðunda olan ayrý yazdýrma alanlarýna yazý-
lýr . Print # bildirisindeki son karakter , bir virgül yada noktalý virgül deðilse ,
çýktýya . satýr basý / yeni satýr (CARRIAGE RETURN / LINE FEED ) karak-
terleri eklenir .

7.4. RASTGELE  ERÝSÝMLÝ  DOSYALAR

        Verilerimizi metin olarak depolamak yerine , programda sahip olduðu
 yapýda depolamak tercih edilir ; integer veri türleri integer olarak .

7.4.1  RASTGELE  ERÝSÝMLÝ  DOSYALARI  AÇMAK
         VE  KAPATMAK

           Rastgele erisimli dosyalar için Open bildirisinin sözdizimi söyledir :

         Open dosya adý For Random As dosya no Len = kayýt uzunluðu

Open bildirisinin bu versiyonunda , her defasýnda kaç baytlýk veri okuyacaðýnýz
ya da yazacaðýnýzý bildiren bir kayýt uzunluðu bildirmelisiniz . Dosyadan okuma
ve dosyaya yazma islemlerini gerçeklestiren Get ve Put bildirileri , her islemlerin-
de bu kayýt uzunluðunu kullanýrlar .
          Kapatmak için ise Close bildirisi kullanýlýr .

7.4.2.  RASTGELE  ERÝSÝMLÝ  DOSYALARDAN  OKUMAK
          VE  YAZMAK

          Rastgele erisimli dosyalardan veri okumak ve onlara veri yazmak için ,
 Get ve Put bildirileri kullanýlýr . Her iki bildiri için de , sözdizimi asaðýdaki gi-
 bidir :

          Get #dosya no , [ kayýt sayýsý ] , deðisken
           Put #dosya no , [ kayýt sayýsý ] , deðisken

 Get bildirisi , dosyadan okuduðu verileri belirtilen deðisken içine depolarken .
 Put bildirisi , belirtilen deðiskenin içeriðini dosyaya yazar .

8.   VB  FORMLARI  VE  ARAÇLARI

          Bu bölümde  , VB ' de uygulamalar yaratmak için kullanýlacak , toolbox
 içindeki çesitli araçlarla olusturulan nesnelerin çoðunu ve formlarý açýklayacaðýz ;
 deðistirilebilen özelliklerin bir kýsmýna bakacaðýz ; ayrýca nesneler üzerinde bir
 islem yapýldýðýnda tetiklenen olaylarý ve her nesne türü için geçerli olan metod
 ve prosedürlerin bazýlarýný inceleyeceðiz .
 
 
 

        FORMLAR :

          Üzerine uygulamanýn görünümü çizilen kâðýtlar gibidir ; her bir form ,
 çalýsýlan uygulamadaki bir pencereye karsýlýk gelir .

        Özellikler  :
          Uygulamayý tasarlarken Properties penceresi kullanýlarak , ya daa program
 çalýsýrken , yazdýðýnýz program kodu tarafýndan belirlenebilir .
       BorderStyle  :  Yalnýzca tasarým sýrasýnda belirlenebilir ; çalýsma anýnda pen-
 cere görünümünü deðistirir :
 0 - None                      Pencerenin s&yac

 9.   VERI  TABANLARI

                Ýyi tanýmlanmýs bir yapý içinde depolanan , birbiriyle iliskili bilgiler top-
 luluðuna veri tabani denir . Veri tabaninin , konu hakkindaki deðisik bilgi alan-
 larini  listeleyen sütunlari ve tek bir elemanin bütün niteliklerini gösteren satir-
 lari vardir . Her bir satir , bir kayit ( RECORD ) olarak adlandirlir . Tablo ( TABLE )
 ise , ayni yapiya sahip kayitlar topluluðuna verilen addir .
                VB 'de veri erisimi uygulamada bir Data kontrolü yaratilarak yapilabilir .
 

Data kontrolünün , VB uygulamasi ve erisilmek istenen veri tabani a-
 rasindaki baðlantiyi belirleyen birçok  özelliði vardir . Her data kontrolü , bir an-
 da yalnizca bir kayda erisim saðlayabilir . Bu kayda onun geçerli kaydi denir .
 Data kontrolünün bazi özelliklerini kisaca açi;klarsak :
 Connect  : Verinin hangi biçin ( FORMAT ) altinda depolandiði;dir . Örneðin .
 Ms Access  , Foxpro , Paradox , Dbase 4 .
 DatabaseName  : Kullanilacak veri tabani dosyasini belirtir .
 RecordSourge :  Verinin nereden alinacaði;ni belirtir .

                         Check Box , Image , Label , Picture Box ve Text Box kontrolleri . Data
 kontrolünün erisimde bulunduðu  tablonun bilgi alanlarina  doðrudan baðlanabilirler . Bu
 kontrollerin herbirinde , DataSource özelliði , bir Data kontrolüne bað  kurarken , Data-
 Field özelliði , tablodaki hangi bilgi alanina baðlanti yapilacaði;ni  belirler .
                          Kayit kümesi ( RECORDSET ) , erisim yapilmak üzere seçilmis kayitlar
 anlamina gelir . Data kontrolünün RecorSourge  özelliði ile tanimlanir .
                          Bir kayit seçme islemi için , Data kontrolünü kullanmak disinda , birçok
 programlama yöntemi de kullanabilirsiniz . Bunun için , Data kontrolünün Visible özelli-
 ðini False yaparak , tüm veri islemlerini program kontrolü altinda gerçeklestirebilirsiniz.
 Data kontrolü üzerinde asaði;daki metodlar etkilidir .
 Refresh  : Veri tabani kullanim için açi;lir , zaten açi;k ise kapatilir .
 MoveFirst : Kayit kümesindeki birinci kayit , geçerli kayit yapilir .
 MoveLast  : Kayit kümesindeki son kayit , geçerli kayit yapilir .
 MoveNext :  Kayit kümesindeki bir sonraki kayit geçerli kayit yapilir.
 MovePrevious : Kayit kümesindeki bir önceki kayit geçerli kayit yapilir .
 AddNew  : Kayit  kümesine yeni bir kayit eklenir .

 

Bölüm 1 : QuickBasic'e Giriş

Bu kurs sizin bir QuickBasic derleyicisine ve editörüne sahip olduğunuzu varsaymıştır. Burada anlatılacak olanlar QuickBasic v4.5 'a göredir. QuickBasic'in daha kısılmış bir sürümü olan QBASIC v1.1 MS-DOS un son sürümlerinde beraber kurulmaktaydı. Sisteminizde DOS yüklü değilse QBASIC.EXE olmayabilir.
Windows 95 CD nizdeki
\OTHER\OLDMSDOS\ klasörünüze açıp QBASIC.EXE yi C:\WINDOWS\COMMAND\ klasörünüze kopyalayın. Qbasic'in, QuickBasic den kısılmış olan en önemli özelliği dosyayı derleyip EXE haline getirememesidir.
Win95 CD niz yoksa ftpsearch.lycos.com , www.yahoo.com , www.altavista.com gibi arama sitelerine bağlanıp
qbasic.exe yi aratıp bulun ve sisteminize kopyalayın.
NOT: Bu kursda QuickBasic kelimesi yerine kısaca Qbasic kullanılacaktır.
Ayrıca, QuickBasic' i nerde bulacağınız hakkında bana soru sormayın.

BASIC nedir?

BASIC kelimesi Beginners All-Purpose Symbolic Instruction Code kelimelerinin baş harflerinden oluşmuş bir kelimedir. Genel amaçlı yeni başlayanlar için bir programlama dilidir. Öğrenmesi kolay, yüksek seviyeli bir dildir. Basic kodları bir derleyici ile çalıştırılabilir(.EXE) ye dönüştürülebilir.

QuickBasic editörünün kullanımı

QuickBasic paketini bilgisayarınıza kurduğunuzda ; dos komut satırında

QB

yazıp ENTER'e bastığınızda karşınıza basic programınızı yazmanız için bir editör proramı yükler. Dos un EDIT ine benzer özelliklere sahiptir. Basic programınız yazdıktan sonra F5 tuşu ile çalıştırabilirsiniz. Programın çalışması bitince herhangi bir tuşa basarak, program hala çalışıyorsa CTRL-PAUSE tuşlarına basarak programın çalışmasını durdurup editöre dönebilirsiniz.
Not: QBASIC kullananlar komut satırında QBASIC yazarak çalıştıracaklar.

UYGULAMA:
dos komut satırında qb yazıp enter tuşuna basarak qbasic editörünü çalıştırın. Aşağıdaki resimde olduğu gibi editöre yazın.

Klavyeden F5 tuşuna basarak yazdığımız basic kodunun çalışmasını sağlayın. Bir problemle karşılaşmazsanız ekranındaki yazılar temizlenecek ve ekranın ilk satırında
yazacak. Editör ekranına dönmek için herhangi bir tuşa basın.
Not: ' (ayırma) işaretinden sonra yazılanlar açıklama içindir, yazılmasa da olur.

Qbasicde satır numaraları

Satır numaraları gereksizdir. Ama kullanabilirsiniz de. Kullanırsanız; numaraların birbirini takip etmesi şart değildir. QBasicde satır numaraları yerine okunurluğu kolaylaştırması için ETİKET kullanılır. Etiketi de sadece GOTO veya GOSUB ile gidilecek satırlara koymak yeterlidir.

10 A = A + 1
20 IF A > 20 THEN GOTO 50
30 PRINT A
40 GOTO 10
50 END

Yukardaki program kodları yerine; aynı işi yapan, satır numarası vermeden, etiket kullanarak yazılmış hali aşağıda.

basla:
A = A + 1
IF A > 20 THEN GOTO bitis
PRINT A
GOTO basla
bitis:
END

Bir satırda birden fazla komut da kullanılabilir. İki komutu ayırmak için : (2 nokta üstüste) kullanılır

CLS
PRINT "QBASIC"
PRINT "MERHABA DÜNYA !"

Üstteki ile alttaki kodlar aynı işi yapar. Farkı yoktur.

CLS : PRINT "QBASIC" : PRINT "MERHABA DÜNYA !"
PRINT yerine ? (soru işareti)
? "Merhaba Dünya !"
PRINT "Merhaba Dünya !"

Yukardaki iki satır aynı işi yapar. Yazarken ? işareti PRINT komutuna dönüşür. Bundan sonra eminim ki ? işaretini PRINT e tercih edeceksiniz.

Qbasicde yardım almak

QBasic in menülerinde HELP var. Fareyle tıkladığınızda bir yardım ekranı karşınıza gelecek. Ayrıca komutları yazdığımız bölümdeki kelimelerden faydalanarak da yardım alabiliriz. Örneğin OPEN yazın imleç(yanıp sönen gösterge) kelime üzerindeyken klavyeden F1 tuşuna bastığınızda OPEN komutu hakkında yardım ekranı gelir karşınıza. Burada Kısa açıklama, Detaylı açıklama, Örnek programı görebilirsiniz. Tabii burada yardım bilgileri Türkçe değil, İngilizce.

Bölüm 2: Qbasicde Veri Tipleri

Qbasicde INTEGER, SINGLE, DOUBLE gibi veri tipleri vardır. Veriler belleğe saklanmadan önce bellekde ne kadar yer kaplayacağını belirtmek için kullanılır. Değişkenin içeriği ancak bu şekilde bellekde düzenli bir şekilde yerleşir. Örnek

A% = 126

A değişkeniin yanındaki % işareti değişkenin bir INTEGER veri tipine sahip olduğunu gösteriri. Ona aktarılan bilgi bellekde 2 karakterlik yer kaplar.

Değişkenlerin veri tipini tanımlamak şart değildir. O zaman tanımlanmamış değişkenler basic tarafından SINGLE olarak kabul edilir.

Qbasicde Veri Tipleri

Qbasic diğer dillerdeki gibi tüm veri tiplerini kullanmanıza imkan vermez, fakat genellikle diğerlerine ihtiyaç duymayacaksınız. Qbasic ile kullanabileceğiniz veri tipleri INTEGER, LONG, SINGLE, DOUBLE ve STRING dir. Daha detaylı bilgi almak için menüden HELP/Contents 'i ve çıkan ekranda Data Types i tıklayın.

Veri tipleri nasıl kullanılır?
A% = 253
Y! = 3.141
Z& = 254144

A nın INTEGER olduğunu öğrenmiştik ama Y! ve Z&
! işareti SINGLE verilere sahip değişkenleri tanımlamak için, & işareti LONG verilere sahip değişkenler içindir.

ARAŞTIR: Şimdi siz DOUBLE ve STRING değişkenler için hangi işaretler kullanılması gerektiğini HELP den bulmaya çalışın.

Data tipi kullanımının bir başka yolu

Değişkenlerin data tiplerini tanımlamak için birkaç alternetif yöntem vardır. Bunlar:

DIM A AS INTEGER
DIM B AS SINGLE
DIM C AS LONG

Bu stil en güzel görüneni ve iyi programcıların kullandığı stildir. Tanımları düzgün yaptıktan sonra programın ilerki aşamalarında yalnızca değişken adını kullanmanız yeterlidir.

DEFINT A
DEFSNG B,K,N
DEFLNG C-D

Bu da başka bir stil Değişkenin başharfine göre tanımlanmamış olan tüm değişkenler DEF in yanındaki değişken türünde olur. İyi bir stil sayılmaz.

A% = 253
Y! = 3.141
Z& = 254144

Bu şekilde tanımlama yaptığınızda aynı değişkeni hep aynı şekilde yazmak zorundasınız. Yani A% nin değerini değiştirmek için A = 100 kullanmak sakıncalıdır.

DİKKAT:

A! = 22.125
A& = 46500
A% = 255
PRINT A!, A&, A%
PRINT A
Kullanıcı tanımlı Veri Tipleri

Kendi veri tipinizi belirleyebilirsiniz Bu size bellekte kaplayacak olan verilerinizi kullanmanızı kolaylaştıracaktır. Örneğin kişilerin adres bilgileri üzerinde işlem yapmak istiyorsanız, kişi için kendinizin belirlediği bir veri yapısı oluşturabilirsiniz.

TYPE Adrestipi
        Adresi AS STRING * 50
        PostaKodu AS STRING * 7
        Adi AS STRING * 30
        Telefonu AS STRING * 18
 END TYPE

Bu açıklamalar sanırım yetersiz olacaktır başlangıç için. Daha detaylı bilgi almak için TYPE yazısı üzerinde iken F1 e basarak yardım alabilirsiniz.

Tanımlamış olduğumuz ADRESTIPI veri tipini kullanmak için bellekde yer açmalıyız. Bunun için

DIM Personel AS Addrestipi

komutunu kullanırız. Şimdi bu değişkenin(PERSONEL) elemanlarına değer aktaralım

Personel.Adresi = "Ankara Caddesi" 
Personel.PostaKodu = "33522" 
Personel.Adi = "Murat Velioğlu" 
Personel.Telefonu = "0866-945 44 21"

Bu tip değişken kullanımı QBasic de yeni iseniz ve ya diğer BASIC dillere alışkanlığınız varsa garip gelecektir. Ama bu tip değişkenler diğer dillerde de kullanılmaktadır. Şu an için telaşlanmanıza gerek yoktur. Zamanla bu yapıya alışıp gerekli yerlerde rahatlıkla kullanacaksınız.

Veri Tipleri Özet Tablosu

VERİ TİPİ

TANIMLAMA
ŞEKİLLERİ

BELLEKTE KAPLADIĞI ALAN
(Byte)

AÇIKLAMA

INTEGER

DIM A AS INTEGER
DIM A%
DEFINT A

2 (16 bit)

-32768 ile 32767 sayıları arasındaki TAM sayıları tutabilir(2^15). Daha büyük sayılar yazmaya çalıştığınızda Owerflow(Taşma) hatası verir. Küsurlu rakamlar vermeye çalıştığınızda yakın olan sayıya tamamlar.
A% = 45.12 '--> 45
A% = 51.72 '--> 52

LONG

DIM A AS LONG
DIM A&
DEFLNG A

4 (32 bit)

-2147483648 ile 2147483647 sayıları arasındaki TAM sayıları tutabilir(2^31). Küsurlar INTEGERdeki gibidir.

SINGLE

DIM A AS SINGLE
DIM A!
DEFSNG A

4 (32 bit)

7 rakamdan oluşan küsurlu veya tam rakamları tutar.
A! = 3.141145
Daha fazla rakam girildiğinde bilimsel kullanım şekline dönüştürür.
A! = 12345678 ' -> 1.234568E+07
E+07 demek .(nokta) yı 7 rakam sağa kaydırılacak demektir
E-07 olsaydı sola kaydırma olacaktı.
A! = 50000000000 ' -> 5E+10
A! = 1 / 25000000 ' -> 4E-08

DOUBLE

DIM A AS DOUBLE
DIM A#
DEFDBL A

8 (64 bit)

15 rakamdan oluşan küsurlu veya tam rakamları tutar. Diğer özellikler SINGLEdaki gibidir.

STRING

DIM A AS STRING
DIM A$
DEFSTR A

Herbir karakter için 1 byte

Kullanıcı
Tanımlı

 

Tanımlanan genişliğe göre değişir

PÜF NOKTASI:
DIM BORCU AS LONG
şeklinde değişken tanımlandıktan sonra programın ilerleyen satırlarında
BORCU = 1250000
şeklinde kullanabiliriz. Ama karmaşık programlar yazdığınızda bu kullanım hangi değişkenin hangi veri tipinde olduğunu anlamanızda zorluk çıkarır. Kolayı: İmleç değişken üzerinde iken F1 tuşuna basarak değişkenin hangi modülde hangi veri tipinde kullanıldığını gösteren ekranı görebilirsiniz.

Bölüm 3: CLS , INPUT ve PRINT

Bu bölümde ekranı silme, program çalışırken değişkenlere veri aktarma ve bu verileri yazdırmayı öğreneceğiz.

CLS komutu

Bu komut çalıştırıldığında daha önceden ekrana yazılmış olan yazılar silinir. Genelde programlar, ilk olarak ekranı temizleyerek, sonraki yazılacaklara temiz bir ekran hazırlar.
Burada dikkat edilecek şey CLS den bir önceki zemin rengi ne ise ekran o renk ile doldurulur. CLS den önce bir renk ayarı yapılmamışsa ekran siyah renk ile doldurularak temizlenir.

COLOR , 4
CLS
PRINT "Merhaba"
Değişkenlere Veri aktarmak

Veri tiplerini açıklarken değişkenlerden bahsetmiştik. Değişkenler, bilgisayarın aklında tutması gereken şeyleri aktarırız. Değişkenler bir harf ile başlayıp 40 karaktere kadar bir isim alabilir. İçinde ingilizce harf ve rakamların dışında semboller olursa kabul edilmez.

4KAT
MÜŞTERİ
PERSONEL NO
MEDENI_DURUMU

Yukardaki değişken için kullanılan isimler hata oluşturacaktır.

PI = 3.14
PRINT PI 

1. satırda PI değişkenine 3.14 rakamını aktardık. Sonraki aşamalarda PI sayısına bir sayı aktarmazsak program sonlana kadar o değeri aklında tutar. Ve biz bunu gerekli olduğunda kullanırız. Örneğin 2. satırda olduğu gibi.
Yukarda olduğu gibi değişkenlere veriyi direkt aktardığımız gibi bir fonksiyonun ya da işlemin sonucunu da aktarabiliriz.

SAYI = 125
KARE = SAYI * SAYI
PRINT KARE

1. satır artık yabancı gelmiyor size. SAYI değişkenine aklında 125 rakamını tut dedik. KARE değişkenine de SAYI değikenin tuttuğu rakamı kendisiyle çarp ve sonucunu aklında tut dedik. Bu arada SAYI değişkeninin değerinde hiçbir değişiklik olmaz. Değişiklik olabilmesi için aktarma işlemi olması gerekir. = işaretinin sağındaki değer veya işlem solundaki değişkene aktarılır. Yukarda olduğu gibi = in sağ tarafında SAYI nın kendisiyle çarpımından SAYI değişkeni etkilenmemektedir.

Değişkenlere değerler aktarılırken tanımlanan tipine uygun değerler aktarılmalıdır. Sınırını aşan veya uygun olmayan veri aktarımlar kabul edilmeyecektir. Aşağıdaki satırlar hata oluşturacaktır.

A% = 33652 'Sınırı aşmıştır
A& = 2154.43 ' Bu tür değişkenler küsurlu sayıları aklında tutamaz o yüzden sayıyı yuvarlayarak 2154 yapar. Bu satırda bilgisayar bir uyarı varmez.
A$ = 65000 ' String değişkenlere değerler " (çift tırnak) lar ile aktarılır
A# = "Merhaba" ' Bu tür değişkene string veri aktarılamaz

INPUT Komutu

Değişkenlere A = 45 gibi bir satır yazarak bir değer aktarabiliyoruz. Bazen program çalışırken değişkenlere programı kullanan kişinin veri aktarması istenebilir. INPUT komutu ile istediğimiz değişkenlere program çalışırken değer aktarılabilir.
INPUT kullanılırken; INPUT un ardından verilecek mesaj tırnaklar arasında yazılır sonra (,) veya (;) konulur ve klavyeden yazdıklarımızı aktaracağımız değişken ismi yazılır.

CLS
INPUT "ADINIZ " ; AD$
INPUT "YAŞINIZ " , YAS%
PRINT "Sayın " ; AD$ ; YAS% ; " yaşındasınız."  

Yaşımızı sorduğunda rakam dışında birşey yazarsak, bir uyarı ile aynı soruyu tekrar sorulur.

DÜŞÜN: Burada virgül ile noktalı virgülün farkı ne?

PRINT Komutu

Ekrana bir mesaj veya bir değişkenin değerini yada bir fonksiyon yada işlemin sonucunu yazdırmak için kullanılır. PRINT yazmak yerine yalnızca ? yazın.

CLS
PRINT 3 * 8 + 12 ' Sonuç 36 olarak ekranda görünecek
YASI = 32
PRINT "Yaşı = " ; YASI ; " dir"
A% = 15
B! = 3.14
ADI$ = "Mesut"
PRINT A% , B! , ADI$
SA$ = "Akcan"
PRINT ADI$ ; SA$

DÜŞÜN: PRINT de kullanılan virgül ve noktalı virgülün farkı ne?
PRINT komutunda bir işlemin sonucunu da yazdıracağımızı söylemiştim.

PRINT 12+33 ' Ekrana toplamı(45) verir
PRINT 125+48*10 ' 605 yazar. Öncelik sırası: Parantez içi, * / + - dir
PRINT 12-(80/4-23)+54/9 ' sonuç: 21  ??
PRINT 1 + 1 ' Toplam olan 2 çıkar
PRINT "1" + "1" 
  ' 11 çıkar. Çift tırnak içindeki sayılar sayı olarak görülmez.
  ' Burada sayı olmadığı için toplama işlemi değil
  ' tırnaklar içindekileri birleştirme işlemi uygulanır
PRINT "QUICK" + "basic" ' QUICKbasic
PRINT 8 + "elma" ' !!! Hata !!!
PRINT "8" + "elma" ' 8elma
PRINT 8 ; "elma" ' 8 elma
PRINT 8/2 ; "elma"  ' 4 elma
Uygulama
CLS
PRINT "Çıkmak için 0 yaz"
basla:
INPUT "Bir sayı yaz "; SAYI
IF SAYI = 0 THEN END
CLS
PRINT "Verdiğiniz sayı "; SAYI
PRINT SAYI; " 'nın karesı "; SAYI ^ 2; " dır."
PRINT SAYI; " 'nın küpü "; SAYI ^ 3; " dır."
GOTO basla

PROBLEM:
Dairenin çevresini hesapalyıp ekrana yazan bir program yazın. Dairenin çevresi = Daire çapı * Pi sayısı

Bölüm 4: Kontrol blokları

Programlama dillerinde döngüler ve akış kontrol komutları çok sık kullanılır. Programları program yapan esas kısımlar bu komutlarla sağlanır. Qbasicde diğer programlama dillerindekine benzer yapıda döngüler ve mantıksal karşılaştırmalar yapılabilir.

IF ... THEN ... ELSE

Mantıksal karşılaştırma için kullanılır. Karşılaştırma işlemin sonucunda bir değer döner bu değer ya mantıksal DOĞRU dur ya da mantıksal YANLIŞ. Lise 1 deyken matematik dersinde 1 ve 0 lar ile, doğru ve yanlışlar ile işlemler yapardık. Birçok kişide ne işe yarıyor bunlar diye söylenip dururlardı. Demekki bir gerekliliği varmış. İşte onlar burada gerekecek, isterseniz MANTIK ile ilgili kısımları bir daha gözden geçirin. :)

Mantıksal karşılaştırma için basit bir örnek:

IF A = 40 THEN B = 40

Burada A değişkenin değeri 40 ise B nin değeri de 40 olacaktır. Eğer A nın değeri 40 dan farklı ise bu satırın hiçbir etkisi olmayacaktır.

Bir başka kullanımı:

A = 25
IF A > 40 THEN M$ ="Sayı 40 dan  büyük" ELSE M$= "Sayı 40 dan küçük"
PRINT M$

Üstte A değişkeninin değerinin 40 dan büyük olup olmadığı kontrol ediliyor. Mantıksal karşılaştırmanın sonucunda ancak iki değer dönebilir. DOĞRU veya YANLIŞ. Doğru olması durumunda THEN den sonraki işlem yapılır, YANLIŞ olması durumunda ise ELSE den sonraki işlem. A ya 25 aktardığımız için A>40 mantıksal karşılaştırmanın sonucu YANLIŞ olacaktır. Çünkü 25, 40dan büyük değil. Bu durumda M$ a "Sayı 40 dan küçük" değeri aktarılır.

DÜŞÜN: Üstteki programı denedikten sonra A = 40 olsaydı sonuç ne olurdu? diye düşünüp cevabı bulmaya çalışın. Sonra Qbasicde deneyerek düşündüğünüzü kontrol edin.

IF A = 40 ....  ' A , 40 a eşit mi?
IF A > 40 ....  ' A , 40 dan büyük mü?
IF A < 40 ....  ' A , 40 dan küçük mü?
IF A <> 40 .... ' A , 40 a eşit değilse
IF A <= 40 .... ' A , 40 a eşit ya da 40 dan küçük mü?
IF A >= 40 .... ' A , 40 a eşit ya da 40 dan büyük mü?
IF A      ' A nın değeri 0 dan farklı mı?
IF NOT A  ' A nın değili DOĞRU mu? 

IF ile karşılaştırma yaptığımızda dönen değerlere göre çok sayıda komut yürüteceksek aşağıdaki yapıyı kullanırız. Bu şekilde kullanımda karşılaştırma bloğunu bitiren END IF kullanmak zorundayız.

IF A > 40 THEN
        'doğruysa yapılacaklar
        ....
        ....
ELSE
        'Yanlışsa yapılacaklar
        ....
        ....
END IF

Örnek :

INPUT "ADINIZ " ; AD$
IF AD$ = "MESUT" THEN
        PRINT "SİZİN ADINIZ MESUT"
ELSE
        PRINT "SİZİN ADINIZ MESUT DEĞİL"
END IF
İç içe IF.
INPUT A
IF A > 40 THEN
        IF A < 60 THEN
                PRINT "SAYI 40 ile 60 arasında"
        ELSE
                PRINT "SAYI 60 yada 60dan büyük"
        END IF
ELSE
        IF A = 40 THEN
                PRINT "SAYI 40a eşit"
        ELSE
                PRINT "SAYI 40dan küçük"
        END IF
END IF
Mantıksal karşılaştırmalar

Şimdiye kadar bir satırda bir değişkeni karşılaştırdık. Bazen birkaç değişkenin karşılaştırılıp sonucunun alınması gerekebilir.

INPUT A
IF A>10 AND A<20 THEN PRINT "SAYI 10 ile 20 arasında"
INPUT A
IF A<10 OR A>50 THEN PRINT "SAYI 10 ile 50 arasında değil"
' yani sayı 10 dan küçük ya da 50 den büyük

Mantıksal karşılaştırmalarda kullanılacak terimler: AND , OR , XOR , EQV, IMP, NOT

Değer

Mantıksal karşılaştırma ve sonucu

X

Y

NOT
X

X
AND
Y

X
OR
Y

X
XOR
Y

X
EQV
Y

X
IMP
Y

1

1

0

1

1

0

1

1

1

0

0

0

1

1

0

0

0

1

1

0

1

1

0

1

0

0

1

0

0

0

1

1

1 -> Mantıksal Doğru
0 -> Mantıksal Yanlış
Bu terimlerden faydalanarak bitsel karşılaştırma da yapılabilir.
PRINT (155 AND 160)
yazdığımızda 128 sonucunu alırız. Çünkü 155 in 2 li sayı düzenindeki karşılığ 10011011, 160 ınki ise 10100000. İkisini altalta yazıp bitlerini AND ile karşılaştırdığımızda

10011011
10100000
--------
10000000

çıkar. O da 128 e eşittir. Desimal sayıları 2 li sayıya çevirmek için Hesap makinasını Bilimsel görünüme getirerek kullanabilirsiniz.. Dec = Decimal(10 lu sayı), Bin = Binary (2 li sayı), Hex = Hexadecimal (16 lı sayı)

ELSEIF, SELECT CASE

IF in bir başka kullanımı

INPUT "1 ile 3 arasında sayı girin " ; A
IF A = 1 THEN
        PRINT "SAYI = 1"
ELSEIF A = 2 THEN
        PRINT "SAYI = 2"
ELSEIF A = 3 THEN
        PRINT "SAYI = 3"
ELSE
        PRINT "HATALI SAYI"
END IF

Bunun yerine buna benzer yapıya sahip anlaşılırlığı ve kodlaması kolay olan SELECT CASE yapısı kullanılır.

INPUT "1 ile 3 arasında sayı girin " ; A
SELECT CASE A
        CASE 1
               PRINT "SAYI = 1"
        CASE 2
               PRINT "SAYI = 2"
        CASE 3
               PRINT "SAYI = 3"
        CASE ELSE
               PRINT "HATALI SAYI"
END SELECT

Bölüm 5: Döngüler

Tekrar edilen işlemler için döngüler kullanılır. Böylece bilgisayarın sürekli yapacağı işlemler için aynı komutları bir daha yazmak zorunda kalmayız.

GOTO döngüsü

En basit döngü GOTO ile yapılan döngüdür.

basla:
A = A + 1
PRINT A
GOTO basla

Yukardaki program bir sonsuz döngü oluşturur. Dordurmak için CTRL-PAUSE tuşlarına basınız. Aşağıdaki şekilde değişiklik yaparsak döngüyü kontrol altına almış oluruz.

basla:
A = A + 1
IF A>20 THEN END
PRINT A
GOTO basla

PROBLEM 1 : 1 den 30 a kadar olan çift sayıların karelerini ekrana yazan bir program yazın.

FOR ... NEXT döngüsü

Belirli sayılarda işlemlerin tekrar etmesi için kullanılır.

FOR N = 1 TO 25
        PRINT N
NEXT N

1 den 25 e kadar olan sayıları yazacaktır. Her döngüde N değişkeninin değeri 1 artacaktır. Eğer ilk satırı

FOR N = 1 TO 25 STEP 4 

yapacak olursak. N nin ilk değeri 1 olacak sonra her seferinde üzerine 4 eklenerek devam edecektir.

FOR N = 25 TO 1 STEP -1

yazılacak olursa 25 den 1 e doğru N nin değeri her seferinde 1 azaltılır.
NEXT in arkasına değişkeni yazmak şart değildir ama okunurluğu kolaylaştırmak için yazmakta fayda vardır.
FOR ları içi içe koyarak da kullanılabilir. İçerdeki FOR un NEXT i dışardakinin NEXT inden sonra gelmemesine dikkat etmelisiniz.

FOR N = 1 TO 10
        FOR M = 1 TO 4
                PRINT N * M ,
        NEXT M
        PRINT
NEXT N

FOR döngüsünden çıkma gereği olursa EXIT FOR ile çıkılabilir.

PROBLEM 2 : Problem 1 i FOR..NEXT dögüsüyle yapın

DO ... LOOP döngüsü
DO
        PRINT A
        A = A +1
LOOP

Bu da sonsuz döngü oluşturacaktır. Döngüyü kırmak, kontrol altına almak için çeşitli yollar var

EXIT DO ile döngüden çıkmak:

DO
        IF A > 40 THEN EXIT DO
        PRINT A
        A = A +1
LOOP

WHILE kullanarak döngüyü kontrol altına almak:

'1 . program 
CLS
DO WHILE A < 40 ' A, 40 dan küçükİKEN döngüye devam 
        PRINT A
        A = A + 1 
LOOP
'2 . program
CLS
DO 
        PRINT A
        A = A + 1
LOOP WHILE A < 40 ' A, 40 dan küçükİKEN döngüye devam

Yukardaki iki programı denediğinizde hiçbir fark göremeyeceksiniz. Şimdi ilk satırlarına A = 45 komutunu ekleyip deneyin ve farkı anlamaya çalışın. Eğer WHILE ı LOOP un yanına koyarsak döngüde şart aranmaksızın en az 1 kere döner. DO nun yanına konulursa döngü başlamadan şart kontrol edilir, şart uygun değilse döngü gerçekleşmez..

UNTIL kullanarak döngüyü kontrol altına almak:

CLS
DO UNTIL A > 40 ' şart DOGRU olanA KADAR dön. A , 40 dan büyük olana kadar devam
        PRINT A
        A = A +1
LOOP

WHILE için verdiğim açıklamalar bunda da geçerli UNTIL i DO nun yanına yada LOOP un yanına koyabiliriz.

Kısaca WHILE, şartın DOGRU olmasında; UNTIL, şartın YANLIŞ olmasında döngüye devam eder.

PROBLEM 3: Problem 1 i DO..LOOP dögüsüyle yapın

WHILE ... WEND döngüsü
CLS
WHILE A < 40 ' A , dan küçük İKEN devam 
        A = A + 2
        PRINT A
WEND

WHILE WEND, DOO LOOP un bir alternatifidir. Ama DO LOOP kadar kullanışlı değildir. Çünkü DO LOOP da karşılaştırma şartını başta veya sonda verebiliyoruz.

PROBLEM 4: Problem 1 i WHILE..WEND dögüsüyle yapın

Bölüm 6: Diziler

Dizilere neden ihtiyaç duyulur? Çünkü binlerce değişkeni tanımlamak uzun sürer ve kullanışlı olmaz. Örneğin 12 ay için ayrı ayrı değişken tanımlamak yerine yalnız bir boyutlu değişken tanımlamak yeterlidir.
DIM AY(12) gibi.

Dizi tanımlama. (Hafızada yer açma)
DIM AY1 AS STRING
DIM AY2 AS STRING
DIM AY3 AS STRING
..
..

Gördüğünüz gibi bu uzayıp gidecek. Bunun yerine

DIM AYLAR(12) AS STRING 

yeterli olacaktır. Bu tanımladığımız dizinin kullanımı

AYLAR(1) = "OCAK"   : AYLAR(2)  = "ŞUBAT" 
AYLAR(3) = "MART"   : AYLAR(4)  = "NİSAN"
AYLAR(5) = "MAYIS"  : AYLAR(6)  = "HAZİRAN"
AYLAR(7) = "TEMMUZ" : AYLAR(8)  = "AĞUSTOS"
AYLAR(9) = "EYLÜL"  : AYLAR(10) = "EKİM"
AYLAR(11) = "KASIM" : AYLAR(12) = "ARALIK"
buay% = VAL(LEFT$(DATE$, 2))
PRINT AYLAR(buay%)
OPTION BASE, LBOUND, UBOUND

Normalde, yani belirtmezseniz, boyutlu değişken tanımladığınızda; ilk boyut no 0 (Sıfır) olur. DIM A(10) dediğimizde 10 değil 11 adet değişken tanımlamış oluruz. Ama istersek ilk boyut numarasını kendimiz belirleyebiliriz.(Tabii 1 yada 0 olarak)
OPTION BASE 1
yazdığımızda bundan sonra tanımlanacak boyutlu değişkenler yani dizilerin ilk boyut numarası 1 olur.
DIM A(10) yazarsak 10 değişken tanımlamış oluruz.

Tanımlanmış bir dizinin ilk boyut numarasını öğrenmek için LBOUND, son boyutunu öğrenmek için UBOUND kullanılır.

OPTION BASE 1
DIM A(10) AS INTEGER
PRINT "İlk boyut no: " ; LBOUND(A)
PRINT "Son boyut no: " ; UBOUND(A)

Örnek:

CLS
DIM A(10) AS INTEGER
FOR N = 0 TO 10
        A(N) = N * 10
NEXT
 
FOR N=LBOUND(A) TO UBOUND(A)
        PRINT A(N) ,
NEXT

Bir başka özellikde boyut numaralarını kendimiz belirleyebilmemiz.

DIM A(10 TO 20) yazdığımızda A nın ilk boyut numarası 10 son numarası 20 olacaktır. Bundan sonra A(5) = 40 ya da A(22) = 65 yazacak olursanız hata oluşacaktır. Çünkü değişken dizi sınırları dışında. (Subscript out of range)

Çok boyutlu değişken tanımlama

Şimdiye kadar tek boyutlu değişkenler tanımladık.
DIM A(5, 6, 10)
yazarak üç boyutlu bir dizi oluşturabiliriz. Buna göre bellekde ( 5 x 6 x 10 ) + 3 adet değişken için yer açıldı. +3 adet 0. değişkenler için. Yine bir başka kullanım olarak
DIM A(5, 3 TO 12, 5 TO 15) gibi bir tanımlama da yapabiliriz.

OPTION BASE 1
CLS
DIM SAYI(10,10) AS INTEGER
FOR N = 1 TO 10
        FOR M = 1 TO 10
               SAYI(N,M)=N * M
        NEXT
NEXT
'Çarpım tablosu bellekte oluştu
INPUT "1. sayıyı girin " ; A
INPUT "2. sayıyı girin " ; B
'Çarpım tablosundan sonucu alıyoruz
'Dikkat edin verilen sayıları çarpmıyoruz
PRINT SAYI(A,B)
REDIM, ERASE

Diziler için bellkete ayırdığımız alanı genişletmek için kullanırız.

CLS
REM $DYNAMIC
' üst satır, değişkenlerin dinamik olacağını belirtir.
DIM A(15)
PRINT UBOUND(A)
REDIM A(30) ' Yeniden boyutlandı
PRINT UBOUND(A)
ERASE A ' Bellekde kapladığı alanı boşalt, sil
PRINT UBOUND(A) ' HATA. Çünkü dizi bellekden atıldı

Bölüm 7: Goto, Gosub, Sub, Function

Programlarımızdaki kodlar arttıkça veya programın işlevleri arttıkça bazı tekrar eden işlemler gerekli olabilir. Ya da içinde birkaç şey değiştirerek aynı işlemler yapmak gerekir. Bunun için alt programlar kullanılır. Ayrıca Fonksiyonlar ve Alt programlar kullanmak programınızın okunurluğunu kolaylaştıracaktır.

GOTO

Goto komutunu daha önce döngü oluştururken de görmüştük. Aslında Goto ve gosub komutlarına çok az ihtiyaç duyacaksınız. Sadece diğer basic dillerine uyumlu olsun diye konulmuş. Program kodunun herhangi bir yerinde işleyişini bırakıp başka bir noktadan çalışması için kullanılır. Goto ve ardında bir etiket yada satır numarası yazılmalıdır.

PRINT "MERHABA DÜNYA"
GOTO 10
PRINT "BU SATIRI GÖREBİLECEK MİSİNİZ?"
10 PRINT "PROGRAM SONA ERDİ"
END
GOSUB

Gosub ile alt programlar oluşturabiliriz. Gosub 'u da kullanmanıza gerek yoktur. Onun yerine SUB kullanmak daha iyi olacaktır. Gosub da goto gibi programın işleyişi bırakıp başka bir noktadan başlaması sağlanır. Fakat farklı olarak RETURN komutunu görünce kaldığı yere geri dönerek çalışmasına devam eder. Alt programa, istediğimiz yerden istediğimiz kadar atlayabiliriz. GOSUB ve ardından bir etiket ya da satır numarası yazılmalı. Gosub ile atladığımız yerde RETURN bulunmazsa geri dönüş olmaz.

CLS
GOSUB CIZGICIZ 
PRINT "MERHABA DÜNYA"
GOSUB CIZGICIZ
PRINT "QUICK BASIC"
GOSUB CIZGICIZ
PRINT "PROGRAMLAMA DİLİ"
GOSUB CIZGICIZ
END ' programı burada sonlandırmazsak
    ' alt program da çalışır ve hata oluşur
 
CIZGICIZ:
PRINT "----------------"
RETURN
'2. program
CLS
PRINT "çift sayılar(1-100)"
DO
        A = A + 1
        IF (A MOD 2) = 0 THEN GOSUB CIFTSAYI
LOOP UNTIL A = 100
END
 
CIFTSAYI:
PRINT A;
RETURN
SUB

GwBasic gibi diğer dillerde Sub veya Function özellikleri yoktur. O yüzden program kodları büyüdükçe okumak ve kontrol etmek epey zor olacaktır. İlk başta Sub ve Functionların faydalarını anlamak zor olabilir. Alıştığınızda bir defa yapacağınız işlemler için bile bunları kullacaksınız belki de.

Sub yapısı: [ ile ] arası şart değil gerekirse kullanılır

SUB altprogram_ismi (varsa parametreleri) [STATIC]
..
..
[EXIT SUB] ' alt programdan çıkılmak istenirse
..
..
END SUB ' alt program sonu

Bir sub veya function eklemek için EDIT menüsündeki New Sub... ya da New Function dan faydalanabilirsiniz ya da direkt yazabilirsiniz. Alt programı eklediğinizde bunlar ayrı bir sayfa olarak görünür. Sub veya Function listesini göemek ve istediğinizi incelemek için F2 tuşuna basın.

Uygulama:

Menüden File / New Program ile yeni bir projeye başlayın. SUB yaziyaz yazıp ENTER' e bastığımızda hemen iki alt satıra END SUB yazıldığını göreceksiniz. Kodlarımızı SUB ile END sub satırları arasında olmalı. Arasına şunları ekleyin

PRINT "================="
PRINT "==   MERHABA   =="
PRINT "================="

F2 tuşuna basın Altprogramları listeleyen ekran gelecek Untitled kaydedilmemiş basic dosyamız oluyor ve alt programların anası oluyor kaydettiğimide bu isim değişir. yaziyaz ise alt program ismi. Alt tarafta seçili olan ile ilgili işlemler var.
Edit in Active: Düzenlemek için aç
Edit in Split: Düzenleme ekranına ayrı bir bölme olarak aç
Delete : Modülü yani alt programı sil
Move : Modülü açık olan başka bir basic dosyaya taşı. Qbasic de aynı anda çok sayıda dosya açılabilir.

Siyah şerit Untitled üzerindeyken ENTER'e basın.
Şimdi oluşturduğumuz altprogramı çağıracağız. Çağırmak için yalnızca
yaziyaz
yazabiliriz. Ama programın okunurluğu açısından
CALL yaziyaz
ile çağırmak en doğrusu olacaktır. F5 ile programımızı çalıştırdığımızda çalıştığını göreceksiniz.
Kodları şu hale geririp çalıştırın. Buradaki kodlama kolaylaığını öğrenmeye çalışın

CLS
yaziyaz
yaziyaz

Parametre kullanımı:

Alt programımız çalışırken ona bazı değerler gönderip farklı şekillerde çalışmasını sağlayabiliriz. Az önceki SUB da parametre yoktu. Paramatre veri değişken tipinin ne olacağını belirtmekte fayda var. Belirtilmezse SINGLE olarak kabul edilir. Bazı örnekler:

SUB ekranayaz (satir AS INTEGER, sutun AS INTEGER)
aynı satırı şöyle de yazabiliriz
SUB ekranayaz (satir%, sutun%)

'Örnek program:
CLS
cizgi$ = STRING$(60, "-")
yaziortala 1, cizgi$
yaziortala 2, "Merhaba"
yaziortala 3, "Bugün Qbasic de Goto, GoSub, Sub ve Function'u öğrendim"
'farklı bir kullanım: CALL ile alt programı çağırma 
CALL yaziortala(5, "Qbasic Öğrenmek çok zevkli") 
yaziortala 6, cizgi$
 
SUB yaziortala (satir AS INTEGER, yazi AS STRING)
        uzunluk% = LEN(yazi)
        LOCATE satir, (80 - uzunluk%) / 2
        PRINT yazi
END SUB

PROBLEM:

1.      Yukardaki programı alt program kullanmadan yapmaya çalışın.

2.      Alt program kullanarak sağa yaslı yazı yardırmayı deneyin
yazisagayasla 4 , "Merhaba"
gibi

FUNCTION

Functionların yapısı SUB lar gibidir. Yukarda açıklananlar bunda da geçerli. Function'un farkı verilen değerler üzerinde işlem yapıp bir sonuç ile geri döndürmesi. Qbasic in kendi yapısındaki birçok komutun Function özelliği vardır. Örneğin : X = SQRT(81) yazdığımızda verilen 81 sayısı SQRT(karekök alma) fonksiyonu tarafından işlenir ve sonuç olarak 9 döner. Bu sonuç X değişkenine atanır.

Şimdi biz kendimiz bir fonksiyon oluşturalım

X = karesi(15)
PRINT X
PRINT "20 nin karesi = "; karesi(20)
PRINT "1.4 ün karesi = "; karesi(1.4)
FUNCTION karesi (sayi AS DOUBLE)
        DIM sonuc AS DOUBLE
        sonuc = sayi * sayi
        karesi = sonuc
END FUNCTION

Function da tek satır ile sonucu alabilirdik. Anlaşılır olması bakımından uzun yazıldı. Kısa olarak:

FUNCTION karesi (sayi AS DOUBLE)
 karesi = sayi * sayi
END FUNCTION
'2. örnek:
CLS
PRINT enbuyuksayi(15, 25)
FUNCTION enbuyuksayi (sayi1, sayi2)
         IF sayi1 > sayi2 THEN
                enbuyuksayi = sayi1
         ELSE
                enbuyuksayi = sayi2
         END IF
END FUNCTION
'3. örnek
DIM sayi(5)
CLS
sayi(0) = 20
sayi(1) = 30
sayi(2) = 66
sayi(3) = 88
sayi(4) = 36
sayi(5) = 23
x = ortalama(sayi())
PRINT x
FUNCTION ortalama (sayilar())
        FOR n = LBOUND(sayilar) TO UBOUND(sayilar)
                t = t + sayilar(n)
        NEXT
        ortalama = t / n
END FUNCTION
STATIC, SHARED, COMMON

STATIC:
Bazen tanımladığımız değişkenin değerini kaybetmeden SUB ve FUNCTION içinde de kullanmak gerekli olabilir. Alt program içinde değişkeni STATIC ile tanımlarsak değişken değerini kaybetmez aklında tutar. Yoksa her fonksiyon ve sub başlangıcında tanımlanan değişkenlerin değerleri sıfırlanır. Örnek:

CLS
yaziortala "merhaba"
yaziortala "Qbasicde Function ve Sub Kullanmak kodlamayı kolaylaştırıyor"
yaziortala "Öğrenmem gereken daha çok şey var sanırım."
SUB yaziortala (yazi AS STRING)
        STATIC satir AS INTEGER
        satir = satir + 1
        LOCATE satir, (80 - LEN(yazi)) / 2
        PRINT yazi
END SUB

Burada dikkat ederseniz SUB a satır numarasını göndermedik 0 dan başladı her SUB başlamasında 1 arttı ve yazılar alt alta ortalı olarak yazıldı. STATIC i DIM ile değiştirin farkı göreceksiniz.

SHARED:
Bazen de bir değişkenin değerini kaybetmeden tüm SUB ve FUNCTION içinde geçerli olması istenebilir. Buna değişkeni global (genel, her yerde geçerli) tanımlama diyoruz. Alt program içinde yapılan değişken tanımlamaları Local tanımlama(yerel, sadece alt program içinde geçerli)diyoruz. Global tanımlamayı Ana program içinde yapmalıyız

DIM SHARED satir AS INTEGER
CLS
satir = 2
LOCATE satir: PRINT "Merhaba"
yaziortala "Qbasic öğreniyorum"
satir = satir + 1
LOCATE satir: PRINT "Çalışan başarır"
yaziortala "İstiyorsan başarırsın"
SUB yaziortala (yazi AS STRING)
        satir = satir + 1
        LOCATE satir, (80 - LEN(yazi)) / 2
        PRINT yazi
END SUB
'basit birnek daha
DIM SHARED a
CLS
a = 5
PRINT a
CALL karesi
PRINT a
PRINT ussu(3)
PRINT a
PRINT ussu(4)
SUB karesi
        a = a * a
END SUB
FUNCTION ussu (kuvvet%)
        a = a ^ kuvvet%
        ussu = a
END FUNCTION

COMMON: 

Common, shared gibidir ama daha genel bir tanımlama yapılır. Qbasic ile CHAIN komutuyla başka bir bas dosyaya bağlantı kurabiliriz. Değişken Common ile tanımlama yapılırsa değeri bağlantı kurulan bas dosyada da geçerli olur. Zaten başlangıçta tek bas dosya üzerinde çalışacağınızdan bu gerekli olmayacak

 

 

Ders1:

Değişkenler

A- Değişkenlere İsim Verme

    Visual Basic’de daha etkin bir programlama yapabilmek için kullanılan veri tiplerini ve veri yapılarını iyi bir şekilde bilmeliyiz. Burada önemli olan nerede hangi veri tipini kullanacak oluşumuzdur. Veri tiplerini anlatmadan önce kullanacagımız degişkenleri nasıl isimlendirecegimizi görelim.

Değişkenleri isimlendirirken daha sonra baktığınızda akılda kalabilecek ve anlamlı bir isim veriniz
    Aşağıda verilen kurallar doğrultusunda değişkenler tanımlayabilmemiz mümkün olmaktadır. Tanımlanacak değişkenlerin ilk karakteri mutlaka bir harf ile başlamalıdır. Geri kalan karakterler ; harflerden , rakamlardan, alt çizgi karakterinden oluşabilir. Değişken isimlerinde noktalama işaretlerini ,matematiksel ve mantıksal ve karşılaştırma operatörleri kullanamayız. Değişken isimleri 255 karaktere kadar uzunlukta olabilir. Aşagıda değişken tanımlamaları ile ilgili örnekler verilmiştir.

Örnek :

Adı , soyadı , yası , Maas98 , Dogum_Yeri , SANAT_DALI

    Yukarıda geçerli değişken isimlerine örnek verilmiştir

Örnek :

2ADI , ad soyad , Mal+Bildirimi

Burada da geçersiz değişken isimlerine örnekler verilmiştir.
2ADI : Çünkü ilk karakter bir sayı ile başlamış.
Ad soyad : Değişken isminde boşluk kullanılmış
Mal+Bildirimi : Değişken isminde geçersiz bir karakter kullanılmış.
Zaten bu değişkenleri tanımlarken Visual Basic bizi hata mesajı ile uyaracaktır.

 

B- Visual Basic’de Değişken Tanımlama

 


    Değişken tanımlarken Visual Basic’te Dim bildiri deyimini kullanabiliriz. Değişkenin tanımlanması hafızada ayrılacak hafıza miktarının belirli olmasını sağlar. Eğer değişkenlerin tipini belirtmeden bir kullanım yaparsak bu değişkenlerin Variant tipinde olduğu kabul edilir.Bu da hafızada gereksiz yer kaybına sebep olur.Eğer tanımlanan bütün degişkenlerin tiplerinin belli olmasını isterseniz kod penceresinin General,Declarations kısmına
Option Explicit yazılır.

    Ayrıca değişken tanımlarken kullanılabilecek bir başka bildiri deyimide Def- bildiri deyimidir.Bu bildiri deyimi daha genel tanımlamalar yapmak için kullanılır..Def bildiri deyimleri aşagıda verilmiştir.

Def bildiri deyimi projenin general,declarations bölümünde tanımlanmalıdır

DefBool : Boolean tipinde degişken tanımlamak için kullanırız.
DefByte : Byte tipinde degişken tanımlamak için kullanırız.
DefInt : Integer tipinde degişken tanımlamak için kullanırız.
DefLng : Long tipinde degişken tanımlamak için kullanırız.
DefCur : Currency tipinde degişken tanımlamak için kullanırız.
DefSng : Single tipinde degişken tanımlamak için kullanırız.
DefDbl : Double tipinde degişken tanımlamak için kullanırız.
DefDate : Date tipinde degişken tanımlamak için kullanırız.
DefStr : String tipinde degişken tanımlamak için kullanırız.
DefVar : Variant tipinde degişken tanımlamak için kullanırız.

 

 

Örnek :

Private Sub Form_Load()

Dim Ad As String

Dim Maas As Currency

Dim D_tarihi As Date

Dim Adres As String

Dim Sira As Integer

End Sub

   Burada görmüş olduğunuz gibi 5 adet degişken tanımlanmaktadır.Ad değişkeni string tipinde bir değişkendir.Maaş değişkeni Currency tipinde bir değişkendir.D_tarihi değişkeni Date tipinde bir değişkendir.Adres değişkeni string tipinde bir değişkendir.Sira değişkeni integer tipinde bir değişkendir.

    Aşagıdaki satırları formun general,declarations bölümüne yazalım.

Örnek :

DefInt A-C

DefStr S

DefVar K

DefDate D

DefSng V

Bu örnekte
A , B, C ile başlayan bütün karakterler Integer türünde olmak zorundadır.
D ile başlayan bütün karakterler Date türünde olmak zorundadır.
V ile başlayan bütün karakterler Single türünde olmak zorundadır.
K ile başlayan bütün karakterler Variant türünde olmak zorundadır.
S ile başlayan bütün karakterler String türünde olmak zorundadır.

 

Def deyimi dim deyiminden farklıdır. Def ile sadece bir harf yada harf aralıgı belirtilebilir.Burada belirtilen harf ile başlayan bütün değişkenler artık o bildiri deyimindeki tipdedir

Örnek :

Private Sub Form_Load()

Dim ad As String , soyad As String

Dim maas As Currency

End Sub

Bu örnektede ad ve soyad isimli iki degişken string türünde ve maas degişkeni ise Currency tipindedir.

Ders2:

Veri Tipleri

Integer :
    Visual Basic’te tam sayı degişkenleri tanımlamak için kullanılır. Hafızada 2 byte yer kaplarlar. Alabilecegi değer aralıgı –32768 ile +32767 arasındadır.DefInt bildiri deyimi ile tanımlanabilirler. Ayrıca bir degişkenin sonunda % karakteri bulunuyorsa bu degişken integer tipindedir.

Örnek :
Private Sub Form_Load()
Dim Maas As Integer
DefInt A-C
Oran% = 100
A_sayı = 100
B_sayı = Oran*A_sayı
C_sayı = B_sayı + A_sayı – 1000
Maas= 32767
End Sub

Eger burada tanımlanan degişkenlere daha büyük sayılar atanırsa overflow oluşur.
Long :
    Daha büyük bir aralıkta integer yani tamsayı tanımlamak için kullanabilecegimiz bir veri tipidir. Hafızada 4 byte yer kaplar. Kullanılabilecek uç degerler +2,147,483,647 ile -2,147,483,648 dir. Long tipinde bir degişken tanımlamak için DefLng bildirimini veya degişken sonunda & karakterini kullanabiliriz.

Örnek :
Private Sub Form_Load()
 DefLng A-B
 Bölüm=50000 
 cıkan&=600000
 Kalan& = (cıkan / Bölüm ) * 10000
 End Sub

Single :
    Tam sayı olmayan küsüratlı sayılar için kullanabilecegimiz bir veri tipidir. Kayan-noktalı sayı olarak isimlendirilir. Single tipindeki veriler bellekte 4 byte yer kaplarlar. Nekatif sayılar için alabilecegi aralık -3.402823E38 ile –1.401298E-45 ,pozitif sayılar için alabilecegi aralık 1.401298E-45 ile 3.402823E38 arasındadır.Single tipinde veri tanımlamak için DefSgn bildirimi veya degişken sonuna ! karakteri konur. 7 haneye kadar hassastır.Daha sonrası yuvarlatılır.

Örnek :
Private Sub Form_Load()
DefSgn A-B
Bölüm=50000 
Cıkan!=600000
End Sub

Double :
    Visual Basic’te kullanılabilecek en büyük sayısal degerlerin veri tipidir. Hafızada 8 byte yer kaplarlar. 16 haneye kadar hassastırlar. Maximum alabilecegi degerler pozitif sayılar için 4.94065645841247E-324 ile 1.797693134862232E308 , nekatif sayılar için de -1.797693134862232E308 ile -4.94065645841247E-324 arasındadır. DefDbl bildirimi veya # sembölü ile double tipinde degişkenler tanımlanabilir

Örnek :
Private Sub Form_Load()
DefDbl A-K
Darı=50000 
Bugday=600000
Arpa=340.56
End Sub

 

Integer :
    Visual Basic’te tam sayı degişkenleri tanımlamak için kullanılır. Hafızada 2 byte yer kaplarlar. Alabilecegi değer aralıgı –32768 ile +32767 arasındadır.DefInt bildiri deyimi ile tanımlanabilirler. Ayrıca bir degişkenin sonunda % karakteri bulunuyorsa bu degişken integer tipindedir.

Örnek :
 Private Sub Form_Load()
 Dim Maas As Integer
 DefInt A-C
 Oran% = 100
 A_sayı = 100
 B_sayı = Oran*A_sayı
 C_sayı = B_sayı + A_sayı – 1000
 Maas= 32767
 End Sub
Eger burada tanımlanan degişkenlere daha büyük sayılar atanırsa overflow oluşur. 
Long : 
    Daha büyük bir aralıkta integer yani tamsayı tanımlamak için kullanabilecegimiz bir veri tipidir. Hafızada 4 byte yer kaplar. Kullanılabilecek uç degerler +2,147,483,647 ile -2,147,483,648 dir. Long tipinde bir degişken tanımlamak için DefLng bildirimini veya degişken sonunda & karakterini kullanabiliriz. 
Örnek :
Private Sub Form_Load()
DefLng A-B
 Bölüm=50000 
 cıkan&=600000
 Kalan& = (cıkan / Bölüm ) * 10000
 End Sub
 
Single : 
    Tam sayı olmayan küsüratlı sayılar için kullanabilecegimiz bir veri tipidir. Kayan-noktalı sayı olarak isimlendirilir. Single tipindeki veriler bellekte 4 byte yer kaplarlar. Nekatif sayılar için alabilecegi aralık -3.402823E38 ile –1.401298E-45 ,pozitif sayılar için alabilecegi aralık 1.401298E-45 ile 3.402823E38 arasındadır.Single tipinde veri tanımlamak için DefSgn bildirimi veya degişken sonuna ! karakteri konur. 7 haneye kadar hassastır.Daha sonrası yuvarlatılır. 
Örnek :
 Private Sub Form_Load()
 DefSgn A-B
 Bölüm=50000 
 Cıkan!=600000
 End Sub
 
Double : 
    Visual Basic’te kullanılabilecek en büyük sayısal degerlerin veri tipidir. Hafızada 8 byte yer kaplarlar. 16 haneye kadar hassastırlar. Maximum alabilecegi degerler pozitif sayılar için 4.94065645841247E-324 ile 1.797693134862232E308 , nekatif sayılar için de -1.797693134862232E308 ile -4.94065645841247E-324 arasındadır. DefDbl bildirimi veya # sembölü ile double tipinde degişkenler tanımlanabilir 
Örnek :
 Private Sub Form_Load()
 DefDbl A-K
 Darı=50000 
 Bugday=600000
 Arpa=340.56
 End Sub

Ders 3:

Veri Tipleri 2


Currency :
    Sayısal tipdeki veriler için tanımlanmış özel bir veri tipidir.Hafızada 8 byte yer kaplarlar. 4 hane ondalık kısmı olmak üzere toplam 19 haneden oluşur.(nokta hariç) Alabilecegi maximum degerler -922,337,203,685,477.5808 ile 922,337,203,685,477.5807 arasındadır. @ sembolü veya DefCur bildirimi ile Currency tipinde degişken’ler tanımlanabilirler.

Örnek :
Private Sub Form_Load()
Dim Maas As Currency , Borc As Currency
Maas = 500000000 
Borc = 68000000
Zayi@ = 340000.56
End Sub
Date : 
    Tarih türündeki bilgileri kullanmak için oluşturulmuş bir veri tipidir. Hafızada 8 byte yer kaplarlar. 1 Ocak ile 31 Aralık 9999 arasındaki tarihleri kullanabilirsiniz. DefDate bildirisi ile tarih türünde degişkenler tanımlayabiliriz. 
Örnek :
Private Sub Form_Load()
Dim Dogum_tarihi As Date , Evlenme_Tarihi As Date
Dogum_tarihi =#Dec,9,1977#
Evlenme_Tarihi=#May,15,1998#
End Sub

Boolean :
    Mantıksal veri tipleri için kullanılır. İki seçenekten birisini alabilir.Bunlar True veya False degerleridir. Bellekte 2 byte yer işgal ederler.Boolean tipindeki bir degişkeni tanımlamak için DefBool sözcügü kullanılır.

Örnek :
Private Sub Form_Load()
Dim Durum As Boolean , Duyum As Boolean
Durum = True
Duyum = False
End Sub

Byte :
    O ile 255 arasındaki tamsayıları ifade etmek için kullanılabilecek veri tipidir.DefByte deyimi ile byte tipinde degişkenler tanımlanabilir.

Örnek :
Private Sub Form_Load()
Dim Durum As Byte , Duyum As Byte
Durum =23
Duyum = 143
End Sub

String :
    Metin türü bilgileri saklamak için kullanılabilecek veri türüdür. 16 bitlik versiyonda 0 ile 65538 arasında , 32 bitlik versiyonda ise 0 ile 2,000,000,000 arasında karakter alabilir. String türünde degişken tanımlamak için Defstr veya $ sembolü kullanılır.

Örnek :
Private Sub Form_Load()
Dim Adi As String , Soyadi As String
Adı =”Kemal”
Soyadı = ”Tas”
No$="1323970067"
End Sub

Variant :
    Bu tipte tanımlanmış bir degişkene herhangi bir tip’te veri yüklenebilir.Yani ne tür bir veri girecegimizi bilmedigimiz degişkenleri Variant tipinde tanımlamalıyız. Bu tür degişkenler hafızada 16 byte tan fazla yer kaplarlar. DefVar bildiri sözcügü ile Variant türünde degişkenler tanımlıyabiliriz.

Variant türünde degişkenler tanımlamak fazla kullanışlı degildir.Çünki hafızada fazla yer kaplarlar.

Örnek :
Private Sub Form_Load()
Dim Ad As Variant , Maas As Variant , Tel As Variant
Dim Dogum_tarihi As Variant
Ad="Aydın Kale"
Maas=200000
Tel="500-45-00"
Dogum_tarihi=#Apr,3,1970#
End Sub

Ders 4:

 Veri Yapıları

Const :
    Bunlar program içinde degeri degiştirilemeyen sabitlerdir. Public ve Private tipinde sabitler tanımlanabiliilir. Public sabitlere tüm modüller içinden ulaşılabilir.Private türündeki sabitler ise sadece tanımlandıkları modül içersinde geçerlidirler.Ayrıca Visual Basic içinde tanımlanmış çok sayıda sabit vardır. Bunlara CONSTANT.TXT dosyasını açarak inceleyebiliriz.

Örnek :
Const sehır=”Istanbul”
Const Ulke="Turkey"
Const posta_kodu=34650
Const tek_kod=212

Type - End Type Yapısı :
    Type yapısını kullanarak programıcı farklı veri tiplerini kullanarak kendi veri yapısını oluşturabilir. Bu C deki Struct yapısına benzetilebilir. Bu yeni veri tipine record adı verilir. Herhangi bir modülün Declarations kısmında aşagıdaki gibi bir tanımlama yapabiliriz.

Örnek :
Type Ogrencı
Ad As String *10
Soyad As String *12
Not As Byte
Kredi As Integer
End Type
'Ogrencı veri tipi toplam hafızada 25 byte yer kaplamaktadır. Bu veri tipini kullanmak için 'Ogrencı tıpınde degişkenler tanımlamak gerekmektedir. 
Private Sub Form_Load()
Dim A As Ogrencı
Dım B As Ogrencı
'Bu degıskenlere bilgi atamak aşagıdaki şekildeki gibidir.
A.Ad="Ali" 
A.Soyad ="Armer" 
End Sub

 String türü degişkenlere sabit bir uzunlukta yer ayırmak istersek aşagıdaki şekilde bir tanımlama yapmalıyız.

Dim Name As String *12
Dim Address As String *50

Ders 5:

 Diziler

    Aynı tür bilgileri bellekte tutmak için kullanabilecegimiz listelere dizi adı verilir. Dizi kullamanın avantajı aynı tür bilgiler bir listede tutularak daha hızlı işlem yapılabilmesi saglanmış olacaktır.Visual Basic'de dizi şu şekildedir
Dizi_adı(İndis)
olacaktır.

Örnek:

Private Sub Form_Load()
Dim ad(2) As String
Dim no(2) As Integer
ad(0) = "adnan"
ad(1) = "ahmet"
ad(2) = "ebru"
 no(0) = 133
 no(1) = 56
 no(2) = 67
 End Sub


    Bu örnek'te ad ve no olmak üzere iki adet dizi tanımlanmaktadır. ad dizisi string türünde bilgileri tutacak ve no dizisi ise integer türündeki bilgileri saklayacaktır. Görmüş olgunuz gibi dizilere bilgi atama şekli

dizi_adı(indis_sırası)=atanacak_bilgi
şeklindedir.

Eger diziyi sıfırdan degilde bir den itibaren başlatmak istersek diziyi tanımlamadan önce Option Base 1 satırını eklemeliyiz.

    Burada dizi indisleri sıfırdan başlayarak tanımlama yaparken bizim belirtigimiz degere kadardır. Yani bizim bu dizilere atayabilecegim veri sayısı diziyi tanımlarken belirtdigimiz indis degerinden bir fazla olacaktır.

Eger deger atama yaparken belirttigimiz sınırların dışına çıkarsak hata oluşur. Dizilere deger atarken dizi sınırlarını kontrol etmekle olası bir hatayı önlemiş oluruz

Ders 6:

 Statik Diziler

    Bu tip dizilerde kullanılacak yer sayısı sabittir. Bu tip diziler sadece tanımlandıkları modül içersinde kullanılabilirler. Statik dizi şu şekilde tanımlanabilir
Dim dizi_adı(sayi) As Veri_Tipi
    Tüm proje içinde kullanılacak bir dizi tanımlanmak isterse standart modülün General,Declarations bölümünde yukarıdaki şekildeki gibi tanımlanmalıdır

Örnek :

Option Base 1
Dim a(5) As Integer
Private Sub Command1_Click()
Text1.Text = a(1) + a(2)
End Sub
Private Sub Form_Load()
a(1) = 10
a(2) = 20
End Sub


    Bu örnekte görüldügü gibi projenin general,declarations kısmında a() dizisi tanımlanıyor.Bu dzi tanımlanmadan önce dizi indislerinin 1 den itibaren başlıyacagını belirten Option Base1 satırı koda dahil edilmiştir. Form1 yüklendiginde bu dizinin ilk elemanınna 10 sayısı ikinci elemanına 20 sayısı atanıyor. Eger kullanıcı Command1 isimli butona tıklarsa dizinin ilk ce ikinci elemanları toplanarak Form üzerinde Text1 adlı nesnenin Text özelligine atanıyor. Yani TextBox'ın bu sayıların toplamını göstermesi sağlanıyor

Ders 7:

 Dinamik Diziler

    Bu tip dizilerde kullanılacak yer sayısında bir sınırlama yoktur. Bu tip diziler ilk başta şagıdaki şekildeki gibi bir tanımlamaya ihtiyaç duyarlar.
Dim dizi_adı( ) As Veri_Tipi
    Daha sonra bu dizi kullanılacak iken botunu belirtmek gerekir bunun içinde aşagıdaki gibi bir tanımlama yapılmalıdır.
ReDim dizi_adı(boyut ) As Veri_Tipi
    Artık bu veri dizisini projemiz içinde kullanabiliriz.

Örnek :

Option Base 1
Private Sub Form_Load()
Dim s() As String
End Sub
Private Sub Command1_Click()
ReDim s(10) As String
s(1) = "Selam "
s(2) = "Ayşe"
Text1.Text = s(1) + s(2)
End Sub

    Bu dizi tanımlanmadan önce dizi indislerinin 1 den itibaren başlıyacagını belirten Option Base1 satırı koda dahil edilmiştir. Form1 yüklendiginde s adlı bir dinamik dizi tanımlanmaktadır. Kullanıcı Command1 isimli butuna tıkladıgında s dizisinin boyutu belirtilerek yeniden tanımlanmıştır. Bu dizinin ilk elemanınna "Selam " degeri ikinci elemanına "Ayşe" degeri atanıyor. Dizinin ilk ve ikinci elemanları toplanarak Form üzerinde Text1 adlı nesnenin Text özelligine atanıyor. Yani TextBox'ın bu degerlerin toplamını göstermesi sağlanıyor.

Örnek :

Option Base 1
Private Sub Form_Load()
 Dim s() As String
 End Sub
 Private Sub Command1_Click()
 ReDim s(10) As String
 s(1) = "selam"
 s(2) = "fatih"
 Text1.Text = s(1) + s(2)
 End Sub
 Private Sub Command2_Click()
 ReDim s(5) As String
 s(2) = "fatih"
 Text1.Text = s(1) + s(2)
 End Sub

    Bu örnekte yukarıdaki örnekten tek farklı yan olarak bir Command butonun arkasına yazılmış kod bulunuyor. Eger kullanıcı Command1 adlı butondan sonra bu butona tıklarsa ne olacak ona bakalım. Command2 butonuna tıklanıldıgında s() dizisi tekrardan boyutu 5 olrak tanımlanıyor. s() dizisine daha önce atamış bütün degerler siliniyor. Yani s() dizisi bir nevi boşaltılıyor ve yeniden boyutlandırılıyor. Eger s() dizisine daha önce atanmış degerler korunmak istenirse aşagıdaki şekildeki gibi bir tanımlama yapılmak zorundadır.
ReDim Preserve s(boyut) As Veri_tipi

 

Ders 8:

Tip Döşümleri


    Visual Basic'de kullandıgımız sayısal değişkenleri diger veri tiplerine dönüştürebiliriz. Bu işlemi yapan fonksiyonlara tip dönüşüm fonksiyonları adı verilir. Tip dönüşüm fonksiyonları aşagıda verilmiştir.

Fonksiyon Geri Dönen Deger Yaptıgı İşlem

CBool(ifade) Boolean Matemetiksel ifadeyi Boolean türüne dönüştürür.
CByte(ifade) Byte Matemetiksel ifadeyi Byte türüne dönüştürür.
CCur(ifade) Currency Matemetiksel ifade Currency türüne dönüştürür.
CDate(ifade) Date Matemetiksel ifade Date türüne dönüştürür.
CDbl(ifade) Double Matemetiksel ifade Double türüne dönüştürür.
CDec(ifade) Decimal Matemetiksel ifadeDecimal sayıya dönüştürür.
CInt(ifade) Integer Matemetiksel ifade tam sayıya dönüştürür.
CLng(ifade) Long Matemetiksel ifade Long türüne dönüştürür.
CSng(ifade) Single Matemetiksel ifade Single türüne dönüştürür.
CVar(ifade) Variant Matemetiksel ifade Variant türüne dönüştürür.
CStr(ifade) String Matemetiksel ifade String türüne dönüştürür.

Aşagıda çeşitli örneklerle tip dönüşümleri açıklanmaya çalışılmıştır.

Örnek1:

A=10 , B=5 , C=10 , D=0
check = CBool(A < B) 'check=False
check = CBool(A > B) 'check=True
check = CBool(A = C) 'check=True
check = CBool(D) 'check=False
check = CBool(B) 'check=True

Örnek2 :

A=10 , B=5 , C=0 
 check = CBytel(A < B) 'check=0
 check = CByte(A > B) 'check=1
 check = CByte(A = C) 'check=0

Örnek3 :

A=1 , B=2 , C=36000 , D=36001
check = CDate(A) 'check=12/31/1899
 check = CDate(B) 'check=1/1/1900
 check = CDate(C) 'check=7/24/98
 check = CDate(D) 'check=7/26/98

Örnek4 :

A=2.4 , B=2.5 , C=2.6 , D=3.5
check = CInt(AB) 'check=2
 check = CInt(B) 'check=2
 check = CInt(C) 'check=3
 check = CInt(D) 'check=4

 

Ders 9:

 Aritmetiksel Operatorler :

+ , - , * , / , \ , ^ ,Mod , &

    Genel olarak matematiksel işlemlerde kullanılan operatörlerdir. Bunlara kaynaştırma “&” operatörünü de ilave edebiliriz. Şimdi bu operatörleri açıklayalım.

    + Operatörü :
    Bu operatör ile verilen iki veya daha fazla ifade toplanabilir.Genel yazılışı aşagıdaki şekilde gibidir.
Sonuc = Ifade1 + Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.(Eger kaynaştırma yapılmamış ise)
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Eger Ifade1 ve Ifade2 strıng türünde veriler ise + operatörü kaynaştırma yapar. Yani Ifade2 yi Ifade1’ın sonuna ekler.Aşagıda Çeşitli örnekler verilmiştir.

Örnek :

Sonuc=13+45 'Sonuc=58
Sonuc=1378+56.78+435.908 'Sonuc=1870.688
A=89,B=3456
Deger=A+B ' Deger=3545
Ad="Ebru"
Soyad=” Kayacı”
Dim Name As String
Name=Ad+Soyad 'Name=”Ebru Kayacı”
 

 B-Operatörler :

    Matematik’de kullanılan çıkartma opratörüdür. Birinci ifadede verilen degerden ikinci ifadeyi çıkarır.
Genel yazılışı aşagıdaki şekildeki gibidir.
Sonuc=Ifade1 – Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Aşagıda çeşitli örneklerle – (çıkarma )operatörü açıklanmaya çalışılmıştır

Örnek :

Sonuc=3475.45-3445.90 'Sonuc = 29.55
Deger=45-788-23 'Deger = - 766
Son=190,Ara=47
Son1=Son-Ara ' Son = 143


* Operatörü :
    Matematikdeki çarpma operatörüdür. Verilen iki sayıyı çarpar. Genel yazım şekli aşagıdaki şekilideki gibidir
Sonuc=Sayı1 * Sayı2
Burda Sonuc mutlaka sayısal bir degerdir.
Sayı1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Sayı2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Aşagıda çeşitli örneklerle çarpma operatörü açıklanmıştır.

Örnek :

Sonuc=34 * 9 'Sonuc = 306
Deger = 87 * 12 'Deger = 1044
A=5,B= 56
C=A * B 'C = 280


/ Operatörü :
    Matematikdeki bölme operatörüdür. Verilen ilk sayıyı ikinci sayıya böler. Genel yazım şekli aşagıdaki şekilideki gibidir.
Sonuc=Ifade11 /Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.Ifade2 sıfırdan farklı bir deger olmalıdır. Yoksa sıfıra bölme hatası oluşur.
Aşagıda çeşitli örneklerle bölme operatörü açıklanmıştır.

Örnek :

Sonuc=34 / 9 'Sonuc = 3.777778
Deger = 60 / 12 'Deger = 5
A=5,B= 56
C=B / A 'C = 11.2
\ Operatörü : 
Matematikdeki bölme operatörüdür. Verilen ilk sayıyı ikinci sayıya böler. Ancak sonuc mutlaka bir tam sayı degeridir. Bölüm küsüratlı ise sayının kusuratını atar.Genel yazım şekli aşagıdaki şekildeki gibidir. 
Sonuc=Ifade1 \ Ifade2 
Burda Sonuc mutlaka sayısal bir degerdir. 
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır. 
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.Ifade2 sıfırdan farklı bir deger olmalıdır. Yoksa sıfıra bölme hatası oluşur. 
Aşagıda çeşitli örneklerle tam bölme operatörü açıklanmıştır 
 
Örnek : 
Sonuc=34 \ 9 'Sonuc = 3
Deger = 60 \ 12 'Deger = 5
A=5,B= 56
C=B \ A 'C = 11

^ Operatörü :
Matematikdeki üs operatörüdür. Verilen ilk sayının ikinci sayı kadar kuvvetini (üssünü) alır. Genel yazım şekli aşagıdaki şekilideki gibidir.
Sonuc=Ifade1 ^ Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Aşagıda çeşitli örneklerle bölme operatörü açıklanmıştır.

Örnek :

Sonuc=34 ^ 9 'Sonuc = 6.071699276646e+13
Deger = 60 ^ 2 'Deger = 3600
A=5,B= 5
C=B ^ A 'C = 3125
Mod Operatörü : 
Matematikdeki mod alma operatörüdür. Verilen ilk sayının modunu ikinci sayı göre alır. Genel yazım şekli aşagıdaki şekilideki gibidir. 
Sonuc=Ifade1 Mod Ifade2 
Burda Sonuc mutlaka sayısal bir degerdir. 
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır. 
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır. 
Aşagıda çeşitli örneklerle Mod operatörü açıklanmıştır. 
 
Örnek : 
Sonuc=34 Mod 9 'Sonuc = 7
Deger = 60 Mod 2 'Deger = 0
A=5.4,B= 57
C=B Mod A 'C = 2
D= 57 Mod 5.5 'D = 3
E=90.5 Mod 6 'E = 0
E=90.2 Mod 6 'E = 0
E=90.7 Mod 6 'E = 1

& Operatörü :
Bu operatör kaynaştırma operatörüdür. String türü ifadelerle matematiksel ifadeleri kaynaştırmada kullanılabilir. Genel yazım şekli aşagıdaki şekilideki gibidir.
Sonuc=Ifade1 & Ifade2     Burda Sonuc string veya variant türünde bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayı veya bir metindir.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=34 & 9 'Sonuc = 349
Deger = 60 & 2 'Deger = 602
A=5.4,B= 57
C=B&A 'C = 575.4
D= 57 & 5.5 'D = 575.5
E=90.5 & 6 'E = 90.56
E=9.2 &6 'E = 9.26
E=90.7 & 6.6 'Hata oluşur
E="Hakan"&" Ayşe" 'E = "Hakan Ayşe"

VisualBasic Programlamaya Giriş

Visual dillerden biri olan VisualBasic Programlama dili ile istediğiniz programları yapmak artık zor değil.Programlarda kullanılabilecek standart işlemler birer kontrol olarak tasarlanmış olup programcının kullanımına sunulmuştur.Örneğin;Personel bilgileri girilen bir program yapılırsa,personelin adı,soyadı ,doğum yeri ve tarihi gibi bilgilerin girileceği Edit kutusu,Kullanıcının neyi girmesi gerektiğini belirten Label,değişik seçeneklerden birini seçme imkanı sağlayan aşağı doğru açılan ComboBox kutusu,komut butonları ,Personelin bir listesini gösterecek bir Liste kutusu ( ListBox ).Bunları kolayca forma taşıyarak programızın ekranını tasarlayabiliriz.Tek yapılması gereken Form üzerindeki kontrolleri oluşturmak için Ana formun üzerinde bulunan Componentlerden ilgili ikonları seçmek ve formumuza tıklamak.

Form Tasarımı

Programlarda kullanılabilecek standart işlemler birer kontrol olarak tasarlanmış ve programcının kullanımına sunulmuştur.Örneğin bir listeleme programında personelin adı , soyadı , doğum yeri , doğum tarihi gibi bilgiler için birer boş kutu ( Text Kutusu) ,Kullanıcının neyi girmesini belirten yazılar ( Label ) , Meslek seçimi için daha önceden bilgilerin girildiği aşağı açılan bir liste ( ComboBox ) , Komut Düğmeleri ( Command Button ) , Mevcut Personel listesini gösterecek liste kutusu ( Listbox ) ; programda bulunabilecek seçeneklerdendir.İşte bu tip işleri yapmak için hazır kontrollerimiz bulunmaktadır.Bu kontrolleri uygun şekilde formumuza yerleştirerek tasarlayabiliriz.

Visual Basic programını çalıştırdığınızda ilk olarak yapacağımız programın türünü soran pencere çıkacaktır.Penceredeki ilk seçenek olan Standart EXE normal programlar için kullanılır.Bu seçeneği işaretledikten sonra düğmesine basınız.Ekranda boş bir form oluşacaktır.Ekranda görülebilen en önemli üç bileşen şunlardır.

·         Form Penceresi

·         Toolbox

·         Properties

Üzerinde Form1 yazan form penceresi programı oluşturacağımız ekrandır.Programın ekran görüntüsü bu form üzerinde oluşturulur.Programımızın ekranında neler bulunacağı Toolbox penceresindeki simgelerle belirlenir.Properties penceresi ile de Toolbox'tan Form üzerine yerleştirilen kontrollerin bazı özellikleri belirlenir.

Properties Penceresi ile Özellikleri Ayarlama

Bir örnekle Properties Penceresinin özelliğine bakalım.Toolbox'tan Formumuza 4 adet Label , 2 adet Text Kutusu , 1 adet Combo1 , 1 adet List1 ve 1 adet Command Button ekleyelim.

Şimdi Label1 nesnesini seçin ve F4 tuşuna basınız.ekrana Label1 nesnesine ait özellikleri gösteren pencere gelir.Bu pencere Properties penceresidir ve bütün kontrollerin özellikleri buradan değiştirilir.Bu pencerede sol tarafta gördüğümüz ; Color, Height gibi kelimelere properties ( Özellikler ) diyoruz.Sağ taraftaki 255 , ( none ) gibi yazılarda bu özelliğin şu andaki değerini göstermektedir.Her nesnenin farklı ve ortak özellikleri vardır.

Şimdi bu özelliklerin değerlerini değiştirelim.Önce Caption yazan özelliğin karşısındaki Label1 kelimesi yerine Adı kelimesini yazınız.Aynı anda Formumuzun üzerindeki Label1 üzerinede yazıldığını göreceksiniz.Bu özelliği Formumuzdaki List1,Combo1,Command Button'larada uygulayınız.Şimdi Combo kutusuna meslekleri girelim.Bunun için Combo1 nesnesini seçin ve F4 tuşuna basınız.Açılan menüde List özelliğinin yanındaki tuşa basınız.Ekranımıza boş bir liste gelecektir.Buraya Meslekleri yazınız.Bir alt satıra geçmek içinde Ctrl + Enter tuşuna basınız.

Programı Çalıştırma

Artık yukardaki programımızın ekran tasarımı hazır.Programa hiç kod yazmadan çalıştıralım.Bunun için F5 tuşuna basmalısınız.Artık tasarım ortamında değil çalışma ortamındasınız.Hiç kod yazılmadan kutulara yazı yazmayı , birinden kopyalayıp diğerine yapıştırmayı , formu boyutlandırmayı yapabildiğimizi göreceğiz.

Kod Yazma

İlk önce Programdan çıkış için gerekli kodun ne olduğunu görelim.Kodu herhangi bir yere değil o nesne üzerinde yapılabilecek değişik işlemlere göre ilgili yere yazmamız gerekir.Örneğin mouse butonun üzerinden geçtiği zaman mesaj verilmesi isteniyorsa bu kodu butonun MouseMove olayına yazılması gerekiyor.Şimdi butona basıldığı zaman programdan çıkılması için yapılması gerekenleri görelim.Bunu gerçekleştirmek için Butonun Click olayına kodumuzu yazacağız.( Butonun üzerine 2 kez tıklarsanız Click olayına gidersiniz ).Buraya Sub-End Sub bloğu arasına programdan çıkmak için End yazınız.Diğer olaylara ulaşmak için ise kod pencerelerinin sağ üst köşesindeki kutuyu kullanacağız.

Şimdi Text1.Text 'te yazılan personelin adının ListBox'a eklenmesini görelim .Bunun için Butonun Caption'una Ekle yazalım.Daha sonra ekle butonuna 2 kez tıklayarak Click olayına geçelim.Daha sonra Sub-End Sub bloğuna aşağıdaki kodu yazacağız.

List1.AddItem Text1.Text

Listeden bir elemanı silmek için Command2 Butonun Caption'una Sil yazalım. üzerine 2 kez tıklayarak Click olayına ulaşalım ve aşağıdaki kodu yazalım.

List1.RemoveItem List1.ListIndex yazarak F5 tuşu ile programı çalıştırınız.

Böylece bir programın formunun nasıl tasarlanacağı , form üzerindeki kontrollerin özelliklerinin ( Properties ) nasıl değiştirileceği ve gerekli kodun hangi olaylara ( Events ) nasıl yazılacağını öğrenmiş olduk.Yapacağınız bütün programlarda bu yolu izleyeceksiniz.

Hataları Düzeltme

Yaptığınız programlarda eğer bir elemanı listeden seçmeden silmeye çalışırsanız.VisualBasic sizi aşağıdaki gibi uyaracaktır.

Run-time error'5'
Invalid procedure call or argument yazan form gelecektir.

VB programındaki bir prosedürün geçersiz bir parametre ile çağrıldığını belirten bir hata mesajı veriyor.İsterseniz End düğmesini kullanarak programı sonlandırabilirsiniz.Bunun yerine Debug düğmesini kullanarak hatanın nerede olduğunu gösterebilir ve hatayı düzelttikten sonra tekrar kaldığı yerden devam etmesini sağlayabilirsiniz.Yukarıda listede seçili eleman olmadığı halde seçili eleman silinmeye çalışmasıdır.Bunu önlemek için Sil Butonunun Click olayına aşağıdaki kodu ekleyelim.

If List1.ListIndex < 0 Then
MsgBox("Önce silinecek elemanı seçiniz.")
Else
List1.RemoveItem List1.ListIndex
End If

VisualBasic Ekranı ve Menüleri

VisualBasic Ekranı

1. VB'e ait menüler ve araç çubukları.
2.Kullanıcının kendi programını oluşturması için gerekli form.
3.Hazır öğeleri programa yerleştirebilmek için gerekli olan Toolbox 4.Form üzerine yerleştirilen kontrollerin özelliklerini değiştirmek için kullanılan Properties penceresi
5.Projede bulunan dosyaları gösteren Project Explorer penceresi
6.Program kodu yazmak için kullanılan kod penceresi

1-VisualBasic'in Ana Formu

İlk olarak VB'nin kendine ait olan aşağıdaki form görülür.Görüldüğü gibi VB diğer programlardan farklı olarak formu sadece menülerden ve başlık çubuğundan oluşur.

2-Programcı Formu

VB masa üstünde bulacağımız diğer önemli bir formda aşağıdaki gibi bir form penceresidir.Bu form programa ait kullanıcı arabiriminin oluşturulduğu yerdir ve formun görüntüsü program çalıştığı zamanda görülecektir.
Diğer dillerde programın ekran görüntüsü program çalışması esnasında oluşturulurken VB'de bu iş tasarım esnasında da yapılabilmektedir.Programda birden fazla formda bulunabilir.

Form üzerine alınan her kontrol elemanın özellikleri properties penceresinde gözükür.İstendiğinde birden fazla form ile çalışabilir.
Eğer form penceresini ekranda göremiyorsanız ;
1-Şu an açık olan proje olmayabilir.Yeni bir proje başlatın veya varolan bir projeyi açınız.
2-Programınız çalışıyor olabilir.Run menüsünden End komutunu seçiniz.
3-Form kapatılmıştır.Project penceresinden formunuzu çift tıklayınız.Eğer Project penceresini göremiyorsanız View menüsünden Project Explorer seçeneği ile önce bu pencereyi gösteriniz sonra bu pencereden formunuza ait seçeneği çift tıklayınız.

3-ToolBox

Form üzerine yerleştirilecek kontrollerin tamamı Toolbox penceresinde yer alır.Bu pencereye yeni tab eklemek , silmek , ad değiştirmek gibi işlemler uygulanabilir.Form üzerine yerleştirilmek istenilen kontrolü bu pencereden seçiniz ve formunuza bir dikdörtgen şeklinde fare ile çiziniz.Aynı işlemi çift tıklama ile de yapabilirsiniz.VB'nin kontrolleri sadece Toolbox penceresinde görülenlerden ibaret değildir.VB ile birlikte gelip de bu pencerede bulunmayan kontrollerde vardır.Bunları Toolbox penceresine eklemek için Project menüsündeki Components komutu tıklanır.Böylece ekleyebileceğiniz kontrolleri gösteren pencere açılacaktır.Bu pencerede VB'ye ekleyebileceğiniz bütün kontroller bulunur.Bunlardan bir kısmı VB ile birlikte gelirken büyük bir kısmı da bilgisayarımıza kurulu olan diğer programlar aracılığıyla gelir.Bunlardan birini programa eklemek için onun başındaki kutuyu seçmeniz yeterlidir.Ayrıca bir listede yer almayan OCX dosyalarıda Browse düğmesi aracılığı ile bulunup eklenebilir.

4-Properties ( Özellikler ) Penceresi

Form üzerine yerleştirilen elemanların tümünün özelliklerini properties penceresinde yer almaktadır.Form üzerine bir kontrolü tıkladığınız zaman ona ait özellikler Properties penceresinde görüntülenir.Seçili olan elemanın properties pencerisine yansıyan özellikleri hem alfabetik hemde kategorik olarak listelenebilir.
Kategorik olarak getirilen bölümler şunlardır :
Appearance ( elemanın görünüşü ile ilgili özellikler ) , behavior ( elemanın durumu , davranışı ile ilgili özellikler ) , dde , font ( font ile ilgili özellikler ) , misc ( bir gruba dahil edilemeyen farklı farklı özellikler ) , position ( elemanın boyutları , form ve ekran üzerindeki konumları ile ilgili özellikler ) , Scale ( Elemanın bulunduğu aralık ile ilgili özellikler ).Eğer properties penceresini ekranda göremiyorsanız View menüsünden Properties Windows komutunu seçebilir veya kısaca F4 tuşuna basabilirsiniz.

5-Project Penceresi

<<<

Bu pencerede programa dahil edilen form , module , usercontrol vb. gibi elemanların listesi yeralır.Bu pencere aracılığıyla istenilen bir forma geçiş yapmak yada istenilen bir formu yada modülü forma dahil etmek mümkün olmaktadır.Bu pencerenin sol üst kısmında yer alan 3 adet düğmenin 1.si seçili nesne ile ilgili kod penceresini açar , 2.si seçili nesnenin form tasarımını gösterir , 3.süde aynı cinsten olan form yada modülleri bir klasör prensibiyle gösterir.

·         Eğer bu pencereyi ekranda göremiyorsanız View menüsünden Project Explorer komutunu seçiniz.
Projeye dahil edilen bir form veya modülü programdan çıkarmak için o nesneyi Project Explorer penceresinden seçin ve farenin sağ tuşu ile açılan pencereden Remove komutunu seçiniz.
Projeye yeni bir dosya eklemek için de aynı pencerede sağ fare tuşu ile açılan pencerede bulunan Add menüsü altındaki seçenekler kullanılan .

6-Kod Penceresi

<<<

Visual Diller programcının kendi kodunu yazacağı bir editör sunarlar.Bu editörler Windows'un kullandığı hemen hemen tüm metodları destekler.Program yazarken genellikle kodlar form üzerine yerleştirilmiş kodların olaylarına yazılır.Örneğin bir komut butonuna tıklandığında çalışmasını istediğimiz kodu onun Click olayına yazmamız gerekir.Herhangi bir kontrol için kod yazmamız gerekiyorsa ; o kontrolü form üzerinde çift tıklamamız veya o kontrolü seçtikten sonra F7 tuşuna basmanız sizi o kontrole ait kod penceresine getirecektir.Bu durumu aşağıdaki örnekte daha iyi kavrayacağız.

Örnek: Bu örnekte Formumuzun üzerine ToolBox penceresinden Command1 Button yerleştirelim.Command1 kontrolüne çift tıklayarak kod penceresini açalım.Sub-End Sub arasına şu kodu yazalım.
MsgBox("Bahadır Şahin'den herkese selamlar ")
Kod penceresinin sağ üst köşesindeki listeyi aşağı tarafa doğru açarsanız o kontrole ait olayların listesini görürsünüz.Bu listeden bir olayı seçtiğiniz o olaya ait program başlığı da VB tarafından otomatik olarak yazılacaktır.

Kod Penceresinde Önemli Özellikler

Diğer Visual Dillerde olduğu gibi VisualBasic'te de herhangi bir kontrol elemanının adını yazıp "." nokta karakterine bastığınız zaman kursorun bulunduğu noktadan itibaren aşağıya doğru bir liste açılır ( yukardaki resime bakınız ).Burada bütün elemanların ortak olarak kullandığı özellikler ve metodlar yer almaktadır.Kullanılacak özellik bu listeden seçilmek suretiyle program satırına dahil edilir.Bu özellik programcıyı bir sürü özelliği ezberinde tutma zahmetinden kurtarır.Aşağı doğru açılan listeden istenilen özellik seçilip " = " karakterine basıldığı zaman bu defa ilgili özellikle kullanılacak ifade aynı metodla gösterilmektedir.Bu özelliğin otomatik olarak kullanılabilmesi için form üzerinde ilgili kontrolün mutlaka bulunması gerekmektedir.

7-Watches - Değişken İzleme Penceresi

Programı yazarken hata yapıldığı zaman veya sonuçların beklenenden farklı çıktığı zaman ; bu gibi durumlarda programdaki değişkenlerin değerlerini takip ederek sorunun nereden kaynaklandığını bulmak gerekir.Bu işlemler için , izlenmek istenen değişkenler Debug - Add Watch menüleri ile tanımlanır.Böylece bu değişkenler Watches penceresine eklenecektir.Bu işlemden sonra programın çalışması kesilerek değişkenlerin durumu bu pencere aracılığı ile izlenebilir.Programın çalışmasını kesmek için Ctrl + Break kullanılabilirsiniz.Kesilmek istenen satırda F9 tuşu ile kesme de bırakılabilir.Program kesildikten sonra F8 tuşuyla programı adım adım çalıştırınız.Böylece değişkenlerin durumunu Watches penceresinde gösterildiğini göreceksiniz.

8-Form Layout Penceresi

VB ekranın sağ alt köşesinde bir monitör resmi ve içinde bir form gösterilir ( Yandaki resme bakınız ) . Bu pencere aracılığı ile formunuzu ekranın istediğiniz konumuna alabilirsiniz.

Object Browser

View - Object Browser menü seçeneği kullanılarak Object Browser penceresine ulaşılır.Bu pencere aracılığıyla gerek VB kütüphanesinde kullanılan tüm veriler gerekse oluşturulan proje ve bu projenin modüllerinin kullandığı tüm tip ve değişkenler hakkında bilgi sahibi olmak mümkündür.Bu pencerenin sol üst köşesindeki combo kutusu aracılığıyla VB kütüphanelerine ulaşılır.Sağdaki liste kutusunda bu kütüphanenin veri sınıfları , soldaki liste kutusunda ise ilgili veri sınıfının içerdiği fonksiyonlar , sabitler ve özellikler yer almaktadır.Pencerenin en altında ise seçili olan verinin tanımı , parametreleri ve bulunduğu kütüphane adı verilmektedir.Şimdi Sol üstteki ComboBox'tan Project1 ' iseçelim.Bu işlem yapıldıktan sonra projenin içerdiği formlar , modüller ve bu modüllerde tanımlı tip ve değişkenler karşımıza çıkmaktadır.

VisualBasic Menüleri

File Menüsü

File Menüsü altındaki seçenekler projede bulunan dosyaları kaydetmeye ve yazdırmaya yarar.
Yeni bir projeye başlamak için bu menüdeki New Project seçeneğini kullanarak açılan pencereden projenin türü seçilir.
Daha önce kaydedilmiş bir projeyi açmak için ise Open Project seçeneği kullanılır.
Kaydetme
VisualBasicte yapılan projeler birden fazla bileşenden oluşabilir.Örneğin bir projede birden fazla form veya modül bulunabilir.Projede bulunan bütün dosyaları kaydetmek için File menüsünden Save Project seçeneği kullanılır.Kullanılan her nesne için bir isim vermeniz istenir.Bir projeyi kaydederken size hem formun adı hem de projenin adı sorulur.Her ikisi içinde aynı ismi kullanabilirsiniz.Ancak birden fazla formunuz varsa her forma ayrı bir isim vermeniz gerekecektir.
File menüsündeki diğer seçenekte Save seçeneğidir.Bu seçenek sadece aktif nesneyi kaydetmeye yarar.Yani projenizde Form1 aktifse form1'i form2 aktifse form2'yi kaydeder.
Derleyerek Çalıştırılabilir Hale Getirme
Yaptığınız VisualBasic'in olmadığı bir bilgisayarda da çalışabilmesi için onu derlemeniz gerekir.Derleme işlemi için File menüsündeki Make Project1.exe seçeneği kullanılır.Bu işlemden sonra size oluşturulacak dosyanın ismi sorulacaktır.Böylece verdiğiniz isimde EXE dosya oluşturulacaktır.
Yazdırma
Projede bulunan nesneleri yazdırmak istediğiniz zaman File menüsündeki Print ( Ctrl + P ) seçeneği kullanılır.Bir projede bulunan form görüntüsünü , kodu veya kontrollerin özelliklerini yazdırmak isteyebilirsiniz.VisualBasic 3 işlem içinde seçenek sunar.
Eğer aktif nesneyi yazdırmak isterseniz penceredeki Current Module seçeneğini tıklayınız.Eğer projede bulunan bütün nesneleri yazdırmak istiyorsanız Current Project seçeneğini seçiniz.Eğer form görüntüsünün yazdırılmasını istiyorsanız Form Image seçeneğini işaretleyiniz.Kontrollere ait özellikleri yazdırmak isterseniz Form as Text seçeneğini işaretleyiniz.

Edit Menüsü

Edit menüsü aracılığı ile kopyalama , yapıştırma , bulma , değiştirme gibi işlemler yapılabilir.
Bu menüdeki Cut , Copy , Paste , Delete komutları ile kesme , kopyalama , yapıştırma ve silme işlemlerini yapabilirsiniz.

Bul & Değiştir Edit menüsündeki Find seçeneği kullanılır.Bu menüde bulunan Replace komutuda projedeki bir ifadeyi başka bir ifade ile değiştirmek istediğinizde oldukça kolaylık sağlar.Yanlız her iki komutun da çalışabilmesi için kod penceresinin aktif olması gerekir.
Penceredeki Current Procedure seçeneği sadece şu anki alt program içerisinde arama yapar.Current Module seçeneği aktif olan form veya modüle ait bütün kodlar üzerinde arama yapar.Current Project seçeneği ise projede bulunan bütün dosyalar üzerinde arama işlemini yapar.

View Menüsü

View menüsünde bulunan seçenekler projeyle ilgili nesneleri gösterip gizlemek için kullanılır.
Programdaki Nesnelerin Yerini Bulma
Bir forma ait kod penceresini görmek için çift tıklayabileceğiniz gibi menüdeki Code seçeneği de kullanabilirsiniz.Kod ortamındayken ismi geçen kontrolün form üzerinde hangi kontrol olduğunu görmek isterseniz bu menüdeki Object seçeneğini kullanabilirsiniz.
Programda geçen bir değişkenin nerede tanımlandığını görmek isterseniz bu menüdeki Definition seçeneğini kullanabilirsiniz.
Debug İşlemlerinde Kullanılan Pencereler
Bütün Diller Debug ( Hata Ayıklama ) işlemlerini destekler.Bu moda girilerek programlar satır satır çalıştırılabilir ve değişkenlerin aldığı değerler takip edilebilir.BÖylece programda yolunda gitmeyen şeyler çözülmeye çalışılır.Bu işlemleri yaparken bize yardımcı olacak bazı pencereler vardır.
Immediate Window seçeneği ile immediate penceresi görüntülenir.Bu pencere Debug modunda değişkenler üzerinde işlem yapmak için kullanılır.
Local Window seçeneği ile Locals penceresi görüntülenir.Bu pencere de Debug modunda kullanılır.O anda projede bulunan kontrollerin özelliklerine ait değerler bu pencereden izlenebilir.
Watch Window seçeneği ile Watch penceresi görüntülenir.Bu pencerede Debug modunda kullanılır ve Debug - Add Watch menüleri ile eklenen değişkenlerin o anki durumunu gösterir. F8 veya F7 tuşu ile adım adım çalıştırarak değişkenlerin değişimği izlenebilir.
VB Pencerelerini Gösterip / Gizleme
VB ekranında daha önce görüldüğü gibi birden fazla pencere bulunur. Bunlarda çoğu programın geliştirilmesi aşamasında işe yarar.Ancak bazen bunlardan gereksiz olanları kapatmak gerekir.
Project Explorer seçeneği ile projedeki dosyaların gösterildiği kısma ulaşılır.
Project Window seçeneği ile properties penceresi görüntülenir.
Form Layout Window seçeneği ile formun görüntüsünü bir ekranda gösteren pencere görüntülenir.Bu pencere aracılığıyla formu ekranın istenilen bölümüne taşımak mümkündür.
Property Pages seçeneği ile seçili kontrolün Custom Property sayfasına ulaşılır.Bu sayfa özellikleri topluca değiştirme imkanı verir.
Toolboxseçeneğiyle kontrol elemanlarının yer aldığı Toolbox penceresi görüntülenir.
Color Palet seçeneğiyle renk penceresi görüntülenir.
Toolbars özelliği ile araç çubukları gösterilip gizlenilebilir.

·         Debug seçeneği ; araç çubuklarını gizler veya gösterir

·         Edit seçeneği ; edit araç çubuklarını gösterir veya gizler

·         Form editör seçeneği ise form editör araç çubuklarını gösterir veya gizler.

Project Menüsü

Project menüsü altında projeyle ilgili işlemler için bir çok seçenek bulunur.

Add Form seçeneğiyle projeye yeni form eklenir.Böylece program içerisinde birden fazla form oluşturulabilir.Bunları aktif yapabilmek için Form2.Show gibi komutları uygun yerlere yazmanız gerekiyor.
Add MDI Form seçeneğiyle projeye yeni MDI form eklenir.
Add Module seçeneğiyle projeye yeni Module eklenir.Modül dosyaları genellikle tip tanımları ve genel fonksiyomlar için kullanılır.
Add Class Module seçeneğiyle projeye yeni Class Module eklenir.Class Modullerle yeni nesneler tanımlamak mümkündür.
Add User Control seçeneğiyle projeye yeni kullanıcı kontrolü eklenir.VB kullanıcıları kendi kontrollerini oluşturmasına imkan verir.
Add Property Page seçeneğiyle yeni Property Page eklenir.Kullanıcı tanımlı kontrollerle birlikte o kontrollerin özelliklerini belirleyebilecek property sayfaları da tanımlanabilmektedir.
Remove seçeneğiyle seçili olan dosya projeden çıkarılır.
Components seçeneğiyle Toolbox penceresine yeni kontroller eklenebilir.Normalde VB'de kullanılan kontroller Toolbox penceresinde görünenler ile sınırlı değildir. Components menüsü yardımıyla açılan pencereden yeni kontrolleri projenize ekleyebilirsiniz.
Project Properties seçeneğiyle de proje ile ilgili özellikler ayarlanır.Projede birden fazla form varsa , çalışmaya hangi formla başlanacağı , programın kullanacağı yardım dosyasının ismi gibi bazı özellikler bu pencereden belirlenir.

Run Menüsü

Start seçeneğiyle tasarımı tamamlanmış veya çalışması deurdurulmuş bir programı çalıştırır veya kısayol tuşu F5'ten yararlanabilirsiniz.
Start With Full Compile seçeneği programın tamamını kontrol ettikten sonra çalışmaya başlamasını sağlar.
Break seçeneği çalışmakta olan bir programı geçici olarak durdurur.Bazen program çok üzün bir döngüye veya sonsuz döngüye girdiğinde ; program kullanıcı tarafından kapatılamaz.Her zaman bu menüyede ulaşamayabiliriz.Böyle bir durumdaki programı kırmak için kısa yol tuşu olan Ctrl + Break tuşu kullanılır.
End seçeneği ise çalışan bir programın çalışmasını sona erdirir.
ReStart seçeneği de geçici olarak durdurulmuş bir programın çalışmasını baştan başlatır.

Format Menüsü

Aynı Hizaya Getirme

Align Form üzerindeki birden fazla kontrolü aynı hizaya getirmek uğraştırıcı bir iştir.Bunu VB'de kolay yapabilirsiniz.İlgili kontrolleri seçtikten sonra bu menünün alt menüleri ile kontrolleri kolayca hizalandırabilirsiniz.
Lefts seçeneği elemanların sol taraflarını hizalar.
Centers seçeneği ile elemanların merkez noktalarını hizalar.
Rights seçeneği elemanların sağ taraflarını hizalar.
Tops seçeneği elemanların üst taraflarını hizalar.
Middles seçeneği elemanları üst üste getirerek orta kısımlarını hizalar.
Bottoms seçeneği ise elemanların alt taraflarını hizalar.
To Grid ise elemanların form üzerindeki noktalara denk gelmesini sağlar.

Boyutları Eşitleme

Make Same Size : Form üzerindeki birden fazla kontrolü aynı boyuta getirmek için ilgili kontrolleri seçtikten sonra bu menünün alt menüleri ile kontrolleri kolayca boyutlandırabilirsiniz.

Width ile elemanları aynı genişliğe ayarlar
Height ile elemanları aynı yüksekliğe ayarlar
Both ile elemanları aynı yükseklik ve genişliğe ayarlar.

Aralıkları Eşitleme

Horizontal Spacing: Form üzerindeki birden fazla kontrolün arasındaki yatay boşluğu ayarlamak için bu menünün alt seçenekleri kullanılır.İlgili kontrolleri seçtikten sonra bu menünün alt menüleri ile kontrolleri kolayca aralayabilirsiniz.

Make equal elemanların aralarındaki yatay boşlukları eşitler
Increase elemanların arasındaki yatay boşlukları artırır.
Decrease elemanların arasındaki yatay boşlukları azaltır.
Remove elemanların aralarındaki yatay boşlukları tamamen kaldırır.

Vertical Spacing : Form üzerindeki birden fazla kontrolün arasındaki dikey boşluğu ayarlamak için bu menünün alt seçenekleri kullanılır.

Make Equal elemanların aralarındaki dikey boşlukları eşitler.
Increase elemanların aralarındaki dikey boşlukları artırır.
Decrease elemanların aralarındaki dikey boşlukları azaltır.
Remove elemanların aralarındaki dikey boşlukları tamamen kaldırır.
Center In Form Seçeneği form üzerindeki seçili olan elemanları formun ortasına ayarlar.
Order Form üzerindeki kontroller üst üste ise bunları alt alta yada üste alır.Bir kontrol başka bir kontrolün altında kalıpta gözükmüyorsa bu menü seçenekleri kullanılır.
Bring to Front seçeneği alttaki elemanı üste alır.
Send to Back seçeneği üstteki elemanı alta alır.
Lock Controls Seçil elemanları kilitleyerek bunların yerlerinin değiştirilmemesi sağlar.

Tools Menüsü

Add Procudure: Kod penceresine Function ( Fonksiyon ) , Sub ( Alt Program ) , Event ( Olay ) ve Property ( Özellik ) eklemek için kullanılır.
Menü Editor : bu olayla menü tasarım penceresine ulaşılır.Bu pencere aracılığıyla istenilen menü tasarımı yapılabilir.
Options: Bu seçenekle üzerinde çalışılan pencerelerle ilgili çok özellik değiştirilebilir.Açılan Pencerede ;

Auto Syntax Check seçeneği işaretli ise kod penceresinde yazılan program kodları otomatik olarak yazım kontrolüne tabi tutulur.
Require Variable Declaration seçeneği işaretli ise kullanılacak her değişkene tanımlama mecburiyeti getirilir.
Auto List Members seçeneği işaretli ise kontrol elemanlarının adı yazıldığında ilgili özellikler otomatik olarak karşımıza çıkacaktır.
Auto Quick Info seçeneği işaretli ise herhangi bir fonksiyon yazıldığı zaman bu fonksiyonun içermesi gerektiği parametreler otomatik olarak gösterilerek kullanıcıya hatırlatmada bulunur.
Auto Data Tips seçeneği işaretli ise , debug modunda bir değişkenin üzerinde mouse ile durulduğunda VB o değişkenin değerini gösterir.

Options penceresinin Editor Format kısmında kod penceresinde yazılan ifadelerin renkleri ve font büyüklükleri ayarlanır.Ayarlanacak ifade Code Colors listesinden seçildikten sonra Foreground ile yazı rengi , Background ile de zemin rengi ayarlanır.

Debug Menüsü

Bu menü vasıtasıyla program içerisindeki hatalar ayıklanabilir.Bahsedilen hatalar yazım hatası değil Mantıksal hatalardır. PRogram adım adım çalıştırılarak değişkenlerin durumu bu pencere vasıtasıyla incelenebilir.

Step Into : Programı adım adım çalıştırmaya çalışır.Her defasında F8 tuşuna bastığınızda programdaki tek bir satır çalıştırılır.Böylece her satırın etkisi tek tek görülür.
Step Over : Bu seçenekte adım adım çalıştırmaya yarar.Ancak mProsedür çağrılarıda bir satırmış gibi tek satırda işlenir.
Add Watch : Program çalışırken izlenecek değişkenler bu seçenekle eklenir.Eklenen değişkenlerin değeri Debug penceresinde görüntülenir.
Break When Value True seçeneğini işaretlerseniz program çalışır ve bu değişkene sıfırdan farklı bir değer atandığında çalışması kırılır.
Breake When Value Changes : seçeneğini işaretlerseniz program çalışır ve bu değişkenin değeri değiştiği anda çalışması kırılır.
Run to Cursor : Program kursorun bulunduğu yere kadar çalıştırılır ve çalışması kırılır . F8 ve F7 tuşları ile program adım adım çalıştırılır .Yalnız bu tuşlarla uzun döngülerden çıkmak çok zordur.Böyle durumlarda kürsor istenen satıra konumlandırıldıktan sonra Ctrl + F8 tuşlarına basılırsaprogram o satıra kadar gelir ve durur.
Quick Watch : Bu seçenekle sadece seçilen değişkenin veya işlemin o andaki değeri öğrenilebilir.
Edit Watch : Add Watch ile eklenen değişkenleri silmek veya değiştirmek için bu pencere kullanılabilir.
Toggle Breakpoint : Programın bazı satırlarına BreakPoint denilen kesmeler konularak programın oraya kadar çalışıp durması sağlanabilir.
Clear All Breakpoints : Tüm kesme noktalarını siler.

 

Değişkenler ve Veri Tipleri

Visual Basic’de Degişken Tanımlama

    Degişken tanımlarken Visual Basic’te Dim bildiri deyimini kullanabiliriz. Değişkenin tanımlanması hafızada ayrılacak hafıza miktarının belirli olmasını sağlar. Eger degişkenlerin tipini belirtmeden bir kullanım yaparsak bu değişkenlerin Variant tipinde olduğu kabul edilir.Bu da hafızada gereksiz yer kaybına sebep olur.Eger tanımlanan bütün degişkenlerin tiplerinin belli olmasını isterseniz kod penceresinin General,Declarations kısmına
Option Explicit yazılır.

    Ayrıca değişken tanımlarken kullanılabilecek bir başka bildiri deyimide Def- bildiri deyimidir.Bu bildiri deyimi daha genel tanımlamalar yapmak için kullanılır..Def bildiri deyimleri aşagıda verilmiştir.
Def bildiri deyimi projenin general,declarations bölümünde tanımlanmalıdır

DefBool : Boolean tipinde degişken tanımlamak için kullanırız.
DefByte : Byte tipinde degişken tanımlamak için kullanırız.
DefInt : Integer tipinde degişken tanımlamak için kullanırız.
DefLng : Long tipinde degişken tanımlamak için kullanırız.
DefCur : Currency tipinde degişken tanımlamak için kullanırız.
DefSng : Single tipinde degişken tanımlamak için kullanırız.
DefDbl : Double tipinde degişken tanımlamak için kullanırız.
DefDate : Date tipinde degişken tanımlamak için kullanırız.
DefStr : String tipinde degişken tanımlamak için kullanırız.
DefVar : Variant tipinde degişken tanımlamak için kullanırız.

 
Örnek :

Private Sub Form_Load()

Dim Ad As String

Dim Maas As Currency

Dim D_tarihi As Date

Dim Adres As String

Dim Sira As Integer

End Sub



    Burada görmüş olduğunuz gibi 5 adet degişken tanımlanmaktadır.Ad değişkeni string tipinde bir değişkendir.Maaş değişkeni Currency tipinde bir değişkendir.D_tarihi değişkeni Date tipinde bir değişkendir.Adres değişkeni string tipinde bir değişkendir.Sira değişkeni integer tipinde bir değişkendir.

    Aşagıdaki satırları formun general,declarations bölümüne yazalım.

Örnek : 

DefInt A-C

DefStr S

DefVar K

DefDate D

DefSng V


Bu örnekte
A , B, C ile başlayan bütün karakterler Integer türünde olmak zorundadır.
D ile başlayan bütün karakterler Date türünde olmak zorundadır.
V ile başlayan bütün karakterler Single türünde olmak zorundadır.
K ile başlayan bütün karakterler Variant türünde olmak zorundadır.
S ile başlayan bütün karakterler String türünde olmak zorundadır.

Def deyimi dim deyiminden farklıdır. Def ile sadece bir harf yada harf aralıgı belirtilebilir.Burada belirtilen harf ile başlayan bütün değişkenler artık o bildiri deyimindeki tipdedir

Örnek :

Private Sub Form_Load()

Dim ad As String , soyad As String

Dim maas As Currency

End Sub


Bu örnektede ad ve soyad isimli iki degişken string türünde ve maas degişkeni ise Currency tipindedir.
Tip Döşümleri

    Visual Basic'de kullandıgımız sayısal değişkenleri diger veri tiplerine dönüştürebiliriz. Bu işlemi yapan fonksiyonlara tip dönüşüm fonksiyonları adı verilir. Tip dönüşüm fonksiyonları aşagıda verilmiştir.

Fonksiyon Geri Dönen Deger Yaptıgı İşlem

CBool(ifade) Boolean Matemetiksel ifadeyi Boolean türüne dönüştürür.
CByte(ifade) Byte Matemetiksel ifadeyi Byte türüne dönüştürür.
CCur(ifade) Currency Matemetiksel ifade Currency türüne dönüştürür.
CDate(ifade) Date Matemetiksel ifade Date türüne dönüştürür.
CDbl(ifade) Double Matemetiksel ifade Double türüne dönüştürür.
CDec(ifade) Decimal Matemetiksel ifadeDecimal sayıya dönüştürür.
CInt(ifade) Integer Matemetiksel ifade tam sayıya dönüştürür.
CLng(ifade) Long Matemetiksel ifade Long türüne dönüştürür.
CSng(ifade) Single Matemetiksel ifade Single türüne dönüştürür.
CVar(ifade) Variant Matemetiksel ifade Variant türüne dönüştürür.
CStr(ifade) String Matemetiksel ifade String türüne dönüştürür.

Aşagıda çeşitli örneklerle tip dönüşümleri açıklanmaya çalışılmıştır.

Örnek1:

A=10 , B=5 , C=10 , D=0

check = CBool(A < B) 'check=False

check = CBool(A > B) 'check=True

check = CBool(A = C) 'check=True

check = CBool(D) 'check=False

check = CBool(B) 'check=True


Örnek2 :

A=10 , B=5 , C=0 

check = CBytel(A < B) 'check=0

check = CByte(A > B) 'check=1

check = CByte(A = C) 'check=0


Örnek3 :

A=1 , B=2 , C=36000 , D=36001

check = CDate(A) 'check=12/31/1899

check = CDate(B) 'check=1/1/1900

check = CDate(C) 'check=7/24/98

check = CDate(D) 'check=7/26/98


Örnek4 :

A=2.4 , B=2.5 , C=2.6 , D=3.5

check = CInt(AB) 'check=2

check = CInt(B) 'check=2

check = CInt(C) 'check=3

check = CInt(D) 'check=4


Veri Tipleri

Integer :
    Visual Basic’te tam sayı degişkenleri tanımlamak için kullanılır. Hafızada 2 byte yer kaplarlar. Alabilecegi değer aralıgı –32768 ile +32767 arasındadır.DefInt bildiri deyimi ile tanımlanabilirler. Ayrıca bir degişkenin sonunda % karakteri bulunuyorsa bu degişken integer tipindedir.

Örnek :

Private Sub Form_Load()

Dim Maas As Integer

DefInt A-C

Oran% = 100

A_sayı = 100

B_sayı = Oran*A_sayı

C_sayı = B_sayı + A_sayı – 1000

Maas= 32767

End Sub



Eger burada tanımlanan degişkenlere daha büyük sayılar atanırsa overflow oluşur.
Long :
    Daha büyük bir aralıkta integer yani tamsayı tanımlamak için kullanabilecegimiz bir veri tipidir. Hafızada 4 byte yer kaplar. Kullanılabilecek uç degerler +2,147,483,647 ile -2,147,483,648 dir. Long tipinde bir degişken tanımlamak için DefLng bildirimini veya degişken sonunda & karakterini kullanabiliriz.

Örnek :

Private Sub Form_Load()

DefLng A-B

Bölüm=50000

cıkan&=600000

Kalan& = (cıkan / Bölüm ) * 10000

End Sub



Single :
    Tam sayı olmayan küsüratlı sayılar için kullanabilecegimiz bir veri tipidir. Kayan-noktalı sayı olarak isimlendirilir. Single tipindeki veriler bellekte 4 byte yer kaplarlar. Nekatif sayılar için alabilecegi aralık -3.402823E38 ile –1.401298E-45 ,pozitif sayılar için alabilecegi aralık 1.401298E-45 ile 3.402823E38 arasındadır.Single tipinde veri tanımlamak için DefSgn bildirimi veya degişken sonuna ! karakteri konur. 7 haneye kadar hassastır.Daha sonrası yuvarlatılır.

Örnek :

Private Sub Form_Load()

DefSgn A-B

Bölüm=50000

Cıkan!=600000

End Sub



Double :
    Visual Basic’te kullanılabilecek en büyük sayısal degerlerin veri tipidir. Hafızada 8 byte yer kaplarlar. 16 haneye kadar hassastırlar. Maximum alabilecegi degerler pozitif sayılar için 4.94065645841247E-324 ile 1.797693134862232E308 , nekatif sayılar için de -1.797693134862232E308 ile -4.94065645841247E-324 arasındadır. DefDbl bildirimi veya # sembölü ile double tipinde degişkenler tanımlanabilir

Örnek :

Private Sub Form_Load()

DefDbl A-K

Darı=50000

Bugday=600000

Arpa=340.56

End Sub



Veri Yapıları

Const :
    Bunlar program içinde degeri degiştirilemeyen sabitlerdir. Public ve Private tipinde sabitler tanımlanabiliilir. Public sabitlere tüm modüller içinden ulaşılabilir.Private türündeki sabitler ise sadece tanımlandıkları modül içersinde geçerlidirler.Ayrıca Visual Basic içinde tanımlanmış çok sayıda sabit vardır. Bunlara CONSTANT.TXT dosyasını açarak inceleyebiliriz.

Örnek :

Const sehır=”Istanbul”

Const Ulke="Turkey"

Const posta_kodu=34650

Const tek_kod=212


Type - End Type Yapısı :
    Type yapısını kullanarak programıcı farklı veri tiplerini kullanarak kendi veri yapısını oluşturabilir. Bu C deki Struct yapısına benzetilebilir. Bu yeni veri tipine record adı verilir. Herhangi bir modülün Declarations kısmında aşagıdaki gibi bir tanımlama yapabiliriz.

Örnek :

Type Ogrencı

Ad As String *10

Soyad As String *12

Not As Byte

Kredi As Integer

End Type


'Ogrencı veri tipi toplam hafızada 25 byte yer kaplamaktadır. Bu veri tipini kullanmak için 'Ogrencı tıpınde degişkenler tanımlamak gerekmektedir.

Private Sub Form_Load()

Dim A As Ogrencı

Dım B As Ogrencı

'Bu degıskenlere bilgi atamak aşagıdaki şekildeki gibidir.

A.Ad="Ali"

A.Soyad ="Armer"

End Sub



Visual Basic'te Döngü Komutları
    Bu komutlar belirli işlemleri belirli sayıda veya herhangi bir şart sağlanana kadar tekrarlamak amacı ile kullanılırlar. Bu komutlar aşagıda verilmiştir.
For ….. Next Döngüsü
Do While …. Loop Döngüsü
Do Until ……Loop Döngüsü
Do …… Loop While Döngüsü
Do …… Loop Until Döngüsü

    Aşagıdada bu döngülerin nasıl kullanıldıkları açıklanmış ve örneklerle pekiştirilmiştir.

For Next Döngüsü :
    Bütün dillerde bulunan döngü yapısıdır. Genel yazım şekli aşagıdaki şekildeki gibidir.

For sayac=başlangıç To bitiş Step artım
Arada işletilecek komutlar
Next sayac

    Bu döngü sayac baslangıc degerınden bitiş degerine kadar çalıştırılır. Sayaç başlangıc degerinde iken döngü içindeki komutlar işletilir. Next ifadesine gelindiginde tekrar For satırına gelinir. Sayac degeri artım kadar artırılır. Eger Sayac degeri Bitis degerini geçmiş ise Next adımından sonraki adım işletilir. Burada step degerine pozitif veya nekatif bir deger verşilebilir. Eger nekatif deger verilirse sayac her seferinde 1 azaltılır.Step adımını vermezsek bu pozıtif 1 (+1) anlamındadır ve her adımda sayac bir artırılacaktır.Biz içiçe For Next döngüleride kurabiliriz. Ancak burada şuda dikkat edilmelidir. En son başlatılan For döngüsü ilk önce bitirilmelidir.

For sayac1=basla1 To son1
Komutlar
For sayac2=basla2 To son2
Komutlar
Next sayac2
Next sayac1

    Biz buradaki sayıyı daha da artırabiliriz.
    Aşagıdaki şekideki gibi bir kullanım hatalıdır

For sayac1=basla1 To son1
Komutlar
For sayac2=basla2 To son2
Komutlar
Next sayac1
Next sayac2     Burada For döngüsü işletilirken hata oluşacaktır

Örnek :

Factöriyel=1

For I=1 To Sayi

Factöriyel= Factöriyel * I

Next I


    Bu örnekte girmiş oldugunuz pozitif sayının faktoriyeli hesaplanmaktadır.



 


Do While Döngüsü :
    Bu dögünün genel yazim sekli asagidaki sekildeki gibidir.

Do While Kosul
Komutlar
Loop
    Burada önce Kosula bakilir. Eger kosul dogru ise aradaki satirlar çalistirilir taki Loop satirina kadar. Loop satirinda tekrar While satirina dönülür. Kosul tekrar kontrol edilir. Eger dogru ise ara satirlar tekrar çalistirilir. Kosul yanlis ise Loop ‘tan sonraki ilk satirdan program çalismaya devam eder. Içiçe Do While döngüleride kurabiliriz.

Do While Kosul1
….
Do While Kosul2

Komutlar
Loop
…..
Loop
    Her Do While için mutlaka bir Loop yerlestirmeliyiz.

Örnek :

Fact=1 I=2

Do While I<=Sayi

Fact=Fact * I

I=I+1

Loop

    Buradaki örnekte te faktöriyel hesabini Do While döngüsü ile yapiyoruz. Burada sayac olarak I degeri kullaniliyor. Eger faktöriyeli hesaplanacak deger 2 den kücükse (1 veya 0 ise) döngü içine girilmemektedir. Döngü içinde sayac artimini kendimiz veriyoruz. Sayac sayi degerine esit iken döngü son kez çalitiriliyor.

Do ….. Loop While Döngüsü :
    Bu döngü yapisinin genels yazim sekli asagida verilmistir.

Do
…..
Komutlar
…..
Loop While Kosul

    Bu ifade de döngü içinde komutlar mutlaka bir defe icra edilir. Daha sonra Kosul kontrol edilir. Eger kosul dogru ise tekrar Do satirina dallanilir ve aradaki komutlar tekrar icra edilir. Yanlis ise döngüden çikilir.Bu yapiyida içiçe kullanmamiz mümkündür.

Örnek :

Fact =1 I=1

Do

Fact=Fact *I

I=I+1

Loop While I<=Sayi

Faktöriyel hesapini yapan bir baska örnek verilmistir.

Do Until Döngüsü:
    Bu döngünün genel yazım şekli aşagıdaki şekildeki gibidir.

Do Until Koşul
Komutlar
Loop
    Burada önce Koşula bakılır. Eger koşul yanlış ise aradaki satırlar çalıştırılır'taki Loop satırına kadar. Loop satırında tekrar While satırına dönülür. Koşul tekrar kontrol edilir. Eger yanlış ise ara satırlar tekrar çalıştırılır. Koşul doğru ise Loop‘tan sonraki ilk satırdan program çalışmaya devam eder. İçiçe Do Until döngüleride kurabiliriz. Do While döngüsünden tek farkı kosul yanlış iken çalıştırılır.

Do Until Kosul1

Do Until Kosul2

Komutlar
Loop
…..
Loop
    Her Do Until için mutlaka bir Loop yerleştirmeliyiz.

Örnek :

Fact=1 I=Sayi

Do Until I<=1

Fact=Fact * I

I=I-1

Loop

    Buradaki örnekte'de faktöriyel hesabını Do Until döngüsü ile yapıyoruz. Burada sayac olarak I degeri kullanılıyor. Eger faktöriyeli hesaplanacak deger 2 den küçükse (1 veya 0 ise) döngü içine girilmemektedir.Döngü içinde sayac azaltımını kendimiz veriyoruz. Sayac 2 degerine eşit iken döngü son kez çalıştırılıyor

    Do … Loop Until Döngüsü :
    Bu döngü yapısının genel yazım şekli aşağıda verilmiştir.

Do

Komutlar

Loop Until Kosul

    Bu ifade de döngü içinde komutlar mutlaka bir defa icra edilir. Daha sonra Koşul kontrol edilir. Eger koşul yanlış ise tekrar Do satırına dallanılır ve aradaki komutlar tekrar icra edilir. Koşul dogru ise döngüden çıkılır.Bu yapıyıda içiçe kullanmamız mümkündür

Örnek :

Fact =1 I=1

Do

Fact=Fact *I

I=I+1

Loop While I>Sayi

Faktöriyel hesapını yapan bir başka örnek verilmiştir

Visual Basic'de Kontrol Komutları
    Kontrol komutları programcılar tarafından sıkca kullanılan belirli ifadeleri kontrol etmek veya bazı şartların gerçekleşip gerçekleşmedigini kontrol etmek amacıyla kullanılan komutlardır. Biz burada en çok kullanılan komutların üzerinde duracagız.

If Kontrol Yapısı :
    Genel olarak bu komut yapısı şu şekilde yazılır.

If Kosul Then
Kosul dogru ise yapılması istenen işlemler.
Endif

Kullandıgımız her If kontrolu için mutlaka bir Endif kullanmalıyız. Bu kontrol yapısının sonlandıgını belirtir.
Örnek:

If ad="FATIH" Then 

Maas=10000000

Endif


    Eger koşul gerçekleşmemiş ise yapılması istenen bazı işlemler varsa o zaman şu şekilde bir kontrol yapısını kullanabiliriz.

If Kosul Then
Kosul dogru ise yapılması istenen işlemler.
Else
Kosul yanlış ise yapılması istenen işlemler.
Endif

    Aynı anda bir kaç koşul için karşılaştırma yapılmak isternirse;

If Kosul Then
Kosul dogru ise yapılması istenen işlemler.
Elseif Kosul1 Then
Kosul1 dogru ise yapılması istenen işlemler.
Elseif Kosul2 Then
Kosul2 dogru ise yapılması istenen işlemler.
Else
Bütün kosullar yanlış ise yapılması istenen işlemler.
Endif
yapısı kullanılır. Bu yapıda mutlaka Else blogunun bulunmasına gerek yoktur. Burada eger Kosul dogru ise ilk Then’den sonraki satırlar çalıştırılarak Elseif ifadesine kadar icra edilirler. Daha sonra Endif ifadesinden sonraki satır icra edilir.Eger Kosul yanlış ise Kosul1 ifadesi kontrol edilir.Dogru ise buradaki then den sonraki satırlar çalıştırılır. Yanlış ise Kosul2’ye bakılır. Eger bu kosulda yanlıs ise Else ifadesinden sonraki satırlar çalıştırılır.

Örnek :

If Isım=”Ali” Then 

Maas=Maas * 1.2

Elseif Isım=”Murat” Then

Maas=Maas * 1.4

Elseif Isım=”Kemal” Then

Maas=Maas * 1.1

Endif


Örnek :

If Bolen=0 Then

Msg.Text=” Bolen sayı sıfır olamaz."

Else

Sonuc= Sayı / Bolen

Msg.Text = Sonuc

Endif


Ornek :

If name="Ali" AND no="1301920035"

Not=4

ElseIf name="Ahmet" AND no="1301940023" Then

Not=3

ElseIf name="Hakan" AND no="1301930045" Then

Not=2

ElseIf name="Hatice" AND no="1301940005" Then

Not=7

Endif

undefined

More...

 

undefined

[Close]

 

undefined

[Close]

 

undefined

Aritmetiksel Operatorler :

+ , - , * , / , \ , ^ ,Mod , &

    Genel olarak matematiksel işlemlerde kullanılan operatörlerdir. Bunlara kaynaştırma “&” operatörünü de ilave edebiliriz. Şimdi bu operatörleri açıklayalım.

    + Operatörü :
    Bu operatör ile verilen iki veya daha fazla ifade toplanabilir.Genel yazılışı aşagıdaki şekilde gibidir.
Sonuc = Ifade1 + Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.(Eger kaynaştırma yapılmamış ise)
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Eger Ifade1 ve Ifade2 strıng türünde veriler ise + operatörü kaynaştırma yapar. Yani Ifade2 yi Ifade1’ın sonuna ekler.Aşagıda Çeşitli örnekler verilmiştir.

Örnek :

Sonuc=13+45 'Sonuc=58

Sonuc=1378+56.78+435.908 'Sonuc=1870.688

A=89,B=3456

Deger=A+B ' Deger=3545

Ad="Ebru"

Soyad=” Kayacı”

Dim Name As String

Name=Ad+Soyad 'Name=”Ebru Kayacı”



Karşılaştırma Operatörleri :

    Bu operatörler ile verilen ifadeler arasında karşılaştırmalar yapılır. Genel karşılaştırma operatörleri aşagıda verilmiştir.

= operatörü :
Bu operatör verilen iki ifadenin eşit olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 = Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır

Örnek :

Sonuc=(100=345) 'Sonuc=False

Sonuc=(100=100) 'Sonuc=True

A=12,B=45

Sonuc=(A=B) 'Sonuc=False

C=23,D=23

Sonuc=(A=D) 'Sonuc=True



<> operatörü :
    Bu operatör verilen iki ifadenin farklı olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 <>Ifade2)
Burada Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(100<>345) 'Sonuc=True

Sonuc=(100<>100) 'Sonuc=False

A=12,B=45

Sonuc=(A<>B) 'Sonuc=True

C=23,D=23

Sonuc=(A<>D) 'Sonuc=False



< operatörü :
    Bu operatör verilen birinci ifadenin ikinci ifadeden küçük olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 < Ifade2)
    Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(100<345) 'Sonuc=True

Sonuc=(100<100) 'Sonuc=False

Sonuc=(100<130) 'Sonuc=False

A=12,B=45

Sonuc=(A<B) 'Sonuc=True

C=23,D=23

Sonuc=(A<D) 'Sonuc=False



> operatörü :
    Bu operatör verilen birinci ifadenin ikinci ifadeden büyük olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 > Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(800>345) 'Sonuc=True

Sonuc=(100>100) 'Sonuc=False

Sonuc=(100>130) 'Sonuc=False

A=90,B=45

Sonuc=(A>B) 'Sonuc=True

C=23,D=23

Sonuc=(A>D) 'Sonuc=False



=> operatörü :
    Bu operatör verilen birinci ifadenin ikinci ifadeden büyük veya eşit olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir
Sonuac=(Ifade11 => Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(800=>345) 'Sonuc=True

Sonuc=(100=>100) 'Sonuc=True

Sonuc=(100=>130) 'Sonuc=False

A=90,B=45

Sonuc=(A=>B) 'Sonuc=True

C=23,D=23

Sonuc=(A=>D) 'Sonuc=True



<= operatörü :
    Bu operatör verilen birinci ifadenin ikinci ifadeden büyük olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 <= Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(800<=345) 'Sonuc=False

Sonuc=(100<=100) 'Sonuc=True

Sonuc=(100<=130) 'Sonuc=True

A=90,B=45

Sonuc=(A<=B) 'Sonuc=False

C=23,D=23

Sonuc=(A<=D) 'Sonuc=True



And Operatörü :
    Lojik iki ifadenin karsilastirilmasi için kullanilir. Iki ifadenin'de dogru olmasi gereklidir. Genel yazim sekli asagidaki gibidir ;
Sonuc=Kosul1 And Kosul2
Burada Sonuc herhangi bir sayisal tipde degiskendir.
Kosul1 herhangi bir ifadedir.
Kosul2 herhangi bir ifadedir.
And operatörünün dogruluk tablosu asagidaki sekildeki gibidir.

İfade1

İfade2

Sonuc=İfade1 And İfade2

False

False

False

False

True

False

True

False

False

True

True

True

True

Null

Null

Null

True

Null

False

Null

False

Null

False

False

Null

Null

Null


And operatörü ayni zamanda bitwise comparison islemide yapilabilir.


İfade1

İfade2

İfade1 And İfade2

0

0

0

0

1

0

1

0

0

1

1

1


Örnek :

Sonuc = (False And False ) 'Sonuc=False

Sonuc = (Null And False ) 'Sonuc=False

A=True , B=True

Sonuc = (A And B ) ' Sonuc=True

A=1 ,B=0

Sonuc = (A And B ) ' Sonuc=0

A=1 ,B=1

Sonuc = (A And B ) ' Sonuc=1

A=1,B=4

Sonuc = (A And B ) ' Sonuc=0

A=1,B=3

Sonuc = (A And B ) ' Sonuc=1

A=1,B=5

Sonuc = (A And B ) ' Sonuc=1

A=1,B=8

Sonuc = (A And B ) ' Sonuc=0



Diziler
    Aynı tür bilgileri bellekte tutmak için kullanabilecegimiz listelere dizi adı verilir. Dizi kullamanın avantajı aynı tür bilgiler bir listede tutularak daha hızlı işlem yapılabilmesi saglanmış olacaktır.Visual Basic'de dizi şu şekildedir
Dizi_adı(İndis)
olacaktır.

Örnek:

Private Sub Form_Load()

Dim ad(2) As String

Dim no(2) As Integer

ad(0) = "ali"

ad(1) = "ahmet"

ad(2) = "ebru"

no(0) = 133

no(1) = 56

no(2) = 67

End Sub



    Bu örnek'te ad ve no olmak üzere iki adet dizi tanımlanmaktadır. ad dizisi string türünde bilgileri tutacak ve no dizisi ise integer türündeki bilgileri saklayacaktır. Görmüş olgunuz gibi dizilere bilgi atama şekli

dizi_adı(indis_sırası)=atanacak_bilgi
şeklindedir.

Eger diziyi sıfırdan degilde bir den itibaren başlatmak istersek diziyi tanımlamadan önce Option Base 1 satırını eklemeliyiz.

    Burada dizi indisleri sıfırdan başlayarak tanımlama yaparken bizim belirtigimiz degere kadardır. Yani bizim bu dizilere atayabilecegim veri sayısı diziyi tanımlarken belirtdigimiz indis degerinden bir fazla olacaktır.

Eger deger atama yaparken belirttigimiz sınırların dışına çıkarsak hata oluşur. Dizilere deger atarken dizi sınırlarını kontrol etmekle olası bir hatayı önlemiş oluruz.
Statik Diziler
    Bu tip dizilerde kullanılacak yer sayısı sabittir. Bu tip diziler sadece tanımlandıkları modül içersinde kullanılabilirler. Statik dizi şu şekilde tanımlanabilir
Dim dizi_adı(sayi) As Veri_Tipi
    Tüm proje içinde kullanılacak bir dizi tanımlanmak isterse standart modülün General,Declarations bölümünde yukarıdaki şekildeki gibi tanımlanmalıdır

Örnek :

Option Base 1

Dim a(5) As Integer

Private Sub Command1_Click()

Text1.Text = a(1) + a(2)

End Sub

Private Sub Form_Load()

a(1) = 10

a(2) = 20

End Sub



    Bu örnekte görüldügü gibi projenin general,declarations kısmında a() dizisi tanımlanıyor.Bu dzi tanımlanmadan önce dizi indislerinin 1 den itibaren başlıyacagını belirten Option Base1 satırı koda dahil edilmiştir. Form1 yüklendiginde bu dizinin ilk elemanınna 10 sayısı ikinci elemanına 20 sayısı atanıyor. Eger kullanıcı Command1 isimli butona tıklarsa dizinin ilk ce ikinci elemanları toplanarak Form üzerinde Text1 adlı nesnenin Text özelligine atanıyor. Yani TextBox'ın bu sayıların toplamını göstermesi sağlanıyor.

Dinamik Diziler
    Bu tip dizilerde kullanılacak yer sayısında bir sınırlama yoktur. Bu tip diziler ilk başta şagıdaki şekildeki gibi bir tanımlamaya ihtiyaç duyarlar.
Dim dizi_adı( ) As Veri_Tipi
    Daha sonra bu dizi kullanılacak iken botunu belirtmek gerekir bunun içinde aşagıdaki gibi bir tanımlama yapılmalıdır.
ReDim dizi_adı(boyut ) As Veri_Tipi
    Artık bu veri dizisini projemiz içinde kullanabiliriz.

Örnek :

Option Base 1

Private Sub Form_Load()

Dim s() As String

End Sub

Private Sub Command1_Click()

ReDim s(10) As String

s(1) = "Selam "

s(2) = "Ayşe"

Text1.Text = s(1) + s(2)

End Sub


    Bu dizi tanımlanmadan önce dizi indislerinin 1 den itibaren başlıyacagını belirten Option Base1 satırı koda dahil edilmiştir. Form1 yüklendiginde s adlı bir dinamik dizi tanımlanmaktadır. Kullanıcı Command1 isimli butuna tıkladıgında s dizisinin boyutu belirtilerek yeniden tanımlanmıştır. Bu dizinin ilk elemanınna "Selam " degeri ikinci elemanına "Ayşe" degeri atanıyor. Dizinin ilk ve ikinci elemanları toplanarak Form üzerinde Text1 adlı nesnenin Text özelligine atanıyor. Yani TextBox'ın bu degerlerin toplamını göstermesi sağlanıyor.

Örnek :

Option Base 1

Private Sub Form_Load()

Dim s() As String

End Sub

Private Sub Command1_Click()

ReDim s(10) As String

s(1) = "selam"

s(2) = "fatih"

Text1.Text = s(1) + s(2)

End Sub

Private Sub Command2_Click()

ReDim s(5) As String

s(2) = "fatih"

Text1.Text = s(1) + s(2)

End Sub



    Bu örnekte yukarıdaki örnekten tek farklı yan olarak bir Command butonun arkasına yazılmış kod bulunuyor. Eger kullanıcı Command1 adlı butondan sonra bu butona tıklarsa ne olacak ona bakalım. Command2 butonuna tıklanıldıgında s() dizisi tekrardan boyutu 5 olrak tanımlanıyor. s() dizisine daha önce atamış bütün degerler siliniyor. Yani s() dizisi bir nevi boşaltılıyor ve yeniden boyutlandırılıyor. Eger s() dizisine daha önce atanmış degerler korunmak istenirse aşagıdaki şekildeki gibi bir tanımlama yapılmak zorundadır.
ReDim Preserve s(boyut) As Veri_tipi
Select Case:
    Bu kontrol yapısında sadece bir degişkenin durum kontrolü yaılır.Kontrolü yapılacak degişkenin genel olarak alabilecegi degerler belirli ise bu yapının kukllanılması If yapısına göre daha avantajlıdır. Yazılış biçimi genel olarak aşagıdaki şekildeki gibidir

Select Case Degisken
Case Deger1
Degisken=Deger1 oldugu durumda yapılması istenen işlemler
Case Deger2
Degisken=Deger2 oldugu durumda yapılması istenen işlemler
Case Else
Degisken yukarıdaki degerler den hicbirine eşit degil ise yapılacak işlemler
End Select

Kullandıgımız her Select ifadesi için bir End Select kullanmalıyız.

Örnek :

Select Case No

Case 1304

Name="Murat Tuna"

Case 1306

Name="Ayse Sinem"

Case 1307

Name=”Hakan Kaya”

Case 1312

Name=”Abdullah Kahyalı”

Case 1324

Name="Hatice Uygun"

End Select


Örnek :

Select Case Ay

Case 1

Max_date=31

Case 2

Dim Artık as Integer

Artık = Yıl Mod 4

If Artık=0 Then

Max_date=29

Else

Max_date=28

Endif

Case 3

Max_date=31

Case 12

Max_date=31

Case Else

Mesaj=”Error : Bir yılda 12 ay vardır.”

End Select

Data Form Wizard 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 hazırlayabilirsiniz.Data Form Wizard'ı başlatmak için Add-Ins menüsünden Add-In Manager 'i seçiniz.Karşımıza gelen diyalog kutusunda VB Data Form Wizard onay kutusunu seçili duruma getirecek olursanız , veri giriş formu hazırlamada kullanılan Data Form Wizard , Add-Ins menüsünde bir komut ile temsil edilir.Şimdi Project menüsünden Add Form'u seçelim.açılan dialog kutusunda VB Data Form Wizard'ı seçiniz.Böylece Data Form Wizard çalışmaya başlar.Şimdi sizinle birlikte bir form hazırlayalım.

İlk önce Add-Ins menüsünden Add-In Manager'den VB6 Data Form Wizard'ı seçelim.Daha sonra Project menüsünden Add Form'u seçelim.Burada VB Data Form Wizard'ı seçiniz.Açılan pencereyi Next tuşuyla geçelim.Açılan pencerede Database formatını seçilecektir.Biz Access'ta çalışacağımız için Access'ı seçiniz ve Next tuşuna basınız.Açılan pencerede oluşturduğumuz Databese Name'in adresini gireceğiz.Biz buraya hazır format olan Biblio.mdb'yi girdik ve Next tuşuna bastık.Açılan pencerede Single Record'u seçeceğiz.Eğer tablodaki kayıtların Excel Tablosu olarak ekrana getirilmesini istiyorsanız Grid'i , Kayıtlar birden fazla tablodan alınacaksa Master/Detail seçilmelidir.Single Record'u seçtikten sonra Next tuşuna basınız açılan pencerede Record Source kısmında tablo seçimi yapılır.Biz hazır Authors'u seçtik.Authors tablosunda bulunan alanlar Available Columns liste kutusunda listelenir.Tabloda bulunan alanları ucu sağa bakan tuşla tek tek Selected Fields kısmına dahil edebilrsiniz.Böylece alanları tek tek formumuza dahil etmiş olduk.Daha sonra Next tuşuna basınız.Ekrana Control Selection penceresi gelir.Burada Tablo üzerinde işlem yaparken kullanılacak düğmeleri seçmeye gelir.Burada formumuza yeni bir kayıt eklemek istemiyorsak Add Button onay kutusunun seçili olma özelliğini kaldırmalısınız.Daha sonra Next tuşuna basınız.Çıkan pencerede Finish butonuna bastığınızda Data Form Create penceresi açılır. Bu formu Ok butonuna basarak kapatınız.Böylece Tablomuz Data Form Wizard ile otomatik olarak hazırlandığını göreceksiniz.Tasarım halindeki formumuzda Add butonunun ismini Ekle,UpDate butonunun ismini Güncelle,Delete butonunun ismini Sil ,Refresh Butonunun ismini Yenile,Close butonunun ismini Formu Kapat olarak Caption özelliklerini değiştiriniz. F5 kısayol tuşuna basarak formumuzu çalıştırın.

Veri Tabanı Dosyası Üzerinde İşlem Yapmak Data Kontrolü

VisualBasict'te veri tabanı dosyaları üzerinde işlem yapmaya yönelik Data kontrolü vardır.Formumuza eklediğimiz Data kontrolü sayesinde veri tabanı dosyaları üzerinde hertürlü işlem kolay yapılabilir.Şimdi Toolbox menüsünden Formumuza Data kontrolü ekleyelim.Data1 kontrol nesnesinin üzerindeki ok işareti olan düğmelerden veri tabanının kayıtları arasında dolaşırken yararlanılır.Data kontrolü ile veri tabanı dosyası arasında bağlantı kurulmadan Data nesnesinin bir işlevi olmaz.Forma eklenen Data kontrolü ile veri tabanı dosyası üzerinde bağlantı Data kontrolün Properties özelliğinden DataBaseName özelliğinden yararlanılarak yapılır.Daha sonra Add-Ins menüsünden Visual Data Manager'den yararlanarak önceden Access'de hazırlamış olduğum veri tabanın açalım.Data1 kontrolünün DataBaseName kısmına hazırlamış olduğum personel.mdb'yi seçtim.Daha sonra Data1 kontrolünün RecordSource özelliğine bilgilerin hangi tablodan oknumasını istiyorsak onu seçeceğiz.Benim hazırlamış olduğum tabloda personeller 'i seçiyorum sizde kendi oluşturduğunuz tablonun ismini seçiniz.Böylece Data Kontrolü ile personel.mdb ismindeki veri tabanı dosyası arasındaki bağlantı kurulmuş olur.Tablonun açılması ile birlikte kayıt okuma kafasının ilk kayıda konumlanması sırasında Data nesne ile ilgili olarak Reposition olayı meydana gelir.Bu özellikten yararlanarak aşağıdaki kodları ekleyelim.Burada Fields ve Value parametrelerinden yararlanacağız.Data1 Kontrol Reposition kısmına daha önce oluşturduğum alanları formda göstermesi için aşağıdaki kodları yazacağım.Sizde kendi veri tabanınızdaki alanlar için benzer kodu yazınız.

önceden oluşturduğum personel.mdb nin personeller tablosunda adı,soyadı,adresi ,telefonu,ceptelefonu,şehir gibi alanlar bulunmaktadır.Şimdi bunu formda görüntülemek için Data1 Kontrolün üzerine çift tıklayınız ve sağ ComboBox'ta Reposition'u seçiniz.Sub-End Sub kısmına aşağıdaki kodu yazacağım.

Show
Cls
FontName="Arial"
FontSize="12"
Print "Personelin Adı :"; Data1.Recordset.Fields("Adı").Value
Print "Personelin Soyadı :"; Data1.Recordset.Fields("soyadı").Value
Print "Personelin Adresi :"; Data1.Recordset.Fields("Adresi").Value
Print "Personelin Telefonu :"; Data1.Recordset.Fields("Telefonu").Value
Print "Şehir :"; Data1.Recordset.Fields("Sehir").Value
yazdıktan sonra F5 kısayol tuşu ile formumuzu çalıştırınız .Görüldüğü gibi bilgiler formumuzun üzerine yazılmıştır.Data kontrol ile kayıtlar arasında ileri geri hareket edebilirsiniz.Şimdi formumuzu biraz daha geliştirelim .Formumuza Command Button koyalım ve Caption özelliğini İleri olarak değiştirelim.Butona çift tıklayarak Click özelliğini açalım.ve buraya aşağıdaki kodu yazalım.

Data1.Recordset.MoveNext
Bu kodla birlikte bir sonraki kayda gidebiliriz.Aynı şekilde formumuza 2ibutonu yerleştirelim ve Caption özelliğini Geri olarak değiştirelim.Daha sonra Click olayına aşağıdaki kodu yazalım.

Data1.RecordSet.MovePrevious
Bu kodla birlikte bir önceki kayda gidebiliriz.Yine İlk kayda gitmek için 3.butonu formumuza ekleyelim.Click olayına aşağıdaki kodu yazalım.

Data1.RecordSet.MoveFirst
Bu kodla birlikte ilk kayıta gidebiliriz.Daha sonra 4.butonu formumuza ekleyelim.Caption özelliğini En Son Kayıt olarak değiştirelim ve aşağıdaki kodu Click olayına yazalım.

Data1.RecordSet.MoveLast
Bu kodla birlikte en son kayda gidebiliriz

Şimdi Formumuzu biraz daha geliştirelim.Yukarıda veri tabanımızdaki bilgileri formumuzun üzerine yazdırmıştık.Şimdi de Formumuza Text'ler ve Labeller yerleştirerek gerçekleştirelim.Data1 Kontrol nesnesini DataBaseName'ine hazırlamış olduğunuz veri tabanını dosyasının adresini ve RecordSource kısmına tablonun adını ( benim hazırladığım tablo personeller ) seçiniz.Daha sonra Text kutusuna gelerek DataSource özelleğini Data1 seçiniz.Daha sonra Text kutusunun DataField özelliğinden alanın adını seçiniz.(sırayla Adı,Soyadı vb.)Labellerin Caption'unuda Personelin Adı,Personelin Soyadı vb.şekilde değiştiriniz.Böylece Text Kutularımızı Data1 Kontrolüne bağlamış olduk.Formumuzu çalıştırdığımızda Data1 Kontrol ok tuşlarıyla ileri geri veri tabanında hareket ettiğimizde Text kutusunda bilgilerin göründüğünü ve değiştiğini görürüz.Eğer Formumuza İleri,Geri Butonları koyarsak yukardaki şekilde herbirine kodlar yazmamız gerekir.
Bir tane örnek verecek olursak ;
Formumuza 1 tane buton ekleyelim ve Caption özelliğini İlk Kayıt olarak değiştirelim ve Click olayına Aşağıdaki kodu yazalım.

MsgBox ("Tablonun İlk Kaydı Üzerindesiniz")
Data1.Recordset.MoveFirst
Böylece ilk kayıda geçildiği zaman bizi İlk kaydın üzerindesiniz diye uyaran pencere karşımıza çıkacaktır.

Tabloya Yeni Kayıt Girmek

Formumuza yeni bir buton ekleyelim ve Caption'unu Yeni Kayıt olarak değiştirelim.Daha sonra Butonun Click olayına aşağıdaki kodu yazınınz

Data1.RecordSet.AddNew
Böylece bu kod ile yeni kayıt girişi yapmış oluruz.

Tablodan Bir Kayıt Silmek

Bunun için Formumuza yeni bir buton ekleyiniz ve Caption özelliğini Kayıt Sil olarak değiştiriniz.Daha sonra Click olayına aşağıdaki kodu yazınız.

MsgBox ("Bir kayıt Silmek Üzeresiniz")
Data1.Recordset.Delete
Data1.Recordset.MovePrevious
Burada Programı çalıştırıp Kayıt Sil tuşuna bastığımızda Bir Kayıt Silmek Üzeresiniz yazılı uyarı penceresi açılır.Data nesneleri ile ilişkilendirilen söz konusu nesnelerin içerikleri güncelleşmediği için Data1.Recordset.MovePrevious yazdık.

Yeni Eklediğimiz Kayıttan Vazgeçme

Formumuza yeni buton ekleyiniz ve Caption'unu Vazgeç olarak değiştiriniz.Daha sonra Click olayına;

Data1.RecordSet.CancelUpDate
kodunu yazınız.Böylece Yeni bir kayıt girip bundan vazgeçtiğimizde işimize yarar.

Kayıt Güncelleme

Formumuza yeni buton ekleyiniz ve Caption'unu Kayıt Güncelleme olarak değiştiriniz.Daha sonra Click olayına;

Data1.RecordSet.UpDate
kodunu yazınız.Böylece Yeni bir kayıt girip bunu güncellemiş olduk.

ValiDate Olayı

Data Kontrol nesnesinde ValiDate olayı meydana gelmektedir.Bütün işlemlerin Validate özelliğinden yararlanılarak yapılması önerilmektedir.Validate yordamı dışarıdan Action ve Save adında iki parametre almaktadır.
Validate olayında MoveNext methodu kullanılırsa bir sonraki kayda gitmeden temsil eden yordam işletilir ve bu yordama Action parametresi ile 3 sayısal değeri gönderilir.
Data nesnesine Delete metodu uygulanmak istenirse silme işlemi öncesinde Data nesnesine ait Validate yordamı otomatik olarak işletilir .Bu sırada ValiDate yordamına Delete metodunu temsilen 7 sayısal değeri gönderilir.Şimdi Data1 Kontrolüne çift tıklayalım ve Validate olayına aşağıdaki kodu yazalım.

Dim Cevap As Integer
If Action = 7 Then Cevap = MsgBox("Bu Kayıt Dosyadan Silinsinmi?", 4)
If Cevap = 7 Then
Action = 0
End If
End If
Formumuzu çalıştırıp Kayıt Sil butonuna bastığımızda Bu Kayıt Dosyadan Silinsinmi? diye uyarı penceresi açılır.Bu pencerede Evet butonuna bastığımızda kayıt silinir.Hayır Butonuna bastığımız zaman ise kayıt silinmez.(Kendi Formunuzda da bu Validate olayını deneyiniz)

Tabloda Kayıt Aramak

Formumuza yeni buton ekleyelim ve Caption özelliğini Kayıt Bulma şeklinde değiştirelim.Click olayına aşağıdaki kodları yazalım.

Authors$ = InputBox("Aranacak Kişinin Adı :")
Olcut = "Authors ='" & Authors$ & "'"
Data1.Recordset.FindFirst Olcut

ve General Declarition kısmınada
Dim Olcut as String yazalım.

Tablodaki Kayıt Sayısını Öğrenmek

Formumuzun Click olayına aşağıdaki kodu yazalım.

MsgBox Data1.Recordset.RecordCount
başlangıçta RecordCount özelliği 1 değerini içermektedir.Herhangi bir kayıtların arasında dolaşıldığında RecordCount özelliği kayıt sayısı ile ilgili doğru değeri gösterir.

Query-Sorgu Hazırlamak

Bu bölümde Add-Ins menüsünde Visual Data Manager'den yararlanacağız.Açılan menüde Open DataBase'den veri tabanınızı açın.(Ben personel.mdb'yi açtım).Yeni sorgu hazırlamak için kısayol menüsünden New Query( Database Window'ın içine sağ tıklayarak) komutunu vermek gerekir.Kısayol menüsünden New Query komutunu verirseniz sorgu yapısının belirlendiği Query1 Builder diyalog kutusu ekrana gelir.Çok sayıda seçeneğin bulunduğu Query Builder diyalog kutusunda , üzerinde çalışılan veri tabanı dosyasında bulunan tablolar Tables liste kutusunda listelenmektedir.BVu amaçla ilk olarak Tables liste kutusunda sorguya temel oluşturacak tablo veya tablolar seçilir.Seçilen tabloda bulunan alanlar Fields to Show liste kutusunda listelenir.Şimdi Tables kısımından Personeller tablosunu seçtim.Daha sonra FieldName'den Personelin Adı 'nı seçtim.Operator kısmında '=' , Value kısmında Bahadır'ı seçtim .Eğer "And" veya "Or" bağlacı ile 2.bir kriter yapmak istiyorsanız And Into Criteria veya Or Into Criteria düğmelerine tıklamanız gerekir.Ben And Into Criteria'ya tıkladım ve Criteria kısmına Personel Adı='Bahadır' yazıldı.Hazırladığınız sorguyu test etmek istiyorsanız Run düğmesinde ve sorguyu veri tabanı dosyasına kaydetmek istiyorsanız Save düğmesine tıklamanız gerekir.Daha sonbra Close düğmesinde tıklama yaparak Query Builder diyalog kutusunu kapatınız.Hazırlanan sorgu Visual Data Manager penceresi içinde listelenmeye başladı.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 taraftan yeni bir sorguyu hazırlamak için DataBase penceresinden ait kısayol menüsünden New Query komutunu vermek yerine Utility menüsünden Query Builder komutunu verebilirsiniz.

Program Kodu Yazarak Sorgu Hazırlamak

Formumuzun General Declaracition kısmına aşağıdaki kodları yazalım.

Dim Dosya As Database
Dim Tablo As Recordset
Dim Sorgu As QueryDef
Daha sonra önceden oluşturduğum personel.mdb'ye ulaşmak için formuma Text ve Labeller koydum.Daha sonra Form Click olayına aşağıdaki kodu yazdım.

Set Dosya = OpenDataBase("D:\personel.mdb")
Set Sorgu = Dosya.CreateQueryDef("Sorgu", "SELECT * FROM personel;")
Set Tablo = Dosya.openRecordSet("Sorgu")
Form1.Text1 = Tablo.Fields("Personelin Adı")
Form1.Text2 = Tablo.Fields("Personelin Soyadı")
Form1.Text3 = Tablo.Fields("Personel Adresi")

Data Manager penceresinde daha önceden hazırlamış olduğunuz bir sorgunun üzerine mouse'ın sağ tuşu ile tıklama yaparsanız sorgu ile ilgili kısayol menüsü gelir.Kısayol menüsündeki Open komutu sorguyu açar,Delete komutu ile sorgu silinir,Rename komutu ile de sorgunun adını değiştirebilirsiniz.Sorguya ait kısayol menüsünden Design komutunu verirseniz sorgunun hazırlanması sırasında kullanılan ve SQL dilinde yazılmış olan program satırları Visual Data Manager penceresinin sağ tarafındaki SQL Statement penceresinde yazılır.Design komutu verildikten sonra SQL Statement kısmına

SELECT * FROM personeller WHERE Personelin ADI ="Bahadır" yazınız.
Bu sırada Execute tuşuna basarak sorguda yaptığınız değişikliğin etkisini görürsünüz.

Şimdi Formumuzun Load kısmına aşağıdaki kodu yazalım.

Set Dosya = OpenDataBase("D:\personel.mdb")
Set Tablo = Dosya.openRecordSet("Sorgu")
Form1.Text1 = Tablo.Fields("Personelin Adı")
Form1.Text2 = Tablo.Fields("Personelin Soyadı")
Form1.Text3 = Tablo.Fields("Personel Adresi")
kodunu yazınız.Daha sonra Formumuza buton yerleştirin .Captionunu Sonraki Kayıt olarak değiştirin ve aşağıdaki kodu yazınız.

Tablo.MoveNext
Form1.Text1 = Tablo.Fields("Personelin Adı")
Form1.Text2 = Tablo.Fields("Personelin Soyadı")
Form1.Text3 = Tablo.Fields("Personel Adresi")
Formumuza 2.buton yerleştiriniz ve Caption'unu Kayıt Sil yapınız.Daha sonra Butonun Click olayına aşağıdaki kodu yazınız.

SQL$="DELETE FROM Personel WHERE Personel Adı='Bahadır';"
Dosya.Execute SQL$

Data Kontrolü ile Birlikte SQL Kodu Kullanımı

Daha önceki bölümde de Data Kontrol nesnesinden bahsetmiştik.Biraz hatırlatmak maksadıyla;Data1 Kontrolünün DataBaseName özelliğine veri tabanı yolunu tanımlıyorduk.RecordSource kısımınada veri tabanında bulunan tabloları listeliyorduk.RecordSource özelliğine tablo adı seçmek yerine tablo ve kayıt seçimi yapmak için SQL kodu yazabilirsiniz.
Şimdi formumuza yerleştirdiğimiz Data1 Kontrolünün DataBaseName kısmına personel.mdb'nin yolunu yazalım.RecordSource kısmına Select * From [Personel ADI] yazalım.Daha sonra Project menüsünün Component DBGrid formumuza yerleştirelim ve DataSource özelliğini Data1 yapalım.Formu çalıştıralım.Görüldüğü gibi Data1 kontrolünün RecordSource kısmına yazmış olduğumuz kodun işlediğini görmüş olduk.

VisualBasic'te Rapor Hazırlamak

VisualBasic ile birlikte VisualBasic projeleri dahilinde veya başka bir program ile hazırlanan veri tabanı dosyalarından rapor hazırlamak amcıyla kullanılan Crystal Reports adında bir rspor üreticisi verilmektedir.Rapor üreticisi için VisualBasic bilgisayara kurulurken ayrıca bir Başlat menüsünde bir komut hazırlandığından VisualBasic çalışmıyor iken bile Crystal Reports uygulamasını başlatabilirsiniz.Visual Basic çalışır durumda iken Add-Ins menüsündeki Report Designer komutu ile rapor üreteci başlatılabilir.Rapor üreteci başladıktan sonra Crystal Report uygulaması ekrana bir pencere içinde gelir.Crystal Reports ile kolay bir şekilde profosyonel kalitede raporlar hazırlayıp Visual Basic projeleri içinde kullanabilirsiniz.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.File menüsünden New komutu verirseniz ekrana Create New Report diyalog kutusu gelir.Create New Report diyalog kutusunda rapor hazırlama yardımcısı ( Expert ) seçilmektedir.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 düğmesini ve mektup etiketleri hazırlamak istiyorsanız Mail Label düğmesini seçmeniz gerekir.Custom düğmesine tıklama yaparsanız Create New Report diyalog kutusunun alt kısmına 5 düğme daha eklenir.Şimdi Standart Expert'ten yararlanarak basit bir rapor düzenliyelim.standart butonuna basınız.Karşımıza 1.adımı temsil eden dialog kutusu geldi.Rapor hazırlama sihirbazının ilk adımını temsil eden bu diyalog kutusunda hazırlanmak istenen rapora kaynaklık edecek veri tabanı dosyası seçilmektedir.Bu diyalog kutusunda rapora kaynaklık edecek veri tabanı dosyası seçilip Done veya Add düğmesine basılırsa rapor hazırlama Expert'in 2.adımını temsil eden 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.Rapor hazırlama işleminin bir önceki adımına geçmek için Back düğmesine tıklama yapabilirsiniz.Rapor Hazırlamanın 1.adımında kullanmadığınız tabloları Delete tuşuyla silebilirsiniz.Eğer birden frazla veri tabanından bilgi derleyecekseniz tekrar Data File butonuna basarak veri tabanı dosyası seçimi yapılan Choose Database File diyalog kutusunu tekrar ekrana getirebilirsiniz.Ekranda rapor hazırlama Expert'in 2.adımını temsil eden diyalog kutusu varken Next butonuna tıklama yapıp rapora dahil edilecek alanların seçildiği sekmeye geçebilirsiniz.Diyalog kutusunda gördüğünüz gibi tablodaki alanlar Database Fields liste kutusunda listelenmektedir.Raporda yer almasını istediğiniz alanları Add düğmesine tıklayarak raporunuza dahil edebilirsiniz.Allbutonu ile bütün alanları raporda göstermiş olursunuz.Remove alanları göstermekten vazgeçeriz.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çimi yaptıktan sonra Column Heading metin kutusuna başlık metnini yazabilirsiniz.Next tuşuna basarak 4.adıma geçelim.4.adımda Sort sekmesinde raporda yer alacak bilgilerin nasıl sıralanacağı ve nasıl bir gruplama yapılacağı konusunda seçim yapılmaktadır.Hazırladığım Raporda Personellerin Adına göre siralanmasını istediğim için Add düğmesi ile Group Fields liste kutusuna kopyaladım.

Sort sekmeninde kayıtların nasıl sıralanacağı ve gruplanacağı konusunda seçim yapıldıktan sonra Total sekmenine ( 5.adım ) geçilir.Total sekmeninde 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ğim için bu adımı direk geçtim.6.adım olan Select sekmeninde raporda yer almasını istediğiniz kayıtları filtre edebilirsiniz.Kayıt filtre etme işlemin hangi alana göre yapmak istiyorsanız o alanı Add düğmesi ile Report Fields liste kutusundan Select Fields liste kutusuna kopyalamanız gerekir.Ben örnek olarak Personel ADI'nı filtreledim.Daha sonra aşağıdaki any Value. değerini equal to yaptım ve açılan metin kutusuna Bahadır* yazdım.Daha sonra 7.adıma geçtim.Stylesekmeninde rapor biçiminden başka bir rapora verilmek istenen başlık Title metin kutusuna yazılabilir.Bu işlemden sonra Preview Report düğmesine tıklanarak rapor hazırlanır.Cyrstal Reports uygulamasından çıkmadan önce hazırlanan raporun kaydedilmesi gerekir.Bunun için File menüsündeki Save komutundan yararlanılır.Save komutunu verirseniz File Save As diyalog kutusu gelir.Ben hazırlamış olduğum raporu personel.rpt olarak kaydettim.Sizde oluşturduğunuz raporu kaydediniz.

Report Kontrolü

Cyrstal Reports programı ile yukarıda anlattığım şekilde hazırlanan rapor dosyalarından yararlanılarak ekrana ve 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 VisualBasic projeleri dahilinde kullanılabilmesi gerekmektedir.Bunun için üzerinde çalışılan projeye Crystal Reports kontrolünü temsil eden özel kontrol dosyasının eklenmesi gerekir.VisualBasic'in Project menüsünde Components komutu ile ekrana gelen Components diyalog kutusunda Crystal Report kontrolü üzerinde çalışılan projeye dahil edilince Toolbox penceresine rapor kontrolünü temsil eden düğme eklenir.(Cyrstal Report Control ...)ToolBox penceresinde Crystal Reports kontrolünü temsil eden düğme seçili duruma getirildikten sonra üzerinde çalışılan projenin aktif formuna rapor nesnesi eklenebilir.Formun üzerinde Crystal Reports nesnesini çalışma anında görünmediği için tasarım anında sabit boyutlara sahip olur.Forma eklenen ilk Crystal Reports nesnesine Crystal Report1 adı verilmektedir.Rapor nesnesinin adı nesneye ait Name değişkeninde tutulmaktadır.Tasarım anında rapor nesnesine istenilen ad verilebilir.Forma eklenen Report nesnesine kaynaklık edecekm RPT uzantılı rapor dosyasının adı Report nesnesine ait ReportFileName adlı değişkene aktarılır.Yanındaki üç noktaya tıklarsak ;Property Pages penceresi açılır.Buradan Raporumuzun yolunu tanımlıyoruz.(Önceden hazırladığım personel.rpt'nin yolunu tanımladım).Bu pencerede eğer raporu ekranda görmek istiyorsak To Window ,yazıcıdan çıkarmak isterseniz To Printer , Raporun içeriğini bir dosyaya yazmak istiyorsak To File radyo butonunu seçmemiz gerekir.

Tasarım anında ToolBox'tan yararlanarak üzerinde çalışılan projenin aktif formuna dahil edilen Report nesnesini çalışma anında formun üzerinde görünmez.Bu nedenle Report nesnesi için önceden tanımlı olan herhangi bir yordam veya olay yoktur.Dolayısıyla Report nesnesinden yararlanmak için bazı ek işlemlerin yapılması gerekir.Report nesnesi ile rapor almaya başlamak için Report nesnesine ait Action değişkeninden yararlanılır.Action değişkenine 1 değeri aktarılacak olunursa rapor alınmaya başlanılır.Şimdi bunu deneyelim.
Formumuza bir buton ekleyelim ve Click olayına aşağıdaki kodu yazalım.

CrystalReport1.Action = 1
Formumuzu çalıştıralım.Çalışma anında ekran görüntüsünde raporun görülmediği gözükmektedir.Raporlama butonuna bastığımızda hazırlamış olduğumuz raporu ekranda görürüz.Raporun kağıt üzerinde tam görüntüsü ekrana getirilir.Bu ekran görüntüsünde Rapor penceresinin herhangi bir başlığı yoktur.Rapor penceresine başlık vermek istiyorsanız Report nesnesine ait WindowTitle özelliğinden yararlanmalısınız.Bu değişkenin içeriği tasarım anında Properties penceresinde ve çalışma anında program kodu yazılarak değiştirilebilir.CrystalReport1'i seçip Properties özelliğinde WindowTitle'ye Personel Listesi 2001 yazdım.Sizde raporunuza uygun isim yazınız.Raporunuza Page Header ( Cyrstal Reports tasarım halinde ) fare ile tıklayarak rapora başlık verebilirsiniz.

Cyrstal Repots'ta Raporun başlığı için Font ve Punto seçimi için Format menüsündeki Font komutundan ,resim eklemek için Insert menüsündeki Graphics komutundan yararlanabilirsiniz.Insert menüsündeki komutlar ile rapora kutular,resim dosyaları,metin kutuları vb.dahil edilebilir.Rapora sayfa numarası eklemek için Insert menüsünden Special Field - Page Number Field ve raporun her sayfasına günün tarihinin yazılmasını sağlamak için Insert menüsündeki Special Field - Print Date Field komutlarından yararlanılır.Cyrstal Repots'ta Details kısmına veri tabanı dosyasından okunacak bilgiler için alanlara ( Fields ) yer verilir.

Visual Basic ile ses dosyalarınızı çalmak

Visual Basic'i kullanarak Windows ses dosyalarını (WAV) çalabilmeniz için, geçen ay üstünde oldukça durduğumuz Api fonksiyonlarına ihtiyacınız var. İlk olarak bu fonksiyonu kullanarak ufak bir program yaptık. Bize gerekli olanlar: dosya seçiminde kullanacağımız bir sürücü listesi, dizin listesi ve dosya listesi, bir de seçilen dosyayı görebilmemiz için gereken bir etiket. Formunuzun üstüne bunları gösterildiği biçimde yerleştirin ve hemen kodlarımızı yazmaya başlayın...

Ses dosyalarını çalabilmek için öncelikle bir ses kartına ya da sesleri PC hoparlöründen dinleyebilmek için bir sürücüye ihtiyacınız var. (Bu sürücüyü PC WORLD BBS'ten edinebilirsiniz.) İşte ses dosyalarını çalabilmeniz için gereken API fonksiyonu ve parametreleri. Bunları iyice inceledikten sonra programımızı yazmaya başlayabilirsiniz.

Declare Function sndPlaySound Lib "MMSYSTEM.DLL" (ByVal ses$, ByVal<ozellik%) As Integer

Parametreler:

ses$
Çalınacak ses dosyasını belirtir.Eğer ses dosyası belirtilmezse o anda çalan dosya durdurulur.

ozellik%
Bu değişken yerine ses dosyasının nasıl çalınacağını belirten aşağıdaki sabitlerden biri
kullanılmalıdır.

SND_SYNC
Sistem olaylarını durdurur. Program kontrolü ses dosyası çalındıktan sonra geri döner.

SND_ASYNC
Ses arka planda çalar. Program kontrolü ses dosyasının hemen başında geri döner.

SND_NODEFAULT
Eğer belirttiğiniz ses dosyası bulunamadıysa hata mesajı verilmeden programa geri dönülür.

SND_LOOP
Çalmak istediğiniz ses dosyası sndPlaySound fonksiyonuna boş bir değer verene kadar tekrar eder. Eğer bu özelliği kullanıyorsanız aynı zamanda ses dosyasını geri planda çalmaya yarayan SND_ASYNC fonksiyonunu kullanmalısınız.


SND_NOSTOP
Eğer herhangi bir ses o anda çalınıyorsa istediğiniz dosya çalınmaz ve bu fonksiyonu atadığınız değer anında 0 (False) olur. Bu özellik aynı zamanda o anda bir sesin çalınıp çalınmadığını anlamanıza da yardımcı olur.

Not: sndPlaySound fonksiyonu eğer belirttiğiniz dosya sorunsuz olarak çalınırsa 1 değerini döndürür.

Gelelim programımızın kodlarına. Aşağıdaki birinci paragraf programın diğer modüllerinden ayrı bir yere yazılmalıdır. (WAVCAL.BAS gibi.)

Declare Function sndPlaySound 
Lib "MMSYSTEM.DLL" (ByVal ses$, ByVal ozellik%) As Integer
Global Const SND_SYNC = &H0
Global Const SND_ASYN = &H1
Global Const SND_NODEFAULT = &H2
Global Const SND_LOOP = &H8
Global Const SND_NOSTOP = &H10
 
Sub Form_Load ()
ChDir "c:\windows" 
label1.Caption = ""
file1.Pattern = "*.wav" ' Sadece WAV uzantılı dosyalarımız listelensin
End Sub
 
Sub Drive1_Change ()
dir1.Path = drive1.Drive ' Sürücü değiştiğinde dizin listesini yenile
End Sub
 
Sub Dir1_Change ()
file1.Path = dir1.Path ' dizin değiştiğinde dosya listesini yenile
End Sub
 
Sub File1_Click ()
ses$ = dir1.Path + "\" + file1.FileName 
If Mid$(ses$, 4, 1) = "\" Then ' Eğer ana dizindeysek araya \ karakterini sokma
ses$ = dir1.Path + file1.FileName
End If

Burada Genel Dialog kutusunu kullanmamamızın bir dez avantajını görüyorsunuz. Her ne kadar bu kodu yazmadan programımız çalışsa da liste kutumuz ana dizini gördüğünde ses dosyamızın yerini bulmakta bir sorun yaşanacaktır. Yani yukarıdaki kod parçası her seferinde bu sorunu gidermek için kullanılabilir.

  label1.Caption = " Ses: " + ses$
  ozellik% = SND_ASYNC And SND_NODEFAULT
  X% = sndPlaySound(ses$, ozellik%)
End Sub

 

Visual Basic ile Kes - Kopyala -Yapıştır!

Windows altında çalışan hemen hemen tüm metin editörleri panoyu kullanır. Panoya veri yapıştırmayı, panodan veri almayı geçen aylarda verdiğimiz örneklerle iyice açıkladık. Peki metin editörleri metinin hangi parçasının seçildiğini nasıl anlıyor. Metnin belirli bir kısmını nasıl kesip alıyor? İstenilen metni bütün bir yazı içinde nasıl buluyor? Bu dediklerimizi yapmak için Visual Basic ile hazırlanmış tüm metin editörleri hemen hemen aynı teknikleri uygular. İşte bunlardan bir kaçı:

Metnin, kullanıcı tarafından seçilen kısmının anlaşılıp panoya kopyalanması için (Kopyala)


 
 
 
ClipBoard.SetText screen.ActiveControl.SelText

Metnin, kullanıcı tarafından seçilen kısmının anlaşılıp panoya kopyalanması ve seçilen yerin silinmesi için (Kes)

ClipBoard.SetText screen.ActiveControl.SelText  ' Seçilen metni ilk önce kopyala
screen.ActiveControl.SelText = "" ' Sonra işaretlenen yeri sil.

Panodan yapıştırılan kısmın kullanıcı tarafından seçilen kısmın üzerine yazılması için(Yapıştır)

screen.ActiveControl.SelText = ClipBoard.GetText() 

Metnin belirtilen kısmını anlamak ve metnin herhangi bir kısmını otomatik olarak seçtirmek için SelText komutunu, metnin hangi kısımdan seçilmeye başlanacağını tayin etmek için SelStart komutunu, Seçilecek metnin uzunluğunu ayarlamak için ise SelLength komutunu kullanıyoruz. Hatırlayacağınız gibi Microsoft Word kullanılırken CTRL+A tuş kombinasyonu tüm metni otomatik olarak seçebiliyordu. Sadece ufacık bir kod parçasıyla bunu gerçekleştirebiliriz.

text1.SelStart = 0   ' SelStart komutu metnin işaretlenen kısmının nereden
                     'başlayacağını belirtir. Biz işaretlemeye metnin 
                     'başından başlamak istiyoruz...
 
text1.SelLength = Len(text1.Text) 'Metnin işaretlenen kısmı metnin uzunluğu kadar olacak

Peki metin editörleri uzun bir yazının içinde istediğimiz kelimeyi nasıl arayıp buluyorlar?
Bunu anlamak için aşağıdaki kodu bir inceleyin.

Dim ara, nerede                       ' Kullanacağımız değişkenleri atayalım



                               ' Kullanıcıdan aranacak metni iste
ara = InputBox("Aranacak metni girin:", "Metin Teknikleri Örneği", , 1000, 1000)
nerede = InStr(text1.Text, ara)   ' Metni yazı içinde ara
If nerede Then   ' Bulunursa...
text1.SelStart = nerede - 1      ' Bulunan metnin başını işaretle
text1.SelLength = Len(ara)       ' Bulunan metnin uzunluğu kadar yazıyı işaretle
Else                            ' Metin bulunamazsa...
MsgBox "Metin bulunamadı!", 64
End If

Bütün bunları bildikten sonra oturup kendi metin editörünüzü kolayca yazabilirsiniz...

KeyPreview??

Visual Basic ile program yaparken sık sık başvurduğunuz Properties kutucuğundaki bir özellik hiç dikkatinizi çektimi? KeyPreview... Bu özellik sadece formları biçimlendirirken karşınıza çıkar. Ne işe yaradığına gelince, klavyeden girdiğiniz tuş vuruşlarının Visual Basic'ten önce programınız tarafından algılanmasını sağlar. Bunu yapabilmek için ise ilk önce bu özelliğin değerini True yapmalı sonra da formunuzun anlayacağı tuş vuruşlarını programınıza tanıtmalısınız. Örneğimizi uygulamak için öncelikle boş form üzerine de bir text kutusu yaratın ve formun General - Declarations kısmına aşağıdaki sabitleri yazın.

Option Explicit
Const KEY_F1 = &H70
Const KEY_F2 = &H71
Const KEY_ESCAPE = &H1B

Şimdi de bu yukarıda belirttiğiniz tuşlara basıldığında neler olacağını tayin edelim. Yukarıda belirtmediğiniz tuşlara bastığınızda (Aşağıda bunları kullanmış olsanız bile) Formunuz bunu daha önceden olduğu gibi sıradan tuş vuruşları olarak algılayacaktır.

Sub Form_KeyDown (KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
   Case KEY_F1: Text1.text = Date$
  ' F1 tuşuna basıldığında metin kutusundaki metin
   ' silinsin ve yerine tarih atansın.
   Case KEY_F2: Text1.Text = Time$  
'F2 tuşu ise metin kutumuza zamanı yazsın
   Case KEY_ESCAPE: Unload Me
 ' ESC tuşumuz ise aktif formu bellekten atsın.
  End Select
End Sub

Programlarınızda kullanabileceğiniz diğer tuş kodlarını Visual Basic ile gelen ve tüm diğer sabitlerin bulunduğu CONSTANT.TXT dosyasından bulabilirsiniz. Ayrıca yukarıda belirttiğimiz tuşları diğer tuş kombinasyonlarıyla da kullanabilirsiniz (Örnek CTRL+ALT+F5 gibi.)

Liste kutusuna yatay kaydırma çubuğu eklemek!

Aralarından seçim yapabileceğimiz verileri listelemek için Liste kutularını kullanırız. Ama eminim aranızda bu kontrolün bir özelliğinden çok yakınanlarınız vardır. Bildiğiniz gibi bu kontrol yatay kaydırma çubuklarını kabul etmez. Ama artık şu meşhur Api fonksiyonlarından birini kullanarak bunun üstesinden gelebiliriz.

 
SendMessage(hWnd%, LB_SETHORIZONTALEXTENT, wParam%, lParam&)
 
hWnd%   - Liste kutusunun kontrolünü alır
wParam% - Liste kutusunun kaç piksele kadar kaydırılabileceğini
tayin eder.
lParam% - Kullanılmaz

Not: Bu Api fonksiyonu sadece büyük harflerle yazılan sabitle kullanılır.

Bu fonksiyonu daha iyi açıklayabilmek için üzerinde bir liste kutusu bir de komut butonu olan bir form yaratın, sonra da aşağıdaki kodları ilgili yerlere girin.

'Formun General - Declarations bölümüne yazılacak 
ve her sabit tek satırda olacak
Declare Function SendMessage& Lib "user" (ByVal hWnd%, 
ByVal wMsg%, ByVal wParam%, ByVal lParam&)
Declare Function GetFocus Lib "User" () As Integer
 
Sub Command1_Click ()
Const LB_SETHORIZONTALEXTENT = &H400 + 21 'Sabitler...
Const NUL = &O0
ScaleMode = 3
List1.SetFocus
ListHwnd% = GetFocus()
 
' İlk karşımıza gelecek değişken
ListString1$ = "PCWORLD "
 
' Bu değişkeni görebilmek için ise liste
kutusunu yana doğru biraz kaydırmalısınız.
ListString2$ = "Türkiye'de Bir numara !"
 
ExtraPixels% = TextWidth(ListString2$)
BoxWidth% = TextWidth(ListString1$) + 50
 
' Liste kutumuzun boyutlarını tekrar belirleyelim
List1.Move List1.Left, List1.Top, BoxWidth%
 
' Yatak kaydırma çubuğumuzu ekleyelim ve sınırlarını çizelim
X& = SendMessage(ListHwnd%, LB_SETHORIZONTALEXTENT, BoxWidth% +
ExtraPixels%, NUL)
 
' Örneğimizi liste kutusuna ekleyelim....
List1.AddItem ListString1$ + ListString2$
End Sub

Bu kadar kolay!

VB 4.0
Sistem Programcıları İçin Enterprise Sürümü

Enterprise sürümü nedir?

Enterprise sürümü Microsoft’un VisualBasic 1.0’dan itibaren sürdürdüğü bir gelenektir. VisualBasic 1.0 ile başlayan bu sürümün amacı sistem programcılarının, client/server uygulamaları yaratan grupların ve Network ortamları için program yazan programcıların ihtiyaçlarını karşılamaktır. Bunu karşılamak içinde bu dediklerimizi gerçekleştirebilecek program geliştirme araçlarına ve harici komutlara ihtiyaç vardır.

Ana amaçları bunlar olan bu sürümün yapabildikleri bunlarla kalmıyor tabii. Bu yeni sürümle birlikte Remote Automation (Uzaktan kontrol) adı verilen yeni bir sistem ile OLE Otomasyonunu kullanan paylaşılabilir ve yeniden kullanılabilir bileşenler yaratabilir ve bunları programlarınıza yapıştırabilirsiniz. Bunların yanında programcıların sıklıkla başvuracakları yardımcı programlar ve kataloglar bu yeni pakete eklenmiş.

Enterprise sürümünün ilk olarak ilgimizi çeken özelliklerinden biri de birlikte getirdiği kaynak kitaplar ve referanslar. Bu kitaplarda Client/Server uygulamaları yaratmak, OLE Otomasyonu, DDE ve SQL kullanımı ve bunun gibi bir çok konuya yönelik ayrıntılı bilgiler ve örnekler bulabilirsiniz. Microsoft’un çok üstünde durduğu yeniliklerden biri de RDO (Remote Data Objects) ve RDC (Remote Data Control)’dur. Bu iki özellik uygulamalarınızın, ODBC veri kaynaklarına herhangi bir lokal veritabanı sorgulayıcı (Microsoft Query gibi.) kullanmadan ulaşabilmelerini sağlar. Bunun anlamı; ağ birimlerindeki client/server veritabanı motorlarına ulaşırken sağlanacak gözle görünür artış ve esnekliktir. RDO ve RDC, ODBC verilerine ulaşabildiği gibi aynı zamanda karmaşık tabanlar kullanan Microsoft SQL Server ve Oracle gibi veritabanı ortamlarının avantajlarından yararlanabilecek biçimde tasarlanmıştır...

 

 

 

 

Enterprise paketi ile birlikte büyük programcı grupların programlarını çabucak geliştirmekte kullanacakları akıllı aygıtlarda verilmiştir. Visual Source Safe bunlardan biridir...

Visual SourceSafe Nedir?

Visual Basic’in Enterprise sürümü, geliştirilmiş bir kaynak kod kontrol sistemi; Visual SourceSafe ile birlikte gelir. Bu sistem, program geliştiren büyük gruplar için tasarlanmış kullanımı kolay bir alt programdır. Program, üzerinde çalışılan uygulamaya yapılan her bir değişikliğin kaydını tutar, böylece kullanılan dosyalar, (kod modülleri gibi) tekrar kullanılabilir, yapılan değişiklikler ve hatalar kolaylıkla geri alınabilir. Program dosyalara yapılan her bir değişikliğin kaydını tuttuğundan, programcılar isterlerse üzerinde uğraştıkları herhangi bir dosyanın ne gibi değişikliklere uğradığını görebilir, hatta dosyayı eski haline getirebilirler. Visual SourceSafe her büyüklükte projeyi ve çok kullanıcılı sistemleri rahatlıkla kaldırabilecek yetenektedir.

Visual Basic 4.0’ı tanıtırken değindiğimiz yeniliklerden biri de Object Browser’dı. Object Browser’ı kullanarak kod parçalarını ve kontrol özelliklerini programınızın ilgili modülüne kolayca yapıştırabilirsiniz…

Object Browser Nedir?

Object Browser, yarattığınız uygulamanın herhangi bir modülünde veya uygulamanızda yararlandığınız herhangi bir kütüphanede, kullanabileceğiniz sınıfları, özellikleri ve methodları gösterir. Object Browser’ı kullanarak, bunların haricinde, faydalandığınız kütüphanelerdeki methodları ve özellikleri sadece Paste seçeneğini kullanarak hiç zahmetsiz programlarınıza yapıştırabilirsiniz...

Object Browser, formunuzu oluşturan kontrolleri tanıyabildiği gibi Toolbox’a eklediğiniz herhangi bir WINDOWS nesnesini de tanıyabilir. (Medya aygıtı, Paintbrush resmi v.b.)

Remote Automation

OLE Otomasyonu kullanan ağ birimleri kurmak, ortak bilgileri ve programları kullanmak için ideal bir yoldur. Enterprise paketini, OLE kullanan bir ağ birimine kurduğunuzda VB bunu görecek ve ağ biriminindeki her bir programcıya programı kullanması için izin verecektir. Remote Automation kullanılarak, ağ ortamlarında fazla zaman harcamadan, OLE kullanan Client/Server uygulamaları programlanabilir. Enterprise Sürümünde özellikle bu uygulamaları yaratabilmeniz için gereken komutlar ve bunlar hakkında ayrıntılı açıklamalar vardır.

Component Manager (Bileşen Yöneticisi) Nedir?

Enterprise sürümünde, özellikle Ağ programcılarının hayatlarını kurtaracak yan programlara ve komutlara yer verilmiştir. Bileşen yöneticisi bunlardan biridir. Microsoft Component Manager'ı kullanarak:

*- Ağ ortamlarının her bir kısmındaki OLE hizmetçilerinin yerlerini tayin edebilir.

*- Birbiriyle ilişkili OLE Nesnelerini gruplayabilir ve katalog haline getirebilir.

*- Visual Basic Projelerinizde kullanmak üzere OLE hizmetçilerini harekete geçirebilir

*- Ağ ortamlarındaki OLE hizmetçileri hakkında ayrıntılı bilgilere sahip olabilirsiniz.

Visual Basic 4.0 ile gelen yenilikler

Veri ızgaraları, veri listeleri...

Veritabanı dosyalarınızı görüntüleyebilmek için eskiden genellikle ızgara kontrolü kullanılırdı. Visual Basic 4.0 ile ise yeni kontroller olan DBGRID, DBLIST ve DBCOMBO’yu kullanabilirsiniz Bu kontroller özellikle verilerin görüntülenmesi ve direk veri alışverişi için tasarlanmıştır. Aslında VB3.0 ile gelen OLE kontrolüde de iyi bir veri sorgulayıcıdır ama yine de yeni kontrollerin kolaylığını ve verileri listelemedeki üstünlüğünü yakalayamıyor.

OLE Otomasyonu

Visual Basic4.0'ın OLE kontrolünü kullanarak WINDOWS altında çalışan diğer programların işlevselliğini "ödünç" alabilirsiniz. Eğer kullanmak istediğiniz nesne bir OLE nesnesi ise VB ile bu nesnenin methodlarını ve özelliklerini tıpkı bir VB kontrolü gibi kullananbilirsiniz.

Her bir OLE nesnesi bir apartman dairesi gibidir, nesneleri ve onların programlarınıza kattığı fonksiyonları kullanarak apartmanı oluşturursunuz. Örneğin, OLE'yi kullanarak Microsoft Excel'i bir hesaplama ortamı, Microsoft Word'u ise dökümanları yaratmakta kullanan bir uygulama yaratmak o kadar da zor değil. VB4.0 ile artık herhangi bir WINDOWS nesnesini (Örneğin bu nesne bir Microsoft Excel hesap tablosu olsun) Toolbox'a sürükleyip sonradan ona kolayca ulaşabilirsiniz. ToolBox'dan nesneyi alın... bunu formunuza yapıştırıp bir programla bağlantı kurduğunuzda;

*- ister bir daha kullanılmak üzere, kurduğunuz "bağlantıyı" bir dosyaya kaydeder

*- ister bağlantı halinde olmayan nesnenizi tamamiyle bir dosya haline getirir.

*- ister bağlantı içindeki verileri diğer uygulamayla eş zamanlı olarak değiştiren ve kaydeden bir ortam yaratırsınız.

Bu anlattıklarımı gelecek aylarda ayrıntılı olarak uygulayacağız... Hazrlıklı olun!

Tekrar-kullanılabilir nesneler

VB4.0 ile herbiri kendi özelliklerine ve methodlarına sahip olan "tekrar-kullanılabilir" nesneler yani "sınıflar" yaratabilir ve bunları Visual Basic4.0'ın yeni özelliklerinden biri olan "sınıf modüllerine" katabilirsiniz. (Tıpkı kütüphaneler gibi...)

32Bit veriyolu desteği ve Conditional Compilation

*- Şartlı derleme uygulamalarınızın değişik WINDOWS platformlarına uyum sağlıyabilmesi için tasarlanmıştır.

WINDOWS 3.10, WINDOWS95 ve WindowsNT 'den farklı API 'ler ve sabitler kullandığından, örneğin 16Bitlik bir işletim sisteminde yazdığınız programınız 32Bitlik ortama geçtiğinde bu farklılıklardan dolayı çalışmayabilir. Hatırlayacağınız gibi VB4.0'ı tanıtırken "Şartlı derlemeye" değinmiştik. Şimdi sıra bunu uygulamaya geldi. Geçin bilgisayarınızın başına ve aşağıdaki birkaç satırlık kaynak kodu yazın. Programı çalıştırdığınızda, size kaç bitlik bir işletim sistemi kullanıldığını söyleyecektir.

Private Sub Form_Load()
#If Win16 Then
      MsgBox "Kullandığınız İşletim sistemi 16 Bit", , "Şartlı derleme örneği."
      'İşletim sistemi 16Bit. Komutlar...
#ElseIf Win32 Then
      MsgBox "Kullandığınız İşletim sistemi 32 Bit", , "Şartlı derleme örneği."
      'İşletim sistemi 32Bit. Diğer komutlar...
#Else
     'İşletim sistemi iki platforma da uymuyor. Komutlar...
#End If
End
End Sub

Şartlı derlemeyi sadece nesnelerde ve olaylarında değil sabitlerin ve fonksiyonların tanımlanmasında da kullanabilirsiniz. Aşağıdaki örnekte olduğu gibi:

General - Declarations
#If Win32 Then
Global Const...
Declare Function...
Declare Sub (...
 
#Else
Global Const ...
Declare Function...
 
#End If

Windows95 ile gelen yeni kontroller

Visual Basic4.0 (32Bit) içinde Windows95 ile gelen yeni kontrolleri de barındırır. (Maalesef sadece 32Bitlik sürüm için geçerli) Örneğin programlarınızın içinde yeni kontroller olan liste, ağaç görüntülerini, bir durum çubuğunu, alet kutularını, bölmeli dialog kutularını ve Slider kotrolünü kullanabilirsiniz.

Hatırlayacağınız gibi WINDOWS95'in Write'ı olan WordPad RTF (Rich Text Format) kullanıyordu. Yeni Visual Basic de bu kontrolü barındırıyor. RichTextBox'u formunuza yapıştırdıktan sonra üzerinde çalıştığınız dosyayı kaydedin... Dosya bu formatta kaydedilecektir. Böylece, artık bir text kutusu üzerinde birden fazla font büyüklüğü, renk ve özellik kulannabileceksiniz.

Bir Form üzerinde birden çok görüntü kullanabilmek

Öyle zamanlar olur ki projenize bir form daha eklemek ya da başka bir form’u çağırmak istemezsiniz. Ya da, aranızda VB ile çağırılan formların yavaş yüklendiğini düşünenler olabilir. O zaman biz de buna bir çözüm bulalım. Sadece resim kutularını kullanarak form üzerinde değişik görüntüler yaratabilir form üzerindeki kontrollerin yerlerini sadece resim kutularının yerlerini değiştirerek tayin edebilirsiniz. Öncelikle aşağıdaki 1.resimde görülen formu oluşturun. Görülen kontrolleri resimde görüldüğü gibi iki ayrı resim kutusu üzerinde (sınırları içine) yerleştirin.
Kontrolleri yerleştirdikten sonra formu sağ tarafından daraltarak ikinci resim kutusunun ve üstündeki kontrollerin görülmemesini sağlayın. Programı çalıştırın ve opsiyon kutularını kullanarak formun görünen kısmındaki değişimi görün. İşte programınızın kodları. Oldukça kısa...

 
Private Sub Form_Load()
Option1.Value = 1 ‘Opsiyon kutucuğu - 1’in değerini "doğru" yap.
End Sub
 
Private Sub Option1_Click()
Picture1.Visible = True   ‘1.resim kutusunu görülür yap.
Picture2.Visible = False  ‘2.’ni kaybet.
Picture1.Move 150, 150    ‘1.kutucuk seçilirse 1. Resmi görülür hale getir.
End Sub
 
Private Sub Option2_Click()
Picture2.Visible = True   ‘2.resim kutusunu görülür yap.
Picture1.Visible = False
Picture2.Move 150, 150    ‘2.kutucuk seçilirse 2. Resmi görülür hale getir.
End Sub
 

Izgara Etiketleri

Excel kullananlar bilirler; bir hesap tablosunun yan ve alt kaydırma çubuklarını ne kadar kaydırırsanız kaydırın hesap tablosunun sonu bir türlü gelmez. Bununla birlikte çubuğunu her kaydırdığınızda yeni harfler ve sayılar gelir. Visual Basic ile gelen ızgara kontrolünü kullandığınızda ise yandaki ve üstteki hücrelerin boş kaldığını görürsünüz. Peki Excel’deki gibi uçsuz bucaksız hesap tablolarını nasıl yaratacaksınız? Bunu yapmanın yolu tabii ki yine kodlardan geçiyor...

 
Private Sub Form_Load()
Dim i As Integer
   Grid1.Rows = 50
   Grid1.Cols = 50
   Grid1.Col = 0: Grid1.Row = 0
   Grid1.Picture = Picture1.Picture
    'Izgara kontrolünün en az 1 sütun veya 1 satırdan oluştuğundan emin ol.
    If Grid1.FixedCols < 1 Or Grid1.FixedRows < 1 Then
    Stop
    End If
 
    'Kontrolün üstüne harfleri yerleştirmeye başla.
    For i = 0 To Grid1.Cols - 2
        Grid1.Col = i + 1
        Grid1.Row = 0
        Grid1.Text = Chr$(i Mod 26 + Asc("A"))
        'Eğer sütun sayısı 26’yı geçiyorsa çift karakter kullan.
        If i + Asc("A") > Asc("Z") Then
        Grid1.Text = Chr$(i \ 26 - 1 + Asc("A")) + Grid1.Text
        End If
        Grid1.FixedAlignment(Grid1.Col) = 2  'Merkeze getir.
    Next
 
    'numaraları alt-sol köşeye yerleştir.
    For i = 1 To Grid1.Rows - 1
        Grid1.Col = 0
        Grid1.Row = i
        Grid1.Text = Format$(i)
    Next
    Grid1.FixedAlignment(0) = 2  ' Merkeze getir.
End Sub

Püf Noktası: Resimde gördüğünüz gibi yerleşik satırların ve sütunların ortasında ufak bir resim var. Peki o resmi oraya nasıl yerleştirdik? Bildiğiniz gibi ızgara kontrolünün Properties kutucuğuna baktığınızda böyle bir özellik görülmüyor. Eklediğimiz şu satır:

Grid1.Picture = Picture1.Picture

bu işi başarmıştır. Tabii ki bu satırı eklemeden bir resim kutusu yaratmalı ve istediğiniz resmi bu kutuya önceden eklemelisiniz.

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 farkedeceksiniz. Form üzerindeki diğer kontrollleri 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 Sub Option2_Click()
pano.Visible = True
End Sub
 
Private Sub tarih_Click()
Text1.Text = Text1.Text & Now
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:
End Sub
 

Son işlemi geri almak

Sevgili Windows’unuz programlarınızda kullanabilmeniz için gerekli olan herşeyi önünüze sunmuştur. Örneğin geçen ay verdiğimiz tekniklerden sonra bir text editörü yapmaya karar verdiniz. Ama her editörde olan bir özelliği siz kullananmıyorsunuz; "Geri Alma İşlemi". Ya da editörünüz yaptığınız her hareketten önce text kutusundaki yazılarınızı bir köşede saklıyor.
Dediğimiz gibi WINDOWS, size sunduğu bir API fonksiyonuyla sizi bu zahmetten kurtarıyor. Şekildeki gibi bir form yarattıktan sonra aşağıdaki kısacık kodu girin ve sonuca bir bakın. Programı çalıştırdığınızda her zaman bir önce yaptığınız işlemin kaydedildiğini ve butona basıldığında text kutucuğu üzerine geri geldiği göreceksiniz.

GERIAL.BAS adlı formunuzdan ayrı bir modül yaratıp ilk 4 satırı bunun içine kaydedin.

Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal
wParam As Integer, lParam As Any) As Long
Global Const WM_USER = &H400
Global Const EM_UNDO = WM_USER + 23
 
‘Şimdi formumuza geçebiliriz...
Private Sub Command1_Click()
'Text kutusundaki metin değişmeden önce her seferinde WINDOWS tarafından otomatik ‘olarak
saklanır.
 
UndoResult = SendMessage(Text1.hWnd, EM_UNDO, 0, 0) ‘API fonksiyonunu çağır.
'Eğer UndoResult = -1 ise bir hata oluşmuş demektir.
End Sub

 

Visual Basic ile Veritabanına ilk Adımlar

Bu örneğimiz Visual Basic ile veritabanlarının kullanımı hakkında size az çok bilgi verir umarım. Örneğimizi uygulamak için Visual Basic ile örnek olarak gelen BIBLIO.MDB adlı veritabanına ihtiyacınız var. (Umarım bu dosyanın hiç bir işe yaramadığını düşünüp silmemişsinizdir.) Hazırsanız veritabanı programınızı oluşturacak adımları uygulamaya başlayabiliriz.

Adım - 1 Öncelikle alet kutucuğundan "veri" kontrolünü seçerek formunuzun üzerinde istediğiniz büyüklüğe getirin. Bu kontrolü veritabanı içinde hareket etmek için kullanacağız. Örnek için formunuzun son haline bakabilirsiniz.

Adım - 2 Data 1 kontrolünün Properties kutucuğunu aktif hale getirin ve buradan Connect seçeneğini Access olacak biçimde değiştirin.

Adım - 3 Yine Data 1 kontrolünün Properties kutucuğu aktifken, kontrolün DatabaseName seçeneğini kullanarak istediğiniz veritabanını seçin. Biz bu örneğimizde BIBLIO.MDB dosyasını kullanacağız, bu yüzden seçeneği bu dosyayı görecek biçimde ayarlayın.

Not: Eğer diğer programlarla ilişkilerden dolayı, bu kontrole, tasarım aşamasında istediğiniz veritabanını atayamıyorsanız DatabaseName özelliğini, programınızın çalışma aşamasında değiştirip program çalışırken istediğiniz veritabanı dosyasını seçebilirsiniz.

Adım - 4 Data 1 kontrolünüzün RecordSource seçeneğini, veri tabanının istediğiniz tablosuna erişim sağlamak için kullanın. Eğer daha önceden DatabaseName seçeneğine herhangi bir veritabanı dosyası atadıysanız. RecordSource seçeneğine tıkladığınızda karşınıza seçtiğiniz veritabanı dosyasında kullanabileceğiniz bölümler gelecektir. Biz bu örneğimizde "Titles" bölümünü kullanacağız.

Adım - 5 Formunuzun üzerine, veritabanı dosyasında seçtiğiniz alanları görüntüleyebilmek için istediğiniz sayıda metin kutusu yerleştirin. Biz örneğimizde 3 farklı alan kullanacağımızdan formumuza 3 adet metin kutusu yerleştirdik. Veritabanımızı görüntülemek için kullanacağınız kontroller metin kutularıyla sınırlı değil. Resim kutularını, ızgara kontrolünü, etiket kontrolünü ve bunun gibi birçok kontrolü bu iş için kullanabilirsiniz.

Not: Yerleştirdiğiniz metin kutularını kullanarak veritabanı dosyasında kalıcı değişiklikler yapabilirsiniz.

Adım - 6 Text1 kontrolünün Özellikler kutusunu aktif hale getirerek DataSource seçeneğini "Data1"i gösterecek biçimde değiştirin.

Adım - 7 Metin kutularının yanlarında seçtiğiniz alanlara uygun etiketler yerleştirin.

Adım - 8 "Text1" metin kutusunun görüntüleyeceği veritabanı alanını DataField seçeneğini kullanarak değiştirin. Bu işlemi her bir metin kutusu için gerçekleştirin ve her birinin farklı alanları göstermesini sağlayın.

Adım - 9 Son olarak programa bir çıkış tuşu ekleyin ve programı çalıştırın. Ok tuşlarını kullanarak veritabanı içinde gezinebilir, metin kutularının alanlarını değiştirerek, diğer alanlardaki verileri görüntüleyebilirsiniz.

Meraklı VB kullanıcıları tabii ki bununla yetinmek istemeyecek ve diğer komutları ve özellikleri öğrenmek isteyecekler. Merak etmeyin ileride bu konuya dair daha büyük uygulamalar yaratır, güzel püf noktalarına değiniriz.

Visual Basic ve Bug'lar

Visual Basic 3.0 ile gelen kurulum programını kullanıyorsanız. Programınızı Windows’unuzun bulunduğu dizine kurmaya kalkarsanız, Visual Basic "Setup Files Have Been Modified or Corrupted" hata mesajını verdikten sonra program kapanır ve Windows’a geri dönülür. Fakat programı değişik bir dizine kurmak istediğinizde bir problem çıkmadığını görürsünüz.

Ne yapmalı?
Bu problemi çözmek için AUTOEXEC.BAT dosyanızda Windows’unuzun yerini belirleyen PATH tanımını sürücü ismi vermeden kullanın. "\WINDOWS", "\WIN31" gibi...

Eğer Visual Basic 3.0 kullanıyorsanız ve üzerinde çalıştığınız projeyi File * Make EXE File komutunu seçerek EXE haline getirdiyseniz programda hiç değişiklik yapmadan bir daha derlediğinizde programın boyunda gereksiz bir uzama olduğunu görürsünüz. Program ona değişiklik yapmadığınız ve derlediğiniz her seferinde daha da uzar!
Çok ilginçtir ki bu sayede meydana gelen EXE dosyalar WINDOWS altında hiç sorun çıkarmadan çalışabiliyor...

Ne yapmalı?
Bunu önlemek için programı derlemeden önce üzerinde ufak bir değişiklik yapın. Örneğin programda kullandığınız formlardan birini bir milimetre yana kaydırın. Böylece VB 3.0 aynı proje için eski EXE’yi silip yepyeni bir EXE yaratır.

VB 1.0, 2.0 ya da 3.0 kullanıyorsanız "Illegal function call" or "Division by zero" gibi "genel" hata mesajları ile sık sık karşılaşıyorsanız suçu pek te kendinizde aramayın. Çünkü Visual Basic’in karışık işlemlerden sık sık kafası karışır! Örneğin aşağıdaki işlem matematik işlemcisi olan bir bilgisayarda "Illegal Function Call" hatasının ekrana gelmesine neden olur

test = 1 + (1 + 1 * (1 * (1 + 1 ^ 1)))

Aşağıdaki işlem ise, yine matematik işlemcili bir bilgisayarda "Division by zero" (Bir sayının sıfıra bölünmesi) hatasını veriyor

test = 1 + (1 - 1 * (1 + 1 / 1 ^ 1))

Visual Basic 4.0 ise böyle bir program hatası barındırmıyor. Yani programlama dilinizin aklını istediğiniz kadar karıştırabilirsiniz.

 

Ne Yapmalı?
Bu problemi çözmek için işlemin karışık parçalarını daha basit parçalara ayırıp ayrı ayrı hesaplatılmasını sağlayabilirsiniz.

Eğer VB 1.0, 3.0 veya 4.0 kullanıyorsanız (Yani herhangi bir sürümünü) seçim kutusu kontrolündeki bir programlama hatasını yakalamış olabilirsiniz. Bir form üzerine iki yada daha fazla seçenek kutusu koyduğunuzda ve programı çalıştırdığınızda bu kutulardan mutlaka biri seçili durumda olmalıdır. Zaten kutucuğun mantığı da budur, kullanıcının mutlaka bir seçeneği seçmesini sağlamak... Kontrol bu şekilde kullanıldığında sorunsuz olarak çalışıyor fakat kutucukları frame’lerle (gruplama kontrolü) ayırdığınızda bir sorun çıkıyor. Ayrı gruplara ayrılmış olan seçim kutularından örneğin ikinci grupta bir seçeneğin mutlaka işaretli olması gerekirken böyle olmuyor.

Ne yapmalı?
Bu sorunu çözmek çok basit, formun yüklenmesi esnasında 4. seçenek kutusunu aktif yapmak için şöyle bir satır kullanabilirsiniz:

Sub Form[sayı].Load()
Option4.Value = True
End Sub


Tüm Visual Basic’lerde kötü bir huy var... Bu kötü huy MDI formlarla çalışırken ortaya çıkıyor. Bir Form içine iki tane MDIChild açtınız diyelim. Windows’un kendi özelliği sayesinde bu iki form arasında CTRL+TAB tuşlarını kullanarak geçiş yapabilirsiniz. Problem iki MDIChild form da normal boyutta olduğunda ortaya çıkmıyor, fakat MDIChild’lardan birini ana formla aynı boyuta getirince yani maximize edince CTRL+TAB işe yaramıyor. İki MDIChild’da aktif olmuyor.

Ne Yapmalı? Bu programlama hatasını gidermek oldukça zor. Programınızda CTRL+TAB tuş kombinasyonunu ele geçirip Windows’un otomatik olarak yaptığını siz programınıza yaptırmalısınız. En kolay çözüm formlardan hiçbiri aktif olmadığında formun aktif olması için üzerine bir kere tıklamak...

Eğer Visual Basic 3.0 kullanıyorsanız VB’nin yazıcı ile olan problemlerinden birini bilmenizde fayda var. Programınız çalışırken "Varsayılan Yazıcı"nızı değiştirirseniz Printer.Fonts özelliğinin güncellenmediğini görürsünüz.

Ne yapmalı?
Bu problem Visual Basic 4.0’da giderilmiş ama yine de VB 3.0 kullananlara yardımcı olalım. Programınızın içerisinde şu satırları kullanırsanız probleminizin giderildiğini görürsünüz:

‘Yazıcıdaki Dökümanı Sonlandır...
Printer.EndDoc
‘Boş bir sayfa bas.
Printer.Print ""

Bu çözümün tek dezavantajı yazıcıdan boş bir kağıt çıkarmasıdır. Ama yine de Printer.Font özelliğinin güncellenmesini ve programın yeni yazıcıyı tanımasını sağlıyor...

Eğer Visual Basic 3.0 veya daha geri sürümlerini kullanıyorsanız ızgara (grid) kontrolünüzde ufak bir sorun var demektir, çünkü Visual Basic bazen gereksiz yere ızgara kontrolünün kaydırma çubuklarını ortaya çıkarıyor. Kontrolün "ScrollBars" özelliğini 3 (Both) yaptıysanız, son sütunla ızgara penceresi arasında sütun genişliğinin yarısı kadar veya daha az yer varsa bu hata ortaya çıkıyor.

Ne Yapmalı?
Bu problemi gidermek için ilgili formun yüklenme koduna aşağıdaki satırları ekleyin. Kaydırma çubuğu yok edilip geri getirildiğinde sorun çözülüyor...

Sub Form_Load ()
'Kaydırma Çubuğu Ayarlarını Kaydet
kaydet% = Grid1.ScrollBars   
Grid1.ScrollBars = 0       'Kaydırma çubuklarını kaldır
Grid1.ScrollBars = kaydet%      'Çubukları geri getir 
End Sub

Visual Basic 4.0’da bu programlama hatası giderilmiş.

Visual Basic 3.0 kullanıyorsanız sürücü kontrolünde bulunan bir hatayı bilmenizde sonsuz fayda var.
Sürücü kontrolü, dosya listesi kontrolü ve ilgili diğer kontrolleri birarada kullandığınızda problem ortaya çıkıyor. Formun üzerinde bir sürücü bir de dizin kontrolü olduğunu varsayalım.
Drive1 kontrolünün refresh özelliğine dir1.path = drive1.drive kodunu eklemenize rağmen a: sürücüsüne ikinci bir kere geçtiğinizde sürücünün içeriği tazelenmeyecek ve sürücüde disket olmasa bile hata meydana gelmeyecektir.

Ne Yapmalı?
Bu problemi gidermek için drive1 kontrolünün refresh özelliğine drive1.refresh satırını eklemelisiniz. İşinizi garantiye almak istiyorsanız aynı zamanda refresh isimli bir komut butonu oluşturarak bunun içerisine aşağıdaki kodları da girebilirsiniz.
drive1.refresh
dir1.refresh
file1.refresh

Windows’tan hızlı çıkış.

WINDOWS, programcıların işini kolaylaştırmak için elinden geleni yapar. Örneğin bazı programlar WINDOWS’u yeniden başlatmak Windows’tan çıkmak bilgisayarı boot etmek gibi bazı özelliklere sahiptir. Bunu nasıl mı sağlıyorlar? Tabii ki şu meşhur API fonksiyonlarını çağırarak... Örneğimizi uygulamak için öncelikle yeni bir modül yaratıp aşağıdaki satırı bu modüle girin.

Declare Function ExitWindows Lib "user" (ByVal kod As Long, ByVal rezerve As Integer) As Integer

WINDOWS oturumunu kapatmak için o anda aktif olacak bir yere (Form1_Load gibi...) aşağıdaki satırı girin.

Deger = ExitWindows(0,0)  ‘İşlem başarılamadıysa “Deger” “1” den farklı olur.

Windows’u kapatıp tekrar başlatmak için ise şu satırı kullanın:

Deger = ExitWindows(&H42,0)  ‘İşlem başarılamadıysa “Deger” “1” den farklı olur.

Yarattığınız modülleri kaydetmeyi unutmayın çünkü programı çalıştırdığınızda VB size projenizi kaydedip kaydetmemek istediğinizi sormayacak ve direkt Windows’tan çıkacaktır. Program Windows’un bir API’sini çağırdığından diğer çalışmalarınızda kaydetmediğiniz dökümanlarınız varsa Windows’tan çıkılmadan bu hususlara dikkat edilecektir. Buna bağlı olarak API’yi kullandığınızda programınızın da sonlanmasına dikkat etmelisiniz, (Mesela sonuna END koyun.) çünkü Windows kapatılamazsa programa geri dönülür.

 

Program Yöneticisine program grubu yarattırmak

Visual Basic ile gelen kurulum programı yarrattığınız uygulamayı sabit diske kopyaladıktan sonra onun için Program Yöneticisinde bir grup yaratabilir.
Kurulum programı VB ile yazıldığına göre biz de bunu basit bir DDE (Dynamic Data Exchange / Dinamik Veri Alışverişi) bağlantısı kurarak kolayca başarabiliriz. Örneğimiz için boş bir form üzerinde bir komut butonu bir de bağlantıya aracı olacak "metin kutusu" yerleştirin ve oluşturduğunuz komut butonuna aşağıdaki kodları girin. Metin kutusunun ise bağlantıyı taşımaktan başka hiç bir işlevi yok.

Sub Command1_Click()
Text1.LinkTopic = "ProgMan|Progman" 'Bağlantı kurulacak program
Text1.LinkMode = 2    'Kullanıcı bağlantısı yarat
 
Text1.LinkExecute "[CreateGroup(PC WORLD Türkiye)]"
'Windows Program Yöneticisinde yeni bir grup yarat
 
Text1.LinkExecute "[AddItem(c:\vb\vb.exe, Visual Basic)]"   
'Burada belirttiğimiz dizini kendinize göre değiştirin.
Text1.LinkExecute "[AddItem(c:\vb\vb.hlp, Visual Basic Yardımı)]"
'Gruba iki yeni öğe ekle
 
Text1.LinkExecute "[ShowGroup(PC WORLD Türkiye, 7)]"
'Grubu simge haline getir ve Visual Basic’e geri dön
 
On Error Resume Next  'Hata oluşursa işleme devam et. Sebep?
'Windows 3.0 ile VB bu aşamada uyumsuzluk çıkarır!
Text1.LinkMode = 0    ' bağlantıyı kes
End     ‘Son...
End Sub

Programı çalıştırdığınızda Program Yöneticinizde “PC WORLD Türkiye” adında yeni bir grup oluşacak ve bu grubun içinde iki simge belirecektir. DDE kullanarak programlara bağlanmak onlara komut vermek ve bu sayede veri alışverişi yapmak çok kolaydır. DDE kullanarak Excel hücrelerinden veri kopyalama işlemini bile sadece kopyalanacak hücreleri tayin ederek kolayca gerçekleştirebilirsiniz. Bu konu oldukça geniş olduğundan ileriki sayılarımızda mutlaka değineceğiz.

 

Bir ICO dosyasını fare imleci olarak kullanmak

Bildiğiniz gibi her WINDOWS uygulaması fare imlecini programın durumuna göre değiştiriyor. Ama Windows’un kullandığı fare imleçlerinden sıkılmış olabilirsiniz. Sadece kendi uygulamanız için geçici bir çözüm yaratabilirsiniz, çünkü VB farenin imlecini programınız sınırları içinde değiştirmenize izin verir. Aşağıdaki kodları inceleyin ve ne kadar basit olduğunu görün.

Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)  ‘İmleç metin kutusunun üzerine geldiğinde...
Text1.MousePointer = 99   ‘İmleci kullanıcı kararına bırak.
Text1.MouseIcon = LoadPicture("c:\point01.ico")   ‘imleci bir simge haline getir.
End Sub
 

Bir Türlü Sıraya Girmiyor!

Yeni bir proje açtınız ve formunuzu yaratmaya, üzerine iki komut düğmesi koyarak başladınız diyelim. Ama bir süre sonra bu iki düğmenin arasına başka bir düğme koymak istediniz ve de koydunuz. Programınızı çalıştırdınız ve Tab tuşunu kullanarak form üzerindeki kontroller arasında geçiş yapıyorsunuz. İşte bu noktada sizi çok rahatsız edecek bir durumla karşılaşacaksınız. Çünkü Visual Basic Tab tuşu ile geçiş sırasını, kontrollerin yaratılış sırasına göre tayin eder. Bu rahatsız edici durumu, hemen hemen tüm kontroller için Properties kutucuğunda bulunan “TabIndex” özelliğini kullanarak giderebilir ve kontrollerin Tab sırasını istediğiniz gibi ayarlayabilirsiniz. Örneğin, bu üç tuşu Tab sırasına koymak için önce birinci yarattığınız düğmenin üzerine gidin ve onu aktif yaptıktan sonra Properties kutucuğundan TabIndex değerini “0” yapın. İkinci düğmeye gelin ve TabIndex değerini “1” yapın. Programı çalıştırdığınızda düğmelerin Tab sırasına girdiğini göreceksiniz.

Püf Noktası: Form üzerinde herhangi bir kontrolün Tab tuşu ile aktif olmamasını “TabStop” özelliğini “False” yaparak sağlayabilirsiniz.

Peki, belli bir durumun gerçekleşmesi sonucunda Form üzerinde başka bir kontrolün aktif olmasını nasıl sağlayabiliriz? Bu işi yapmak için ise SetFocus komutunu kullanırız. Belli bir koşul gerçekleştiğinde, örneğin bir opsiyon kutusu seçildiğinde herhangi bir metin kutusunu aktif yapmak için

Sub Option1_Click
Form1.Text1.SetFocus
End Sub

gibi bir satır kullanabilirsiniz. Fakat ne yazık ki bu komutu Formun yüklenmesi sırasında (Form_Load) kullanamazsınız.

 

Menüye Çok Kullanılan Dosyaları Eklemek

İşte Visual Basic programlarınıza profesyonellik katacak bir püf noktası daha. Word, Excel gibi popüler programlar Dosya menülerinde “En son kullanılan” dosyalar için bir alan tutarlar. Böylece kullanıcı bu dosyayı bir daha açmak istediğinde dosyanın yerini genel diyalog kutusunda aramak zorunda kalmaz, menüden bu dosyayı seçerek açılmasını sağlayabilir. Siz de buna benzer bir şey yapabilirsiniz. Öncelikle yanda görülen 1. Formu ve üzerindeki menüyü yaratmakla başlayın.

Private Sub eklenen_dosya_Click()
Label1.Caption = eklenen_dosya.Caption
End Sub
 
Private Sub Form_Load()
Label1.Caption = ""            ‘Son açılan dosyayı temsil eden etiketi temizle
eklenen_dosya.Visible = False  ‘Menü seçeneğini gizle
                               ‘(Program yeni başladı ve hiç dosya açılmadı)
CommonDialog1.filename = "*.*"
End Sub
 
Private Sub Ac_Click() ‘Dosya * Aç komutu çalıştırıldığında
CommonDialog1.DefaultExt = "*.*"      ‘Tüm dosyalar
CommonDialog1.Action = 1       ‘Dosya Aç 
eklenen_dosya.Caption = CommonDialog1.filename               ‘Genel diyalog kutusunda seçilen dosyayı
                                                             ‘Son menü seçeneğine ekle
eklenen_dosya.Visible = True                  ‘Son menü seçeneğini görünür hale getir.
Label1.Caption = CommonDialog1.filename
End Sub

Yukarıdaki kodları da yazdıktan sonra programınızı çalıştırın ve Dosya menüsünden Aç komutunu seçin. Herhangi bir dosya seçtikten sonra bunun, Dosya menüsünün en alt satırında eski ismi “eklenen_dosya” olan yere yerleştiğini göreceksiniz. İşte bu kadar basit...

 

Visual Basic ve Renk

Visual Basic, Windows’un tüm renk öğelerine kolayca erişebilir. Windows’unuzun kaç renk kullandığını, grafik kartınızın bellek miktarını öğrenmeyi ve bunun gibi bazı özelliklere geçen aylarda değinmiştik. Şimdi sıra Visual Basic ile programlarımızda nasıl renk ekleyeceğinize geldi. VB formunuz üzerindeki herhangi bir nesnenin rengini değiştirmek için iki yol sunuyor bunlardan birincisi RGB komutu. Formlarınızı yaratırken kullandığınız renk paletinden bir renk seçtiğinizde o rengin Özellikler kutucuğunda değişik kodlara dönüştüğünü görürsünüz. Visual Basic, siz rengi seçtiğiniz anda onu sistemin anlayabileceği 16’lık sayı düzenine çevirir.

Visual Basic’in renk kutusundan seçtiğiniz renkler 16’lık sayı düzenine yandaki gibi çevrilir. KK, YY, MM iki haneli ve 16’lık düzende sayılardır.

Visual Basic’i kullanarak her bir renk’ten 1’den 255’e kadar bir ton alabilir, bunları karıştırabilir ve böylece 16.581.375 adet değişik renk elde edebilirsiniz. İşte size RGB komutu kullanılarak form üzerine basit bir palet yaratan ufak bir program. RGB değerini değiştirerek çok değişik görüntüler elde edebilirsiniz. Örnekte ayrıca bir formun ortasının nasıl bulunacağını da görebilirsiniz.

Private Sub Form_Click()
   
ScaleMode = 1   ' Ölçü sistemini piksele çevir
CX = ScaleWidth / 2 ' Formun dikey ortasını bul
CY = ScaleHeight / 2    ' Formun yatay ortasını bul
DrawWidth = 3   ' Çizim genişliğini ayarla
r = 100
For I = 50 To 0 Step -1
F = I / 50
F1 = 1 - F: F2 = 1 + F  ' Hesaplamalar...
 
r = r + 10: b = b + 10
If b > 50 Then g = g + 5
 
ForeColor = RGB(r, g, b) ' Önalan rengini belirle
Line (CX * F1, CY * F1)-(CX * F2, CY * F2), , BF
Next I
 
End Sub

Programınızı yazdıktan sonra formunuzun üzerine bir kere tıklayın. Güzel bir renk paletinin oluştuğunu göreceksiniz.

Visual Basic’in size sunduğu diğer bir renk komutu ise QBColor komutudur. Bu komutu kullanarak QBASIC’ten kalan sınırlı 15 tane temel rengi kullanabilirsiniz. Aktif formun arkaplan rengini maviye boyamak için şunun gibi bir komut kullanmalısınız:

Form1.ForeColor = QBColor(1)

 

Bütün Özellikleri Bir Komutta Atamak

VB’nin her yeni sürümü ile programcıların işini daha da kolaylaştıracak komutlar ve özellikler geliyor. İşte With (Birlikte) komutu bunlara en güzel örnek. Şimdi aşağıdaki satırları inceleyin ve bazı komutların ne kadar gereksiz olarak kullanıldığını görün:

Private Sub Form_Load()
Form1.Height = 4000
Form1.Caption = "With Örneği"
Form1.BackColor = QBColor(6)
End Sub

Burada dikkat ettiğiniz gibi “Form1” nesnesi her satırda tekrarlanmış. VB 4.0 ile bu soruna bir çözüm getirilerek With komutu yaratılmıştır. Aşağıdaki örnek size bu komutun nasıl kullanıldığı hakkında fikir verecektir.

Private Sub Form_Load()
With Form1                     'Form1'i kullanarak...
 .Height = 4000        'Yüksekliği 4000,
 .Caption = "With Örneği"      'Form başlığını "With Örneği",
 .BackColor = QBColor(6)       'Arkaplan rengini yeşil yap.
End With                       ‘Komutu bitir
End Sub

Bu komutu kullanırken With ve End With satırları arasına yine With ve End With satırlarını girebilirsiniz fakat bu iki komut arasına komplike komutlar ve döngüler eklememelisiniz. Bu hem programınızı yavaşlatır hem de ciddi hatalara sebep olabilir.

 

Resmi Kaydırmak

İlk program örneğimiz bir okuyucumuzun sorusu üzerine düşünüldü. Bu okuyucumuz büyük bir resmi kaydırma çubukları yardımıyla form üzerinde görmek istiyor ve bunu başaramadığından yakınıyordu. İşte sorunun çözümü:

Bir form yaratın ve 1. resimde olduğu gibi kontrolleri üzerine yerleştirin. Dikkat etmeniz gereken konu, içinde resim bulunan resim kutusunun arkasında bir resim kutusu daha olduğudur. Yani formun üzerine büyükçe bir resim kutusu çizdikten sonra bunun içine ikinci bir resim kutusu çizip buna sabit diskinizdeki bir resmi koymalısınız. (Resmi programın çalıştırma aşamasında da yükletebilirsiniz). İşte kodlar...

Sub Form_Load()

 
 
Const PIXEL = 3
Const NONE = 0
Form1.ScaleMode = PIXEL:  Picture1.ScaleMode = PIXEL
 
' İkinci resim kutusu yüklenen resmin büyüklüğünü alıyor.
   Picture2.AutoSize = True
 
' Çerçevelerden kurtulalım...
   Picture1.BorderStyle = NONE
   Picture2.BorderStyle = NONE
 
' İki resim kutusunu da resmi göstermek için hazırla
  Picture1.Move 0, 0, ScaleWidth - VScroll1.Width, ScaleHeight - HScroll1.Height
  Picture2.Move 0, 0
 
   ' Yatay kaydırma çubuğunu ayarla
   HScroll1.Top = Picture1.Height : HScroll1.Left = 0
   HScroll1.Width = Picture1.Width
 
   ' Dikey kaydırma çubuğunu ayarla
   VScroll1.Top = 0 : VScroll1.Left = Picture1.Width
   VScroll1.Height = Picture1.Height
 
   ' Kaydırma çubuklarını resmin büyüklüğüne göre ayarla
   HScroll1.Max = Picture2.Width - Picture1.Width
   VScroll1.Max = Picture2.Height - Picture1.Height
 
   ' Eğer içinde resim olan kutucuk büyük kutucuğun
   ' boyunu geçmiyorsa kaydırma çubuğuna gerek yok
   VScroll1.Visible = (Picture1.Height < Picture2.Height)
   HScroll1.Visible = (Picture1.Width < Picture2.Width)
End Sub
 
Sub Form_Resize()
   ' Form’un büyüklüğü değiştiğinde resmin de
   ' büyüklüğünü forma göre ayarla
   Picture1.Height = Form1.Height
   Picture1.Width = Form1.Width
 
  ' Kaydırma çubuklarını ve resmi tekrar ayarla
   Picture1.Move 0, 0, ScaleWidth - VScroll1.Width, ScaleHeight - HScroll1.Height
   Picture2.Move 0, 0 : HScroll1.Top = Picture1.Height
   HScroll1.Left = 0 : HScroll1.Width = Picture1.Width
   VScroll1.Top = 0 : VScroll1.Left = Picture1.Width
   VScroll1.Height = Picture1.Height
   HScroll1.Max = Picture2.Width - Picture1.Width
   VScroll1.Max = Picture2.Height - Picture1.Height
   ' Kaydırma çubuklarına gerek var mı?
   VScroll1.Visible = (Picture1.Height < Picture2.Height)
   HScroll1.Visible = (Picture1.Width < Picture2.Width)
End Sub
Sub HScroll1_Change()
' ikinci resim eksi değer almaktadır çünkü kaydırma

' çubuğunu sağa kaydırdığınızda resim sola kaymalıdır


 
 
 
 
 
 
   Picture2.Left = -HScroll1.Value
End Sub
 
Sub VScroll1_Change()
  Picture2.Top = -VScroll1.Value
End Sub

 

Tuşun "Default" Olması

İşte programlarınızda dikkat etmeniz gereken bir konu: Bir form yarattınız, içinde birçok metin kutusu var ve kullanıcının metin kutularından bir tanesinde Enter tuşuna bastığında formun bellekten atılmasını (veya başka bir formun yüklenmesini) ve yazdıklarınızın geçerli olmasını istiyorsunuz. Bunu en güzel örneği "Aç" ve "Kaydet" diyalog kutularında vardır. Kutu içinde hangi kontrol aktif olursa olsun (İptal hariç) Enter tuşuna basıldığında program "Tamam" tuşuna basılmış gibi davranır, bu akıllıca tasarlanmış bir özelliktir. Bu özelliği formun üzerinde sadece bir tuş taşıyabilir. Bir tuşu "Default" olarak atamak için formun yüklenmesi esnasında

Command1.Default = True

satırını kullanmalısınız. Bu özelliği formun tasarlanması aşamasında da "Properties" kutucuğundan atayabilirsiniz.

 

VB 4.0 ve RTF metin kutusu kontrolünün kullanımı

Eski Visual Basic’ler de bulunan metin kutusunun aksine VB 4.0 yetenekli bir kontrol olan Rich Text Box ile birlikte gelmiştir. Rich Text Box Windows’un salt metin formatını tanımasının yanında içinde renk, yazıtipi, büyüklük, kalınlık yada incelik bulunduran "Zengin Metin Formatı"nı da tanıyabilir. Bu format Windows altında çalışan hemen hemen tüm metin editörleri tarafından tanınabilmektedir. Format, bu zengin özelliklerinin aksine kaydedildiğinde "ikili" dosya biçimine girmez. İşte size VB 4.0’ın bu kontrolünü kullanan örnek bir program. Ama bu sefer kontrol kutusundan "Metin kutusu" değil "Zengin metin kutusu" kontrolünü seçin. Programınız RTF formatındaki dosyaları açabilir ve sizin yazdığınız RTF formatındaki dosyaları kaydedebilir. Kodların kısalığını görünce hayrete düşeceksiniz.

Private Sub Command1_Click()   'kalın
    RichTextBox1.SelBold = True
End Sub
 
Private Sub Command2_Click()   'italik
    RichTextBox1.SelItalic = True
End Sub
 
Private Sub Command3_Click()   'renk
    CommonDialog1.Action = 3
    RichTextBox1.SelColor = CommonDialog1.Color
End Sub
 
Private Sub Command4_Click()   'kaydet
    CommonDialog1.ShowSave
    RichTextBox1.SaveFile (CommonDialog1.filename)
End Sub
 

 
 
 
 
 
 
Private Sub Command5_Click()   ' aç
    CommonDialog1.Filter = "Rich Text Format Dosyaları|*.rtf"
    CommonDialog1.ShowOpen
    RichTextBox1.LoadFile CommonDialog1.filename, rtfRTF
End Sub
 
Private Sub Command6_Click()   'çıkış
End
End Sub
 

Excel ile DDE bağlantısı

Geçen hafta hatırlayacağınız gibi DDE bağlantılarına değinmiş ve Program Yöneticisine ile DDE kurarak ona program grubu yarattırmıştık. Bu ay bağlantımızı Excel ile kuracağız. Yapacağımız şey Excel’de bulunan "Kitap1"den bir dizi hücrenin okunması ve bu hücrelerin sırayla VB ile yaptığımız bir "alıcıdaki" ızgara kontrolüne yerleştirilmesi.

İşlemi gerçekleştirmek için önce Excel’i açın ve şekilde görüldüğü gibi 5 satır ve 5 sütunu istediğiniz bilgilerle donatın. Sonra Exceli kapatmadan VB’ye geçin ve programı yazın. Yalnız ingilizce Excel kullananlar "Excel|Kitap1" ifadesi yerine "Excel|Sheet11" ifadesini kullanmalıdırlar. Programı yazdıktan sonra bağlantı için "Verileri Al" tuşuna basın.

Private Sub Command1_Click()
Dim CurRow As String
    Static Row  ' Hesap tablosu satır numarası
    Static Col  ' Hesap tablosu sütun numarası
 
 ' Açık olan tüm bağlantıları kapat
 Text1.LinkMode = 0
 ' Bağlantı kurulacak uygulama ve bölümü
 Text1.LinkTopic = "Excel|Kitap1"
 Text1.LinkItem = "R1C1" ' Bağlantı öğesini belirle
 Text1.LinkMode = 1  ' Bağlantı tipini otomatik yap
 
For Row = 1 To 5     ' Satır ve sutunu değiştirmek
                     ' için döngü
  For Col = 1 To 5
  'Okunacak hücreyi belirle
  CurRow = "R" & Row & "C" & Col
  Grid1.Row = Row      'satır ve sütunu belirle
  Grid1.Col = Col
  Text1.LinkItem = CurRow
  Grid1.Text = Text1.Text
  Next Col
Next Row
End Sub

Alt menüler yaratmak

Zaman zaman öyle uygulamalara rastlarsınız ki menü seçenekleri bile bir çok alt seçenek barındırır. Örneğin Microsoft Excel’de böyle menülere rastlarsınız. Bunu VB ile yapmak çok kolaydır.

Her zamanki gibi, menüleri yaratmak için kullandığınız Menü Editörü bu tip menüleri de kolayca yapabilir. Bunun için, nasıl menü başlığının altındaki seçenekleri öteleyerek yaratıyorsanız seçeneklerin alt seçeneklerini de öyle ötelemelisiniz. Örneğin 1. resimdeki menüyü yaratmak için menü editöründe 2.resimdeki gibi bir görünüm elde etmelisiniz.

Alt menülerin de daha alt menülerini aynı tekniği kullanarak elde edebilirsiniz, ama bir çok alt menü kullanıcıyı sıkacak ve programı kullanılamaz bir hale getirecektir.

Alt yordam ve fonksiyon satırlarını ayırabilirsiniz

API’leri tanımlayan fonksiyonlar ve bunun gibi kod satırlarının oldukça uzun olduğu dikkatinizi çekmiştir, öyleki fonksiyon yanımını yazmaya başladığınızda pencereyi ne kadar büyütürseniz büyütün fonksiyonun başını göremezsiniz. Bazılarınız bundan rahatsız olabilir. Bunu çözmek için fonksiyon veya altyordam tanımını uygun bir yerinden bir alt çizgi (_) ile ayırabilirsiniz. İşte size bunu nasıl yapacağınıza dair bir örnek:

Declare Function windir Lib "kernel" Alias "getwindowsdirectory" _
(ByVal lpbuffer As String, ByVal nsize As Integer) As Integer

Bu iki satırı yazdığınızda bu satırlar VB tarafından bir satır olarak algılanacaktır.

 

Hiç bilmediğiniz Visual Basic 4.0 Kısayolları

Uzun süredir Visual Basic kullanıyorsanız kod yazmanızı hızlandıracak kısayolları biliyorsunuzdur. Bir çok kısayol’u zaten VB menülerinden çıkartabilirsiniz. Ama ne VB menülerinden ne de VB ile ilgili kaynaklardan bulamayacağınız aşağıdaki kısayolları biliyor muydunuz?

Kısayol                Açıklama
 


 
 
CTRL+F2                Nesnenin liste kutusuna git (Kod Penceresinde)
F3                     Sonrakini bul
Shift+F3               Öncekini bul
CTRL+DOWN              Bir sonraki altyordam / fonksiyon
CTRL+UP                Bir önceki altyordam / fonksiyon
SHIFT+F2               Altyordam / fonksiyon'a git
CTRL+SHIFT+F2          Önceki konuma geri dön
CTRL+HOME              Modülün başlangıcına git
CTRL+END               Modülün sonuna git
CTRL+RIGHT             Bir sonraki kelime
CTRL+LEFT              Bir önceki kelime
CTRL+N                 Yeni satır ekle
CTRL+Y                 Bulunduğun satırı sil
CTRL+DEL               İmleçten sonraki tüm karakterleri temizle
CTRL+BACKSPACE         İmleçten önceki tüm karakterleri temizle
SHIFT+TAB              TAB ile ötelenen metni geri getir
CTRL+Z                 Bir önceki işlemi geri al (Ne olursa olsun)

 

 

Yeni Kontroller: TreeView

Zaman zaman Visual Basic 4.0 ile gelen yeni kontrollere değiniyoruz. İşte bu yeni kontrollerden birisi: Treeview. Windows 95’in Gezgininde sol klasör penceresi bu kontrolle oluşturulmuş. Kontrolün kullanımı gayet basit, nasıl kullanıldığını merak ediyorsanız hemen boş bir formun üzerine bir Treeviev kontrolü yaratın ve aşağıdaki kodları yazmaya başlayın. Kontrolün kullanımı hakkındaki tüm açıklamalar kodların arasında verilmiştir.

Private Sub Form_Load()
Dim nodX As Node
' Bir metni ana başlık olarak atamak için aşağıdaki gibi bir komut kullanmalısınız.
  Set nodX = TreeView1.Nodes.Add(, , , "Müzik")

 
 
 
 
 
 
'Aşağıdakinin amacı 1. Başlığa bir alt başlık eklemektir.
' Eklediğiniz altbaşlıklar eklenme sıralarına göre görüntülenir.
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Jazz")
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Pop")
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Klasik")
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Rock")
' Pop alt başlığı altına 2.altbaşlık daha ekliyoruz.
  Set nodX = TreeView1.Nodes.Add(3, tvwChild, , "Techno")
  Set nodX = TreeView1.Nodes.Add(3, tvwChild, , "Rave")
' 2. Anabaşlığı ekliyoruz.
  Set nodX = TreeView1.Nodes.Add(, , , "Resim")
' Tüm ağacı göstermek için kontrolü tazele.
nodX.EnsureVisible
End Sub
 
' Ağacın dallarından birine tıklandığında...
Private Sub TreeView1_NodeClick(ByVal Node As Node)
mesaj$ = "Tıkladığınız Liste Seçeneği: " + Node.Text
tip = 64
baslik$ = "Treeview Örneği"
' Hangi dala tıklandığını söyle.
MsgBox mesaj$, tip, baslik$
End Sub

 

Visual Basic, 6.0 sürümüyle çağ atlıyor, çünkü VB’nin yeni görünümü eski sürümlerinde oldukça uzak. Programcıların, hayal güçünü ve teknolojinin getirdiği yenilikleri olabildiğine kullanmalarını sağlıyor, Internet için program geliştirmeye ve HTML sayfalarında kullanılan Java benzeri Microsoft’un yeni ActiveX kontrollerini kulanmaya izin veriyor. VB6.0 sadece Windows 95,98 ve Windows NT (Intel, MIPS, PowerPC, Alpha RISC) platformlarında çalışabiliyor. Programın 16 Bit program derleme, şartlı derleme gibi opsiyonları yok.

 

İşte VB6’ın getirdiği en önemli değişiklik ve yenilikler:

Gördüğünüz gibi VB’nin yapısı ve kullanıcı arabirimi tamamen değişmiş. Programlarınızı bile bir çok yeni araç barındıran yeni bir MDI pencere içerisinde yaratıyorsunuz. Bekliyoruz...

VB ile Animasyon

Windows 95’te dosya kopyalama işlemini gerçekleştirdiğinizde dosyanın kopyalandığını gösteren küçük bir animasyonla karşılaşırsınız. Bu animasyon aslında bir dizi resmin sırayla gösterilmesinden başka bir şey değildir. VB ile de böyle animasyonlar yapmak çok kolaydır.

Bu örneğimizi uygulamak için önceden seçeceğiniz ve ard arda gösterildiğinde bir hareket oluşturacak 3 resim bulun. Bu üç resmi sırayla oluşturacağınız 3 görüntü kutusuna (image) yerleştirin. Formun üzerine bunlardan başka bir resim kutusu, timer kontrolü ve bir tuş ekledikten sonra aşağıdaki kodları yazmaya başlayın. Burada dikkat etmeniz gereken çok önemli bir şey var, o da Formun başlık çubuğundaki resmi de değiştireceğimizden Image kutularına yerleştireceğiniz resimleri simge (ICO) olmasıdır.

General - Declarations bölümüne yazılacak
Dim y As Integer
 
General bölümüne yazılacak
Private Sub degistir()
    y = y + 1: If y = 4 Then y = 1
‘Formun Simgesini değiştir
    Form1.Icon = Image1(y).Picture
‘Resim kutusundaki resmi değiştir.
    Picture1.Picture = Image1(y).Picture
End Sub
 
Private Sub Command1_Click()
End
End Sub
 
Private Sub Timer1_Timer()
‘Timer’ın kontrolünün her bir vuruşunda...
‘degistir alt yordamını cagir.
degistir
End Sub

Timer kontrolünün Interval özelliğini 500 gibi bir sayıyla değiştirmeyi unutmayıp programı çalıştırdığınızda resim kutusuna sırayla üç görüntü kutusundaki simgelerin geldiğini göreceksiniz. İşin ilginç tarafı başlık çubuğundaki simgenin de resim kutusuyla eş zamanlı olarak değişmesidir.

 

Metin kutusu tüyoları

Eğer VB ile uzun zamandır ilgileniyorsanız metin kutusunun kullanımı ile bir probleminiz kalmamıştır. Peki bu kontrol için birkaç püf noktasına ne dersiniz?

Şifreli metin kutuları
Bir metin kutusunu pekala kullanıcı şifresi almak için kullanabilirsiniz. Bunun için metin kutusunun properties özelliklerinden PasswordChar üzerine giderek buraya kullanıcının tuşladığı her karaktere karşılık ekrana çıkacak karakteri girmelisiniz. Örneğin gerçek metni yıldız karakteriyle gizlemek istiyorsanız buraya "*" karakteri koymalısınız. Metin kutusunun bu özelliğini değiştirdiğinizde diğer özelliklerinin aynı kaldığını görürsünüz. Metin kutusunda yazılı olan şifreyi ise her zamanki gibi "Text" özelliği ile öğrenebilirsiniz. Kullanıcının gireceği karakter sayısını belirlemek için ise aşağıdaki püf noktamızı uygulayabilirsiniz.

Uzunluk kontrollü metin kutuları
Bir metin kutusuna girecek maksimum karakter sayısını belirlemek için "MaxLenght" özelliğini kullanmalısınız. Metin kutusu sadece bu özelliğe vereceğiniz sayı kadar karakter kabul edecektir.

Karakterleri Gözardı etmek
Metin kutusunun kabul edeceği karakterleri maskelemek için KeyAscii özelliğini kullanmalısınız. Aşağıdaki örneğimiz Text1 metin kutusunun sadece tuşlanan rakamları kabul etmesi için tasarlanmıştır. Klavyeden rakam dışında herhangi bir karakter tuşlanınca bip sesi verilir ve karakter değeri "0"a çevrilir.

Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then
KeyAscii = 0
Beep
End If
End Sub

Salt okunur metin kutusu
Bir metin kutusundaki metnin kullanıcı tarafından değiştirilmesini istemiyorsanız. Tek yapacağınız metnin properties kutucuğuna gidip Locked özelliğine True değerini vermektir. Bunu yaptığınızda metin kutusundaki metin sabit kalacak, kullanıcı tarafından kopyalanabilecek fakat değiştirilemeyecektir.

Metin kutusunda tırnak karakteri kullanmak
Alfa numerik değişkenler Visual Basic’te iki tırnak içine alındığından otomatik olarak bir problem karşınıza çıkıyor. Değişken içerisinde tırnak karakteri geçiyorsa bunu kullanamıyorsunuz. Bunu önlemek için aşağıdaki gibi bir kod satırı kullanabilirsiniz:

Text1.Text = "PC World Online ""Internet Kullanıcıları İçin En İyi Yerli Kaynak"" "

Bu kod satırı Text1 metin kutucuğunda şu görüntüyü yaratacaktır:

PC World Online "Internet Kullanıcıları İçin En İyi Yerli Kaynak"

VB ile fonksiyon kullanımı

VB ile altyordam (SUB) kullanımını API fonksiyonlarını işlerken sıkça değinmişizdir. VB’de fonksiyon kullanımı da bundan pek değişik sayılmaz, daha önce QBasic ile haşır neşir olanlar ise bunu kullanmayı zaten biliyorlar.

Biz örneğimizde iki sayının hipotenüsünü alan basit bir fonksiyon hazırladık. Fonksiyonu yaratmak için General kısmına gidin ve aşağıdaki üç satırı yazıp Enter’a basın. General - Declarations bölümünün hemen altında fonksiyonunuz belirecektir.

Function Hipotenus(A, B)
Hipotenus = Sqr(A ^ 2 + B ^ 2)
End Function

Yukarıdaki gibi bir form hazırladıktan sonra artık fonksiyonunuzu deneyebilirsiniz. Her "hipotenüsü al" tuşuna basıldığında metin kutularındaki sayılar değerlendirilecek ve etiket kutusuna yazılacaktır.

Private Sub Command1_Click()
Label1.Caption = Hipotenus(CInt(Text1.Text), CInt(Text2.Text))
End Sub

 

Uygulama Listesini Çağırmak

Windows 3.1’de masaüstüne çift tıkladığınızda, Windows 95’de ise CTRL+ALT+DEL tuşlarına bastığınızda karşınıza açık olan uygulamaların bir listesi gelir. Bu listeyi kullanarak istediğiniz uygulamayı sonlandırabilir veya aktif hale getirebilirsiniz. Bu örneğimizde de yukarıdakine benzer bir uygulama yazacağız. Boş formun üzerine şekildeki gibi iki komut butonu bir de Combo Box yerleştirin ve aşağıdaki kodları yazın.

'General Declarations Bölümüne yazılacak
DefInt A-Z
Declare Function GetWindow Lib "user" (ByVal hWnd, ByVal wCmd) As Integer
Declare Function GetWindowText Lib "user" (ByVal hWnd, ByVal lpSting$, ByVal nMaxCount) As Integer
Declare Function GetWindowTextLength Lib "user" (ByVal hWnd) As Integer
 
'GetWindows API’sinin "sabitleri"
Const GW_CHILD = 5
Const GW_HWNDFIRST = 0
Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
Const GW_HWNDPREV = 3
Const GW_OWNER = 4
 
Sub GorevListesi ()
CurrWnd = GetWindow(Form1.hWnd, GW_HWNDFIRST)
 
While CurrWnd <> 0
Length = GetWindowTextLength(CurrWnd)
 
ListItem$ = Space$(Length + 1)
Length = GetWindowText(CurrWnd, ListItem$, Length + 1)
 
If Length > 0 Then
Combo1.AddItem ListItem$
End If
 
CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
X = DoEvents()
Wend
End Sub
 
Form penceresine yazılacak...
Sub Command1_Click ()
f$ = Combo1.Text
'Eğer problem çıkarsa gözardı et.
On Local Error Resume Next
AppActivate f$
End Sub
 
Sub Command2_Click ()
f$ = Combo1.Text
On Local Error Resume Next
AppActivate f$
'Uygulamaya ALT+F4 yollayarak kapat.
SendKeys "%{F4}"
End Sub
 
Sub Form_Load ()
Call GorevListesi
'Herhangi bir uygulama açık değilse programdan çık
If Combo1.ListCount > 0 Then
Combo1.Text = Combo1.List(0)
Else
MsgBox "Hiç Bir Uygulama Açık Değil", 16
Unload Form1
End If
End Sub

Programı çalıştırdığınızda General - Declarations bölümünde tanımladığımız üç API fonksiyonu kullanılarak aktif uygulamalar çağırılır ve Combo kutusuna eklenir. Bu kutudan herhangi bir uygulamayı çağırarak penceresini aktif yapabilir veya uygulamayı kapatabilirsiniz.

Not: Uygulamayı kapatma seçeneği ALT+F4 tuşlarını kabul etmeyen uygulamalar için geçerli değildir.

Çok Seçenekli Liste Kutuları

Liste kutuları Visual Basic 3.0’dan itibaren bir den çok seçeneği kabul eder duruma gelmişlerdir. Liste kutusu kontrolünün nasıl kullanılacağını önceki aylarda göstermiştik. Aşağıdaki örneğimiz birden fazla seçeneği kabul eden liste kutularının nasıl kullanıldığını göstermektedir.

 
Sub Command1_Click ()
Dim I
'2.Liste kutusunu temizle
List2.Clear
 
'Eğer seçili bir nesne varsa bunu 2.liste kutusuna gönder
For I = 0 To List1.ListCount - 1
If List1.Selected(I) Then
List2.AddItem List1.List(I)
End If
Next I
End Sub
 
Sub Command2_Click ()
msg$ = ""
msg$ = msg$ + "Seçili Öğeler"
For I = 0 To List2.ListCount - 1
If List2.Selected(I) Then
msg$ = msg$ + Chr$(13) + List2.List(I)
End If
Next I
MsgBox msg$, 64, "Seçililer"
End Sub
 
Sub Form_Load ()
Dim I
'1. Liste Kutusunu ekranda görünen yazı tipleriyle doldur.
For I = 0 To Screen.FontCount - 1
List1.AddItem Screen.Fonts(I)
Next I
End Sub

Program çalıştırıldığında ekran yazıtipleri 1. Liste kutusunda belirecektir, "Gönder" tuşuna basıldığında 1. Liste kutusunda seçtiğiniz yazı tipleri 2.liste kutusuna kopyalanacak, "Liste" tuşuna basıldığında ise 2.liste kutusunda seçili olan öğeler mesaj kutusu kullanılarak görüntülenecektir. Örneğimiz çok seçenekli liste kutularına tam erişim sağlamaktadır, siz de kodları programlarınızda kullanabilirsiniz. Not: Programınızı çalıştırmadan önce liste kutularının "Multiselect" özelliğini Properties kutucuğundan "2"(Extended) yapın.

 

Programlarınız için Registry ayarları

Çoğunuz Windows 95’in kayıt bilgileri (Registry) hakkında az çok bir şeyler biliyorsunuzdur. Registry programların kendisi hakkındaki bilgileri sakladığı uygun bir alandır.

Windows 3.1’de program bilgileri INI dosyalarında saklanırdı. Windows 95’de de 16 bitlik programlar halen INI dosyalarını kullanmalarına rağmen 32 Bitlik programlar artık registry’yi kullanıyor. Eğer 32 Bit’lik programlar hazırlıyorsanız siz de mutlaka registry bilgilerinin nasıl düzenlendiğini bilmelisiniz.

Visual Basic registry’ye bilgi yazmak için kendi içerisinde bulunan bir API fonksiyonunu kullanır. Bu fonksiyon bir komut değildir fakat VB bu fonksiyonu tanımak için dışarıdan bir DLL kullanmamaktadır. SaveSetting, GetSetting, DeleteSetting komutlarının genel kullanımı şöyledir:
[KOMUT] "[PROGRAM ADI]", "[ANAHTAR]", "[ÖZELLİK]", "[DEĞER]
komutların yerine getireceği işlev değiştikçe yukarıdaki satırın bazı parametreleri kullanılmayabilir.

İşte size registry’ye bilgi yazan, okuyan ve silen bir programcık, yaptığı ise basit: pencere büyüklüğünü ve pencerenin ekrandaki yerini registry’ye yazıp siz istediğinizde görüntülüyor.

Private Sub Command1_Click()
'Ayarları kaydet
SaveSetting "Deneme", "Ayarlar", "Top", Form1.Top
SaveSetting "Deneme", "Ayarlar", "Left", Form1.Left
SaveSetting "Deneme", "Ayarlar", "Width", Form1.Width
SaveSetting "Deneme", "Ayarlar", "Height", Form1.Height
End Sub
 
Private Sub Command2_Click()
GetSetting "Deneme", "Ayarlar", "Left"
GetSetting "Deneme", "Ayarlar", "Top"
GetSetting "Deneme", "Ayarlar", "Width"
GetSetting "Deneme", "Ayarlar", "Height"
 
mesaj$ = "Sol: " & Left & Chr$(13) & "Üst: " & Top & Chr$(13) & "Uzunluk: " & Width & Chr$(13) & "Yükseklik: " & Height
MsgBox mesaj$, 64, "Mevcut Registry Ayarları"
End Sub
 
Private Sub Command4_Click()
'Oluşturduğumuz registry ayarlarını silmek...
'Deneme isimli programın tüm ayarlarını silmek için
DeleteSetting "Deneme"
 
'Sadece "Ayarlar" anahtarını silmek için
'DeleteSetting "Deneme", "Ayarlar"
'Kullanabilirsiniz...
End Sub

 

Visual Basic’de Windows 95 kısayollarının kullanımı

VB’yi kullanarak Windows 95’in özelliklerinden biri olan Kısayol yaratma işlemini kolayca yapabilirsiniz. Tek ihtiyacınız Visual Basic’in kurulum kit’inde bulunan STKIT432.DLL isimli dosya. Formunuzdan bağımsız bir modüle aşağıdaki satırı girdikten sonra siz de kendi kısayollarınızı yaratabilirsiniz.

Declare Function fCreateShellLink Lib "STKIT432.DLL" (ByVal lpstrFolderName as String ByVal lpstrLinkName as String ByVal lpstrLinkPath as String ByVal lpstrLinkArgs as String ) As Long

İlk parametre kısayolun nerede oluşturulacağını belirler, ikinci parametre kısayolun isminin ne olacağını, üçüncü parametre ise kısayolu oluşturulacak dosyanın klasörü ve adını taşır. Dördüncü parametrenin ne işe yaradığını henüz bulamadık.

Örneğin DIZIN klasöründe bulunan PCWORLD.EXE isimli bir dosyaya masaüstünde "PC World En Büyük" isimli bir kısayol oluşturmak istiyoruz, aşğıdaki kod satırını kullanırız:

iLong = fCreateShellLink("..\..\Desktop", "PC World En Büyük", "C:\DIZIN\PCWORLD.EXE","")

Değişkenleri karşılaştırmak için Like

Siz hala........değişkenleri karşılaştırmak için IF komutunu mu kullanıyorsunuz. Eğer öyle ise size daha hızlı bir yol öneriyoruz: Like. Kafanız karışmasın aslında komutun yaptığı işlem IF ile hayli farklı ama yine de bir karşılaştırma komutu. Komutun yaptığı iş VB’de pek de kullanılmayan "numune"leri değişkenlere karşılaştırmak aşağıdaki kodlara bakarsanız ne demek istediğimi anlayacaksınız:

Deger = "aBBBa" Like "a*a"     ' Doğru döndürür.
Deger = "F" Like "[A-Z]"               ' Doğru döndürür.
Deger = "F" Like "[!A-Z]"      ' Yanlış döndürür
Deger = "a2a" Like "a#a"              ' Doğru döndürür.
Deger = "aM5b" Like "a[L-P]#[!c-e]"   ' Doğru döndürür.
Deger = "BAT123khg" Like "B?T*"       ' Doğru döndürür.
Deger = "CAT123khg" Like "B?T*"       ' 

 

Güzel Püf Noktaları

Visual Basic 4.0 kullanıyorsanız Unload komutuyla bir formu bellekten atamayacağınızı bilin. Formu bellekten atmanın tek yolu Set [FORMA ADI] = Nothing komutunu kullanmaktır.

Bir BMP’yi kolayca simge olarak kaydedebilirsiniz. Sadece "ImageList" kontrolünde "ListImage" özelliğinin "ExtractIcon" methodunu kullanmanız yeterlidir. VB yardımından bu konuda daha çok bilgi bulabilirsiniz.

Visual Basic 4.0’ın form tasarımı sırasında kontrolleri sadece bir piksel oynatabilir, büyültebilir veya küçültebilirsiniz. Kontolün pozisyonunu değiştirmek için Ctrl+OK tuşlarını, büyüklüğünü değiştirmek içinse Shift+OK tuşlarını kullanabilirsiniz. Eğer "Align to Grid" seçeneği açıksa bu tuşlar kullanıldığında kontroller ızgaraya göre yerleştirilecektir. (Bizce bu özelliği kaldırın)

Tasarım aşamasında VB pencereleri arasında CTRL+TAB tuşlarıyla dolaşabileceğinizi biliyor muydunuz?

Bir programı çalıştırdığınızda projenizde yanlış bir kod varsa fakat çalıştırılmıyorsa programınızda herhangi bir hata meydana gelmeyecektir. Bu Visual Basic’in "Compile on Demand" özelliğinden gelmektedir ve iyi bir özellik DEĞİLDİR. RUN menüsünden Start with Full Compile seçeneğini seçerseniz projenizdeki tüm kodlar kontrol edilecektir.

Programınızı yazarken herhangi bir "breakpoint" belirlemeden sadece yazdığınız kodu derleyebilirsiniz. Tek yapmanız gereken Run menüsündeki "Step to" tuşuna basmaktır. Uygulama çalışacak ve kursörün bulunduğu yer "break point" olarak atanacaktır, yani program bu aşamada bitecektir.

Metin kutusu sadece büyük karakterleri kabul etsin
Aşağıdaki kodlar, kullanıcı metin kutusuna metin karakter girerken eş zamanlı olarak girilen karakterleri büyük harfe çevirir.

Sub Text1_KeyPress (KeyAscii As Integer)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub

AutoTab Özelliği
Visual Basic’de ezelden beri mevcut olan fakat pek rağbet görmeyen Masket Edit kontrolünü seven bir kişi iseniz işte size güzel bir püf noktası. Eğer MS Office yazılımını bilgisayarınıza kurduysanız programın kurulum aşamasında CD anahtarını isterken bir kutucuktan öbür kutucuğa otomatik olarak atladığını görmüşsünüzdür. Bunu yapmak normal metin kutularında iki satır koda bağlıyken Masked Edit kontrolü kullanıldığında otomatik olarak yapılabilir. Bunu gerçekleştiren özellik AutoTab özelliğidir. Bu özellik "True" yapıldığında ve metin kutusuna girilecek maksimum karakter sayısı dolduğunda bir sonraki kontrol otomatikman aktif olacaktır.

Olayları gerçekleştirmek için olayın gerçekleşmesini beklemeyin
Form1.Click olayının içerisine uzunca bir kod yazdınız diyelim. Bu kodlar sadece o form’a tıklandığında çalıştırılır. Programı çalıştırdınız bir de gördünüz ki bu kodlara başka bir altyordamda ihtiyacınız var. Ne yaparsınız. Kodları kopyalayıp ilgili yere yapıştırmak tercih etmemeniz gereken bir yoldur. Bunun yerine kodları aşağıdaki gibi kullanabilirsiniz.

If a=1 Then Form1.click
Form1.Click

 

VB ile çevre değişkenlerini okumak

DOS komut satırından SET komutunu girdiğinizde normal şartlarda en fazla 255 karakter olan çevre değişkenini okuyabilirsiniz. Visual Basic ile de çevre değişkeninin herhangi satırındaki veriye rahatlıkla ulaşabilirsiniz. Bunun için Environ fonksiyonunu kullanmanız yeterlidir.

Dim EnvString, Indx, Msg, PathLen  ' Değişkenleri tanımla
Indx = 1 ' Satır = 1
 
Do
EnvString = Environ(Indx)      ' Değişkeni oku
If Left(EnvString, 5) = "PATH=" Then  ' PATH bölümünü ara
PathLen = Len(Environ("PATH"))        ' uzunluğunu bul
Msg = "PATH satırı = " & Indx & " uzunluğu = " & PathLen
Exit Do
Else
Indx = Indx + 1        ' PATH bölümü bulunamadı
End If ' bir sonraki satıra geç
If PathLen > 0 Then
MsgBox Msg     'PATH değişkeni bulunursa uzunluğunu ve
               'satırı görüntüle
Else
MsgBox "PATH tanımları bulunamadı."
End If

 

Dosya zaman, tarih ve uzunluk bilgileri

Visual Basic ile FileDateTime fonksiyonunu kullanarak, dosyanın oluşturulduğu veya üzerinde son değişiklik yapıldığı tarihi ve saati bulabilirsiniz. Aşağıdaki örnek bu fonksiyonun kullanımını göstermektedir. Dikkat edilmesi gereken tarih ve saat bilgilerinin Windows'un ayarlandığı biçimde geri dönmesidir. Bu yüzden bu fonksiyon kullanıldıktan sonra geri dönen değişkeni tekrar formatlamak gerekebilir. Bir sonraki örnek ise dosyanın uzunluğunu kolayca bulmanızı sağlayacaktır.

' TEST isimli dosyanın en son 12 Şubat 1993 tarihinde,
' saat 4:35:47'de değiştiğini varsayalım
 
Bilgi = FileDateTime("TEST")
 
' Türkiye şartlarına göre dönen değişken 12/2/93 4:35:47 PM
' şeklinde olacaktır.
' Not: Dosyanın açılmasına gerek yoktur.
 
Open "TEST" For Input As #1  ' TEST dosyasını aç
Uzunluk = LOF(1)  ' Dosyanın uzunluğunu al
Msgbox Uzunluk ' Dosya uzunluğunu göster
Close #1 ' Dosyayı kapat

 

Visual Basic ve Add-In’ler

Elinizin altında küçük bir hazine var... Visual Basic 4.0 her türlü veritabanı dosyasının (Access, Paradox v.s.) formlarını oluşturabilen "Data Form Designer" adında becerikli bir Plug-In ile birlikte geliyor. öncelikle bu plug-in’i kullanabilmek için bazı işlemler yapmanız gerekiyor. Menüden Add-Ins * Add-in Manager komutlarını çalıştırın. Buradan "Data Form Designer"ı seçili durumu getirerek diyalog kutusunu kapatın.

Bu aşamadan sonra Add-ins menüsünde "Data Form Designer" eklentisini göreceksiniz. Bu add-in’i çalıştırdıktan sonra karşınıza çıkacak olan form seçtiğiniz veritabanı dosyasından minik bir veritabanı programı yapmanıza izin verecek. Bu eklentinin ne kadar becerikli olduğunu görünce oldukça şaşıracaksınız, arama ve sorgulama dışında hemen hemen tüm işlemleri yapabiliyor.

 

 

İnceleme: Visual Basic 5.0

Birkaç hafta önce Microsoft’un düzenlediği bir kursa katılma şansı yakaladım. Şans diyorum çünkü kurs, Mart ayının sonlarında çıkması ve büyük yankılar uyandırması beklenen Visual Basic 5.0’ın yeni özelliklerini öğretme amaçlıydı. 3 gün süren kursta, daha önce test ettiğim ve çok etkilendiğim VB 5.0 Control Creation Edition’dan arabirim dışında bambaşka bir VB’ile karşılaştım.

Bu yazıda Visual Basic 5.0 ile ilgili tüm yenilikleri bulamayacaksınız, fakat yeni VB’nin özelliklerini görürken, Microsoft’un Internet stratejilerinde ne kadar ciddi olduğunun bir kez daha farkına varacaksınız, bir programlama dilinden öteye gidilen Visual Basic 5.0’da kullanıcının işinin bir yandan ne kadar kolay bir düzeye indirildiğini görürken aynı zamanda kompile olayların nasıl üstesinden gelindiğine de şahit olacaksınız.

Arabirimdeki değişiklikler

Visual Basic 5.0’ı ilk çalıştırdığınızda tasarımın oldukça değiştiğini fark ediyorsunuz. Microsoft, 97 adı altında çıkardığı tüm programlarda kullandığı çarpıcı tasarımı yeni VB’de de kullanmış. Değişiklik sadece menü pencereleri ve farklı butonlarla sınırlı değil, artık formları tasarlarken bir Container’ın dışına çıkamıyorsunuz, tüm işlemleri bir MDI form içerisinde gerçekleştiriyorsunuz.

Sayfaya ilk baktığınızda "Form Layout Window" ve "Form Editor" adlı iki yeni pencereye rastlıyorsunuz. İçerisinde küçük bir pencere resmi bulunan "Form Layout Window" sayesinde artık formların ekranın neresinde görünmesini istiyorsanız kolayca oraya taşıyabiliyorsunuz.

Aynı zamanda Format menüsünde de bir kopyasını bulabileceğiniz Form Editor ise birden fazla kontolü aynı anda biçimlendirmek, formun düzenini sağlamak için kullanılıyor. Visual Basic’in önceki sürümlerinde kullandığınız birçok kontrolü Properties kutucuğu yoluyla değiştirme imkanı Form Editörü sayesinde çok daha esnek bir hale getirilmiş.

VB’nin her sürümünde az çok değişikliğe uğrayan Properties kutusu VB5.0 ile bambaşka bir görünüm kazanmamış ama işlevselliği arttırılmış, yeni kutunun en güzel özelliği listeden seçilen kontrol özelliklerinin kısa açıklamalarını kutun hemen altında bir pencerede görebilmeniz. Properties kutusu ayrıca isim ve kategorilere göre ayrılmış, kullanıcı kendi isteğine göre kontrol özeliklerini harf sırasına veya kategorilere göre listeleyebiliyor.

Kod penceresine ilk bakıldığında her zamanki gibi sol tarafta kontrol sağ tarafta özellik kutularını görüyorsunuz, "bir kaç satır kod yazalım bakalım" dediğinizde ise bütün işler değişiyor, çünkü VB yazdığınız ilk kontrol isminde veya komut’ta size bir sürpriz hazırlamış oluyor. Belki de yeni VB’nin en can alıcı özelliklerinden biri olan kod yardımı gerçekten süper tasarlanmış, kullanıcı bir kontrol ismi girdiğinde VB kontrol ile ilgili kullanabileceğiniz tüm özellikleri bir araya getiriyor ve bir liste hazırlıyor, programcıya sadece ok tuşlarıyla uygun özelliği bulup ENTER ile kodların arasına eklemek kalıyor. Pencereye bir komut girildiğinde ise VB hemen ilgili komut için bir yardım baloncuğu çıkarıyor.

Kod yardımı sadece kontroller ve komutlar için değil tüm sınıflar, değerler gibi VB’nin tüm bileşenleri için geçerli. VB 4.0 ile gelen altyordamların çizgi ile ayrılma özelliği VB5’de default olarak geliyor.

Yapısal Değişiklikler

Microsoft’un Visual Basic takımı programı oldukça değişik bir yapıya sokmuş, VB5’i diğerlerinden farklı kılan tek mantık aslında ActiveX kontrolleri ve bu kontrollerin Internet ve Intranet ortamlarında kullanılabilmesini iken, Microsoft’un bu yolda yaptığı değişiklikler programın sadece arabiriminin değil felsefesini de biraz değiştirmiş gibi görünüyor.

Programlar artık bir proje gibi değil de bir "GRUP" gibi görünüyor, kod aşamasında yazdığınız tüm ActiveX kontrolleri, dökümanları, sınıflar ve formlar VB5’de bir grup gibi görünüyor. VB5 tüm bir projeyi kaydetmek istediğinizde projenin soyadını VBG olarak atıyor. Grup mantığı içerisinde kontrolleri ve diğer bileşenleri başka projelerde veya tek başına kullanabilseniz bile gruplar, örneğin bir ActiveX kontrolü bulunamadığında hata veriyor ve çalışmıyor.

Programlarınızın tüm hiyerarşisini her zamanki gibi Project penceresinde görebiliyor ve değiştirebiliyorsunuz, her ActiveX dökümanı, sınıf, form ve ileride değineceğimiz "Property Page" yaratıldığı anda burada beliriyor.

Kontrol özelliklerini "Expose Etmek"
Bir Visual Basic kontrolünü seçtiğinizde ve properties kutusuna baktığınızda onun kullanabileceğiniz tüm özelliklerini görürsünüz. Kendi tasarladığınız kontroller için de değişen bir şey yok. Kontrol, tasarım aşamasındayken tüm özellikleri properties kutucuğunda beliriyor, fakat kontrolü form üzerine yerleştirdiğinizde işler değişiyor çünkü kontrolün sadece renk boyu gibi temel özelliklerini listede görebiliyorsunuz. Microsoft’un amacı son kullanıcının bir kontrolün tüm özelliklerini değil sadece programcının tayin ettiği özellikleri özellikleri görebilmesini sağlamak. Bu da Visual Basic 5’deki bazı komutlar ve sihirbazlarla sağlanmış. Menülerden bulacağınız "ActiveX Control Wizard" ile kontrolde programınız tarafından kullanacağınız özellikleri seçebilir yani kontrol özelliklerinin bazılarını expose edebilirsiniz.

Bir kontrolü expose ettiğinizde aşağıdaki gibi kodlar ortaya çıkacaktır. Get Color ve Let Color kontrol özelliklerinin form içinden hem okunmasını hem de değiştirilmesini sağlamak amacıyla kullanılmıştır.

Option Explicit
 
Public Property Get Color() As Long
    Color = BackColor
End Property
 
Public Property Let Color(NewValue As Long)
    BackColor = NewValue
End Property
 
Private Sub UserControl_Initialize()
 
End Sub

Property Page
Yukarıda belirttiğimiz gibi sadece programcının kullanılmasını istediği özellikler properties kutucuğunda görünecek ve program çalışırken değiştirilebilecektir. Expose edilen her bir özellik aynı zamanda Property Page denilen ve Properties kutucuğuna çok benzeyen bir kutucuğa yerleştirilebilir. Nedir Property Page? Microsoft, programcıların tasarladıkları uygulamaya tam olarak hakim olmalarını istemi ve onlara bir çok seçenek vermiş. Property Page, programcının en çok kullandığı özellikleri bir araya getirmesini sağlamak amacını taşıyan bir araç. Expose ettiğiniz veya kontrol ile standart olarak gelen tüm özellikleri kodlar aracılığıyla yada VB sihirbazlarıyla Propert Page’lere eklemek mümkün.

Program içerisinde bir kontrol en fazla 1 property page’e sahip olabilirken projede istediğiniz kadar property page kullanabilirsiniz.

Visual Basic’de yeni bir fonksiyon: enumerate
Bir değişkene atanabilen tüm değerleri teker teker saymak anlamına gelen "enumerate" olayı MS Visual C++ gibi güçlü programlama dillerinde çok önceleri kullanılmaya başlansa da Visual Basic’e hiç bir zaman dahil edilmemişti. VB5 ile birlikte ENUM fonksiyonunu API’lerden çağrılmasına izin verilmiş.

Aşağıdaki küçük program fonksiyonun yapabileceklerinin en güzel kanıtı. Form üzerinde bir liste kutusu bir de komut butonu yarattıktan sonra aşağpıdaki kodları girin. Program, Windows içinde açık olan tüm pencereleri, açıklamalarını ve kodlarını liste kutusuna yazacaktır.

Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
 
Function enumerate(ByVal xhwnd As Long, ByVal lret As Long) As Boolean
If lret = 0 Then
enumerate = False
Else
Form1.List1.AddItem CStr(xhwnd)
enumerate = True
End If
End Function
 
 
Private Sub Command1_Click()
Dim x As Integer
x = EnumWindows(AddressOf enumerate, 5)
 
Select Case x
    Case 0
        MsgBox "Hata oluştu"
    Case Else
        MsgBox "Tüm uygulamalardaki pencere sayısı " & List1.ListCount
    End Select
End Sub
 

İlk ActiveX uygulaması

VB5 içerisinde tasarladığınız kontrolleri Internet ortamına aktarabileceğinizi söylemiştik. Internet ile haşır neşir olduysanız mutlaka bilgisayarınıza ActiveX kontrolünü yüklemek isteyen bir site ile karşılaşmışsınızdır. Explorer kontrolü açmak istediğinde "Installing Components..." yazısını durum çubuğuna yerleştirir. Eğer merak ediyorsanız siz de bir ActiveX kontrolü yaratabilir ve Internet Explorer web tarayıcınız aracılığıyla yarattığınız kontrolü izleyebilirsiniz. (Netscape ne ActiveX kontrollerini ne de VBScript’i henüz desteklemiyor)

Öncelikle VB açıldığında yeni bir ActiveX kontrolü yaratın ve bunun içerisine rastgele işler yapan bir buton v.s. yerleştirin. Bundan sonra yeni bir form yaratın ve arkada kalan ActiveX kontrolünü "silmeden tamamen KAPATIN", kontrol çobuğunda silik olan bir buton, renklenecek ve kullanılabilir hale gelecektir. Bu butona basarak formunuzun üstüne gidin ve sağ tuşa basılı olarak formun üzerine bir kare çizin. Şu anda kendi yarattığınız ve Microsoft’un liste kutusu, klasör kutusu gibi ve aynı kategoriye giren bir ActiveX kontrolünü formunuzun üstüne yerleştirdiniz. VB5 ayrıca kontrolleri derleyerek OCX haline getirmenizi ve sonradan formlarınızın içinde bunları tekrar kullanabilmenize izin vermektedir.

Bu işlemlerden sonra VB projenizi DENEME.VBG olarak kaydedin ve "Application Setup Wizard"ı çalıştırın. Bu program size ne tip bir uygulama yapmak istediğinizi sorduğunda ona ActiveX uygulaması olarak cevap verin ve DENEME.VBG’yi seçerek işleme başlayın. Tüm işlemler bittiğinde programı derlendiğiniz dizinde bir CAB uzantılı bir de HTM uzantılı ili dosya ile karşılaşacaksınız. HTM dosyasının içeriğine baktığınızda VB tarafından otomatik olarak yazılmış olan aşağıdakine benzer kodlarla karşılaşacaksınız. CLASSID ifadesi hazırlayacağınız her ActiveX kontrolü için, hatta kontrolü her derlediğinizde farklı olacaktır, CODEBASE ise her zaman tasarladığınız projenin adını taşıyacaktır. CLASSID ile kontrolün içerisindeki numaranın tutmaması durumunda ise Internet Explorer bunu anlayacak ve kontrolü görüntülemeyecektir.

Nihayet HTM sayfasını Explorer ile görüntülediğinizde kontrolün aynı Visual Basic formunda çalıştığı gibi çalıştığına şahit olacaksınız. En sonunda Internet üzerinde de çalışabilen bir uygulama geliştirdiniz.

Dosyalar Geri Dönüşüm Kutusu'na

VB4'ün 32-bit'lik sürümünü kullanıyorsanız, dosyaları programınız içinden Windows'un çöp kutusuna gönderebilirsiniz. VB'de KILL komutuyla sildiğiniz hiç bir dosya normal olarak çöp kutusuna gitmeyecek ve kullanıcı dosyasını geri getirmek istediğinde çöp kutusunda bulamayacaktır. Eğer becerikli bir kullanıcı arabirimi istiyorsanız bu özelliği göz ardı etmemelisiniz. Aşağıdaki örnek sadece dosyayı çöp kutusuna göndermeyi değil, VB 4.0 ile gelen ParamArray ifadesinin kullanımını da gösteren güzel kodlardan oluşmaktadır.

Option Explicit
Private Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Boolean
hNameMaps As Long
sProgress As String
End Type

Private Const FO_DELETE = &H3
Private Const FOF_ALLOWUNDO = &H40
Private Declare Function SHFileOperation Lib "shell32.dll" Alias _
"SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Public Function ShellDelete(ParamArray vntFileName() _
As Variant) As Long

Dim I As Integer
Dim sFileNames As String
Dim SHFileOp As SHFILEOPSTRUCT

For I = LBound(vntFileName) To UBound(vntFileName)
sFileNames = sFileNames & vntFileName(I) & vbNullChar
Next
sFileNames = sFileNames & vbNullChar

With SHFileOp
.wFunc = FO_DELETE
.pFrom = sFileNames
.fFlags = FOF_ALLOWUNDO
End With

ShellDelete = SHFileOperation(SHFileOp)

End Function

Örnekte ParamArray ifadesi kullanılarak fonksiyona birden fazla parametre tanıma özelliği kazandırılmıştır
Tek bir dosya silmek için
X = ShellDelete("DELETE.ME")
komutunu kullanabileceğiniz gibi,
X = ShellDelete("DELETE.ME", "LOVE_LTR.DOC", "COVERUP.TXT")
komutunu kullanarak adı geçen üç dosyayı da silebilirsiniz.

 

 

Komutlara Resim Eklemek

VB 3'de bazı API fonksiyonlarını kullanarak her menü komutunun kenarına bir resim yerleştirebiliyorduk. VB4'te ise bu işlem çok daha kolay bir hale getirilmiş. Program ile birlikte bilgisayarınıza kurulan fakat siz onu bulmadıkça gizlenen ImageList kontrolü sayesinde bir kaç satır kodla bu işi gerçekleştirebiliyorsunuz. Programı çalıştırdığınız anda ImageList içindeki küçük simgeler menü seçeneklerine yerleştirilecek ve program sonlanana kadar orada kalacaktır.

Private Sub Form_Load()
Dim i%
Dim hMenu, hSubMenu, menuID, x
hMenu = GetMenu(hwnd)
hSubMenu = GetSubMenu(hMenu, 0)
For i = 1 To 4
menuID = GetMenuItemID(hSubMenu, i - 1)
x = SetMenuItemBitmaps(hMenu, menuID, &H4, img.ListImages(i).Picture, img.ListImages(i).Picture)
Next
menuID = GetMenuItemID(hSubMenu, 5)
x = SetMenuItemBitmaps(hMenu, menuID, 0, img.ListImages(5).Picture, 0&)
End Sub

 

Dosya Kopyalamak

VB'de dosyaları bir yerden bir yere kopyalamak için FileCopy isimli bir komut olduğunu biliyor muydunuz?
FileCopy "C:\COMMAND.COM", "C:\COMMAND.XXX"
gibi bir komut verdiğinizde ana dizinde bulunan COMMAND.COM isimli dosyanın yine aynı dizinde COMMAND.XXX isimli bir kopyası oluşacaktır

 

Programlarınız Hızlansın!

Eğer bir çok formdan oluşan bir projeniz varsa verdiğimiz püf noktasından yararlanarak projenizdeki formların daha hızlı yükletilmesini sağlayabilirsiniz. Yapmanız gereken Tool * Options menülerini geçerek karşınıza gelecek olan diyalog kutusunda Advanced sekmesine atlamak Project Load bölümünden Background Project Load seçeneğini açmak. Bunu yaptığınızda VB siz bir formla uğraşırken diğer bir formu arkaplanda belleğe yükleyecek ve zaten çok değerli olan bellek alanınızı işgal edecektir... Olsun hız daha önemli :)

 

Resmi Simge Haline Getirmek

Visual Basic 4.0'da ExtractIcon metodunu kullanarak herhangi bir resmi simge haline getirebilirsiniz. Bunu yapmak için Imagelist kontrolünün ListImage özelliğini kullanmalısınız. Deneyin çok basit olduğunu göreceksiniz.

 

VB5.0'da Sürükle ve Bırak!

VB'nin herhangi bir versiyonunda sürükleme ve bırakma işlemini gerçekleştirebilirsiniz. Peki ya OLE nesnelerini sürüklemek? Word'den Excel'e yazıları sürükleyip bırakabiliyorsunuz, ya da bir metni başka bir alana sadece fare ile seçip yerleştirebiliyorsunuz. VB'de bunu yapabilirsiniz. VB5'den önceki sürümlerde bu pek mümkün görülmüyor; VB5 ise birlikte getirdiği özelliklerden biriyle bunu gerçekleştirmenize izin veriyor.
Denemek için şunu yapabilirsiniz; form üzerine yan yana iki metin kutusu yerleştirin. Her iki metin kutusunun da OLEDragMode özelliğini 1-Automatic, OLEDropMode özelliğini 2-Automatic yapın. Formu çalıştırdığınızda artık metin kutularından bir tanesindeki metni seçip sürükleyerek öbür metin kutusuna yerleştirebilirsiniz. MS Word'ü ya da OLE destekleyen diğer programlarınızı da açıp bu özelliği deneyebilirsiniz, metin kutusundaki metni sadece sürükleyip bırakarak diğer dokümanlara kopyalayabildiğinizi göreceksiniz.

 

Registry'de Temizlik

Sisteminize yüklediğiniz her bir OCX kendini REGISTRY'ye kaydeder. Siz sonradan ilgili OCX'i silseniz bile REGISTRY'de onun imzası kalır ve zamanla bu bölüm bir çöplük haline gelir. Aynı şey yüklediğiniz ve kurulum programını kullanmadan sisteminizden sildiğiniz (!) programlar için de geçerlidir. Microsoft'un geliştirdiği RegClean isimli bir programı kullanarak sisteminizde imzası bulunan fakat kendisi bulunmayan tüm OCX'leri temizleyebilirsiniz. VB4 CD'nizin TOOLS\PSS dizininde bulabileceğiniz REGCLEAN.EXE dosyasını çalıştırdığınızda REGISTRY'deki hataları bulur ve düzeltmek için sizden onay bekler. Programın yaptığı değişiklikleri geri getirmek için ise sadece UNDO????.REG dosyalarını çalıştırmanız yeterlidir.

 

Hem Yazıcı Seçin Hem Yazdırın

Dergiyi arayan bazı okuyucular Form.Print metodunu ya da Printer nesnesini kullanarak form veya metin içeriklerini yazıcıdan çıkarabildiklerini fakat kullanıcıya yazıcı seçme veya dosyaya yazdırma imkanı vermek istediklerini söylediler. Sorunun çözümü çok basit tek yapmanız gereken yazdırma komutu vermeden önce COMMDLG.DLL dosyasında gizli olan Genel Diyalog Kutusunun Yazıcılar için olan bölümünü kullanmak.
Aşağıdakine benzer bir form oluşturur ve menü seçeneklerinden "Yazdır"a verdiğimiz kodları eklerseniz önce yazıcı seçimi ve özelliklerini gösteren diyalog kutusu ekrana gelecek sonra seçime göre metin kutusundaki yazılar uygun yazıcıya bastırılacaktır.

Private Sub yazdir_Click()
CommonDialog1.Action = 5
Printer.Print Text1.Text
End Sub

 

Matematik Fonksiyonları

Bu güne kadar örneklerimizde Val(), Str() gibi fonksiyonları sıkça kullandık. Bu fonksiyonlar her ne kadar metinler ile sayılar arasında geçiş yapma özelliğine sahip olsalar da VB'de "matematik fonksiyonları" kategorisinde yer alırlar. Eğer VB'deki diğer matematik fonksiyonlarını da öğrenmek istiyorsanız aşağıdaki listemize bakabilirsiniz.

Fonksiyon İşlevi
Abs(n)  n'nin mutlak değerini verir
Atn(n)  n'nin radyan cinsinden arktanjantını verir
Cos(n)  n açısının kosinüsünü verir.
Exp(n)  n kuvvete yükseltilen e sabitini verir
Rnd(n)  0 ile n arasında rasgele bir ondalıklı sayı üretir
Sgn(n)  n 0'dan küçükse -1, n 0'sa 0, n 0'dan büyükse 1 değerini verir
Sin(n)  n açısının sinüsünü verir
Sqr(n)  n sayısının karekökünü verir
Str(n)  numerik bir değişkeni alfanumerik bir değişkene çevirir
Tan(n)  n açısının tanjantını verir
Val(n)  Alfanumerik bir değişkenin numerik bir karşılığını verir

 

Visual Basic'te Bir Sürpriz!

VB ile hep program mı yapacaksınız, biraz da programcıların muzipliklerini görelim. VB 4.0 kullananlar birazdan anlatacağım işlemleri uyguladıklarında, araç kutusundaki her bir nesnenin açıklamasını VB geliştirme ekibinin bir üyesi olarak görecekler. Öncelikle yeni bir proje açın ve Form1 üzerinde bir metin kutusu oluşturun.
Metin kutusunun Text özelliğini, yani içindeki metni Properties kutucuğunu kullanarak Thunder olarak değiştirin.
Form üzerindeki kontroleri kilitlemek için kullandığınız tuşa bir kez basarak kontrolleri kilitleyin. Bundan sonra VB araç kutusunun üzerine gidin ve fareyi her bir buton üzerinde bir miktar bekletin. İşte VB program geliştirme ekibi!

 

FORMU ORTALAMAK

640*480 çözünürlükteki ekranlar için tasarladığınız uygulamanızın daha yüksek çözünürlüklerde ekranda rasgele bir yerde belirmesinden şikayetçiyseniz, işte size sadece 2 satırdan oluşan bir kod. Kodları her formun Load olayına ekleyebilir ya da ana modülde bir altyordam haline getirip yüklediğiniz tüm formlardan çağırabilirsiniz. Ortalanma işlemi her büyüklükteki form için başarılı olacaktır.

Private Sub Form_Load()
Left = (Screen.Width - Width) \ 2
Top = (Screen.Height - Height) \ 2
End Sub

PROGRAMINI GECİKTİREN NE?

UZUN süredir üzerinde çalıştığınız projenizin yavaş çalıştığını mı farkettiniz? O zaman birinci formdan başlayarak neyin programınızı yavaşlattığınızı bulmanızı tavsiye ederiz. Bu işlemi yapmak çok basit:
Programınızı her zamanki gibi F5 tuşu ile değil de bu sefer F8 tuşu ile başlatın. Visual Basic her bir satırdan sonra durarak bir sonraki satırı çalıştırmak için sizden F8 tuşuna basmanızı isteyecektir.
Böylece VB'nin her bir satırı çalıştırmak için sizden aldığı zamanı öğrenebileceksiniz. Step Into denilen bu işlemi, tekrarlanan kodları optimize ederek ve gerekli yerlerde ' debug' penceresini kullanarak verimli bir biçimde değerlendirirseniz programınızın hızlandığını göreceksiniz.

 

HAFTANIN KAÇINCI GÜNÜNDEYİZ?

DATE$ değişkenini değişik formatlardan okutarak bulunduğunuz günü kolayca öğrenebilirsiniz.
Bir de WeekDay fonksiyonu var ki yeri bambaşka... Bu fonksiyonu o günkü tarihi hiç değiştirmeden sadece bir tarih atayarak o tarihin haftanın kaçıncı gününe geldiğini öğrenmek için kullanabilirsiniz.

Tarih = #2/12/69#
Gun = WeekDay(Tarih)
MsgBox Gun

Hemen belirtelim, Visual Basic haftanın ilk günü olarak Pazar gününü kabul etmektedir. Ekrana gelecek ' 3' gibi bir sonuç verdiğiniz tarihin ' Salı' gününe denk geldiğini gösterir

DOS PENCERESİ KAPANSIN

WINDOWS 95 altında bir DOS uygulaması çalıştırdığınızda eğer o programa ait bir PIF dosyası ya da kısayol yoksa, program penceresi çalıştırıldıktan sonra kapatılmaz ve ekranda kalır.
Bu durumu önlemek için Windows'un bir API'sini kullanabilir, program sonlandıktan sonra DOS penceresini ortadan yok edebilirsiniz. Windows 95 ile birlikte gelen USER32.DLL ve KERNEL32.DLL adlı iki dosyayı kullanarak tanımladığımız üç fonksiyon sadece iki adet parametre ile işi bitiriyor.

Declare Function FindWindow& Lib ' user32' Alias ' FindWindowA' _
(ByVal lpClassName As String, ByVal lpWindowName As String)
Declare Function SendMessage Lib ' user32' Alias ' SendMessageA' (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Sub Sleep Lib ' kernel32' (ByVal dwMilliseconds As Long)
Public Const WM_CLOSE = &H10
Private m_sEXEName As String
Private m_sDosCaption As String
Public Sub RunDosApp()
Dim vReturnValue As Variant
Dim lRet As Long
Dim i As Integer
vReturnValue = Shell(m_sEXEName, 1) ' Dosyayı çalıştır
AppActivate vReturnValue ' EXE penceresini aktif hale getir.
Do
Sleep (10000)
lRet = FindWindow(vbNullString, m_sDosCaption)
If (lRet <> 0) Then
vReturnValue = SendMessage(lRet, WM_CLOSE, &O0, &O0)
Exit Do
End If


DOSYA YERİNDE Mİ?

PROGRAMINIZ çalışması için gerekli bir dosya silindiğinde bunu anlayabiliyor mu? Bir dosyanın verdiğiniz konumda bulunup bulunmadığını Visual Basic'teki Dir fonksiyonunu kullanarak bulabilirsiniz. Nasıl mı? Sadece istediğiniz dosya ismini bu fonksiyona atamanız ve dönen sonucu değerlendirmeniz yeterli olacaktır. Dönen değer boş bir değişken ise (' ' ) dosya belirttiğiniz yerde bulunmuyor demektir.

Private Sub Form_Load()
Dosya = Dir(' C:\AUTOEXEC.BAT' )
If Dosya = ' ' Then
MsgBox ' Dosya Bulunmuyor!'
Else
MsgBox ' Dosya Bulundu!'
End If
End Sub

Dir fonksiyonunu merak edenler için biraz daha açalım:
Genel kullanımı degisken=Dir[(YolAdı[, ekler])] olan bu fonksiyon sabit diskinizin istediğiniz bölümündeki herhangi bir bir dosya hakkında bilgiler almanıza yardımcı olur. ' Ekler' parametresi sayesinde gösterdiğiniz dosyanın dizin olup olmadığını ve hangi takılara sahip oldugunu (gizli, sistem gibi...) öğrenebilirsiniz. Eğer gösterdiğiniz dosya bulunamazsa fonksiyon hiç bir hata vermeyip sadece boş bir alfanumerik değişken döndürecektir.

DİSKTEKİ BOŞ ALANI BULMAK

SİZE herhangi bir diskte kalan boş alanın nasıl bulunacağını veremeyeceğiz; çünkü bu durumda Visual Basic'in her bir sürümü için ayrı kodlar vermemiz gerekir. Aslında herhangi bir komutu bulunmayan boş disk alanı bulma işlemini VB uygulamalarınızın kurulumunu gerçekleştirmek için kullandığınız dosyalardan biri olan SETUPKIT.DLL (VB4'te STKIT416.DLL) dosyasını kullanarak gerçekleştirebilirsiniz.

Declare Function DiskSpaceFree Lib ' SETUPKIT.DLL' () As Long
satırını formlardan bağımsız bir modüle yazdıktan sonra aşağıdaki üç satırı kullanarak sadece VB 3.0'da geçerli olacak programcığınızı tamamlayabilirsiniz.
Dim bos_alan&
' DiskSpaceFree() fonksiyonunun döndürdüğü değeri taşır.
ChDrive ' c:' ' Boş alanı bulmadan önce sürücümüzü seçelim.
free_space& = DiskSpaceFree()

VB'nizin sürümü ne olursa oldun SETUPKIT dizinindeki projeyi açarak hangi DLL dosyasından yararlanacağınızı ve ne gibi kodlar yazmanız gerektiğini öğrenebilirsiniz.

ÇOKLUORTAM DOSYALARINI ÇALIŞTIRMAK

DAHA önceki aylarda AVI dosyalarını oynatmak, WAV dosyalarını çalmak başlıkları altında verdiğimiz püf noktaları size çok uzun gelebilir. Çokluortam dosyalarını kendilerine ait API'lerle çağırmak daha hızlı ve daha sağlıklı olsa da size hiç bir seçeneği ayarlama olanağı vermeyen bir DLL dosyasını çağırarak da sistemse tanımlı tüm çokluortam dosyalarını minimum zahmetle çalıştırabilirsiniz.

' Aşağıdaki satır formlardan bağımsız bir modüle konulacak
Declare Function mciExecute Lib ' MMSystem' (ByVal FileName as String) As Integer
' Fonksiyonu aşağıdaki gibi kullanabilirsiniz.
' Tırnak içindeki play komutu sabit kalmalıdır.
Sub Form1_Click ()
' x değeri dosyanın başarılı olarak çalışıp çalışmadığını döndürür.
x = mciExecute(' Play c:\windows\ding.wav' )
x = mciExecute(' Play test.avi' )
End Sub

VB Hangi Modda?

UZUN süredir Visual Basic'te program hazırlıyor ve Immediate penceresini değişkenlerin aldığı değerleri öğrenmek için verimli olarak kullanıyorsanız bir püf noktasını bilmenizde fayda var: Yazacağınız tek satırlık bir fonksiyonla Visual Basic 5'in çalışma modunda mı yoksa bekleme modunda mı olduğunu bulabilir ve bunu programınıza anlatabilirsiniz. InRunMode() fonksiyonunun kullanılması aşağıdaki gibidir:

Function InRunMode(VBinst As VBIDE.VBE) As Boolean
InRunMode = (VBinst.CommandBars(' Run' ).Controls(' End' ).Enabled = True)
End Function

METİN KUTUSU AKTİFSE...

WINDOWS aktif olduğunda içerdiği metnin tümü seçilen metin kutuları gibi hayatımızı kolaylaştıracak bir çok güzel özellik bulundurur. Siz de bu özellikleri programlarınıza koyduğunuzda programınızın kullanılmasını daha kolay bir hale getirirsiniz. Bir metin kutusunun içeriğinin TAB tuşuyla veya başka bir şekilde aktif olmasıyla seçilmesini, aşağıdaki kodları metin kutusunun Got_Focus özelliğine ekleyerek sağlayabilirsiniz.

Text1.SelStart = 0
Text1.SelLength = Len(Text1.Text)

Eğer projenizde bir çok metin kutusu bulunuyorsa yukarıdaki iki satırı her metin kutusuna yazmanız zor olacaktır. Bunun için General - Declarations kısmına projenin her tarafından çağırılabilecek aşağıdaki altyordamı yazıp bu altyordamı herhangi bir metin kutusunun Got_Focus özelliğinden SelAllText yazarak çağırmanız daha uygun olacaktır.

Public Sub SelAllText()
Screen, ActiveControl.SelStart = 0
Screen.ActiveControl.SelLength = Len(Screen,ActiveControl.Text)
EndSub

DİZİN SEÇTİRMEK

WINDOWS'UN aç, kaydet, farklı kaydet diyalog kutularını kullanarak kullanıcının bir dosyası seçmesini veya kaydetmesini sağlayabilirsiniz. İş klasör seçmeye gelince genel diyalog kutuları yeterli olmayacaktır. Siz de klasör seçtirmek için VB ile gelen dirlistbox'ı kullanacaksınız. Aslında bu kontrolü kullanmanıza pek gerek yok. VB'e nasıl bir genel diyalog kutusu istediğinizi söylerseniz o sizin için o biçimde bir aç diyalog kutusu çıkaracaktır. Aşağıdaki fonksiyonu çağırdığınızda Win32'nin yeni özelliği olan dizin seçme kutusu ortaya çıkacaktır.

Option Explicit
Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
Private Const BIF_RETURNONLYFSDIRS = 1
Private Const MAX_PATH = 260
Private Declare Sub CoTaskMemFree Lib ' ole32.dll' (ByVal hMem As Long)
Private Declare Function lstrcat Lib ' kernel32' Alias ' lstrcatA' _
(ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare Function SHBrowseForFolder Lib ' shell32' _
(lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib ' shell32' _
(ByVal pidList As Long, ByVal lpBuffer As String) As Long
Public Function BrowseForFolder(hWndOwner As Long, sPrompt _
As String) As String
Dim iNull As Integer
Dim lpIDList As Long
Dim lResult As Long
Dim sPath As String
Dim udtBI As BrowseInfo
With udtBI
.hWndOwner = hWndOwner
.lpszTitle = lstrcat(sPrompt, ' ' )
.ulFlags = BIF_RETURNONLYFSDIRS
End With
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
lResult = SHGetPathFromIDList(lpIDList, sPath)
Call CoTaskMemFree(lpIDList)
iNull = InStr(sPath, vbNullChar)
If iNull Then
sPath = Left$(sPath, iNull - 1)
End If
End If
BrowseForFolder = sPath
End Function

BUTON YARDIMLARI

VB kullanıcıları her zaman dışarıdan temin ettikleri ' tooltip' kontrollerini kullanarak butonların üzerine gidildiğinde bir süre sonra ortaya çıkan yardım kutucuklarını programlarına koymayı uygun bulmuşlardır. Aslında sadece bir etiket kontrolünü kullanarak tooltip oluşturmak mümkündür.
Öncelikle form üzerinde bir buton, bir de etiket kontrolü oluşturun. Etiket kontrolünü sarıya boyayarak içine uygun açıklamayı yazın ve istediğinizbüyüklüğe getirin. Etiketi formun sınırları dışına taşıyın. (Formu büyütüp etiket kontrolünü uç noktalardan birine getirin ve kontrolü daraltın.)

Bunları yaptıktan sonra komut butonunun ' MouseMove' bölümüne giderek aşağıdakine benzer bir satır yazın:

Label1.Move 100,150

MouseMove olayı ile birlikte ' timer' nesnesini kullanarak daha geç çıkan tooltip'ler oluşturabilirsiniz, hem de hiç bir kontrol kullanmadan.

DUVAR KAĞIDINI DEĞİŞTİRMEK

AŞAĞIDAKİ küçük programı yazarak Windows'unuzun duvar kağıdının değişmesini ve tıpkı ' Uygula' tuşuna basılmış gibi anında görüntülenmesini sağlayabilirsiniz. WIN.INI dosyasına yazılmış değişikliklerin anında uygulanması için benzer kodları siz de programlarınızda kullanabilirsiniz.
Öncelikle aşağıdaki sabitleri programdan ayrı bir modüle yazın:

Const SPI_SETDESKWALLPAPER = 20
Const SPIF_UPDATEINIFILE = 1 ' WIN.INI sabitlarini güncelle
Const SPIF_SENDWININICHANGE = 2 ' Win.ini dosyasını değiştir ve bunu tüm programlara bildir.

Altyordamı çağırmak için aşağıdaki satırları kullanın:
Call WriteIniFile(' C:\WINDOWS\WIN.INI' , ' DeskTop' , ' TileWallPaper' , sValue, iEcode)
Call SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, ByVal sBMPFileName, SPIF_UPDATEINIFILE)

AVI FİLMLERİ OYNATMAK

DERGİYE gelen Visual Basic mektuplarından birçoğunda WAV ve MIDI dosyalarını çalabildiğinizi belirtiyor, AVI ve FLI görüntü dosyalarını çalıştırmayı soruyorsunuz. FLI dosyaları Autodesk'in hareketli görüntü formatı olup Internet üzerinde bulunabilecek bazı VBX ve OCX dosyaları sayesinde görüntülenebilirler. AVI dosyalarını görüntülemek için ise Windows'un bir parçası olan medya aygıtını kullanabilirsiniz.

Declare Function mciSendString Lib ' mmsystem' (ByVal strCommand As String, ByVal strReturn As String, ByVal iReturnLength As Integer, ByVal hCallback As Integer)
Yukarıdaki satırı General - Declarations bölümüne yazdıktan sonra satırı herhangi bir altyordamdan aşağıdaki gibi çağırabilir, nReturn değişkenini okuyarak AVI dosyasının oynatılıp oynatılmadığını anlayabilirsiniz.

Dim nReturn as Long
nReturn = mciSendString(' Open deneme.avi type AVIVideo Alias Video' , ' ' ,0,0)
nReturn = mciSendString(' Play Video FullScreen' ,' ' ,0,0)
nReturn = mciSendString(' Close Video' ,' ' ,0,0)

İÇERİĞİ BMP OLARAK KAYDETMEK

Resim içeren herhangi bir form veya kontoldeki resmi nasıl BMP olarak kaydedeceğinizi gösteriyoruz. Örnek programımız öncelikle form üzerinde renkli daireler çiziyor daha sonra da form içeriğini C: sürücüsünde TEST.BMP olarak kaydediyor. Tüm bu işlemleri gerçekleştirmek için form üzerine bir kez tıklamanız yeterli.

Private Sub Form_Click()
Dim CX, CY, Limit, Msg, Radius  '  Değişkenleri tanımla
ScaleMode = 3   '  Ölçeği piksel olarak tanımla
AutoRedraw = -1 '  AutoRedraw özelliğini aç.
Width = Height  '  Yüksekliği genişliğe eşitle
CX = ScaleWidth / 2 '  X posizyonunu ayarla
CY = ScaleHeight / 2
Limit = CX
For Radius = 0 To Limit
Circle (CX, CY), Radius, RGB(Rnd * 255, Rnd * 255, Rnd * 255)
DoEvents
Next Radius
Msg = ' Form üzerindeki görüntüyü kaydetmek için Tamam'a tıklayın.' 
MsgBox Msg
SavePicture Image, ' c:\TEST.BMP'   ' Görüntüyü kaydet
End Sub

 

OPTION BASE NEDİR?

BASIC'İN hemen hemen tüm versiyonlarında bulunan bu komut VB'den de mahrum edilmemiş. Ne işe yaradığını hemen anlatalım, hoşunuza gidebilir. Kullanılması zorunlu olmamasına rağmen bu komut değişkenleriz alt sınırını belirler. Komut formlardan bağımsız bir modülde değişken tanımı yapan tüm satırların üstünde kullanılmalıdır, yani boş bir modülün ilk satırı olmalıdır. Bilindiği gibi numerik değişkenlere hiç bir müdahale yapılmadığında değeri 0'dır. Projenizdeki tüm değişkenlerin başlangıç noktasını 1 yapmak için

Option Base 1

komutunu kullanabilirsiniz

ARKA PLANA DEGRADE ATMAK

HEMEN hemen tüm büyük programların kurulum arka planlarında maviden siyaha geçiş vardır. VB'nin uygulamalar için oluşturduğu kurulumlarda da bunu görmek mümkündür. Peki nasıl oluyor da oluyor, form üzerine degrade nasıl atılıyor? Aşağıdaki küçük alt yordamı kullanarak bunu siz de kolayca gerçekleştirebilirsiniz.

Sub Gradient(TheObject As Object, Redval&, Greenval&,_
Blueval&, TopToBottom As Boolean)
Dim Step%, Reps%, FillTop%, FillLeft%, FillRight%, FillBottom%, HColor$
Step = (TheObject.Height / 63)
If TopToBottom = True Then FillTop = 0 Else FillTop = TheObject.Height - Step
FillLeft = 0
FillRight = TheObject.Width
FillBottom = FillTop + Step
For Reps = 1 To 63
TheObject.Line (FillLeft, FillTop)-(FillRight, FillBottom),_
RGB(Redval, Greenval, Blueval), BF
Redval = Redval - 4
Greenval = Greenval - 4
Blueval = Blueval - 4
If Redval <= 0 Then Redval = 0
If Greenval <= 0 Then Greenval = 0
If Blueval <= 0 Then Blueval = 0
If TopToBottom = True Then FillTop = FillBottom Else FillTop = FillTop - Step
FillBottom = FillTop + Step
Next
End Sub

Örneğin mavi renkte, yukarıdan aşağıya bir degrade için Gradient Me, 0, 0, 255, 1 komutunu kullanabilirsiniz. 1 değeri yerine 0 yazdığınızda ise degradenin sırasını değişecektir.

 

KOMUT SATIRI PARAMETRELERİ

Windows'umun masaüstünde bazı programların kısayolları bulunuyor. Bu kısayollar üzerinde bir dosya sürükleyip bıraktığımda program açılıyor ve ardından dosya yükleniyor. VB ile yaptığım programlara ise bir türlü bu özelliği veremiyorum. Programımın yanına dosya ismini verdiğimde o dosyanın yüklenmesini nasıl sağlayabilirim?

KOMUT satırından verilen parametre her zaman sabit bir değişken olan ' Command' a atanır, dolayısıyla parametreyi öğrenmek için bu komutu kontrol etmek yeterlidir. Aşağıda, yüklendiği zaman komut satırından verilen parametreyi bildiren bir program bulacaksınız. Programın çalışmasını izlemek için öncelikle File * Make EXE File komutlarıyla derlemelisiniz. Daha sonra parametre vererek ve vermeyerek programın ne tepkiler verdiğini gözlemleyebilirsiniz.

Private Sub Form_Load()
If Command = ' '  Then' Komut satırında parametre yoksa...
  Msg = ' Komut satırından hiç bir parametre girilmemiş.' 
Else' Parametreyi mesaja yerleştir.
  Msg = ' Komut satırından verilen paramtre: ' '  & Command & ' ' ' 
End If
MsgBox Msg, 64, ' Komut satırı parametresi'  '  Mesajı görüntüle
End
End Sub

 

PROGRAMIM BİRDEN FAZLA ÇALIŞMASIN

AYNI anda bir çok dosya açma yeteneğine sahip, MDI formlardan oluşan bir uygulamanın birden fazla kopyasının yüklenmesi mantıksız bir durum olurdu. Düşünsenize, program ile ilişkilendirilmiş bir dosyaya tıklandığında dosya ayrı bir MDI form içinde açılacağına o uygulamanın ayrı bir kopyası yükleniyor... Eğer siz de uygulamanızın sadece bir kopyasının yüklenmesini istiyorsanız aşağıdaki kodları kullanabilirsiniz.

Private Sub Form_Load()
If App.PrevInstance Then
Kaydet$ = App.Title
App.Title = ' ... İkinci Kopya.' 
Form1.Caption = ' ... İkinci Kopya.' 
AppActivate Kaydet$
SendKeys ' % R' , True
End
End If
End Sub

 

METİN KUTUSUNA KOLAY GEÇİŞ

BAZI programlarda metin kutularının karşısında bir etiket kutusu ve bu etiket kutusunun içinde altı çizili bir karakter görürsünüz. ALT tuşuyla bu karakteri kullandığınızda otomatikman o metin kutusu aktif olur ve istediğiniz değerleri yazabilirsiniz. Bunu kendi programlarınızda uygulamanız çok kolaydır...

Önce bir etiket kutusu oluşturun ve açıklamayı yazarak bir karakterin önüne & işaretini getirin. Daha sonra bu etiket kutusunun karşısına bir metin kutusu getirin ve rasgele 3-5 kontrol daha oluşturup programı ateşleyin.

ALT tuşuyla birlikte önüne & karakteri getirdiğiniz harfe her bastığınızda ilgili metin kutusu aktif hale gelecektir. Olayın mantığı şöyle: etiketlerin aktif olma gibi bir özelliği yok, dolayısıyla siz onu aktif yapmak istediğinizde TabIndex'i bir büyük olan kontrol devreye giriyor ve aktif oluyor. Bu yüzden dikkat etmeniz gereken bir husus var, bir etiket oluşturduktan sonra başka hiç bir kontrol oluşturmadan ilgili metin kutusunu oluşturun, buna dikkat etmezseniz Properties kutucuğundaki TabIndex değerleriyle boğuşmak durumunda kalabilirsiniz.

AKTİF KONTROLÜ ÖĞRENMEK

KONTROL isimlerini görevlerine göre adlandırma gibi iyi bir alışkanlığınız varsa bu püf noktamız oldukça hoşunuza gidecek. Örneğin araştırma için kullandığınız bir metin kutusuna ' txtbul' gibi bir isim verdiyseniz bir kaç gün sonra projenizi tekrar açtığınızda muhtemelen kontrolün ismini unutacaksınız. İsmini tekrar hatırlamak için Properties kutucuğunu bile açmanıza gerek yok. Tek yapmanız gereken uygulamayı çalıştırmak ve kontrolün üzerine bir kez tıklayarak onu aktif hale getirmek. Break tuşuna basıp Debug penceresine

?Screen.ActiveControl.Name

satırını girdiğinizde VB bir sonraki satıra kontrolün ismini yazacaktır

BİR STATUS BAR SORUNU...

Elimde Visual Basic'in 4.0 sürümü var. Düne kadar bu programlama dilini Windows 3.1 altında kullanıyordum fakat artık Windows 95'e geçtim. Windows 95 altında VB 4'ü kurduğumda toolbar'a ' Windows 95 Common Controls' diye bir öğe eklendi. Bu kontrollerden en çok ilgimi çeken ' Status Bar' oldu. Ne kadar denediysem bu kontrolü özelleştiremedim ne yapmalıyım?

"STATUS Bar" kontrolü projenin çalıştırılma aşamasında en az özelleştirilebilir kontroller arasında gelir. Bu yüzden projeyi çalıştırmadan önce Properties kutusundaki ' Custom' seçeneğini ya da kontrol üzerine sağ tıklandığında ortaya çıkan Properties seçeneğini seçerek bu kontrolü değiştirebilirsiniz. Resimde görüldüğü gibi kontrolün yapısal özelliklerinin değişimi ' Panels' sekmesinden yapılmaktadır.

KONTROLLERİ AYIRMAK

GÜNLÜK hayatınızda sık sık karşınıza çıkan, belki de pek dikkat etmediğiniz bir ' arabirim püf noktası' verelim. Windows 95 altında çalışırken Windows Gezgini'ni açtınız diyelim. Karşınıza ince bir çizgiyle ayrılmış iki ayrı pencere gelir. Ortadaki çizgiyi sağa veya sola ötelediğinizde pencereler buna göre yeniden durum alarak ya genişler ya da daralır. Aynı durum formun büyüklüğüyle oynandığında da karşınıza çıkar ve formun yeni büyüklüğüne göre kontroller yeni yerlerini alır.

Yukarıda anlattığımız iki işlemi programlarınızda uygulamak pek de zor değildir. Örnek resimde gördüğünüz kontrolleri form üzerinde oluşturduktan sonra liste kutusunun ismini ' listsol' metin kutusunun ismini textsag olarak belirleyin. Form üzerinde bu iki kontrol dışında bir de resim kutusu oluşturarak ismini ' ayirac' olarak atayın.

Programı çalıştırıp ortadaki ayıracı sağa sola kaydırın, formu küçültüp büyültün, tıpkı Windows Gezgini gibi şekil alacaktır.

' Aşağıdaki kodlar boş bir BAS modülünün içinde
' General-Declarations bölümüne yazılacak.
 
Option Explicit
Private Const SPLT_WDTH As Integer = 5
Private currSplitPosX As Long
Dim CTRL_OFFSET As Integer
Dim SPLT_COLOUR As Long
 
' Aşağıdaki kodlar formun ilgili
' yerlerine yerleştirilecek.
 
Private Sub Form_Load()
CTRL_OFFSET = 5
SPLT_COLOUR = &H808080
currSplitPosX = &H7FFFFFFF
listsol.AddItem ' Listedeki 1. öğe' 
listsol.AddItem ' Listedeki 2. öğe' 
textsag.Text = ' Örnek bir metin' 
End Sub
Private Sub Form_Resize()
Dim x1 As Integer
Dim x2 As Integer
Dim height1 As Integer
Dim width1 As Integer
Dim width2 As Integer
On Error Resume Next
height1 = ScaleHeight - (CTRL_OFFSET * 2)
width1 = listsol.Width
x1 = CTRL_OFFSET
x2 = x1 + width1 + SPLT_WDTH - 1
width2 = ScaleWidth - x2 - CTRL_OFFSET
listsol.Move x1 - 1, CTRL_OFFSET, width1, height1
textsag.Move x2, CTRL_OFFSET, width2 + 1, height1
ayirac.Move x1 + listsol.Width - 1,
CTRL_OFFSET, SPLT_WDTH, height1
End Sub
 
Private Sub ayirac_MouseDown(Button As
Integer, Shift As Integer, x As Single, y As Single)
 
If Button = vbLeftButton Then
ayirac.BackColor = SPLT_COLOUR
currSplitPosX = CLng(x)
Else
 
If currSplitPosX <> &H7FFFFFFF Then ayirac_MouseUp
                               Button, Shift, x, y
 
currSplitPosX = &H7FFFFFFF
End If
End Sub
 
Private Sub ayirac_MouseMove(Button As
Integer, Shift As Integer, x As Single, y As Single)
 
If currSplitPosX& <> &H7FFFFFFF Then
If CLng(x) <> currSplitPosX Then
ayirac.Move ayirac.Left + x, CTRL_OFFSET,
 SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
currSplitPosX = CLng(x)
End If
End If
End Sub
 
Private Sub ayirac_MouseUp(Button As Integer,
         Shift As Integer, x As Single, y As Single)
 
If currSplitPosX <> &H7FFFFFFF Then
If CLng(x) <> currSplitPosX Then
ayirac.Move ayirac.Left + x, CTRL_OFFSET,
 SPLT_WDTH, ScaleHeight - (CTRL_OFFSET * 2)
 
End If
currSplitPosX = &H7FFFFFFF
ayirac.BackColor = &H8000000F
If ayirac.Left > 60 And ayirac.Left < (ScaleWidth - 60) Then
listsol.Width = ayirac.Left - listsol.Left
ElseIf ayirac.Left < 60 Then
listsol.Width = 60
Else:   listsol.Width = ScaleWidth - 60
End If
Form_Resize
End If
End Sub

 

CDBL FONKSİYONU VAL'A KARŞI

VAL () fonksiyonunu hemen hepiniz biliyorsunuzdur. Metin formatında olan sayıları numerik bir değişkene çevirmek için bu fonksiyonu kullanırız. Peki bu fonksiyonun kardeşi olan CDbl'yi hiç duymuş muydunuz? CDbl fonksiyonunu kullanmak içerisinde hane barındıran metinleri numerik hale getirmek için en iyi yoldur. Aşağıda iki fonksiyonun kullanımlarını ve arasındaki farkları göreceksiniz.

Kod: print Val(' 12345' )
Sonuç: 12345

Kod: print Val(' 12,345' )
Sonuç: 12

Kod: print CDbl(' 12,345' )
Sonuç: 12345

Kod: print CDbl(' 12345' )
Sonuç: 12345

Peki bu iki fonksiyonun farkı ne? Bir kaç satır fazla kodla yapılabilecek, sık sık rastlamayacağımız bu durum için niye iki ayrı fonksiyon üretilmiş? Cevabı çok basit: CDbl fonksiyonu değişik ülkelerde farklı metrik ve ondalık değerler kullanılabileceği düşünülerek tasarlanmış ve sayı içinde virgülün yerini değişse bile bunu tutarak sadık bir yardımcı durumuna gelmiş.

ENTER TUŞU SES ÇIKARMASIN

BİR metin kutusuna bilgi girerken ENTER tuşuna bastığınızda sisteminizden bir Bip sesi duyarsınız. Bu sistemin bir özelliğidir ve normaldir.

Bu sizi rahatsız ediyorsa ya da kullanıcının Enter tuşuna bastığında bir sonraki metin kutusuna yönlenmesini istiyorsanız form üzerinde bir metin kutusu oluşturarak programınıza aşağıdaki kodları yerleştirebilirsiniz.

Private Sub Text1_KeyPress(KeyAscii As Integer) 
If KeyAscii = Asc(vbCr) Then
KeyAscii = 0 '  Bir sonraki kontrole
             '  atlamak için 0 yerine 10 kullanın.
End If
End Sub

 

Komut Satırı Parametreleri Bölüm - 2

Daha önce derginizin Visual Basic köşesinde bir püf noktasına değindiniz ve komut satırından verilen parametrenin COMMAND$ isimli özel bir değişkene atandığını söylediniz. Merak ettiğim şu:

Komut satırı parametresini denemek için mutlaka programı derlememi mi gerekiyor? Bunun başka bir yolu yok mu?

UYGULAMANIZIN programlama aşamasında da suni komut satırı parametreleri vererek bu özelliği deneyebilirsiniz. Visual Basic'in değişik sürümleri için sorularınızın değişik yanıtları bulunuyor.

VB 3.0'da komut satırı parametresini belirlemek için, Options*Project seçeneklerini seçmeli, VB 4.0'da Tools*Options menülerini geçmeli, daha sonra Advanced sekmesine atlamalı, VB 5.0'da ise Project * Project Properties menülerini seçerek ' Make' sekmesine atlamalısınız. İşte bu kadar basit.

"BİRLİKTE AÇ" KUTUSU NASIL ÇIKARTILIR?

İşte size küçücük bir püf noktası, yaptığı iş ise çok basit: dosya ilişkilendirmeye yarayan "Birlikte Aç" kutusunu karşınıza getiriyor ve paramatre olarak verdiğiniz dosyayı istediğiniz bir programla açmanıza olanak tanıyor.

Private Sub Command1_Click() ' Komut butonuna tıklandığında
Dim x As Long
x = Shell("rundll32.exe shell32.dll,OpenAs_RunDLL dosyaadi.xxx")
End Sub

 

SİSTEM NE DURUMDA?

Üzerinde çalıştığınız program bir takım Windows 95 API'leri veya ağ desteği kullanıyor fakat API'ler Windows 95 Güvenli Kip'teyken çalışmıyorsa programınızı bu yönde programlayabilir Windows 95'in hangi kipte çalıştığını anlamasını sağlayabilirsiniz. Örnek programımız Windows 95'in nasıl başlatıldığını yine bazı API'leri kullanarak anlayabiliyor.

Aşağıdaki kodları formdan bağımsız bir modüle yerleştirdikten sonra diğer satırları form üzerinde bir komut butonu oluşturarak içerisine yerleştirin.

Option Explicit
Public Declare Function GetSystemMetrics Lib
"user32" (ByVal nIndex As Long) As Long
Public Const SM_CLEANBOOT = 67
 
Private Sub Command1_Click()
Select Case GetSystemMetrics(SM_CLEANBOOT)
Case 1: MsgBox "Sistem Güvenli Kipte çalışıyor."
Case 2: MsgBox "Sistem Ağ destekli güvenli kipte çalışıyor"
Case Else: MsgBox "Sistem normal olarak işliyor."
End Select
End Sub

 

BELGELER MENÜSÜ KULLANIMI

Programı oluşturmak için öncelikle resimde görüldüğü gibi üzerinde bir metin kutusu, iki opsiyon kutusu bir de komut butonu bulunan bir form oluşturun. Opsiyon kutularının ismini opsiyon(0) ve opsiyon(1) olarak (Tabii ki Control Array) tanımlayarak aşağıdaki kodları uygun alanlara girin.

Private Sub Command1_Click()
Dim r As Long
Dim shFlag As Long
Dim shData As String
shFlag = SHARD_PATH
 
Select Case opsiyon(0).Value = True
Case True:
shData = (Text1)
Case False:
shData = vbNullString
End Select
 
r = SHAddToRecentDocs(shFlag, shData)
End Sub
 
' Aşağıdaki satırlar formdan
' bağımsız bir BAS modülüne girecek.
Public Const SHARD_PIDL = &H1&
Public Const SHARD_PATH = &H2&
Public Declare Function SHAddToRecentDocs Lib
"shell32.dll" (ByVal dwFlags As Long, ByVal 
dwData As String) As Long

Programı çalıştırdıktan sonra opsiyon kutularını kullanarak ister metin kutusundaki dosyayı belgeler menüsüne ekler, isterseniz belgeler menüsünü tamamen boşaltırsınız.

 

CAPSLOCK VE NUMLOCK'U KODLA DEĞİŞTİRMEK

Visual Basic 4.0 paketi tuş kilitlerini değiştirmek ve görüntülemek için "Keyboard State Control"'unu (KEYSTA32.OCX) birlikte getiriyor. Bu kontrolü kullanarak ve küçük bir kod satırı yazarak programınız çalışırken CAPSLOCK, NUMLOCK ve SCROLLLOCK kilitlerini açıp kapayabilirsiniz.

Peki programınızı derleyip kurulum paketinin oluşturduğunuzda ne olacak? Şüphesiz ilgili kontrol de uygulamanız ile brilikte programı kurduğunuz sisteme kopyalanacak. Bizce bu kadar küçük bir işlemi gerçekleştiren bir kontrolü kullanarak uygulamanızı kalabalıklaştırmak anlamsız, aynı işlemi bir WIN32 API'sini kullanarak da gerçekleştirebilirsiniz.

Örneğimizi uygulamak için üzerinde üç tane komut butonu bir de etiket kontrolü olan bir form oluşturun ve ilk aşamada boş bir BAS modülünün General - Declarations bölümüne aşağıdaki satırları girin.

Public Const VK_CAPITAL = &H14
Public Type KeyboardBytes 
kbByte(0 To 255) As Byte
End Type
 
Public kbArray As KeyboardBytes
Public Declare Function GetKeyState Lib "user32"
(ByVal nVirtKey As Long) As Long
Public Declare Function GetKeyboardState Lib
"user32" (kbArray As KeyboardBytes) As Long
Public Declare Function SetKeyboardState Lib
"user32" (kbArray As KeyboardBytes) As Long
 
'Aşağıdaki kodlar oluşturduğnuz formun 
'General  - Declarations bölümüne girmelidir:
Private Function CapsLock() As Integer
CapsLock = GetKeyState(VK_CAPITAL) And 1 = 1
End Function
 
Private Command1_Click()
GetKeyboardState kbArray
 
kbArray.kbByte(VK_CAPITAL) = 
IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
 
SetKeyboardState kbArray
Label1 = IIf(CapsLock() = 1, "Açık", "Kapalı")
End Sub
 
Private Sub Command2_Click()
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 1
SetKeyboardState kbArray
Label1 = IIf(CapsLock() = 1, "Açık ", "Kapalı")
End Sub
 
Private Sub Command3_Click()
GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 0
SetKeyboardState kbArray
Label1 = IIf(CapsLock() = 1, "Açık ", "Kapalı")
End Sub

 

Sistem Klasörlerini Öğrenmek

Programınızın kullanacağı geçici bir dosya oluşturmak istiyorsunuz. Ya da Windows'un bulunduğu klasörü programınıza bildirmek istiyorsunuz. Bu işlemleri gerçekleştirmek çok basit çünkü Windows 3 adet API kullanarak bu klasörleri bulmanıza izin veriyor. Örneğimizi uygulamak için resimde görüldüğü gibi üç adet etiket kontrolü bir adet de komut butonunu formunuz üzerine yerleştirin.

'Ayrı bir BAS modülüne girecek:
Option Explicit
Public Declare Function GetSystemDirectory
Lib "kernel32" Alias "GetSystemDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
 
Public Declare Function GetTempPath Lib "kernel32"
Alias "GetTempPathA" _
(ByVal nSize As Long, ByVal lpBuffer As String) As Long
 
Public Declare Function GetWindowsDirectory
 Lib "kernel32" Alias "GetWindowsDirectoryA" _
(ByVal lpBuffer As String, ByVal nSize As Long) As Long
 
'Formun General - Declarations bölümüne girecek:
Private Function GetSystemDir() As String
Dim r As Long
Dim nSize As Long
Dim tmp As String
tmp = Space$(256)
nSize = Len(tmp)
r = GetSystemDirectory(tmp, nSize)
GetSystemDir = TrimNull(tmp)
End Function
 
Public Function GetTempDir() As String
Dim r As Long
Dim nSize As Long
Dim tmp As String
tmp = Space$(256)
nSize = Len(tmp)
r = GetTempPath(nSize, tmp)
GetTempDir = TrimNull(tmp)
End Function
 
Private Function GetWinDir() As String
Dim r As Long
Dim nSize As Long
Dim tmp As String
           
tmp = Space$(256)
nSize = Len(tmp)
r = GetWindowsDirectory(tmp, nSize)
GetWinDir = TrimNull(tmp)
End Function
 
Private Function TrimNull(item As String)
Dim pos As Integer
pos = InStr(item, Chr$(0))
If pos Then
TrimNull = Left$(item, pos - 1)
Else: TrimNull = item
End If
End Function
 
Private Sub Command1_Click()
Label1 = GetWinDir()
Label2 = GetTempDir()
Label3 = GetSystemDir()
End Sub

 

"BU NEDİR" VE "KONTROLE DUYARLI" YARDIMLARI KULLANMAK

Visual Basic ile gelen yardım derleyicisini kullanarak uygulamanızın yardım dosyasını oluşturdunuz. Yardım dosyanızın içerisinde ilgili ID tanımlamalarını da doğru olarak yaptıysanız, artık size verdiğimiz adımları uygulayarak programınıza yardım seçeneğini ekleyebilirsiniz.

Programınızda yardım dosyasını olduğu gibi çağırabileceğiniz gibi Windows'un iki ayrı özelliğini de kullanabilirsiniz. Birinci özellik "Bu nedir?" yardımı. Formun sağ üst köşesinde kapatma tuşunun hemen yanında yer alan soru işaretine tıkladığınızda çıkan "Bu nedir?" kutusunu form üzerindeki kontrollerden birinin üzerine getirip tıkladığınızda kontrolün ne işe yaradığına dair bilgiler bir baloncuk içerisinde çıkacaktır. Bu özelliği uygulamanızda kullanabilmek için aşağıdaki adımları uygulayın:

Tools * Options * Project bölümüne gelerek "Help File" kutusuna uygulamanız için oluşturduğunuz yardım dosyasını girin. Form'un Properties kutsunu açarak "MinButton" ve "MaxButton" tuşlarına "False" değerini verin. Aynı zamanda "Whats This Button" ve "Whats This Help" değerlerini de "True" yapın. Form üzerinde örnek bir metin kutusu kontrolü oluşturarak bu kontrolün "whats this help id"sine daha önce yardım dosyası oluştururken belirlediğiniz numarayı girin.

İkinci yardım özelliği ise "kontrole duyarlı" yardım. Kullanıcı herhangi bir kontrol üzerindeyken F1'e bastığında yardım dosyasını ilgili bölümü gelsin istiyorsanız şu adımları uygulayın:

Tools * Options * Project bölümüne gelerek "Help File" kutusuna uygulamanız için oluşturduğunuz yardım dosyasını girin. Örnek bir metin kutusu kontolü oluşturarak properties kutusundan bu kontrolün "Help Context ID'sini tanımlayın. Bu kadar basit…

 

EKRAN ÇÖZÜNÜRLÜĞÜNÜ BULMAK

Dergiler verdikleri CD'ler için özgün arabirimler tasarlıyorlar. Her bilgisayarda çalışması için 640 * 480 çözünürlükte tasarlanan bir CD arabirimi 800*600 gibi bir çözünürlükte çalıştırıldığında genellikle ekranın diğer taraflarını siyaha boyar. Peki program 800*600 çözünürlükte çalıştığını nasıl anlıyor, ekranın diğer kısımlarını doldurup kendini nasıl ortalıyor. Aşağıda SystemParametersInfo API'sini kullanarak komut butonuna basıldığında tüm ekrana yayılan ve ekran çözünürlüğünü gösteren bir program veriyoruz.

'Aşağıdaki kodlar formlardan bağımsız
bir BAS modülüne girecek...
 
Option Explicit
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
 
Public Const SPI_GETWORKAREA& = 48
Public Declare Function SystemParametersInfo Lib
"user32" Alias "SystemParametersInfoA" (ByVal uAction
As Long, ByVal uParam As Long, lpvParam As Any,
ByVal fuWinIni As Long) As Long
 
'Form1'e girecek…
Private Sub Command1_Click()
Dim rc As RECT
Dim r As Long
Dim msg As String
 
r = SystemParametersInfo(SPI_GETWORKAREA, 0&, rc, 0&)
msg = "Ekran Çözünürlüğü" & vbCrLf
msg = msg & "Genişlik - " & rc.Right & vbCrLf
msg = msg & "Yükseklik - " & rc.Bottom & vbCrLf & vbCrLf
Text1 = msg
Me.Move rc.Left * Screen.TwipsPerPixelX, _
rc.Top * Screen.TwipsPerPixelY, _
rc.Right * Screen.TwipsPerPixelX, _
rc.Bottom * Screen.TwipsPerPixelY
End Sub

 

DİSK BİLGİLERİNİ ÖĞRENMEK

Okurlarımızdan sık sık programlarını kopyalanmaya karşı nasıl koruyacakları, disk bilgilerini nasıl alacakları yoluna sorular alıyoruz. Bundan uzun süre önce bu köşede verdiğimiz API'ler ile disk üzerinde ne kadar yer kaldığını, sistem kaynaklarının nasıl bulunacağını anlattık. Değinmediğimiz bir konu ise disk seri numarasının ve etiketinin bulunmasıydı.

Aşağıdaki programcık dilediğiniz sürücünün seri numarasını ve etiketini komut butonuna basıldığında size veriyor. PathName$ = "… satırını değiştirerek istediğiniz sürücüyü seçebilirsiniz...

' Formdan ayrı bir BAS modülüne girecek:
Option Explicit
Declare Function GetVolumeInformation Lib
"kernel32" Alias "GetVolumeInformationA"
(ByVal lpRootPathName As String, ByVal
lpVolumeNameBuffer As String, ByVal
nVolumeNameSize As Long, lpVolumeSerialNumber
As Long, lpMaximumComponentLength As Long,
lpFileSystemFlags As Long, ByVal
lpFileSystemNameBuffer As String, ByVal
nFileSystemNameSize As Long) As Long
 
'Aşağıdaki kodların hepsi formun General -
Declarations bölümüne girecek
Private Sub cmdVolumeInfo_Click()
Dim r As Long
Dim PathName As String
Dim DrvVolumeName As String
Dim DrvSerialNo As String
PathName$ = "c:\"
 
rgbGetVolumeInformationRDI PathName$,
DrvVolumeName$, DrvSerialNo$
 
'Sonuçları Görüntüle
Print: Print "  Sürücü İstatistikleri  ", ":  "; UCase$(PathName$)
Print: Print "  Disk Etiketi     ", ":  "; DrvVolumeName$
Print "  Seri Numarası", ":  "; DrvSerialNo$
End Sub
 
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, 
(Screen.Height - Me.Height) \ 2
End Sub
 
Function GetHiWord(dw As Long) As Integer
If dw& And &H80000000 Then
GetHiWord% = (dw& \ 65535) - 1
Else: GetHiWord% = dw& \ 65535
End If
End Function
 
Function GetLoWord(dw As Long) As Integer
If dw& And &H8000& Then
GetLoWord% = &H8000 Or (dw& And &H7FFF&)
Else: GetLoWord% = dw& And &HFFFF&
End If
End Function
 
Private Sub rgbGetVolumeInformationRDI(PathName$,
DrvVolumeName$, DrvSerialNo$)
Dim r As Long
Dim pos As Integer
Dim HiWord As Long
Dim HiHexStr As String
Dim LoWord As Long
Dim LoHexStr As String
Dim VolumeSN As Long
Dim MaxFNLen As Long
Dim UnusedStr As String
Dim UnusedVal1 As Long
Dim UnusedVal2 As Long
 
DrvVolumeName$ = Space$(14)
UnusedStr$ = Space$(32)
 
r& = GetVolumeInformation(PathName$, _
DrvVolumeName$, Len(DrvVolumeName$), VolumeSN&, _
UnusedVal1&, UnusedVal2&, UnusedStr$, Len(UnusedStr$))
 
If r& = 0 Then Exit Sub
pos% = InStr(DrvVolumeName$, Chr$(0))
If pos% Then DrvVolumeName$ = Left$(DrvVolumeName$, pos% - 1)
If Len(Trim$(DrvVolumeName$)) = 0 Then DrvVolumeName$ = "(no label)"
 
HiWord& = GetHiWord(VolumeSN&) And &HFFFF&
LoWord& = GetLoWord(VolumeSN&) And &HFFFF&
HiHexStr$ = Format$(Hex(HiWord&), "0000")
LoHexStr$ = Format$(Hex(LoWord&), "0000")
DrvSerialNo$ = HiHexStr$ & "-" & LoHexStr$
End Sub

 

PROGRAMCIYA ULAŞMAK

Windows 95 için programlanan uygulamalara son günlerde Internet erişimi eklemek çok moda oldu.

Gerek programın menülerinden gerek formun herhangi bir alanına tıklayarak programa ait web sitesine veya programcıya ulaşabiliyorsunuz.

Siz de bu özelliği programlarınızda kolayca ekleyebilirsiniz. Şekilde görüldüğü gibi bir etiket kontrolü oluşturup içerisindeki metnin mavi ve altının çizili olmasını sağlayın. Böylece kullanıcı bunun bir Internet adresi olduğunu anlayacaktır. Daha sonra etiketin Click olayına aşağıdaki satırlardan birini girin.

x = Shell("start mailto:dlevitas@pcworld.com.tr")
x = Shell("start www.pcworld.com.tr")

işte bu kadar basit. Çözümümüz çok kolay görünse de etiket kontrolü üzerine tıklandığında seçiminize göre mail programı veya web tarayıcısı açılacak, ilgili kimseye veya siteye ulaşılacaktır

 

INTERNET KISAYOLLARI

Soru: İki ay önceki derginizde API'leri kullanarak nasıl kısayol oluşturulacağını anlattınız. Verdiğiniz kodları uygulayarak bunu başardım. Sorum ise nasıl Internet kısayolu oluşturacağım. Yani belirli bir API kullanarak ve parametre vererek Internet kısayolu oluşturabilir miyim?

Necdet Özkeser (e-mail)

Yanıt: Ne yazık ki Internet kısayolu oluşturmak için kullanabileceğiniz bir API bulamadık. Zaten bir bu tip bir kısayol oluşturmak için API'ye gerek yok. Aşağıdaki gibi kodlar kullanarak kolayca bir kısayol oluşturabilir, üzerine çift tıklayarak web tarayıcınızın ilgili adrese bağlanmasını sağlayabilirsiniz.

' Masaüstünde PC World Online isimli bir kısayol oluştur
Open "c:\windows\desktop\PC World Online.url" For Output As #1
' Gerekli İçeriği yaz
Print #1, "[InternetShortcut]"
' Adresi Yaz
Print #1, "URL=" & "http://www.pcworld.com.tr"
Close #1    'Tamamla

 

BALON YARDIM ÖRNEĞİ

Önceki sayılarımızdan birinde balon yardım oluşturmayı teorik olarak anlatmış kod vermeden sadece fikir vermiştik. Bir kaç arkadaşımız balon yardım oluşturmak için gerekli olan kodları ısrarla istediler. Biz de sizi kırmıyor ve örnek programı yayınlıyoruz. Programı oluşturmak için öncelikle iki ayrı form oluşturun. Oluşturacağınız ikinci form balon yardımı oluşturacak, bu formun işlevini yerine getirebilmesi için Border Style özelliğini None yapın. 1. form'a, şekilde görüldüğü gibi kontrolleri yerleştirin ve her bir komut butonuna CMD ismini vererek bir Control Array oluşturun. Formlardan bir BAS modülüne aşağıdaki satırları girin.

Type POINTAPI
        X As Long
        Y As Long
End Type
 
Public Const SW_SHOWNOACTIVATE = 4
Public Const GW_CHILD = 5
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Declare Function GetActiveWindow Lib "user32" () As Long
Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long,
ByVal yPoint As Long) As Long
Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long,
ByVal nCmdShow As Long) As Long
 
FORM 1'İN KODLARI:
 
General - Declarations
Private Sub DisplayHelp(Help$)
Dim lpPoint As POINTAPI
Dim ret As Integer
 
If Len(Help$) > 0 Then
frmHelp.Hide
frmHelp.Label1.Caption = Help$ '& "  "
Call GetCursorPos(lpPoint)
frmHelp.Top = (lpPoint.y + 18) * Screen.TwipsPerPixelY
frmHelp.Left = (lpPoint.x - 2) * Screen.TwipsPerPixelY
frmHelp.Width = frmHelp.Label1.Width + (12 * Screen.TwipsPerPixelX)
frmHelp.Height = frmHelp.Label1.Height + (6 * Screen.TwipsPerPixelY)
frmHelp.ZOrder
ret = ShowWindow(frmHelp.hwnd, SW_SHOWNOACTIVATE)
 
Else
frmHelp.Hide
End If
End Sub
 
Private Sub Form_Load()
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
Timer1.Interval = 500
Timer1.Enabled = True
List1.AddItem "Item 1"
List1.AddItem "Item 2"
List1.AddItem "Item 3"
End Sub
 
Private Sub Timer1_Timer()
Dim curhWnd As Integer
Dim p As POINTAPI
Static LasthWnd As Integer 
 
If GetActiveWindow() = Form1.hwnd Then  ' Form'un aktif olduğundan emin ol
Call GetCursorPos(p)    ' İmlecin yerini belirle
 
' Fare imleci hangi kontrol üzerinde?
curhWnd = WindowFromPoint(p.X, p.Y)
 
' Aynı kontrol mü?
' Eğer aynı kontrol ise tekrar baloncuğu çizme.
 
If curhWnd <> LasthWnd Then
LasthWnd = curhWnd   ' Şimdiki HWnd değerini aklında tut.
Timer1.Interval = 1  ' Kontrol etme aralığını düşür
Select Case curhWnd
Case cmd(0).hwnd: DisplayHelp (cmd(0).Tag)
Case cmd(1).hwnd: DisplayHelp (cmd(1).Tag)
Case cmd(2).hwnd: DisplayHelp (cmd(2).Tag)
Case cmd(3).hwnd: DisplayHelp (cmd(3).Tag)
Case List1.hwnd:  DisplayHelp (List1.Tag)
Case Text1.hwnd:  DisplayHelp (Text1.Tag)
 
'Eğer fare imleci kontrolün dışına çıkarsa form2'yi gizle
Case frmhelp.hwnd
frmhelp.Hide
Case Else:
DisplayHelp ""
Timer1.Interval = 1000
End Select
End If
End If
End Sub
 
FORM 2'NİN KODLARI
Private Sub Form_Load()
Me.Caption = ""
Me.BackColor = &HFFFF&
Label1.Left = 4 * Screen.TwipsPerPixelX
Label1.Top = 20

Tüm kodları girdikten sonra her kontrolü seçerek TAG özelliğine gidin ve görülmesini istediğiniz açıklamayı yazın. Projenizi çalıştırın ve Timer 1'in Interval aralığına göre kontrollerin balon yardımlarını gösteren uygulamanıza bakın. İşte bu kadar

 

YAZDIĞINIZ METİN DEĞİŞMESİN

Öyle bir metin kutusu istiyorsunuz ki kullanıcı üzerine bir şeyler yazdığında değiştiremesin, istediğiniz metin dosyasını bu kutuya yüklediğinizde kullanıcı sadece bunu aşağı yukarı kaydırsın. Örneğimiz için alelade bir form üzerine yine alelade bir metin kutusu oluşturun. DENEME.TXT adında ve uzunca bir metin içeren örnek dosya oluşturun.

Form_Load ()
'Deneme dosyamızı yüklüyoruz...
Open "DENEME.TXT" For Input As #1    
Text1.Text = Input$(LOF(1), 1)
Close #1
End Sub
 
Private Sub Text1_KeyPress(keyascii As Integer)
' Kullanıcı bir tuşa bastığında ASCII değerini
0 yaparak tuş vuruşunu gözardı et.
keyascii = 0
End Sub

 

MASAÜSTÜ RESMİNİ DEĞİŞTİRMEK

Visual Basic ile masaüstü resmini değiştirmek çok kolaydır. Sadece USER32.DLL dosyasında bulunan bir fonksiyonu çağırmak yeterlidir. Yemedik, içmedik sizin için bu API'yi kullanan bir program oluşturduk. Öncelikle FORMdan ayrı bir BAS modülüne aşağıdaki tek bir satırı girin.

Declare Function SystemParametersInfo Lib "user32" Alias
"SystemParametersInfoA" (ByVal uAction As Long, ByVal
uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni
As Long) As Long

Fonksiyonu programınıza tanıttıktan sonra şekildeki gibi bir form oluşturun ve ilgili bölümlere kodları yazın.

Private Sub Form_Load()
Dim Temp As String
 
Temp = InputBox("Lütfen WINDOWS 
klasörünü girin", "", "C:\WINDOWS\")
 
If Temp = "" Then End   'Vazgeç'e basıldı
If Right$(Temp, 1) <> "\" Then Temp = Temp + "\"
list1.Tag = Temp
Temp = Temp + "*.bmp"
Temp = Dir$(Temp)
Do While Temp$ <> ""
Temp = Dir$
 
'Dosya bulunamazsa döngüden çık.
If Temp = "" Then Exit Do
list1.AddItem Temp
Loop
  
list1.AddItem "(Yok)"
Show
list1.SetFocus
list1.ListIndex = 0
End Sub
 
'Küçük açıklama: Formun yüklenme aşamasında 
'Setfocus olayını kullanırsanız VB hata verir.
 
Private Sub list1_DblClick()
Dim Temp As String
Dim BMPFile As String
Temp = Tag
If list1.Text = "(Yok)" Then
BMPFile = "(Yok)"
Else
BMPFile = Temp + (list1)
End If
 
SystemParametersInfo SPI_SETDESKWALLPAPER, 0, 
ByVal BMPFile, SPIF_UPDATEINIFILE
 
End Sub
 
'Değiştir tuşu
Private Sub Command1_Click()
list1_DblClick
End Sub

Programınızı çalıştırdıktan sonra karşınıza BMP dosyalarınızın yerini soran bir mesaj kutusu gelecektir. Mesaj kutusuna uygun bir dizin girdikten sonra artık liste kutusundaki ilgili resme çift tıklayarak veya değiştir tuşuna basarak resmi masaüstüne yükleyebilirsiniz. Program aynı zamanda WIN.INI dosyasını da haberdar ediyor.

 

NEDİR ŞU HWnd ?

VB'de pencerelerle ilgili API'leri kullanırken genellikle HWnd diye bir kullanıma rastlıyorum. HWnd nedir? Anladığım kadarıyla pencere numarası belirtiyor.

Serkan Güngör / e-mail

Doğru bir tahminde bulunmuşsunuz. HWnd değişkeni pencere referansıdır. Yıllar önce Bill Gates amcamız Windows'un arabirimini tasarlarken arabirimi oluşturan her küçük pencereye bir numara vermeyi ve pencereleri numaralarıyla adlandırmayı düşünmüş. İşletim sisteminiz proje her çağrıldığında HWnd değişkenine bir tam sayı atar. Her zaman değişken olan bu tam sayı herhangi bir kontrol veya pencerenin referansını belirtir. Bu referans değişkendir çünkü çalıştırılan diğer uygulamalar ve yüklenen kontroller zaten kendilerine birer HWnd değeri alır.

Bir nesnenin HWnd değerini öğrenmek için X = nesne.hWnd gibi bir ifade kullanabilir X değerini öğrenerek Hwnd değerini okuyabilirsiniz

 

 

API nedir? Örnek Bir Çalışma Yapalım

Konu: Windows API'lerinden birisini kullanarak dial-up bağlantı şifrelerini vs. öğrenmek
Kullanılacak API: mpr.dll (WIN32 Network Interface DLL)
Kullanılacak API Fonksiyon: WnetEnumCachedPasswords
Seviye: İleri düzey

API (application programming interface) nedir ?

Uygulama programlama arabiriminin kısaltması olan API kavramı, kısaca Windows işletim sisteminin temel günlük işlerini Visual Basic altında kullanabilmemizi sağlayan fonksiyonlardır. Yani mesela API'ler sayesinde Windows'un restart (yeniden başlat) yada shutdown (bilgisayarı kapat) fonksiyonlarını kullanabiliriz.

API, programın çalışması esnasında ; Windows işletim sisteminde var olan programlara özgü bilgisayar hizmetlerinin bir kümesi olan DLL dosyalarından oluşur.
Mesela Visual Basic'in aslında varolan UCASE$ fonksiyonunu ele alalım. Bir string'i (karakteri yada cümleyi) büyük harfler ile yazmak için UCASE fonksiyonunu kullanırız.

Örneğin:
DIM RT AS STRING
RT isimli string bir değişkenimiz oldu. Karakter yada cümle vs. atayabiliriz:
RT="Ekrem"
şimdi RT değişkenine Ekrem değerini atadık. Şimdi bu değerin tüm harflerini büyük harfe çevirmek için:
RT = UCASE$(RT)
yazmamız yeterli.
Bu örnekte gördüğünüz gibi, Visual Basic'in aslında varolan ucase komutunun bir kullanım şekli vardır. Ve bu kullanım şeklini bilmemiz durumunda istediğimiz her komutu kullanabilmekteyiz. Ama Windows'un bir API'sini yani bir fonksiyonu kullanmak için tanımlamamız gerekmektedir.

Örneğin:
Bu komut kümesi sayesinde, ses kartının var olup olmadığını öğrenebiliriz.
Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
Bu satır ile winmm.dll kütüphanesi içerisindeki waveoutgetnumdevs isimli komutu/fonksiyonu tanımlıyoruz. Böylece sanki Visual Basic'e yeni bir komut/fonksiyon kazandırmış oluyoruz.
Function HasSound() As Boolean
Dim rtn As Long
rtn = waveOutGetNumDevs() 'ses kartı var mı diye kontrol et.
HasSound = rtn > 0
End Function

Ve sonra HasSound isminde bir fonksiyon ile bu API'yi kullanıyoruz.
Hassound TRUE değerini verirse, ses kartı mevcut. False değerini verirse ses kartının mevcut olmadığı anlamına geliyor.

İşte sizinde gördüğünüz gibi Visual Basic'in aslında varolan UCASE fonksiyonunu şu şekilde tanımlamamıza gerek yoktur : Declare Function Ucase (X As String) As String
Çünkü Ucase fonksiyonu zaten Visual Basic'te tanımlanmış hazır bir fonksiyondur. Ama API ; var olan ve bir dll (dynamic link libraries) dosyasında saklı olan bir komuttur/fonksiyondur. Bu sebeple tanımlamamız gerekmektedir.

Bir örnek daha vererek API konusunu pekiştirelim:

Tanımlamalar
Private Const EWX_REBOOT As Long = 2
Private Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long

Bu API sayesinde Windows'u yeniden başlatabiliriz (reboot)
lngResult = ExitWindowsEx(EWX_REBOOT, 0&)

Yukarıdaki bu son örnekte de gördüğünüz gibi user32.dll dosyasında mevcut olan ExitWindowsEx isimli fonksiyonu önce tanımladık. Nasıl kullanılacağını, gerekli parametreleri gördük ve uygulamasını da yaptık. Burada lngResult değişkeni Long bir değişkendir. Neden? Çünkü API tanımlamasından da anlayacağınız üzere API'nin tanımının en sonunda As Long yazıyor.

Peki diyeceksiniz ki ben bu fonksiyonları nerden bulacağım ve bu tanımlamaları nasıl yapacağım ? Evet bu sorunun cevabı : Microsoft Visual Basic'in API Viewer eklentisi.
Visual Basic'i kurduğunuz zaman beraberinde API Viewer isimli uygulamada kurulur, yada kurulmadıysa Visual Basic'in Setup'ından bunu kurmalısınız.


Resmi orjinal boyutlarında görmek için tıklayın.

Programın kullanımı gayet kolaydır. Öncelikle File menüsünden Load Text File seçeneğini kullanıp, Visual Basic'in yüklü olduğu klasörün bir alt klasörü olan Tools klasöründen WIN32API.TXT dosyasını yükleyelim. Şimdi API types bölümünden mesela Declares'i seçelim. Karşımıza declares (tanımlama) listesi çıkacaktır.


Resmi orjinal boyutlarında görmek için tıklayın.

Bu listeden seçtiğimiz bir fonksiyon/komut üzerine çift tıklayarak tanımlamasını Selected Items bölümünde görebiliriz. Bu bölümü temizlemek için yada bu bölümdeki bilgiyi kopyalamak için vs. sağ taraftaki tuşları kullanabiliriz. Mesela bu listeden ExitWindowsEx isimli fonksiyonu seçin. Aşağıdaki bölgede tanımlaması olarak şu belirecektir :
Public Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

Görüyorsunuz ki fonksiyonun tanımlaması içerisinde bazı değişkenler geçmektedir. Bizim bu değişkenleri de tanımlamamız gerekiyor. Yani dwReserved ve uFlags değişkenlerini.

Uflags değişkeni : ewx_force , ewx_logoff, ewx_poweroff, ewx_reboot, ewx_shutdown değerlerinden birini almalıdır. Bu durumda bizim bu sabitleri de tanımlamamız gerekmektedir. İşte şimdi API Viewer programından API Type yazan yeri Constants yapalım ve bu defa çıkan listeden ewx_force , ewx_logoff, ewx_poweroff, ewx_reboot, ewx_shutdown değişkenlerini arayalım ve bulup tanımlamaları kopyalayalım:

uFlags
bu değişkenlerin birisi (veya fazlası) bilgisayarı nasıl kapayacağını ne yapacağını gösterir.
EWX_FORCE = 4
Uygulamaları hemen soru sormadan kapanmaya zorlar.
EWX_LOGOFF = 0
Ağdan ayrılmanızı sağlar.
EWX_POWEROFF = 8
Sistemi kapatır ve mümkünse bilgisayarı da kapatır.
EWX_REBOOT = 2
Sistemi yeniden başlatır
EWX_SHUTDOWN = 1
Sistemi kapatır.
dwReserved
Değeri daima 0 (sıfır) 'dır.

(Örnek : Const EWX_REBOOT As Long = 2)

Şimdi bu tanımlamalardan sonra, Windows'u yeniden başlatan kodu yazalım :
Dim retval As Long
retval = ExitWindowsEx(EWX_REBOOT Or EWX_FORCE, 0)

buradaki retval değeri fonksiyonun çalışıp çalışmadığını denetlemek içindir. Eğer fonksiyon çalışmazsa 0 (sıfır) değerini alır. Yani bu satırın altına şunu yazabiliriz:
If retval = 0 Then MsgBox "Reboot yapamadı"
EWX_REBOOT OR EWX_FORCE satırı sayesinde açık olan tüm uygulamaları kapanmaya zorlayıp, reboot yapıyoruz. Eğer EWX_FORCE satırını yazmazsak açık olan uygulamaları kapanmaya zorlamadan reboot olayı gerçekleşir ki bu bilgi kaybına sebep olabilir.

Apilerin kullanımları API Viewer sayesinde bulabileceğiniz gibi,
http://www.vbapi.com/ref/index.html adresinden de bulabilirsiniz.


Bu kısa API açıklamasından sonra gelelim bir başka API'nin kullanımına: mpr.dll dosyası içerisindeki WnetEnumCachedPasswords isimli bir fonksiyon ile Internet'e bağlantı şifrelerini vs. öğrenebiliriz. Şimdi bu API'nin kullanımı anlatalım.
Öncelikle API'nin declare bölümünü halledelim.
Declare Function WNetEnumCachedPasswords Lib "mpr.dll" (ByVal cString As String, ByVal nLoop As Integer, ByVal bByte As Byte, ByVal proc As Long, ByVal lLong As Long) As Long

Programı yazmak için ben 1 form ve 1 module kullandım.
Formda 1 tane listbox var. List1 isimli (Form : .frm uzantılı dosyadır)
Modülde 1 tane fonksiyon ve 1 tane sub kullandım. (Module : .bas uzantılı dosyadır)
Bu fonksiyona callback ismini verdim ve fonksiyona X ve lsomething değeri girilince integer değer veriyor. X için yeni bir tür oluşturdum ve türün ismini password_cache_entry koydum. Şimdi bir de bunu tanımlayalım:

Type PASSWORD_CACHE_ENTRY
cbEntry As Integer
cbResource As Integer
cbPassword As Integer
iEntry As Byte
nType As Byte
abResource(1 To 1024) As Byte
End Type

Bu sayede elde edeceğimiz X değeri hem Entry (bir şifre yerini) hem kaynağı hem o kaynağa ait şifreyi hem türünü sayısını (kaç tane şifre var) vs. içerecek ve bu X değerini callback fonksiyonu ile parçalayacağız. Yani ayrıştıracağız. Örneğin X değerinin ekrem1567hasan23838ahmet37733 olduğunu düşünürsek biz bu değeri ekrem=1567, hasan=23838, ahmet=37733 şeklinde ayrıştıracağız ve bunları form üzerinde göstereceğiz.

Public Function callback(X As PASSWORD_CACHE_ENTRY, ByVal lSomething As Long) As Integer

Dim nLoop As Integer
Dim cString As String
Dim ccomputer
Dim Resource As String
Dim ResType As String
Dim Password As String
ResType = X.nType

For nLoop = 1 To X.cbResource '1 den X.cbResource'a kadar yani kaç tane şifre varsa o kadar loop yapacak. Böylece şifre kaynaklarını öğreneceğiz. Mesela dial-up networking (çevirmeli ağ'da) Superonline isimli bir bağlantınız var. Ixir isimli bir başka bağlantınız var. Yani toplam 2 bağlantınız varsa, X.cbResource sayısı 2dir. 1'den 2'ye kadar bir döngü oluşturmuş oluruz. Bu döngü sayesinde Cstring değerini öğreneceğiz. Cstring çevirmeli ağ'da görünen isimdir. Yani mesela yukarıdaki dediğimiz durum sizde mevcut ise, 1. cstring değeri Superonline/username. 2.cstring değeri Ixir/username olacaktır. Yani bağlantı yeriniz ve kullanıcı adınız. Bir sonraki adımda şifreyi öğreneceğiz.

If X.abResource(nLoop) <> 0 Then
cString = cString & Chr(X.abResource(nLoop))
Else
cString = cString & " "
End If

Next

Resource = cString 'Resource değişkenine cString'in değerini aktarıyoruz.
cString = "" 'cstring değişkenini sıfırlıyoruz


'Şimdi tekrar bir döngü kuruyoruz. Bu döngü ile de her bir resource'a denk gelen şifreyi öğreniyoruz.

For nLoop = X.cbResource + 1 To (X.cbResource + X.cbPassword)

If X.abResource(nLoop) <> 0 Then
cString = cString & Chr(X.abResource(nLoop))
Else
cString = cString & " "
End If

Next

Password = cString 'burada her bir resource'a denk gelen şifreyi elde ediyoruz.

cString = ""

'bazen browser(tarayıcımız) ile sitelerde gezerken bize kullanıcı adı ve şifre sorar. Mesela fortunecity'den bir web alanı aldınız ve dosya yüklemek istiyorsunuz. Bir diyalog çıkar ve kullanıcı adı & şifre ister. Bu diyaloğun altında da bir soru vardır. Şifreyi kaydedeyim mi diye. İşte eğer bu kutuyu da işaretlemişseniz, burada kaydettiğiniz şifreleri de bu şimdi yazdığımız program ile göreceksiniz. Ama bu program ile gö(ste)rmek istemiyorsanız şu satırı buraya eklemeniz yeterli olacaktır.

If X.nType <> 6 Then GoTo 66 'tür 6 dan farklı ise 66.satıra git. Tür'ün 6 olması demek dial-up (çevirmeli ağ) şifresi olması demek.

' bu yukardaki satır sayesinde türü 6'dan farklı olan şifreler formdaki listbox'imiza eklenmiyecek ve atlanacaktır.

If UCase$(Left$(Resource, 5)) = "*RNA\" Then
Resource = Right$(Resource, Len(Resource) - 5)

'Dial-up şifrelerin resource'u *RNA\ ile başlar. Mesela *RNA\Superonline\ekremdeniz .İşte formumuzda yani programı çalıştırdıktan sonra böyle bir görünüm olmaması için başında *RNA\ olan resourceların baş kısmındaki bu fazlalığı bu if-endif sayesinde yok ediyoruz.
End If

Form1.list1.AddItem Resource & " -------- " & Password 'form1'deki list1 isimli listbox'a resource ve şifre eklenecektir. Örneğin Superonline/ekremdeniz ---- 348d3j gibi böylece programın bulduğu kullanıcı adı ve şifre programda listbox içinde altalta eklenecektir.

66
'burası 66.satırın devamıdır. Satır başına 66 yazmamız orayı 66.satır diye adlandırmamıza neden olur.
callback = True
'callback değeri TRUE atanmadan önce 0'dır. TRUE atandıktan sonra -1 değerini alır
End Function

Böylece fonksiyonumuzu hazırladık. Bu fonksiyonda gördüğünüz gibi, hiç tanımladığımız API ile ilgili birşey yoktu. Neden ? Çünkü fonksiyonu Sub içerisinden çağıracağız. (Yukarıda demiştim : 1 fonksiyon 1 sub hazırladım diye)

Gelelim bu Sub 'i yazmaya:

Public Sub GetPasswords()
'Önce WnetEnumCachedPasswords APIsi için gerekli olan parametreleri tanımlayalım ve birer öncelikli değerler atıyalım.(sıfırlayalım)
Dim nLoop As Integer
Dim cString As String
Dim lLong As Long
Dim bByte As Byte
bByte = &HFF
nLoop = 0
lLong = 0
cString = ""

'Gördüğünüz gibi bu sub içerisinde API'yi kullanıyoruz ve API de callback fonksiyonunu bir parametresi olarak kullanıyor.
Call WNetEnumCachedPasswords(cString, nLoop, bByte, AddressOf callback, lLong)
End Sub


Şimdi fonksiyonumuzu yazdık. Sub'imizi yazdık. Sub çağrılınca fonksiyonda devreye girecek. Çünkü fonksiyon Sub'daki API komutunun bir parametresi olarak kullanıldı. Bu foksiyon ve sub ve declare'lari (yukardaki tanımlamaları) bir module dosyasına kaydedelim. Örneğin module1.bas dosyası. Ve artık yapmamız gereken tek şey: Form'dan getpasswords isimli sub'i çağırmak.

Form'un load bölümüne (form_load)

Call Getpasswords

Yazmamız yeterli olacaktir.


Resmi orjinal boyutlarında görmek için tıklayın.


Artık programı çalıştırın ve unuttuğunuz şifreleri rahatlıkla hatırlayın... :-)

Şimdi bu anlattığımız konuda geçen olaylardan bazılarını tekrar gözden geçirelim ve yazımızı sonlandıralım.

1- programda 1 form ve 1 module kullandık. Module kullanmamızın sebebi, public olarak tanımladığımız tüm API ve fonksiyonları programımızın tüm formlarında kullanabilmektir. Yani mesela 2 formdan oluşan bir program düşünün ve birinci formda bir fonksiyon tanımladığımızı düşünün. Şimdi o fonksiyonu 2.formda nasıl kullanacağız ? Fonksiyon eğer module'de tanımlanırsa tüm formlarda kullanılabilinir.
2- Bu program ile form'a yerleştirdiğimiz listbox'in her satırında yeni bir şifreyi görmemizi sağladık. Bunu yapmak için

Form1.list1.AddItem Resource & " -------- " & Password

kalıbını kullandık yani name'i (adı) Form1 olan formumuzda mevcut olan, ve adı list1 olan listbox'imizin her satirina resource ----- password şeklinde kullanıcı adı ve şifreleri eklettik. Ve şöyle bir görünüm elde ettik :

Superonline/ekremdeniz ------ sifre
Ixir/kullaniciadi ------ sifre
Turk.Net/kullanici ------ sifre
ISS/kullaniciadi ------ sifre
3- Ama şunu unutmamalısınız, Çevirmeli Ağ'dan bir bağlantınızı çevirirken yani internete bağlanırken, size kullanıcı adı ve şifrenizi yazmanızı isteyen bir diyalog görünür. Bu diyalog'da Save Password (Parolayı Kaydet) kutucuğu işaretli değilse, yani her seferinde siz şifrenizi yazıyorsanız, bu program işe yaramayacaktır. Çünkü programın özelliği, kaydedilmis ve ****** şeklinde görünen bağlantı şifrelerini ve diğer şifreleri göstermektir.

(Örnek yapılmış programı (sifrele.exe) çalıştırabilmek için VB6 Runtime Files yüklü olmalıdır.)

Visual Basic ile adım adım...

KONU : VB'e giriş ve Değişkenler

Merhaba arkadaşlar! Bu ikinci yazım ile Visual Basic'e adım adım başlayalım istiyorum. İlk derse ileri seviye bir programlama ile başladık ve gördük ki Visual Basic ile de birçok şeyi yapabiliyoruz. Bu derste Visual Basic ortamını tanımaktan ziyade, VB (Visual Basic) ile QBASIC (QB) 'deki ortak komutların bazılarını öğrenmekle işe başlayalım. Çünkü Visual Basic ortamını anlatan birçok kitap ve kaynak olmasına rağmen Kaynak Kod (source code) ile ilgili kaynak bulmanız epey zor...

Eğer eskiden az çok qbasic veya gwbasic ile uğraşmış iseniz, bu ders size çok aşina gelecek. Ama ilk defa programcılığa Windows ortamında VB ile başlamak isteyenlere de çok kolay geleceğine eminim. Lafı daha fazla uzatmadan QB-VB ortak ilk dersimize başlayalım:

Bir programcı her zaman değişkenler kullanarak ihtiyaçları karşılayan programlar yapar. Mesela 1 de 20 ye kadar olan sayıları toplamamız istendiğinde karşımıza birkaç alternatif çıkar;
a-ya hesap makinesi veya kendi beyin gücümüz ile bu işlemi yapmak
b-ya bir kısım matematik formülleri ile bu işi yapmak
c-ya da küçük bir program yazarak bu işlemi yapmak ve sonuca ulaşmak

burada ilk 2 seçeneği anlatmayacağımıza göre, geriye kaldı tek seçimimiz : Program yazmak.

İşte matematikten de hatırlayacağımız meşhur X değişkenini ele alalım.
X=1 dersek, X değişkenine "1" rakamsal değerini vermiş oluyorduk. Aynı şey program dilinde de geçerli. Fakat burada biraz daha ileri seviyede geçerli.

Biz X değişkenine matematik de sadece rakamları atayabilirdik, oysa programcılıkta nerdeyse her şeyi atayabiliyoruz.
X= "Ekrem" dersek, VB ve QB 'de X değişkenine "Ekrem" kelimesini (karakterler grubunu) atamış oluruz.
X= "E" deseydik ,X değişkenine "E" karakterini atamış oluruz. Yani X nedir diye sorgulayacak olursak "E" cevabını alırız. Aynı matematikte X=2 iken, X nedir (değeri nedir) dediğimizde 2'dir cevabını aldığımız gibi.
Mesela matematikte denklemler konusunda X=Y+2 denildiği zaman X 'in Y 'den 2 fazla olduğunu anlıyorduk. Program yazarken ise bunun manası nerdeyse, matematikteki gibi.
Programcılıkta X=Y+2 dersek, X 'in değerini Y 'den 2 fazla yap manasına geliyor.
Demek ki bir programda X=X+1 dersek, X 'in değerini X 'den 1 fazla yap manasına gelir, yani 1 arttır demektir.
Bize sorulan soruyu hatırlarsak 1'den 20'ye kadar olan sayıları toplamamız için alt alta şunu yazsak yeterli olur o halde :
X=1
X=X+2
X=X+3
X=X+4
...
...
Bu şekilde 20 tane satır yazdığımızda en son elimizdeki X değeri sorumuzun cevabı olacaktır.
Ama programcılığın asıl amacı sorunları en kısa yoldan çözmektir. İşte biz yukardaki örnek gibi birkaç defa tekrarlanan durumlar için döngüler kullanıyoruz. Yani öyle bir komut kullanmalıyız ki bize 19 defa X=X+? yazdırtmasın. İşte bunu yapmanın yollarından birisi (FOR...NEXT) komutları.

Bu çok basit komutları tanımaya başlamadan önce, size VB dilinde program yapmak için bilmeniz gereken bir bilgiyi vermek istiyorum. Yukarıda da belirttiğimiz gibi programlama dilinde değişkenler kullanırız. Ama bu değişkenlerin türünü tanımlamamız gerekir. Yani sayısal işlemlerle ilgili bir değişken kullanacaksak bunu belirtmemiz gerektiği gibi kelime, harf gibi ilgili bir değişken kullanacaksak bunu da belirtmeliyiz.

X bir değişken adı olabilir. Bunun türü INTEGER olabilir yani sayısal bir işlem için kullanılan değişken. Harfler değişken ismi olabilir. Hatta harflerin yan yana gelmesi ile de değişken ismi oluşturabiliriz yani XY de bir değişken ismi olabilir. Harfin yanına rakama koyarak da değişken ismi oluşturabiliriz : X1, Y2, XH2 gibi.
Ama bu değişkenlerin türünü belirlememiz gerekir. Örneğin 1'den 20'ye kadar olan sayıların toplanması için X değişkeni kullanırsak, X sonuca ulaşıncaya kadar farklı farklı bir sürü rakamsal değer alacaktır (önce 1 değerini sonra 3 değerini sonra 6 sonra 10 sonra ...)
Öyleyse biz X değişkenini;
DIM X as INTEGER
diyerek tanımlamalıyız.
Eğer X değişkenimiz program içerisinde karakter yada kelime gibi bir değer alacak olsaydı, biz onu STRING olarak tanımlayacaktık, örneğin; DIM X as STRING
Bir çok değişken türü vardır, bunlardan bazıları ve alabilecekleri değerler :

INTEGER

-32,768 ile 32,767

LONG

-2,147,483,648 ile 2,147,483,647

DATE

Ocak 1, 100 ile Aralık 31, 9999

STRING

Harf, rakam, kelime, harf yığını

VARIANT

Herhangi bir şey (sayısal yada karakter)

Değişken (variable) türleri sadece bu kadarla sınırlı değildir ama şimdilik bu kadarını bilelim. Ve örneklerle izah edelim. Demin de bahsettiğimiz gibi programımızda değişken kullanabilmek için DIM komutu ile değişkenin türünü tanımlamanız gerekmektedir. Bu tanımlama işlemi sayesinde program sırasında hata yapma şansınız azalır, daha doğrusu hata yaptığınızda yani sayısal bir değişkene karakter atadığınızda VB sizi uyaracak ve hatanın daha büyük aksaklıklara sebep olmasını önleyecektir.

INTEGER, tabloda da gördüğümüz gibi belirli aralıktaki sayısal değerlerle işlem yapmak için kullanıyoruz. LONG 'da ise bu aralık epey geniş. Diyeceksiniz ki ben niye hep LONG kullanmıyorum da INTEGER kullanıyorum. Çünkü bu değişkenlerin hafıza da kapladığı yer farklı. Yani programımızın hafızadan yer kaplamasını azaltmanın yolu, değişkenleri olabilecek en küçük dairede seçmek olacaktır. LONG değişkeni 4 byte yer kaplarken, INTEGER değişkeni 2 byte yer kaplar. Yani 1'den 20'ye kadar sayılarla işlem yapacağımızda INTEGER kullanmamız hafızayı en verimli kullanmamız manasına gelecektir.
DATE değişkeni adı da üstünde tarihleri atadığımız bir değişkendir. Bunu DATE$ fonksiyonunu anlatırken çok daha iyi anlayacağız.
STRING değişkeni ise karakter yada kelime hatta cümle atayabileceğimiz bir değişkendir.
Mesela:
DIM Y as STRING
Dersek, bu değişkene şunları atayabiliriz
Y= "Ekrem"
Y= "Online Dergi"
Y= "a"
Y= "34"
Y= "2 / 2"
Y= "işler nasıl gidiyor?"

Daha çok örnek verilebilir. Gördüğünüz gibi hep tırnak işareti ile bu değer atama işlemini gerçekleştirdik. Peki tırnak işareti koymayıp da bir rakamsal değer yazsaydık ne olurdu?
Örneğin Y=30 dersek, Y 'nin değerini VB 'e sorarsak bize "30" diyecektir.
Y= "30" dersek de Y 'nin değerini VB 'e sorarsak bize "30" diyecektir. Ama LONG-INTEGER olayındaki gibi gereksiz yere STRING bir değişkene INTEGER değer atamak olacaktır.
Peki, Y=30*30 dersek, Y 'nin değerini VB 'e sorarsak bize "90" diyecektir. Ama Y= "30*30" dersek ve Y 'nin değerini VB 'e sorarsak bize "30*30" diyecektir...

Evet arkadaşlar, çok dikkat etmeliyiz bu ince ayrıntıya.
Yani biz STRING bir değişken olan Y 'ye 30 değerini verirsek, VB onu otomatik olarak tırnak içine alacak yani karaktere çevirecektir.
DIM Y as STRING
DIM X as INTEGER
X=30
Y=30

Şimdi VB 'e X ne diye sorarsak, X=30 diyecektir. Ama Y ne diye sorarsak Y= "30" diyecektir. Y ile 2'yi çarp dersek bize Y 'nin değeri ile 2'nin çarpımından elde edilen sonucu yani 60'ı verecektir.


Resmi orijinal boyutlarında görmek için tıklayın.

Peki bir de şunu ele alalım:
DIM Y as STRING
Y= "Ekrem"
Y= Y + 10

Sizce Y 'nin bu durumda son alacağı değer ne olacaktır ? :
Elbette ki hata olacaktır. VB bu işlemi gerçekleştiremeyecek ve hata mesajı verecektir.

Peki ya şu durumda ne yapacaktır ?
DIM Y as STRING
Y= "10"
Y= Y + 10

Tabii ki Y, 20 değerini alacaktır. Ama bu işlemde Y 'yi INTEGER olarak atasaydık, ve Y=10 yazarak bunu sorgulasaydık yine 20 değerini alacaktık Fakat hafızayı daha verimli kullanmış olacaktık. Çünkü INTEGER 2 byte hafıza kullanırken, STRING (10byte + değişkenin uzunluğu) kadar hafıza kullanır.

Evet, galiba STRING, INTEGER, LONG kavramlarını kavradık, geriye VARIANT kavramı kaldı. Bu kavramın en kısa tarifi kılık değiştiren bir değişken olduğudur. Yani sayı atarsanız sayısal bir değişken gibi davranır, karakter atarsanız STRING gibi davranır.

Biz değişkenleri kullanarak bir toplama işlemi yapacaksak hiç şüphesiz aynı türden değişkenler kullanmak zorundayız. Örneğin:
DIM X as INTEGER, T as INTEGER, Y as INTEGER
X=10
Y=56
T = X + Y

Gördüğünüz gibi 3 değişkenimiz de INTEGER olduğundan rahatlıkla bu işlemi gerçekleştirdik.
VARIANT değişkenini ise program içerisinde yeri gelir INTEGER olarak yeri gelir STRING olarak kullanırız.

Bir de şu örneğe bakalım:
DIM X as VARIANT, T as VARIANT, Y as VARIANT
X= 10
Y= "ekrem"
T= X+Y

Şimdi T 'nin son değerini VB 'e soracak olursak bize hata mesajı verecektir. Çünkü X değişkenini INTEGER gibi kullandık, Y değişkenini STRING gibi kullandık, ama T değişkeni geçerli bir değişken olmadı STRING ile INTEGER 'in toplamı hata ile sonuçlanacaktır.
Halbuki bu programda X,T ve Y değişkenlerini STRING olarak atasaydık ve sonuçta T 'nin değerinin ne olduğunu VB 'e sorsaydık bize "10ekrem" diyecekti.

VARIANT, en fazla hafızadan yer işgal eden değişkendir. Bu sebeple gerekli yerlerde kullanılmalıdır. Bu 2.dersimizi son bir VARIANT örneği ile bitirelim istiyorum :

DIM X as VARIANT, T as VARIANT, Y as VARIANT
X= 10
Y= "ekrem"
X= "10"
T= X+Y

Şimdi VB 'e T 'nin son değerini sorduğumuzda "10ekrem" değerini alırız. Çünkü önce X 'i INTEGER yaptık, X= 10 diyerek, ama sonra X= "10" diyerek, X değişkenini bir STRING'e çevirdik. Y de bir STRING olduğundan, iki STRING 'in artı işareti ile toplanması birleştirilmesi manasına geldiğinden T 'nin son değerini "10ekrem" olarak değiştirmiş olduk.

Bir sonraki derste kaldığımız yerden devam etmek üzere...

Değişkenler ve For-Next komutları

Bu üçüncü yazımız ile değişkenler konusuna kaldığımız yerden devam edelim istiyorum. String değişkeni karakter, karakter grubu yada metin içeren bir değişken türüydü. Variant ise program esnasında türü değişebilen bir değişkendi. Date ise tarih ile ilgili bilgileri saklayan bir değişken türüydü. Şimdi bu üç değişken türünü biraz inceleyelim. Hatırlayacaksınız ki değişkenlerin türünü DIM komutu ile kullanmadan önce tanımlamamız gerekiyor.

STRING:

DIM X AS STRING şeklindeki bir satırla X değişkenini string olarak tanımlamış oluruz. Ve biz bu satırdan sonra

X = "z" yada X = "deneme" yada X = "deneme 34" şeklindeki bir satır ile X değişkenine bir değer atayabiliriz. Ama eğer X değişkeninin belirlediğimiz bir uzunlukta olmasını istiyorsak bunu tanımlarken belirtebiliriz.

DIM X AS STRING * 8 gibi tanımlayabiliriz. Burada 8 rakamı yerine olmasını istediğimiz uzunluğu yazarız.

Eğer DIM X AS STRING * 11 yazıp X değişkenini tanımladıktan sonra X = "Ekrem Deniz nasılsın?" yazsak bile X değişkenine "Ekrem Deniz" değerini atamış oluruz. Çünkü X değişkeni 11 karakter uzunluğunda bir string olarak belirlemiştik.

VARIANT:

DIM X AS VARIANT yazarsak X değişkenini variant olarak yani her türlü değişken tipine bürünen bir değişken olarak atamış oluruz. Eğer biz bir değişken tanımlarken türünü belirtmezsek biz onu variant yapmış oluruz. Yani DIM X AS VARIANT tanımlaması ile DIM X tanımlaması bizi aynı sonuca götürür. Her iki tanımlamada da X değişkenini variant olarak belirlemiş oluruz. Biz program içerisinde bir değişkeni variant yaparsak ve programın akışı içerisinde o değişkenin tipini öğrenmek istersek bazı komutlar kullanarak bunu öğrenebiliriz. Bu konuyu daha sonra ele alacağız. Bu sayede variant değişkenimizin o an sayısal bir değer alıp almadığını çok rahatlıkla öğrenebileceğiz.

DATE değişkeni ve DATE$ fonksiyonu :

Bir diğer değişken tipi DATE 'dir. Bu değişken sayesinde tarih bilgilerini bir değişkene atayabiliriz. DATE$ fonksiyonu ise bir değişken türü değildir. Konumuzu daha iyi anlamamız için bu fonksiyonu biraz anlatayım istiyorum.

Visual Basic ile program yazarken birçok komut ve fonksiyon kullanırız. 'DIM' bir komuttur ve değişken tanımlamamızı sağlar. DATE$ ise bir fonksiyondur ve günün tarihini öğrenmemizi sağlar.

Yani Msgbox DATE$ yazmamız ve programımızı çalıştırmamız durumunda ekrana mesaj kutusu içerisinde günün (bilgisayarınızın) tarihi gelir. (MSGBOX bir komuttur ve kullanımını daha sonra detaylı bir şekilde inceleyeceğiz.)

Eğer 13 Aralık 2001 günü bu programı çalıştırırsak ekrana gelen tarih şu şekilde olacaktır : 12-13-2001
Yani önce ay sonra gün sonra da yıl şeklinde gelir ve aralarında '-' işareti olacaktır.

Şimdi bir de şu programı yazalım:

Dim X As Date
X = Date$
Msgbox X

Bu programda birinci satırda X değişkeninin türünü Date olarak belirledik. İkinci satırda X değişkenine günün tarihini Date$ fonksiyonu ile atadık. Son satırda ise X değişkenini bir mesaj kutusu içerisinde ekranda gösterttik.
Msgbox Date$ yazdığımızda ekrana 12-13-2001 gelirken, bu program sonrasında karşımıza 13.12.2001 değeri geliyor. Çünkü X değişkeninin türü tarih(date). Ve sistemimiz tarihi nasıl gösteriyorsa, ekranda X değişkenini de tarihi gösterdiği şekilde gösteriyor.

Ama programın birinci satırında Dim X As String demiş olsaydık X değişkeninin son değeri "12-13-2001" olacaktı. Yani Visual Basic 'in tarihi gösterme standardı olan ay-gün-yıl şeklinde olacaktı.

Burada bir Date$ fonksiyonundan bahsetmişken Date fonksiyonundan da bahsedelim birazcık. Eğer DATE$ fonksiyonunun sonundaki dolar($) işareti kaldırırsak yine bir tarih ile ilgili fonksiyon elde ederiz. Bu fonksiyon direkt bizim sistemimizin tarih bilgisinin sistemiz tarafında ayarlanmış şekliyle gösterir.

Not : Date fonksiyonu ile aynı yazılışa sahip olan Date değişkenini karıştırmayalım.

Yani Msgbox Date yazarsak ekrana 13.12.2001 gelir. Çünkü Windows 'umuzun bölgesel ayarlarında sistem tarihinin şeklini dd.mm.yyyy şeklinde ayarlamışız. Ama Visual Basic standardı tarih bilgisini öğrenmek istersek Msgbox Date$ yazmamız yeterlidir. Visual Basic standardı tarih bilgisi mm-dd-yyyy şeklindedir.


Bir önceki dersimizde For...Next döngü komutlarını kullanarak 1'den 20'ye kadar olan sayıların toplamını bulabileceğimizi söylemiş ve değişken türlerini anlatmaya başlamıştım. Şimdi For-Next kalıbını kullanmayı anlatalım. Sürekli tekrarlanan işleri yapmakta kullanabileceğimiz güzel komutlarımızdandırlar.:

For X = 1 to 20
....
....
....
Next X

Şeklindeki klasik kullanımları meşhurdur. Bu örnekte X değeri 1'den başlayarak 20 ye kadar arttırılır ve her arttırma işlemi esnasında For ile Next arasında kalan komutlar (satırlar) çalıştırılır, uygulanır. Yani :

Dim X As Integer
For X = 1 to 20
Print X
Next X

Şeklindeki programımız ekrana 20 defa X değerini yazdırır. Çünkü 1.satırda önce X'e 1 değeri verilir. Ve 2.satıra geçilir. 2.satır X 'in değerini ekrana yaz komutunu içerdiği için ekrana X 'in değeri yazılır. 3.satırdaki Next komutu ise "X, 20'den küçük. X 'i 1 arttır ve tekrar 2.satıra git" manasına gelir. Bu sayede X bir arttırılır ve 2 değerini alır ve 2.satırda ekrana X'in değerini yazdır komutu olduğu için ekrana 2 yazılır. Bu sayede ekrana 1'den 20'ye kadar olan sayılar yazılır.


Resmi orijinal boyutlarında görmek için tıklayın.


Ama eğer programımızı şu şekilde yaparsak :

Dim X As Integer
For X = 1 to 20
Print "X"
Next X

Ekrana 20 tane X harfi alt alta yazılacaktır. Çünkü bir değişkeni tırnak içerisinde yazarsak, kendisini bir bütün olarak string yapmış oluruz. Ekrana 20 tane X yazdırmanın bir diğer yolu ise ;

Dim Y As String, X As Integer
Y = "X"
For X = 1 to 20
Print Y
Next X

Y string değişkenine "X" değerini veriyoruz ve ekrana 20 defa Y değişkenini yazdırıyoruz. Yani 20 defa "X" yazdırıyoruz. Son örnekte Print Y yazan yeri Print "Y" şeklinde yazarsak ekrana 20 tane Y harfi yazılır. Ama Print "online" yazarsak bu defa da ekrana 20 defa "online" yazılacaktır. (tırnak işaretsiz)

Gördüğünüz gibi For-Next döngü komutları arasında kalan satırlar sürekli işleme konuluyor. Kaç defa işleme konulması gerektiğini ise sayacımız ile belirliyoruz : 1 to 20 gibi.

For X = 3 to 20 şeklindeki bir kullanımda ise sayacımızı 3'ten başlatmış oluruz ve 1 arttırarak 20'ye varmasını söylemiş oluruz. Yukarıdaki örneklerde 1 to 20 yerine, 3 to 20 yazarsak, ekrana 20 defa yazılacak olan şey, ekrana 18 defa yazılır. Çünkü sayacımızı 3'ten başlattık.

Tekrar sorumuza dönelim : 1'den 20'ye kadar olan sayıların toplamını bulmak için bu komutları nasıl kullanırız ?

Dim X As Integer, Y As Integer
For X = 1 to 20
Y= Y + X
Next X
Msgbox Y

 

Değişkenler ve For-Next komutları

Bu programın sonrasında elde edeceğimiz X değeri 1'den 20'ye kadar olan sayıların toplamı olacaktır.

Öncelikle X ve Y değişkenlerini Dim komutu ile integer olarak tanımladık. Tanımlamamız sonrasında X nedir diye Visual Basic 'e soracak olursak bize 0 değerini verecektir. Y 'nin değeri nedir diye sorarsak da 0 (sıfır) cevabını alırız. Çünkü bir integer 'in tanımlama sonrası ilk değeri sıfırdır. Bir sonraki satırda ise X değişkenine sıra ile 1,2,3,4,...20 değerlerin verileceğini anlıyoruz ve bu değerlerin verilmesi esnasında For ile Next arasında kalan işlem yapılacak. Önce Y = Y + 1 işleme konulacak çünkü X ilk 1 değerini alacak. Ve Ynin ilk değeri 0 olduğu için, Y = Y +1 ile Y 'nin değerini 1 arttır komutunu vermiş olacağız. Daha sonra Next X satısı ile X değeri 1 arttırılacak ve For'dan sonraki satıra tekrar dönülecek. Yani X in değeri 2 yapılacak ve Y = Y + X tekrar uygulanacak. Y'mizin son değeri 1 idi. Y = Y + 2 yani Y sayısı 2 arttırılacak ve Y = 1 + 2 olacak. Bu döngü bu şekilde devam edip; X, 21 değerini alınca döngüden çıkılacak. En son satırdaki Msgbox Y ile ekrana Y'nin son değeri bir kutu içerisinde yazılacak ki bu yazılan değer 1'den 20'ye kadar olan sayıların toplamıdır.

Dikkat ederseniz değişkenleri tanımlarken Dim X, Y As Integer demedik. Çünkü böyle bir tanımlama ile X değişkenini Variant olarak, Y değişkenini ise Integer olarak tanımlarız. Her değişken için bir tanımlama belirtmeliyiz. Dim komutundan sonra değişkenin türü belirtilmezse Variant olacaktır.

Şimdi de 1 den 20'ye kadar olan sayıların çarpımını bulmak için For-Next döngü komutlarına baş vuralım.

Dim X As Integer, Y As Integer
For X = 1 to 20
Y = Y * X
Next X
Msgbox Y

Gördüğünüz gibi yukarıdaki örneğin aynısını yaptık. Toplama işareti yerine çarpma işareti koyduk. Fakat bu program sonucunda karşımıza 1'den 20'ye kadar olan sayıların çarpımı yerine sıfır (0) değeri çıkacaktır. Çünkü hatırlayacaksınız ki Dim komut satırlarından sonra X ve Y değişkenlerinin değeri 0 olacaktır ve Y = Y * X in sonucu her zaman 0 olacaktır. (çünkü 0 * X her zaman 0 olacaktır). Demek ki For komutundan önceki satırda Y 'nin ilk değerini 1 olarak belirlememiz gerekiyordu. Yani programımız şu şekilde olmalıydı :

Dim X As Integer, Y As Integer
Y = 1
For X = 1 to 20
Y = Y * X
Next X
Msgbox Y

Bu programın sonucunda ise 1'den 20'ye kadar olan sayıların çarpımını (yani 20!) elde ederiz. Eğer bizden 5'ten 20'ye kadar olan sayıların çarpımı isteseydiler, biz şu şekilde yazardık programımızı :

Dim X As Integer, Y As Integer
Y = 1
For X = 5 to 20
Y = Y * X
Next X
Msgbox Y

Peki diyeceksiniz ki biz X değerini hep birer birer arttırmak zorunda mıyız ? Cevap : Hayır
Çünkü For-Next döngü komutlarının bir diğer kullanımı da şu şekildedir :

For X = 1 to 20 Step 2

'For-Next arasında bir çok satır yer alabilir.
'Ve arasında yer alan satırlar biraz içeriden yazılarak, görünüm açısından iyi sonuçlar elde edilir.
'Biraz içerden yazılmazsa da program sorunsuz çalışacaktır.
'Ama birkaç sütun içeriden yazılarak daha sonra (ilerde) düzenlemeleri yapma işlemi kolaylaşır.

Next X

Yani For komutunun sonrasında X değişkenini kaçar kaçar arttıracağımızı Step anahtar kelimesini (keyword) kullanırız.

Dim X As Integer
For X = 1 to 5 Step 2
Print X
Print "dergi"
Next X

Şeklinde yazdığımız bir program ile ekrana şu gelecektir :

1
dergi
3
dergi
5
dergi

Çünkü 1'den 5e kadar ikişer ikişer X değişkenini arttırmasını söyledik. Ve her arttırma öncesinde ekrana X değişkenini ve hemen altına dergi yazmasını söyledik.
Demek ki 6'dan 20'ye kadar olan tek sayıların çarpımını bulmamız istenseydi, şu programı yazmamız yeterli olacaktı :
Dim X As Integer, Y As Integer
Y = 1
For X = 7 to 20 Step 2
Y = Y * X
Next X
Msgbox Y

Dikkatinizi çekerse X değişkenini 7 değerinden başlattık. Eğer 6 rakamından başlatsaydık; 6, 8, 10 diye 20'ye kadar farklı değerler alacaktı. Ama 7 değeri ile başlattık bu sayede 7, 9, 11 şeklinde 19'a kadar (19 dahil) farklı değerler alacaktı.

Step sözcüğünden sonra pozitif bir sayı yazdık. Ama negatif bir sayı yazıp, X değişkeninin ileriye doğru değil, geriye doğru farklı değerler almasını da sağlayabiliriz.

Dim X As Integer, Y As Integer
Y = 1
For X = 3 to 7 Step -2
Y = Y * X
Next X
Msgbox Y

Bu programı çalıştırdığımızda karşımıza sadece 1 rakamı görünecektir. Msgbox Y yazdık, ve Y' nin son değeri 1 olacaktır. Çünkü program For X... satırı ile X' e 3 değerini verecektir ve For-Next döngüsünden (içerisindeki satırları hiç işleme koymadan) çıkacaktır. Bunun sebebi 3 den 7 ye doğru -2 şeklinde ilerlemesinin mümkün olmayışıdır. Çünkü 3 rakamı 7 den zaten küçüktür. Programın başında da Y = 1 yazdığımızdan ,programın sonunda Y' nin değerini sorduğumuzda yine 1 değerini alıyoruz mesaj kutusu içerisinde. Ama programı şu şekilde yazmış olsaydık :

Dim X As Integer, Y As Integer
Y = 1
For X = 7 to 3 Step -2
Y = Y * X
Next X
Msgbox Y

Gördüğünüz gibi 7 ve 3 rakamlarının yerlerini değiştirdik. Bu sayede X önce 7 sonra 5 ve daha sonra 3 değerini alacaktır. Yani ikişer ikişer azalacaktır. Ve programın sonunda 7, 5 ve 3 rakamlarının çarpımı olan 105 sayısı mesaj kutusu içerisinde görülecektir.

Bir sonraki derste görüşmek üzere...

 

C Programlama Dili

 

C genel amaçlı bir programlama dilidir;esnek yapısı nedeniyle mikrodenetleyici programlamasından işletim sistemi yazımına kadar değişik boyuttaki uygulamalarda kullanılmaktadır.Basitliği,oluşan kodun küçüklüğü ve her çeşit programlamada kullanılabilmesi,C'yi populer bir dil yapmıştır.

C dili çok kestirme olması nedeni ile,yeni bilgisayara başlayanlar için öğrenmesi zordur.Bir programcı C dili ile üst seviyelerden alt ,assembly'ye yaklaşan alt seviyelere kadar programlama yapabilir.C dilinin yayılması, C dili kullanılarak yazılan UNIX işletim sisteminin tutulmasıyla başlamıştır;günümüzde UNIX dışındaki sistemlerde de C derleyicileri kullanılmaktadır.

 

C Programlama Dilinin Tarihçesi

 

C dili,Dennis Ritchie tarafından tasarlanmış ve 1972 yılında PDP-11 üzerinde gerçeklenmiştir.Tasarımı ,Martin Richards tarafından gerçekleştirilen BCPL dilinden esinlenerek oluşturulmuştur.BCPL dilinin C üzerine etkisi Ken Thompson tarafından yine BCPL dilinden esinlenerek geliştirilen 1970 tarihli B dili üzerinden olmuştur.BCPL ve B dilleri veri tipi olmayan dillerdir;desteklenen tek veri tipi makina dilidir.C dilinde ise birçok veri tipi vardır ve bunlar uygulamalara yeterli olmaktadır.

 

Standart C ve ANSI C

 

ANSI(American National Standarts Institute) 1983 yılında X3J11 adlı bir grup oluşturarak C dilinde standartlaşmaya ön ayak olmuştur.Bu grup,dilin genel yapısı,operatörler,veri tipleri,fonksiyonların tanımlanması,fonksiyonların bildirimi,yapısal veri tipleri gibi temel kurallar ve bir C derleyicisinde en azından olması gereken fonksiyonları,standart kütüphaneyi belirlemiştir(ANSI C standardı).Bu standart ile gelen en büyük değişiklik,fonksiyon bildiriminde ve yapısal tipte değişkenlerin birbirine doğrudan atanabilmesinde olmuştur.Standart kütüphane üzerine 3 grup çalışmaktadır.1. grup ANSI C'yi belirleyen X3J11 grubu;2.grup UNIX System V için standart belirleyen grup;3.grup ise IEEE'nin AT&T uyumlu olmayan bilgisayarlar için standart belirleyen ve POSIX olarak adlandırılan gruptur.

 

C Programlama Diline Giriş

 

main( )

{

Printf("Merhaba Bahadır");

}

main( ) ve Printf( ) birer fonksiyondur.main özel amaçlı bir fonksiyondur ve programın yürütülmesine bu fonksiyondan başlanır.Her C programında bir tane main( ) fonksiyonu bulunur.Printf( ) standart kütüphanede bulunan fonksiyondur.

C fonksiyonlarının genel yapısı aşağıdaki gibidir.

fonksiyon tipi fonksiyon adı argumanların tip bildirimi

{

yerel değişkenlerin bildirimi

fonksiyonun içindeki diğer fonksiyonlar

}

Daha iyi anlayabilmek için aşağıdaki örneği inceleyebiliriz.

float bol(a,b)

int a,b;

{

float d;

d=a/b;

return d;

}

Burada fonksiyonun adı bol(),tipi float,argümanları a ve b'dir.Tipi float olarak bildirilmiştir.int a,b kısmında da a ve b'nin integer değer yani tamsayı olduğu belirtilmiştir.d yerel değişkendir. a sayısı b'ye bölünüp d'ye atanmaktadır.

Bir başka örneğe bakalım.

main()

{

printf("Bu bir deneme yazısıdır .\n");

printf("Bu da başka bir");

printf("deneme yazısıdır.\n");

printf("Bahadır Şahin \n");

}

Bu örnekte de görüldüğü gibi printf() fonksiyonu ile ekrana bilgileri işledik. \n ile bir alt satıra geçişi sağladık.dikkat ederseniz 2. ve 3.komut satırı ekrana bitişik yazılacaktır.Bunun sebebi 2. komut satırında \n ifadesinin kullanılmamasıdır.Dolayısıyla bilgiler ekrana 3 satır şeklinde yazılacaktır.

Bir başka örnek probleme bakalım.

main()

{

int a;

a=5;/* a'nın değeri şimdi 5'tir.*/

printf("a'nın değeri şimdi %d\n",a);

a=12;

printf("a'nın değeri şimdi %d\n",a);

a=25

printf("a'nın değeri şimdi %d\n",a); /*Ekrana 25 yazıldı */;

}

Bu örnekte görüldüğü gibi int a yazılarak a sayısını tamsayı olarak tanımladık ve (-32768) ile 32767 arasında bir değer alabileceğini tanımladık.sonra a'ya 5 sayısını atadık.Burada /* */ arasında yazılanlar bilgi satırıdır.Sadece kullanıcıya bilgi vermek amacıyla yazılır.Kodla alakası yoktur.printf()fonksiyonuyla a tamsayısına verilen değeri ekrana yazdık. %d,decimal bir değeri ifade etmektedir.

While Döngüsü

 

C dilinde birçok döngü tipi kullanılmaktadır.Bunlardan biri olan While döngüsü,herhangi bir değer doğru olduğu sürece bir program parçasını sürekli tekrarlar.Bu değer yanlış ise while döngüsü sona erer ve program normal akışına devam eder.Aşağıdaki örneğe bir bakalım.

main() /*while döngüsü için güzel bir örnek*/

{

int a;

a=1;

while(a<15)

{

printf("a'nın değeri:%d'dir.",a);

a=a+1;

}

}

yukardaki örnektede görüldüğü gibi a isimli bir tamsayı tanımladık.sonra bu değişkeni 1 değerine atadık.while'den sonra açılan parantezde a değeri 15'e kadar while döngüsü geçerlidir.Dolayısıyla While döngüsünün içindeki printf'in içindeki değerler ekrana yazılır.Her seferinde a değeri birer artırıldığından dolayı bu değer geçildiğinde while döngüsünün işlevi biter bir sonraki fonksiyondan itibaren program akışına devam eder.Yani while döngüsünden çıkılmış olur.

Do-While Döngüsü

 

Do-While döngüsüde While döngüsü gibidir.Aşağıdaki örneği incelediğimizde daha iyi anlayabiliriz.

main() /*Do-While döngüsü ile ilgili örnek */

{

int x;

x=0;

do

{

printf("x'in değeri şimdi:%d oldu.\n",x);

x=x+1;

}while(x<10)

}

While döngüsünden farkı döngünün do komutu ile yapılması ve değerin kontrolünün fonksiyonun sonunda yapılmasıdır.Burada While döngüsüde olduğu gibi döngü içinde değer doğru olduğu sürece döngü tekrarlanır.Bu döngüde de olduğu gibi değişkenin değeri döngüde birer artırılıyor.eğer artırılmasaydı,döngüden çıkamazdık.Kontrol döngünün sonunda yapıldığından,küme işaretlerinin içindeki değer en az bir kere işlenir.

For Döngüsü

 

For döngüsüde While döngüsü gibidir.Aşağıdaki örneği inceleyelim.

main()/*for döngüsüne örnek */

{

int i;

for(i=0;i<10;i=i+1)

printf("i'nin değeri şimdi %d oldu.\n",i);

}

Bu örnekte görüldüğü gibi for döngüsünün içi 3 parçadan oluşmaktadır ve bu kısımlar ; ile birbirinden ayrılmaktadır.1.kısımda i değeri 0 değerine atanıyor.2.kısımda i değeri için 10 değerinden küçük olma şartı getiriliyor.3.kısımda ise i değeri 1'er artırılıyor.Bu değerleri sağlayan i değerleri için ekrana printf'in içindeki değerler yazılır.i'nin 10 ve daha büyük değerleri için for döngüsünün işlevi bitiyor.Bir sonraki fonksiyona geçiliyor.

IF Komutu

 

if komutunu aşağıdaki örneği inceleyerek anlamaya çalışalım.

main() /*if komutuna örnek */

{

int i;

for(i=0;i<5;i=i+1)

{

if(i= =3)

printf("i'nin değeri şimdi %d'dir.\n",i);

if(data<5)

printf("i'nin değeri %d.\n",i);

else

printf("i'nin değeri %d.Buda 4'den büyüktür.\n",i)

}

}

Burada i değişkeni tamsayıya atandı.for döngüsü ile i değeri 0'a atandı ve i<6 şartı getirilerek i değeri 1'er artırıldı.For döngüsünün altında açılan parantezde if komutu kullanılarak belirtilen değerler sağlandığında ekrana printf'in içindeki değerler yazılmış oldu. i değeri 5 ve yukarısı olduğunda else komutu kullanılarak en alttaki printf değeri ekrana yazılmış oldu.

IF-Then-Else

 

if(mantıksal ifade)

işlem_doğru

else

işlem_yanlış

Mantıksal ifademiz doğru ise işlem_doğru,yanlış ise else'den sonra işlem_yanlış yürütülür.else kısmı seçimlidir.Gerekmiyorsa kullanılmayabilir.

#include >stdio.h> /*Kullanılan işlevlerle ilgili başlık dosyası */

main()

{

int i;

scanf("%d",&i);

if(i==1)

printf("Sayı Tek.");

else

printf("Sayı Çift.");

}

Bu örnekte if-else'nin nasıl kullanıldığını gördük.Buradaki scanf fonksiyonu Klavyeden veri okumak için kullanılır.İlerideki konularda scanf fonksiyonuna daha ayrıntılı bir şekilde değineceğiz.

Break ve Continue

 

main()

{

int i;

for(i=5 ; i<10 ;i = i+1)

{

if(i= =5)

break;

printf("i'nin değeri şimdi %d\n",i);

}

for(i=5 ; i<10 ;i = i+1)

{

if(i= =5)

continue;

printf("i'nin değeri şimdi %d\n",i);

}

}

Bu programda görüldüğü gibi ,i değeri 5'e eşit ise,break komutunu çağıran bir program.Break komutu bizi döngüden çıkarıp döngünün hemen altındaki satırdan devam etmemizi sağlar.Continue komutunda ise;değer 5'e ulaştığında program döngüden çıkmaz ama program,döngünün en son satırına atlayıp,aradaki printf satırını işlemez.

Goto Komutu

 

main( )

{

goto bahadir

printf("Bu satır ekrana yazılmayacak.");

bahadir :

}

Goto komutu ile birlikte gidilmek istenilen yerin ismi yazıldığında örnekteki bahadir gibi.Direk o fonksiyona gidilmiş olur.Yalnız unutulmaması gereken bir husus Goto komutu ile bir döngünün içine girişe izin yoktur,fakat bir döngüden bu komutla çıkılabilir.

Switch

 

Switch komutunu aşağıdaki örneği inceleyerek anlamaya çalışalım.

main( )

{

int i;

for(i=1;i<3 ;i=i+1)

{

switch(i)

{

case1 :printf("i'nin değeri Şimdi bir.\n");

break;

case2 :printf("i'nin değeri Şimdi bir.\n");

break;

case3 :printf("i'nin değeri Şimdi bir.\n");

break;

default:printf(" i'nin değer aralığı dışındaki bir değer.\n");

break;

}

}

}

Örnek'te görüldüğü gibi switch komutu ile başlanır arkasından parantez açılır ve burada case komutları kullanılır.break komutu ile switch'in içinde yer alan diğer komutlar işlenmeden ,switch'den çıkılmasını sağlar.default komutu ise;şayet değere karşı gelen case komutu yoksa kullanılır.

Veri Tipleri

 

int Tip

 

integer = Tamsayı

(-32768) ile 32767 arasında değer alabilir.

Float

 

Kayar noktada denilen bu veri tipinin değer aralığı 10e-38'den 10e+38'e kadardır.

Örnek:float a;

Char Tip

 

Alfanümerik karakterler içerir.

Bir karakter içeren 1 Byte'lık veri tipidir.Örnek: 5,*,A

Sabitler(Const)

 

Değeri program çalıştığı müddetçe aynıdır.Tip belirtilmez ise tamsayı kabul edilir.

const tip belirleyici = değeri

Örnek:const float PI=3.14;

Değişkenler

 

Değeri program boyunca değişebilir.

Tip belirleyici [Belirleyici];

Örnek: int a ;

Belirleyiciler(İdentifier)

 

Bileşenlere isim verme.(Sabit,değişken,altprogram,etiket).

Dikkat edilmesi gereken hususlar şunlardır:

İlk karakter rakam olamaz.Sadece harfler,rakamlar ve _ karakterinin bileşiminden oluşabilir.En fazla 31 karakterden oluşabilir.Küçük,Büyük harf ayrımı vardır.C diline saklı (reserved) sözcükler kullanılamaz.

Matematiksel İfadeler

 

Programlama dillerinde kullanılan matematiksel işlemler ve anlamları aşağıdadır.

+ , - , * , / : toplama , çıkarma , çarpma , bölme

% tamsayı bölme sonucunda kalanı verir.

Matematiksel ifadeler hesaplanırken dikkat edilmesi gereken hususlar şunlardır:

1-Önce parantez içindeki ifadeler hesaplanır.İçiçe parantezlerde içteki parantezden itibaren hesaplanır.

2-İlk önce çarpma, bölme,% işlemleri daha sonra toplama ve çıkarma işlemleri yapılır.

3-Öncelik sırası aynı olan işlemlerde hesaplama soldan sağa doğru yapılır.

Örnek:(4/2)*4=8

Atama (Assignment)

 

Bir değişken ifadeye bir değer(sabit,değişken,ifade) vermektir

Değişken Adı = değer;

Örnek1: i = 15 ;

Örnek2: i = i + 1 ;

 

Veri tiplerini aşağıdaki ifadelere bakarak tekrarlarsak:

int : tamsayı tipi.(-32768) ile 32767 arasında değer alır.

long int : uzun tamsayı tipi.4 Byte'lık işaretli tamsayı tipidir. (-2147483647) ile (2147483647) arasında değer alır.

short int : kısa tamsayı tipi.1 Byte'lık işaretli tamsayı tipidir.(-128) ile 127 arasında değer alabilir.

unsigned int : işaretsiz tamsayı

char : karakter tipi.Bir karakter içeren 1 Byte'lık veri tipidir.

float : kayar nokta tipi.

double : çift hassasiyet kayar nokta

 

%d : desimal.

%o : oktal.

%x : heksadesimal.

%Id : uzun desimal.

%u : işaretsiz.

%c : karakter.

%d : kayar nokta.

%5d : 5 uzunlukta bir alan kullan.

%-5d : sola dayalı 5'lik saha.

%12f : 12'lik bir alan kullan.

%12.3f : noktadan sonra 3 hane kullan.

%-5.4f : sola dayalı 4 hane.

Printf Fonksiyonu

 

Program içindeki istenilen değerleri çıktı birimlerine göndermek için kullanılır.Yani değerleri ekrana yazdırır.Kullanım biçimi aşağıdaki gibidir.

printf (kontrol , (parametreler ) )

Kontrol metini iki kısımdan oluşur:

Sıradan Karakterler : Doğrudan yazılırlar.

Dönüşüm / Biçim belirleyici karakterler : Değerlerin nasıl yazılacağını belirler.

Printf fonksiyonunda kullanılan karakterler şunlardır.

d : desimal

o : oktal

x : heksadesimal

u : unsigned ( işaretsiz sayılar )

c : karakter

s : string ( karakter katarı )

f : float ( kayar nokta )

Ld : long integer

Lu : unsigned long integer

Le,Lf : long double

Program Parçası

Ekranda Görülen Değer

i=12;

 

printf("%d",i);

i=12

printf("%d\n",i);

i=12 ekrana yazılır aşağı satıra geçilir.

 

Biçimli Yazdırma:

- : sola dayalı yazdırma.

m : yazılacak değer için ayrılan alan.

n : değerin kaç karakteri yazılacağını belirleme.

Scanf Fonksiyonu

 

Klavyeden veri okumak için kullanılır.Yapı olarak Printf ile hemen hemen aynıdır.Kullanım biçimi:

scanf(kontrol, ( değişkenler ) ) ;

Girilen karakterler ( kontrol ) metininde belirtilen biçimlere göre değişkenlere aktarılır.Değişkenler işaretçi tipinde olmalıdır.Parametre olarak değişkenin adresi gönderilmelidir.

scanf( "%d",&a ); Klavyeden tamsayı okunur ve Girilen değer a değişkenine aktarılır.

scanf( "%d%d",&a,&b ); Klavyeden girilen ilk değer a değişkenine, ikinci değer b değişkenine aktarılır.

scanf( "%f%d",&a,&b ); Klavyeden ilk değer gerçel , ikinci değer tamsayı olmak üzere iki değer okunur.

Aşağıdaki örneği inceleyelim.

main( )

{

float vize,final,ortalama ;

printf("Vize notunu giriniz\n");

scanf("%f",&vize);

printf("Final notunu giriniz\n");

scanf("%f",&final);

ortalama = vize * 0.4 + final * 0.6 ;

printf("Not Ortalaması:\n",ortalama);

}

Mantıksal İfadeler

 

İlişkisel Operatörler:İki değer arasındaki ilişkiyi gösterir.

> Büyük anlamındadır.

>= Büyük eşit anlamındadır.

= = Eşit.

< Küçük anlamındadır.

<= Küçük eşit

!= Eşit değil.

Mantıksal Operatörler:İki mantıksal ifade arasındaki ilişkiyi gösterir.

! DEĞİL ( NOT )

&& VE ( AND )

|| VEYA ( OR )

Örnek1: (X > 0 ) && ( X > Z )

Örnek2:( X > 0 ) || ( Z > 0 )

Örnek1:Klavyeden girilen karakterin rakam olduğunun tespit eden program.

main ( )

{

char c;

c=getch( );

if ( ( c > = '0' )&& ( c < = ' 9 ' )

printf("Rakam Girdiniz.");

}

Örnek2:Girilen 3 sayıdan küçüğünün bulunması.

main( )

{

float x,y,z,kücük;

printf("Girilen 3 sayıdan küçüğünü bulan program.\n");

scanf( "%d%d%d",&x,&y,&z);

kücük=x;

if( kücük > y )

kücük = y ;

if ( kücük > z )

kücük = z ;

printf("Girilen 3 sayıdan en küçük olanı %f\n",kücük);

}

İşlevler

 

Belli bir işi gerçekleştiren program deyimlerinin karmaşık programları düzenlemek ve basitleştirmek için programın bir birimi olarak gruplandırılması.

Örnek1:Bir Tamsayının faktoriyelini hesaplayan program.

main( )

{

int i;

printf("Bir Rakam Giriniz.\n");scanf("%d",&i);

printf("%d\n",fakt(i));

}

long fakt (int n)

{

int j;

long f = 1;

for ( j=2 ; j < = n ; j = j + 1 )

f = f * j ;

return f;

}

İşlevi Tanımlama biçimi

dönüş_tipi işlev_adı(parametreler)

{

yerel tanımlamalar

deyimler

}

dönüş_tipi:Eğer işlev bir değer geri gönderecek ise değerin tipini belirtir.Belirtilmez ise Int kabul edilir.Eğer işlev değer göndermeyecekse dönüş_tipi yerine void yazılır.

işlev_adı:İşlev çağrılırken kullanılacak addır.(belirleyici)

Parametreler:İşlev için gereken değerleri içerir.Her parametre değişken tanımlar gibi tanımlanır.Herbirinin arasında ',' kullanmak gerekir.

Yerel Tanımlamalar:Bu işleve özgüdeğişken,sabit tanımlamalar.

Eğer işlev bir değer gönderecek ise bu return deyimi ile yapılır.

return değer;

İşlevin Prototipi

Tanımlanan bir işlevin ana modül içerisinde prototipinin yazılması gerekir.Prototip ile işlevin dönüş değeri ve aldığı parametrelerin tiplerini tanımlanır.Bu bilgiye göre C derleyicisi işlev çağrıldığında değerlerin uygun olduğunu sınar.float al(int) al işlevi float değeri alır ve sonra int değeri üretir.

Örnek:Üst almayı gerçekleştiren işlev

Girdi:taban üs ve değeri

Çıktı:tabanın üs kuvveti

float us( float y,int z)

{

int i;

float x ;

r = 1;

for( i = 1 ; i < = z ; i++)

x = x * y;

return x;

}

Genel Değişken (Global):Her yerde (main ve diğer işlevler ) geçerlidir, değerine erişebilir.Programın en başında main işlevinin dışında tanımlanır.

Yerel Değişken (Local) :Sadece tanımlandığı modülde geçerlidir,değerine erişebilir.Modül içinde tanımlanır.

int x ; /* Tüm işlev değerine erişebilir,değeri değiştirilebilir (global) */

main ( )

{

int y ; /* Sadece main işlevi içerisinden erişebilir ( local ) */

}

Otomatik Değişkenler

 

Otomatik değişkenler igerektiğinde oluşturulurlar, ve işleri bitince de silinirler.Hatırlanması gereken bir nokta da, bir fonksiyon birden fazla kere çağrıldığında ,otomatik değişkenlerin eski değerleri saklanmaz,yeni baştan değer atanması gerekir.

Statik Değişkenler

 

Bir başka değişken tipi ise,statik değişkenlerdir.Değişken tanımlanırken başına "static" sözcüğü koyarak ,değişkenler tekrar tekrar çağrıldığında eski değerlerini muhafaza ederler.

Register Değişkenler

 

Bir bilgisayar bilgiyi hafızada veya registerlerde tutabilir.Register alanına erişim hafızaya erişimden çok daha hızlıdır, fakat programcının kullanabileceği az sayıda register vardır.Bazı değişkenleri çok kullanıldığı düşünülüyorsa bu değişkenleri register olarak tanımlayabiliriz.Register değişkenleri,sadece tamsayı ve karakter tipi değişkenlere kullanılabilir.Seçilen derleyiciye göre ,unsigned,long,short tipleride register olabilir.

Özyineleme ( Recursive ) İşlevler

 

Kendini çağıran fonksiyonlardır.

Örnek:sayının 9'un katı olup olmadığını basamak toplamından bulan program.

int kati9(long s)

{

int t ;

if ( s < 10)

return (s = = 9 );

else {

t = 0 ;

while ( s > 0 ) {

t = t + s % 10 ;

s = s / 10 ;

}

s = kati9( s )

}

}

Kelime Katarı ( String )

 

Bir katar,genellikle harflerden oluşan karakterler dizisidir.Çıktının güzel ve manalı görünmesi için, içinde isimler ve adresler olabilmesi için programların katarlar kullanması şarttır.C dilinde tanımı; Char tipi bilgilerin NULL karakter ile sonlandırılmasıdır.C bir katarı karşılaştıracağı,koplayacağı veya ekrana yazacağı zaman bunları gerçekleştiren fonksiyonlar ,NULL değeri görünene kadar bu işlemi yapmak üzere programlanmışlardır.

Diziler ( Array )

 

Dizi,aynı tip verilerin birbiri arkasına tanımlanmasıdır.Kelime katarı,bir cins dizidir.

Tip_Adı değişken [boyut];

Örnek1: int a[25] ;Burada a değişkeni 25 tamsayı değerini sakladığı değeri gösterir.Bu 25 veriye a değişkeni ile erişilir.

Örnek2:

main( )

{

char isim[7];

isim[0]='b';

isim[1]='a';

isim[2]='h';

isim[3]='a';

isim[4]='d';

isim[5]='ı';

isim[6]='r';

printf("isim %s'dir.\n",isim);

printf("içinden bir karakter:%c\n",isim[2]);

printf("ismin bir parçası: %s'\n",&isim[3]);

}

Örnek3:1-10 arasındaki sayıların karesinin dizi elamanlarına yazılması.

main( )

{

int a[10] ;

int i ;

for ( i = 0 ; i < = 9 ; i++ )

a[i] = ( i + 1 ) * ( i + 1 ) ;

for (i = 0 ; i < = 9 ; i++)

printf( " %d.elemanın değeri = %d \n" , i , a[i] ) ;

}

Dizilerde Sıralama

 

Dizi elemanları küçükten büyüğe veya büyükten küçüğe doğru dizilmesi işlemi.Bir çok yöntem vardır.Bunlardan birkaçı aşağıdadır.

Selection Sort ( Seçim ):Dizinin en küçük elemanı bulunur ve 1. elemanla yer değiştirilir.Bu işlem ( n-1 ). elemana kadar tekrar edilir.

Buble Short :Bu yöntemde ardışıl iki eleman karşılaştırılır.Eğer önceki eleman sonrakinden büyük ise elemanlar yer değiştirilir.Bu şekilde dizi taranır.

Çok Boyutlu Diziler

 

Çok boyutlu bilgileri veya veri tablolarını saklamak için kullanılır.İki boyutlu diziler daha çok kullanılır.Tanımlama biçimi aşağıdaki gibidir.

Tip Değişken_Adı[indis1][indis2][indisn];

Örnek1: int a[2][6];

Dizilerin Bellekte Saklanma Biçimi:Erişimin kolay olması için dizinin tüm elemanları peşpeşe saklanır.Burada önce satırlar , sonra sütunlar saklanır.

Örnek2:Çoklu dizilere örnek program.

main( )

{

int i,j ;

int buyuk[8][8],dev[25][12];

for( i = 0 ; i < 8 ; i++ )

for( j = 0 ; j < 8 ; j++ )

buyuk[i][j] = i * j ;

for( i = 0 ; i < 25 ; i++ )

for( j = 0 ; j < 12 ; j++ )

dev[i][j] = i + j ;

buyuk[2][6]= dev[24][10]* 22;

buyuk[2][2][buyuk[2][2]] = 177 ;

for( i = 0 ; i < 8 ; i++ )

{

for( j = 0 ; j < 8 ; j++ )

printf( " %5d \n " , buyuk[i][j] ) ;

}

}

İki Dizginin Karşılaştırılması

 

C'de diziler doğrudan karşılaştırılamazlar.Herbir eleman ayrı ayrı karşılaştırılmalıdır.Karşılaştırma amacıyla strcmp(dizgi1,dizgi2) işlevi kullanılır.

Örnek:İki dizinin karşılaştırılması.

main ( )

{

char *x ="abc",*y ="aba";

int i ;

i=strcmp(x,y) ;

if( i > 0 )

printf(" x değeri büyük \n " ) ;

else if( i < 0 )

printf( " y değeri büyük \n " ) ;

else

printf( " iki değer eşit \n " ) ;

}

İki Dizginin Toplama ( Ekleme )

 

Dizgilerde en çok kullanılan işlev strcat( hedef,kaynak )'tir.kaynak dizgisini hedef dizgisine ekler.Hedef dizgisinde kaynak dizgisini içerecek kadar yer olması gerekir.

Örnek:İki dizgiyi toplama ile ilgili program.

#include >string.h>

main( )

{

char x="abc",y="def";

int i;

strcat(x,y);

printf("%s\n",x);

}

atoi,atof,atol işlevlerini gerçekleştirme

 

Bir programın akışı boyunca bazı veri tiplerinin değiştirlmesi gerekebilir.Bu değişim genellikle ya string tipindeki bir değişkenin sayısal tipe dönüştürülmesi yada tersi biçimindedir.

Örnek:string bir değişkeni tamsayıya çeviren program.

#include >stdlib.h>

#include >string.h>

int deger ( char *);

main ( )

{

char *c ;

int i ;

c = " 12bah " ;

i=deger( c ) ;

printf( " %s dizi katarının sayısal karşılığı %d\n ",c,i ) ;

}

int deger( char *s ) ;

{

int i ,j ;

int x ;

x = 0 ;

for( i = 0 ; i < strlen(s) ;i++ ){

j = s[j] - '0' ;

x = x * 10 + j ;

}

return x ;}

Pointer

 

Basit bir şekilde izah edersek pointer,bir adrestir.Bir değişken olmak yerine,bir değişkenin hafızadaki adresini taşıyan bir ok işaretidir.

Örnek:Pointer kullanıma ait örnek program.

main ( )

{

int index , *pt1 , *pt2 ;

index = 20 ;

pt1 = &index ;

pt2 = pt1 ;

printf(" Değer şimdi %d%d%d'dir.\n ",index,*pt1,*pt2 ) ;

*pt1=11;

printf(" Değiştikten sonra ise %d%d%d'dir.\n",index,*pt1,*pt2 ) ;

}

Not1:Önüne ampersand işareti konulmuş bir değişken, odeğişkenin adresini belirtir.Yani 6.satır şöyle okunabilir."

Not2:Önüne yıldız konmuş bir pointer ,kendisinin tuttuğu adreste bulunan değeri gösterir.

Pointer ve Aritmetik

 

Her çeşit işlemler,pointerlerle mümkün değildir.Pointer bir adres olduğundan,ona sabit bir rakam ekleyip ilerideki bir adrese erişmek mümkündür.Aynı şekilde pointer'den bir rakam çıkartıp daha önceki hafıza bölgelerine erişmek mümkündür.İki pointer'ı toplamak mantıklı değildir.Çünkü Bilgisayarlardaki adresler sabit değildir.

 

VİSUAL BASİC 6,00 YENİ BAŞLAYANLAR İÇİN UYGULAMALI DERSLER

PROJE 1 BEEP İF-THEN UYGULAMASI

        Kullanıcıdan 1 ile 3 arasında bir değer girmesini isteyen bir program değer doğru ise
Uyarı mesajı vererek kullanıcıyı bilgilendiren bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub
Form_Click ()
Dim
CEVAP, Msg ' tanımlama.
Do

CEVAP = InputBox("1 İLE 3 ARASI BİR SAYI GİRİNİZ.")
If
CEVAP >= 1 And CEVAP <= 3 Then ' Alan Kontrolü.
Exit Do
' Exit Do...Loop.
Else
Beep
' Beep sesi veriliyor.
End if
Loop
MsgBox
"Girmiş olduğunuz sayı alan içerisinde."
End Sub

6- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın


PROJE 2 ATN (KARAKÖK)

        Girilen değerin ATN sini alan bir proje

Projeyi İndir                                                      

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Form1.Caption = "ATN UYGULAMASI"
Dim
msg, Pi ' Tanımlama.
Pi = 4 * Atn(1) ' Pi hesaplanıyor.
msg = "Pi Sayısı = " & Pi
MsgBox
msg, 48, "ATN UYGULAMASI": 'Sonuç Görüntüleniyor
End Sub



6- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın


PROJE 3 KARE KÖK

       Girilen değerin karekökünü alan bir proje

Projeyi İndir                                                      

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Function KAREKOK (X As Double) As Double
Select
Case Sgn(X) ' X’e SGN fonksiyonu uygulanıyor.
Case
1 ' Eğer PozitIf Sayı ise .
KAREKOK = Sqr(X)
Exit Function ‘ Fonsiyondan Çıkılıyor.
Case
0 ' 0 girildiğinde.
KAREKOK = 0
Case
-1 ' NegatIf Sayı.
KAREKOK = -1
End
Select
End
Function

'*****************************

Sub Form_Click ()
Dim
Msg, KAREKOK_N ' Tanımlama.
Dim N As Double
N = InputBox("Lütfen Karekökü Hesaplanacak Sayıyı Giriniz. ")
Msg = N & " Sayısının Karekökü "
KAREKOK_N = KAREKOK(N) ' Fonksiyon Çağrılıyor.
Select
Case KAREKOK_N
Case
0: Msg = Msg & " 0."
Case
-1: Msg = Msg & " NegatIf Sayı."
Case
Else: Msg = Msg & " : " & KAREKOK_N
End
Select
MsgBox
Msg ' Mesaj görüntüleniyor.
End Sub



3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın


PROJE 4 Alan HESABI

        Alınan uzunluk ve genişliğe göre alan hesaplayan bir proje

Projeyi İndir                                                      

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub ALANHES (Uzunluk, Genislik) ' İki alt Eleman
Dim
Alan ' tanımlama
Alan = Uzunluk * Genislik ' Diktörtgeninin Alanı hesaplanıyor.
MsgBox
"Toplam Alan : " & Alan, 48, "ALAN HESAPLANIYOR"' Sonuç Görüntüleniyor.
End Sub

Sub Form_Click ()
Dim
A, B ' Declare local variables.
A = InputBox("Uzunluk Ne Kadar?") ' Uzunluk.
B = InputBox("Genişlik Ne Kadar?") ' Genişlik
ALANHES A, B ' Sub .
End Sub


3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın


PROJE 5 BEEP UYGULAMASI

        Windows Procedure lerini çağıran  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Declare Sub MessageBeep Lib "User" (ByVal N As Integer)
Sub
Form_Click ()
Dim
I ' Tanımlama
Call MessageBeep(0) ' WinDows Prosedürü çağrılıyor.
For I = 1 To 100: Next I '
MessageBeep 0 '
End Sub

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 6 ÇALIŞMA DİZİNİNİ BULMA 

        Programın çalışma dizinini bulup değiştiren   bir proje.

Projeyi İndir                                                     

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim
CEVAP, Msg, NL ' Tanımlama.
NL = Chr(10) ' Yani Bir Satır.
CurPath = CurDir      ' Şu anda Bulunulan Programın Yolu.
ChDir "\"

Msg = "MEVCUT DİZİN YANDAKİ ŞEKİLDE DEĞİŞTİRİLDİ "
Msg = Msg & CurDir & NL & "TAMAM BUTONUNA TIKLADIĞINIZDA ESKİ HALİNE GETİRİLECEKTİR. "
CEVAP = MsgBox(Msg) '
ChDir CurPath '
Msg = "DİZİN TEKRAR DEĞİŞTİRİLDİ " & CurPath & "."
MsgBox
Msg ' Sonuç Görüntüleniyor
End Sub


3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 7 BUTTON  UYGULAMASI

        K  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Load()
Form1.caption=”CHOOSE & OPTION BUTTON UYGULAMASI”
opt(0).Caption = "Shipper 1"
Load opt(1)
opt(1).Caption = "Shipper 2"
opt(1).Top = opt(0).Top + opt(1).Height * 1.5
opt(1).Visible = True
Load opt(2)
opt(2).Caption = "Shipper 3"
opt(2).Top = opt(1).Top + opt(1).Height * 1.5
Load opt(3)
opt(3).Caption = "Shipper 4"
opt(3).Top = opt(2).Top + opt(1).Height * 1.5
opt(3).Visible = True
opt(2).Visible = True
opt(0).Value = True
End Sub


Sub
Opt_Click (Index As Integer)
Label1.Caption = "Shipper: " & Choose(Index, "Speedy", "United", "Federal")
End Sub


6- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın


PROJE 8 CHR UYGULAMASI

        CHR ve diğer Hazır functionların kullanımını anlatan  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub
Form_Click ()
Form1.Caption = "Chr Fonksiyonu"
Dim
I, J, Msg, Bosluk ' Tanımlama
Bosluk = Chr(10) ' Yeni bir Satır
For I = 1 To 2 ' İki Kere işletir.
For J = Asc("A") To Asc("Z") ' A dan Z ye sıralama
Msg = Msg & Chr(J) ' Bir Karakter Oluşturma.
Next J
Msg = Msg & Bosluk
Next I
MsgBox
Msg, 48, " CHR Fonksiyonu" ' Sonuç Görüntülenir"
End Sub

6- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın


PROJE 9  ŞİFRE DOĞRULAMA UYGULAMASI

       Timer nesnesi if ve for deyimlerinin kullanıldığı  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Formunuza 1 tane Text kutusu Birtane Button ve 1 tane timer nesnesi koyun ve nesne adla
rını değiştirmeyin
3- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Timer1_Timer ()
MsgBox
"Zamanınız Doldu!", 40, "Sayın Kullanıcı"
End
End Sub

Sub Command1_Click ()
If
text1.Text = "VOLKAN" Then
TIMER1.Enabled = False
MsgBox "PROGRAMA HOŞ GELDİNİZ", 48, "SAYIN KULLANICI"
End
Else
MsgBox
"ŞİFRE KABUL EDİLMEDİ"
End if
End Sub


4- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın








PROJE 10 DAİRE ÇİZİMİ UYGULAMASI

        Daire çizimini anlatan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim
CX, CY, Eksen ' Tanımlama.
ScaleMode = 3 ' Scale Modu seçimi.
CX = ScaleWidth / 2 ' X pozisyonu.
CY = ScaleHeight / 2 ' Y pozisyonu
If
CX > CY Then Limit = CY Else Limit = CX
For Eksen = 0 To Limit ' Eksen.
Circle (CX, CY), Eksen, RGB(Rnd * 255, Rnd * 255, Rnd * 255)
Next Eksen
End Sub


3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 11 LİSTE KUTUCUKLARI  UYGULAMASI

        Liste kutularına eleman ekleme, eleman silme,eleman sayısını öğrenme gibi işlemlerin yapıldığı  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Projenize 1 adet list kutusu ekleyin ve nesne adını değiştirmeyin
3- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim
Giriş, I, Msg ' Tanımlama
Msg = "Tamam Butonunu tıklayın Listeye 50 adet veri aktarılacaktır."
MsgBox
Msg ' Mesaj Görüntüleniyor.
For I = 1 To 50 ' I için 50 değeri
Giriş = I & " Elma" ' Giriş Oluşturuluyor
List1.AddItem Giriş ' Giriş Listeye Aktarılıyor.
Next I
Msg = "Tamam Butonunu tıklayın Listede Tek Sayılar görüntülenecektir."
MsgBox
Msg ' Mesaj Görüntüleniyor.
For I = 1 To 25 ' I ya yeni Değer atanıyor
List1.RemoveItem I ' İlk atama Kaldırılıyor
Next I
Msg = "Tamam Butonunu tıklayın Liste Temizlenecektir."
MsgBox
Msg ' Mesaj Görüntüleniyor
List1.Clear ' Liste Temizleniyor.
End Sub


6- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE  12 CLIPBOARD UYGULAMASI

        D anlatan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub
Form_Click ()
Const CF_BITMAP = 2 ' BMP Formatı tanıtım sabiti.
Dim
Msg ' tanımlama.
On Error Resume Next
' Hata durumunda.
Msg = "Tamam Butonuna tıklayın Resim Panaoya Aktarılacaktır."
MsgBox
Msg, 48, "Clipboard Uygulamaları"' Mesaj Görüntüleniyor.
Clipboard.Clear ' Pano Temizleniyor.
Clipboard.SetData LoadPicture("c:\win95\kur.bmp") ' Resim Yükleniyor
If
Err Then
Msg = "Resim Bulunamadı"
MsgBox
Msg, 27, "Clipboard Uygulamaları"' Hata Mesajının Görüntülenmesi
Exit Sub
End if

Msg = "Resim Şimdi Panoda Tamam Butonuna basınız,Resim Formunuza Aktarılacaktır."
MsgBox
Msg, 48, "Clipboard Uygulamaları"' Mesaj Görüntüleniyor.
Picture = Clipboard.GetData() ' Resim Panodan Alınıyor.
Msg = "Tamam Butonuna Tıklayın, Resim Temizlenecektir."
MsgBox
Msg, 48, "Clipboard Uygulamaları"' Mesaj Görüntüleniyor.
Picture = LoadPicture() ' Resim Temizleniyor.
End Sub


3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 13 CLS FORM TEMİZLEME UYGULAMASI

        Form üzerine yazılan yazıları temizleyen  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim
MSG ' Tanımlama
MSG = "ANKARA"
Print
MSG ' Mesaj Forma Yazılıyor.
MsgBox
"Tamam Butonunu Tıklayın Form Temizlenecektir.", 27, "CLS Uygulaması"' Mesaj Görüntüleniyor.
Cls ' Form Temizleniyor.
End Sub


3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 14 CONST (SABİT DEĞERLER) UYGULAMASI

        Proje dahilinde değeri değişmeyen sabitleri anlatan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Const PI = 3.141592654 ' Sabit
Dim
Alan, Çevre, Msg, Yarıçap ' Tanımlama.
Msg = "Dairenin Yarıçapını giriniz(cm)"
Yarıçap = InputBox(Msg) ' Yarıçap Giriliyor.
Çevre = 2 * PI * Yarıçap ' Çevre Hesaplanıyor.
Alan = PI * (Yarıçap ^ 2) 'Alan Hesaplanıyor
Msg = "Dairenin Çevresi "
Msg = Msg & Çevre & " cm. Alan= "
Msg = Msg & Alan & " cm."
MsgBox
Msg ' Sonuç Görüntüleniyor.
End Sub
3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 15  VERİTABANI OLUŞTURMA UYGULAMASI

        Harddiskinize Deneme.Mdb adında boş bir veritabanı oluşturan  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Fromunuza  1 tane Button yerleştirip adını değiştirmeyin.
3- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Private Sub Command1_Click()
Dim DB As Database
' Bu set DATACONS.TXT adlı Dosyadan alınmaktadır.
Set DB = CreateDatabase("C:\Deneme.MDB", dbLangGeneral, dbEncrypt)
'Bu Örnekle C:\Dizininde Deneme.MDB adında Access 1.0 versiyon bir veritabanı Dosyası oluşturulmaktadır.
End Sub

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 17 ÇALIŞMA DİZİNİNİ BULMA UYGULAMASI

        Projenizin çalıştığı aktif dizini bulan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim
Msg, NL ' Tanımlama.
NL = Chr(10) 'Yeni bir satır
Msg = "Şu an İçinde Bulunduğunuz Dizin: "
Msg = Msg & NL & CurDir ' Bulunulan Dizin.
MsgBox
Msg, 54, "Curdir uygulaması"' Sonuç Görüntüleniyor.
End Sub

'Bu örnekle Mevcut Dizin Görüntülenir.

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 18 TARİH FORMATI DEĞİŞTİRME UYGULAMASI

        Girilen tarih formatını variant türe değiştiren bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim BirthDate, Msg, TestDate ' Tanımlama
Msg = "Doğum Tarihinizi Yukarıda belirtilen Formatta Giriniz"
Do
TestDate = InputBox(Msg, "1 JUNE 1964") ' Kullanıcı Tarihi giriyor.
Loop Until IsDate(TestDate) ' Tarih uygun Formatta mı?.
BirthDate = CVDate(TestDate) ' Tarih Variant Karaktere çevriliyor.
Msg = "Doğum Tarihinizin Çevirimli Hali " & BirthDate
MsgBox Msg ' Sonuç Görüntüleniyor.
End Sub

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 19 PARASAL DEĞERE ÇEVİRME UYGULAMASI

        Proje dahilinde girilen değeri windows' un para birimine çeviren bir program parçası.

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim
Rakam, Msg, Parasal ' Tanımlama.
Rakam = InputBox("Parasal Değere çevirmek istediğiniz rakam", "CCUR") ' Kullanıcı Girişi.
Parasal = CCur(Rakam) ' Çevrim.
Msg = " Girdiğiniz Rakamın Parasal Formatı: " & Format(Parasal,"Currency")
MsgBox Msg ' Sonuç.
End Sub

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 20 SAYISAL DEĞERİ STRİNGE ÇEVİREN UYGULAMASI

        Program içerisinde girilen sayısal bir değeri string değere çevirip 000 ekleyen bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim Msg, Satış, Toplam ' 
Tanımlama.Satış = InputBox("Satışınız Kaç Birim (1000)?")
Toplam = CVar(Satış & "000")
Msg = "Satışınız " & Format(Toplam, "###,###") & " birim."
MsgBox Msg ' Sonuç.
End Sub

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın



PROJE 21 TARİH  UYGULAMASI

     Text kutusuna girilen tarih ile bugünün tarihi arasında kaç gün fark kaldığını bulan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2-Fromunuza 1 tane Button 1 tane Label 1 tane text kutusu koyup nesne adlarını değiştirmeyin
3- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Command1_Click ()
Label1.Caption = "Tarih Bugünden: " & DateDIff("d", Now, Text1.Text)
End Sub

3- Projenizi Kaydedip Çalıştırın. Button1 üzerine fare ile çift tıklayın

PROJE 22 TARİH SAAT   UYGULAMASI

     Proje çalıştırılınca günün tarihini ve saatini ekrana yazan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
3- Projenize 4 adet label nesnesi yerleştiriniz. Aşağıdaki şekil gibi label3 ve label 4 nesnelerinin caption özelliklerini değiştiriniz.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Load()

label1.Caption = Date

Label2.Caption = Time

End Sub

 

3- Projenizi Kaydedip Çalıştırın.


PROJE 23  SAAT   UYGULAMASI

     Ekrana Şu anki saati sürekli olarak yazan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2-Projenize 2 adet Label ve 1 adet timer nesnesi yerleştiriniz.
3- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Load()
timer1.Interval = 1000
End Sub
Sub
Timer1_Timer ()
Label1.Caption = Time
End Sub

4- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 25 GÜNÜN SAYISAL DEĞERİNİ DÖNDÜREN   UYGULAMASI

     Girilen tarihin sayısal olarak gününü veren  bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()
Dim
Günno, msg ' Tanımlama.
Günno = Day(Now) ' Günün Numarasını verir.
msg = "Bugün Haftanın " & Günno & ". Günü."'Sonuç Görüntüleniyor
MsgBox
msg, 54, "Day Uygulaması"
End Sub

 

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE  27 DO LOOP (döngüler) UYGULAMASI

     DO LOOP döngülerini anlatan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click()
Dim Rakam ' Tanımlama
Do
Rakam = InputBox("9 Sayısından Küçük 1 Sayısından Büyük Bir Rakam Giriniz.", "DO LOOP")
If Rakam > 1 And Rakam < 9 Then ' Rakamın Kontrolü.
Exit Do ' Döngüden çıkış
End If
Loop
End Sub

3- Projenizi Kaydedip Çalıştırın. Form 1 üzerine fare ile çift tıklayın

PROJE  26 BASİT BİR PAİNTBRUSH(ÇİZİM) UYGULAMASI

     Picture nesnesi üzerine çizgiler çizen bir resim program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Projenize 1 tane Picture (resim) nesnesi yerleştirin.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub picture1_MouseDown(Button As Integer, ShIft As Integer, X As Single, Y As Single)
Dim SolButon, SağButon ' tanımlama.
Picture1.AutoRedraw = True ' Otomatik Çizim.
SolButon = Button And 1 ' Sol Buton
SağButon = Button And 2 ' Sağ Buton.
If SolButon Then 'picture1.
Picture1.Line -(X, Y) ' Çizim Yapılır.
Randomize
Picture1.ForeColor = (Rnd * &H400040) 'Rasgele Renkler
ElseIf SağButon Then
Picture1.LinkSend
DoEvents ' işlem.
End If
End Sub

DoEvents ' işlem.

End if

End Sub

4- Projenizi Kaydedip Çalıştırın. Picture 1 uzerine fare ile  tıklayıp resminizi çizin.

PROJE  28 ALFABE KONTROLÜ YAPAN BİR UYGULAMASI

     Girilen değerin alfabenin kaçıncı harfi olduğunu bulan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click()
Dim Alfabe, Harfsırası, msg, KullanıcıTanımı ' Tanımlama
Alfabe = "ABCÇDEFGĞHIİJKLMNOÖPQRSŞTUÜVWXYZ"
msg = "Lütfen Alfabede yeralan bir Harfi Giriniz."
KullanıcıTanımı = UCase(InputBox(msg)) ' Kullanıcı Girişi.
If Len(KullanıcıTanımı) Then
Harfsırası = InStr(Alfabe, KullanıcıTanımı) ' Karakterin Alfabedeki Konumu.
If Harfsırası <> 0 Then
msg = "Yazdığınız Harf " & Len(Alfabe) & " Karakterin."
msg = msg & Harfsırası & " .incisi"
Else
msg = "Yazdığınız Karakter Alfabede Bulunmuyor"
End If
Else
msg = "Herhangi Bir Karakter Girmediniz!"
End If
MsgBox msg, 27, "InStr Uygulaması" ' Sonucun Görüntülenmesi.
End Sub

 

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın



PROJE 29 SAYI YUVARLAMA   UYGULAMASI

     Girilen rakamı yuvarlayan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()

Dim Msg, NL, TB ' Tanımlama

NL = Chr(13) & Chr(10): TB = Chr(9) ' Yeni Satır ve Tab

Msg = "Int(-99.8) Komutu Sonucu:" & TB & Int(-99.8)

Msg = Msg & TB & "Fix(-99.8) Komutu Sonucu:" & TB & Fix(-99.8)

Msg = Msg & NL & "Int(-99.2) Komutu Sonucu:" & TB & Int(-99.2)

Msg = Msg & TB & "Fix(-99.2) Komutu Sonucu:" & TB & Fix(-99.2)

MsgBox Msg ' Sonuç Görüntüleniyor.

End Sub

3- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

PROJE 30 SELECT CASE   UYGULAMASI

     Select case seçimini anlatan bir program parçası

Projeyi İndir 

 

Projede Kullanılacak DLL     

 

Function İse                          

 

Projede Kullanılacak sabitler

 

 

YAPILACAK İŞLEMLER

1-Yeni bir proje oluşturun.
2- Aşağıdaki kodları Formun general Declarations bölümüne yapıştırın

Sub Form_Click ()

Dim veri ' Tanımlama.

Do ' Döngü.

veri = UCase(InputBox("A Ve ya X tuşlarına basınız", "End"))

Select Case veri ' Veri Seçimi.

Case "A": MsgBox "Girişiniz 'A'.",54,”End

Case "X": End ' Çıkış

Case Else: MsgBox "Geçersiz Giriş,Tekrar Deneyiniz.",48,”End

End Select ' Seçim Bloğu bitti.

Loop

End Sub ' Procedure sonu

4- Projenizi Kaydedip Çalıştırın. Form 1 uzerine fare ile çift tıklayın

 

Visual BASIC

 

 

 

          Merhaba arkadaşlar. Bu aydan itibaren (Aralık 2000) sizlerle beraber Visual BASIC in temellerini atacağız. Bu bölümü açmamdaki amacım , daha önce ders olarak aldığım bu dili öğrenmemdeki zorlukları sizinde yaşamamanız ve yerli kaynak yetersizliğinden düştüğüm çıkmazlara sizinde girmemeniz. Tabiki dünden bu güne yerli kaynaklar bayaa arttı ve artmakta. Görsel bir dil olan VB , Microsoft'un geliştirdiği nesneye dayalı (Object-Oriented) bir programlama dilidir. Ve en son 6.0 versiyonu ile karşımızda.

          Visual Basic nesneye dayalı (Object-Oriented) bir programlama dilidir. Yani , daha önceden tanımlanmış hazır nesnelerle gelir Visual Basic. Örneğin , Text Box nesnesi. İşte bundan . Tabiki bütün nesneler Visual Basic de tanımlı nesnelerle sınırlı değil. Hazır olan bu nesneler işimizi görmezse kendi nesnemizi oluşturabiliriz. Farklı amaçlar için hazırlanmış nesneleri internetten bulabilirsiniz. Anahtar olarak ocx veya Avtivex i girerek arama motorlarından yerini kolayca bulabilirsiniz.

          Visual Basic olay temelli bir programlama dilidir. Nedir bu olay temelli (event-driven) ? Kullanıcı tarafından gerçekleştirilen işlemlere göre programın yanıt vermesi. Mesela Text Box a yazı girişinin yapılması bir olaydır. Bu olayın gerçekleşmesi halinde sadece bu olaya ait kodlar girdiğinizde , bu olayın gerçekleşmesi halinde sadece bu kodlar yürütülecektir. Her nesne için tanımlı birden fazla olayvardır. Yeri geldiğinde o nesneyi incelerken olaylarınıda tek tek inceleyeceğiz.

          Visual Basic in kullanıcı arayüzüne gelince , yazmaya başlıyacağımız her program bir proje olarak başlatırlır. Her projede en az bir form bulunur. Uygulama içinde bulunan her nesne bu formun üzerine yerleştirilir. Kullanıcının birebir etkileşim halinde olacağı kısım formlardır. Form üzerine yerleştirilecek her nesne programcı tarafından resim çizer gibi yerleştirilir. Bir projenin başlangıç adı Project1 , proje içinde bulunan formun başlangıç adı ise Form1 dir. Form üzerine yerleştirilen nesneler toolbox (alet kutusu) penceresinde yeralır. Bir nesne toolbox ta seçildikten sonra , form üzerinde nereye yerleştirilecekse o noktada mausun sol tuşu basılı tutularak istenilen boyutlara gelene kadar boyutlandırılır ve sol tuş bırakılır.

          Toolbox ta standart olarak bulunan kontrollerin listesini aşağıda bulabilirsiniz.

 

Standart Kontroller

Gösterge

Form üzerine aktarılamayan tek nesne. Form üzerine çizilmiş kontrol nesnelerinin yerini ve boyutunu değiştirmek için kullanılır.

PICTURE BOX

Resim Kutusu . Form üzerine grafikleri göstermek , grafik çizdirmek , diskteki bir resmi yüklemek için kullanılır.

LABEL

Etiket . Bilgi vermek amacıyla kullanılır. Kullanıcı tarafından değiştirilemez metni göstermek için kullanılır.

TEXT BOX

Metin Kutusu . Bilgi girişi veya üretilen bilgilerin gösterilmesi için kullanılır.

FRAME

Çerçeve . Kontroller için görsel ve fonksiyonel anlamda bir grup oluşturma imkanı sağlar.

COMMAND BUTTON

Komut Butonu . Kullanıcı tarafından seçildiği zaman , belirli bir işlemi yerine getirir.

CHECK BOX

Kontrol Kutusu . Kullanıcıya evet/hayır ya da doğru/yanlış gibi seçenekler vermek için kullanılır.

OPTİON BUTTON

Opsiyon Butonu . Grup halinde kullanılır. Her buton bir seçeneği temsileder ve bu grup içinden yanlız bir tanesi seçilebilir.

COMBO BOX

Kombine Kutu . Metin kutusu (text box) ve liste kutusunun (list box) üzelliklerini birarada barındırır. Yani kullanıcı metin kutusu gibi içine metin yazabilir ya da liste kutusu gibi , kutu içine yerleştirilen isimlerden istediğini seçebilir.

LIST BOX

Liste Kutusu . Kullanıcının içinden bir veya daha fazla isim seçebileceği bir liste içerir.

HORIZONTAL SCROLL BARS

Yatay Hareket Çubukları . Kullanıcıya , listeler içinde veya büyük miktarda bilgi boyunca yatay hareket imkanı sağlar.

VERTICAL SCROLL BARS

Düşey Hareket Çubukları . Düşey hareket çubukları , yatay hareket çukları için söylenen işlemleri düşey olarak gerçekleşir.

TIMER

Zamanlayıcı . Uygulama esnasında zamana bağlı olarak belirli aralıklarla , belirli eylemlerin gerçekleşmesini denetlemek için kullanılır.

DRIVE LIST BOX

Sürücü Listeleme Kutusu . Uygulama esnasında geçerli sürücülerin bir listesini sunmak ve sürücüler arasında geçiş yapmak için kullanılır. Dizin listeleme kutusunun bir parçası olarak kullanılır.

DIRECTORY LIST BOX

Dizin Listeleme Kutusu . Uygulama esnasında , aktif durumdaki sürücünün yolunu ve dizinlerini görüntüler

FILE LIST BOX

Dosya Listelem kutusu . Verilen bir dizin içindeki tüm dosyaları listeler.

SHAPE

Şekil . Tasarım veya çalışma zamanında form üzerine , kare , daire , elips , dikdörtgen gibi şekiller yerleştirmek için kullanılır.

LINE

Çizgi . Form üzerine yatay , düşey veya eğik çizgi yerleştirmek için kullanılır.

IMAGE

Görüntü . Bir resmi görüntüleyebilen grafik tipte bir nesnedir. Bu özelliğiyle resim kutusuna benzer. Fakat daha az istem kaynağı kullanır ve mausla tıklandığı zaman komut butonuna benzer özellik gösterir.

DATA ACCESS

Veriye Erişim . Sistemdeki mevcut veri tabanına erişerek , bilgi güncelleme ,edit yada bilgi görüntüleme işlemlerinin yapılabilmesine olanak sağlar.

OLE CLIENT

Ole İstemcisi . Object Linking and Embedding ( Nesneyi Bağlama ve Yerleştirme ) yöntemi . Bu yöntemle proje içine bir Windows uygulama programından ( Word 2000 gibi ) nesneler aktarmak mümkün.

 

Sıra Visual Basic'in Menülerine Geldi

 

[ File ] [ Edit ] [ View ] [ Project ] [ Format ] [ Debug ]

 

File

New Project

Yeni bir VB projesi başlarmak için kullanılır. Eğer önceden yüklü başka bir proje varsa ve üzerinde bir değişiklik yapılmışsa , son halinin saklanıp saklanmıyacağı sorulur.

Open Project

Daha önceden diske saklamış olduğumuz bir VB projesini yüklemek için kullanırız.

Add Project

VB 6.0 ile 5.0 sürümünde olduğu gibi uygulamalarımıza birden fazla proje ekleyebiliriz. Proje penseresi birden fazla proje içerdiğinde Proje Group olarak değişir.

Remove Project

Aktif uygulamanız içindeki bir projeyi uygulama içinden çıkarmak için kullanılır.

Save Project

Aktif uygulamanız içindeki projeleri ve projeler ile ilişkili tüm dosyaları saklamak için kullanılır.

Save Project As

Daha önce diske saklanmış olan , son hali disktekinden farklı olan tüm bileşenleri yeni bir isimle saklamayı sağlar.

Save <Dosya ismi>

Aktif proje penceresinde seçilmiş olan bir nesneyi diske saklamak için kullanılır.

Save <Dosya ismi> As

Daha önceden diske saklanmış bir dosya yeni bir isimle yeniden saklanabilir.

Print

Aktif fromu , forma bağlı kodları , üzerinde çalıştığınız modülü ya da uygulamanızdaki tüm formları yazıcıya aktarma imkanı sağlar.

Print Setup

Uygulamanızı yazıcıya aktarırken , kullanacağınız yazıcı tipini bilgisayara tanıtma , yazıcıdaki kağıt ve baskı ayarlarını belirtme imkanı sağlar.

Make <Proje_ismi>.EXE

Geliştirmiş olduğunuz projenizi Windows ortamında , VB ortamına ihtiyaç duymadan çalıştırabilir hale getirebilirsiniz.Bu menü seçeneği aynı zamanda ActiveX kontrol projelerini .OCX ve ActiveX kod bileşeni uygulamalarını .DLL uzantılı dosyalara dönüştürmek içinde kullanılır.

Make Project Group

Şayet uygulamanız bir den fazla proje içeriyorsa görüntülenir.

Exit

Visual Basic ortamından çıkmak için kullanılır.

 

Edit

Undo

Son yapılan değişikliği geri alır.

Redo

Son yapılan işlemi tekrarlar.

Cut

Seçili metnin kesilmesini sağlar.

Copy

Seçili metnin kopyalanmasını sağlar.

Paste

En son kopyalanan veya kesilen metnin yapıştırılmasını sağlar.

Paste Link

Başka bir Windows uygulaması içinden Clipboard'a kopyalanmıi olan verileri , aktif VB uygulaması içine aktarmak için kullanılır. İki uygulama arasında kurulan bir link olduğu için , orjinal nesnenin üzerinde yapılan her değişiklik VB'deki kopyasınada aynen yansımaktadır. Bu menü seçeneği sadece DDE ( Dynamic Data Exchange-Dinamik Veri Değişimi ) özelliğine sahip Windows uygulamaları için kullanılabilir.

Delete Table From Database

Veri tabanından bir tabloyu siler.

Select All

O esnada aktif kod penceresindeki bütün kodu veya form üzerindeki bütün kontrolleri seçmek için kullanılır.

Select All Columns

Diyagramdaki veri kaynağı penceresinde bulunan bütün sütunları seçmek için kullanılır.

Table / Set Primary Key

Seçilen bir sütun için birincil anahtar tanımlar. Birincil anahtar içeren sütunların null karakteri içermesine müsade edilmez.

Table / Insert Column

Tabloya yeni bir alan eklemek için kullanılır.

Table / Delete Column

Tablodan bir sütun silmek için kullanılır.

Find

Bir VB kodu içerisinde bir metni aramak için kullanılır.

Find Next

Arama işlemini , bir önceki aramada belirtilen ifade için ışıklı kalemin kadığı yerden itibaren yeniden başlatır. Eşdeğeri F3 tuşudur

Replace

Bir metin içinde bir sözcüğü aratıp , bulunduğu takdirde başka bir sözcükle değiştirebilme imkanı sağlar.

Indent

Kursörün bulunduğu satırı tab tuşunun belirttiği ölçüde sağa kaydırır. Eşdeğeri Tab tuşudur.

Outdent

Indent menü seçeneğinin gerçekleştirdiği işin tam tersini yapar. Eşdeğeri SHIFT+Tab

Insert File

Aktif kodun içine kursörün bulunduğu noktadan itibaren başka bir dosyada bulunan kodu eklemek isterseniz bu menü seçeneğini kullanmalısınız.

List Properties/Methods

Kod penceresine yazılan her uygun ifadenin ardından bu ifadeden sonra yazılabilecek mümkün diğer ifadeleri içeren bir ardım kutucuğu görüntüler. Bu işlemin kod yazılımı sırasında kendiliğinden gercekleştirilmesi için Tools/Optionsmenü seçeneğiyle açılan Options diyalog penceresinde Auto List Members seçeneğinin işaretlenmiş olması gerekir.

List Constants

Kod penceresinde , yazılan ifadenin alabileceği sabit değerleri içeren yardımcı bir pencere görüntüler.

Quick Info

Kod penceresinde seçilen fonksiyonların , metodların , prosedürlerin ve değişkenlerin yazılımını gösteren yardımcı bir pencere görüntüler.

Parameter Info

Kod penceresinde yazılan fonksiyon veya ifadelerin içerdikleri parametreleri gösteren yardımcı bir pencere görüntüler.

Complete Word

VB yamakta olduğunuz ifadeden kelimeyi bulmay çalışır. Eğer birden fazla alternatif söz konusu ise , bir tanesini seçmeniz için muhtemel , ilk ifadenin seçili olduğu bütün ifadeleri içeren küçük bir pencere açar.

Bookmarks

Program kodunun çok sık kullanıldığı satırlarına kolay bir şekilde ulaşmak için kullanılır.

Toggle Bookmark

Ulaşılmak istenen satır ( kursörün üzerinde olduğu ) bu tür bir amaç için işaretlenir veya işareti iptal edilir.

Next Bookmark

Bir sonraki yer tutamağı ile işeretlenmiş kod satırına ulaşır.

Previous Bookmark

Bir önceki yer tutamağı ile işeretlenmiş kod satırına ulaşır.

Clear All Bookmarks

Aktif kod penceresindeki bütün yer tutamaklarını iptal eder.

 

View

Code

Seçilmiş olan form ya da modülün Code penceresini görüntülemek için kullanılır.

Object

Aktif kod ile ilişkili olan nesneyi ( form gibi ) görüntülemek için kullanılır. Eşdeğeri SHIFT+F7

Definition

Kursörün üzerinde bulunduğu , aktif bir prosedüre ait kod penceresini görüntülemek için kullanılır.

Last Position

Kod penceresinde en son bulunduğunuz noktaya yeniden dönmek için kullanılır.

Object Browser

Nesne gözatıcısı penceresi ekrana gelir.

Immediate Window

Hata ayıklama penceresi ekrana gelecektir.

Locals Window

O esnada aktif prosedürdeki bütün değişkenleri ve değerlerini gösterir.

Watch Window

Break modda , daha önceden gözlem amacı ile tanımlanmış değişken yada ifadenin o andaki değerini görüntülemek için kullanılır.

Call Stack

Projeleriniz içinde , o esnada aktif olan prosedür çağrılarının listesini gönderir.

Project Explorer

Project başlıklı pencereyi ekrana getirir. Bu pencerede , o esnada aktif olan projeyi oluşturan dosyaların bir listesini görmek mümkün olmaktadır.

Properties Window

Properties ( Özellikler ) başlıklı pencereyi ekrana getirir. Bu pencerede o esnada aktif olan nesne için geçerli olan özelliklerin bir listesini ve bu özelliklere o esnada stanmış olan değerleri incelemek mümkündür.

Form Layout Window

Layout penceresinde formların ekrandaki pozisyonları mouse yardımı ile ayarlanabilir.

Property Pages

Tasarım ortamında kullanıcı tarafından oluşturulmuş bir kontrolün özelliklerinde değişiklik yapmak amacıyla özellik sayfalarını listeler. Eşdeğeri SHIFT+F4 tuşlarıdır.

Table

Dyagram penceresindeki pencereleri görünür kılmak vaya bu durumu iptal etmek için kullanılır. Query(sorgu) , View(Görüş) ve Veritabanı tasarım pencerelerinde kullanılır.

Zoom

Diyagram penceresini belirtilen oranlarda görüntülemek için kullanılır.

Show Panes

Query(Sorgu) ve View(Görüş) tasarım görüş pencerelerindeki kısımları görüntülemek veya bu kısımların görünmesini iptal etmek için kullanılır.

Tool Box

Araç kutusunu görünür hale getirir.

Color Palette

Seçilmiş VB nesnelerinin renklerini değiştirmek üzere , renk paletini ekrana getirir.

Data View Window

Data view penceresini görüntüler.

Toolbar

VB'in kullandığı araç çubuğu gruplarından biri akranda görüntülenebilir veya ekrandan silinebilir. Customize seçeneğiyle kendi araç çubuğumuzu yapabiliriz.

 

Project

Add Form

Aktif formun içine yeni veya mevcut bir form katmak için kullanılır.

Add MDI Form

Multiple Document Interface ( Çok sayıda döküman içeren arayüz ) oluşturulabilir veya mevcut bir MDI formu uygulamaya ekleyebiliriz.

Add Module

Aktif formun içine yeni veya mevcut bir modül katmak için kullanılır.

 

 

Add Class Module

Sınıf Modüllü (Class Module) denilen özel tipte bir modül oluşturmak veya mevcut bir sınıf modülü eklemekiçin kullanılır.

Add User Control

Sadece kendi projenizde kullanabileceğiniz ActiveX kontrolleri oluşturmak için kullanılır.

Add Property Page

Yaptığınız ActiveX kontrolleri için özellik sayfası ( Property Page ) oluşturmak için kullanılır.

Add User Document

Projeye yeni bir ActiveX dökümanı eklemek için kullanılır. ActiveX dökümanları Internet Explorer programı ile beraber çalışırlar.

Add DHTML Page

Dinamik HTML uygulamalarımıza yeni dinamik HTML sayfaları eklemek için kullanılır.

Add Data Report

Veritabanı uygulamalarına Data Report eklemek için kullanılır. Data Report , raporların hazırlandığı ve gösterildiği tasarım ekranlarıdır.

Add WebClass

IIS (Internet Information Server) uygulamalarına WebClass nesnesi eklemek için kullanılır. WebClass nesnesi tarayıcının HTTP isteklerine karşılık üretilen ve yine tarayıcıya gönderilen web elemanlarını içerir. WebClass nesnesi web server üzerinde bulunur ve tarayıcıya gönderilecek HTML formatındaki sayfaların hazırlanması için Visual Basic kodlarını kullanır.

Add Microsoft UserConneciton

Uygulamaya UserConneciton nesnesi eklemek için kullanılır. DataEnvironment nesnesine benzer fakat UserConneciton nesneleri RDO ( Remote Database Object ) için kullanılır.

More ActiveX Designers

Projenize ekleyebileceğiniz ActiveX tasarımlarını , içlerinden birisini seçmeniz için listeler. Bu menü komutunu kullanabilmeniz için Project\Components ile açılan Components penceresinde Designers butonu ile listelenen tasarımları seçerek belirtmelisiniz. İlk değer olarak DataEnvironment nesnesi seçili olarak gelir.

Add File

Aktif olan projenize daha önceden hazırlanmış genel maksatlı modüller , formlar , sınıf modülleri ve kaynak dosyalar gibi bileşenleri eklemek için kullanılır.

Remove <Dosya ismi>

Aktif projenizin içindeki bir dosyayı bu proje içinden çıkarma imkanı sağlar.

References

Projeniz içerisine başka uygulama programları yada nesne kütüphanelerinden nesneler katma imkanı sağlar.

Components

VB'te kullanabileceğiniz kontrol nesnelerin sayı ve çeşidini arttırmak ve DLL uzantılı tasarımları projeye eklemek için kullanılır.

Project Properties

Visual Basic projesi ile ilgili düzenlemeler yapmak için kullanılır.

 

Format

Align

Form üzerinde seçilmiş nesnelerin konumunu aşağıda verilen değerlere göre değiştirir.
  Lefts : Seçilmiş nesnelerden en sonuncusu referans alınarak diğerlerinin sol köşe noktası (formun sol tarafına olan uzaklığı) en son seçilmiş nesne ile aynı yapılır.
  Centers : Seçilen nesnelerin orta noktasının formun soltarafına olan uzaklığını, en son seçili nesneninkiyle aynı yapar.
  Rights : Seçilmiş nesnelerden en sonuncusu referans alınarak diğerlerinin sağ köşe noktası (formun sağ tarafına olan uzaklığı) en son seçilmiş nesne ile aynı yapılır.
  Tops : Seçilmiş nesnelerden en sonuncusunun düşey noktası referans alınarak diğerlerinin formun alanının üs tarafına olan uzaklığı en son seçilmiş nesne ile aynı yapılır.
  Middles : Seçilmiş nesnelerden en sonuncusunun düşey noktası referans alınarak diğerlerinin merkez noktasının form alanının üs tarafına olan uzaklığı en son seçilmiş nesnenin merkezininki ile aynı yapılır.
  Bottoms : Seçilmiş nesnelerden en sonuncusunun düşey noktası referans alınarak diğerlerinin formun alanının alt tarafına olan uzaklığı en son seçilmiş nesne ile aynı yapılır.
  to Grid : Seçilen nesnelerin sol üst köşesi en yakın gridin sol üst noktası ile çakışacak şekilde ayarlanır.

Make Same Size

Bu seçenek , seçilen nesnelerin boyutlarında ayarlama yapar. 3 alt menüden oluşur.
  Width : Seçilmiş nesnelerin genişlikleri , son seçilen nesnenin genişliğiyle aynı yapılır.
  Height : Seçilmiş nesnelerin yükseklikleri , son seçilen nesnenin yüksekliğiyle aynı yapılır.
  Both : Seçilmiş nesnelerin boyutları , son seçilen nesnenin boyutları ile aynı yapılır.

Size to Grid

Seçilen nesnelerin köşe ve kenar çizgilerini , form üzerindeki noktalarla çakışır hale getirir. Bu nesnelerin otomatik olarak grid noktalarına yerleşmesi için , Tools/Options menüsünde , General seçeneğinde ki Align Controls to Grid seçeneği işaretlenmiş olmalıdır.

Horizontal Spacing

Seçilen nesnelerin kendi aralarındaki yatay boşluklar aşağıdaki alt menülere göre ayarlanır.
  Make Equal : seçilen nesnelerin kendi aralarındaki yatay boşluklar eşit hale getirilir. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Increase : seçilen nesnelerin kendi aralarındaki yatay boşluklar bir grid hücresinin (form üzerindeki noktalarla oluşturulabilecek en küçük dikdörtgen)eni kadar arttırılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Decrease : seçilen nesnelerin kendi aralarındaki yatay boşluklar bir grid hücresinin eni kadar azaltılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Remove : seçilen nesnelerin kendi aralarındaki yatay boşlukları kaldırılır.

Vertical Spacing

Seçilen nesnelerin kendi aralarındaki düşey boşluklar aşağıdaki alt menülere göre ayarlanır.
  Make Equal : seçilen nesnelerin kendi aralarındaki düşey boşluklar eşit hale getirilir. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Increase : seçilen nesnelerin kendi aralarındaki düşey boşluklar bir grid hücresinin (form üzerindeki noktalarla oluşturulabilecek en küçük dikdörtgen)eni kadar arttırılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Decrease : seçilen nesnelerin kendi aralarındaki düşey boşluklar bir grid hücresinin eni kadar azaltılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Remove : seçilen nesnelerin kendi aralarındaki düşey boşlukları kaldırılır.

Center in Form

Seçilen nesne grubunu form üzerinde ortalar.   Horizontaly : seçilmiş nesne grubu içinden en sol ve en sağdaki nesnelere göre grup , form üzerinde yatay olarak ortalanır.
  Increase : seçilmiş nesne grubu içinden en üst ve en alttaki nesnelere göre grup , form üzerinde düşey olarak ortalanır.

Order

  Bring to Front : seçimiş olan nesneyi , formda bulunan diğer nesnelerin önüne getirir.
  Send to Back : seçimiş olan nesneyi , diğer nesnelerin arkasına yerleştirir.

Lock Controls

Form üzerindeki kontrolleri bulundukları pozisyonda kilitler. Bu komuttan sonra kontroller form üzerinde hareket ettirilemez. Bu durumun iptali için aynı menü seçeneği tekrar seçilir.

 

Debug

Step Into

Tasarım esnasında , Visual Basic kodundaki o esnada kürsörün işeret etmiş olduğu komutu çalıştırır.

Step Over

Step Into komutuna benzer. En önemli fark , icra edilen aktif komut , bir prosedür çağırma komutu ise , o prosedür tek bir komut gibi bütünü ile icra edildikten sonra , esas koddaki bir sonraki deyime geçilir.

Step Out

O esnada icra edilen fonksiyonun içinde kursörün işaret etmiş olduğu komuttan itibaren bütün komutlar çalıştırılır ve fonksiyonun çağrıldığı esas kodda bir sonraki deyime geçilir.

Run To Cursor

Programı yeniden başlatarak kursörün olduğu kısma kadar icra ettirilmesini sağlar.

Add Watch

Bir değişken veya ifadenin programın icrası boyunca değerinin izlenmesini sağlar. Bu menü elemanının seçimi ile ekrana bir dialog kutusu çıkar. Expression kısmına izlenecek değişken yerleştirilir. Watch Type (gözlem tipi) kısmı 3 farklı seçenek sunar.
  Watch Expression : İfadenin değeri izlenir.
  Break When Value Is True : İfade TRUE değerini alınca program icrası geçici bir sure için durdurulacaktır.
  Break When Value Changes : İfadenin değeri değiştiği anda break moduna geçilecektir.

Edit Watch

Gözlenen değerler üzerinde değişiklik veya düzeltme yapılmak istenirse kullanılır.

Quick Watch

Break modunda kursörün üzerinde bulunan özelliğin veya değişkenin değerini görüntüleyen bir dialog pencersi görüntüler.

Toggle Breakpoint

Tasarım esnasında kullanılabilen bir komuttur. Kod üzerindeki durma noktalarını bilirtmek için kullanılır.

Clear All Breakpoints

Toggle Breakpoint ile belirtilen bütün durma noktalarını iptal eder.

Set Next Statement

Program icrası kesildikten sonra kullanılır. Bu seçenekle durma noktasından sonra işletilebilir ilk komut işaretlenir.

Show Next Statement

Program icrası kesildikten sonra kullanılabilir. İcra edilecek bir sonraki deyimi gösterir.

Api Nedir? ...

 

     "İşletim sistemleri", aslında birer programdır. İşletim sistemleri genelde assembly programlama dili ile (veya assebmly komutları kullanan başka bir dil ile) yazılır. Bilgisayar açıldığında bir takım kontrol ve test işlemlerini yaptıktan sonra, harddiskin (durumuna göre floppy veya CD'de olabilir) ilk sektöründeki bilgiyi okur ve kontrolü işletim sistemine devreder. İşletim sistemi, bios kesmeleri ve makina dili komutlarını (assembly) kullanarak sistemi yönetir. Bu nedenle işletim sistemi direk olarak assembly komutları ile yazılmak durumundadır.

     İşletim sistemleri, kendi kontrolleri altında çalışacak diğer programlar için uygun ortamı hazırlarlar. Söz gelimi bir program diske yazma, diskten okuma, ekrana yazma, klavye tuş vuruşunu izleme gibi bir çok işlemleri kendisi yapmaz. Bu işleri işletim sisteminden talep eder. Bu istemin geçerli olması için, işletim sistemi ile programın aynı dili konuşuyor olması gerekir. Oysa işletim sistemi ile aynı dilden konuşmak oldukça zor ve zahmetli bir çalışma gerektirir. Bu karşılık bu talepleri konuşulan dile daha yakın bir şekilde ifade etmek için aracı bir programa ihtiyaç duyulmuştur. Programların işletim sisteminden olan taleplerini basitleştirmek ve daha anlaşılır kılmak için yapılan programlara ise "programlama dili" denilmektedir.

     Programlama dilleri sundukları bu kolaylığın bedeli olarak, biraz hızı düşürürler. Hatta, diyebiliriz ki; programlama dili ne kadar anlaşılabilir, konuşulan dile ne kadar yakınsa ve kodlanmaları ne kadar kolay iseler, o kadar yavaş çalışırlar. Bütün zamanların en anlaşılır ve en kolay dili olan basic serisi (basic, gwbasic, Qbasic, quick basic vs.) programlama dillerinin yavaşlığı bundan gelmektedir. Visual basic'in ise yeterince hızlı olduğunu belirtelim.

     Programlama dilleri hiç bir zaman, işletim sisteminin bütün desteğini sağlamazlar. Örneğin; harddisk seri numarasını öğrenme gibi. Bazen işletim sisteminin dahi sağlamadığı bir işi programınıza yaptırmak istersiniz. Örneğin seri veya paralel port yardımıyla neon ışıkları yakılması gibi projeler. Bu nedenlerle yaptığınız programla, programla dilinin içinden, ama programla dili komutları kullanmadan, direkt olarak işletim sistemiyle, hatta direkt olarak merkezi işlem birimi (cpu) ile veya başka bir aygıtla çalışmak isteyebilirsiniz.

     Windows serisi işletim sistemlerinde bu amaçla geliştirilmiş harici fonksiyonlar vardır. Bunlara Application Programming Interface ya da kısaca API denir.

     Windows'un sunduğu bu API'ler gruplandırılarak bir çok DLL ve EXE dosyasına konmuştur. VB'de kullanılan OCX dosyalarında da API'ler bulunabilir. Bu API'lerden birini kullandığınızda API'nin bulunduğu DLL sisteme daha önce yüklenmemişse önce bu DLL yüklenir ve API çalıştırılır.

     API'ler sadece Visual basic ile değil, windows altında çalışan her programlama dili içinden kullanılabilir. Siz de içinde değişik fonksiyonlar bulunan DLL dosyası yazabilirsiniz, ama bu API olmaz, API işletim sisteminin bir parçasıdır. API'de kullandığınız bir fonksiyonun, işletim sisteminin yeni versiyonlarında da yer alması sorumluluğu bulunmaktadır. API'lerin bir başka özelliği ise son derece hızlı olmalarıdır.

     Visual Basic ile birlikte gelen "API Text Viewer" programı vasıtasıyla hemen hemen bütün API'lerin listesini görebilirsiniz.

     VB'de API'ler, fonksiyon veya yordam olarak iki farklı şekilde tanımlanabilir.

     Declare Sub isim Lib "apidosyaadi" (parametreler)

     Yukardaki "Sub" yerine "Function" yazarsanız API'yi yordam olarak değil fonksiyon olarak çağırmak istyorsunuz demektir.

     Yine yukardaki örnekte, "Declare" kelimesinde önce eğer form içinde kullanılıyorsa "Private" sözcüğü mutlaka kullanılmaldır. "Private" sözcüğü bu fonksiyon ya da yordamın kullanıldığı form veya modül için özel olduğunu, "Public" veya "Global" sözcüğü ise programın her tarafında geçerli olduğunu bildirir. Salt "Declare" kullanılırsa bu "Public" anlamına gelir. API'nin tanımlanacağı yer formun veya modülün General-Declerations kısmıdır. API'yi bir formun decleration kısmında tanımlarsanız "Private" yazmak zorunda olduğunuzdan dolayı API'yi yalnız o formun içinden çağırabilirsiniz.

     API'yi doğru olarak tanımladığınız halde VB, ilgili dosyada böyle bir API bulunmadığını söylüyorsa veya API ile aynı isme sahip bir VB komutu var ise bu durumda Alias isimleri kullanmanız gerekir. Bazen'de API isminin sonuna A ekleyerek Alias ismi olarak vermeniz gerekir.

     Örnek olarak; kullanıcı ismini bulan bir API fonksiyonu kullanalım. Yeni bir projeye başlatın ve formunuzdaki, bütün kodlar aşağıdaki gibi olsun.

Option Explicit
 
Private Declare Function apiUserName Lib _
        "advapi32.dll" Alias "GetUserNameA" _
    (ByVal lpBuffer As String, _
    nSize As Long) As Long
 
Private Sub Form_Load()
    Dim Bufstr$, Uz&, Sen$
    Uz = 250
    Bufstr = Space$(Uz)
    If apiUserName(Bufstr, Uz) > 0 Then
        Sen = Left(Bufstr, Uz - 1)
        Sen = Trim(Sen)
    End If
    MsgBox ("Kayıtlı kullanıcı:" + Sen)
End Sub

Programı çalıştırdığınızda kullanıcı adını (yani kendi adınızı) görmeniz gerekir.

 

Forma istenilen şeklin verilmesi ...

 

     Programımızı windowsun klasik form şeklinden kurtarmak, daha profesyonel bir görünüm sağlamak veya görüntü değişimi (skin) eklemek için kullanabileceğimiz bir kaç api fonksiyonu var.
     Bu fonksiyonlar;

CreateEllipticRgn
CreatePolygonRgn

şeklindedir. Birinci fonksiyon Form'a dairesel şekiller vermek için kullanılır. İkincisi ise istenilen koordinatlarda formu şekillendirir. Bu nedenle daha kullanışlı olan ikinci fonksiyonu değerlendirmeye alacağız.
     "CreatePolygonRgn" fonksiyonu üç adet parametre alır. Bunlardan birincisi Form'un çizileceği koordinatları belirler. İkinci parametre kaç adet koordinat belirlendiğini, üçüncü parametre ise çizim modunu belirler. Çizim modu genelde "1" değerini alır. Form'un koordinatları ise saat yönünde yatay ve dikey konumlar verilerek saptanır.
     Formun şekillenmesi için "CreatePolygonRgn" fonksiyonu Form'un "resize" olayına yazılmalıdır.
     Bir örnek verelim;
    1) Yeni bir proje başlatın,
    2) Form'un resize olayına aşağıdaki kodu yazın,

Private Sub Form_Resize()
    If WindowState <> vbMinimized Then
        Sekille Me
    End If
End Sub

    3) Projeye bir modül ekleyin,
    4) Bu modüle aşağıdaki kodu yazın,

Option Explicit
Type Yerler
    X As Long
    Y As Long
End Type
Declare Function SetWindowRgn Lib "user32" _
                (ByVal hwnd As Long, _
                ByVal hRgn As Long, _
                ByVal bRedraw As Long) As Long
Declare Function CreatePolygonRgn Lib "gdi32" _
                (lpPoint As Yerler, _
                ByVal nCount As Long, _
                ByVal nPolyFillMode As Long) As Long
Dim Adet&
Dim Konum() As Yerler
 
Function Renk&(Nesne As Object, Kalinlik)
    Dim AnaRenk&, R&, G&, B&, Oran
    Oran = Kalinlik / 9
    AnaRenk = RGB(140, 140, 140)
    B = AnaRenk \ 65536: AnaRenk = AnaRenk - B * 65536
    G = AnaRenk \ 256: AnaRenk = AnaRenk - G * 256
    R = AnaRenk
    R = R * Oran
    G = G * Oran
    B = B * Oran
    Renk = R + G * 256 + B * 65536
End Function
 
Sub KenariBoya(Nesne As Object)
    Dim I%, Y%, DişRenk&, Kalinlik%
    Nesne.ScaleMode = 3
    For Y = 18 To 1 Step -1
        Kalinlik = Y
        Nesne.DrawWidth = Kalinlik
        Nesne.CurrentX = Konum(1).X
        Nesne.CurrentY = Konum(1).Y
        DişRenk = Renk(Nesne, Kalinlik)
        For I = 2 To Adet
            Nesne.Line -(Konum(I).X, Konum(I).Y), DişRenk
        Next
        Nesne.Line -(Konum(1).X, Konum(1).Y), DişRenk
    Next
End Sub
 
Sub Sekille(Nesne As Object)
    Adet = 20
    Dim Görünüm&
    ReDim Konum(Adet) As Yerler
    Dim En%, Boy%, Ara%, Nokta%
 
    En = Nesne.ScaleX(Nesne.Width, vbTwips, vbPixels)
    Boy = Nesne.ScaleY(Nesne.Height, vbTwips, vbPixels)
    Ara = 10
 
    'saat yönünde
    Nokta = Nokta + 1
    Konum(Nokta).X = 0
    Konum(Nokta).Y = Ara * 3
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara
    Konum(Nokta).Y = Ara * 2
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara
    Konum(Nokta).Y = Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara * 2
    Konum(Nokta).Y = Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara * 3
    Konum(Nokta).Y = 0
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara * 3
    Konum(Nokta).Y = 0
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara * 2
    Konum(Nokta).Y = Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara
    Konum(Nokta).Y = Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara
    Konum(Nokta).Y = Ara * 2
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En
    Konum(Nokta).Y = Ara * 3
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En
    Konum(Nokta).Y = Boy - Ara * 3
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara
    Konum(Nokta).Y = Boy - Ara * 2
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara
    Konum(Nokta).Y = Boy - Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara * 2
    Konum(Nokta).Y = Boy - Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = En - Ara * 3
    Konum(Nokta).Y = Boy
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara * 3
    Konum(Nokta).Y = Boy
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara * 2
    Konum(Nokta).Y = Boy - Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara
    Konum(Nokta).Y = Boy - Ara
 
    Nokta = Nokta + 1
    Konum(Nokta).X = Ara
    Konum(Nokta).Y = Boy - Ara * 2
 
    Nokta = Nokta + 1
    Konum(Nokta).X = 0
    Konum(Nokta).Y = Boy - Ara * 3
 
    Görünüm = CreatePolygonRgn(Konum(1), Adet, 1)
    SetWindowRgn Nesne.hwnd, Görünüm, True
 
    KenariBoya Nesne
End Sub

    5) Projeyi çalıştrın.

 

 

Visual Basic ile Kısayol Yapımı ...

 

     Visual basic ile kısayol yapmanın bir çok yolu vardır. Bunlardan en basiti bu yazı ile anlatılmaktadır. DDE teknolojisi kullanılan bu yöntemde bilmemiz gerekenler;
     1- Başlat menüsünde programlar klasörünün yerinin öğrenilmesi,
     2- Masaüstü klasörü yerinin öğrenilmesi,
     3- DDE kullanarak başka bir programla ilişki kurulması,
     4- Açık bir başka pencerenin kapatılması,

     Hemen uygulamaya geçelim;
     a) Yeni bir proje başlatın
     b) 1 ve 2 inci maddelerin uygulanması için sistem kayıt dosyasından okuma yapmamız gerekiyor. Bu nedenle projenize yeni bir modül ekleyip bu module aşağıdaki kodları yazın;

Option Explicit
 
Public Const HKEY_CURRENT_USER = &H80000001
 
Private Declare Function RegOpenKey Lib _
        "advapi32.dll" Alias "RegOpenKeyA" _
        (ByVal Hkey As Long, _
        ByVal lpSubKey As String, _
        phkResult As Long) As Long
Private Declare Function RegQueryValueEx Lib _
        "advapi32.dll" Alias "RegQueryValueExA" _
        (ByVal Hkey As Long, _
        ByVal lpValueName As String, _
        ByVal lpReserved As Long, _
        lpType As Long, _
        ByVal lpData As String, _
        lpcbData As Long) As Long
 
Const ERROR_SUCCESS = 0&
Const REG_SZ = 1
 
Public Function GetString(Hkey As Long, _
        strPath As String, _
        strValue As String)
 
    Dim keyhand As Long
    Dim datatype As Long
    Dim lResult As Long
    Dim strBuf As String
    Dim lDataBufSize As Long
    Dim intZeroPos As Integer
    Dim R
    Dim lValueType As Long
 
    R = RegOpenKey(Hkey, strPath, keyhand)
    lResult = RegQueryValueEx(keyhand, _
    strValue, 0&, lValueType, _
    ByVal 0&, lDataBufSize)
    If lValueType = REG_SZ Then
        strBuf = String(lDataBufSize, " ")
        lResult = RegQueryValueEx(keyhand, _
        strValue, 0&, 0&, ByVal strBuf, _
        lDataBufSize)
        If lResult = ERROR_SUCCESS Then
            intZeroPos = InStr(strBuf, Chr$(0))
            If intZeroPos > 0 Then
                GetString = Left$(strBuf, _
                intZeroPos - 1)
            Else
                GetString = strBuf
            End If
        End If
    End If
End Function

     c) 3 üncü maddenin uygulanması için projenize yeni bir modül ekleyip bu module aşağıdaki kodları yazın;

Option Explicit
 
Sub KisayolYap(Nesne As Label, _
    ByVal Grupismi As String, ByVal Programismi As String, _
    ByVal TaniticiBilgi As String, ByVal NeEkle As Integer)
    Const Virgül$ = ","
    Const Düzelt$ = ", 1)]"
    Const Aktif$ = ", 5)]"
    Const Son$ = ")]"
    Const Göster$ = "[ShowGroup("
    Const GrupYarat$ = "[CreateGroup("
    Const Yerleştir$ = "[ReplaceItem("
    Const Ekle$ = "[AddItem("
 
    Programismi = Chr(34) + Programismi + Chr(34)
    Grupismi = Chr(34) + Grupismi + Chr(34)
 
    Dim Döngü As Integer
    Dim DenemeDöngü As Integer
    For DenemeDöngü = 1 To 20
        On Error Resume Next
        Nesne.LinkTopic = "PROGMAN|PROGMAN"
        If Err = 0 Then
            Exit For
        End If
        DoEvents
    Next DenemeDöngü
 
    Nesne.LinkMode = 2
    For Döngü = 1 To 10
      DoEvents
    Next
    Nesne.LinkTimeout = 100
 
    On Error Resume Next
 
    If Err = 0 Then
        Select Case NeEkle
            Case 1 'Program ekle
                #If 0 Then
     Nesne.LinkExecute Göster & Grupismi & Aktif
                #Else
     Nesne.LinkExecute GrupYarat & Grupismi & Son
                #End If
     Nesne.LinkExecute Yerleştir & TaniticiBilgi & Son
                Err = 0
     Nesne.LinkExecute Ekle & Programismi & Virgül _
     & TaniticiBilgi & String$(3, Virgül) & Son
            Case 2 'Grup ekle
    Nesne.LinkExecute GrupYarat & Grupismi & Son
    Nesne.LinkExecute Göster & Grupismi & Düzelt
        End Select
    End If
    For Döngü = 1 To 10
      DoEvents
    Next
    Nesne.LinkMode = 0
    Nesne.LinkTopic = ""
    Err = 0
End Sub

     d) 4 inci maddenin uygulanması için projenize yeni bir modül ekleyip bu module aşağıdaki kodları yazın;

Option Explicit
Private Declare Function GetWindow Lib "user32" _
    (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" _
        Alias "GetWindowTextA" (ByVal hwnd As Long, _
        ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" _
        Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
        ByVal lParam As Long) As Long
 
Sub WindowsPencereKapat(Başliği$, FHandle&)
    Dim Aktif As Integer, Uz As Integer, Başlik As String
    Başliği = LCase(Başliği)
    Aktif = GetWindow(FHandle, 0)
    While Aktif <> 0
        Uz = GetWindowTextLength(Aktif)
        Başlik = Space(Uz + 1)
        Uz = GetWindowText(Aktif, Başlik, Uz + 1)
        Başlik = LCase(Başlik)
        If Başlik = Başliği + Chr(0) Then
            Dim Dur As Long
            Dur = PostMessage(Aktif, &H10, 0&, 0&)
            Exit Sub
        End If
        Aktif = GetWindow(Aktif, 2)
    Wend
End Sub

     e) Formun üzerine 3 label, 3 textbox, 1 command button, 2 checkbox alın ve özelliklerini;
     Label1.caption="Tanıtıcı Bilgi"
     Label2.caption="Grup adı"
     Label3.caption="Program adı"
     Text1="Deneme"
     Text2="Grup Dene"
     Text3="C:\Deneme.exe"
     Command1.caption="Yap"
     Check1.caption="Başlat menüsüne ekle"
     Check2.caption="Masa üstüne ekle"
     olacak şekilde properties penceresinden düzenleyin

     f) Formun kodları aşağıdaki gibi olsun;

Option Explicit
 
Sub KisaYoluYap(Grup$, Dosya$, Kisayol$)
    Dim Tanitici$, KDosya$
    Tanitici = Kisayol
 
    'Başlat menüsünün yeri
    KDosya = GetString(HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", _
    "Programs")
    SonunaFlashEkle KDosya
    KDosya = KDosya + Grup
    SonunaFlashEkle KDosya
    KDosya = KDosya + Tanitici + ".lnk"
    If DosyaVar(KDosya) Then
        'Aynı kısayol varsa sil
        Kill KDosya
    End If
 
    DoEvents
 
    KisayolYap Label1, Grup, "", "", 2
    KisayolYap Label1, Grup, Dosya, Tanitici, 1
 
    DoEvents
 
    If DosyaVar(KDosya) = False Then
        MsgBox ("Kısayol oluşturulamadı!")
        Exit Sub
    End If
 
    'Masaüstüne ekle
    If Check2.Value = 1 Then
        Dim Masa$
        'Masaüstünün yeri
        Masa = GetString(HKEY_CURRENT_USER, _
"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", _
        "Desktop")
        SonunaFlashEkle Masa
        Masa = Masa + Tanitici + ".lnk"
        If DosyaVar(Masa) Then Kill Masa
        FileCopy KDosya, Masa
        DoEvents
    End If
 
    'Başlat menüsünden sil
    If Check1.Value <> 1 Then
        DoEvents
        Kill KDosya
    End If
    DoEvents
    WindowsPencereKapat Grup, Me.hwnd
End Sub
 
Private Sub Command1_Click()
    If Check1.Value = 1 Or Check2.Value = 1 Then
        KisaYoluYap Text2, Text3, Text1
    End If
End Sub
 
Sub SonunaFlashEkle(Metin As String)
    If Len(Metin) = 0 Then Exit Sub
    If Right(Metin, 1) <> "\" Then Metin = Metin + "\"
End Sub
 
Function DosyaVar(sFileName As String) As Boolean
    If Len(sFileName) = 0 Then
        DosyaVar = False
        Exit Function
    End If
    If Len(Dir(sFileName)) Then
        DosyaVar = True
    Else
        DosyaVar = False
    End If
End Function

     Kolay gelsin...

 

Sisteme active-x (ocx) kaydı ...

 

     Visual basic ile yapılan programlarda ocx kullanmış iseniz bu programların başka bilgisayarlarda çalışması için ciddi bir sorunla karşı karşıyasınız demektir.
     En iyi çözüm programın visual basic ile gelen "setup wizard" kullanılmak suretiyle taşınmasıdır ki bu da gerçekte 10-100 Kb gibi küöük bir boyutta bulunan programlarınıza ek olarak 1.400 Kb boyunda çirkin bir ek demektir.
     Eğer ocx'leri hedef sisteme kaydettirebilirseniz bu sorundan kurtulursunuz.
     Bunun için ise kullanılan yöntemlerden biri visual basic ile birlikte gelen "regsvr32.exe" dosyasını kullanmaktır. Bu program kendisine parametre olarak verilen ocx dosyasını sisteme kayıt işlemlerini yapar. Tam kullanımı için dos satırında "regsrv32 /?" komutunu kullanabilirsiniz.
     Ancak bu yöntem de -hedef bilgisayara "regsrv32.exe" dosyaının taşınması- profesyonel bir yaklaşım olmaz. Aslında her ocx içinde kendi kendini sisteme kayıt ettirme ve sistem kaydından çıkarma yordamları vardır. Bu yordamları kullanmamız gerekir.
     Her ocx dosyasında; sisteme kayıt için;
     DllRegisterServer Lib "Ocxismi.Ocx" () As Long

     Ve sistem kaydından çıkarmak için;
     DllUnregisterServer Lib "Ocxismi.Ocx" () As Long

yordamları bulunmaktadır.

     Örnek olarak; visual basic grid kontrolü kullanarak yaptığımız programı başka bir bilgisayara nasıl taşıyacağımızı görelim (Bu örnekte takıldığınız konuları dökümanlar ve api örenkleri bölümünde bulabirsiniz).
     1) "MsFlxGrd.Ocx" dosyasının içinde olduğu bir resource dosyası oluşturup bu dosyayı projemize dahil ediyoruz.
     2) Programımız bir form ile başlamıyor. Bunun için bir modül ekleyip bu modüle bir "sub main" yordamı ekliyoruz. Project/Properties menüsünden "startup object" olarak "Sub Main'i" seçiyoruz.
     3) Projeye ikinci bir modül daha ekliyoruz. Bu modülün amacı ocx'i sisteme kaydettirmek veya gerekirse silmek. Bunun için neden ikinci bir modül gerektiği konusu önemli. Çünkü biliyoruz ki "MsFlxGrd.Ocx" dosyası hedef bilgisayarda yok. Bu nedenle "MsFlxGrd.Ocx" kullandığımız her kod parçası hata verecek. Bunu önlemek için "Sub Main" yordamanın olduğu içinde "MsFlxGrd.Ocx" dosyasından hiç bir şey bulunmayan bir modül herşeyden önce çalışacak, Bizim ocx dosyamızı resource dosyadan söküp windows/system klasörüne kopyalayacak. Bundan sonra bu ocx'i sisteme kaydettirecek ve daha sonra programın ana formunu gösterecek.
     "Sub Main" içinde ocx sistem klasörüne kopyalandıktan sonra Ocxkaydet fonksiyonu çağrılmalıdır. "OcxKaydet" fonksiyonu ise ikinci modül içine; aşağıdaki gibi yazılabilir.

Private Declare Function DllRegisterServer Lib _
"MsFlxGrd.Ocx" () As Long
Private Declare Function DllUnregisterServer Lib _
"MsFlxGrd.Ocx" () As Long
 
Sub OcxKaydet()
    DllRegisterServer
End Sub
 
Sub OcxSil()
    DllUnregisterServer
End Sub

     Tekrarlamak gerekirse; program bir modül ile başlamalı, bu modülde ocx'e ihtiyaç duyan hiç bir kod parçası bulunmamalı. Bu modül ortamı hazırladıktan sonra ocx'e ihtiyaç duyan diğer modül veya formlar çalıştırılmalıdır.

Tek bir exe ile dünya kadar ...

 


     Resource Dosyası Nedir?
     Kurma programlarında görmüşsünüzdür. Tek bir exe dosya ile bir sürü dosya taşınır. Başka bir ifade ile tek bir dosyanın içine yüzlerce dosya gömülüdür. Bir dosya içine bir birinden bağımsız birden fazla dosya gömmenin ve daha sonra ihtiyaç olduğunda bu dosyaları oradan çıkartmanın standart haline gelmiş bir yöntemi vardır.
    Eklenecek dosyalar önce bir dosyada toplanır. Bu ön toplama sonucunda oluşan dosyaya resource dosya denir. Resource dosya projeye eklenir. Proje derlenip çalıştırılabilir bir program (*.exe) oluşturulduğunda resource dosya içindeki dosyalar da artık .exe uzantılı programın içinde gömülü durmaktadır.
    Bu yazımız ile resource dosyanın oluşturulması, projeye dahil edilmesi, proje ile exe yapıldıktan sonra, programın gittiği yerde exe içinde gömülü duran bu dosyaların kullanılması anlatılacaktır.
    Konunun daha iyi anlaşılması için ayrıca örnek de verilecektir. Verilecek bu örnekte "c:\belgelerim\dene.doc" ve "c:\windows\media\dene.wav" isimlerinde iki adet dosyanızın olduğu varsayılacaktır.

     Resource Dosyası Nasıl Yapılır?

         Visual Basic Sürüm 6.0'da
         Eğer Visual Basic'in 6.0 versiyonunu kullanıyorsanız işiniz kolay. "Add-Ins/Add-In Manager" menüsünden "Resource Editor" seçeneği işaretleyin ve "Ok" buttonunu tıklayın. Sonra yine "Add-Ins" menüsünde açılacak olan "Resource Editor" menüsünü seçin çalışacak editör programı ile istedğiniz gibi bir resource dosyası oluşturun bu dosyaya isterseniz resim, isterseniz ikon, isterseniz text, isterseniz exe dosya ne isterseniz ekleyin ve kaydedin. Örneğimizde sözü edilen "c:\belgelerim\dene.doc" ve "c:\windows\media\dene.wav" isimli iki adet dosyayı eklediğinizi ve bu dosyayı "dene.res" ismiyle kaydettiğinizi varsayalım.

         Visual Basic Sürüm 5.0'de
         Eğer Visual Basic'in 5.0 versiyonunu kullanıyorsanız visual basic'in kurulduğu yerde bulunan (genelde "C:\Program Files\DevStudio\VB\Wizards\" isimli klasörde) Rc.Exe ve Rcdll.Dll isimli dosyaları kullanacağız.

         a) Bir text editör yardımıyla (windows not defteri olabilir);
     1 DocDosya "c:\belgelerim\dene.doc"
     2 WavDosya "c:\windows\media\dene.wav"
yazalım ve bu dosyayı "dene.txt" olarak "Rc.Exe" ile aynı dizine kaydedelim.

     Ara açıklama:
     Yukarda bulunan "1" ve "2" resource dosyaya gömülecek olan dosyaların index numarasıdır. Her veri tipi için bu numaradan sadece bir tane olabilir.

     Yukarda bulunan "DocDosya" ve "WavDosya" resource dosyaya gömülecek olan dosyaların tipini belirler. 14 farklı tipde olabilir. Bu tiplerin biri hariç hepsi aynı yöntemle kullanılır. Sadece STRINGTABLE DISCARDABLE tipi başka bir formatta kullanılır.

     Yani diğerleriyle birlikte format şu şekildedir:

        Index     Tipi    Dosya Adı
          1       CURSOR  "Dene.Ico"
          2       CURSOR  "Baska.Ico"
          n       CURSOR  "n.ico"
          1       BITMAP  "Dene.Bmp"
          2       BITMAP  "Başka.Bmp"
          n       BITMAP  "n.Bmp"
          STRINGTABLE DISCARDABLE
          BEGIN
               1 "Bu bir metin indexi 1"
                2 "Bu da bir metin ancak indeksi 2"
          END

         Bu konuda daha geniş açıklamayı visual basic yardımında bulabilirsiniz.

         b) "Rc.Exe" için bir kısayol oluşturalım ve bu kısayolun hedefine "RC.EXE" den sonra gelmek üzere bir boşluk bırakıp "Dene.Txt" yazalım. Böylece Rc.Exe'ye "Dene.Txt" isimli dosyamızı parametre olarak vermiş olduk. Kısayolu çalıştıralım. Eğer herşeyi düzgün yaptıysanız, aynı dizinde bu kez "Dene.Res" isimli bir dosya oluşmuş olmalıdır. İşte ".res" dosyamız budur.

     Resource Dosyası Projeye Nasıl Eklenir?
     Visual basic'in "Project/Add File" menüsünden oluşturduğunuz resource dosyanızı (örneğimizdeki adı "dene.res") projeye ekleyebilirsiniz. Bu işlemden sonra "project" penceresinde "Related Document" içinde (*.res) dosyanız görülecektir.

     Taşınan Dosyaları Sonra Nasıl Çıkartabiliriz?
     Az önce "dene.res" isimli resource dosyasını eklediğimiz projenin örneğin Form_Load olayına aşağıdaki kodu yazın;

Private Sub Form_Load()
        Dim Oku1 As String
        'Doc dosya sökülüyor
        Oku = StrConv(LoadResData(1, "DocDosya"), vbUnicode)
        Open "c:\deneme.doc" For Binary As 1
        Put 1, , Oku
        Close 1
        'Wav dosya sökülüyor
        Oku = StrConv(LoadResData(2, "WavDosya"), vbUnicode)
        Open "c:\deneme.wav" For Binary As 1
        Put 1, , Oku
        Close 1
End Sub

     bu durumda projeyi çalıştırdığınızda "c:\deneme.doc" ve "c:\deneme.wav" isimli iki adet dosyanız olur ve bu dosyalar "dene.res" isimli dosyanın içine aldığımız "c:\belgelerim\dene.doc" ve "c:\windosw\media\dene.wav" isimli dosyaların bire bir aynısıdır.

     Aynı yöntemle yüzlerce dosya taşınabileceğinizi belirtmemize gerek var mı? Dene.txt içersine ne kadar dosya isterseniz yazabilirsiniz.

     Burada örneklediğimiz yöntem windowsun bütün dosya türleri için geçerlidir. Ek olarak resim ve simge (ikon) dosyaları ile metinlerin gömülmesi ve sökülmesinde daha farklı yöntemlerin de söz konusu olduğunu belirtelim.

Metin kutusundaki şifreyi öğrenme ...

 

     Metin kutusunda şifre vardır, ama size ***** şeklinde görülürler. Böyle bir durumda şifreyi öğrenmek için sırasıyla bilinmesi gerekenlerden bahsediyoruz.

     Arka planda çalışan program yapmak için
     Göreceğiniz metin kutusu başka bir programda çalışıyor olacaktır. Bu program büyük olasılıkla kendini en üste tutmaya çalışacak ve sizin programlarınız pasif bir şekilde çalışmadan bekliyor olacaktır. Hangi koşulda olursa olsun programınızın çalışması için ona bir timer nesnesi eklemeniz ve bu timer nesnesinin interval değerini 0'dan farklı bir değerle değiştirmeniz gerekecektir. Diğer taraftan programın çalışma sonuçlarını ana formun caption özelliğine eklerseniz, programınız araç çubuğunda pasif haldeyken dahi size sonuçları bildirecektir.
     Örneklersek;
1) Yeni bir proje başlatıyoruz,
2) Forma bir timer nesnesi alıyoruz,
3) Timer nesnesinin interval özelliğini 100 yapıyoruz (her 1/10 saniyede çalışması için),
4) Şu kodu yazıyoruz,

Private Sub Timer1_Timer()
    Caption = Time
End Sub

5) programı çalıştırıyoruz...
Artık diğer programlar çalıştırılsa bile bile bizim programımız arka planda çalışmaya devam edecektir. Ve biz zamanı (veya sizin bağlacağınız herhangi bir sonucu) görev çubuğunda görebileceğiz.

     Kursorun üzerinde bulunduğu nesnenin handle numarasını öğrenmek
     Windows her nesneye bir handle numarası (tutamaç) verir. Ve nerdeyse tamamen handle numarası ile çalışır. Bu nedenle iyi bir programcının handle numarası kavramına yabancı olmaması gerekir. Bir nesnenin handle numarasını öğrendiniz mi o nesne artık sizin demektir. "WindowFromPoint" apisi koordinatları verilen her nesnenin handle numarasını geri döndürür.
     İşin püf noktası nesnenin koordinatlarını öğrenmektedir. Bunun için de fareyi kullanacağız. Fareyi nesnenin (örneğimizde metin kutusunun) üzerine götürüp, farenin koordinatlarını "WindowFromPoint" apisine parametre olarak verebiliriz.
     Buna göre; yukarda verdiğimiz örnekteki timer olay kodlarını;

Private Sub Timer1_Timer()
    GetCursorPos Fare
    HandleNo = WindowFromPoint(Fare.x, Fare.y)
    Caption = CStr(HandleNo)
End Sub

şeklinde yazabiliriz. Bu kodlar farenin üzerinden geçtiği bütün nesnelerin handle numaralarını bize verecektir.

     Handle numarası verilen nesnedeki texti öğrenmek
     Handle numarasını öğrendiğimiz her nesne için her türlü işlemi yapabiliriz. Örneğimizde, sadece bu nesnenin içerdiği texti öğreneceğimize göre bunun için "SendMessage" apisini kullanabiliriz.
     "SendMessage" apisi 4 parametre alır. Bunlardan birincisi mesajın gönderileceği nesnenin handle numarasıdır. İkinci parametre gönderilecek mesajın numarasıdır. Üçüncü parametre ise bir değer, dördüncü parametre de başka bir değer içerir. Örneğin bir nesneye tuş vuruşu göndermek için sendmessage kullanıldığında; birinci parametre hedef nesnenin handle numarası, ikinci parametre tuş vuruşunun numarası, üçüncü parametre tuşun kodu olur. Dördüncü parametrenin bu örnekte önemi yoktur. Önemi olmayan paranetreler sıfır (0) değeri alırlar.
     Bizim örneğimizde ise; ikinci parametre, yani nesnedeki textin uzunluğu öğrenme istem numarası 14'dür.

Dim Boy As Long
Boy = SendMessage(HandleNo, 14, 0, 0)

kodları bize handle numarası verilen nesnedeki textin uzunluğunu verir.
     Textin uzunluğunu öğrendikten sonra yine "SendMessage" apisini kullanacağınız. Ancak bu kez; İkinci parametremiz, 13 olacak (yani textin kendisinin istem numarası), üçüncü parametremiz, textin boyu, dördüncü parametremiz ise textin okunacağı belleğin adresi olmalıdır.
     Netice olarak tam kod aşağıdaki gibidir.

Option Explicit
Private Type Yerler
        x As Long
        y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" _
        (lpPoint As Yerler) As Long
Private Declare Function WindowFromPoint Lib "user32" _
        (ByVal xPoint As Long, _
        ByVal yPoint As Long) As Long
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 Sub Timer1_Timer()
    Dim Fare As Yerler
    Dim HandleNo As Long
    Dim Boy As Long, Oku As String
 
    GetCursorPos Fare
    HandleNo = WindowFromPoint(Fare.x, Fare.y)
    Boy = SendMessage(HandleNo, 14, 0, 0)
 
    Oku = Space(Boy + 1)
    Call SendMessage(HandleNo, 13, ByVal (Boy + 1), ByVal Oku)
    Caption = Oku
End Sub

     Bu kod parçası; farenin üstünde bulunduğu, içersinde şifre olan ve size ***** şeklinde görülen metin kutusu içindeki şifreyi açık bir şekilde formunuzun başlığına yazar.

 

 

 

Microsoft SQL Veritabanina Nasil Kayit Eklersiniz veya Guncellestirirsiniz

Bu makalenin amaci sizlere  verilerin nasil Microsoft SQL veritabanina aktarildigini gostermektir. Asagidaki kod Nortwind veritabanina bir kayit eklemek veya guncellestirmek icin kullanilabilir. SqlConnection objegi ile ilgili bilgi almak isterseniz  http://www.csharpturk.com/WebArticleDetails.aspx?ArticleID=15 adresinde  SqlConnection hakkinda aciklamalar bulabilirsiniz. Bugun sizlere SqlCommand objeginden bahsetmek istiyorum.

using System;

using System.Data;

using System.Data.SqlClient;

class Veri

{

     public void Execute(String SQLStatement)

    {

              SqlConnection conn= new SqlConnection();

             conn.Open();

             conn.ConnectionString="server=econ-l;uid=sa;pwd=;database=northwind";

             SqlCommand comm=new SqlCommand();

            comm.Connection=conn;

            comm.CommandType=CommandType.Text;

            comm.CommandText=SQLStatement;

            comm.ExecuteNonQuery();

    }

}

SqlCommand objegini veritabanina karsi islem yapmak icin kullanabilirsiniz. Soyleki, diyelimki veritabanina bir kayit eklemek istiyorsunuz

veya kayitlari guncellemek istiyorsunuz veya kayitlari ekrana getirmek istiyorsunuz. Bu durumlarda SqlCommand objegini kullanmaniz gerekmektedir.

SQLStatement soyle olabilir bu method icin. Asagidaki SQL komutu musteri tablosuna bir kayit ekler

SQLStatement ="INSERT INTO musteri (MusteriKodu,MusteriName) VALUES(1,"Levent Camlibel")";

asagidaki kod la musteri tablosundaki musteri kodu 1 olan kayiti guncellestirir.

SQLStatement ="UPDATE musteri SET MusteriName="Levent" WHERE MusteriKodu=1");

en azindan bir fikir sahibi oldunuz. Simdi SqlCommand'in kullandigimiz bolumlerini aciklayalim.

comm.Connection=conn; Bu satir ile SqlCommand objeginin conn baglanti objegini kullanmasi soyluyoruz.

 comm.CommandType=CommandType.Text;

=CommandType.StoredProcedure;

=CommandType.TableDirect

CommandType uc deger alabilir yukarida gordugunuz gibi. yukaridaki kod da biz SQLStatement kullandik yani  CommandType.Text. Eger  Bellenmis yordam kullanirsaniz CommandType.StoredProcedure kullanmaniz gerekir. Eger tablo veya tablolari  kullanmak  isterseniz CommandType.TableDirect i kullanabilirsiniz.

 comm.CommandText=SQLStatement;   Bu satir ile SqlCommand objeginin neyi calistiracagini soyluyoruz. Yukaridaki SQLStatement orneklerine bakarsiniz, ne demek istedigimi anlarsiniz

comm.ExecuteNonQuery();  Bu satir ile SqlCommand objegini calistirirsiniz. ExecuteNonQuery geriye sadece kac tane kayitin etkilendigini gosteren rakamla doner. Eger kayit eklerseniz, Bu satirin geriye getirdigi sadece 1 olacaktir.

Gordugunuz gibi olay basit. .NET ortami yazilim gelistiricilerini isini cok kolaylastiriyor.

sorunuz olursa, leventc@clemson.edu adresine yollayin.

COMMON DIALOG KONTROL

 

   

 

Name

Objeninin proje içinde kullanılacak ismidir.

CancelError

-

Color

Renk paletinde seçilen renk bu değişkende tutulur.

Copies

Yazdırılacak sayfa sayısını belirlemek için kullanılır.

DefaultExt

-

DialogTitle

Aç-Kaydet diyalog kutularının başlıklarını belirler.

FileName

Aç diyalog kutusu tarafından açılan dosyanın yolu burada tutulur.

Filter

Açılacak ve kaydedilecek dosya türleri bu değişkenle tanımlanır.

FilterIndex

-

Flags

Diyalog menülerinin açılma şekli bu değişkenle belirlenir.

FontBold

Yazının kalın veya ince olmasını sağlar.

FontItalic

Yazının yatık bir şekilde olmasını sağlar.

FontName

Yazının hangi fontta yazılacağını belirler.

FontSize

Yazının büyüklüğünü belirler.

FontStrikeThru

Yazının üzerine cizgi konulup-konulmamasını belirler.

FontUnderLine

Yazının altına cizgi konulup-konulmamasını belirler.

FromPage

Yazdırmaya başlanacak sayfa numarası belirler.

HelpCommand

-

HelpContext

-

HelpFile

Açılacak yardım dosyasının yolunu belirler.

HelpKey

-

Index

-

InitDir

Aç-Kaydet diyalog kutularının hangi adresten açılacağı bu değişkenle belirlenir.

Left

-

Max

-

MaxFileSize

Seçilebilecek maksimum dosya sayısıdır.

Min

-

Orientation

Yazdırılacak grafik seçimi yapmak için kullanılır.

PrinterDefault

Yazıcının aktif olup olmadığını belirler.

Tag

-

Top

-

ToPage

Yazdırılacak kalan sayfa sayısını belirler.

 

Gelen e-maillerin birçoğunda yeni başlayanlara neler önerebileceğim soruluyor
bazı kişiler de nereden başlamaları gerektiğini bilmediklerini, bu konuda neler önerebileceğimi öğrenmek istiyorlar.
Öncelikle şunu belirtmek isterim ben programcılık konusunda akademik düzeyde eğitim almadım. Basic programlama diline bir hevesle başladım ve tırnaklarımla kazıyarak birşeyler öğrendim Ancak öğrendiklerimi hiçbir zaman yeterli görmüyorum ve çok bilgili olmadığımı da biliyorum. Benim önerilerim, benim ilk baştaki durumumda olup henüz nereden başlaması gerektiğini bilmeyenlere yöneliktir. Benim avantajım, programcılık mantığını "sokaktan" öğrenmiş olmamdır. Birçoğunuz da benim durumumda olduğunuza göre, işte size önerilerim

1. En güzel ve doyurucu kaynak - program kodlari ve örnekli açiklamalar -
kesinlikle VB5 ile gelen Book Online ve F1 help dosyalaridir. Ben tüm
bilgimi help dosyalarini okuyarak edindim. Tabi bu öneri
Ingilizce'ye hakimseniz geçerli. Benim bu konuda hiçbir problemim yok. Zaten
sanirim bu yüzden programcılık ve programlama terimleri bana yabancı gelmiyor.

2. Help dosyalarindan baska bence en iyi kaynak internet siteleri. Basta
Microsoft sayfaları olmak üzere... Ayrıca fazla havalanmaya gerek yok, benim
sayfam da gitgide gelisen bir kaynak... Yabancı kaynaklardan bulduğum
dokumanlari Türkçe'ye çevirerek sayfamda yayınlıyorum. Ve bu iş sürekli
devam ediyor.

3. Hazır program kodlarını incelemek, yap-boz yaparak (yanı kodları
kurcalayarak) işin aslına inmek... Benim sayfamdan su anda değisik
seviyelerde yüzlerce full kod indirebilirsiniz.

4. Önce ne yapacagına karar vereceksiniz. Eğer bir program geliştirmek istiyorsanız, program ne konuda olacak? Benim önerim genelde basit (yani içinde 5-10 girdi bulunan) bir adres-tel defteri gelistirmek. Bu isi veritabani gelistirerek
yapamazsanız, random access dosya türü kullanmakla ise başlayabilirsiniz. Bu
konudaki örnegi Random Access  sayfasından alabilirsiniz.
Ayrıca şunuda belirtmek isterim: Amaçsızca konudan konuya gezinerek, ne yapsam acaba diye düşünmektense, karar vermek ve bir konu üzerinde yoğunlaşmak gerekir
Ancak bu yolla düzenli çalışmaya ve adım adım öğrenmeye başlarsınız. Size SüperKayıt
örneğini vermek istiyorum. O programı yazmaya karar verdiğimde bildiğim iki komut
vardı: Print ve Input... Süperkayıt tam bir sene boyunca sürekli yazıldı ve sürekli gelişti
Ben bir sene boyunca tüm enerjimi ve merakımı QBasic'e ayırdım. Önüme çıkan her yeni konu yani her engeli "Kesinlikle aşacağım!!!" diyerek azmederek aştım. SüperKayıt şu anda Ankara Üniversitesi İngilizce Hazırlık Okulu Öğrenci İşleri Biriminde yıllık 1000 adet  öğrencinin işi için kulllanılıyor. Kapasitesi bu değil binlerce öğrenci için de kullanılabilir.

5. Visual Basic gibi kapsamlı ve insanı kolayca yutacak ve kafasını karıştıracak bir programalama ortamından ziyade kolay bir ortam olan Qbasic ile çalışmaya başlamanızı öneririm. Qbasic ücretsiz bir basic programları geliştirme ortamıdır. Yeni başlayan herkese yetecek düzeydedir. Ancak VB gibi nesneleri yoktur ve kodlar satır satır okunur ve çalışır. Ancak sub ve function lar yazabilirsiniz. Basic dilini öğrendikten sonra Vİsual Basic artık çocuk oyuncağı Evet bu benim tarzım. Ben böyle yaptım Qbasic'ten sonra İlk kez VB karşısınsa oturduğumda biraz anlaşılmaz geldi ama, kime gelmez ki.. yeni olduktan sonra... Ancak bir saat içinde İlk minik programımı yazmıştım bile. Sonuçta (temel anlamda) Basic her yerde Basic'tir.

6. Yılmak ve sıkılmak yok! Her önünüze çıkan engeli mutlaka aşacağınızı
bilmelisiniz: Bu bir gerçek ve kesinlikle yerinizde saymazsınız; mutlaka
ilerlersiniz. Deneyin... mutlaka göreceksiniz... Kolay gelsin!

Visual Basic Nedir?

 

Yeni başlayanlara kısa Visual Basic tanıtımı

 

Microsoft firması tarafından geliştirilen Visual Basic, atası olan QBASIC derleyicisinin geliştirilmiş ve Windows ortamına uyarlanmış olan sürümü olarak adlandırılabilir. Windows ortamına uyarlandığı için de Nesneye Yönelimli bir dildir. VBX kontrollerini destekleyen ilk dillerden biridir. VBasic'de, 1.0 sürümünden 6.0 sürümüne kadar bir çok yenilik ve değişiklik olmuştur. Bunlardan biri de, arayüzünün güçlü ve etkili bir görünüm kazanmasıdır. Visual Basic, devamlı geliştiği bu süre sonunda yüksek hızlı uygulamalar, OLE serverlar, ActiveX kontrolleri ve daha bir çok şey geliştirilebilecek hale gelmiştir.

Microsoft Windows için program geliştiren programcıların yüzde yirmibeşi Visual Basic'i tercih etmektedirler. Visual Basic'i en popüler programlama dillerinden biri yapan en önemli nedenlerden biri de büyük olasılıkla kolay olmasıdır. Visual Basic de program yazmak için çok fazla teknik bilgiye sahip olmak gerekmez. Sadece kontrolleri form üzerine yerleştirmek ve kodu yazmak yeterli. Kısaca Visual Basic, programcıyı, programın kullanıcıya yansıyan şekli için kod yazmak zorunda bırakmayan bir dildir.

Zamanla Microsoft dışındaki bazı şirketler tarafından benzer programlama dilleri geliştirildi. Muhtemelen bunların en popüleri Borland Delphi'dir.

İşte Visual Basic'in 5.0 sürümüne eklenen en önemli değişiklik ve yenilikler:



Derlenme işlemci tipine, hızına ve program büyüklüğüne göre optimize ediliyor.
Tekrar tasarlanmış form derleyici
3 Boyutlu grafik desteği
Visual C++’daki gibi sınıf, form ve kontrol "büyücüleri" (wizard)
Otomatik kod tamamlama
Birden çok veritabanı desteği
Animasyonlu GIF’leri destekleyen kontroller
Resim kontrolü JPEG formatını destekliyor
Birden çok kaynak dosyasını destekliyor.
Fonksiyon adresleme
Visual C++ ‘ın 4.x sürümündeki sürükle ve bırak destekli düzenlemeyi destekliyor.
Windows tabanlı ActiveX kontrollerini yaratmak için yeni derleyici
OCX kontrollerini yaratma imkanı !
Ağ üzerinde OLE
Yeni kullanıcı arabirimi ve ActiveX desteği
Birden çok projeyi kontrol edebilen proje penceresi
16 Bit uygulama yaratılamıyor...
Visual C++ Developer Studio tabanlı yeni arabirim
Visual Basic formlarını otomatik olarak HTML sayfasına çevirebilme imkanı
Internet üzerinde bulunabilen TCP/IP kontrollerini tanıyabiliyor
Kullanıcı arabiriminde projenin hiyerarşisini görüntüleyen bir pencere var
Yığın olarak güncellenen geliştirilmiş RDO (Remote Data Objects)
Yazım hatası yaptığınızda o komutu nasıl kullanacağınıza dair ipuçları veriliyor.
Yeni komutlar (Debug.Assert, AddressOf...) ve veri tipleri (Decimal Variant...)
Derleyici artık bir çok derleme opsiyonu sunuyor.
Çok hızlı ve küçük EXE’ler oluşturuluyor!

Visual Basic çalışma ortamı

 

Yeniler için VB çalışma ortamı ve menü elemanları anlatılıyor.

 

   
       

   Visual Basic olay temelli bir programlama dilidir; bunun anlamı şudur: kullanıcı tarafından gerçekleştirilen işlemlere göre programın yanıt vermesi ,yada şöyle diyelim, programın bazı olaylar ortaya çıkarmasıdır. Bir form kapatılırken birkaç tane olay meydana gelir, örnek olarak, bir textbox'a bir harf girilmiş ise CHANGED olayı meydana gelir ve programcı bu olayın meydana gelip gelmediğini kontrol eden ufak bir kod yazarak kullanıcının yazılanları kaydedip etmediğini kontrol edebilir. Konu ile ilgili detaylı bilgi için Olay Yönlendirmeli Programlama Sayfasını ziyaret ediniz.

          Program yazmak için kullanılan Visual Basic editör ve derleyicisinin kullanıcı arayüzüne gelince, yazmaya başlıyacağımız her program bir proje olarak başlatılır. Her projede en az bir form bulunur. Uygulama içinde bulunan her nesne bu formun üzerine yerleştirilir. Kullanıcının birebir etkileşim halinde olacağı kısım formlardır. Form üzerine yerleştirilecek her nesne programcı tarafından isteği üzerine yerleştirilir. Yeni bir projenin adı program tarafından Project1 olarak konur, proje içinde bulunan formun başlangıç adı ise Form1 olur. Bunlar daha sonra değiştirilebilir. Form üzerine yerleştirilen nesneler toolbox (alet kutusu) penceresinde yeralır. Bir nesne toolbox ta seçildikten sonra , form üzerinde nereye yerleştirilecekse o noktaya fare yardımıyla taşınır, çekilerek istenilen boyutlara getirilir.

         Burada gördüğünüz Visual Basic'in çalışma ortamıdır. İşte bu yazının olduğu yerde kod penceresi ve form düzenleme pencereleri olacaktır. Sağ taraftaki Properties penceresinde aktif konumda olan formun tüm özelliklerini görürsünüz. Sol tarafta Araç Kutusu (ToolBox) vardır. Yukarıda ise Visual Basic menüsünü görüyorsunuz. Bilgi almak istediğiniz resim üzerine tıklayın. Not: Detaylı Project Explorer bilgisi henüz hazır değildir.

 

 

Olay Yönlendirmeli Programcılık Nedir?

 

 

 

Visual Basic için olay yönlendirmeli programlama dili denir. Peki bu olaylar nedir?

 


GİRİŞ:

Belki Windows’a yeni geçiş yapan bir DOS programcısısınız, veya VB’ ye henüz yeni başlamış bir programcısınız. Bu alandaki geçmişinize bakmaksızın, öğrenmeniz gereken en önemli konulardan biri olay sürümlü programlarıdır. Geleneksel programlama işleminde, uygulama başlar (genellikle MAİN procedure ismi ile), bu noktadan program ilerler ve bütün olaylardan sorumludur. Keyboard , mouse girişini, ekran görüntüsünü, ve benzeri tüm olayları kapsamak zorundadır. Artık WINDOWS ve VB bu detayları sizin için düşünmüştür. Hangi uygulamayı yapmak istiyorsanız bu olay üzerine yoğunlaşma imkanını size verir. Örneğin bir düğmeye tıkladığınızda mesaj yazdıran, bir program yazmak istiyorsunuz. DOS tabanlı bir programda; mouse’un konumunu, bir kursör göstermeye, mouse düğmesini tanımlamaya, düğme tıklandığında tekrar tanımlamaya vb. ihtiyacınız vardır. Visual Basic ve windows bu işlemleri çok daha kolay yapmanızı sağlar. Aynı işi yapmak için form üzerine basit bir command button çizin, yapılacak işlemi click olayına yazın. VB ve Windows mouse’u izler ve kullanıcı düğmeye bastığı anda istediğiniz işlemi yürürlüğe koyar. Tek yapmanız gereken düğmenin click olayına gidip orada istediğiniz işlemin kodunu yazmaktadır. Bir olay prosedürü yaratmak ve bunu bir forma veya kontrole eklemek istiyorsanız, sadece code penceresinden formu veya kontrolü "Object" combo boxından seçin , "Proc" combosundan istediğiniz olayı tıklayın.

VB olay prosedürünü sizin için kod penceresinde yaratacaktır. Sizin için geriye sadece olay gerçekleştiğinde meydana gelmesini istediğiniz işlemin kodunu yazmak kalıyor. İşte size ekrana mesaj yazdıran bir olay prosedürü:

Private Sub cmd_Click()
MsgBox "Hello World!"
End Sub

"cmd" düğmesine tıklandığında mesaj kutusu görünecektir. Bu basit konsepti anladıktan sonra VB uygulamalarınız için code yazmaya hazırsınız demektir.

FORM'UN OLAYLARI (FORM EVENTS)

Uygulamalarınızda VB form ve kontrolleri düzinelerce olayı gerçekleştirir. Formlar ve kontroller, hepsinin olayları vardır. Şimdi formların bazı olaylarına göz atalım ve nasıl ne zaman meydana geldiklerini araştıralım.

(Formun olayları: Initialize, Load, Resize, Activate, Paint, QueryUnload, Unload,Terminate)

Form olaylarını gösterebilmek için yeni bir form yarattım ve formun herbir olayına bu kodu yazdım.

Private Sub Form_Load()
Debug.Print "Load"
End Sub

Private Sub Form_Initialize()
Debug.Print "Initialize"
End Sub

.
.
.

Her olay gerçekleştiğinde olayın ismi debug penceresine yazdırılmıştır. Yani her olay kendini debug penceresine yazmıştır. Çıktı şöyle olmuştur:

Initialize
Load
Resize
Activate
Paint
'Burada formu kapattım. Form kapandıktan sonra da bazı olaylar olur:
QueryUnload
Unload
Terminate

Yukarıda gerçekleşen form olayları (Form Events) gösterilen sırada olur.
Formun Click olayı gibi başka olayları da var tabii ki ama onlar kullanıcı tarafından meydana getirilen olaylardır.

Aşağıdaki sıra bir formda her zaman oluşan ve meydana geliş sırasıdır. Bir form ekranda görünür hale gelirken sırayla bu olaylar oluşur:

--------Initialize (başlama)
Bu olay form yülendiğinde, load’dan önce meydana gelir. Formun yüklenmesi için gereken datanın kullanıma uygun hale gelmesini sağlar.

--------Load (yükleme)
Load genellikle formun özel (private) data, kontrol dizileri (control arrays) tasarım zamanı değil de çalışma (runtime) sırasında tasarlanan elemanları gibi dinamik komponentlerinin başlatılması için kullanılır.

--------Resize (tekrar boyutlandırma)
Bu olay (ekranı kapla, minimize, simge durumuna küçült vs) veya kullanıcı tarafından formun boyutu değiştirildiği anda meydana gelir. Örneğin eğer metin editörü programlamak istiyorsanız form_resize olayının oluşması halinde metin kutusunu da aynı oranda boyutlandırmalısınız. Bunu yapmazsanız, kullanıcı formu küçülttüğü halde textbox aynı büyüklükte kalacaktır.

--------Activate (Aktif hale getirme)
Bu olay form kontrolü ele geçirdiğinde (form aktif hale geldiğinde) meydana gelir. Form aktif hale geldiğinde çalışmasını istediğiniz bir code’unuz varsa bu olaya yazmalısınız.

--------Paint (Boyama)
Bu olay VB nin tam olarak formu ekrana çizdiği andır. Eğer formun üzerine grafik metodları ile çizim yapacaksanız kod buraya yazılmalıdır.

--------QueryUnload (Formu kapatma sorgusu)
Bu olay form kapatıldığında meydana gelir. Formun nasıl kapatıldığını öğrenebilirsiniz (kendi
kodunuzla, kullanıcı veya windows tarafından) ve kapatma işlemini iptal edebilirsiniz.

--------Unload (Kapatma)
Bu olay form kapatıldığında meydana gelir.

--------Terminate (Yoketme)
Bu olay form yokedildiğinde meydana gelir.

Bir form Terminate olduğunda oluşan üç olay (QueryUnload, Unload, Terminate) karıştırılmaktadır.
QueryUnload üçünün arasında tek iptal edilebilendir. Bu konuda ipucu şudur: Terminate olayı gerçekleşmeden form hafızadan silinmez). Şu iki durumu kıyaslayın:

Unload form1
Set form1 = Nothing

Birinci ifade QueryUnload ve Unload olaylarının meydana gelmesini sağlar. Fakat sadece ikinci ifadede terminate olayını gerçekleştirebilirsiniz. Form değişkenleri, Unload olayından sonra sıfırlanmaz, sadece terminate olayından sonra sıfırlanır (yani form bellekten tamamen silindikten sonra).

KONTROL OLAYLARI:

Kontrol Nedir?

Form, picturebox, textbox, image, commandbutton, data, grid, combobox, label vs gibi kullanıcının
programla iletişime geçmesini sağlayan bir arabirim (interface) oluşturan elemanlardır.

Kontrollerin de olayları vardır, fakat kontrolün tipine bağlı olarak değişik şekilde meydana gelirler. Çoğu kontrolun klavye olayları vardır: KeyUp, KeyDown, KeyPress; yada fare olayları: MouseDown, MouseMove, MouseUp, Click, DoubleClick gibi. Yapmak istediğiniz işlem olayın isminden rahatlıkla anlaşılabilir. Sürükle bırak işlemleri için de olaylar vardır: DragDrop ve DragOver. Bazı farklı kontrol olayları şunlardır.

--------Change: bir kontrolün içeriği değiştiği zaman meydana gelir. Örnek olarak: Textbox'a tek bir karakter bile girildiğinde text içeriği değişmiş olur ve change olayı meydana gelir.

--------GotFocus, LostFocus : Kullanıcı mouse veya klavye ile kontrol üzerine geldiğinde ve kontrol seçili hale geldiğinde GotFocus ve çıktığı zaman LostFocus olayları meydana gelir. Diyelim ki, bir commandbuton'un GotFocus olayına Msgbox "Nesne şimdi seçili!" yazarsanız, o commandbuton herhangi bir şekilde focus alırsa yani seçili hale gelirse o zaman GotFocus içine yazdığınız yukarıdaki basit mesajkutusu kodu çalışacak ve ekranda "Nesne şimdi seçili!" yazılı mesajkutusu çıkacaktır.

--------Link olayları DDE işlemleri için kullanılır.

Bütün kontrol olayları arasında en çok kullanılan click olayıdır. Bir commandbutton yada bir menu kontrolunda click kullanılır

ACCESS PROGRAMCILARI İÇİN ÖZEL NOT
Eğer Access Basic veya makro kullanarak Access programlamada tecrübeli iseniz, form ve kontrollerde BeforeUpdate ve AfterUpdate olayların eksik oldğunu göreceksiniz. Bu kontrolleri kullanmaya alışıksanız; bunları yapmanın farklı yolları:

--------Kontrolün Change olayında olay, kullanıcı yazarken her tuş darbesi ile gerçekleşir.

--------Diğer taraftan Access'te klavye tabanlı kod yazmak zorunda kaldıysanız, VB’de KeyPreview
özelliğini bulacaksınız ki işinizi büyük ölçüde kolaylaştıracaktır.

ToolBox

 

Projelerimize kolayca nesne eklememizi sağlayan ToolBox ve üzerindeki nesneler hakkında bilgi.

 

ToolBox Üzerindeki Standart Kontroller

İmleç

Form üzerine aktarılamayan tek nesne. Form üzerine çizilmiş kontrol nesnelerinin yerini ve boyutunu değiştirmek için kullanılır.

PICTURE BOX

Resim Kutusu . Form üzerine grafikleri göstermek , grafik çizdirmek , diskteki bir resmi yüklemek için kullanılır.

LABEL

Etiket . Bilgi vermek amacıyla kullanılır. Kullanıcı tarafından değiştirilemez metni göstermek için kullanılır.

TEXT BOX

Metin Kutusu . Bilgi girişi veya üretilen bilgilerin gösterilmesi için kullanılır.

FRAME

Çerçeve . Kontroller için görsel ve fonksiyonel anlamda bir grup oluşturma imkanı sağlar.

COMMAND BUTTON

Komut Butonu . Kullanıcı tarafından seçildiği zaman , belirli bir işlemi yerine getirir.

CHECK BOX

Kontrol Kutusu . Kullanıcıya evet/hayır ya da doğru/yanlış gibi seçenekler vermek için kullanılır.

OPTION BUTTON

Opsiyon Butonu . Grup halinde kullanılır. Her buton bir seçeneği temsileder ve bu grup içinden yanlız bir tanesi seçilebilir.

COMBO BOX

Kombine Kutu . Metin kutusu (text box) ve liste kutusunun (list box) üzelliklerini birarada barındırır. Yani kullanıcı metin kutusu gibi içine metin yazabilir ya da liste kutusu gibi , kutu içine yerleştirilen isimlerden istediğini seçebilir.

LIST BOX

Liste Kutusu . Kullanıcının içinden bir veya daha fazla isim seçebileceği bir liste içerir.

HORIZONTAL SCROLL BARS

Yatay Hareket Çubukları . Kullanıcıya , listeler içinde veya büyük miktarda bilgi boyunca yatay hareket imkanı sağlar.

VERTICAL SCROLL BARS

Düşey Hareket Çubukları . Düşey hareket çubukları , yatay hareket çukları için söylenen işlemleri düşey olarak gerçekleşir.

TIMER

Zamanlayıcı . Uygulama esnasında zamana bağlı olarak belirli aralıklarla , belirli eylemlerin gerçekleşmesini denetlemek için kullanılır.

DRIVE LIST BOX

Sürücü Listeleme Kutusu . Uygulama esnasında geçerli sürücülerin bir listesini sunmak ve sürücüler arasında geçiş yapmak için kullanılır. Dizin listeleme kutusunun bir parçası olarak kullanılır.

DIRECTORY LIST BOX

Dizin Listeleme Kutusu . Uygulama esnasında , aktif durumdaki sürücünün yolunu ve dizinlerini görüntüler

FILE LIST BOX

Dosya Listeleme kutusu . Verilen bir dizin içindeki tüm dosyaları listeler.

SHAPE

Şekil . Tasarım veya çalışma zamanında form üzerine , kare , daire , elips , dikdörtgen gibi şekiller yerleştirmek için kullanılır.

LINE

Çizgi . Form üzerine yatay , düşey veya eğik çizgi yerleştirmek için kullanılır.

IMAGE

Görüntü . Bir resmi görüntüleyebilen grafik tipte bir nesnedir. Bu özelliğiyle resim kutusuna benzer. Fakat daha az istem kaynağı kullanır ve mausla tıklandığı zaman komut butonuna benzer özellik gösterir.

DATA ACCESS

Veriye Erişim . Sistemdeki mevcut veri tabanına erişerek , bilgi güncelleme ,edit yada bilgi görüntüleme işlemlerinin yapılabilmesine olanak sağlar.

OLE CLIENT

Ole İstemcisi . Object Linking and Embedding ( Nesneyi Bağlama ve Yerleştirme ) yöntemi . Bu yöntemle proje içine bir Windows uygulama programından ( Word 2000 gibi ) nesneler aktarmak mümkün.

 


VB Menüsü File Elemanı

 

VB Çalışma ortamı File menü elemanlarını tek tek açıklaması.

 

File

New Project

Yeni bir VB projesi başlarmak için kullanılır. Eğer önceden yüklü başka bir proje varsa ve üzerinde bir değişiklik yapılmışsa , son halinin saklanıp saklanmıyacağı sorulur.

Open Project

Daha önceden diske saklamış olduğumuz bir VB projesini yüklemek için kullanırız.

Add Project

VB 6.0 ile 5.0 sürümünde olduğu gibi uygulamalarımıza birden fazla proje ekleyebiliriz. Proje penseresi birden fazla proje içerdiğinde Proje Group olarak değişir.

Remove Project

Aktif uygulamanız içindeki bir projeyi uygulama içinden çıkarmak için kullanılır.

Save Project

Aktif uygulamanız içindeki projeleri ve projeler ile ilişkili tüm dosyaları saklamak için kullanılır.

Save Project As

Daha önce diske saklanmış olan , son hali disktekinden farklı olan tüm bileşenleri yeni bir isimle saklamayı sağlar.

Save <Dosya ismi>

Aktif proje penceresinde seçilmiş olan bir nesneyi diske saklamak için kullanılır.

Save <Dosya ismi> As

Daha önceden diske saklanmış bir dosya yeni bir isimle yeniden saklanabilir.

Print

Aktif fromu , forma bağlı kodları , üzerinde çalıştığınız modülü ya da uygulamanızdaki tüm formları yazıcıya aktarma imkanı sağlar.

Print Setup

Uygulamanızı yazıcıya aktarırken , kullanacağınız yazıcı tipini bilgisayara tanıtma , yazıcıdaki kağıt ve baskı ayarlarını belirtme imkanı sağlar.

Make <Proje_ismi>.EXE

Geliştirmiş olduğunuz projenizi Windows ortamında , VB ortamına ihtiyaç duymadan çalıştırabilir hale getirebilirsiniz.Bu menü seçeneği aynı zamanda ActiveX kontrol projelerini .OCX ve ActiveX kod bileşeni uygulamalarını .DLL uzantılı dosyalara dönüştürmek içinde kullanılır.

Make Project Group

Şayet uygulamanız bir den fazla proje içeriyorsa görüntülenir.

Exit

Visual Basic ortamından çıkmak için kullanılır.

 

VB Menüsü Edit elemanı tanıtımı

 

 

Edit

Undo

Son yapılan değişikliği geri alır.

Redo

Son yapılan işlemi tekrarlar.

Cut

Seçili metnin kesilmesini sağlar.

Copy

Seçili metnin kopyalanmasını sağlar.

Paste

En son kopyalanan veya kesilen metnin yapıştırılmasını sağlar.

Paste Link

Başka bir Windows uygulaması içinden Clipboard'a kopyalanmıi olan verileri , aktif VB uygulaması içine aktarmak için kullanılır. İki uygulama arasında kurulan bir link olduğu için , orjinal nesnenin üzerinde yapılan her değişiklik VB'deki kopyasınada aynen yansımaktadır. Bu menü seçeneği sadece DDE ( Dynamic Data Exchange-Dinamik Veri Değişimi ) özelliğine sahip Windows uygulamaları için kullanılabilir.

Delete Table From Database

Veri tabanından bir tabloyu siler.

Select All

O esnada aktif kod penceresindeki bütün kodu veya form üzerindeki bütün kontrolleri seçmek için kullanılır.

Select All Columns

Diyagramdaki veri kaynağı penceresinde bulunan bütün sütunları seçmek için kullanılır.

Table / Set Primary Key

Seçilen bir sütun için birincil anahtar tanımlar. Birincil anahtar içeren sütunların null karakteri içermesine müsade edilmez.

Table / Insert Column

Tabloya yeni bir alan eklemek için kullanılır.

Table / Delete Column

Tablodan bir sütun silmek için kullanılır.

Find

Bir VB kodu içerisinde bir metni aramak için kullanılır.

Find Next

Arama işlemini , bir önceki aramada belirtilen ifade için ışıklı kalemin kadığı yerden itibaren yeniden başlatır. Eşdeğeri F3 tuşudur

Replace

Bir metin içinde bir sözcüğü aratıp , bulunduğu takdirde başka bir sözcükle değiştirebilme imkanı sağlar.

Indent

Kursörün bulunduğu satırı tab tuşunun belirttiği ölçüde sağa kaydırır. Eşdeğeri Tab tuşudur.

Outdent

Indent menü seçeneğinin gerçekleştirdiği işin tam tersini yapar. Eşdeğeri SHIFT+Tab

Insert File

Aktif kodun içine kursörün bulunduğu noktadan itibaren başka bir dosyada bulunan kodu eklemek isterseniz bu menü seçeneğini kullanmalısınız.

List Properties/Methods

Kod penceresine yazılan her uygun ifadenin ardından bu ifadeden sonra yazılabilecek mümkün diğer ifadeleri içeren bir ardım kutucuğu görüntüler. Bu işlemin kod yazılımı sırasında kendiliğinden gercekleştirilmesi için Tools/Optionsmenü seçeneğiyle açılan Options diyalog penceresinde Auto List Members seçeneğinin işaretlenmiş olması gerekir.

List Constants

Kod penceresinde , yazılan ifadenin alabileceği sabit değerleri içeren yardımcı bir pencere görüntüler.

Quick Info

Kod penceresinde seçilen fonksiyonların , metodların , prosedürlerin ve değişkenlerin yazılımını gösteren yardımcı bir pencere görüntüler.

Parameter Info

Kod penceresinde yazılan fonksiyon veya ifadelerin içerdikleri parametreleri gösteren yardımcı bir pencere görüntüler.

Complete Word

VB yamakta olduğunuz ifadeden kelimeyi bulmay çalışır. Eğer birden fazla alternatif söz konusu ise , bir tanesini seçmeniz için muhtemel , ilk ifadenin seçili olduğu bütün ifadeleri içeren küçük bir pencere açar.

Bookmarks

Program kodunun çok sık kullanıldığı satırlarına kolay bir şekilde ulaşmak için kullanılır.

Toggle Bookmark

Ulaşılmak istenen satır ( kursörün üzerinde olduğu ) bu tür bir amaç için işaretlenir veya işareti iptal edilir.

Next Bookmark

Bir sonraki yer tutamağı ile işeretlenmiş kod satırına ulaşır.

Previous Bookmark

Bir önceki yer tutamağı ile işeretlenmiş kod satırına ulaşır.

Clear All Bookmarks

Aktif kod penceresindeki bütün yer tutamaklarını iptal eder.

 

VB Menüsü View elemanı tanıtımı

 

 

View

Code

Seçilmiş olan form ya da modülün Code penceresini görüntülemek için kullanılır.

Object

Aktif kod ile ilişkili olan nesneyi ( form gibi ) görüntülemek için kullanılır. Eşdeğeri SHIFT+F7

Definition

Kursörün üzerinde bulunduğu , aktif bir prosedüre ait kod penceresini görüntülemek için kullanılır.

Last Position

Kod penceresinde en son bulunduğunuz noktaya yeniden dönmek için kullanılır.

Object Browser

Nesne gözatıcısı penceresi ekrana gelir.

Immediate Window

Hata ayıklama penceresi ekrana gelecektir.

Locals Window

O esnada aktif prosedürdeki bütün değişkenleri ve değerlerini gösterir.

Watch Window

Break modda , daha önceden gözlem amacı ile tanımlanmış değişken yada ifadenin o andaki değerini görüntülemek için kullanılır.

Call Stack

Projeleriniz içinde , o esnada aktif olan prosedür çağrılarının listesini gönderir.

Project Explorer

Project başlıklı pencereyi ekrana getirir. Bu pencerede , o esnada aktif olan projeyi oluşturan dosyaların bir listesini görmek mümkün olmaktadır.

Properties Window

Properties ( Özellikler ) başlıklı pencereyi ekrana getirir. Bu pencerede o esnada aktif olan nesne için geçerli olan özelliklerin bir listesini ve bu özelliklere o esnada stanmış olan değerleri incelemek mümkündür.

Form Layout Window

Layout penceresinde formların ekrandaki pozisyonları mouse yardımı ile ayarlanabilir.

Property Pages

Tasarım ortamında kullanıcı tarafından oluşturulmuş bir kontrolün özelliklerinde değişiklik yapmak amacıyla özellik sayfalarını listeler. Eşdeğeri SHIFT+F4 tuşlarıdır.

Table

Dyagram penceresindeki pencereleri görünür kılmak vaya bu durumu iptal etmek için kullanılır. Query(sorgu) , View(Görüş) ve Veritabanı tasarım pencerelerinde kullanılır.

Zoom

Diyagram penceresini belirtilen oranlarda görüntülemek için kullanılır.

Show Panes

Query(Sorgu) ve View(Görüş) tasarım görüş pencerelerindeki kısımları görüntülemek veya bu kısımların görünmesini iptal etmek için kullanılır.

Tool Box

Araç kutusunu görünür hale getirir.

Color Palette

Seçilmiş VB nesnelerinin renklerini değiştirmek üzere , renk paletini ekrana getirir.

Data View Window

Data view penceresini görüntüler.

Toolbar

VB'in kullandığı araç çubuğu gruplarından biri akranda görüntülenebilir veya ekrandan silinebilir. Customize seçeneğiyle kendi araç çubuğumuzu yapabiliriz.

 

VB menüsü Project elemanı tanıtımı

 

 

Project

Add Form

Aktif formun içine yeni veya mevcut bir form katmak için kullanılır.

Add MDI Form

Multiple Document Interface ( Çok sayıda döküman içeren arayüz ) oluşturulabilir veya mevcut bir MDI formu uygulamaya ekleyebiliriz.

Add Module

Aktif formun içine yeni veya mevcut bir modül katmak için kullanılır.

Add Class Module

Sınıf Modüllü (Class Module) denilen özel tipte bir modül oluşturmak veya mevcut bir sınıf modülü eklemekiçin kullanılır.

Add User Control

Sadece kendi projenizde kullanabileceğiniz ActiveX kontrolleri oluşturmak için kullanılır.

Add Property Page

Yaptığınız ActiveX kontrolleri için özellik sayfası ( Property Page ) oluşturmak için kullanılır.

Add User Document

Projeye yeni bir ActiveX dökümanı eklemek için kullanılır. ActiveX dökümanları Internet Explorer programı ile beraber çalışırlar.

Add DHTML Page

Dinamik HTML uygulamalarımıza yeni dinamik HTML sayfaları eklemek için kullanılır.

Add Data Report

Veritabanı uygulamalarına Data Report eklemek için kullanılır. Data Report , raporların hazırlandığı ve gösterildiği tasarım ekranlarıdır.

Add WebClass

IIS (Internet Information Server) uygulamalarına WebClass nesnesi eklemek için kullanılır. WebClass nesnesi tarayıcının HTTP isteklerine karşılık üretilen ve yine tarayıcıya gönderilen web elemanlarını içerir. WebClass nesnesi web server üzerinde bulunur ve tarayıcıya gönderilecek HTML formatındaki sayfaların hazırlanması için Visual Basic kodlarını kullanır.

Add Microsoft UserConneciton

Uygulamaya UserConneciton nesnesi eklemek için kullanılır. DataEnvironment nesnesine benzer fakat UserConneciton nesneleri RDO ( Remote Database Object ) için kullanılır.

More ActiveX Designers

Projenize ekleyebileceğiniz ActiveX tasarımlarını , içlerinden birisini seçmeniz için listeler. Bu menü komutunu kullanabilmeniz için Project\Components ile açılan Components penceresinde Designers butonu ile listelenen tasarımları seçerek belirtmelisiniz. İlk değer olarak DataEnvironment nesnesi seçili olarak gelir.

Add File

Aktif olan projenize daha önceden hazırlanmış genel maksatlı modüller , formlar , sınıf modülleri ve kaynak dosyalar gibi bileşenleri eklemek için kullanılır.

Remove <Dosya ismi>

Aktif projenizin içindeki bir dosyayı bu proje içinden çıkarma imkanı sağlar.

References

Projeniz içerisine başka uygulama programları yada nesne kütüphanelerinden nesneler katma imkanı sağlar.

Components

VB'te kullanabileceğiniz kontrol nesnelerin sayı ve çeşidini arttırmak ve DLL uzantılı tasarımları projeye eklemek için kullanılır.

Project Properties

Visual Basic projesi ile ilgili düzenlemeler yapmak için kullanılır.

 

VB menü elemanı Format tanıtımı

 

 

Format

Align

Form üzerinde seçilmiş nesnelerin konumunu aşağıda verilen değerlere göre değiştirir.
  Lefts : Seçilmiş nesnelerden en sonuncusu referans alınarak diğerlerinin sol köşe noktası (formun sol tarafına olan uzaklığı) en son seçilmiş nesne ile aynı yapılır.
  Centers : Seçilen nesnelerin orta noktasının formun soltarafına olan uzaklığını, en son seçili nesneninkiyle aynı yapar.
  Rights : Seçilmiş nesnelerden en sonuncusu referans alınarak diğerlerinin sağ köşe noktası (formun sağ tarafına olan uzaklığı) en son seçilmiş nesne ile aynı yapılır.
  Tops : Seçilmiş nesnelerden en sonuncusunun düşey noktası referans alınarak diğerlerinin formun alanının üs tarafına olan uzaklığı en son seçilmiş nesne ile aynı yapılır.
  Middles : Seçilmiş nesnelerden en sonuncusunun düşey noktası referans alınarak diğerlerinin merkez noktasının form alanının üs tarafına olan uzaklığı en son seçilmiş nesnenin merkezininki ile aynı yapılır.
  Bottoms : Seçilmiş nesnelerden en sonuncusunun düşey noktası referans alınarak diğerlerinin formun alanının alt tarafına olan uzaklığı en son seçilmiş nesne ile aynı yapılır.
  to Grid : Seçilen nesnelerin sol üst köşesi en yakın gridin sol üst noktası ile çakışacak şekilde ayarlanır.

Make Same Size

Bu seçenek , seçilen nesnelerin boyutlarında ayarlama yapar. 3 alt menüden oluşur.
  Width : Seçilmiş nesnelerin genişlikleri , son seçilen nesnenin genişliğiyle aynı yapılır.
  Height : Seçilmiş nesnelerin yükseklikleri , son seçilen nesnenin yüksekliğiyle aynı yapılır.
  Both : Seçilmiş nesnelerin boyutları , son seçilen nesnenin boyutları ile aynı yapılır.

Size to Grid

Seçilen nesnelerin köşe ve kenar çizgilerini , form üzerindeki noktalarla çakışır hale getirir. Bu nesnelerin otomatik olarak grid noktalarına yerleşmesi için , Tools/Options menüsünde , General seçeneğinde ki Align Controls to Grid seçeneği işaretlenmiş olmalıdır.

Horizontal Spacing

Seçilen nesnelerin kendi aralarındaki yatay boşluklar aşağıdaki alt menülere göre ayarlanır.
  Make Equal : seçilen nesnelerin kendi aralarındaki yatay boşluklar eşit hale getirilir. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Increase : seçilen nesnelerin kendi aralarındaki yatay boşluklar bir grid hücresinin (form üzerindeki noktalarla oluşturulabilecek en küçük dikdörtgen)eni kadar arttırılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Decrease : seçilen nesnelerin kendi aralarındaki yatay boşluklar bir grid hücresinin eni kadar azaltılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Remove : seçilen nesnelerin kendi aralarındaki yatay boşlukları kaldırılır.

Vertical Spacing

Seçilen nesnelerin kendi aralarındaki düşey boşluklar aşağıdaki alt menülere göre ayarlanır.
  Make Equal : seçilen nesnelerin kendi aralarındaki düşey boşluklar eşit hale getirilir. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Increase : seçilen nesnelerin kendi aralarındaki düşey boşluklar bir grid hücresinin (form üzerindeki noktalarla oluşturulabilecek en küçük dikdörtgen)eni kadar arttırılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Decrease : seçilen nesnelerin kendi aralarındaki düşey boşluklar bir grid hücresinin eni kadar azaltılır. Bu işlem sırasında en soldaki nesnenin pozisyonu değişmez.
  Remove : seçilen nesnelerin kendi aralarındaki düşey boşlukları kaldırılır.

Center in Form

Seçilen nesne grubunu form üzerinde ortalar.   Horizontaly : seçilmiş nesne grubu içinden en sol ve en sağdaki nesnelere göre grup , form üzerinde yatay olarak ortalanır.
  Increase : seçilmiş nesne grubu içinden en üst ve en alttaki nesnelere göre grup , form üzerinde düşey olarak ortalanır.

Order

  Bring to Front : seçimiş olan nesneyi , formda bulunan diğer nesnelerin önüne getirir.
  Send to Back : seçimiş olan nesneyi , diğer nesnelerin arkasına yerleştirir.

Lock Controls

Form üzerindeki kontrolleri bulundukları pozisyonda kilitler. Bu komuttan sonra kontroller form üzerinde hareket ettirilemez. Bu durumun iptali için aynı menü seçeneği tekrar seçilir.

 

VB menü elemanı Debug tanıtımı

 

 

Debug

Step Into

Tasarım esnasında , Visual Basic kodundaki o esnada kürsörün işeret etmiş olduğu komutu çalıştırır.

Step Over

Step Into komutuna benzer. En önemli fark , icra edilen aktif komut , bir prosedür çağırma komutu ise , o prosedür tek bir komut gibi bütünü ile icra edildikten sonra , esas koddaki bir sonraki deyime geçilir.

Step Out

O esnada icra edilen fonksiyonun içinde kursörün işaret etmiş olduğu komuttan itibaren bütün komutlar çalıştırılır ve fonksiyonun çağrıldığı esas kodda bir sonraki deyime geçilir.

Run To Cursor

Programı yeniden başlatarak kursörün olduğu kısma kadar icra ettirilmesini sağlar.

Add Watch

Bir değişken veya ifadenin programın icrası boyunca değerinin izlenmesini sağlar. Bu menü elemanının seçimi ile ekrana bir dialog kutusu çıkar. Expression kısmına izlenecek değişken yerleştirilir. Watch Type (gözlem tipi) kısmı 3 farklı seçenek sunar.
  Watch Expression : İfadenin değeri izlenir.
  Break When Value Is True : İfade TRUE değerini alınca program icrası geçici bir sure için durdurulacaktır.
  Break When Value Changes : İfadenin değeri değiştiği anda break moduna geçilecektir.

Edit Watch

Gözlenen değerler üzerinde değişiklik veya düzeltme yapılmak istenirse kullanılır.

Quick Watch

Break modunda kursörün üzerinde bulunan özelliğin veya değişkenin değerini görüntüleyen bir dialog pencersi görüntüler.

Toggle Breakpoint

Tasarım esnasında kullanılabilen bir komuttur. Kod üzerindeki durma noktalarını bilirtmek için kullanılır.

Clear All Breakpoints

Toggle Breakpoint ile belirtilen bütün durma noktalarını iptal eder.

Set Next Statement

Program icrası kesildikten sonra kullanılır. Bu seçenekle durma noktasından sonra işletilebilir ilk komut işaretlenir.

Show Next Statement

Program icrası kesildikten sonra kullanılabilir. İcra edilecek bir sonraki deyimi gösterir.

 


Programcının Yapmaması Gereken 10 Hata

 

Bir VB programcısı olarak yola çıktınız; ama bu yolda yürümenin kurallarını biliyor musunuz? Bilmiyorsanız bu yazıyı okuyun ve not alın.

 

1.option explicit ifadesini kullanmamak. (option explicit bas modülü içine ilk satıra yazılır ve program içindeki tüm değişkenlerin birer birer tanımlanmasını şart koşar. Programcı örnek olarak Dim sozcuk As String ifadesi ile sozcuk değişkenini programa tanıtmadan bu değişkeni kullanamaz.)

2.Tüm değişkenler ve fonksiyonlar için gereken veri türlerini deklere etmemek.
Özellikle gerekli olan veri türünü deklere etmezseniz tüm türleri içine alan VARIANT
deklere etmiş olursunuz ki VARIANT veri türü 32 byte yer kaplar.

3. Okunması zor kodlar yazmak. (okuyacak kişi bir insan değil derleyicidir.)
2 yada 3 ekrandan fazla prosedür yazmak. (Sub ... End Sub)
Kurallara yada adlandırma ilkelerine uymayan değişken, nesne yada prosedür tanımlamak.
VB'nin tekelinde olan değişken yada nesne adlarını kullanmaya çalışmak.

4. Normalde kullanıcının girmesi gereken değerleri kod içine sabit değerler halinde yazmak (hard-coding). Bunlar bazı sayılar yada dosya yada dizin adları olabilir. Örnek: Her kullanıcı Windows'unu WINDOWS adlı dizine kurmak zorunda değildir (Bu bazen WIN bazen WIN98 vs olabilir)
Programınızı yazarken Windows dizininin adını kendi bilgisayarınızdaki gibi düşünmeyin...

5. Kullanıcının ihtiyaçlarına gereken özeni göstermemek.
Programlama saygınlığına uygun dil kullanmamak. (Siz yerine Sen hitap sözcüğü kullanımı gibi). Kullanıcıya ters gelebilecek hata mesajları vermek.
Form tasarlarken kullanım kolaylığını düşünmemek.
Kontrollerin göze hoş gelmeyecek yerleşimi
Standart Windows tasarımına uymamak. (Menü tasarımı, kontrol butonlarının genelde yukarıda olması, ALT-F4 ile programın kapatılması, Ctrl-O dosya açmak, Ctrl-P yazdırmak vs için kullanılması) Bu standartlar zaten Windows kullanan kişilere kullanımı kolay programlar üretmenize neden olacaktır. Ve dikkat ederseniz birçok program bu standartları takip eder, siz de etmelisiniz.

6. Hata yapması kolay kodlar yazmak.
Yeterli hata kontrolleri yazmamak
Kullanıcının yapması muhtemel hataları öngörememek ve oluşması halinde bunları giderememek

7. Tekrar kulanılabilecek kodlar yazmamak. Yazdığınız anı kurtaracak gelişigüzel kodlar yazmak yapmamanız gereken önemli kurallardan biridir, çünkü ileride benzer kod bloklarına ihtiyacınız olacaktır ve yeri geldiğinde o kod bloğunun ne işe yaradığını anlayabilmeniz gerekir.
Basit kodlarla yapılabilecek işler için kontroller, kütüphaneler veya ActiveX kontroller kullanmak ta bir hatadır. Bu tarz kod yazma gereksiz büyüklük meydana getirir. Her dll yada ocx kontrolu setup disketinize ekstra yük demektir.
Alışılmış işler için farklı arabirimler tasarlamak.


8. Yetersiz dökümantasyon.
Gerekli açıklamaları kodlar arasına yazmamak

9. Veri türlerinin uygunsuz kullanmak.
Dizileri gerekli büyüklüklerde üretmemek.
Değişkenlerin geçerlilik alanlarını gereğinden fazla geniş tutmak. Örnek olarak sadece tek bir fonksiyon içinde kullanılan bir değişkeni Public olarak deklere etmek programın çalışması boyunca bellekte kalacağı için gereksiz yer işgal edecektir.

10. Diğer programcılardan çaba göstermeksizin faydalanmak yada gereken yerde yardım istememek.
Başkalarının ürettiklerini kendinizinmiş gibi göstermek.

Değişik kullanıcılar için farklı arayüzler tasarlamak

Bu bölüm , temel arayüz tasarlama işlemine giriş yapmanıza yardım edecek, kullanıcılarınız için büyük uygulamalar oluşturmakiçin ihtiyaç duyduğunuz araçlara giriş sağlayacaktır..

 

Kullanıcı arayüzü , belki uygulamanın çok önemli parçasıdır , muhakkak en çok görünenidir . Kullanıcı için ise arayüz programın kendisidir, onlar kodların farkında değildirler. Kodlarınızı geliştirmek için ne kadar zaman harcadığınızı da bilmezler. Programınızın kullanılabilirliği hazırladığınız arayüzün yeterliliğine bağlıdır. Uygulamayı tasarlarken, arayüze dair bir dizi kararlar almanız gerekir . Sıngle-document veya multıple-document biçimini mi kullanmalısınız ? Kaç adet farklı form kullanacaksınız? Menu'den ayrı olarak toolbar kullanmalı mısınız? Dialog box kullanmalı mısınız? Kullanıcı arayüzü tasarlamaya başlamadan önce , uygulamanın amacı hakkında düşünmelisiniz . Bilgiyi gösterme amaçlı bir uygulama , bilgiyi toplayandan farklı şartlara sahip olur . Tecrübeli kullanıcılar için bir uygulama çok karmaşık olabilir iken , başlangıç düzey kullanıcıları için, tasarımında basitlik gerekir. Bu bölüm , temel arayüz tasarlama işlemine giriş yapmanıza yardım edecek, kullanıcılarınız için büyük uygulamalar oluşturmakiçin ihtiyaç duyduğunuz araçlara giriş sağlayacaktır..

Farklı Arayüz Türleri

 

 

 

Windows programlarında dikkat edilen şey arayüzlerin birbirine benzemesidir. İki tür esas arayüz vardır. SDI (single document interface) tek formlu arayüzler ve MDI (multiple document interface) çok formlu arayüzler. SDI arayüze örnek WordPad programını verebiliriz. WordPad'de bir belge açabilmek için açık olan belgeyi kapatmanız gerekir:

Excel yada Word ise MDI arayüze sahiptir ve aynı anda birden fazla dökümanın görünmesine izin verirler. MDI arayüz programlarını bir ana pencere içinde birden fazla çocuk (child) pencere barındırabilen programlar olarak kabul etmemiz gerekir. MDI örneği:

Bu arayüz türleri içinde sizin ihtiyacınıza en uygun olnın hangisi olduğunu belirlemenis gerekir. Bir muhasebe uygulamasında bir müşterinin birden fazla işlemi için birden fazla pencere açılması gerekebilir ve MDI bu tür bir program için uygundur, ancak bir kayıt veya telefon defteri için SDI yeterli olur.

Bu iki türden ayrı olarak, gitgide daha popüler olmaya başlayan explorer-türü bir arayüz daha vardır. Windows Explorer yapısındaki tür bir tarafta ağaç dizin diğer tarafta dizin veya menü içeriğinden oluşur:

 


MDI Arayüz

 

Çok Dökümanlı Arayüzler hakkında geniş bilgi veriliyor

 

MDI arayüzler bir ana "Parent" form içinde birçok alt "Child" form açılmasına izin verir. Açılan formların kendi menüleri ve form başlıkları vardır. Ancak alt formların çalışma alanı (workspace)   yalnızca ana formun penceresi içindedir. Yani ana formun yok olması tümünün yok olması demektir. Farklı bir deyişle ana form kapanırsa tüm alt formlar da kapanır. Bir alt forma referens ederseniz mutlaka ana formuda referans satırına katmalısınız. Alt formlar dediğimiz gibi ana formun alanı dahilinde görünürler, bu yüzden bir alt form minimzie edilirse Windows'un görev çubuğunda değil ana formun alt kısmında görünürler. Aşağıdaki pencereyi inceleyiniz:

Not: Hazırladığınız program birden fazla form içereceği için her formun MDI olması gerekmez. SDI (tek formlu) formlar da projenizde MDI'lerle beraber kullanılabilir. Ayrıca MDI formlar üzerine her kontrol elemanı yerleştirilemez. Align özelliği olan nesneler yerleştirilebilir fakat timer gibi görünmez nesneler yerleştirilemez.

Bir MDI Uygulaması Nasıl Oluşturulur:

1. Bir MDI form açın. Project menüsünden Add MDI Form seçeneğini tıklayın. Ancak unutmayın bir uygulamada sadece bir tane MDI form olabilir.
2. Child formları (alt formlar) Project menüsünden standart formlar olarak açın:



3.MDI child formun MDIChild özelliğini True yapın:

                   

Oluşturduğunuz MDI, MDIChild ve Standart formlar proje penceresinde aşağıdaki gibi görülür:

                   

MDIChild Formların Bilinmesi Gereken Bazı Özellikleri:

1. Tüm MDIChild formlar ana form (MDI form) içinde hareket ederler.
2. MDI form minimize edilince, kendisi ve içindeki tüm child formlar tek bir ikon olarak görev çubuğunda görünürler.
3. MDIChild form maximize edilince form başlığı ana form başlığı (title bar) haline gelir.
4. MDI formun (ana form) AutoShowChildren özelliğini True yaparsanız child formlar otomatik olarak ana form açılınca görünür , tersi durumda (False) alt formlar görünmez.
5.ChildForm üzerinde menü varsa aktif durumdaki child formun menüsü ana formda görünür, child formda değil

 


Formlar Hakkında Detaylı Bilgi

 

 

 

Uygulamanızda kullanacağınız tüm formları hazırlamadan önce formların hangisinin programınız çalıştığında ilk görünecek form olacağına karar vermelisiniz. Esas olarak VB ilk hazırladığınız formu (startup) açılış formu olarak kayda girer. Ama isterseniz açılış formunu aşağıdaki yolla değiştirebilirsiniz:

1. Project menüsünden Project Properties'i seçin
2. General tabını seçin.
3. Startup Object liste kutusundan istediğiniz formu başlangıç formu olarak seçin.

Açılış Formu Olmadan Programı Çalıştırmak
Bazen açılışta bir form çıkmasına gerek yoktur yada kullanıcının kayda girmiş tercihine göre birden fazla form içinden seçilen bir formun açılış formu olması gerekebilir. Örnek olarak kullanıcı açılışta şifre sorulmasını şart koşmuşsa şifre ekranı açılış menüsü olmalı tersi durumda ise programın ana menü ekranı ilk görünen form olmalıdır. Bu işlemi Sub Main denen bir sub oluşturarak ve startup object olarak bu sub'ı göstererek yapabilirsiniz. Aşağıdaki kodu inceleyin:

Sub Main()
Dim intDurum As Integer

 

' kullanıcının tercihini kontrol eden bir fonk çağırsın:
intDurum = KullaniciDurumunuAl

' Duruma göre startup formu seç:

If intDurum = 1 Then
  frmAna.Show
Else
  frmPassword.Show
End If

End Sub

Bu Sub Main prosedürü bir form içinde olamaz, bunu bir BAS modülü içine yazmalısınız.

Açılışta Splash Screen Kullanmak

Program açılışında uzun zaman alan işlemler yapılması gerekiyorsa, örn büyük miktarda veri yada çok sayıda bitmap yüklemek gibi, Splash Screen (Program açılışında belli bir süre bekleyen, bir resim yada uyarı taşıyan küçük  çaplı formlardır) göstermek kullanışlı olur. Splash Screen oluşturmak için Sub Main kullanın ve splash formu bu sub içinden açın:

Private Sub Main()

' splash screen göster

frmSplash.Show

' startup prosedürleriniz buraya.

'  Ana formu göster ve splash screen'i unload et.

frmMain.Show

Unload frmSplash

End Sub

Uygulamanıza Splash Screen Eklemek

Project -> Add Form menüsünden aşağıdaki form u seçin:

Uygulamanızdaki Tüm Formları Kapatmak
Farkına varmadığınız bir form UNLOAD edilmezse ve sadece Visible = False  ile kapatılırsa, o form geri planda hala çalışıyor demektir. Bunun oluşmasını engellemek için aşağıdaki kodu ana formunuzun UNLOAD prosedüründe kullanın:

Private Sub Form_Unload

Dim i as integer

' Form collection içindeki her bir formu unload
' eden for - next döngüsü

For i = 0 to Forms.Count - 1

Unload Forms(i)

Next

End Sub

Menü Tasarımı

 

 

 

VB'de menü tasarlamak kolaydır. Menü eklemek istediğiniz form ekranda aktif form iken (buna dikkat..kod penceresini aktif yaparsanız olmaz..) Tools menüsünden Menu Editor'u seçin. Aşağıya bakınız:



Menu Editor kolay kullanımlı ve anlaşılır bir yapıya sahiptir. Hazırlanacak menü elemanları derecelere sahip olacaktır.Buradaki en üst seviye elemanlar: Dosya, Kayıtlar, Araçlar ve Yardım . Aşağıdaki resme bakınız:



(Burada menü elemanları yazılmış durumda ama ilk açıldığında boş bir pencere ile karşılaşacaksınız)

TOP LEVEL ELEMANLAR
Menü elemanları form üzerinde soldan sağa doğru dizilirler. İlk yazacağınız eleman mutlaka programın esas görevlerini yapan en üst eleman olmalıdır. Eğer ticari programlara dikkat ederseniz, ilk menü elemanı dosya açma, kaydetme, yazdırma gibi esas işlemleri yapar. Bu tüm kullanıcıların alıştığı yerdir. Siz de tasarımlarınızda kullanıcıların bu alışkanlıklarına dikkat etmelisiniz. Ben AdresTel programında ilk en üst seviye menü elemanı olarak "Dosya" yı seçtim. Caption bölümüne Dosya,  Name bölümüne ise mnuFile yazdım. Caption bildiğiniz gibi menüde görünecek "yazıdır". Program kodları için bu yazının bir önemi yok. Programınız,   menünün kliklenip kliklenmediğini Name özelliği ile anlar. Akılda kalması açısından menü elemanlarını adlandırırken "mnu" ön ekini kullanın, yani "mnuFile" gibi... Yukarıdaki resimde en üst seviye elemanların önünde....gibi noktaların olmadığını görüyorsunuz. Caption'un içinde hangi harf önüne & işaretini koyarsanız  (&Dosya gibi. Yani burada "D" harfinin önünde) o harfin altı, program çalıştığında, çizgili olarak görünür ve ALT tuşu ile birlikte o harfin kullanılması kısayol yaratır (Burada ALT + D). Bu kısayola tuşlanınca yada fare ile menü kliklenince, yukarıdaki tasarıma göre,  aşağıdaki menü ortaya çıkar:



MENÜLERE KISAYOL ATAMAK

Menü editör üzerindeki shortcut dropdown combo kutusundan istediğiniz kısayolu seçebilirsiniz:

      

ALT MENÜ ELEMANLARI
Yukarıdaki görüntüde tabiki ayırma çizgilerini farkettiniz. Onlar da birer alt menü elemanlarıdır ve "-" (tire) işareti ile oluşturulurlar. Şimdi yukarıdaki Menü editör'e bakalım. İlk en üst seviye eleman mnuFile 'dır, ikinci en üst seviye eleman ise mnuKayitlar'dır. Bu iki en üst seviye eleman arasında kalanlar mnuFile'ın alt elemanlarıdır. Peşpeşe gelen alt elemanlardan sonra yeni bir üst eleman oluşturmak için menü editördeki tuşlarından tuşunu kullanacaksınız. Bu tuş alt seviyeden üst seviyeye çıkmanızı sağlar. Aynı şekilde tuşu ise alt seviye elemanı oluşturmanızı sağlar. Her alt seviye dört tane nokta ile simgelenir. Bunları yukarıdaki menü editör'de görebilirsiniz. Daha alt seviye elemanlar oluşturmak isterseniz tuşuna bir kez daha basmalısınız. Örnek olarak: Dosya -> Özellikler -> Değiştir     gibi hayali bir menü tasarımı yapmamız gerekiyorsa, burada Dosya en üst seviye, Özellikler birinci alt, Değiştir ise ikinci alt seviye elemanlarıdır. Dosya 'nın önünde nokta yok. Özellikler'in önünde 4 nokta, Değiştir'in önünde 8 nokta vardır ve Değiştir Özellikler'in birinci alt elemanıdır. Bkz:

Dosya
....Özellikler
........Değiştir

Bir kaç uyarı :
1. Özellikler menüsü Değiştir menüsünün üst elemanı olduğu için Özellikler menüsüne de artık kısayol atayamazsınız.
2. En üstte bulunanlar (top level) form üzerinde sürekli görünecek elemanlardır, bu elemanlara kısayol tuşları bağlanamaz. En üst elemanların altındakiler kısayollar alabilirler. En üst elemanlara & işareti yardımıyla ALT + (menü captionu içindeki bir harf) şeklinde kısayol belirleyebilirsiniz

BİR MENÜ ELEMANINA KOD YAZMAK

Menü tasarımını bitirdikten sonra hangi menü elemanına kod yazmak isterseniz ona fare ile iki kez tıklayın. Ortaya menünün Click yordamı çıkar ve istediğiniz kod buraya yazılır.



BİR POPUP MENÜ OLUŞTURMAK

Pop up menüler aslında Menu Editor ile hazırlanan menülerdir. Yukarıdaki açıklamalarla hazırladığınız menünün top level elemanlarından birini popup olarak açabilirsiniz. Bunu için PopupMenu fonksiyonunu kullanmalısınız. Popup menüler farenin sağ tuşunun tek klik yapılması ile açılır. Herhangi bir form nesnesi üzerinde iken sağ klik yapmanız o nesnenin MouseUp yordamını çalıştırır. Hangi tuşun basılıp bırakıldığı seçilerek form üzerinde mevcut olan herhangi bir top level menüyü popup olarak açabiliriz. Aşağıdaki örneği inceleyin:

Private Sub Form_MouseUp (Button As Integer, Shift As _Integer, X As Single, Y As Single)

If Button = 2 Then 'Sağ klik yapılmış ise
    PopupMenu mnuFile'Menüyü popup olarak göster
End If

End Sub

Burada mnuFile olarak adlandırılan nesne menünün adıdır. Buna dikkat edin menünün başlığı (Caption) değil adıdır (Name). Bir popup menü elemanı kliklendiğinde o menü elemanının Click yordamına yazılmış olan kod çalışır.

Pratik ToolBar!

 

ToolBar nesnesi olmadan oldukça pratik bir ToolBar hazırlayalım.

 

Burada anlatılacak konu bir MDI Form içinde bir toolbar hazırlamaktır. Standart formlar için araç kutusundan ToolBar nesnesini seçerek kolaylıkla toolbar hazırlayabilirsiniz.
ToolBar üzerinde ikonlar bulunan (genelde 16x16 pixel boyutunda) minik command butonlarından yada picture nesnelerinden oluşan bir dizidir. En çok kullanılan menü elemanlarına kolay ulaşım sağlarlar ve form üzerinde güzel görünümleri vardır.
MDI Formlar üzerinde Toolbar oluşturmak için PictureBox nesnesi kullanılır. Araç kutusundan ikonuna tıklayarak ulaşılabilir. Bu nesneyi MDIForm üzerine yerleştirdiğiniz zaman otomatik olarak formun bir ucundan diğer ucuna yayılacaktır. Yukarı resimde de görüldüğü gibi toolbar olarak PictureBox nesnesi kullanılmıştır. PictureBox üzerine Command Button yada image nesneleri yerleştirebilir ve bu nesnelerin Click yordamlarına gereken kodları yazabilirsiniz. Bu nesnelerden Command Button click olayına içe çökerek yanıt verdiği için görsel açıdan daha hoş bir görüntü verir.

Command Button Üzerine İkon Yerleştirmek

Command Buton iki özellikte olabilir: Standart ve Graphical. Standart butonlar üzerine sadece yazı yazabilirsiniz, yani sadece Caption özelliğini kullanabilirsiniz. Ancak graphical butonlar üzerlerine hem yazı hemde resim kabul ederler. Bu özelliği açmak için, buton üzerinde iken sağ tıklayıp "Properties" i seçin ve Style özelliğini Graphical yapın. Artık butonun Picture özelliğini kullanarak dilediğiniz resmi yerleştirebilirsiniz. Ancak dikkat edin çok büyük resimler koymayın çünkü buton alanı yetersiz ise resmin tamamı görünmez.

ToolBar'da Kullanacağınız Butonlar Hakkında Biraz Öneri

Bu önerilerim kolaylık olması açısındandır:

1. Hazırladığınız ToolBar'a yerleştirdiğiniz command butonları bir Control Array olarak hazırlayın. Bunu nasıl yapacağınıza gelince, ilk butonu hazırladığınızda o'na diyelim ki "cmdKomut" adını verin daha sonraki butonları ilk butondan kopyalarak oluşturun (sağ klik "Copy" ve "Paste" işlemi) ve yeni butonlara da aynı adı "cmdKomut" verin. İlk yineleme de VB size "Do you want to create a control array?" sorusu sorar buna yes yanıtını verince her butona bir index numarası verir. İlk butona "0" sonrakine "1" vs. Bu yolla aynı adda ama farklı işlevlerde olabilen butonlar elde edebilrsiniz.

2. Butonların Click yordamlarında ise aşağıdaki şekilde index seçimi yapın ve hangi butona basıldığı anlaşılsın:

Private Sub cmdKomut_Click(Index As Integer)
Select Case Index

  Case 0: 'İndex seçimi yapılıyor
  Case 1: 'Buralara butonların clicklere vereceği  yanıtı (kodu) yazın
  Case 2:
  Case 3:
  Case 4:
  Case 5:
End Select
End Sub


Bu yolla her command butonu için bir Sub kullanmak yerine tek bir Sub ile tüm butonların clicklerini kodlayabilisiniz. Yukarıda kod sayfasına herhangi cmdKomut butonuna çift tıklayarak ulaşabilirsiniz. Sadece array konumunda bulunan nesnelerin index özellikleri vardır.

DialogBoxes

 

Dialog hazırlarken nelere dikkat etmeniz gerekir?

 

Dialog kutuları Modal yada Modeless olabilir. Modal kutular aktif iken geri planda bulunan formlara geçiş yapılmasını engeller ve kapatılana kadar sadece onlar aktif nesne olarak kalırlar. Bunların kapatılması (hidden yada unload) diğer nesnelere focus imkanı verir. VB'nin Help menüsündeki About dialog kutusu Modal'dır. (Deneyin onu kapatmadan gerideki formlara ulaşamazsınız.)
Modeless dialog kutuları gerideki formlara focus yapmaınza olanak sağlar. Edit menüsündeki    Ara yada Değiştir dialog kutuları ise modeless'tir.

Modal dialogbox göstermek için:
frmAbout.Show vbModal

Modeless dialogbox için:
frmAbout.Show

kodları kullanılır. Kısa bir not: Bir dialog modal olarak gösterilirse Show metodunun bulunduğu satırdan sonraki kod bloğu form kapatılana kadar işletilmez. Yani kodun çalışmaya devam edebilmesi için formun kapatılması gerekir

Farklı Ekran Çözünürlükleri İçin Arayüz Düzenlemek

 

 

 

1024x768 ekran çözünürlüğünde hazırladığınız program 800x600 yada altında bir çözünürlükte çalıştırıldığı zaman form ekrana sığmayacaktır. Bunu engellemenin en kolay yolu formlarınızı 640x480 çözünürlüğünde hazırlamanızdır. Eğer hala yüksek çözünürlükte form hazırlamakta ısrar ederseniz size bir ipucu daha: 640x480 pixel ebatında bir bitmap oluşturun (Paint'i kullanabilirsiniz) ve hazırladığınız formun picture özelliğini bu resime eşleştirin ve formun boyutunu o resim kadar tutun. Tüm kontrolleri vs yerleştirdikten sonra resmi silmeyi ve ilgili referansları yoketmayi unutmayın.

VB tasarım sırasında formunuzu nerede oluşturduysanız çalışma sırasında da o'nu oraya koyar. 1024x768 çözünürlükte kenarda kalan form çalıştığı anda yarım görünebilir. Bu ve benzeri form yerleştirme problemlerini aşağıdaki kodu Form_Load prosedürüne yazarak   bertaraf edebilirsiniz:
           Private Sub Form_Load ( )
                Me.Move 0 ,0
        End Sub

Bu koddaki olay formun Left ve Top özelliklerinin 0 (sıfır) a eşitlenmesi ile aynı anlamdadır ancak daha kısadır ve anlamı "formu sol üst köşeye taşı" demektir.
Screen nesnesi ekran ile ilgili bilgileri tutar. Screen.TwipsPerPixelX ve TwipsPerPixelY çalşma anında ekran çözünürlüğünü bulmanızı sağlar:

Genislik = Screen.Width \ Screen.TwipsPerPixelX
Yukseklik = Screen.Height \ Screen.TwipsPerPixelY


Select Case Genislik, Yukseklik
    Case 640, 480
        txtAd.Height = 200
        txtAd.Width = 500
   Case 800, 600
        txtAd.Height = 150
        txtAd.Width = 400
   Case 1024, 768
        txtAd.Height = 100
        txtAd.Width = 300
End Select


Genişlik ve Yukseklik değerlerine göre form içindeki temsili txtAd nesnesinin iki değerini değiştirdik. Buradaki örnek oldukça basit bir örnektir. Siz uygulamalarınızda birçok farklı nesnenin özelliklerini bu yolla run-time değiştirebilirsiniz.

 


Farklı Arayüz Türleri

 

 

 

Windows programlarında dikkat edilen şey arayüzlerin birbirine benzemesidir. İki tür esas arayüz vardır. SDI (single document interface) tek formlu arayüzler ve MDI (multiple document interface) çok formlu arayüzler. SDI arayüze örnek WordPad programını verebiliriz. WordPad'de bir belge açabilmek için açık olan belgeyi kapatmanız gerekir:

Excel yada Word ise MDI arayüze sahiptir ve aynı anda birden fazla dökümanın görünmesine izin verirler. MDI arayüz programlarını bir ana pencere içinde birden fazla çocuk (child) pencere barındırabilen programlar olarak kabul etmemiz gerekir. MDI örneği:

Bu arayüz türleri içinde sizin ihtiyacınıza en uygun olnın hangisi olduğunu belirlemenis gerekir. Bir muhasebe uygulamasında bir müşterinin birden fazla işlemi için birden fazla pencere açılması gerekebilir ve MDI bu tür bir program için uygundur, ancak bir kayıt veya telefon defteri için SDI yeterli olur.

Bu iki türden ayrı olarak, gitgide daha popüler olmaya başlayan explorer-türü bir arayüz daha vardır. Windows Explorer yapısındaki tür bir tarafta ağaç dizin diğer tarafta dizin veya menü içeriğinden oluşur:

MDI Arayüz

 

Çok Dökümanlı Arayüzler hakkında geniş bilgi veriliyor

 

MDI arayüzler bir ana "Parent" form içinde birçok alt "Child" form açılmasına izin verir. Açılan formların kendi menüleri ve form başlıkları vardır. Ancak alt formların çalışma alanı (workspace)   yalnızca ana formun penceresi içindedir. Yani ana formun yok olması tümünün yok olması demektir. Farklı bir deyişle ana form kapanırsa tüm alt formlar da kapanır. Bir alt forma referens ederseniz mutlaka ana formuda referans satırına katmalısınız. Alt formlar dediğimiz gibi ana formun alanı dahilinde görünürler, bu yüzden bir alt form minimzie edilirse Windows'un görev çubuğunda değil ana formun alt kısmında görünürler. Aşağıdaki pencereyi inceleyiniz:

Not: Hazırladığınız program birden fazla form içereceği için her formun MDI olması gerekmez. SDI (tek formlu) formlar da projenizde MDI'lerle beraber kullanılabilir. Ayrıca MDI formlar üzerine her kontrol elemanı yerleştirilemez. Align özelliği olan nesneler yerleştirilebilir fakat timer gibi görünmez nesneler yerleştirilemez.

Bir MDI Uygulaması Nasıl Oluşturulur:

1. Bir MDI form açın. Project menüsünden Add MDI Form seçeneğini tıklayın. Ancak unutmayın bir uygulamada sadece bir tane MDI form olabilir.
2. Child formları (alt formlar) Project menüsünden standart formlar olarak açın:



3.MDI child formun MDIChild özelliğini True yapın:

                   

Oluşturduğunuz MDI, MDIChild ve Standart formlar proje penceresinde aşağıdaki gibi görülür:

                   

MDIChild Formların Bilinmesi Gereken Bazı Özellikleri:

1. Tüm MDIChild formlar ana form (MDI form) içinde hareket ederler.
2. MDI form minimize edilince, kendisi ve içindeki tüm child formlar tek bir ikon olarak görev çubuğunda görünürler.
3. MDIChild form maximize edilince form başlığı ana form başlığı (title bar) haline gelir.
4. MDI formun (ana form) AutoShowChildren özelliğini True yaparsanız child formlar otomatik olarak ana form açılınca görünür , tersi durumda (False) alt formlar görünmez.
5.ChildForm üzerinde menü varsa aktif durumdaki child formun menüsü ana formda görünür, child formda değil

Formlar Hakkında Detaylı Bilgi

 

 

 

Uygulamanızda kullanacağınız tüm formları hazırlamadan önce formların hangisinin programınız çalıştığında ilk görünecek form olacağına karar vermelisiniz. Esas olarak VB ilk hazırladığınız formu (startup) açılış formu olarak kayda girer. Ama isterseniz açılış formunu aşağıdaki yolla değiştirebilirsiniz:

1. Project menüsünden Project Properties'i seçin
2. General tabını seçin.
3. Startup Object liste kutusundan istediğiniz formu başlangıç formu olarak seçin.

Açılış Formu Olmadan Programı Çalıştırmak
Bazen açılışta bir form çıkmasına gerek yoktur yada kullanıcının kayda girmiş tercihine göre birden fazla form içinden seçilen bir formun açılış formu olması gerekebilir. Örnek olarak kullanıcı açılışta şifre sorulmasını şart koşmuşsa şifre ekranı açılış menüsü olmalı tersi durumda ise programın ana menü ekranı ilk görünen form olmalıdır. Bu işlemi Sub Main denen bir sub oluşturarak ve startup object olarak bu sub'ı göstererek yapabilirsiniz. Aşağıdaki kodu inceleyin:

Sub Main()
Dim intDurum As Integer

 

' kullanıcının tercihini kontrol eden bir fonk çağırsın:
intDurum = KullaniciDurumunuAl

' Duruma göre startup formu seç:

If intDurum = 1 Then
  frmAna.Show
Else
  frmPassword.Show
End If

End Sub

Bu Sub Main prosedürü bir form içinde olamaz, bunu bir BAS modülü içine yazmalısınız.

Açılışta Splash Screen Kullanmak

Program açılışında uzun zaman alan işlemler yapılması gerekiyorsa, örn büyük miktarda veri yada çok sayıda bitmap yüklemek gibi, Splash Screen (Program açılışında belli bir süre bekleyen, bir resim yada uyarı taşıyan küçük  çaplı formlardır) göstermek kullanışlı olur. Splash Screen oluşturmak için Sub Main kullanın ve splash formu bu sub içinden açın:

Private Sub Main()

' splash screen göster

frmSplash.Show

' startup prosedürleriniz buraya.

'  Ana formu göster ve splash screen'i unload et.

frmMain.Show

Unload frmSplash

End Sub

Uygulamanıza Splash Screen Eklemek

Project -> Add Form menüsünden aşağıdaki form u seçin:

Uygulamanızdaki Tüm Formları Kapatmak
Farkına varmadığınız bir form UNLOAD edilmezse ve sadece Visible = False  ile kapatılırsa, o form geri planda hala çalışıyor demektir. Bunun oluşmasını engellemek için aşağıdaki kodu ana formunuzun UNLOAD prosedüründe kullanın:

Private Sub Form_Unload

Dim i as integer

' Form collection içindeki her bir formu unload
' eden for - next döngüsü

For i = 0 to Forms.Count - 1

Unload Forms(i)

Next

End Sub

Pratik ToolBar!

 

ToolBar nesnesi olmadan oldukça pratik bir ToolBar hazırlayalım.

 

Burada anlatılacak konu bir MDI Form içinde bir toolbar hazırlamaktır. Standart formlar için araç kutusundan ToolBar nesnesini seçerek kolaylıkla toolbar hazırlayabilirsiniz.
ToolBar üzerinde ikonlar bulunan (genelde 16x16 pixel boyutunda) minik command butonlarından yada picture nesnelerinden oluşan bir dizidir. En çok kullanılan menü elemanlarına kolay ulaşım sağlarlar ve form üzerinde güzel görünümleri vardır.
MDI Formlar üzerinde Toolbar oluşturmak için PictureBox nesnesi kullanılır. Araç kutusundan ikonuna tıklayarak ulaşılabilir. Bu nesneyi MDIForm üzerine yerleştirdiğiniz zaman otomatik olarak formun bir ucundan diğer ucuna yayılacaktır. Yukarı resimde de görüldüğü gibi toolbar olarak PictureBox nesnesi kullanılmıştır. PictureBox üzerine Command Button yada image nesneleri yerleştirebilir ve bu nesnelerin Click yordamlarına gereken kodları yazabilirsiniz. Bu nesnelerden Command Button click olayına içe çökerek yanıt verdiği için görsel açıdan daha hoş bir görüntü verir.

Command Button Üzerine İkon Yerleştirmek

Command Buton iki özellikte olabilir: Standart ve Graphical. Standart butonlar üzerine sadece yazı yazabilirsiniz, yani sadece Caption özelliğini kullanabilirsiniz. Ancak graphical butonlar üzerlerine hem yazı hemde resim kabul ederler. Bu özelliği açmak için, buton üzerinde iken sağ tıklayıp "Properties" i seçin ve Style özelliğini Graphical yapın. Artık butonun Picture özelliğini kullanarak dilediğiniz resmi yerleştirebilirsiniz. Ancak dikkat edin çok büyük resimler koymayın çünkü buton alanı yetersiz ise resmin tamamı görünmez.

ToolBar'da Kullanacağınız Butonlar Hakkında Biraz Öneri

Bu önerilerim kolaylık olması açısındandır:

1. Hazırladığınız ToolBar'a yerleştirdiğiniz command butonları bir Control Array olarak hazırlayın. Bunu nasıl yapacağınıza gelince, ilk butonu hazırladığınızda o'na diyelim ki "cmdKomut" adını verin daha sonraki butonları ilk butondan kopyalarak oluşturun (sağ klik "Copy" ve "Paste" işlemi) ve yeni butonlara da aynı adı "cmdKomut" verin. İlk yineleme de VB size "Do you want to create a control array?" sorusu sorar buna yes yanıtını verince her butona bir index numarası verir. İlk butona "0" sonrakine "1" vs. Bu yolla aynı adda ama farklı işlevlerde olabilen butonlar elde edebilrsiniz.

2. Butonların Click yordamlarında ise aşağıdaki şekilde index seçimi yapın ve hangi butona basıldığı anlaşılsın:

Private Sub cmdKomut_Click(Index As Integer)
Select Case Index

  Case 0: 'İndex seçimi yapılıyor
  Case 1: 'Buralara butonların clicklere vereceği  yanıtı (kodu) yazın
  Case 2:
  Case 3:
  Case 4:
  Case 5:
End Select
End Sub


Bu yolla her command butonu için bir Sub kullanmak yerine tek bir Sub ile tüm butonların clicklerini kodlayabilisiniz. Yukarıda kod sayfasına herhangi cmdKomut butonuna çift tıklayarak ulaşabilirsiniz. Sadece array konumunda bulunan nesnelerin index özellikleri vardır.

 


DialogBoxes

 

Dialog hazırlarken nelere dikkat etmeniz gerekir?

 

Dialog kutuları Modal yada Modeless olabilir. Modal kutular aktif iken geri planda bulunan formlara geçiş yapılmasını engeller ve kapatılana kadar sadece onlar aktif nesne olarak kalırlar. Bunların kapatılması (hidden yada unload) diğer nesnelere focus imkanı verir. VB'nin Help menüsündeki About dialog kutusu Modal'dır. (Deneyin onu kapatmadan gerideki formlara ulaşamazsınız.)
Modeless dialog kutuları gerideki formlara focus yapmaınza olanak sağlar. Edit menüsündeki    Ara yada Değiştir dialog kutuları ise modeless'tir.

Modal dialogbox göstermek için:
frmAbout.Show vbModal

Modeless dialogbox için:
frmAbout.Show

kodları kullanılır. Kısa bir not: Bir dialog modal olarak gösterilirse Show metodunun bulunduğu satırdan sonraki kod bloğu form kapatılana kadar işletilmez. Yani kodun çalışmaya devam edebilmesi için formun kapatılması gerekir

Farklı Ekran Çözünürlükleri İçin Arayüz Düzenlemek

 

 

 

1024x768 ekran çözünürlüğünde hazırladığınız program 800x600 yada altında bir çözünürlükte çalıştırıldığı zaman form ekrana sığmayacaktır. Bunu engellemenin en kolay yolu formlarınızı 640x480 çözünürlüğünde hazırlamanızdır. Eğer hala yüksek çözünürlükte form hazırlamakta ısrar ederseniz size bir ipucu daha: 640x480 pixel ebatında bir bitmap oluşturun (Paint'i kullanabilirsiniz) ve hazırladığınız formun picture özelliğini bu resime eşleştirin ve formun boyutunu o resim kadar tutun. Tüm kontrolleri vs yerleştirdikten sonra resmi silmeyi ve ilgili referansları yoketmayi unutmayın.

VB tasarım sırasında formunuzu nerede oluşturduysanız çalışma sırasında da o'nu oraya koyar. 1024x768 çözünürlükte kenarda kalan form çalıştığı anda yarım görünebilir. Bu ve benzeri form yerleştirme problemlerini aşağıdaki kodu Form_Load prosedürüne yazarak   bertaraf edebilirsiniz:
           Private Sub Form_Load ( )
                Me.Move 0 ,0
        End Sub

Bu koddaki olay formun Left ve Top özelliklerinin 0 (sıfır) a eşitlenmesi ile aynı anlamdadır ancak daha kısadır ve anlamı "formu sol üst köşeye taşı" demektir.
Screen nesnesi ekran ile ilgili bilgileri tutar. Screen.TwipsPerPixelX ve TwipsPerPixelY çalşma anında ekran çözünürlüğünü bulmanızı sağlar:

Genislik = Screen.Width \ Screen.TwipsPerPixelX
Yukseklik = Screen.Height \ Screen.TwipsPerPixelY


Select Case Genislik, Yukseklik
    Case 640, 480
        txtAd.Height = 200
        txtAd.Width = 500
   Case 800, 600
        txtAd.Height = 150
        txtAd.Width = 400
   Case 1024, 768
        txtAd.Height = 100
        txtAd.Width = 300
End Select


Genişlik ve Yukseklik değerlerine göre form içindeki temsili txtAd nesnesinin iki değerini değiştirdik. Buradaki örnek oldukça basit bir örnektir. Siz uygulamalarınızda birçok farklı nesnenin özelliklerini bu yolla run-time değiştirebilirsiniz.

Basit bir Help dosyası hazırlayalım

 

Buradan indireceğiniz derleyicilerle .hlp dosyası hazırlayabilir ve projenize profesyönel bir görünüm kazandırabilirsiniz.

 

HLP uzantılı yardım dosyası hazırlama işleminin ilk aşaması, yardım bilgilerini içeren dosyayı RTF formatında kaydetmektir. Bu iş için en kolay ulaşılabilen yazma programı tabiki Word'dür. Elimizdeki help derleyicisinin eski sürüm olması olasılığına karşılık Word 6 yada Office 95 Word kullanmanızı öneririm.
Ben burada Office 95 Word kullandım ve derleyici çalıştı.
Şimdi ilk olarak ihtiyaçlarımızı listeleyelim:

1. Word 6 yada Office 95 Word
2. Help Compiler 1    | Help Compiler 2

Bunlardan ikincisini yukarıdaki linklere tıklayarak indirebilirsiniz (709.803 bytes). Diğerini bulmak sizin işiniz. Burada şunu belirtmek istiyorum. Ben Help Compiler'ı Visual FoxPro 5 CD'si içinden buldum. 1997 tarihli bu CD içinde 4. sürüm help compiler var. Bu derleyici daha sonra çıkan Windows WordPad ve Office 97 ve 2000 sürümlerindeki Word'ü algılamayacağı düşüncesiyle eski Word sürümlerini kullanmanızı öneriyorum. Eğer Help derleyicisinin yeni sürümlerine ulaşma şansınız varsa o zaman yeni sürüm Word kullanabilirsiniz. (Windows 95 WordPad buradaki derleyici ile çalışmamaktadır...)

Şimdi konumuza girelim:

Word'de hazırladığınız help içeriğini RTF formatında kaydettiniz. Örneğin veritabani.rtf olarak. Şimdi HCW.EXE'yii çalıştırın (help compiler) ve New seçeneğini tıklayın böylece yeni bir yardım projesi hazırlayacağız:

Karşımıza çıkacak küçük seçim kutusundan Help Project'i seçeceğiz:

Oluşturmak istediğimiz yeni hlp projesine bir isim verdikten sonra onu kaydedeceğiz. Ben burada veritabanı adını kullandım:

Kaydet butonuna bastıktan sonra projemiz artık üzerinde çalışılmaya hazırdır. Artık yapmamız gereken projemize bir veya biren fazla RTF dosyası eklemektir. Bu işlem aşağıda görülen penceredeki "Files" butonu ile yapılır.

Yukarıdaki düğmeye basınca karşımıza projede kullanılacak RTF dosyalarının listesi gelir. Bu listeye istersek ADD ile ekleme yapar istersek REMOVE ile silebiliriz:

Yukarıdan da görüldüğü gibi benim projemde sadece bir rtf var. Eklenecek rtf dosyalar tamamlandıktan sonra OK düğmesine bastığınızda tekrar bir üstteki ekrana dönersiniz. Ama bu sefer eklenen dosyalar da görülür. Bundan sonra yapmanız gereken "Save and Compile" butonuna basarak projenizi HLP dosyası olarak derlemek ve kaydetmektir. Derleme işleminin olumlu olması durumunda aşağıdaki rapor ortaya çıkar:

Artık veritabani.hlp adlı basit bir yardım dosyası hazırladık. Sonuç aşağıdaki gibidir:

Fazla detay yok. Şimdilik tek sayfalık yardımları yazacağız.

Array Nedir?

 

Array'lar hakkında bulabileceğiniz en detaylı bilgi bu sayfada.


p>Konular:
Dizi Nedir? Ne işe yarar? Ne gibi kolaylıkları vardır?
Dizilere elemanlar nasıl girilir?
Tek ve İki boyutlu dizi nasıl oluşturulur?
Dim, ReDim ifadeleri nedir?
Bir form içinde yada tüm proje dahilinde geçerli olacak dizi nasıl deklere edilir?
Dizinin run-time oluşturulması nasıl yapılır?
Bir yapılandırma (INI) dosyasından alınan bilgilerle yeni bir array (dizi) nasıl oluşturulur?

Kullanıcının istediği bilgi dizi içinde nasıl aranır?
Bir dizide kaç eleman olduğunu nasıl anlarız?


Diziler:

Basic dilinde dizi tanımlamak oldukça kolaydır. Genelde 2 yada 3 boyutlu diziler hazırlamak yeterlidir (aslında basic 60 boyutlu dizi hazırlamanıza bile olanak verir...)

Dizi Nedir? Ne işe yarar? Ne gibi kolaylıkları vardır?

Dizileri aynı türde bilgileri dağınık olmak yerine tek bir paket içinde tutan nesneler olarak düşünebilirsiniz. Diziler, programlar içinde çok kolay ulaşılabilen nesnelerdir. Kolaylıkları buradan gelir. Aslında olay sadece kolaylıkla sınırlanmıyor. Bazı durumlarda dizileri kullanmak zorundasınız.

Dizilere elemanlar nasıl girilir?

Eşittir işareti ile dizilere elemanları girersiniz. Basic'in kolaylığı budur işte.... Diziler belli bir veri türünde deklere edildikleri için, örnek olarak: string. Dizi içine girilecek her eleman da birer string olmalıdır. Dizinin bir elemanı string diğeri ise integer olamaz.

Tek ve İki boyutlu dizi nasıl oluşturulur?

Öncelikle tek boyutlu bir dizi nedir ona bakalım:

Diyelim size borcu olan 5 kişi var. Bu kişileri borc adlı bir string dizi içine kaydetmek istiyorsunuz.

Önce diziyi tanıtalım:

Dim borc(5) As String

Şimdi dizi içine borçluları tek tek yazalım:

borc(1) = "Ahmet"
borc(2) = "Mehmet"
borc(3) = "Ali"
borc(4) = "Veli"
borc(5) = "Selami"

Artık programımızın herhangi bir yerinde borc(4)'ü referans edersek program "Veli"'yi kastettiğimizi anlayacaktır.

Şimdi aynı diziyi iki boyutlu hale getirelim, ve her borçlunun ayrıca borcunu da dizi içine yazalım:

Önce diziyi tanıtalım, ancak dikkat edin ilk sıra değişmedi. İkinci sırada iki eleman var. Bu elemanlardan biri borçluyu, diğeri borç miktarını tutacak:

Dim borc(5,2) As String

borc(1,1) = "Ahmet"
borc(1,2) = "500000"

borc(2,1) = "Mehmet"
borc(2,2) = "600000"

borc(3,1) = "Ali"
borc(3,2) = "3200000"

borc(4,1) = "Veli"
borc(4,2) = "9780000"

borc(5,1) = "Selami"
borc(5,2) = "75000000"

Dikkat edin: dizideki birince eleman borçlu adında da, borç miktarında da değişmiyor. Çünkü bu rakam belli bir kişiye referans etmekte, değişen ikinci eleman ise borçlu ve borç miktarı'nı belirliyor. Artık borc(4,2) elemanı içinde neyi taşıyor anlıyorsunuz... "9780000"


Dim, ReDim ifadeleri nedir?

Dizileri deklere ederken Dim, Private, Public, Static deyimleri kullanılır. Aslında önemli olan
diziyi proje içinde nerede deklere ettiğinizdir. Bir formun (general-declaration) kısmında Dim yada Private ile deklerasyan yaparsanız, dizi o formun her yerinde kullanılabilir. Ama sadece o form içinde. Projeniz içindeki başka formlarda nesne tanınmıyor gibi bir uyarı ortaya çıkar. Bunlardan Private deyimi Sub'lar içinde kullanılamaz. Form yada Modul düzeyinde geçerlidir. Public ise form düzeyinde kullanılamaz ve sadece modul düzeyinde kullanılır ve deklerasyon tüm proje dahilinde geçerli olur. Static ise boyutu değiştirilemeyen diziler oluşturur.Kısacası en çok Dim ve Public kullanılır.

ReDim ise dizilerin tekrar boyutlandırılmasını sağlar. Boyutu belli olmayan bir diziyi ilk önce şöyle tanımlarsınız: Dim dizi() Yani sadece içi boş iki parantez ile... Bu diziyi daha sonra ReDim ile istediğiniz boyutta ve sayıda boyutlandırabilrsiniz. Örnek projemde göreceksiniz ben siniflar adlı diziyi şöyle boyutlandırdım : siniflar(sinifsayisi, 2). Sinifsayisi değişkeni de bir fonksiyon tarafından üretilmekte. yani kullanıcı hiçbir bilgi girmeden program tüm dizi değerlerini run-time olarak bir yapılandırma dosyası içinden okumakta ve diziyi oluşturmaktadır.
ReDim sub'lar içinde kullanılabilir.

Bir form içinde yada tüm proje dahilinde geçerli olacak dizi nasıl deklere edilir?

İlkine cevap: Formun General Declarations kısmında DIM ile deklere edeceğiniz dizi o formun heryerinde geçerlidir.

İkincisine cevap: Bir bas modülünün Declaration kısmında PUBLIC ile deklere edeceğiniz dizi tüm proje dahilinde geçerlidir.

Başka bir ayrıntı : Bas modülü içinde Private ile deklere edeceğiniz dizi sadece o modül içinde geçerlidir.


Dizinin run-time oluşturulması nasıl yapılır?

Yazdığımız program içinde sınıf numaralarını ve her sınıfın hocasını bir çok yerde kullanmamız gerekiyor. Ekteki superkyt.ini içinde tam 46 adet sınıf olduğu görülüyor. Sınıfların numaralandırılışı 1'den 46'ya kadar rakamlarla yapılmış, ve her sınıfın hocası da sınıf numarasının karşısına yazılmış. Hazırlayacağımız dizi ile çok pratik şekilde istediğimiz anda programımızın herhangi bir yerinde herhangi bir sınıfın hocasının adını kullanabileceğiz. Aynı şekilde sınıf numarasını biliyorsak hoca adını hemen bulabileceğiz.
Hazırlayacağımız dizi içinde sınıf numarası ve sınıf hocası var olacak. Diyelim ki siniflar(1,1) birinci sıradaki sınıfın sınıf numarasını (bu numaralar 1, 7, 55 gibi rakamlar veya TEM4, HAZ23 gibi kelime dizileri de olabilir), siniflar(1,2) ise aynı sınıfın hoca adını tutacaktır.



ReDim siniflar (sinifsayisi, 2) As String 'Diziyi boyutlandır
DIM ind As INTEGER 'Dizide kullanılacak sayaçı tanımla
DIM yer As INTEGER
bosdosya = FREEFILE 'Açılacak dosyaya bir numara al

OPEN "SUPERKYT.INI" FOR INPUT AS #bosdosya 'Dosyayı okumak için aç

DO UNTIL EOF(bosdosya) 'Bu döngü okuma işlemini gerekirse dosyanın sonuna kadar yapacak.

LINE INPUT #bosdosya, R$ 'Bir satır oku ve okunan satırı R$ adlı string içine yaz
IF R$ = "[Sınıflar-Okutmanlar]" THEN EXIT DO 'Eğer okunan satır aradığımız tag ise döngüden çık.
LOOP

'Artık öğrendiğimiz sinifsayisi sayısı kadar
'dönecek For Next döngüsü ile o sayı kadar satır okuyacağız
'Okunan her bir satırda sınıf numarası ve hoca adı olacaktır.

FOR ind = 1 TO sinifsayisi

LINE INPUT #bosdosya, R$ 'Bir satır oku ve okunan satırı R$ adlı string içine yaz
yer = INSTR(R$, "=") 'Okunan satırda eşittir işaretinin yerini belirle
siniflar(ind, 1) = LEFT$(R$, yer - 1) 'Dizinin birinci elemanının ilk bölümü (sınıf no) "=" 'işaretinden 'bir önceki yere kadar yazılı olan 'string dir

siniflar(ind, 2) = MID$(R$, yer + 1) 'Dizinin birinci elemanının ikinci bölümü (hoca adı) ' = işaretinden bir sonraki yerden itibaren satır ' sonuna kadardır.

NEXT ind

Dizi elemanlarını bu şekilde yazdığımız az sayıda kod satırı ile yerleştirdik. Superkyt.ini içinde tam 46 adet sınıf var. Her sınıf için 2 eleman gerektiği için, elle tek tek yazmaya kalksak 92 satır yazmamız gerekirdi (üst satırdaki borçlular dizisi gibi...)


Kullanıcının istediği bilgi dizi içinde nasıl aranır?


Yazdığınız programı kullanan kişiye bir sınıfın hoca adı gerekebilir. Bu kişi sınıf numarasını girdiğinde program ona hoca adını vermelidir, yani diziyi baştan sona kontrol etmeli ve girilen bilgiye uyan dizi elemanının olup olmadığını kontrol etmelidir.

Sub hoca_ara()

Dim aranan As String
Dim bulundu As Boolean
Dim sayac As Integer

bulundu = FALSE
aranan = INPUTBOX("Sınıf numarasını yazınız")

For sayac = 1 To Ubound(siniflar)
If aranan = siniflar(sayac, 1) Then
    bulundu = TRUE
    Exit For
Else
bulundu = FALSE

End If
Next

If bulundu Then
MsgBox "Aradığınız sınıfın hocası: " & siniflar(sayac, 2)
Else
MsgBox "Aradığınız sınıf yok"

End If

End Sub

Bir dizide kaç eleman olduğunu nasıl anlarız?

UBound( ) bir dizinin eleman sayısını verir.



Yukarıda anlatılan dersin program kodlarını indirmek için tıklayınız.
Önemli not: Kodların çalışabilmesi için VB5 versiyonuna ihtiyacınız var. Ayrıca Superkyt.ini dosyasını program kodlarıyla aynı dizin içine kopyalayın yoksa kodlarda değişiklik yapıp bu dosyanın yerine programa göstermelisiniz.

 


Komut Düğmesi (Button) Özellikleri

 

 

 

Komut Düğmesi (Command Button)

Bir uygulamanın kullanıcı ile etkileşime geçmesi için en kolay yol kliklemek için buton kullanmaktır. VB tarafından sağlanan Command Button nesnesini kullanabilirsiniz yada isterseniz bir resmi (image nesnesi) yada bir ikonu command buton olarak kullanabilirsiniz.

Komut Düğmesi Kullanımı

VB uygulamalarının çoğunda kullanıcının programı kullanması için butonları vardır. Kullanıcı bir butonu seçince istenen olay yerne gelmemiştir, kullanıcının butona basması ve bırakması gerekir, o zaman Click olayı meydana gelir. Oluşmasını istediğiniz olayın kodlarını Click yordamı içine yazmanız yeterli olacaktır.


Çalışma anında bir command butonu seçmenin birçok yolu vardır.
. Butonu fare ile kliklemek
. TAB tuşuna basarak butonun aktif nesne olmasını sağlamak ve Yürütme çubuğu yada Entere basarak butonu çalıştırmak
. Bir kısa yol tuşuna basmak. (ALT+önceden belirlenmiş bir tuş)

. Yada kod yazarak Commnd butonun Value özelliğini True yapmak ile:
Command1.Value = True gibi
. Command butonun Click olayını kod ile çalıştırmak ile:
Command_Click
. Command buton form üzerinde focus alan (aktif olan) nesne ise Entere basmak butonu çalıştırır. Ancak siz istediğiniz butonu aktif buton yapabilirsiniz: Command2.SetFocus

Tüm bu hareketlerle VB'nin bir butonun Click yordamını çalıştırmasını sağlayabilirsiniz.
Butonun Caption özelliği ile buton üzerine yazı yazarsınız.
Visible özelliği butonun görülüp görülmeyeceğine karar verir. True yada False değeri girebilirsiniz.

Örnek : Bir Form üzerine iki buton yerleştirin. Birine komut1 diğerine komut2 adını verin.
Formun load yordamına (form belleğe yüklenirken oluşacak kodlar buraya yazılır)

komut2.Visible = False

yazın. Bu kod komut2'nin görünmez olmasını sağlar. komut1 üzerine çift tıklayın açılan Click yordamı içine

komut1.Visible = False
komut2.Visible = True

yazın. Böylece komut1 üzerine tıklayınca kendisi görünmez olacak komut2 görünür olacaktır.

 


Instr Fonksiyonu

 

Instr fonksiyonuyla birlikte veritabanı işlemleri hakkında bilgi veriliyor

 

Sizlere "bir text dizini içinden birden fazla sözcüğü seçme" işlemini anlatayım. Öncelikle şunu bilelim: "Bir kişinin birden fazla adı olabilir" Ali Osman Taşçı vs gibi. Tek adı olan kişi için adı ve soyadı ayırmak daha kolay. Gerçi her iki iş için de tek bir VB fonksiyonu kullanılıyor : INSTR( )
Bu fonksiyon bir text dizini içinde belli bir karakter(leri) aramak ve yerini (sıra numarası olarak) belirlemek için kullanılır. Yani fonksiyon bir sayı verir, bu sayı da aradığın karakter(ler) in başlangıç sırasıdır. Beraber yazılmış bir ad+soyadı ayırmak için "boşluk" karakterini kullandım: " "  . Bu boşluk mutlaka kişinin adı ve soyadı arasında yazılmış olmalıdır. İkinci bir ad var mı diye arama yaptırırsın, bir boşluk daha bulursan bu da ikinci addır.

Bir programcı olarak kullanıcılara kolaylıklar sunmak görevimizdir. Bu yüzden, peşpeşe iki inputbox çıkarıp öncekine "Adı yazınız" sonrakine de "Şimdi de soyadı yazınız" demek pek iyi olmazdı bu yüzden kullanıcı tek bir inputbox içine ad ve soyadı yazar. Daha sonra biz ad ve soyadı ayırırız:

a = InStr(Trim(isim), " ")      Bu isim değişkeni içinde ilk boşluk karakterini arıyor

i = InStr(a + 1, isim, " ", vbTextCompare)  yukarıdaki satırda a değeri sıfır olmazsa, bu satır  ile isim içinde başka bir boşluğun olup olmadığı araştırılıyor.

Yukarıdaki iki satır ayırma işleminin ana damarlarıdır. a ve i değişkenlerinin aldığı değerlere göre işlemin nasıl devam ettiğini aşağıdaki kod bloğunda izleyebilirsin. Ben bu kodun aslında pek te iyi olmadığını söylemek zorundayım. Çünkü kullanıcılar her zaman hata yaparlar ve bu hatalar genelde senin hiç bir zaman aklına gelmeyecek hatalardır. Eğer kullanıcı ad ve soyad arasında iki boşluk bırakırsa arama yapılamaz... (İyileştirmek gerek...)

Sub Ad_Soyad_Ara(isim As String)
Dim adi
Dim soyadi As String
If isim = "" Then Exit Sub
a = InStr(Trim(isim), " ")
If a = 0 Then Exit Sub
i = InStr(a + 1, isim, " ", vbTextCompare)
If i = 0 Then
   adi = Left(isim, a - 1)
   soyadi = Mid(isim, a + 1)
Else
   adi = Left(isim, i - 1)
   soyadi = Mid(isim, i + 1)
End If
Ara "adsoyadidx", adi, soyadi
End Sub


Şimdi birden fazla alanda nasıl arama yaptırılır?

Yanıt: İndexler yaratarak. Veritabanı (mdb) içinde indexler vardır. Aramayı dilediğin alanlara bakarak yapmanı sağlar. İndex yaratma işlemini kendin öğrenmelisin.

Seek fonksiyonu mdb içinde arama yapar. Ancak bir index'e gereksinimi vardır. Örneğin sadece Ad araması yapılacaksa fonksiyon sadece mdb içindeki Ad field'ini filtreler ancak ad+soyad aranacaksa Seek fonksiyonu her iki field'i filtreler ve ancak ad ve soyad alanları kriterlere uyan kayıtları seçer. Yani aramada Hamdi Özkan adında bir kişiyi arıyor olalım ve diyelim ki mdb içinde 5 tane Hamdi kaydedilmiş. Önce bu Hamdi'ler seçilir ancak ikinci filtreleme 5 Hamdi arasında yapılır ve soyadı Özkan olan Hamdi seçilir ve böylece arama sonuçlanmış olur.

Aşağıdaki Sub üç tane eklenti alır. Bir index ve iki aranan. Eğer ikinci aranan (aranan1) yok ise o zaman sadece tek aranan var kabul edilir ve tekli arama yapılır (sadece ad gibi...) değilse ikili arama yapılır (ad+soyad gibi...) If bloğunu incelersen görürsün. Arama işlemi bir Recordset nesnesi içinde yapılır. Tabi ki sen bu Recordset'i nasıl oluşturacağını bilmelisin. Buradaki Recordset'in adı "recHastalar" dır.

İkinci If bloğu Recordset'in NoMatch özelliğini test ederek aramanın olumlu yada olumsuz olduğuna bakar. Bu iş standart olarak "If Not recSet.NoMatch" ile yapılır. Bunun anlamı "arama olumlu ise" demektir.

Aşağıdaki kodu inceleyin...

Sub Ara(ind As String, aranan As Variant, aranan1 As String)

With recHastalar
    .Index = ind   <= Burası önemli yapılacak aramanın index'i bildiriliyor...
    If aranan1 = "" Then
       .Seek "=", aranan
    Else
        .Seek "=", aranan, aranan1
    End If
    If Not .NoMatch Then
        .... aramanın olumlu olması halinde
             yazılacak kod buraya
    Else
        .... aramanın olumuz olması halinde
             yazılacak kod buraya (örnek olarak
             msgbox "Kayıt bulunamadı"  gibi)
    End If
End With
End Sub


Sonuç olarak birden fazla alanı taratarak arama yaptıracaksan indexler kullanabilirsiniz. Yada bir SQL sorgu da aynı işi görür:

strSQL = "Select * From Hastalar Where Ad = 'Hamdi' And Soyad = 'Özkan';"

VB'de Modüller

 

Bilmeniz gereken modül bilgisi

 

VB kodları modüller içinde saklanır. Üç çeşit modül vardır. Form, Standart ve Class.

Basit uygulamalarda sadece bir form vardır ve tüm kod bu formun modülü içinde durur (uzantısı frm). Ancak programınız büyüdükçe ek formlar eklersiniz. Sonunda, bir çok farklı formda tekrar tekrar yazmak zorunda olduğunuz kodlar olduğunu farkedersiniz. Her forma aynı işi yapan kodları yazmak istemeyeceğiniz için ortak görevleri içinde barındıran bir ayrı modül yazarsınız. Bu ayrı modül bir standart modüldür (uzantısı bas). Zaman geçtikçe ortak kullanılan yordamları içeren bir modüller kütüphanesi kurarsınız.


Her standart, class yada form modülü şunları içerebilir:
. Deklerasyonlar: constant, type, variable ve dynamic-link library (DLL) yordam deklerasyonları standart, class yada form modüllerinin modül seviyesine yazılır.
. Yordamlar: Sub, function yada Property yordamları

Form Modulleri:
Form Modulleri (uzantısı FRM) VB'nin temelidir. İçlerinde ait oldukları formun tüm özellikleri vardır. Genel yordamlar, form düzeyi değişken deklerasyonları, costantlar (değişmezler), type'lar (kullanıcının belirlediği veri türleri)

Standard Moduller:
Standard Moduller (uzantıları BAS) diğer modüllerini ortak kullandıkları yordamları ve değişken tanımlamalarını tutarlar. Global (tüm uygulamada geçerli) yada modül düzeyinde geçerli değişkenler, değişmezler, türler tutarlar. Standart modüller dikkatli yazılırlarsa diğer projlerde de kullanılabilirler.


Class Modulleri:
Class Modulleri    (uzantıları CLS) VB'nin nesne tabanlı programlama özelliğinin temelidir. Yeni nesneler yaratmak için class modülleri içine kod yazarsınız. Bu nesnelerin sizin belirlediğiniz özellikleri ve metotları olur. Aslında formlar üzerlerine kontroller yerleştirilmiş pencereler gösterebilen birer class modülüdür.

VB Projesi Nelerden Oluşur?

 

Program üretiyorsunuz; ama ürettiğiniz program nelerden oluşuyor? Her bir parça ne işe yarıyor? Biliyor musunuz? Ama olmaz ki! İşte bilgiler aşağıda:

 

Bir proje geliştirirken, uygulamanızda bulunabilecek proje parçaları şunlardır:
. Projeye ait tüm elemanları tutan (.vbp) proje dosyası
. Her bir form için (.frm) form modülü
. Her bir formun resim, icon gibi özelliklerini tutan veri dosyası (.frx)
. Opsiyonel olarak, (.cls) class modül
. Opsiyonel olarak, (.bas) standart modül
. Opsiyonel olarak, bir yada fazla ActiveX kontroller (.ocx)
. Opsiyonel olarak, kaynak dosyası (.res)


Proje dosyası (vbp) projenin tüm dosyalarını ve proje ile ilgili tüm dosyaları tutar. Bu bilgi projeyi her kaydedişinizde yenilenir. Proje tamamlandığında onu bir exe dosyasına dönüştürebilirsiniz. File menüsünden Make project.exe 'yi seçmeniz gerekir. VB'nin Professional ve Enterprise versiyonları ile ocx ve dll uzantılı yürütülebilir dosyalar da üretebilirsiniz
   

Project Explorer


Yeni dosyalar ekleyip yada çıkardıkça VB yapılan değişiklikleri Project Explorer penceresinde
gösterir. Bu pencerede projeye ait olan dosyaların listesi vardır.

Project Explorer Penceresi

Yordam (SUB yada FUNCTION) Üretmek

 

Programların tüm ağırlığını yordamlar çeker. Yordam hazırlayamazsanız çok zorlanırsınız. Bu ders size yordam nedir, nasıl oluşturulur öğretecektir (tabi bilmiyorsanız).


İstediğiniz tür yordamı aşağıdaki şekilde kod penceresine yazın. VB geri kalan kısmı kendisi yazacaktır (End Sub yada End Function)

Sub FormuGuncelle() yada
Function FormSayisi()


Yordamları formlar içine yada moduller içine yazabilirsiniz. Yazmak için General Declerations kısmını seçin...

Yordamları Çağırmak:
Program içinden yordamları çağırma teknikleri değişir. Aşağıda Sub yada Function yordamların nasıl çağırıldığı vardır:

SUB Yordamları Çağırmak:

İki yol vardır. Yordama yüklemek istediğiniz değişkenleri sırasıyla yordam adına eklersiniz:

YordamAdı BirinciDeğişken, İkinciDeğişken

yada Call metodu ile yordamı çağırırsınız:

Call YordamAdı (BirinciDeğişken, İkinciDeğişken)

Yukarıdaki örnekte parantez kullanmak zorunda olduğunuza dikkat edin.

Burada yordam adı olarak FormuGuncelle
BirinciDeğişken olarak bir renk değeri mesela 14 (açık sarı)
İkinciDeğişken olarak ise form caption değerini kullanmamız gerektiğini düşünelim.

FormuGuncelle 14, "Yeni Form"

satırını kullanırız. Bu yordam ise (temsili olarak) aşağıdaki gibi olur:

Sub FormuGuncelle (renk As Byte, baslik as String)

Form1.Caption = baslik 'Form Caption'u "Yeni Form" olarak değişir.
Form1.BackColor = QBColor(renk) 'Form arkaplan rengi parlak sarı olur.

End Sub

Kolaylığı farkettiniz değil mi? Tek satır kod ile (FormuGuncelle 14, "Yeni Form") formun bazı değerlerini değiştirdik. Bunu programımız içinde birçok kez kullanmamız gerektiğini düşünürsek her defasında yordam içeriğini tekrar tekrar yazmak çok zaman ve yer alacağı için bir Sub yordamının ne kadar işe yaradığı ortaya çıkıyor.


Function Yordamlarını Çağırmak:

VB'nin standart fonksiyonlarını çağırmak gibi kullanılırlar. Sub yordamlarından farkları bir değer üretirler yada bir değeri temsil ederler. Aşağıdaki örneği inceleyiniz:

Function hesapla (ilksayi As Integer, ikincisayi As Integer)
     hesapla = ilksayi * ikincisayi
End Function


Bu fonksiyon sadece verilen iki değişkeni birbiri ile çarpar ve oluşan değer fonksiyonun değeridir. O zaman hesapla(4,6) 24 değerini üretir. Aşağıdaki örnekler de fonksiyonu çalıştırır:

x = hesapla(4,7) "Burada x'in değeri 28 olur.
x = hesapla(4,7) + hesapla(2,2) 'Burada x'in değeri 28 + 4 = 32 olur.


Diğer Modüllerdeki Yordamları Çağırmak:


Modüllerdeki Public yordamlar projenin her yerinden çağırılabilir. Bunu yapmak için değişik teknikler vardır:

1. Form Modullerindeki Yordamları Çağırmak:
Form modülü dışındaki herhangi bir yerden yordam çağırmak için Form modüle referans etmeniz gerekir. Form1 modülü içinde yordam1 adlı yordamı çağıralım:

Call Form1.yordam1(argümanlar)

2. Class Modüllerdeki Yordamları Çağırmak:

Form modüllerindeki yordamları çağırmak gibi Class modülüne de bir çağrı yapmalısınız.
Ancak burada Class modülünün bir kopyasının üretilmesi gerekmektedir. Bunu Dim ile önceden deklere etmeniz gerekir. Aşağıda birinci satır bunu yapıyor, ikinci satır ise Class1 Class modülü içindeki OrnekYordam adlı yordamı çağırmaktadır:

Dim KopyaClass as New Class1
KopyaClass.OrnekYordam

   
3. Standart Modüller (bas) İçindeki Yordamları Çağırmak:
Yordam adı tek ise bas modülü adını kullanmanıza gerek yoktur. Ancak birden fazla modül aynı ada sahip farklı yordamlar kullanıyorlarsa o zaman modül adını da kullanmanız gerekir:

Modul1.Yordam1(argümanlar)
Modul2.Yordam1(argümanlar)


Modül adını vermeden Yordam1 adlı yordamı Modul1 içinden çağırırsanız, aynı modül içindeki yordam çalışır, (yani burada Modul1 içindeki Yordam1). Diğer modül içindeki aynı ada sahip yordamı çağırmak istiyorsanız Modul2.Yordam1(arg) dizimini kullanmalısınız.

Yordam Nedir?

 

 

 

Programlama işlemlerini küçük mantıksal ünitelere bölerek kolaylaştırabilirsiniz. Prosedür (yordam) adı verilen bu üniteler yardımıyla programlarınızı zenginleştirebilir ve kolaylaştırabilirsiniz.

Yordamlar yoğun olarak yinelenen ve ortak kullanılan görevler için kullanışlıdır. Örenk olarak: hesaplamalar, text ve veri girişleri...
Yordamlar kullanarak program yazmanının iki önemli özelliği vardır:
. Yordamlar program kodunu daha küçük ferdi parçalara bölerler , böylece hata ayıklama daha kolay olur.
. Bir program için yazılan yordamlar farklı programlar için de kullanılabilir.

VB'de kullanılan yordam türleri:

. Sub yordamlar. Değer üretmezler
. Function yordamlar. Değer üretirler
. Property yordamlar. Değer üretir ve atarlar ve de nesnelere referanslar yüklerler.

Buraya kadar anladıysanız yordam üretmek dersine geçiniz

Yordam (SUB yada FUNCTION) Üretmek

 

Programların tüm ağırlığını yordamlar çeker. Yordam hazırlayamazsanız çok zorlanırsınız. Bu ders size yordam nedir, nasıl oluşturulur öğretecektir (tabi bilmiyorsanız).


İstediğiniz tür yordamı aşağıdaki şekilde kod penceresine yazın. VB geri kalan kısmı kendisi yazacaktır (End Sub yada End Function)

Sub FormuGuncelle() yada
Function FormSayisi()


Yordamları formlar içine yada moduller içine yazabilirsiniz. Yazmak için General Declerations kısmını seçin...

Yordamları Çağırmak:
Program içinden yordamları çağırma teknikleri değişir. Aşağıda Sub yada Function yordamların nasıl çağırıldığı vardır:

SUB Yordamları Çağırmak:

İki yol vardır. Yordama yüklemek istediğiniz değişkenleri sırasıyla yordam adına eklersiniz:

YordamAdı BirinciDeğişken, İkinciDeğişken

yada Call metodu ile yordamı çağırırsınız:

Call YordamAdı (BirinciDeğişken, İkinciDeğişken)

Yukarıdaki örnekte parantez kullanmak zorunda olduğunuza dikkat edin.

Burada yordam adı olarak FormuGuncelle
BirinciDeğişken olarak bir renk değeri mesela 14 (açık sarı)
İkinciDeğişken olarak ise form caption değerini kullanmamız gerektiğini düşünelim.

FormuGuncelle 14, "Yeni Form"

satırını kullanırız. Bu yordam ise (temsili olarak) aşağıdaki gibi olur:

Sub FormuGuncelle (renk As Byte, baslik as String)

Form1.Caption = baslik 'Form Caption'u "Yeni Form" olarak değişir.
Form1.BackColor = QBColor(renk) 'Form arkaplan rengi parlak sarı olur.

End Sub

Kolaylığı farkettiniz değil mi? Tek satır kod ile (FormuGuncelle 14, "Yeni Form") formun bazı değerlerini değiştirdik. Bunu programımız içinde birçok kez kullanmamız gerektiğini düşünürsek her defasında yordam içeriğini tekrar tekrar yazmak çok zaman ve yer alacağı için bir Sub yordamının ne kadar işe yaradığı ortaya çıkıyor.


Function Yordamlarını Çağırmak:

VB'nin standart fonksiyonlarını çağırmak gibi kullanılırlar. Sub yordamlarından farkları bir değer üretirler yada bir değeri temsil ederler. Aşağıdaki örneği inceleyiniz:

Function hesapla (ilksayi As Integer, ikincisayi As Integer)
     hesapla = ilksayi * ikincisayi
End Function


Bu fonksiyon sadece verilen iki değişkeni birbiri ile çarpar ve oluşan değer fonksiyonun değeridir. O zaman hesapla(4,6) 24 değerini üretir. Aşağıdaki örnekler de fonksiyonu çalıştırır:

x = hesapla(4,7) "Burada x'in değeri 28 olur.
x = hesapla(4,7) + hesapla(2,2) 'Burada x'in değeri 28 + 4 = 32 olur.


Diğer Modüllerdeki Yordamları Çağırmak:


Modüllerdeki Public yordamlar projenin her yerinden çağırılabilir. Bunu yapmak için değişik teknikler vardır:

1. Form Modullerindeki Yordamları Çağırmak:
Form modülü dışındaki herhangi bir yerden yordam çağırmak için Form modüle referans etmeniz gerekir. Form1 modülü içinde yordam1 adlı yordamı çağıralım:

Call Form1.yordam1(argümanlar)

2. Class Modüllerdeki Yordamları Çağırmak:

Form modüllerindeki yordamları çağırmak gibi Class modülüne de bir çağrı yapmalısınız.
Ancak burada Class modülünün bir kopyasının üretilmesi gerekmektedir. Bunu Dim ile önceden deklere etmeniz gerekir. Aşağıda birinci satır bunu yapıyor, ikinci satır ise Class1 Class modülü içindeki OrnekYordam adlı yordamı çağırmaktadır:

Dim KopyaClass as New Class1
KopyaClass.OrnekYordam

   
3. Standart Modüller (bas) İçindeki Yordamları Çağırmak:
Yordam adı tek ise bas modülü adını kullanmanıza gerek yoktur. Ancak birden fazla modül aynı ada sahip farklı yordamlar kullanıyorlarsa o zaman modül adını da kullanmanız gerekir:

Modul1.Yordam1(argümanlar)
Modul2.Yordam1(argümanlar)


Modül adını vermeden Yordam1 adlı yordamı Modul1 içinden çağırırsanız, aynı modül içindeki yordam çalışır, (yani burada Modul1 içindeki Yordam1). Diğer modül içindeki aynı ada sahip yordamı çağırmak istiyorsanız Modul2.Yordam1(arg) dizimini kullanmalısınız.

Değişkenlerin Faaliyet Alanı

 

Değişken yada Variable denir durur. Peki değişkenler tam olarak ne yaparlar - değişmekten başka? Hadi değişmeleri gerekirken aynı kaldılar ne yapacağız. Neyse değişkenler nerede geçerlidir nerede değildir... Tüm bilgi burada.

 

GİRİŞ


Visual Basic değişkenlerini anlayabilmek için gerekli 2 adet önemli özellik vardır:

Faaliyet Alanı:

Faaliyet alanı bir değişkenin görünebilirliğini belirler. Değişkenlerin faaliyet alanları evrenselden ( uygulamadaki her alt yordam ona ulaşabilir) yerele ( sadece tek bir alt yordam için kullanılabilir) kadar değişebilir.

Yaşam Süresi:

Yaşam süresi bir değişkenin ömrünü tanımlar. Değişkenler bütün bir program boyunca çalışabilecekleri gibi, tek bir alt yordam içinde yaratılıp yok edilebilirler.


Değişkenlerin Faaliyet Alanları:

Bir değişkenin faaliyet alanı, o değişkene kodun hangi bölümlerinden ulaşabileceğinizi belirler. Eğer bir değişken faaliyet alanının içindeyse onu okuyup, değerini değiştirebilirsiniz.Ama eğer değilse o değişkene ulaşamazsınız!

Visual Basic'de değişkenler için 3 çeşit faaliyet alanı tanımlanabilir:

Evrensel Faaliyet Alanı:
Evrensel değişkenler uygulamanın her bölümünde faaliyet alanı içindedir.

Modül Faaliyet Alanı:
Modül değişkenleri tanımlandıkları modülün içindeki her yerde faaliyet alanı içindedir.

Yerel Faaliyet Alanı:
Yerel değişkenlerin faaliyet alanı sadece tanımlandıkları alt yordamdır.


Evrensel Faaliyet Alanı (Global, Public)

Evrensel değişkenlere programın herhangi bir bölümünden ulaşılabilir. Herhangi bir alt yordamın içindeki herhangi bir kod satırı bu çeşit değişkenlerin değerini okuyup, değiştirebilir.

Kullanılması rahat olsa da, evrensel değişkenler kötü programcılık örneği sayılırlar ve bazı programcılar bu tip değişkenleri hiç kullanmamak için hatırı sayılır çabalar harcamaktadırlar.

Evrensel bir değişken yaratmak için değişkeni standart bir modülün "Declarations" kısmında 'Global' yada 'Public' ayrılmış sözcükleri ile tanımlayın!

Modül Faaliyet Alanı (Dim, Private):

Modül değişkenlerine, tanımlandıkları modül içindeki herhangi bir kod ile ulaşılabilir.

Evrensel değişkenleri kullanmak kötü programcılık örneği sayılsa da , modül değişkenleri öyle sayılmazlar. Bu tür değişkenler programdaki her alt yordama bir datayı tanımlamaya gerek kalmadan , alt yordamlar arasında bilgi paylaşımını sağlarlar.

Modül değişkenlerini kullanmak için, o değişkeni , bir modülün içindeki "Declarations" kısmında 'Dim' yada 'Private' ayrılmış sözcüklerini kullanarak tanımlayın!

Yerel Faaliyet Alanı (Dim):

Yerel değişkenler sadece tanımlandıkları alt yordam içinde kullanılabilirler. Yerel değişkenler faaliyet alanları en kısıtlı değişkenlerdir. Aynı modüldeki diğer alt yordamlar bile bu tür değişkenleri okuyup , değiştiremezler.


VARYASYONLAR:

Yukarıdaki Faaliyet Alanı türlerinden başka varyasyonlar da vardır.

Sınıf Modüllerindeki Evrensel Değişkenler (Public Variables in Class Modules):

Standart modüllerdeki evrensel değişkenlerden farklı olarak sınıf modüllerindeki evrensel değişkenler, sadece o sınıfı temsil eden bir nesne değişkeni faaliyet alanı içinde iken ulaşılabilirlerdir.Örnek olarak:
'Kisi' sınıfımızın içinde 'IlkAdi' isminde bir evrensel değişken tanımlayalım. Bu değişken evrensel olmasına rağmen, ancak 'Kisi' sınıfına ait bir nesne değişkeni faaliyet alanında ise kullanılabilir.'Kisi' nesnesini yaratmadan, sadece class modül içinde tanımlayarak o değişkeni kullanamazsınız! 'Kisi' nesnesini yaratmalısınız.

Form Modüllerindeki Evrensel Değişkenler (Public Variables in Form Modules):

Aslında formları sınıflardan türemiş olarak düşünebilirsek te Visual Basic, formları başka bir şekilde ele almaktadır.
Sınıftan farklı olarak formun nesne değişkenlerini tanımlamak zorunda değiliz.(Aslında tanımlamak iyi bir programcılık örneğidir). Eğer, formun dışından, bir formun evrensel değişkenini kullanırsanız, o formun bir kopyası, Visual Basic tarafından , sizin için oluşturulur. Tahmin edebileceğiniz gibi, bu olay bazı istenmeyen şeylere yol açabilir.

Gölgeleme (Shadowing) :

Eğer aynı ada sahip değişkenler tanımlanmışsa ve faaliyet alanında bu değişkenlerin birden fazlası aktifse , local olana en yakın olanı kullanılır. Örnek olarak:
Eğer bir alt yordamda 'Isim' adlı bir yerel değişken tanımlandıysa , ve aynı modülün Declarations kısmında 'Private' (Modül) olarak aynı adlı bir değişken tanımlandıysa , bir de başka bir modülde 'Global'(Evrensel) olarak , yine aynı adlı bir başka değişken tanımlanmışsa aşağıdaki olaylar gerçekleşir:
- 'Isim' adlı değişkenin tanımlamdığı alt yordamda , yerel değişken kullanılır,
- Modülün o alt yordam hariç diğer kısımlarında 'Private' olarak tanıtılan modül değişken kullanılır,
- Diğer modüllerdeki kodlar evrensel olan 'Isim' değişkeni kullanılır.
Bu gölgelendirmeden kolaylıkla kurtulabilirsiniz.Bunun için kullanılan en kolay yöntem değişken adlarını değiştirmektir(!) Modül değişkenlerin başına 'm' , evrensel değişkenlerin başına 'g' (Global) harflerini ekleyebilirsiniz. Daha fazla bilgi için lütfen "Programlama Standartları ve Ana Noktaları" bölümündeki "Isim Verme İşlemleri" sayfasına bakınız!


YORUMLAR


İyi bir programcılık için değişkenlerinizin faaliyet alanlarını mümkün olan en dar alan seçmelisiniz. Eğer mümkünse alt yordamların veri paylaşımını parametre kullanarak çözmeye çalışın! Bu çok net bir veri paylaşım yöntemidir ve "alt yordam değeri hangi değişkenden alacak" karmaşasını yok eder!

Alt yordamlardan bağımsız paylaşılması gereken veriler için en iyi çözüm modül değişkenleridir.Modül değişkenler o modül dışından kullanıma kapalı oldukları için , başka bir modülün o değişkenin var olup olmadığından ya da o değişkenin değerinin değişeceğinden korkmasına gerek yoktur.

Evrensel değişkenler genel olarak kullanılmamalıdır.Modüller arası veri paylaşımı için uygun olmalarına rağmen , kullanımları tehlikelidir. Programdaki herhangi bir alt yordam bir evrensel değişkeni değiştirebildiği için değişkenleriniz beklemediğiniz şekilde değişebilir. Ve son derece zor bir hata ayıklama süreci gerektirebilir.

Bu arada , evrensel değişkenlerle , evrensel sabitleri karıştırmayın. Evrensel değişkenlerin ne kadar kullanılmamaları tavsiye ediliyorsa , evrensel sabitlerin kullanılması da o kadar TAVSİYE EDİLİR! Sabitlerin değerleri , çalışma zamanında değiştirilemediği için evrensel değişkenlerin problemleri, sabitlerde yaşanmaz. Sabitlerin ilk amacı 'sihirli Numaralar' ın önüne geçmektir.'Sihirli Numaralar' kodlanmış özellik değerleridir. Örnek olarak:
Bir liste kutusu (Combo Box) şu 3 stilde olabilir:
Dropdown Combo - Aşağı doğru açılan bir listeye sahip metin kutusu
Simple Combo - Liste her zaman görüntülenir
Dropdown List - Kullanıcı listeden bir değer seçmelidir

Bu stiller sırayla 0,1 ve 2 değerlerine sahiptir. Bu değerleri kullanmak yerine bu değerle sahip sabitler kullanmak kodu daha anlaşılabilir hale getirecektir. Liste kutusu için Visual Basic'de , vbComboDropdownList,vbComboSimple ve vbComboDropdownList sabitleri mevcuttur. Numaralar yerine bu sabitleri kullanmak kodu daha okunabilir hale getirecektir.


Değişkenlerin Yaşam Süreleri:

Değişkenlerin yaşam süreleri, o değişkenin program çalışırken hafızada kalma sürelerini gösterir. Değişkenler program çalıştığı sürece ya da sadece bir alt yordam çalışırken hafızada kalabilir. Yaşam süresi , değişkenin faaliyet alanı ile bağlantılıdır, çünkü değişkenin tanımlandığı yer her ikisi ile de ilgilidir.

Normal şartlarda, modül düzeyinde tanımlanan değişkenler, program boyunca, bir alt yordamda tanımlanan değişkenler ise sadece o alt modül çalışırken aktif olurlar. Ama bu kurallara uymayan istisnai durumlar da vardır.

Statik Değişkenler:
Yerel değişkenleri, ve hatta bütün bir alt yordamı bile 'Static' olarak tanımlayabiliriz. Statik değişkenler alt yordamlar çağırılırken değerlerini korurlar. Statik değişkenler en çok, tekrar edilen fonksiyonlarda kontrol mekanizması olarak kullanılır. Bu sayede bir kez yapılması gereken işler, ve kendini tekrar eden fonksiyonlar kontrol edilebilir.

Sınıf Modülleri:
Sınıf modüllerinde tanımlanan modül değişkenleri, o sınıfa ait nesneler aktif olduğu sürece aktiftir. Sınıfta kullanılan bir nesneyi tanımlamadan, o modüldeki kod veya veriye direk ulaşamazsınız!

Form Modülleri:
Form modüllerine de, aynen sınıf modüllerinde olduğu gibi, formun bir örneği yaratılmadan ulaşılamaz. Ama, Visual Basic, formlara değişik bir şekilde ele alarak, formun herhangi bir özelliğine ulaşmak istediğinizde formun bir örneğini otomatik olarak oluşturmaktadır. Ve unutmayın ki, form değişkenleri, form nesnesine 'Nothing' değerini verip formu serbest bırakmadıkça, hafızada kalıcaktır (form1 = Nothing yazmalısınız!). Formu 'Unload' komutu ile kapatmak form değişkenlerini HAFIZADAN ATMAZ!

ÖZET:
Değişkenlerin faaliyet alanları ve yaşam süreleri hakkında hatırlanması gerekenler:

- Değişkenlerin faaliyet alanları, o değişkene programın hangi bölümlerinden ulaşabileceğinizi belirler.

- Yaşam süreleri, bir değişkenin programın çalışma süresince, ne kadar hafızada kalacağını belirler.

- Visual Basic 'gölgeleme' olayında en yerel değişkeni kullanır.

- Form ve sınıf modüllerindeki değişkenler için özel kurallar geçerlidir.

- İyi bir programcılık örneği için değişkenlerinizin faaliyet alanını mümkün olan en düşük düzeyde tutmaya çalışın!

Programlarınıza İnce Ayar

 

Yazdığınız programlar acaba en iyi performans için ayarlandı mı? Aslında birkaç küçük ayrıntıyı göz önüne alırsanız programlarınızı çok iyi ayarlayabilirsiniz. Aşağıda verdiğimiz ipuçlarını uygulayın.

 

Visual Basic'in 5. versiyonuna kadar, VB uygulamalarının olağandışı hız elde etmek için de kullanılabileceği bilinmiyordu. Yeni "native code compiler" ve geliştirilmiş "form engine" ile bu durum uzun sürmedi. Normal koşullarda bir VB uygulamasından hızlı performans beklemenin bir nedeni yoktur. Ancak, VB uygulamalarınız ve bilgisayarınız çalışırken, bu hızın bir kısmına sahip olabilmek için bazı genel tekniklerin uygulanmasına gereksinim duyulmaktadır. Herkesin yaptığı şeyleri yapmaya ve her kod satırını akort etmeye başlamadan önce, daha iyi bir performans için akılda tutulması gereken şey, iyi bir kod ayarından çok, iyi bir tasarım ve mimaridir. Eğer hala bu aşamada değilseniz, temel tasarım prensipleri ile kodlama uygulamalarını öğrenmenizi tavsiye ediyorum. Eğer uygulamalarınızın çoğu database client'ler üzerine ise, ayrıca Veritabanı programlama köşesinde Veritabanı Uygulamalarına İnce Ayar sayfalarını da ziyaret etmeyi unutmamanızı öneriyorum. Uygulamalarınızın performansı açısından, doğru düzgün bir veritabanı tasarımı ve veri giriş stratejisi hazırlamak, bir sürü kod ayarlamalarından çok daha fazla işe yarayacaktır.

Programlarınıza İnce Ayar Teknikleri

Genel olarak programlarınızın performanlarını üç alana ayırabiliriz:

1. Başlangıç performansı:
Uygulamanızın başlama zamanındaki en kritik öğe olup, aynı zamanda herhangi bir formun yüklenmesini de sağlar. Eğer uygulamanız görülebilir / izlenebilir bir uygulamaysa ve kullanıcının veri girişi yapması için hazırsa, bu en azından iyi bir performansa sahip olduğu görüntüsü verecektir.

2. Gerçek performans:
Yalın hız önemlidir, ancak hız, sık sık esnekliğe kurban edilebilir.

3. Fark edilen performans:
Bu kategoride, yalın hızdan daha önemli olabilen şey, kullanıcı açısından karşılıklı etkileşim duygusudur. Örneğin, çoğu kelime işlemci programları yazdırma işini, bir artalan görevine verir. Gerçek yazdırma işlemi artalanda çalışıyorsa, uzun süre alabilir. Ancak, uygulamalar, hemen diğer bir görevle devam edebilmeleri nedeniyle kullanıcı açısından daha duyarlıdırlar.

1. Başlangıç Performansını Artırma

Uygulamanın bütünü ve ayrı ayrı formlar için başlangıç performansını etkileyen bir kaç önemli faktör şöyle sıralanabilir;

- "Sub-main" içinde ve formların başlatma ve yükleme olaylarında yapılan işleri azaltın.
İlk formunuzun görülmesinden önce çalışan herhangi bir kod, kullanıcının uygulamanızla ilgili herhangi bir respons görmeden önce bekleyeceği bir zaman periyodunun olduğu anlamına gelir. Eğer başlangıç kodunu elimine edemeseniz bile, en azından kullanıcıya bazı şeylerin mümkün olduğu kadar çabuk görünmesini sağlamaya çalışın. Başlangıç kodu çalıştırılmadan önce, formun kendini göstermesini sağlamak için "Load event" içindeki "Show" metodunu kullanabilirsiniz (ancak, formu taşıyan, kontrolleri ayarlayan veya görülebilir bir titreme efektine neden olan daha sonraki kodlara sahip olmadığınıza emin olmanız gerekmektedir).

- Formlarınızın üzerindeki kontrollerin sayısını azaltın.

Kontroller hafızayı ve diğer kaynakları tüketirler, ve genellikle sizin yarattığınız kontroller, standart Windows kontrollerinden daha çok kaynak tüketirler. Potansiyel olarak düzinelerce kontrollerle oluşturulabilen "tabbed dialog" kutuları yada kontrollerle dolu formlar yaratmak kolay ve bir o kadar da çekici olmalarına karşın, bunlar birer performans katilidirler.

- Kontrol dizileri kullanın.

Kontrol dizileri (Control arrays), nispeten hafıza ve kaynak tüketiminin azaltılmasına yardım ederler ve ayrıca, dizinin bütünü için gerekli tekil prosedürler içinde yer alan olay yordamlarını bütünleştirerek sarf edilen kodlama çabalarını en aza indirirler.

- Grafikleri minimumda tutun.
Arayüzünüzdeki zengin grafik ve şekiller, çekici olsalar da, çok fazla hafıza tüketirler ve çizim yapmak için çok sayıda hesaplama döngülerine sahiptirler. Grafiklerin miktarında yapılan azaltma, formların yüklenme zamanı üzerinde önemli bir etkiye sahip olabilmektedir.

- Splash screen kullanın.

Çoğu geniş kapsamlı uygulamalar, başlama zamanında bazı kurma işlemlerine gereksinim duyarlar. Eğer program çalışmaya devam ediyorsa, kullanıcıyı programın çalışıp çalışmadığını anlamak için orada merakta bırakmaktansa, başlangıç kodunun çalışması bitinceye kadar onlara bakacakları bir şeyler vermek için basitte olsa bir splash screen gösterin. Bir splash form uygulamanın başlamasını hızlandırmak için hiçbir şey yapmamasına karşın, başlangıca parlak bir görünüm verir ve kullanıcının uygulamanın bir şeyler yaptığını anlamasına olanak tanır.
Uygulamanızın çalıştığı hardware platforma bakmaksızın splash formun düzgün çalışır olarak dizayn ettiğinizden emin olun. Eğer formunuzu 486/33 makinalar için tasarlamışsanız ve de gayet iyi çalışıyorsa, yüksek RAM kapasiteli bir 200 MHz Pentium makine de belki bir titremeden başka sorun olmayacaktır. Kullanıcıdan gerektiğinden fazla zaman çalmayın, ancak splash formun kullanıcının onu görmesine yetecek kadar bir süre görünür olduğundan da emin olun.

- Yalnızca ihtiyacınız olan veriyi yükleyin.

Günümüzün yüksek performansa sahip disk subsistemleriyle bile, geniş hacimli dosya sistemi (file i/o) direkt hafıza girişinden daha yavaştır. Diskten veri alma (initialization files, text files, random access files, custom binary files, local/remote database gibi dosyalardan) zaman gerektiren bir işlemdir. Yalnızca ihtiyaç duyduğunuz verileri yükleyerek, yukarıda sözü edilen dosyaların miktarlarını azaltabilirsiniz.
Unutmayın, anahtar konu, uygulamanızın bazı öğelerini mümkün olduğu kadar çabuk kullanıcının önüne getirmenizdir. Ancak, bir formun ortaya çıkıp kaybolması bir yada iki saniye alıyorsa, kullanıcı henüz çalışmaya hazır olamayacağı için zaman kaybı olabilir.

2.Gerçek Performansı Artırma

Kullanıcının hızlı bir şekilde uygulama ile karşılıklı etkileşime gireceği bir noktaya sahip olması önemli bir husustur. Bunun için de bu noktayı mümkün olduğunca hızlı bir biçimde çalıştıracak uygulama kodlarına gereksiniminiz vardır. Performansınızı hızlandırmak için kodunuza aşağıda söz edilen ince ayar tekniklerinin bir kısmını uygulayabilirsiniz.

-Variant'ların kullanımından kaçının.

Variant değişkenleri, esnek olmalarına karşın, son derecede yavaştırlar. Tasarım aşamasında, bilinmeyen veri tipleri ve Null'lar için Variantların kullanımını gerektiren bir durum olmadığı sürece, temel veri tipleri ile yapıştırın.

-Mümkün olduğunca Integer'leri kullanın.

32-bit uzunluğundaki Integer(tamsayı), 386'dan beri her intel işlemcinin doğal veri tipi olmuştur. Buna göre, hardware (işlemci)integer operasyonlarını, "floating point" yada "Variant" operasyonlarından daha hızlı çalıştıracaktır.
Matematikte "floating point"in kullanımını gerektirecek gibi görünen bazı işlemlerde "integer"ler kullanılabilir. Örneğin, formları veya kontrolleri hareket ettirdiğiniz zaman yalnızca "twip" yada "pixel"leri kullanıyorsanız, bunların yerine integerleri güvenle kullanabilirsiniz. Yalnız, floating point (düzeltme noktası) bölme operatörü (/) yerine, integer bölme operatörünü (\) kullanmayı unutmayın.

-Mümkün olduğunca With.........End With kullanın.

Her "object reference" (nesne referansı)çözümleme için hesaplama döngüleri alır. With......End With deyimi kullanılması ile, VB yalnızca bir kez nesne referans çözümlemesine gereksinim duyar, kullanılmadığı durumda ise her aşama (statement) için ayrı ayrı çözümleme gerektirir.

-Property değerlerini Local değişkenler içinde saklayın.

Property (Özellik) okumaları ve yazmaları pahalı işlemlerdir. Bir procedur içinde bir property değerini birden fazla girecekseniz, onun değerini bir local değişken içinde tutun ve property değerini doğrudan okuma yerine bu değişkeni kullanın.

- Loop'lardan çok mümkün olduğunca kodları uzaklaştırın.

Mümkün olduğunca çok kod taşınarak veya uzaklaştırılarak Loop yapıları önemli ölçüde hızlandırılabilir. Eğer Loop'lar birbirinin içine girmişse, kodları bu yuvalanmanın en uç tarafına doğru taşımaya çalışın. Eğer mümkünse, object reference'ları veya property okumalarını bir Loop'un bünyesinde oluşturmaktan kaçının.

-Dosyaları hafızada tutun.

Disk üzerinde depolanmış ve sıkça kullanılan veriler hafızada (memory) tutulmalıdır. Bununla birlikte, bunu yapmakta aşırıya kaçmayın. Aksi takdirde RAM'den sayfalaşma dosyasına (virtual memory)doğru daha çok veri değiş-tokuşu yapmak için Windows'u zorlayacak ve depolanan verilere sahip olmanın avantajını kaçıracaksınız.

-Uzaktan erişimli verileri yerel olarak saklayın.

Eğer bir ağ sürücüsüne yada remote database server'a gitmek zorundaysanız, mümkünse sıkça kullanılan verileri local olarak depolayın. Son zamanlardaki hızlı Ethernet ağlarının varlığında bile, hard diskten (local)veya hafızadan veri girmek, ağ üzerinden gitmekten daha hızlıdır. Özellikle remote data için yavaş bir WAN hattından gitmek zorundaysanız, local depolama stratejisi yeterli performans için kritik öneme sahip olabilmektedir. Performansı tekrar kazanmaya ek olarak, ağ yöneticisi, ağ üzerindeki trafiği azalttığınız için size teşekkür edecektir.

-İhtiyacınız olmayan verileri gidip almayın.

Yalnızca gerçekten tembel olan programcılar, uygulama tarafından gerek duyulmayan verileri alırlar. Örneğin, veritabanı sorgulamalarında SELECT*'i rutin olarak kullanıyorsanız, hemen hemen kesin olarak ihtiyacınız olmayan verilere dönüyorsunuz demektir. Diskten sizin uygulamanıza taşınan verinin her byte'ı zaman ve hafıza tüketir.

-Ham performansın profilini çıkarın.

Eğer performans kriterlerini ölçmüyorsanız, yalnızca tahmin ediyorsunuz demektir. Tahmin etmeyin. Uygulamanızın performansını ölçmek için bir profil çıkarma aracı yada kendi kodunuzun bir kısmını kullanın ve sonra da kodunuzun ince ayarını yapın.

3.Algılanan Performansı Artırma

Yalın hız önemlidir ve bu hız programı çalıştıracak bir kod parçası için gerekli zamanı en aza indirme duygumuzu tatmin eder. Ancak kullanıcı yalın hıza çok dikkat etmez. Kullanıcılar daha çok, uygulamanın girdilerine mümkün olduğunca çabuk yanıt vermesini ve verilen görevi bitirmesini isterler. Bazı durumlar için, bu yalın hız anlamına gelebilir, fakat çoğu durumda, bunun anlamı uygulamanın daha hızlı olmasından ziyade daha akıllı olmasıdır. Ek olarak, kullanıcının, bir işlemin sona ermesi için beklemesi gerektiği bu gibi durumlarda, uygulama, görevi gerçekleştirdiğine dair kullanıcıya bir bildirim sağlamak zorundadır.

Kullanıcıya daha iyi bir duyarlılık (programın kullanıcıya verdiği karşılık) duygusu sağlayabilecek iki temel teknik vardır:

- İşleri havale etmek/görevlendirmek:
Windows'un çok görevli bir işletim sistemi olması nedeniyle, görevlerin diğer bir uygulamaya dağıtımı, performansa büyük bir katkı sağlayabilmektedir. VB4 ile başlayan bu özellik, gittikçe daha da basitleştirildi. Uzun süre çalışan bazı görevleri diğer bir işleme göndermek için OLE Automation ve Active X server components'leri kullanabilirsiniz. Bazı durumlarda bu, birleştirme ve kuyruk yapılarının kurulumunu gerektirebilir, eğer kullanıcı zamanının makul bir kısmını ayırırsa, bu işlem için harcanan çabalar karşılığını verecektir. Havale edilen işin (delegating work) son günlerdeki anlamı, işin diğer bir bilgisayara geçirilmesidir. Bu, VB Enterprise Edition'daki Remote Automation yoluyla ve şimdilerde de DCOM ile mümkün olabilmektedir. Visual Basic 5 ile, bazı durumlarda çoklu-bağlantılı uygulamalar bile yaratabilirsiniz. Visual Basic Programmer's Journal'in 1997 Mayıs sayısında, bir VB uygulamasında bağlantılar yaratmak için VB5'in AddressOfOperator'ünü kullanmayı gösteren bir makale bulunmaktadır. Eğer, 16-bit platform üzerinde çalışan VB3 gibi eski versiyonları bile kullanıyorsanız, Shell function, DDE, OLE Automation veya NetDDE gibi yapılar kullanarak çalışmayı dağıtabilirsiniz. Eğer uygun API'leri değiştirmeye (modifiye etmeye) razıysanız, çevredeki bilgisayarlara yada işleri başarabilecek döngüleri içeren işlemlere veri ve görev aktarma amacıyla, bir ağ üzerinden veya lokal olarak iletişim kuran standart Windows IPC (Intreprocess communication) rutinlerini çağırabilirsiniz.

- Kullanıcıya geribildirim sağlama:
Bazen uzun akış gösteren işlemlerde kullanıcıya yol göstermek kaçınılmaz olmaktadır. Bu gibi durumlarda, kullanıcıya bazı geribesleme mekanizmaları sağlamak hayati öneme sahiptir. Eğer gecikme birkaç saniye gibi kısa bir süre ise, basit bir kum saati imleci yeterli olacaktır. Ancak gecikmeler daha uzun süre aldığında, işlem/süreç-metre gibi daha açık-seçik bir şeylere ihtiyacınız olacaktır. Bununla birlikte, bazı durumlarda işlem-metre kullanamayacağınızı da aklınızda bulundurunuz. Örneğin, eğer uzun süreçli bir veritabanı başlatmışsanız, sorgu kontrolü, sorgu tamamlanana kadar uygulamanıza dönmeyecektir. Bu durumda, kontrol sizin uygulamanıza tekrar dönene ve kullanıcıya geçene kadar ("program çalışıyor, lütfen bekleyiniz.....") gibi basit bir mesajdan başka alternatifiniz olmayabilir.
Mümkün olduğunca, geribesleme mekanizmaları yerine görevlendirme (havale)teknikleri kullanılmalıdır. Çoğu durumda, uygulamanın tasarımını yeniden düşünmek (veya oluşturmak), uzun akışlı bir process'in işini tamamlama sürecinde kullanıcının çalışmasına devam etmesine izin veren alternatif bir yaklaşım ortaya çıkaracaktır.

Kullanışlılığı kanıtlanmış bir ilave teknik ise, zamanında veri dağıtımıdır. Verilerin küçük dilimler halinde alınması, verinin büyük bir kısmını yada bütününü alma ile karşılaştırıldığında, uygulamanızda toplam olarak daha fazla hesaplama döngüleri gerektirebilir. Ancak, yalnızca ihtiyaç duyulduğunda gerekli veriler yüklenirse, kullanıcının çalışabildiği kadar hızlı veri dağıtabilmektedir. Yukarıdaki durum söz konusu ise, performansın bütününe ilişkin kayıp, uygulamanın duyarlılığı da eklenerek daha da artmaktadır.

Hatırlanması gereken anahtar faktör, bir görevi tamamlamak için kodunuzun görevle ilgisiz olarak geçirdiği sürenin uzunluğudur. Bir uygulamanın amacı, uygulamayı kullananlara bir hizmet sağlamaktır. Buna göre, önemli olan, kullanıcılara onların işlerini çabucak bitirmelerine izin veren araçlar temin etmektir. Eğer bir uygulama bir görevin yerine getirilmesi için 5 dakika harcıyorsa (ki, programcılık açısından bu korkunç uzun bir süredir), uygulama olmadan gerçekleştirilen 10 dakikadan hala daha azdır. Eğer siz kullanıcıya diğer bir görevle devam etmesine olanak sağlarsanız, kullanıcının verimliliği gerçekten artar ve böyle bir olanakla başlatmak uygulamanın amacıdır.


Özet:

Performansın geliştirilebildiği üç genel alan mevcuttur:
Başlangıç ve yükleme zamanı (Startup and Load Time)
Uygulamanızın ve ilgili formların ekrana daha hızlı gelmesi, kullanıcının daha hızlı çalışabilmesi anlamına gelmektedir. Formlarınızın ve başlangıç kodlarının karmaşıklığını azaltın ve onların mümkün olduğunca çabuk ekrana gelmesine çalışın.
Gerçek Performans (Real performance)
Etkin Kod yazma pratikleri yapmak, daima uygulamanıza fayda sağlar. CPU döngülerini boşa harcamaktan kaçınmak için standart code optimization tekniklerini kullanın.
Algılanan Performans (Perceived performance)
Kullanıcıların uygulamanızı değerlendirmesi, yalın hızdan daha çok duyarlılıkla ilgilidir. Kullanıcının yeniden mümkün olduğunca daha hızlı çalışabilmesi için görevleri, diğer bağlantılara, uygulamalara veya diğer bilgisayarlara dağıtmalısınız. Eğer uzun bir işlem kullanıcıyı kaçınılmaz bir şekilde beklemeye zorlarsa, bir geri besleme sağlayın ve böylece kullanıcı, uygulamanızın çalışmayı bıraktığınızı düşünmesin.
Bu temel teknikler, yalnızca uygulamanızı hızlandırmayacak, aynı zamanda size iyi bir başlangıç verecektir. Son olarak, uygulamanızın performansını ölçmeyi unutmamanızı öneriyorum. Eğer zamanınızı nadiren başvurulan ince ayar prosedürleriyle bir bakıma boşa harcarsanız, zamanınızı daha önemli kodları yada kullanıcılar için diğer verimlilik araçları geliştirmek için kullanamazsınız.

API Programcılığı

 

API programcılığı bir çok kişiye korkutucu gelir. Aslında akılda tutacağınız bir kaç öncelik ile API fonksiyonlarının aslında programcılara verilmiş çok büyük fırsatlar olduğunu göreceksiniz. Bu yazı API kavramına ısınmanızı sağlayacak.

 

Api fonksiyonlarının kullanımıyla ilgili olarak anlatılan programın göçmesi, verilerin kaybedilmesi yada sistemin bozulması gibi hikayelere inanmayın. Visual Basic'te API kullanımı oldukça kolay ve VB projelerinizi geliştirmek için oldukça güçlü bir yoldur.
API'nin her türlü işte yararlı kullanıma hazır fonksiyonları vardır.
Çoğu durumda birkaç basit kurala dikkat ederseniz kullanımı çok kolaydır.
Yazdığınız programların çalışacağı her bilgisayarda zaten kurulu durumdadırlar.
Yapmanız gereken sadece birazcık program kodu yazmaktır.

Son satıra dikkatinizi çekmek istiyorum: Yapmanız gereken sadece biraz kod! Yeniler için VB'nin çekiciliği görsel ortamdır. Çabucak ve kolayca basit programları formlar üzerine kontrolleri yerleştirerek ve birkaç ufak tefek kod yazıp bu kontrolleri birbirine bağlayarak yaparsınız. Örnekler çok ancak size şu örneği vereyim: Form üzerine bir DBGrid ve bir Data nesnesi yerleştirip, Data'nın bağlantısını bir veritabanına, DBGrid'in bağlantısını da Data nesnesine yaparsanız, veritabanındaki kayıtların hemen DBGrid'te izlenebildiğini görürsünüz. İşte hiç bir kod yazmadan oldukça detaylı bir işlem. Bu; VB'nin nesnelerinin ve VB'nin bir görsel programlama ortamı olarak kolaylığının gücüdür. İşte bu görsel ortam nedeniyle bazı programcılar görsel olmayan kod yazmaktan korkarlar.

Ancak, API kullanımından korkmanın hiç bir gereği yoktur. Birazcık dikkat ve bir kaç satır kod ile yüzlerce satır kod ile yapılabilecek işlemleri başarabilirsiniz ve programcılık becerilerinizi arttırırsınız.

İçindekiler:
Giriş
Api nedir ve neden kullanılmalıdır?
Api Programlama Araçları
Api fonksiyonları nasıl deklere edilir?
Api fonksiyonları nasıl çağırılır?
Api programlamanın kuralları.
Özet.


Giriş:
Win32 Application Programming Interface (API) VB'nin sahip olduğu en güçlü eklentidir. Yüzlerce fonksiyon çok geniş bir alanda görev yapmak için hazır beklemektedirler. Ancak maalesef, birçok VB programcısı, karışık yapılarından dolayı yada kullanımda hatalar meydana getirecekleri endişesiyle, bu güçlü araçları kullanmamayı yeğlemektedirler.

API nedir?
Adı üstünde hazır programlama arabirimidir. Windows için yazılan programlar yaygın Windows görevlerini API fonksiyonlarının çağırarak yaparlar. Örnek olarak: pencere, kontrol veya menü yaratmak yada yoketmek, görüntü, klavye, yazdırma yada fare girdisi gibi sistem araçlarını denetlemek ve daha niceleri... Api fonksiyonları DLL uzantılı Dynamic Link Libraries dosyalarından çağırılır.

Api Programlama Araçları:
Biraz bilgi ve Api referansları, bir kaç basit kural ile Win32 API fonksiyonlarını VB projelerinize yerleştirebilrsiniz. İşte ihtiyaçlarınız:

Win32 SDK (Software Development Kit) -- Yazılım Geliştirme Araçları --
SDK bilgisine VB Professional ve Enterprise içinden ulaşabilirsiniz. Ayrıca http://www.microsoft.com/msdn/ adresinden de ..

API İzleme Apleti
Bu aplet te VB ile birlikte gelir. Api fonksiyonlarını çağırmadan önce modüllerde nelerin deklere edilmesi gerektiğini listeler. Çalıştırmak için VB'de menüde Ad-on kısmında Api viewer'i seçin.
Size istediğiniz Api fonksiyonu için gereken tüm Declare ifadelerini verir.
Son olarak ta biraz cesaret...

Api Fonksiyonlarını Deklere Etmek:
Api içinden bir fonksiyon çağırmak iki aşama gerektirir. VB kodunu içinden fonksiyon çağrısını yapmadan önce VB'nin yapacağınız dış çağrıyı tanıyabilmesi için bir Declare ifadesi yazmalısınız. Declare ifadesi bazı kısımlardan oluşur ve bildiğiniz VB Sub (procesure) deklerasyonu gibidir. Declare ifadesinin söz dizimi şöyledir.
Sub prosedürleri için Declare kalıbı:

[Public | Private] Declare Sub ad Lib "kütüphane_adı" [Alias "aliasname"] [([argüman_listesi])]

Function prosedürleri için Declare tanımı:

[Public | Private] Declare Function ad Lib "kütüphane_adı" [Alias "aliasname"] [([argüman_listesi])] [As veri_türü]

Şimdi bu ifadeler içindeki bileşenlerin herbirine bakalım:

Public yada Private

Bu VB'nin standart etkin alan tanımlayıcısıdır. Declare ifadeleri modüllerin declarations kısmında yazılmalıdır (prosedür içinde yapılmaz!) ve Public deyimi yazılan ifadenin tüm program içinde geçerli olduğunu, Private deyimi ise sadece tanım yapılan modül içinde geçerli olduğunu bildirir. Değişkenlerin etkin alanları konusunda detaylı bilgi için değişkenler sayfasına bakınız.

Notlar:
API fonksiyonlarını Public olarak deklere etmektense, onları Private deklere edebilirsiniz ve API'yi çağırmak için bir public fonksiyon yazarsınız ve bu fonksiyon aracılığıyla API'yi public olarak çağırırsınız. Form yada class modüllerinde yazılan declare ifadeleri Public olamaz! Sadece private ifadelere izin verilir.

Declare Sub yada Declare Function

Bu prosedürün bir değer döndürüp döndürmeyeceğini gösterir. Fonksiyonlar değer döndürür.

Dikkat:
Bazı API fonksiyonlarının VB'de kullanılamayan illegal adları vardır, bu yüzden ikinci bir ad da (alias) standart olarak verilmiştir. Bazı nedenlerden dolayı bir ad ve bir ikinci adın kullanılması gereklidir. Ancak, (ileride açılanacak bazı nedenlerle) hem ad hem de ikinci adın TÜM API deklerasyonları için kullanılması önerilir.

Lib "kütüphane_adı"
Bu çağırılacak fonksiyonu içinde tutan DLL dosyasının adıdır.
Dikkat: Kütüphane adının verirken çift tırnak arsına almayı unutmayın.

Alias "ikinci_ad"
Çağırılacak fonksiyonun ikinci adıdır.
Dikkat: Kütüphane adı gibi, çift tırnak arasında yazılır

(argüman_listesi)
Standart VB argüman listesidir. Prosedür için hangi parametrelerin gerekli olduğunu, parametrelerin veri türünü ve parametrelerin ByVal olarak mı yoksa ByRef olarak mı geçeceğini gösterir.

Dikkat:
Bu kısmı yanlış yazmak bir sistem hatasına neden olabilir. Parantezler ve çift tırnaklar unutulmamalıdır.
API Argümanlarını deklere ederken, normal VB veri türlerine ek olarak AS ANY veri türünü de kullanabilirsiniz. Bazı durumlarda uygun olmakla birlikte; VB bu tür üzerinde hiçbir tür denetimi yapmadığı için bazen tehlikeli olabilir.

As veri_türü
Sadece fonksiyonlarda kullanılır ve dönüş veri türünü gösterir. Bunu bir örnekle açıklmak daha kolay olacaktır. Aşağıda FindWindow fonksiyonu için Declare ifadesi var.

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long


Bu declare'in tüm bileşenlerine bir göz atalım:

Private:
Bu fonk modüle private (özel) olarak tanımlandı, çünkü sonradan public olarak kullanılacak bir ara fonksiyon ile bu API değeri tüm program içinden çağırılabilecek. Bu şekilde sadece bu ara fonksiyonun API'yı direkt olarak çağırması kesinleştirilmiş olacaktır.

Function FindWindow:
Bu proc bir değer döndürür (pencerenin handle'i)

Lib "user32" Alias "FindWindowA":
Bu proc user32.dll dosyasını çağırmaktadır, ve çağırılan fonksiyon user32.dll dosyası içinde FindWindowA olarak tanıtılmıştır.

Dikkat:
Win32 API hem ANSI hemde Unicode fonksiyonlar kullanımına izin verir, ancak VB içinden bizler sadece ANSI versiyonları kullanırız, bu yüzden fonksiyon adı sonundaki A harfinin anlamı budur.

ByVal lpClassName As String, ByVal lpWindowName As String
Bu fonksiyon ki parametre alır, ikisi de ByVal stringtir.

As Long
Fonksiyon Long integer değer döndürür.

FindWindow fonksiyonu ayrıca API lerin bir başka özelliğini de göstermektedir. Parametrelerin her ikisi birden zorunlu değildir. Sadece bri parametre yeterlidir. İstersniz iki parametre de verebilirsiniz ancak biri yeterli iken ikincisini de yazma gereği niye ki? Boş bırakmak istediğiniz parametre için sadece ByVAl 0& yada vbNulString değişmezini yazınız.


API Viewer Kullanımı:
Yüzlerce fonksiyon, değişmez (constant), ve yapı (structure) arasından sadece gerekenleri bulmanız yeterlidir, bunları ezbere bilmeniz gerekmez. VB ile birlikte gelen API Viewer ile ihtiyacınız olanları kopyalayıp gerekli olan yerlere yapıştırırsınız (genelde VB modülleri declarations kısımları içine). O kadar kolay bir arabirim oluşturulmuş ki, yapmanız gereken tek şey win32api.txt yada win32api.mdbYi yüklemek ve bir combo box içine aradığınız fonksiyonu yazmak sonra herşey karşınızda...

Dikkat:
win32.txt'yi ilk kez kurduğunuzda, Api Viewer size bu dosyayı mdb formatına çevirmeyi isteyip istemediğinizi soracaktır. Yes cevabı verdikten sonra win32.mdb'yi yükleyin


API Fonksiyonlarını Çağırmak:

Bunu bir örnekle anlatalım:
Aşğıdaki kod GetComputerName fonksiyonunun declare ifadesidir. Bu fonksiyon bilgisayarın adını bir string parametre aracılığıyla döndürür.

Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" ( _
ByVal lpBuffer As String, _
nSize As Long) As Long


GetComputerName iki parametre alır: lpBuffer ve nSize. lpBuffer parametresi API'den bilgisayar adını alacak ByVal stringdir. nSize parametresi ise lpBuffer string boyutunu fonksiyon çağırıldığında API'ye verir ve fonksiyonun lpBuffer içine yerleştirdiği sonucun boyutunu alır.
Fonksiyon başarılı olursa sıfır harici bir rakam, başarısız olursa sıfır üretir. Aşağıdaki kod bu fonksiyonun nasıl çağırılacağını gösteriyor:


Dim lResult As Long
Dim sBuffer As String
Dim lSize As Long
' sonuç için yer ayır
' 256 tüm platformlar için fazlasıyla yeter
lSize = 256
sBuffer = Space(lSize)
' çağrıyı yap
lResult = GetComputerName(sBuffer, nSize)
' sonucu test et
If lResult <> 0 Then
' sonuç sıfır değilse başarı
' sBuffer içinde artık bilgisyarın adı vardır
' nSize içinde null (satır sonu karakteri) hariç sonucun uzunluğu vardır
sBuffer = Left$(sBuffer, nSize)
Else
' sıfır değeri döndü, başarısızlık
End If

Fonksiyon çağırılmadan önce, nSize'a 256 değeri verildi ve sBuffer string'ine 256 boşluk (space) verildi. Parametreler belirlendikten sonra, fonksiyon çağırıldı ve sonuç test edildi. Sıfır değeri dönmediyse başarı sağlanmış ve bilgisayarın adı bulunmuştur ve iki şey oluşmuştur:
Bilgisayarın adı sBuffer string'i içine yerleştirilmiştir.
nSize değişkeni satırsonu karakteri hariç olmak üzere bilgisayara dının uzunluğunu tutmaktadır.
Bu aşamadan sonra yapılacak tek şey sBuffer içinden bilgisayar adını çekip almaktır. Bunun için null karakterinin solunda kalan herşey aradığımız kelime olacaktır. left$(sBuffer, vbNullChar) fonksiyonu ile yapılır.

Dikkat!! Dikkat!! Dikkat!! Dikkat!! Dikkat!! Dikkat!! Dikkat!! Dikkat!!

Gerçek buffer (tampon bellek) boyutuyla, parametre olarak verdiğiniz boyutu sakın karıştırmayın. API sizin ona söylediğinizi yapar ve ona belli boyutta buffer verirseniz, o da verdiğiniz boyutta
string'i sistemin sağladığı adrese yazar. aşağıdaki hatayı yaparsanız neler olabileceğine bakın:

Dim sBuffer As String
Dim nSize As Long
Dim lResult As Long

nSize = 2048
sBuffer = Space(248)
lResult = GetComputerName(sBuffer, nSize)


Fonksiyona nSize boyutunda string döndürebileceğini söylüyoruz (burada 2048 byte) ancak ona 248 byte buffer alan ayırıyoruz. Eğer fonksiyon (tesadüf bu ya) izin verdiğimiz boyutta veri döndürürse (2048), bunu buffer'e (tampon bellek) yazacaktır. Biz ona 248 byte ayırmıştık. Bizim ayırdığımız alanı bitirip, RAM'de önüne çıkan alanlara yazmaya devam edecektir. Sonuç, bize ait olmayan alanara da yazılacağı için şanslıysanız Windows genel koruma hatası vererek (mavi ekran) programınızı kapatacaktır. Daha da kötüsü, program çalışmaya devam ederse, hem kendi kodlarını hem de başka programları ve verileri yakıp yıkarak daha ileri hatalara neden olacaktır.

API Programlama Kuralları
API Programlama ile ilgili bir kitap almak bence birinci kural, diğer kurallar ise şöyle:

Çalışmalarınızı sık sık kaydedin
Herhangi bir fonksiyonu çağırmadan önce ne yapmakta olduğunuzdan emin olun
ByVal ve ByRef kelimelerini doğru yerlerde kullanın
String buffer'ların ve structure'ların boyutlarını ilgili parametreler ile eşleştirmeyi SAKIN unutmayın.
Uygulamalarınızın herhangi bir yerinden API fonksiyonlarını çağırmak için Global API deklerasyonu yerine kendi yazdığınız bir fonksiyon kullanın
Çalışmalarınızı devamlı kaydedin, VB'yi çökertip tüm kodlarınızı kaydedebilirsiniz.
VB String yapısını C String yapısı ile karıştırmayın
VB Null ile C Null'u karıştırmayın
Her parametrenin ne anlama geldiğine emin olmadan yola koyulmayın. Herşeyi anlayın ve sonra kullanın. Parametrelerin ByRef yada ByVAl dönüp dönmediğinden emin olun.

Özet

Bu sayfada VB programcılarına API programlamanın gerçekte görüldüğü kadar ürkütücü bir şey olmadığını göstermeye çalıştım. API programlama işi VB'ye henüz başlamış kişiler için biraz ağır olmakla beraber, ciddi ve düzenli çalışanlar için aşılamayacak bir engel değildir. Ancak eğer siz değişkenlerine "ayşe", "fatma" gibi rastgele adlar verenlerdenseniz, sürekli save yapmayan ve dönüş değerlerine dikkat etmeyenlerdenseniz, öncelikle bu huyunuzdan vazgeçmelisiniz.

Local port scanner

 

yalnızca kendi bilgisayarınızın portları için bir scanner ;)


Merhaba oldukça kolay bir local port scanner,
winsock la bişeyler yapmak isteyenler için ;)
bu arada winsock kodda ws diye geçiyor ;)

iyi çalışmalar...

Dim start As Boolean
Private Sub cmdBasla_Click()
mnuDosya.Enabled = False ' popup menüyü disable ettim
mnuYardim.Enabled = False ' buda diğer popup menu
cmdBasla.Enabled = False ' basla butonunu disable ediyorum
cmdDur.Enabled = True ' dur butonu enable ediyorum..
txtBaslangic.Enabled = False ' text boxları disable ediyorum
txtBitis.Enabled = False ' bunuda tabi ;)
hafizatemizle ' değişkenleri hafızadan siliyorum yoksa kaldığı yerden
' devam eder ;)
WS.Close ' winsock 'u kapatıyorum ..


bport = txtBaslangic.Text ' bport değişkenine txtbaslangıç' ın değerini atıyorum ...(bport başlangıç portu)
sport = txtBitis.Text ' sportada txtbitis'in değerini atıyorum.(sport son port bitiş yani ;) )

start = True ' start= true yapıyorum..bunu programı durdururken kullanacağım
On Error GoTo hata ' hata olursa hata label'ına göderiyorum ....
' burada olacak hata portları tararken
' portun kullanımda olduğu hatası... zaten yakalamak
' istediğimiz olay budur..

For i = bport To sport ' baslangiç portu bitis portu olana kadar
' dönecek döngü kuruyoruz

bport = bport + 1 ' her seferinde portu bir artırıoruz . . .
Bar.Panels(1).Text = bport & ". port taranıyor..." ' status barda hangi portta olduğumuzu görebilmek için

DoEvents ' işin en önemli yeri yavaşlatıyor ama programın kilitlenmeden çalışmasını sağlıyor..
' statusbarda sırasıyla portlar bu sayede görülebiliyor...
' bir kısım işlemleri windows a yaptırıyor...

WS.LocalPort = bport ' winsock local porta bport atanıyor ..sırasıyla dönecek ...
WS.Listen ' bu port dinleniyor

DoEvents ' olmassa olmaz ;) yavaş ama olsun
If start = False Then Exit Sub ' yukarıda çıkış için kullanacağımız start bu..false ise çık yani :)
If bport >= sport Then GoTo bitti 'basladığımız port bitecek porta gelince bitti labeline git
WS.Close ' winsock close ...her seferinde başka bir porta bakacağımız için
' her dinlemeden sonra close etmeliyiz

Next i ' dönelim ;))

hata: 'hata olursa buraya geliyor
If Err.Number = 10048 Then 'hata eğer 10048 ise
lstSonuc.AddItem "-" & bport & " numarılı port kullanılıyor . . ;)" ' listeye port numarasını yaz
Beep ' bip le
Resume Next ' sonrada devam etki başka hangi port war görelim
End If 'end if

bitti: 'biitiyse
MsgBox "Portlarınızın tarama işlemi sonuçlandı ..." ' msg box çıkarıyor ....
mnuDosya.Enabled = True 'dur a basınca baslata basınca
mnuYardim.Enabled = True 'enable ve disable olan şeyler
cmdBasla.Enabled = True ' tam tersi oluyor
cmdDur.Enabled = False
cmdTemizle.Enabled = True
txtBaslangic.Enabled = True
txtBitis.Enabled = True
start = False 'burası durdurma değişkeni false yapıp döngüden çıkarıyoruz..
hafizatemizle
WS.Close
Bar.Panels(1).Text = "Programmed By Mafilard"

End Sub

Private Sub hafizatemizle()
On Error Resume Next
bport = "" 'bport ve sport değişkenlerini her seferinde boşaltıyorum
sport = "" 'böylece başlata ve dur a bastığımızda tekrar tazelenmiş oluyor
' belki gereksiz ama iki satır eksik kod yazacağım diye
'runtime da oluşan salak bir hatayla uzun uzun uğraştırıyo
'bu tür şeyler..o yüzden siz yazmassanız yazmayın ;)

End Sub

Private Sub cmdDur_Click()
cmdDur.Enabled = False
mnuDosya.Enabled = True 'dur a basınca baslata basınca
mnuYardim.Enabled = True 'enable ve disable olan şeyler
cmdBasla.Enabled = True ' tam tersi oluyor
cmdTemizle.Enabled = True
txtBaslangic.Enabled = True
txtBitis.Enabled = True
start = False 'burası durdurma değişkeni false yapıp döngüden çıkarıyoruz..
hafizatemizle
WS.Close
End Sub

Private Sub cmdTemizle_Click()
lstSonuc.Clear ' lisbox'ı temizliyoruz
cmdTemizle.Enabled = False
End Sub

Private Sub Form_Load()
cmdTemizle.Enabled = False

End Sub


Private Sub mnuitemCikis_Click()
start = False
WS.Close
hafizatemizle
End
End Sub


Kaynak Kodlarıyla Uygulamalı Dersler

 

» Random Access Veritabanı Programı

Hit: 289


Random Access Veritabanı kurmayı ve küçük çapta uygulamalar geliştirmeyi öğretir.
Tüm kayıt işlemlerini ve birçok form ve menü tabanlı işlemleri ve ayrıca bazı registry işlemlerini öğrenebilirsiniz Temel düzeydeki programcılar için amaç: Birçok form, menü, programlama ortamı araçlarını öğrenmelerini sağlamak... Orta düzeydeki programcılar için ise: Bazı registry işlemlerini toolbar, sstab elemanlarını kullanımını öğretmektir.

 

» Text Editor

Hit: 81


» Bu tam sürüm program ile temel düzeyde bir Text Editor oluşturmayı ve önemli dosya, string, array işlemlerini öğreneceksiniz.

 

» Personel Veritabanı Programı (ADO)

Hit: 80


» En son ADO teknolojisi ile veritabanı işlemlerini (tablolama, SQL, kayıt işlemleri) öğreneceksiniz.

 

Random Access Veritabanı Programı

 

 

Random Access Veritabanı kurmayı ve küçük çapta uygulamalar geliştirmeyi öğretir.

 


Tüm kayıt işlemlerini ve birçok form ve menü tabanlı işlemleri ve ayrıca bazı registry işlemlerini öğrenebilirsiniz Temel düzeydeki programcılar için amaç: Birçok form, menü, programlama ortamı araçlarını öğrenmelerini sağlamak... Orta düzeydeki programcılar için ise: Bazı registry işlemlerini toolbar, sstab elemanlarını kullanımını öğretmektir.

Konular



Random Access türü veritabanı oluşturmak ve...
mevcut veritabanını açmak
yeni kayıt eklemek
kayıt silmek
kayıt aramak
kayıtlar arasında ileri geri dolaşmak

CommonDialog nesnesi kullanarak dosya açmak ve kaydetmek.
Veritabanı içeriğini formatlı bir şekilde txt uzantılı bir dosya içine kaydetmek.
Veritabanı içeriğini formatlı bir şekilde Printerden yazdırmak
ImageList ve ToolBar kullanarak araç çubuğu yaratmak.
Menü tasarımı yapmak ve kısayol tuşları belirlemek.
SSTab tasarlamak ve kullanmak.
StatusBar tasarlamak ve kullanmak
Registry'ye program bilgilerini girmek (genelde kullanıcı Seçenekleri girilir)
Program açılışına şifre koymak ve şifreyi registry'den okumak
"About" dialog kutusu tasarımı yapmak.
Timer nesnesi kullanmak.
Kullanıcı hatalarını denetlemek (On error Goto ... kullanımı

Random Access Veritabanı Kayıt İşlemleri

 

Bu ders size Random Access Veritabanlarına yapılacak kayıt işlemlerini anlatacaktır. Kayıt girmek, silmek, aramak, kayıtlar arası dolaşmak vs.



Random Access kayıt türü bir tespih gibi boncukların peşpeşe dizilmesi sitemine dayanır. Veritabanı içindeki alanlar birbiri peşine kaydedilir. Peşpeşe eklenen alanlar (Fields) bir kayıt (Record) oluşturur. Basic'in bir kaydı algılayabilmesi için öncelikle kayıt içindeki alanların aşağıdaki şekilde kayıt edilecekleri sıralarına göre TYPE .... END TYPE bloğu arasında deklere edilmesi gerekir. Basic bu şekilde bir adet kayıt için bellekte ayırması gereken alanı anlamış olur. Dikkat edilmesi gereken bir nokta: Type bloğu için kullanılan tanımlayıcı ad (burada dbKayit_Bilgisi) geçici olarak kullanılır. Bu kayıt yapısını daha sonra kullanabilmek için DIM ... AS ile yeni bir değişken deklere edip bu kayıt yapısına eşlemelisiniz. Bizim programımızda Dim dbKayit As dbKayit_Bilgisi olarak deklere edildi. Aşağıdaki tüm alan değerleri String olarak verilmiştir. Lütfen diğer data türlerini öğreniniz...

Type dbKayit_Bilgisi

Ad As String * 40
Adres As String * 100
Tel As String * 40
Email As String * 40
Notlar As String * 1000

End Type

Aklınıza gelmesi muhtemel bazı sorular var. Örnek olarak: Type işlemi program içinde nerede yazılmalı? Bu soru aslında ne çeşit bir program yaptığınıza bağlı. Çok basit bir programda Form_Declaration içine yazıp, oradan çağırabilirsiniz. Fakat nispeten düzeyli programlarda bir BAS modulu oluşturup (modüllere istediğiniz adı verebilirsiniz, sorun değil. Modüllerin sırası da yoktur, tüm modüller açılışta okunur...) General-Declarations içine yazabilirsiniz. Önerilen yol da zaten budur. AdresTel programında Type işlemi modMain.bas modülü içinde, Dim işlemi ise formun declarations alanında yapılmıştır (inceleyiniz).Böylece form yüklenince kayıt yapısı dbKayit değişkeni içine yüklenir. Şimdi şunu düşünün "dbKayit.Ad" değişkeni neyi temsil eder? Tabiki kaydedilecek bilginin "Ad" adındaki alanını.... O zaman biz dbKayit.Ad = Text1.text gibi bir kod yazarsak o zaman kayıt bilgisi içine Text1 kutusunun içeriğini almış oluruz. Daha sonra istersek bu bilgiyi kayda girebiliriz.

Common Dialog Nesnesi

 

 



Common dialog nesnesi VB araç çubuğunda iconu ile gösterilir. Nesneyi kullanmak istediğiniz form üzerine sürükleyip bırakmanız gerekir. Çalışma anında nesne görünmez.

Common Dialog Nesnesi ne işe yarar?
Dosya işlemleri için (Dosya aç, yeni dosya yarat, dosya kaydet..) yazıcı işlemleri için (yazıcı seç, kaç sayfa basılacak, sayfa düzeni - yatay, dikey - ...), font seçimi , yardım dosyası çalıştırma işlemlerini yapabilmek için kullanıcı açısından kolay ve standart bir arabirim sunar. Hemen hemen tüm Windows programcıları Windows'un bu standart nesnesini kullandıkları için Windows kullanıcıları da alıştıkları arabirimden mahrum kalmamış olurlar.
Bizim programımızda common dialog nesnesini dosya açmak ve yeni dosya yaratmak ve kaydetmek için kullanacağız. Common dialog dosya işlemleri için çalıştırıldığında Windows aşağıdaki formu ekrana yazar:



Bu form aracılığıyla kullanıcı istediği adı vererek dosya açar veya kaydeder. VB programcıları olarak bizlere sadece bu formu açması için Windows' a gerekli komutları vermek düşüyor.

DİKKAT!!! DİKKAT!!!
Commondialog dosya açmaz ve yaratmaz, size sadece bu işlemleri yapabilmeniz için kolay kullanımlı standart bir arabirim sunar, aynı INPUTBOX yada MSGBOX fonksiyonları gibi. Commondialog'dan dönen değer kullanıcının programdan açmasını istediği dosya adıdır....


CommonDialog Dosya Açma Özellikleri
(Not: İngilizcesi "Property" olan kelime karşılığı ben "Özellik" kelimesini kullanacağım)

FileName : Commondialog'dan dönen dosya adı
DialogTitle :
Formun başlığı
Flags :
Aşağıdaki değişmezler:
cdlOFNOverwritePrompt (Dosya varsa üzerine yazmadan önce uyar)
cdlOFNHideReadOnly (Gizli ve ReadOnly dosyaları da göster)
Filter:
Hangi uzantıdaki dosyaların gösterileceğini belirleyen filtre.
Örn: "Dat Dosyası(*.dat)|*.dat|"
FilterIndex :
Birden fazla dosyanın filtrelenmesi istenmişse ilk sırada hangisi gösterilmeli.
ShowOpen :
Commondialog formunu ekranda gösteren komut
Not: Ben burada sadece iki tane değişmez kullandım. Tüm değişmezleri görmek için Cmdlg96.hlp dosyasına bakınız...


Formumuz üzerinde bulunan bir commondialog nesnesine CD1 adını verelim ve onu uzantısı DAT olan dosyaları gösterecek şekilde hazırlayalım:

Dim AktifDosya as String
CD1.DialogTitle = "Bir veritabanı açın..."
CD1.Flags = cdlOFNOverwritePrompt Or cdlOFNHideReadOnly
CD1.Filter = "Dat Dosyası(*.dat)|*.dat|"
CD1.FilterIndex = 0 ' Sıfır index nolu dosya uzantısı ilk uzantıdır.
CD1.ShowOpen
AktifDosya = CD1.FileName

Daha yukarıdaki açıklamada verdiğimiz özelliklere belli değerler yükledik ve ShowOpen ile dosya açma formunun görünmesini sağladık en son olarak ta kullanıcının klavyeden girdiği yada dizinler içinden fare ile bulduğu dosya adını (ki bu nesnenin FileName özelliği yükleniyor...) bizim belirlediğimiz değişken olan AktifDosya içine aldık. Artık bu AktifDosya değişkeni içinde kullanıcının programdan açmasını istediği dosya adı vardır. Şimdi bir programcı olarak sizin yapmanız gereken standart VB kodları ile AktifDosya'yı açmaktır.

Open AktifDosya For Random As #1 Len = KayitUzunlugu

İşte hepsi bu kadar....

Yeniler için birkaç küçük not daha:
Filter uzantısını yazarken dikat etmeniz gereken noktalar:
1. Kesinlikle tırnak kullanın, çünkü bu bir string'dir.
2. | karakterini yazmak için ALT GR ile > tuşlarına beraber basın.(Türkçe Q klavye)
3. Birden fazla dosya uzantısı yazmak istiyorsanız aşağıdaki gibi yazın:
CD1.Filter = "Dat Dosyası (*.dat)|*.dat|Yed Dosyası (*.yed) |*.yed"
4. Dosya uzantılarını birbirinden ayırmak için | karakterini kullanın

Veritabanından Alınan Bilgileri Formatlama

 

 



Bu konu aslında bir diğer ders olan bir kişinin bilgilerini formatlı şekilde yazıcıdan yazdırılması konusu ile aynı temel üzerindedir. Dikkat edilecek tek fark bu derste yazdırma işlemi bir text dosyası içine yapılmakta, diğer derste ise yazdırma işlemi Printer nesnesi aracılığıyla yazıcıya yapılmaktadır.

Konumuza gelecek olursak dikkat edilecek en önemli olay bilgileri "formatlamaktır". Umarım formatlamaktan ne kastettiğimi anlarsınız. Bu disket formatlamak filan değil tabiki... Amacımız veritabanı içindeki bilgilerin (bu bilgiler kayıt adı, soyadı, adresi vs) bir text dosyası içinde, bir döküman tarzında göze hoş gelecek halde yazılmasıdır. Kayıt aktarılan text dosyası açıldığında yada yazdırıldığında güzel bir döküm almak hedeflenmiştir.

Formatlama yapmak için veritabanı içindeki kayıtların okunması, herbir alandan sonra (ki bir alan ad, soyad vs demektir) uygun uzunlukta boşluk bırakılması, diğer bir kayıt okunduktan sonra o kaydın alt satıra geçtikten sonra kayda girmesi gerekir. Ayrıca akılda tutulması gereken ayrıntılardan biri de alan adlarının da başlık olarak yazılmasıdır. Aşağıdaki formatlı yazım şekli amaçladığımız yazım olacaktır:


Adı :          (Bunlar alan adıdır)
Adresi :      (Bilgiler buraya sırayla yazılacaktır)
Tel no:       (Veritabanından okuma ve text dosyasına formatlı yazma
E-mail :      (işlemini hazırlayacağımız bir yordam yapacaktır.....)
Notlar :      (ve bu işin de oldukça kolay olduğunu göreceksiniz :-)))))


Dim veri As Integer 'Bunun içine verileri depolayacağız
Dim FreeDosya_Numarasi As Integer
' Bu sistemden serbest dosya no alır
Dim AktifKayit As Long
'Kayıt sırasını temsil eder

Open "KAYIT.DAT" For Random As FreeDosya_Numarasi Len = dbKayit_Uzunlugu   
'Veritabanını açtık

For  AktifKayit = 1 To SonKayit
'İlk kayıttan başlayıp sonkayıta                                                 'kadar okutacağız
Get #FreeDosya_Numarasi, AktifKayit, dbKayit
veri = veri & "Adı: "& dbKayit.Ad & VbCrLf
veri = veri & "Adresi: "& dbKayit.Adres & VbCrLf
veri = veri & "Tel no: "& dbKayit.Tel & VbCrLf
veri = veri & "E-Mail: "& dbKayit.Email & VbCrLf
veri = veri & "Notlar: "& dbKayit.Notlar & VbCrLf & VbCrLf

Next

For .... Next döngüsü arasında olanlara bakın. Döngünün ilk turunda AktifKayıt'ın değeri kaçtır? Cevap : 1. Sonraki her bir turda bu değer kaçar kaçar artıyor? Cevap: Birer birer.. Döngü AktifKayit değeri birer birer artarak kaça ulaşıncaya kadar devam ediyor. Cevap SonKayit sayısına kadar.
Şimdi yukarıdaki bilgileri bildiğimize yada bilmiyorsak öğrendiğimize göre, döngünün her turunda aradaki kodun çalışmakta olduğunu söyleyebiliriz. (For ile Next arasındaki kod) Kodun ilk satırını bilyorsunuz.: dosyadan kayıt okur. Okunan kayıt AktifKayit'ıncı kayıttır. Okunan kaydın alanları alttaki satırlarda veri adının verdiğimiz string değişken içine birer satır olarak yerleştirilir. Yeni satıra VbCrLf  karakteri ile geçilir. En son alan olan Notlar da veritabanından okunduktan sonra iki satır atlanır (ki böylece her kişi arasında belli bir boşluk bırakılmış olur) ve o kaydın veri değişkeni içine aktarılması bitmiş olur. Veee sonraki kayıt okunu vs vs vs...... Olay (yani döngü) veritabanının sonuna ulaşılıncaya kadar devam eder.
Sonuç olarak elimizde kocaman bir veri değişkeni, içinde tüm kayıtlar satır satır aralanmış, önlerine Adı, Adresi vs yazılmış olarak durmaktadır. Artık yapmamız gereken tek şey bunu bir text dosyası içine kaydetmektir.
Basic'te text kaydetmek için Print komutu kullanılır: Şöyle ki:

Open "Veri.txt" For Output As #1
Print #1, veri
Close #1


İlk satırda Veri.txt adlı dosyayı yarattık. Ben "yarattık" diyorum çünkü "açtık"
desem, varolan bir dosya açılmış gibi gelebilir diye düşündüm. Açtığımız dosyanın numarası 1 olsun. Sonra  da  1 nolu dosya içine veri değişkenini olduğu gibi yazdık....

Not: Yukarıdaki kodda kullanılan bazı değişkenler (örn:SonKayıt) tekrar tekrar yazılmamıştır. Bu değişkenin nasıl elde edildiğini bilmiyorsanız yada unuttuysanız Random Access konulu ders notlarını okuyunuz.

Evet olay bundan ibaret. Lütfen kodları inceleyin. AdresTel programında bu olay biraz daha karışık ancak inceleyince yapılan işin aynı şey olduğunu siz de göreceksiniz. Alıştırma olması açısından siz de benzer bir kod bloğu yazınız.
Kolay gelsin.

Vertabanı İçeriğini Formatlı Biçimde Yazdırmak

 

 



Özet bilgi:
Crystal Reports kullanarak veritabanı içeriğini güzel tablolar haline dönüştürebilirsiniz, ancak bizim burada yapacağımız daha temel kapsamda bir işlem ile veritabanından okuduğumuz bilgileri içeren bir string hazırlamak Yazacağımız kod ile bu string içinde yeni satırlar, boşluklar ve eşittir işareti oluşturarak aşağıdaki çıktıya benzer sonuçlar elde edeceğiz:

Adı      : Hakan
Soyadı : Ersöz
Tel No : 123 34 56
Adres   : Tekirdağ Meslek Yüksek Okulu

Bu formatlama işlemi sonucu elde edilen string istersek bir text dosyasına kaydedilebilir, istersek Printer nesnesi aracılığıyla yazdırılabiliriz.
Bu formatlama işlemini yalnızca veritabanından okunarak yapılan bir iş olarak görmeyin. Çünkü bir form üzerinde bulunan textbox'ların içeriğini de bu metot ile formatlı hale getirebilirsiniz.
Ben burada ikinci kez formatlama işlemini anlatmayacağım, bunun için öncelikle "text dosyasına formatlı yazdırma" konusunu okuyun, buradaki amaç Printer nesnesini kullanmayı öğrenmektir. VB'nin yardım menüsüne girerseniz Printer nesnesi ile ilgili tüm bilgileri bulabilirsiniz, ben burada kısaca yazdırma işlemini anlatacağım:

Pirnter nesnesinin Print komutu ile yazdırma yapılır. Yazdırma işlemi o anda sistemdeki geçerli yazıcı üzerinden yapılır, fax geçerli durumda ise fax çekersiniz.
Kağıt boyutunu PaperSize özelliği ile belirlersiniz. Aslında bunu gerekmedikçe zaten kullanmazsınız. Aşağıda A4 boyutundaki kağıt için değişmezler var:

Constant                   Değer               Ebat
vbPRPSA4                  9                     A4
Printer.PaperSize = 9         A4'e yazılacağını bildirir.

Copies özelliği kaç sayfa yazılacağını bildirir. Herhangi bir hata durumunda yazdırma işlemini iptal etmek gerekirse, hata bloğu içine Printer.KillDoc  yazılı bir kod girmeniz gerekir.

Yazdıracağınız metin bir sayfadan uzun ise dert değil VB geri kalanı sonraki sayfaya yazdırır. Sonraki sayfayı siz isterseniz kod ile getirtebilirsiniz: Printer.NewPage Ancak kağıt beslemesinin otomatik yapılmasını istemezseniz PaperBin özelliğini değiştirebilirsiniz: Printer.PaperBin = VbPRBNManual   (yada sadece 4 rakamı) Yazıcı sonraki sayfaya geçmeden önce elle kağıt vermenizi bekler.
Kağıt beslemenin yatay yada dikey yapılacağını Printer.Orientation özelliği belirler:

vbPRORPortrait         1        Dikey
vbPRORLandscape    2       Yatay      Örn: Printer.Orientation = 2

Yukarıda anlatılanlardan gerekenleri programa verdiyseniz artık yazdırma işleminin yapılması gerekiyor.Yazdırma işlemini fiilen bitirmek ve yazıcıyı serbest bırakmak için EndDoc komutu kullanılır. EndDoc aslında adı gibi bir sona erdirme komutu değildir. Bir yazdırma işini öncelikle Printer nesnesi üzerine yaparız, EndDoc ise bu yazdırma işlemini fiilen gerçekleştirir.

text dosyasına formatlı yazdırma konulu derste elde edilen string'i yazdıralım:

Printer.Print veri
Printer.EndDoc

Bu kadar işte.Çok fazla detaya inmiyoruz, ayarlaraı değiştirmedik ama siz isterseniz yatay da yazdırabilirsiniz.. Ayrıca 2'şer sayfa yazdıralım
With Printer
      .Orientation = 2
      .Copies = 2
      .Print veri
       .EndDoc
End With

......

İmageList ve ToolBar Kullanımı - 1

 

 

 

Programlama ortamında ToolBar ve ImageList kullanabilmek için Common Controls ocx'inin windows'a kurulmuş olması gerekir. Sorunsuz bir VB kurulumu yapmışsanız herhangi bir problem yaşamazsınız. Projenizde Common Controls'u çalıştırmak için ToolBox üzerinde herhangi bir ikon üzerine sağ fare tuşu ile tıklayın ve "Components" i seçin.
Not: VB arayüzü hakkında bilgi sahibi değilseniz, "ToolBox'ta ne yahu?" diyorsanız, bilgi için tıklayın.

Açılan Components listesi bilgisayarınızda kurulu ocx ve dll 'leri göstermektedir. Aşağıdaki resimde tab seçilmiş ama siz şeçili olanın iki altındaki Common Controls 6.0'ı seçeceksiniz:

Şekil 1 : Projede kullanılabilecek nesneler

<== ToolBar nesnesi burada Ağaçdizin nesnesinin üzerinde duruyor, ImageList ise ard arda dizilmiş üç adet beyaz kağıt gibi görülüyor.

Eğer seçtiğiniz dosya tasarım işleminde kullanılacak şekilde bilgisayarınızda lisanslı ise VB toolbar'ında bir çok ikon oluşacaktır. Çünkü bu kontroller birden fazladır. Kontrol programlama amacı ile kullanılamazsa bir biip sesi ve bir uyarı yazısı çıkar işte o zaman durum fena... Yeni bir CD bulup VB'yi tekrar yüklemelisiniz. Herhangi bir sorun ortaya çıkmadıysa, toolbar nesnesi üzerine çift tıklarsanız toolbar kendisini aktif formda formun üst kısmına atar. Toolbar formun bir uçundan diğer ucuna kadar uzanır. Üzerine buton yerleştirilmemiş toolbar zemin rengindedir ve farkedilmez. Toolbar üzerine farenin sağ butonu ile tıklayın ve "Properties" i seçin. Aşağıdaki diyalog açılır. Bu diyalog ile toolbar istediğiniz biçimde özelleştirilir:

Şekil 2: ToolBar kontrol diyaloğu

Hazırlayacağınız toolbar'ın bazı özelliklerini değiştirebilirsiniz.
AllowCustomize : Kullanıcıların toolbar'a buton eklemelerine yada kaldırmalarına izin verir.
Wrappable : Form boyutu küçültüldüğünde toolbarın  form dahilinde kalması için katlanmasına izin verir.
ShowTips : Buton ile ilgili ipucu gösterir.
Enabled : Toolbarı kullanılabilir  hale getirir.
Appearance : Görünüm
BorderStyle: Kenarlık türü
TextAlignment : Yazı hizalama
Style : Toolbar türü
Bunların toolbar görüntüsünün nasıl etkilediğini değerleri değiştirerek görebilirsiniz.

Yukarıda görülen General tabında toolbar'ın genel özellikleri seçilir. Standart olarak VB'nin açılışta verdiği değerleri koruyabilirsiniz bir sorun çıkmaz. Ancak toolbar üzerine yerleştireceğiniz butonların ikonlarınız seçebilmeniz için Imagelist dropdown kutusundan bir ImageList seçmelisiniz. Tabi form üzerine bir imagelist yerleştirmezseniz burada bir tane görünmez. Ben form üzerine bir imagelist koydum ve yukarıdaki diyalog onu hemen gördü ve listeden onu seçtim... Imagelist nesnesi sadece tasarım anaında görülebilir, program çalışırken kullanıcı onu göremez. Aşağıda görülen imagelist sizin formunuz üzerinde de var olmalıdır. Üzerine sağ klik yapın:
Açılan menüden Properties'i seçin aşağıdaki diyalog açılır:

Şekil 3 : Imagelist kontrol diyalogu

Ben burada General tabının görüntüsünü almadım. Pek bir detay yok orada. İkon boyutunu seçeceksiniz 16x16, 32x32 yada istediğiniz başka boyutları. Images tabı ile ise (yukarıda) listeye resim ekleyeceğiz. Insert Picture butonuna basarak istedğiniz resimleri sıra ile listeye ekleyin. Standart olarak her eklenen resme bir index numarası verilir. Daha sonra işte bu index numaralarını kullanarak toolbar üzerindeki butonlara resim ekleyeceğiz. Yukarıda gördüğünüz resimler gibi siz de resimlerinizi ekleyeceksiniz. Key yada tag için bir şey yazmanız gerekmiyor.
Evet buraya kadar sorunsuz geldik ve istediğimiz resimleri (gif, ico, bmp, jpeg) imagelist içine depoladık. Şimdi tekrar toolbar'a gitmemiz ve bu resimleri butonlarımız üzerine yapıştırmamız gerekiyor.

Menü Tasarımı

 

 

 

VB'de menü tasarlamak kolaydır. Menü eklemek istediğiniz form ekranda aktif form iken (buna dikkat..kod penceresini aktif yaparsanız olmaz..) Tools menüsünden Menu Editor'u seçin. Aşağıya bakınız:



Menu Editor kolay kullanımlı ve anlaşılır bir yapıya sahiptir. Hazırlanacak menü elemanları derecelere sahip olacaktır.Buradaki en üst seviye elemanlar: Dosya, Kayıtlar, Araçlar ve Yardım . Aşağıdaki resme bakınız:



(Burada menü elemanları yazılmış durumda ama ilk açıldığında boş bir pencere ile karşılaşacaksınız)

TOP LEVEL ELEMANLAR
Menü elemanları form üzerinde soldan sağa doğru dizilirler. İlk yazacağınız eleman mutlaka programın esas görevlerini yapan en üst eleman olmalıdır. Eğer ticari programlara dikkat ederseniz, ilk menü elemanı dosya açma, kaydetme, yazdırma gibi esas işlemleri yapar. Bu tüm kullanıcıların alıştığı yerdir. Siz de tasarımlarınızda kullanıcıların bu alışkanlıklarına dikkat etmelisiniz. Ben AdresTel programında ilk en üst seviye menü elemanı olarak "Dosya" yı seçtim. Caption bölümüne Dosya,  Name bölümüne ise mnuFile yazdım. Caption bildiğiniz gibi menüde görünecek "yazıdır". Program kodları için bu yazının bir önemi yok. Programınız,   menünün kliklenip kliklenmediğini Name özelliği ile anlar. Akılda kalması açısından menü elemanlarını adlandırırken "mnu" ön ekini kullanın, yani "mnuFile" gibi... Yukarıdaki resimde en üst seviye elemanların önünde....gibi noktaların olmadığını görüyorsunuz. Caption'un içinde hangi harf önüne & işaretini koyarsanız  (&Dosya gibi. Yani burada "D" harfinin önünde) o harfin altı, program çalıştığında, çizgili olarak görünür ve ALT tuşu ile birlikte o harfin kullanılması kısayol yaratır (Burada ALT + D). Bu kısayola tuşlanınca yada fare ile menü kliklenince, yukarıdaki tasarıma göre,  aşağıdaki menü ortaya çıkar:



MENÜLERE KISAYOL ATAMAK

Menü editör üzerindeki shortcut dropdown combo kutusundan istediğiniz kısayolu seçebilirsiniz:

      

ALT MENÜ ELEMANLARI
Yukarıdaki görüntüde tabiki ayırma çizgilerini farkettiniz. Onlar da birer alt menü elemanlarıdır ve "-" (tire) işareti ile oluşturulurlar. Şimdi yukarıdaki Menü editör'e bakalım. İlk en üst seviye eleman mnuFile 'dır, ikinci en üst seviye eleman ise mnuKayitlar'dır. Bu iki en üst seviye eleman arasında kalanlar mnuFile'ın alt elemanlarıdır. Peşpeşe gelen alt elemanlardan sonra yeni bir üst eleman oluşturmak için menü editördeki tuşlarından tuşunu kullanacaksınız. Bu tuş alt seviyeden üst seviyeye çıkmanızı sağlar. Aynı şekilde tuşu ise alt seviye elemanı oluşturmanızı sağlar. Her alt seviye dört tane nokta ile simgelenir. Bunları yukarıdaki menü editör'de görebilirsiniz. Daha alt seviye elemanlar oluşturmak isterseniz tuşuna bir kez daha basmalısınız. Örnek olarak: Dosya -> Özellikler -> Değiştir     gibi hayali bir menü tasarımı yapmamız gerekiyorsa, burada Dosya en üst seviye, Özellikler birinci alt, Değiştir ise ikinci alt seviye elemanlarıdır. Dosya 'nın önünde nokta yok. Özellikler'in önünde 4 nokta, Değiştir'in önünde 8 nokta vardır ve Değiştir Özellikler'in birinci alt elemanıdır. Bkz:

Dosya
....Özellikler
........Değiştir

Bir kaç uyarı :
1. Özellikler menüsü Değiştir menüsünün üst elemanı olduğu için Özellikler menüsüne de artık kısayol atayamazsınız.
2. En üstte bulunanlar (top level) form üzerinde sürekli görünecek elemanlardır, bu elemanlara kısayol tuşları bağlanamaz. En üst elemanların altındakiler kısayollar alabilirler. En üst elemanlara & işareti yardımıyla ALT + (menü captionu içindeki bir harf) şeklinde kısayol belirleyebilirsiniz

BİR MENÜ ELEMANINA KOD YAZMAK

Menü tasarımını bitirdikten sonra hangi menü elemanına kod yazmak isterseniz ona fare ile iki kez tıklayın. Ortaya menünün Click yordamı çıkar ve istediğiniz kod buraya yazılır.



BİR POPUP MENÜ OLUŞTURMAK

Pop up menüler aslında Menu Editor ile hazırlanan menülerdir. Yukarıdaki açıklamalarla hazırladığınız menünün top level elemanlarından birini popup olarak açabilirsiniz. Bunu için PopupMenu fonksiyonunu kullanmalısınız. Popup menüler farenin sağ tuşunun tek klik yapılması ile açılır. Herhangi bir form nesnesi üzerinde iken sağ klik yapmanız o nesnenin MouseUp yordamını çalıştırır. Hangi tuşun basılıp bırakıldığı seçilerek form üzerinde mevcut olan herhangi bir top level menüyü popup olarak açabiliriz. Aşağıdaki örneği inceleyin:

Private Sub Form_MouseUp (Button As Integer, Shift As _Integer, X As Single, Y As Single)

If Button = 2 Then 'Sağ klik yapılmış ise
    PopupMenu mnuFile'Menüyü popup olarak göster
End If

End Sub

Burada mnuFile olarak adlandırılan nesne menünün adıdır. Buna dikkat edin menünün başlığı (Caption) değil adıdır (Name). Bir popup menü elemanı kliklendiğinde o menü elemanının Click yordamına yazılmış olan kod çalışır.

SSTab Kullanımı

 

 



Tab Dialog kutuları birden fazla sayfaya bir tıklama ile ulaşım sağladıkları için oldukça pratik form elemanlarıdır. Burada SSTab kullanımını açıklıyoruz. Çok yeni olanlar SSTab'a nereden ulaşacaklarını bilmiyor olabilirler. Toolbar üzerinde herhangi bir yerde sağ fare tıklaması yapın, aşağıdaki menü açılır:

                                     

Components'e tıklayın ve aşağıdaki formda görülen yeri seçin:

 

Daha sonra toolbox'a baktığınızda simgesinin geldiğini göreceksiniz. Bu simgeyi fare ile seçili duruma getirdikten sonra bir form üzerinde fareyi basılı tutarak sitediğiniz büyüklükte bir sstab oluşturun. İlk oluşan sstab 3 tablıdır. Bu nesnenin üzerine sağ fare tuşu ile tıklayarak açılan menüden "properties" seçin. Bkz:
                               

Karşınıza çıkacak form sstab'ın özelliklerini düzenlemenizi sağlar:



Şimdi buradaki bilgilere bakalım:
Current Tabile ve oklarla istediğiniz tabı seçersiniz. İlk Tab 0 index numaralıdır.
Tab Count kaç tabe Tab olacağını belirler. Buraya istediğiniz sayıyı girin.
TabsPerRow her sırada kaç Tab olacağını belirler. Bunu da değiştirebilirsiniz.
TabCaption her tab için bir adlandırma belirlemenizi sağlar.
Orientation Tab etiketlerinin (adlarının) nerede olmasını istediğinizi belirler Bu genelde üstte tercih edilir.
Style ise tab türünü belirler. Köşeli yada yuvarlatılmış köşeli veya tuşlu tab seçimi yapabilirsiniz.
WordWrap bildiğimiz sözcük kaydırmadır.
ShowFocusRect seçili durumda olan tab adının dikdörtgen içine alınıp alınmayacağını belirler
Enabled tabın klik kabul edip etmeyeceğini yani aktif olup olmayacağını belirler.

Buradaki TabCount alanına 5 yazın, TabCaption'larına da "Örnek Tab" yazın , Tab0 üzerine bir label ve bir textbox yerleştirin  ve sonuçta aşağıdaki gibi bir tab elde edin:

     

Şimdi istediğiniz tabı tıklayın ve üzerine istediğiniz text kutusunu, etiketi, frame'i vs ekleyin. İşte size SSTab .... Hepsi bu kadar kolay......

StatusBar Tasarlamak ve Kullanmak

 

 

 

AdresTel programında ana formun alt kısmında bir StatusBar kullanıyoruz.(Resmi görmek için tıklayın) Peki ne işimize yarıyor? Bir çok programa bakarsanız hemen hemen tümünde bir StatusBar olduğunu görürsünüz. StatusBar kullanıcıya standart olarak (kod yazmanıza gerek yok) şunları sunar:

  1. Tarih
  2. Saat
  3. CapsLock yada NumLock'ın aktif olup olmadığı
  4. Insert yada ScrollLock'ın aktif olup olmadığı
  5. İstediğimiz bir text

Ayrıca kod yazarak neler yapabileceğimizi burada anlatmaya zamanımız ve sabrımız yetmez. Burada AdresTel programında kullanılan StatusBar'ı ve kodlama tekniğini anlatacağım.

StatusBar'ı Nereden Bulacağım?

Common Comtrols 6.0 ocx'inin bilgisayarınızda kurulu olması gerekir (Windows System dizininde MSCOMCTL.OCX ). Bu ocx içinde sadece StatusBar değil ayrıca ImageList, ToolBar, Slider, ListView, ProgressBar, TreeView  de vardır.
Şimdi ToolBox üzerine sağ klik ile açılan pop up menüden "Components"'i seçin ve Common Controls 6.0 'ı seçili hale getirip Uygula butonuna basın. İşlem sorunsuz olursa ToolBox'ta (yani VB'nin solundaki araç kutusunda) 9 tane yeni ikon oluşacaktır. Bunlardan bir tanesi de StatusBar'dır. StatusBar'ı eklemek istediğiniz form aktif iken ikona çift tıklayın. StatusBar kendisini otomatik olarak formun altına bir uçtan diğer uca yayar.

StatusBar'ı istediğiniz şekilde kişiselleştirmek için formun üzerindeki StatusBar nesnesine sağ fare tuşu ile tıklayın, "Properties" i seçin   aşağıdaki diyolag kutusu açılır:

          

StatusBar ilk başta boydan boya tek panele sahiptir. Yeni panel eklemek için Insert Panel butonuna basın. Oluşturulan yeni panelin türünü Style ile belirleyeceksiniz:

Kutuyu düşürdüğünüzde yukarıdaki liste ortaya çıkar. sbrText'i seçerseniz   o panele yazı yazabilirsiniz. sbrCaps örnek olarak CapsLock tuşuna basılıp basılmadığını gösterir vs...
ToolTipText : Fare panel üzerine geldiğinde görünmesini istediğiniz kısa text
Picture: Panel'e resim eklmek isterseniz bunu kullanın.
Bevel
: seçeneği ile panellerin nasıl görünmesini istediğiniz belirlersiniz. Örnek olarak sbrInset içe çökük panel, sbrRaised dışa doğru kabarık panel, sbrNoBevel ise düz bir panel oluşturur.
Key: Eğer StatusBar'ın click yordamını kullanmak isterseniz, buraya her bir panele özgü anahtar sözcük yazabilirsiniz ve bu anahtar sözcük yardımıyla tıklama yapılan paneli belirleyebilirsiniz.Örnek uygulama için toolbar ve imagelist dersine bakınız.

StatusBar Panellerinin Run-Time Değiştirilmesi

AdresTel programında Status adını verdim StatusBarın birinci paneli sbrText türünde ve kullanıcıya veritabanında kaç kayıt olduğunu ve o anda kaçıncı kaydın ekranda görülmekte olduğunu gösteriyor. Aşağıdaki kodu inceleyin:

Status.Panels.Item(1).Text = "Kayıt Sırası: " & Str(AktifKayit) & " / " & Str(dbSonKayit)

Hangi paneli değiştirmek istersek Item( ) değerini değiştirmemiz yeterlidir. Daha kısa bir yol daha var:  Status.Panels(1) de aynı işi görür.

Aşağıdaki kod bir picture nesnesinin MouseMove yordamına yazılmış. Fare hareket ettikçe st adındaki statusbar'ın 5 nolu paneli, fare imlecinin picture nesnesi üzerindeki koordinatlarını verecek şekilde sürekli güncellenmektedir.

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

      st.Panels(5).Text = " X =" & X & " " & " Y =" & Y

End Sub






Visual Basic Editörü

   Visual Basic programlama dilini kullanışlı kılan aslında onun editörüdür. Visual Basic programlama dilinin QBasic ve Quick Basic programlarından ayıran bir özelliğidir editörü.

   Visual Basic editörü dört ana pencereden oluşmakta bu pencereler ;

·         Visual Basic ana penceresi

·         Prpject Group

·         Properties

·         Toolbar        

        Visual Basic Ana Penceresi

        Visual Basic ana penceresinde üzerinde calıştığımız formu ve bu form ile ilgili olayların gerçekleşmesi sonucu yapılacak işlemlerin yer aldığı program kodlarının bulunduğu pencereler bulunur.Visual basic ilk açıldığında bu pencere boş bulunur çünkü visual basic ile çalışmaya başlaya- cağımız  formun özelliklerini visual basic biz seçmeden anlayamaz.

        Prpject Group

        Bu pencere çalıştığınız projenin içindeki Form,MDIForm,Modül vb. alt bölümleriu görebileceğimiz bir pencere .

        Properties

         Bu pencere, programlama sırasında seçili durumda olan Form veya Objenin özelliklerini gösteren ve istenir ise bu özelliklerin değiştirile bileceği bir pencere.Bu penceredeki özellikler seçilen objeye göre değişmekte fakat caption,name, vb. özellikler birçok objedeki ortak özellikler.

        Toolbars

        Bu pencereden objeleri ve araçları seçerek form ları oluşturuyoruz.

 

Visual Basic Ana Penceresi

       Şimdi size bu pencerenin içerisinde bulunan menü ve araç çubuklarından baksedeceğim.

File Menü

 

>>> Yeni proje açmak için kullanılır.

>>> Eski projeleri açmak için kullanılır.

>>> Projemiz içine faklı bir projeti eklemek için kullanılır.

>>> Projemiz içindeki farklı bir projeyi çıkarmak için kullanılır.

>>> Projemizi kaydetmek için kullanılır.

>>> Projemizi farklı bir isim ile kaydetmek için kullanılır.

>>> Burada açık olan Stok.VBP dosyasının kaydedilmesi için kullanılır.

>>> Burada açık olan Stok.VBP dosyasının farklı kaydedilmesi için kullanılır

>>> Projemizin kağıda dökülmesi için kullanılır.

>>> Printir ayarlarının yapılması için kullanılır.

>>> Projemizin exe uzantılı dosya olarak derlenmesi için kullanılır.

>>> Projemizin sağdece derlenmesi için kullanılır.Bu işlemden sonya Exe uzantısını kendimiz veririz.

>>> Son Açılan 5 projeye hızlı ulaşmamızı sağlar.

 

>>> Çıkış.

 

Edit Menüsü

 

 

>>> Bu menüden son yaptığımız işlemi geri alırız.

>>> Bu menüden geri aldığımız işlemi tekrar ileri ala biliriz.

 

 

 

>>> Bu menüler  bir çok Windows işleminde olduğu gibi kesme yapıştırma kopyalama gibi işleri yapmakta.

 

 

 

>>> Bu menüler Bul,Sonrakini Bul ve Yenile menüleri

 

 

>>> Objeler arasındaki geçişi sağlayan menüler.

 

>>> Dosya ekleme menüsü.Buradan bir resim veya müziği projenize eklersiniz.

 

 

>>> Bu menülerle ilgili pek kullanım görmediğim için şuan size ne işe yaradıklarını söyleyemiyeceğim.

 

 

>>> Etiket eklemek için kullandığımız menü.

 

View Menüsü

 

>>> Bir obje seçili iken o obje ile ilgili program kod sayfasını açar.

>>> Seçili objemizi değiştirir.

>>> Objemizi hızalamak için kullanırız.

>>> Objemizi son pozisyonuna geri gönderir.

>>> Objelerimizle ilgili detaylı bilgilere ulaşmamız için konulmuş kullanışlı bir alt program.

>>> Bu menüler programımız çalışırken bazı değişkenlere atadığımız bilgilerin anında görülmesi için kullandığımız yardımcı pencereleri açarlar.

>>> Bu menüden Project Explorer penceresi çalıştırılmakta.

>>> Bu menüden objelerin özelliklerin yer aldığı pencereyi açmak için kullanılır.

>>> Bu menüden formlrın ekran üzerindeki konumunu gösteren pencere açılır.

>>> Sayfa özelliklerini ayarlamamızı sağlayan menü.

>>>Visual Basic programında kullandığımız objelerin bulunduğu pencereyi açar.

>>> Renk Paletini açar.

>>> Araç çubuklarını ayarlamak için kullandığımız menü.

 

 

Project Menüsü

>>> Projemize yeni Form eklemek için kullanılır.

>>> Projemize MDI Form eklemek için kullanılır.Bu işlem sadece 1 kere yapıla bilir.

>>> Projemize Modül eklemek için kullanılır.

>>> Projemize Modül ekler.

>>> Kullanıcı kontrol sayfası eklemek için kullanılır.

>>> Sayfamıza yeni özellikler eklemek için kullanılır.

>>> Kullanıcı dosyası eklemek için kullanılır.

>>> ActiveX kontrolü eklemek için kullanılır.

>>> Dosya eklemek için kullanılır.

 

>>> Seçili durumdaki Formu kaldırmak için kullanılır.

>>> Kullanmak istediğimiz objenin Oca uzantılı dosyasını aktif hale getirmek için kullanılır.

>>> Kullanmak istediğimiz objenin Ocx uzantılı dosyasını aktif hale getirmek için kullanılır.

>>> Projemizin özelliklerini görmek ve değiştirmek için kullanılır

 Format Menüsü

 

>>> Seçilidurumdaki objemizin form üzerindeki yerini ayarlamak için kullanılır.

>>> Seçili objemisin büyüklük ayarlarını yapmamızı sağlar.

>>> Visual basic formları üzerindeki hizalama noktalarının boyutunu ayarlar.

>>> Bu iki menü objemizin etrafındaki objelrle hızalanmasını sağlar.

>>> Objemizi forma göre ortalar.

>>> Objemizin form üzerindeki sırasını değiştirir.

>>> Formumuzu kilitlemeye yarar.

 

 

Debug Menüsü

 

>>> Program çalışır durumdayken bir sonraki satıra geçmeyi saglar.

>>> Bir Sub'in yada bir döngünün dümünün atlanmasını sağlar.

>>> Bir satır üsteki işleme dönülmesini sağlar.

>>> İmleçin bulunduğu satırdan itibaren program çalıştırılır.

>>> Kullanılan değişken değerlerinin görülmesi için değişken ekler.

>>> Eklenen değişkenlerin olduğu tabloyu ve o anki değerlerini verir.

>>> Sayaç işleminden çıkar.

>>> Programı çalıştırdığımızda durmasını istediğimiz satırın seçimi için kullanılır.

>>> Seçilen satırı temizler.

>>> Bu iki menüyü Bulamadım

Run Menüsü

 

>>> Projemizi çalıştırır

>>> Çalışan bir projeyi baştan çalıştırmak için kullanılır.

>>> Projeyi bulunduğu satırda durdurur.

>>> Projeyi sonlandırır.

>>> Projeyi baştan çalıştırır

Tools Menüsü

 

>>> Bu menü ile projemize elt program ekleriz.

>>> Prosedür yani alt program özelliklerini değiştirmek için.

>>> Formumuza menü eklemek için kullanılır.

>>> Pprogram ile ilgili özellikleri değiştirmek için kullanılır

Add-Ins Menüsü

 

>>> Visual Basic'in data base programını çalıştırır.

>>> Visual Basic'in Rapor hazırlama programını çalıştırır.

>>> Projemize yardımcı program ekler.

Window ve Help Menüleri

   Bu iki menü birçok windows programındaki menülerle aynı yani Window mwnüsünden aktif pencere değiştiriliyor,Help menüsünden ise yardın konularına bakılıyor.

 

Bilmeniz Gerekenler

Değişkenler

A- Değişkenlere İsim Verme

    Visual Basic’de daha etkin bir programlama yapabilmek için kullanılan veri tiplerini ve veri yapılarını iyi bir şekilde bilmeliyiz. Burada önemli olan nerede hangi veri tipini kullanacak oluşumuzdur. Veri tiplerini anlatmadan önce kullanacagımız degişkenleri nasıl isimlendirecegimizi görelim.

    Değişkenleri isimlendirirken daha sonra baktığınızda akılda kalabilecek ve anlamlı bir isim veriniz
Aşağıda verilen kurallar doğrultusunda değişkenler tanımlayabilmemiz mümkün olmaktadır. Tanımlanacak değişkenlerin ilk karakteri mutlaka bir harf ile başlamalıdır. Geri kalan karakterler ; harflerden , rakamlardan, alt çizgi karakterinden oluşabilir. Değişken isimlerinde noktalama işaretlerini ,matematiksel ve mantıksal ve karşılaştırma operatörleri kullanamayız. Değişken isimleri 255 karaktere kadar uzunlukta olabilir. Aşagıda değişken tanımlamaları ile ilgili örnekler verilmiştir.

Örnek :

    Adı , soyadı , yası , Maas98 , Dogum_Yeri , SANAT_DALI

    Yukarıda geçerli değişken isimlerine örnek verilmiştir

Örnek :

    2ADI , ad soyad , Mal+Bildirimi

    Burada da geçersiz değişken isimlerine örnekler verilmiştir.
    2ADI : Çünkü ilk karakter bir sayı ile başlamış.
    Ad soyad : Değişken isminde boşluk kullanılmış
    Mal+Bildirimi : Değişken isminde geçersiz bir karakter kullanılmış.
    Zaten bu değişkenleri tanımlarken Visual Basic bizi hata mesajı ile uyaracaktır.

 B- Visual Basic’de Değişken Tanımlama

     Değişken tanımlarken Visual Basic’te Dim bildiri deyimini kullanabiliriz. Değişkenin tanımlanması hafızada ayrılacak hafıza miktarının belirli olmasını sağlar. Eğer değişkenlerin tipini belirtmeden bir kullanım yaparsak bu değişkenlerin Variant tipinde olduğu kabul edilir.Bu da hafızada gereksiz yer kaybına sebep olur.Eğer tanımlanan bütün degişkenlerin tiplerinin belli olmasını isterseniz kod penceresinin General,Declarations kısmına
Option Explicit yazılır.

    Ayrıca değişken tanımlarken kullanılabilecek bir başka bildiri deyimide Def- bildiri deyimidir.Bu bildiri deyimi daha genel tanımlamalar yapmak için kullanılır..Def bildiri deyimleri aşagıda verilmiştir.

    Def bildiri deyimi projenin general,declarations bölümünde tanımlanmalıdır

   DefBool : Boolean tipinde degişken tanımlamak için kullanırız.
    DefByte : Byte tipinde degişken tanımlamak için kullanırız.
    DefInt : Integer tipinde degişken tanımlamak için kullanırız.
    DefLng : Long tipinde degişken tanımlamak için kullanırız.
    DefCur : Currency tipinde degişken tanımlamak için kullanırız.
    DefSng : Single tipinde degişken tanımlamak için kullanırız.
    DefDbl : Double tipinde degişken tanımlamak için kullanırız.
    DefDate : Date tipinde degişken tanımlamak için kullanırız.
    DefStr : String tipinde degişken tanımlamak için kullanırız.
    DefVar : Variant tipinde degişken tanımlamak için kullanırız.

 Örnek:

    Private Sub Form_Load()

    Dim Ad As String

    Dim Maas As Currency

    Dim D_tarihi As DateP

    Dim Adres As String

    Dim Sira As Integer

    End Sub

    Burada görmüş olduğunuz gibi 5 adet degişken tanımlanmaktadır.Ad değişkeni string tipinde bir değişkendir.Maaş değişkeni Currency tipinde bir değişkendir.D_tarihi değişkeni Date tipinde bir değişkendir.Adres değişkeni string tipinde bir değişkendir.Sira değişkeni integer tipinde bir değişkendir.

Aşagıdaki satırları formun general,declarations bölümüne yazalım.

Örnek :

    DefInt A-C

    DefStr S

    DefVar K

    DefDate D

    DefSng V

Bu örnekte

A , B, C ile başlayan bütün karakterler Integer türünde olmak zorundadır.
D ile başlayan bütün karakterler Date türünde olmak zorundadır.
V ile başlayan bütün karakterler Single türünde olmak zorundadır.
K ile başlayan bütün karakterler Variant türünde olmak zorundadır.
S ile başlayan bütün karakterler String türünde olmak zorundadır.

 

    Def deyimi dim deyiminden farklıdır. Def ile sadece bir harf yada harf aralıgı belirtilebilir.Burada belirtilen harf ile başlayan bütün değişkenler artık o bildiri deyimindeki tipdedir <O:P</O:P

Örnek :

    Private Sub Form_Load()

    Dim ad As String , soyad As String

    Dim maas As Currency

    End Sub

    Bu örnektede ad ve soyad isimli iki degişken string türünde ve maas degişkeni ise Currency tipindedir

YAZILIM KOMUTLARI

1- GİRİŞ-ÇIKIŞ FONKSİYONLARI

1-a) Inputbox

Inputbox fonksiyonu, bir mesajı ve metin kutusu olan bir iletişim kutusu görüntüler ve kullanıcının bir metin girerek OK veya CANCEL  düğmesini tıklamasını bekler. En basit biçimi aşağıdaki gibidir.

DEGISKEN = INPUTBOX("Lütfen Adınızı Giriniz")

1-b) Msgbox

Msgbox fonksiyonu , içinde bir mesaj olan bir iletişim kutusu görüntüler, ve kullanıcının bir düğmeyi tıklayarak kendisini kapatmasını bekler. en basit biçimi aşağıdaki gibidir.

msgbox "Merhaba"

bu komut çalıştırıldığında ekrana  sadece OK düğmesi yer alan bir küçük pencere çıkartır. bunun yanında başka düğmeler ve simgelerde ekleyebilirsiniz. bunları aşağıdaki tablodan görebilirsiniz.

Düğme Değerleri;

VBOKONLY

0

Sadece OK Düğmesi Görüntülenir

VBOKCANCEL

1

OK ve CANCEL Düğmeleri Görüntülenir

VBABORTRETRYIGNORE

2

ABORT RETRY VE IGNORE Görüntülenir

VBYESNOCANCEL

3

YES NO ve CANCEL görüntülenir

VBYESNO

4

YES ve NO Düğmeleri Görüntülenir

VBRETRYCANCEL

5

RETRY ve CANCEL düğmeleri görüntülenir

Simge Değerleri;

VBCRITICAL

16

Kritik Mesaj Simgesi Görüntülenir

VBQUESTION

32

Dikkat soru Simgesi Görüntülenir

VBEXCLAMATION

48

Dikkat mesajı görüntülenir

VBINFORMATION

64

İnformation Mesajı Görüntülenir

Varsayılan Düğme;

VBDEFAULTBUTTON1

0

İlk Düğme Seçili Kalır

VBDEFAULTBUTTON2

256

2. Düğme   "        "

VBDEFAULTBUTTON3

512

3. Düğme   "         "

VBDEFAULTBUTTON4

768

4. Düğme   "        "

 Düğme değerleri, iletişim Kutusunda hangi düğmelerin görüneceğini belirler. Hangi tek düğmeyi görüntüleyeceğinizi seçmemenize dikkat edin. sadece düğme gruplarını seçebilirsiniz

Simge Değerleri, iletişim kutusunda görüntüleyebileceğiniz isteğe bağlı bir simgeyi belirler. Bu simgeler kullanıcıya alışılmadık veya istisnai bir olayı bildirmek için kullanılır.

Varsayılan Düğme değerleri, hangi düğmenin varsayılan düğme olacağını belirler.

Son olarak Msgbox fonksiyonu Aşağıdaki tabloda yer alan ve hangi düğmeye basıldığını gösteren bir tam sayıyı döndürür.

VBOK

1

VBCANCEL

2

VBABORT

3

VBRETRY

4

VBIGNORE

5

VBYES

6

VBNO

7

Örnek

MESAJ = "SEÇTİĞİNİZ KAYIT SİLİNECEK EMİN MİSİNİZ ?"
DUGME = vbYesNo + vbExclamation + vbDefaultButton2
BASLIK = "SİLME ONAYI"
YANIT = MsgBox(MESAJ, DUGME, BASLIK)
If YANIT = vbYes Then
  MsgBox "yes Tuşuna bastınız"
End If

 

2- DOSYA VE KLASÖR KULLANIMI

2-A) GetAttr

  Bu Fonksiyon bir dosya veya klasörün niteliklerini Temsil eden Aşağıdaki tablodaki Tamsayılardan birini döndürür.

VBNORMAL

0

NORMAL

VBREADONLY

1

SALT-OKUNUR

VBHIDDEN

2

GİZLİ

VBSYSTEM

4

SİSTEM

VBDIRECTORY

16

DİZİN

VBARCHIVE

32

DOSYA SON YEDEKTEN SONRA DEĞİŞMİŞ

    Hangi niteliklerin atanmış olduğunu olduğunu belirlemek için AND operatörünü kullanark, Getattr fonksiyonu tarafından döndürülen değer ile bir veya daha fazla sayıda niteliğinin değerlerinin bir bir karşılaştırmasını gerçekleştirin. bu sonuç sıfırdan farklıysa o nitelik ismi belirtilen dosyaya atanmış demektir. örneğin bir dosyanın salt okunur olup olmadığını öğrenmek için aşağıdaki ifadeyi kullanın;

deger= getattr (dosya ismi) and vbreadonly

"dosya ismi" dosyasının salt okunur niteliği atanmışsa "deger" değeri 1 olur aksi takdirde deger değeri diğer niteliklerin değeri ne olursa olsun sıfır dır.

2-B) SETATTR [FILE_NAME, ATTRIBUTES]

  Bir dosyanın niteliklerini ayarlar. FILE_NAME argümanı mevcut bir dosyanın yol ismi, ATTRIBUTES ise bir veya daha fazla niteliği belirten nümerik bir değerdir.

Setattr file_name, getattr(file_name) or new_attribute

2-C) KILL

Kill fonksiyonu belirtilen dosyayı harddiskten kalıcı bir biçimde siler

kill "c:\dosya.dat"

2-D) FILEDATETIME (Dosya İsmi)

Bu bir dosyanın oluşturulduğu veya en son değiştirildiği tarih ve saati döndürür.

Print filedatetime ("dosya.dat")

2-E) FILELEN

Dosyanın uzunluğunu gösteren bir uzun tamsayı değeri döndürür.

msgbox filelen("dokuman.txt")

2-F) MKDIR

yeni bir klasör dizini oluşturur.

mkdir "c:\dizin"

 2-G) RMDIR

 Belirtilen dizini siler. bu işlemi yapmadan önce silinecek dizin içerisindeki tüm dosyaların silinmiş olması gerekmektedir. bunu DOS taki RD komutuna benzetebiliriz.

Rmdir "c:\dizin"

2-H) CHDIR

Belirtilen dizini etkin yapar. proğramınız herhangi bir dosyayı açacaksa,  bu komutu kullanark direk olarak dosyaları o dizinde arar.

chdir "c:\dat"

2-I) CHDRIVE

Belirtilen Sürücü harfini etkin kılar

chdrive app.path

2-J) DIR

Seçime bağlı 2 argümanı alır ve belirtilen dosya ve klasör niteliklerine uyan bir dosya veya klasörün ismini içeren bir karakter katarı döndürür. Dir fonksiyonunun sık rastlanan bir kullanımı, belirli dosya veya klasörün mevcut olup olmadığını kontrol etme amaçlıdır. aşağıdaki ifade belirtilen dosya mevcutsa DENEME.DAT aksi halde boş bir karakter katarı döndürür.

filex= dir("c:\windows\deneme.dat")

windows altında kaç tane Dat dosyası olduğunu öğrenmek için bir joker karakter spesifikasyonu vermeniz ve DIR fonksiyonunu tekrarlı çağırmamız gerekir;

datFile=dir ("c:\windows\*.dat")

if datfile <> "" then datfiles=datfiles+1

while datfile=dir()

datfiles=dafiles+1

Wend

2-K) FILECOPY

Bu ifade bir dosyayı sabit disk üzerinde yeni bir konuma kopyalar.

kaynak="c:\vb6\deneme.dat"

hedef=c:\windows\deneme.dat"

filecopy kaynak, hedef

2-L) NAME

Name ifadesi Bir dosyanın veya klasörün ismini değiştirir

name "c:\windows\deneme.bat" as "c:\windows\deneme.dat"

3. DEĞİŞKEN VE DİZİ DEKLARASYONU

3-A) DIM

Değişken ve dizileri deklare etmek için kullanılır. bir değişkeni kullanmadan deklare ettiğinizde VB hafızada buna uygun yer ayırır ve bu değişken çalışma kipinde kullanılmaya hazır hale gelir.

Dim SAYI as double

dim Text as string

dim A(10,10) as integer

 İÇİNDEKİLER

          1. Temel Bilgiler

o    Değişkenler

o    Veri Tipleri

o    Veri Yapıları

o    Dizilere Genel Bakış

o    Statik Diziler

o    Dinamik Diziler

o    Tip Dönüşümleri

 

          1. Operatörler,Program Kontrol ve Döngü Komutları

o    Aritmetiksel Operatörler

o    Karşılaştırma Operatörleri

o    Mantıksal Operatörler

o    if kontrol Yapısı

o    Select Case Kontrol Yapısı

o    For Next Döngüsü

o    Do While ve Do.......Loop While Döngüleri

o    Do Until ve Do.......Loop Until Döngüleri

o    Do Until ve Do.......Loop Until Döngüleri

 

Değişkenlere İsim Verme Kuralları


Visual Basic’de daha etkin bir programlama yapabilmek için kullanılan veri tiplerini ve veri yapılarını iyi bir şekilde bilmeliyiz. Burada önemli olan nerede hangi veri tipini kullanacak oluşumuzdur. Veri tiplerini anlatmadan önce kullanacagımız degişkenleri nasıl isimlendirecegimizi görelim.

Degişkenleri isimlendirirken daha sonra bakdıgınızda akılda kalabilecek ve anlamlı bir isim veriniz
Aşagıda verilen kurallar doğrultusunda degişkenler tanımlıyabilmemiz mümkün olmaktadır. Tanımlanacak degişkenlerin ilk karakteri mutlaka bir harf ile başlamalıdır. Geri kalan karakterler ; harflerden , rakamlardan, alt çizgi karakterinden oluşabilir. Degişken isimlerinde noktalama işaretlerini ,matematiksel ve mantıksal ve karşılaştırma operatörleri kullanamayız. Degişken isimleri 255 karaktere kadar uzunlukta olabilir. Aşagıda degişken tanımlamaları ile ilgili örnekler verilmiştir.

Örnek :

Adı , soyadı , yası , Maas98 , Dogum_Yeri , SANAT_DALI 
 

Yukarıda geçerli degişken isimlerine örnek verilmiştir

Örnek :

2ADI , ad soyad , Mal+Bildirimi 
 

Burada da geçersiz degişken isimlerine örnekler verilmiştir.
2ADI : Çünki ilk karakter bir sayı ile başlamış.
Ad soyad : Degişken isminde boşluk kullanılmış
Mal+Bildirimi : Degişken isminde geçersiz bir karakter kullanılmış.
Zaten bu degişkenleri tanımlarken Visual Basic bizi hata mesajı ile uyaracaktır.

Visual Basic’de Degişken Tanımlama


Degişken tanımlarken Visual Basic’te Dim bildiri deyimini kullanabiliriz. Değişkenin tanımlanması hafızada ayrılacak hafıza miktarının belirli olmasını sağlar. Eger degişkenlerin tipini belirtmeden bir kullanım yaparsak bu değişkenlerin Variant tipinde olduğu kabul edilir.Bu da hafızada gereksiz yer kaybına sebep olur.Eger tanımlanan bütün degişkenlerin tiplerinin belli olmasını isterseniz kod penceresinin General,Declarations kısmına
Option Explicit yazılır.

Ayrıca değişken tanımlarken kullanılabilecek bir başka bildiri deyimide Def- bildiri deyimidir.Bu bildiri deyimi daha genel tanımlamalar yapmak için kullanılır..Def bildiri deyimleri aşagıda verilmiştir.

Def bildiri deyimi projenin general,declarations bölümünde tanımlanmalıdır

DefBool : Boolean tipinde degişken tanımlamak için kullanırız.
DefByte : Byte tipinde degişken tanımlamak için kullanırız.
DefInt : Integer tipinde degişken tanımlamak için kullanırız.
DefLng : Long tipinde degişken tanımlamak için kullanırız.
DefCur : Currency tipinde degişken tanımlamak için kullanırız.
DefSng : Single tipinde degişken tanımlamak için kullanırız.
DefDbl : Double tipinde degişken tanımlamak için kullanırız.
DefDate : Date tipinde degişken tanımlamak için kullanırız.
DefStr : String tipinde degişken tanımlamak için kullanırız.
DefVar : Variant tipinde degişken tanımlamak için kullanırız.

Örnek :
 
Private Sub Form_Load()
 
Dim Ad As String
 
Dim Maas As Currency
 
Dim D_tarihi As Date
 
Dim Adres As String
 
Dim Sira As Integer
 
End Sub
 


Burada görmüş olduğunuz gibi 5 adet degişken tanımlanmaktadır.Ad değişkeni string tipinde bir değişkendir.Maaş değişkeni Currency tipinde bir değişkendir.D_tarihi değişkeni Date tipinde bir değişkendir.Adres değişkeni string tipinde bir değişkendir.Sira değişkeni integer tipinde bir değişkendir.

Aşagıdaki satırları formun general,declarations bölümüne yazalım.

Örnek : 
 
 
 
DefInt A-C
 
DefStr S
 
DefVar K
 
DefDate D
 
DefSng V
 

Bu örnekte
A , B, C ile başlayan bütün karakterler Integer türünde olmak zorundadır.
D ile başlayan bütün karakterler Date türünde olmak zorundadır.
V ile başlayan bütün karakterler Single türünde olmak zorundadır.
K ile başlayan bütün karakterler Variant türünde olmak zorundadır.
S ile başlayan bütün karakterler String türünde olmak zorundadır.

Def deyimi dim deyiminden farklıdır. Def ile sadece bir harf yada harf aralıgı belirtilebilir.Burada belirtilen harf ile başlayan bütün değişkenler artık o bildiri deyimindeki tipdedir

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
Dim ad As String , soyad As String
 
Dim maas As Currency
 
End Sub
 

Bu örnektede ad ve soyad isimli iki degişken string türünde ve maas degişkeni ise Currency tipindedir.

Veri Tipleri

Integer :
Visual Basic’te tam sayı degişkenleri tanımlamak için kullanılır. Hafızada 2 byte yer kaplarlar. Alabilecegi değer aralıgı –32768 ile +32767 arasındadır.DefInt bildiri deyimi ile tanımlanabilirler. Ayrıca bir degişkenin sonunda % karakteri bulunuyorsa bu degişken integer tipindedir.

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
Dim Maas As Integer
 
DefInt A-C
 
Oran% = 100
 
A_sayı = 100
 
B_sayı = Oran*A_sayı
 
C_sayı = B_sayı + A_sayı – 1000
 
Maas= 32767
 
End Sub
 

Eger burada tanımlanan degişkenlere daha büyük sayılar atanırsa overflow oluşur.

Long :
Daha büyük bir aralıkta integer yani tamsayı tanımlamak için kullanabilecegimiz bir veri tipidir. Hafızada 4 byte yer kaplar. Kullanılabilecek uç degerler +2,147,483,647 ile -2,147,483,648 dir. Long tipinde bir degişken tanımlamak için DefLng bildirimini veya degişken sonunda & karakterini kullanabiliriz.

Örnek :
Private Sub Form_Load()
 
DefLng A-B
 
Bölüm=50000 
 
cıkan&=600000
 
Kalan& = (cıkan / Bölüm ) * 10000
 
End Sub
 


Single :
Tam sayı olmayan küsüratlı sayılar için kullanabilecegimiz bir veri tipidir. Kayan-noktalı sayı olarak isimlendirilir. Single tipindeki veriler bellekte 4 byte yer kaplarlar. Nekatif sayılar için alabilecegi aralık -3.402823E38 ile –1.401298E-45 ,pozitif sayılar için alabilecegi aralık 1.401298E-45 ile 3.402823E38 arasındadır.Single tipinde veri tanımlamak için DefSgn bildirimi veya degişken sonuna ! karakteri konur. 7 haneye kadar hassastır.Daha sonrası yuvarlatılır.

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
DefSgn A-B
 
Bölüm=50000 
 
Cıkan!=600000
 
End Sub
 

Double :
Visual Basic’te kullanılabilecek en büyük sayısal degerlerin veri tipidir. Hafızada 8 byte yer kaplarlar. 16 haneye kadar hassastırlar. Maximum alabilecegi degerler pozitif sayılar için 4.94065645841247E-324 ile 1.797693134862232E308 , nekatif sayılar için de -1.797693134862232E308 ile -4.94065645841247E-324 arasındadır. DefDbl bildirimi veya # sembölü ile double tipinde degişkenler tanımlanabilir

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
DefDbl A-K
 
Darı=50000 
 
Bugday=600000
 
Arpa=340.56
 
End Sub
 

Veri Tipleri


Currency :
Sayısal tipdeki veriler için tanımlanmış özel bir veri tipidir.Hafızada 8 byte yer kaplarlar. 4 hane ondalık kısmı olmak üzere toplam 19 haneden oluşur.(nokta hariç) Alabilecegi maximum degerler -922,337,203,685,477.5808 ile 922,337,203,685,477.5807 arasındadır. @ sembolü veya DefCur bildirimi ile Currency tipinde degişken’ler tanımlanabilirler.

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
Dim Maas As Currency , Borc As Currency
 
Maas = 500000000 
 
Borc = 68000000
 
Zayi@ = 340000.56
 
End Sub
 


Date :
Tarih türündeki bilgileri kullanmak için oluşturulmuş bir veri tipidir. Hafızada 8 byte yer kaplarlar. 1 Ocak ile 31 Aralık 9999 arasındaki tarihleri kullanabilirsiniz. DefDate bildirisi ile tarih türünde degişkenler tanımlayabiliriz.

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
Dim Dogum_tarihi As Date , Evlenme_Tarihi As Date
 
Dogum_tarihi =#Dec,9,1977#
 
Evlenme_Tarihi=#May,15,1998#
 
End Sub
 

Boolean :
Mantıksal veri tipleri için kullanılır. İki seçenekten birisini alabilir.Bunlar True veya False degerleridir. Bellekte 2 byte yer işgal ederler.Boolean tipindeki bir degişkeni tanımlamak için DefBool sözcügü kullanılır.

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
Dim Durum As Boolean , Duyum As Boolean
 
Durum = True
 
Duyum = False
 
End Sub
 


Byte :
O ile 255 arasındaki tamsayıları ifade etmek için kullanılabilecek veri tipidir.DefByte deyimi ile byte tipinde degişkenler tanımlanabilir.

Örnek :
 
Private Sub Form_Load()
 
Dim Durum As Byte , Duyum As Byte
 
Durum =23
 
Duyum = 143
 
End Sub
 


String :
Metin türü bilgileri saklamak için kullanılabilecek veri türüdür. 16 bitlik versiyonda 0 ile 65538 arasında , 32 bitlik versiyonda ise 0 ile 2,000,000,000 arasında karakter alabilir. String türünde degişken tanımlamak için Defstr veya $ sembolü kullanılır.

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
Dim Adi As String , Soyadi As String
 
Adı =”Kemal”
 
Soyadı = ”Tas”
 
No$="1323970067"
 
End Sub
 


Variant :
Bu tipte tanımlanmış bir degişkene herhangi bir tip’te veri yüklenebilir.Yani ne tür bir veri girecegimizi bilmedigimiz degişkenleri Variant tipinde tanımlamalıyız. Bu tür degişkenler hafızada 16 byte tan fazla yer kaplarlar. DefVar bildiri sözcügü ile Variant türünde degişkenler tanımlıyabiliriz.

Variant türünde degişkenler tanımlamak fazla kullanışlı degildir.Çünki hafızada fazla yer kaplarlar.

Örnek :
 
 
 
 
 
 
 
Private Sub Form_Load()
 
Dim Ad As Variant , Maas As Variant , Tel As Variant
 
Dim Dogum_tarihi As Variant
 
Ad="Aydın Kale"
 
Maas=200000
 
Tel="500-45-00"
 
Dogum_tarihi=#Apr,3,1970#
 
End Sub
 

Veri Yapıları


Const :
Bunlar program içinde degeri degiştirilemeyen sabitlerdir. Public ve Private tipinde sabitler tanımlanabiliilir. Public sabitlere tüm modüller içinden ulaşılabilir.Private türündeki sabitler ise sadece tanımlandıkları modül içersinde geçerlidirler.Ayrıca Visual Basic içinde tanımlanmış çok sayıda sabit vardır. Bunlara CONSTANT.TXT dosyasını açarak inceleyebiliriz.

Örnek :
 
 
 
 
 
 
 
Const sehır=”Istanbul”
 
Const Ulke="Turkey"
 
Const posta_kodu=34650
 
Const tek_kod=212
 


Type - End Type Yapısı :
Type yapısını kullanarak programıcı farklı veri tiplerini kullanarak kendi veri yapısını oluşturabilir. Bu C deki Struct yapısına benzetilebilir. Bu yeni veri tipine record adı verilir. Herhangi bir modülün Declarations kısmında aşagıdaki gibi bir tanımlama yapabiliriz.

Örnek :
 
 
 
 
 
 
 
Type Ogrencı
 
Ad As String *10
 
Soyad As String *12
 
Not As Byte
 
Kredi As Integer
 
End Type
 

'Ogrencı veri tipi toplam hafızada 25 byte yer kaplamaktadır. Bu veri tipini kullanmak için 'Ogrencı tıpınde degişkenler tanımlamak gerekmektedir.

Private Sub Form_Load()
 
Dim A As Ogrencı
 
Dım B As Ogrencı
 
'Bu degıskenlere bilgi atamak aşagıdaki şekildeki gibidir.
 
A.Ad="Ali" 
 
A.Soyad ="Armer" 
 
End Sub
 

String türü degişkenlere sabit bir uzunlukta yer ayırmak istersek aşagıdaki şekilde bir tanımlama yapmalıyız.

Dim Name As String *12
Dim Address As String *50

Diziler


Aynı tür bilgileri bellekte tutmak için kullanabilecegimiz listelere dizi adı verilir. Dizi kullamanın avantajı aynı tür bilgiler bir listede tutularak daha hızlı işlem yapılabilmesi saglanmış olacaktır.Visual Basic'de dizi şu şekildedir

Dizi_adı(İndis) olacaktır.

Örnek:

Private Sub Form_Load()
 
Dim ad(2) As String
 
Dim no(2) As Integer
 
ad(0) = "ali"
 
ad(1) = "ahmet"
 
ad(2) = "ebru"
 
no(0) = 133
 
no(1) = 56
 
no(2) = 67
 
End Sub
 

Bu örnek'te ad ve no olmak üzere iki adet dizi tanımlanmaktadır. ad dizisi string türünde bilgileri tutacak ve no dizisi ise integer türündeki bilgileri saklayacaktır. Görmüş olgunuz gibi dizilere bilgi atama şekli

dizi_adı(indis_sırası)=atanacak_bilgi şeklindedir.

Eger diziyi sıfırdan degilde bir den itibaren başlatmak istersek diziyi tanımlamadan önce Option Base 1 satırını eklemeliyiz.

Burada dizi indisleri sıfırdan başlayarak tanımlama yaparken bizim belirtigimiz degere kadardır. Yani bizim bu dizilere atayabilecegim veri sayısı diziyi tanımlarken belirtdigimiz indis degerinden bir fazla olacaktır.

Eger deger atama yaparken belirttigimiz sınırların dışına çıkarsak hata oluşur. Dizilere deger atarken dizi sınırlarını kontrol etmekle olası bir hatayı önlemiş oluruz.

Statik Diziler


Bu tip dizilerde kullanılacak yer sayısı sabittir. Bu tip diziler sadece tanımlandıkları modül içersinde kullanılabilirler. Statik dizi şu şekilde tanımlanabilir
Dim dizi_adı(sayi) As Veri_Tipi
Tüm proje içinde kullanılacak bir dizi tanımlanmak isterse standart modülün General,Declarations bölümünde yukarıdaki şekildeki gibi tanımlanmalıdır

Örnek :

Option Base 1
 
Dim a(5) As Integer
 
Private Sub Command1_Click()
 
Text1.Text = a(1) + a(2)
 
End Sub
 
Private Sub Form_Load()
 
a(1) = 10
 
a(2) = 20
 
End Sub
 

Bu örnekte görüldügü gibi projenin general,declarations kısmında a() dizisi tanımlanıyor.Bu dzi tanımlanmadan önce dizi indislerinin 1 den itibaren başlıyacagını belirten Option Base1 satırı koda dahil edilmiştir. Form1 yüklendiginde bu dizinin ilk elemanınna 10 sayısı ikinci elemanına 20 sayısı atanıyor. Eger kullanıcı Command1 isimli butona tıklarsa dizinin ilk ce ikinci elemanları toplanarak Form üzerinde Text1 adlı nesnenin Text özelligine atanıyor. Yani TextBox'ın bu sayıların toplamını göstermesi sağlanıyor.

Dinamik Diziler

Bu tip dizilerde kullanılacak yer sayısında bir sınırlama yoktur. Bu tip diziler ilk başta şagıdaki şekildeki gibi bir tanımlamaya ihtiyaç duyarlar.

Dim dizi_adı( ) As Veri_Tipi

Daha sonra bu dizi kullanılacak iken botunu belirtmek gerekir bunun içinde aşagıdaki gibi bir tanımlama yapılmalıdır.

ReDim dizi_adı(boyut ) As Veri_Tipi

Artık bu veri dizisini projemiz içinde kullanabiliriz.

Örnek :

Option Base 1
 
Private Sub Form_Load()
 
Dim s() As String
 
End Sub
 
Private Sub Command1_Click()
 
ReDim s(10) As String
 
s(1) = "Selam "
 
s(2) = "Ayşe"
 
Text1.Text = s(1) + s(2)
 
End Sub
 


Bu dizi tanımlanmadan önce dizi indislerinin 1 den itibaren başlıyacagını belirten Option Base1 satırı koda dahil edilmiştir. Form1 yüklendiginde s adlı bir dinamik dizi tanımlanmaktadır. Kullanıcı Command1 isimli butuna tıkladıgında s dizisinin boyutu belirtilerek yeniden tanımlanmıştır. Bu dizinin ilk elemanınna "Selam " degeri ikinci elemanına "Ayşe" degeri atanıyor. Dizinin ilk ve ikinci elemanları toplanarak Form üzerinde Text1 adlı nesnenin Text özelligine atanıyor. Yani TextBox'ın bu degerlerin toplamını göstermesi sağlanıyor.

Örnek :

Option Base 1
 
Private Sub Form_Load()
 
Dim s() As String
 
End Sub
 
Private Sub Command1_Click()
 
ReDim s(10) As String
 
s(1) = "selam"
 
s(2) = "fatih"
 
Text1.Text = s(1) + s(2)
 
End Sub
 
Private Sub Command2_Click()
 
ReDim s(5) As String
 
s(2) = "fatih"
 
Text1.Text = s(1) + s(2)
 
End Sub
 


Bu örnekte yukarıdaki örnekten tek farklı yan olarak bir Command butonun arkasına yazılmış kod bulunuyor. Eger kullanıcı Command1 adlı butondan sonra bu butona tıklarsa ne olacak ona bakalım. Command2 butonuna tıklanıldıgında s() dizisi tekrardan boyutu 5 olrak tanımlanıyor. s() dizisine daha önce atamış bütün degerler siliniyor. Yani s() dizisi bir nevi boşaltılıyor ve yeniden boyutlandırılıyor. Eger s() dizisine daha önce atanmış degerler korunmak istenirse aşagıdaki şekildeki gibi bir tanımlama yapılmak zorundadır.
ReDim Preserve s(boyut) As Veri_tipi

Tip Döşümleri


Visual Basic'de kullandıgımız sayısal değişkenleri diger veri tiplerine dönüştürebiliriz. Bu işlemi yapan fonksiyonlara tip dönüşüm fonksiyonları adı verilir. Tip dönüşüm fonksiyonları aşagıda verilmiştir.

Fonksiyon Geri Dönen Deger Yaptıgı İşlem

CBool(ifade) Boolean Matemetiksel ifadeyi Boolean türüne dönüştürür.
CByte(ifade) Byte Matemetiksel ifadeyi Byte türüne dönüştürür.
CCur(ifade) Currency Matemetiksel ifade Currency türüne dönüştürür.
CDate(ifade) Date Matemetiksel ifade Date türüne dönüştürür.
CDbl(ifade) Double Matemetiksel ifade Double türüne dönüştürür.
CDec(ifade) Decimal Matemetiksel ifadeDecimal sayıya dönüştürür.
CInt(ifade) Integer Matemetiksel ifade tam sayıya dönüştürür.
CLng(ifade) Long Matemetiksel ifade Long türüne dönüştürür.
CSng(ifade) Single Matemetiksel ifade Single türüne dönüştürür.
CVar(ifade) Variant Matemetiksel ifade Variant türüne dönüştürür.
CStr(ifade) String Matemetiksel ifade String türüne dönüştürür.

Aşagıda çeşitli örneklerle tip dönüşümleri açıklanmaya çalışılmıştır.

Örnek1:

A=10 , B=5 , C=10 , D=0
 
check = CBool(A < B) 'check=False
 
check = CBool(A > B) 'check=True
 
check = CBool(A = C) 'check=True
 
check = CBool(D) 'check=False
 
check = CBool(B) 'check=True
 


Örnek2 :

A=10 , B=5 , C=0 
 
check = CBytel(A < B) 'check=0
 
check = CByte(A > B) 'check=1
 
check = CByte(A = C) 'check=0
 


Örnek3 :

A=1 , B=2 , C=36000 , D=36001
 
check = CDate(A) 'check=12/31/1899
 
check = CDate(B) 'check=1/1/1900
 
check = CDate(C) 'check=7/24/98
 
check = CDate(D) 'check=7/26/98
 


Örnek4 :

A=2.4 , B=2.5 , C=2.6 , D=3.5
 
check = CInt(AB) 'check=2
 
check = CInt(B) 'check=2
 
check = CInt(C) 'check=3
 
check = CInt(D) 'check=4
 

Aritmetiksel Operatorler :


+ , - , * , / , \ , ^ ,Mod , &

Genel olarak matematiksel işlemlerde kullanılan operatörlerdir. Bunlara kaynaştırma “&” operatörünü de ilave edebiliriz. Şimdi bu operatörleri açıklayalım.

+ Operatörü :
Bu operatör ile verilen iki veya daha fazla ifade toplanabilir.Genel yazılışı aşagıdaki şekilde gibidir.
Sonuc = Ifade1 + Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.(Eger kaynaştırma yapılmamış ise)
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Eger Ifade1 ve Ifade2 strıng türünde veriler ise + operatörü kaynaştırma yapar. Yani Ifade2 yi Ifade1’ın sonuna ekler.Aşagıda Çeşitli örnekler verilmiştir.
Örnek :

Sonuc=13+45 'Sonuc=58
 
Sonuc=1378+56.78+435.908 'Sonuc=1870.688
 
A=89,B=3456
 
Deger=A+B ' Deger=3545
 
Ad="Ebru"
 
Soyad=” Kayacı”
 
Dim Name As String
 
Name=Ad+Soyad 'Name=”Ebru Kayacı”
 
 
 
 
Operatörler : 
 


Matematik’de kullanılan çıkartma opratörüdür. Birinci ifadede verilen degerden ikinci ifadeyi çıkarır.
Genel yazılışı aşagıdaki şekildeki gibidir.
Sonuc=Ifade1 – Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Aşagıda çeşitli örneklerle – (çıkarma )operatörü açıklanmaya çalışılmıştır

Örnek :

Sonuc=3475.45-3445.90 'Sonuc = 29.55
 
Deger=45-788-23 'Deger = - 766
 
Son=190,Ara=47
 
Son1=Son-Ara ' Son = 143
 


* Operatörü :
Matematikdeki çarpma operatörüdür. Verilen iki sayıyı çarpar. Genel yazım şekli aşagıdaki şekilideki gibidir
Sonuc=Sayı1 * Sayı2
Burda Sonuc mutlaka sayısal bir degerdir.
Sayı1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Sayı2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Aşagıda çeşitli örneklerle çarpma operatörü açıklanmıştır.

Örnek :

Sonuc=34 * 9 'Sonuc = 306
 
Deger = 87 * 12 'Deger = 1044
 
A=5,B= 56
 
C=A * B 'C = 280
 

/ Operatörü :
Matematikdeki bölme operatörüdür. Verilen ilk sayıyı ikinci sayıya böler. Genel yazım şekli aşagıdaki şekilideki gibidir.
Sonuc=Ifade11 /Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.Ifade2 sıfırdan farklı bir deger olmalıdır. Yoksa sıfıra bölme hatası oluşur.
Aşagıda çeşitli örneklerle bölme operatörü açıklanmıştır.

Örnek :

Sonuc=34 / 9 'Sonuc = 3.777778
 
Deger = 60 / 12 'Deger = 5
 
A=5,B= 56
 
C=B / A 'C = 11.2
 

Operatörler :

\ Operatörü :
Matematikdeki bölme operatörüdür. Verilen ilk sayıyı ikinci sayıya böler. Ancak sonuc mutlaka bir tam sayı degeridir. Bölüm küsüratlı ise sayının kusuratını atar.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=Ifade1 \ Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.Ifade2 sıfırdan farklı bir deger olmalıdır. Yoksa sıfıra bölme hatası oluşur.
Aşagıda çeşitli örneklerle tam bölme operatörü açıklanmıştır

Örnek :

Sonuc=34 \ 9 'Sonuc = 3
 
Deger = 60 \ 12 'Deger = 5
 
A=5,B= 56
 
C=B \ A 'C = 11
 

^ Operatörü :
Matematikdeki üs operatörüdür. Verilen ilk sayının ikinci sayı kadar kuvvetini (üssünü) alır. Genel yazım şekli aşagıdaki şekilideki gibidir.
Sonuc=Ifade1 ^ Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Aşagıda çeşitli örneklerle bölme operatörü açıklanmıştır.

Örnek :

Sonuc=34 ^ 9 'Sonuc = 6.071699276646e+13
 
Deger = 60 ^ 2 'Deger = 3600
 
A=5,B= 5
 
C=B ^ A 'C = 3125
 


Mod Operatörü :
Matematikdeki mod alma operatörüdür. Verilen ilk sayının modunu ikinci sayı göre alır. Genel yazım şekli aşagıdaki şekilideki gibidir.
Sonuc=Ifade1 Mod Ifade2
Burda Sonuc mutlaka sayısal bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayıdır.
Aşagıda çeşitli örneklerle Mod operatörü açıklanmıştır.

Örnek :

Sonuc=34 Mod 9 'Sonuc = 7
 
Deger = 60 Mod 2 'Deger = 0
 
A=5.4,B= 57
 
C=B Mod A 'C = 2
 
D= 57 Mod 5.5 'D = 3
 
E=90.5 Mod 6 'E = 0
 
E=90.2 Mod 6 'E = 0
 
E=90.7 Mod 6 'E = 1
 


& Operatörü :
Bu operatör kaynaştırma operatörüdür. String türü ifadelerle matematiksel ifadeleri kaynaştırmada kullanılabilir. Genel yazım şekli aşagıdaki şekilideki gibidir.
Sonuc=Ifade1 & Ifade2 Burda Sonuc string veya variant türünde bir degerdir.
Ifade1 çeşitli işlemlerden oluşmuş bir ifade veya bir sayı veya bir metindir.
Ifade2 çeşitli işlemlerden oluşmuş bir ifade veya bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=34 & 9 'Sonuc = 349
 
Deger = 60 & 2 'Deger = 602
 
A=5.4,B= 57
 
C=B&A 'C = 575.4
 
D= 57 & 5.5 'D = 575.5
 
E=90.5 & 6 'E = 90.56
 
E=9.2 &6 'E = 9.26
 
E=90.7 & 6.6 'Hata oluşur
 
E="Hakan"&" Ayşe" 'E = "Hakan Ayşe"
 

Karşılaştırma Operatörleri :


Bu operatörler ile verilen ifadeler arasında karşılaştırmalar yapılır. Genel karşılaştırma operatörleri aşagıda verilmiştir.

= operatörü :
Bu operatör verilen iki ifadenin eşit olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 = Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır

Örnek :

Sonuc=(100=345) 'Sonuc=False
Sonuc=(100=100) 'Sonuc=True
A=12,B=45
Sonuc=(A=B) 'Sonuc=False
C=23,D=23
Sonuc=(A=D) 'Sonuc=True
 

<> operatörü :
Bu operatör verilen iki ifadenin farklı olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 <>Ifade2)
Burada Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(100<>345) 'Sonuc=True
 
Sonuc=(100<>100) 'Sonuc=False
 
A=12,B=45
 
Sonuc=(A<>B) 'Sonuc=True
 
C=23,D=23
 
Sonuc=(A<>D) 'Sonuc=False
 


< operatörü :
Bu operatör verilen birinci ifadenin ikinci ifadeden küçük olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 < Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(100<345) 'Sonuc=True
 
Sonuc=(100<100) 'Sonuc=False
 
Sonuc=(100<130) 'Sonuc=False
 
A=12,B=45
 
Sonuc=(A<B) 'Sonuc=True
 
C=23,D=23
 
Sonuc=(A<D) 'Sonuc=False
 


> operatörü :
Bu operatör verilen birinci ifadenin ikinci ifadeden büyük olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 > Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(800>345) 'Sonuc=True
 
Sonuc=(100>100) 'Sonuc=False
 
Sonuc=(100>130) 'Sonuc=False
 
A=90,B=45
 
Sonuc=(A>B) 'Sonuc=True
 
C=23,D=23
 
Sonuc=(A>D) 'Sonuc=False
 

=> operatörü :
Bu operatör verilen birinci ifadenin ikinci ifadeden büyük veya eşit olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir
Sonuac=(Ifade11 => Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(800=>345) 'Sonuc=True
 
Sonuc=(100=>100) 'Sonuc=True
 
Sonuc=(100=>130) 'Sonuc=False
 
A=90,B=45
 
Sonuc=(A=>B) 'Sonuc=True
 
C=23,D=23
 
Sonuc=(A=>D) 'Sonuc=True
 


<= operatörü :
Bu operatör verilen birinci ifadenin ikinci ifadeden büyük olup olmadıgını anlamak için kullanılır.Genel yazım şekli aşagıdaki şekildeki gibidir.
Sonuc=(Ifade11 <= Ifade2)
Burda Sonuc Booean tipinde bir degerdir.
Ifade1 bir sayı veya bir metindir.
Ifade2 bir sayı veya bir metindir.
Aşagıda çeşitli örneklerle kaynaştırma operatörü açıklanmıştır.

Örnek :

Sonuc=(800<=345) 'Sonuc=False
 
Sonuc=(100<=100) 'Sonuc=True
 
Sonuc=(100<=130) 'Sonuc=True
 
A=90,B=45
 
Sonuc=(A<=B) 'Sonuc=False
 
C=23,D=23
 
Sonuc=(A<=D) 'Sonuc=True
 

-

And Operatörü :


Lojik iki ifadenin karsilastirilmasi için kullanilir. Iki ifadenin'de dogru olmasi gereklidir. Genel yazim sekli asagidaki gibidir ;
Sonuc=Kosul1 And Kosul2
Burada Sonuc herhangi bir sayisal tipde degiskendir.
Kosul1 herhangi bir ifadedir.
Kosul2 herhangi bir ifadedir.
And operatörünün dogruluk tablosu asagidaki sekildeki gibidir.

İfade1

İfade2

Sonuc=İfade1 And İfade2

False

False

False

False

True

False

True

False

False

True

True

True

True

Null

Null

Null

True

Null

False

Null

False

Null

False

False

Null

Null

Null

And operatörü ayni zamanda bitwise comparison islemide yapilabilir.


İfade1

İfade2

İfade1 And İfade2

0

0

0

0

1

0

1

0

0

1

1

1


Örnek :

Sonuc = (False And False ) 'Sonuc=False
Sonuc = (Null And False ) 'Sonuc=False
A=True , B=True
Sonuc = (A And B ) ' Sonuc=True
A=1 ,B=0
Sonuc = (A And B ) ' Sonuc=0
A=1 ,B=1
Sonuc = (A And B ) ' Sonuc=1
A=1,B=4
Sonuc = (A And B ) ' Sonuc=0
A=1,B=3
Sonuc = (A And B ) ' Sonuc=1
A=1,B=5
Sonuc = (A And B ) ' Sonuc=1
A=1,B=8
Sonuc = (A And B ) ' Sonuc=0
 

Or Operatörü :

Lojik iki ifadenin karsilastirilmasi için kullanilir. Iki ifadeden yalnizca birinin dogru olmasi yeterlidir. Genel yazim sekli asagidaki gibidir :
Sonuc=Kosul1 Or Kosul2
Burada Sonuc hehangi bir sayisal tipde degiskendir.
Kosul1 herhangi bir ifadedir.
Kosul2 herhangi bir ifadedir.
Or operatörünün dogruluk tablosu asagidaki sekildeki gibidir ;

İfade1

İfade2

Sonuç=İfade Or İfade2

False

False

False

False

True

True

True

False

True

True

True

True

True

Null

True

Null

True

True

False

Null

Null

Null

False

Null

Null

Null

Null

Or operatörü ayni zamanda bitwise comparison islemide yapilabilir.

İfade1

İfade2

Sonuç=İfade Or İfade2

0

0

0

0

1

1

1

0

1

1

1

1


Örnek :

Sonuc = (False Or False ) ' Sonuc=False
 
Sonuc = (Null Or False ) 'Sonuc=Null
 
A=True , B=True
 
Sonuc = (A Or B ) 'Sonuc=True
 
A=1 ,B=0
 
Sonuc = (A Or B ) 'Sonuc=1
 
A=1 ,B=1
 
Sonuc = (A Or B ) 'Sonuc=1
 
A=1,B=4
 
Sonuc = (A Or B ) 'Sonuc=5
 
A=1,B=3
 
Sonuc = (A Or B ) 'Sonuc=3
 
A=1,B=5
 
Sonuc = (A Or B ) 'Sonuc=5
 
A=1,B=8
 
Sonuc = (A Or B ) 'Sonuc=9
 
A=10,B=8
 
Sonuc = (A Or B ) 'Sonuc=10
 


Xor Operatörü :


Lojik iki ifadenin karsilastirilmasi için kullanilir. Iki ifadeden yalnizca birinin dogru olmasi gereklidir. Eger ikiside dogru olursa sonuc yanlis olur. Genel yazim sekli asagidaki gibidir :
Sonuc=Kosul1 Xor Kosul2
Burada Sonuc hehangi bir sayisal tipde degiskendir.
Kosul1 herhengi bir ifadedir.
Kosul2 herhengi bir ifadedir.
Xor operatörünün dogruluk tablosu asagidaki sekildeki gibidir;

İfade1

İfade2

Sonuç=İfade Xor İfade2

False

False

False

False

True

True

True

False

True

True

True

False


Xor operatörü ayni zamanda bitwise comparison islemide yapilabilir.

İfade1

İfade2

Sonuç=İfade Xor İfade2

0

0

0

0

1

1

1

0

1

1

1

0


Örnek :

Sonuc = (False Xor False ) ' Sonuc=False
 
Sonuc = (True Xor False ) 'Sonuc=True
 
A=True , B=True
 
Sonuc = (A Xor B ) 'Sonuc=False
 
A=1 ,B=0
 
Sonuc = (A Xor B ) 'Sonuc=1
 
A=1 ,B=1
 
Sonuc = (A Xor B ) 'Sonuc=0
 
A=1,B=4
 
Sonuc = (A Xor B ) 'Sonuc=5
 
A=1,B=3
 
Sonuc = (A Xor B ) 'Sonuc=2
 
A=1,B=5
 
Sonuc = (A Xor B ) 'Sonuc=4
 
A=1,B=8
 
Sonuc = (A Xor B ) 'Sonuc=9
 
A=10,B=8
 
Sonuc = (A Xor B ) 'Sonuc=2 
 

 

Eqv Operatörü :


Lojik iki ifadenin karsilastirilmasi için kullanilir. Iki ifadenin ikisininde dogru veya ikisininde yanlis olmasi durumunda dogru sonuc alir. Genel yazim sekli asagidaki gibidir
Sonuc=Kosul1 Eqv Kosul2
Burada Sonuc herhangi bir sayisal tipde degiskendir.
Kosul1 herhangi bir ifadedir.
Kosul2 herhangi bir ifadedir.
Eqv operatörünün dogruluk tablosu asagidaki sekildeki gibidir;

İfade1

İfade2

Sonuç=İfade Eqv İfade2

False

False

True

False

True

False

True

False

False

True

True

True


Eqv operatörü ayni zamanda bitwise comparison islemide yapilabilir.

İfade1

İfade2

Sonuç=İfade Eqv İfade2

0

0

1

0

1

0

1

0

0

1

1

1

Örnek :

Sonuc = (False Eqv False ) ' Sonuc=True
 
Sonuc = (True Eqv False ) 'Sonuc=False
 
A=True , B=True
 
Sonuc = (A Eqv B ) 'Sonuc=True
 
A=1 ,B=0
 
Sonuc = (A Eqv B ) 'Sonuc=0
 
A=1 ,B=1
 
Sonuc = (A Eqv B ) 'Sonuc=1
 
A=1,B=4
 
Sonuc = (A Eqv B ) 'Sonuc=-6
 
A=1,B=3
 
Sonuc = (A Eqv B ) 'Sonuc=-3
 
A=1,B=5
 
Sonuc = (A Eqv B ) 'Sonuc=-5
 
A=1,B=8
 
Sonuc = (A Eqv B ) 'Sonuc=-10
 
A=10,B=8
 
Sonuc = (A Eqv B ) 'Sonuc=-3
 

Imp Operatörü :


Lojik iki ifadenin karsilastirilmasi için kullanilir. Birincinin degili veya ikincidir. Genel yazim sekli asagidaki gibidir :
Sonuc=Kosul1 Imp Kosul2
Burada Sonuc hehangi bir sayisal tipde degiskendir.
Kosul1 herhangi bir ifadedir.
Kosul2 herhangi bir ifadedir.
Imp operatörünün dogruluk tablosu asagidaki sekildeki gibidir.

İfade1

İfade2

Sonuç=İfade Imp İfade2

False

False

True

False

True

True

True

False

False

True

True

True

True

Null

True

Null

True

True

False

Null

True

Null

False

Null

Null

Null

Null

Imp operatörü ayni zamanda bitwise comparison islemide yapilabilir.

İfade1

İfade2

Sonuç=İfade Imp İfade2

0

0

1

0

1

1

1

0

0

1

1

0


Örnek :

Sonuc = (False Imp False ) 'Sonuc=True
 
Sonuc = (Null Imp False ) 'Sonuc=True
 
A=True , B=True
 
Sonuc = (A Imp B ) 'Sonuc=True
 
A=1 ,B=0
 
Sonuc = (A Imp B ) 'Sonuc=0
 
A=1 ,B=1
 
Sonuc = (A Imp B ) 'Sonuc=1
 
A=1,B=4
 
Sonuc = (A Imp B ) 'Sonuc=-2
 
A=1,B=3
 
Sonuc = (A Imp B ) 'Sonuc=-1
 
A=1,B=5
 
Sonuc = (A Imp B ) 'Sonuc=-1
 
A=1,B=8
 
Sonuc = (A Imp B ) 'Sonuc=-2
 
A=10,B=8
 
Sonuc = (A Imp B ) 'Sonuc=-3
 

Not Operatörü :


Lojik bir ifadenin degilinin alinmasi için kullanilir. Genel yazim sekli asagidaki gibidir :
Sonuc=Not Kosul
Burada Sonuc herhangi bir sayisal tipde degiskendir.
Kosul herhangi bir ifadedir.
Not operatörünün dogruluk tablosu asagidaki sekildeki gibidir ;

İfade

Not İfade

True

False

False

True


Not operatörü ayni zamanda bitwise comparison islemide yapilabilir.

İfade

Not İfade

0

1

1

0


Örnek :

Sonuc=(Not True) 'Sonuc=False
 
Sonuc=(Not 1) 'Sonuc=False
 
A=4
 
Sonuc=(Not A) 'Sonuc=-5
 
A=45
 
Sonuc=(Not A) 'Sonuc=-46
 
Sonuc=(Not 10) 'Sonuc=-11
 

Visual Basic'de Kontrol Komutları

Kontrol komutları programcılar tarafından sıkca kullanılan belirli ifadeleri kontrol etmek veya bazı şartların gerçekleşip gerçekleşmedigini kontrol etmek amacıyla kullanılan komutlardır. Biz burada en çok kullanılan komutların üzerinde duracagız.

If Kontrol Yapısı :
Genel olarak bu komut yapısı şu şekilde yazılır.

If Kosul Then
Kosul dogru ise yapılması istenen işlemler.

Endif

Kullandıgımız her If kontrolu için mutlaka bir Endif kullanmalıyız. Bu kontrol yapısının sonlandıgını belirtir.

Örnek:

If ad="FATIH" Then 
 
Maas=10000000 
 
Endif
 


Eger koşul gerçekleşmemiş ise yapılması istenen bazı işlemler varsa o zaman şu şekilde bir kontrol yapısını kullanabiliriz.

If Kosul Then
Kosul dogru ise yapılması istenen işlemler.
Else
Kosul yanlış ise yapılması istenen işlemler.
Endif

Aynı anda bir kaç koşul için karşılaştırma yapılmak isternirse;

If Kosul Then
Kosul dogru ise yapılması istenen işlemler.
Elseif Kosul1 Then
Kosul1 dogru ise yapılması istenen işlemler.
Elseif Kosul2 Then
Kosul2 dogru ise yapılması istenen işlemler.
Else
Bütün kosullar yanlış ise yapılması istenen işlemler.
Endif
yapısı kullanılır. Bu yapıda mutlaka Else blogunun bulunmasına gerek yoktur. Burada eger Kosul dogru ise ilk Then’den sonraki satırlar çalıştırılarak Elseif ifadesine kadar icra edilirler. Daha sonra Endif ifadesinden sonraki satır icra edilir.Eger Kosul yanlış ise Kosul1 ifadesi kontrol edilir.Dogru ise buradaki then den sonraki satırlar çalıştırılır. Yanlış ise Kosul2’ye bakılır. Eger bu kosulda yanlıs ise Else ifadesinden sonraki satırlar çalıştırılır.

Örnek :

If Isım=”Ali” Then 
 
Maas=Maas * 1.2 
 
Elseif Isım=”Murat” Then 
 
Maas=Maas * 1.4 
 
Elseif Isım=”Kemal” Then 
 
Maas=Maas * 1.1
 
Endif
 


Örnek :

If Bolen=0 Then
 
Msg.Text=” Bolen sayı sıfır olamaz."
 
Else
 
Sonuc= Sayı / Bolen
 
Msg.Text = Sonuc
 
Endif
 


Ornek :

If name="Ali" AND no="1301920035"
 
Not=4
 
ElseIf name="Ahmet" AND no="1301940023" Then
 
Not=3
 
ElseIf name="Hakan" AND no="1301930045" Then
 
Not=2
 
ElseIf name="Hatice" AND no="1301940005" Then
 
Not=7
 
Endif
 

Select Case:


Bu kontrol yapısında sadece bir degişkenin durum kontrolü yaılır.Kontrolü yapılacak degişkenin genel olarak alabilecegi degerler belirli ise bu yapının kukllanılması If yapısına göre daha avantajlıdır. Yazılış biçimi genel olarak aşagıdaki şekildeki gibidir

Select Case Degisken
Case Deger1
Degisken=Deger1 oldugu durumda yapılması istenen işlemler
Case Deger2
Degisken=Deger2 oldugu durumda yapılması istenen işlemler
Case Else
Degisken yukarıdaki degerler den hicbirine eşit degil ise yapılacak işlemler
End Select

Kullandıgımız her Select ifadesi için bir End Select kullanmalıyız.

Örnek :

Select Case No
 
Case 1304
 
Name="Murat Tuna"
 
Case 1306
 
Name="Ayse Sinem"
 
Case 1307
 
Name=”Hakan Kaya”
 
Case 1312
 
Name=”Abdullah Kahyalı”
 
Case 1324
 
Name="Hatice Uygun"
 
End Select
 

Örnek :

Select Case Ay
 
Case 1
 
Max_date=31
 
Case 2
 
Dim Artık as Integer
 
Artık = Yıl Mod 4
 
If Artık=0 Then
 
Max_date=29
 
Else
 
Max_date=28
 
Endif
 
Case 3
 
Max_date=31
 
Case 12
 
Max_date=31
 
Case Else
 
Mesaj=”Error : Bir yılda 12 ay vardır.”
 
End Select
 

Visual Basic'te Döngü Komutları


Bu komutlar belirli işlemleri belirli sayıda veya herhangi bir şart sağlanana kadar tekrarlamak amacı ile kullanılırlar. Bu komutlar aşagıda verilmiştir.
For ….. Next Döngüsü
Do While …. Loop Döngüsü
Do Until ……Loop Döngüsü
Do …… Loop While Döngüsü
Do …… Loop Until Döngüsü

Aşagıdada bu döngülerin nasıl kullanıldıkları açıklanmış ve örneklerle pekiştirilmiştir.

For Next Döngüsü :
Bütün dillerde bulunan döngü yapısıdır. Genel yazım şekli aşagıdaki şekildeki gibidir.

For sayac=başlangıç To bitiş Step artım
Arada işletilecek komutlar
Next sayac


Bu döngü sayac baslangıc degerınden bitiş degerine kadar çalıştırılır. Sayaç başlangıc degerinde iken döngü içindeki komutlar işletilir. Next ifadesine gelindiginde tekrar For satırına gelinir. Sayac degeri artım kadar artırılır. Eger Sayac degeri Bitis degerini geçmiş ise Next adımından sonraki adım işletilir. Burada step degerine pozitif veya nekatif bir deger verşilebilir. Eger nekatif deger verilirse sayac her seferinde 1 azaltılır.Step adımını vermezsek bu pozıtif 1 (+1) anlamındadır ve her adımda sayac bir artırılacaktır.Biz içiçe For Next döngüleride kurabiliriz. Ancak burada şuda dikkat edilmelidir. En son başlatılan For döngüsü ilk önce bitirilmelidir.

For sayac1=basla1 To son1
Komutlar
For sayac2=basla2 To son2
Komutlar
Next sayac2
Next sayac1

Biz buradaki sayıyı daha da artırabiliriz.
Aşagıdaki şekideki gibi bir kullanım hatalıdır

For sayac1=basla1 To son1
Komutlar
For sayac2=basla2 To son2
Komutlar
Next sayac1
Next sayac2
Burada For döngüsü işletilirken hata oluşacaktır

Örnek :

Factöriyel=1
 
For I=1 To Sayi
 
Factöriyel= Factöriyel * I
 
Next I
 

Bu örnekte girmiş oldugunuz pozitif sayının faktoriyeli hesaplanmaktadır.

Do While Döngüsü :

Bu dögünün genel yazim sekli asagidaki sekildeki gibidir.

Do While Kosul
Komutlar
Loop
Burada önce Kosula bakilir. Eger kosul dogru ise aradaki satirlar çalistirilir taki Loop satirina kadar. Loop satirinda tekrar While satirina dönülür. Kosul tekrar kontrol edilir. Eger dogru ise ara satirlar tekrar çalistirilir. Kosul yanlis ise Loop ‘tan sonraki ilk satirdan program çalismaya devam eder. Içiçe Do While döngüleride kurabiliriz.

Do While Kosul1
….
Do While Kosul2

Komutlar
Loop
…..
Loop
Her Do While için mutlaka bir Loop yerlestirmeliyiz.

Örnek :

Fact=1 I=2
 
Do While I<=Sayi
 
Fact=Fact * I
 
I=I+1
 
Loop
 

Buradaki örnekte te faktöriyel hesabini Do While döngüsü ile yapiyoruz. Burada sayac olarak I degeri kullaniliyor. Eger faktöriyeli hesaplanacak deger 2 den kücükse (1 veya 0 ise) döngü içine girilmemektedir. Döngü içinde sayac artimini kendimiz veriyoruz. Sayac sayi degerine esit iken döngü son kez çalitiriliyor.

Do ….. Loop While Döngüsü :
Bu döngü yapisinin genels yazim sekli asagida verilmistir.

Do
…..
Komutlar
…..
Loop While Kosul

Bu ifade de döngü içinde komutlar mutlaka bir defe icra edilir. Daha sonra Kosul kontrol edilir. Eger kosul dogru ise tekrar Do satirina dallanilir ve aradaki komutlar tekrar icra edilir. Yanlis ise döngüden çikilir.Bu yapiyida içiçe kullanmamiz mümkündür.

Örnek :

Fact =1 I=1
 
Do
 
Fact=Fact *I
 
I=I+1
 
Loop While I<=Sayi
 

Faktöriyel hesapini yapan bir baska örnek verilmistir.

Do Until Döngüsü:

Bu döngünün genel yazım şekli aşagıdaki şekildeki gibidir.

Do Until Koşul
Komutlar
Loop

Burada önce Koşula bakılır. Eger koşul yanlış ise aradaki satırlar çalıştırılır'taki Loop satırına kadar. Loop satırında tekrar While satırına dönülür. Koşul tekrar kontrol edilir. Eger yanlış ise ara satırlar tekrar çalıştırılır. Koşul doğru ise Loop‘tan sonraki ilk satırdan program çalışmaya devam eder. İçiçe Do Until döngüleride kurabiliriz. Do While döngüsünden tek farkı kosul yanlış iken çalıştırılır.

Do Until Kosul1

Do Until Kosul2

Komutlar
Loop
…..
Loop
Her Do Until için mutlaka bir Loop yerleştirmeliyiz.

Örnek :

Fact=1 I=Sayi
 
Do Until I<=1
 
Fact=Fact * I
 
I=I-1
 
Loop
 

Buradaki örnekte'de faktöriyel hesabını Do Until döngüsü ile yapıyoruz. Burada sayac olarak I degeri kullanılıyor. Eger faktöriyeli hesaplanacak deger 2 den küçükse (1 veya 0 ise) döngü içine girilmemektedir.Döngü içinde sayac azaltımını kendimiz veriyoruz. Sayac 2 degerine eşit iken döngü son kez çalıştırılıyor
Do … Loop Until Döngüsü : Bu döngü yapısının genel yazım şekli aşağıda verilmiştir.
Do

Komutlar

Loop Until Kosul

Bu ifade de döngü içinde komutlar mutlaka bir defa icra edilir. Daha sonra Koşul kontrol edilir. Eger koşul yanlış ise tekrar Do satırına dallanılır ve aradaki komutlar tekrar icra edilir. Koşul dogru ise döngüden çıkılır.Bu yapıyıda içiçe kullanmamız mümkündür
Örnek :

Fact =1 I=1
 
Do
 
Fact=Fact *I
 
I=I+1
 
Loop While I>Sayi                     Faktöriyel hesapını yapan bir başka örnek verilmiştir
 

VİSUAL DATA MANAGER (VISDATA)

VisData, yeni bir veritabanı yaratmak ya da mevcut bir veriabanına erişmek için kullanılan bir visual Basic Uygulamasıdır.

VisData Proğramını çalıştırmak için Visual Basic Uygulamasında Add-Ins menüsünden Visual Data Manager seçilir.

File Menüsü

File menüsünde mevcut bir veritabanına bağlanmak için Open komutu, yeni bir veritabanı yaratmak için New komutu vardır. Open ile mevcut bir veritabanı açılır. ardından bu veritabanının istenilen tablosu üzerinde temel veritabanı işlemleri(ekleme,silme,değiştirme,gösterme vs.) yapılır. New komutu ile istenilen tipte bir veritabanı yaratılır.

örnek olarak file => New =>Microsoft Accses => Version 7.0   seçiniz

size bu yeni kaydedilecek veritabanı dosyasının ismini ve yolunu girmenizi isteyecek. herhangi bir yol ve isim verdikten sonra; yeni veritabanı dosyasının temelini atmış olacaksınız. şöyle bir görüntünün çıkması gerekir.ben yeni yarattığım veritabanına deneme.mdb olarak isim verdim

şimdide oluşturduğumuz bu deneme.mdb dosyasına bir tablo eklememiz gerekecek. bunun için Properties üzerinde sağ tıklayalım açılan küçük pencerede "New Table Seçeneğini tıkladıktan sonra şöyle bir tablo karşımıza çıkacaktır;

tablo ismine "URUN" Adı verdim

daha sonra urun tablosundaki sahaları belirleyelim bunu için "Add Field" Tuşuna Basalım. burda değişken ismi, sayımı sözcükmü tarihmi ve değişken uzunlukları girilir

bu işlemler tabloya eklenecek her alan için yinelenir.

daha sonra "Add Index" tuşuyla URUN adıyla oluşturduğumuz tablonun hangi alana göre indexleme yapılacağını seçebiliriz. en son olarak da "Build the Table" Tuşuyla oluşturduğumuz tabloyu kaydedelim

Şimdide oluşturduğumuz bu tablo üzerinde yapabileceğimiz işlemlere bakalım;

ilk önce "URUN" adı altında kaydettiğimiz tabloyu açalım

 bunun için resimde görülen "URUN" yazan yere çift tıkladığımızda ;

daha önceden field (saha) tanımı yaptığımız "urunadi" ve "urunkodu" alanlarını görürüz. tabi burda istediğimiz kadar alan ismi açabiliriz. üstded de "Add", "Edit", "Delete", "Seek" "Filter", ve "Close" tuşları görünür. işte bu tuşlarla tablomuzdaki istediğimiz işlemleri yapabiliriz.

Add ile urun adlı tablomuza yeni bir kayıt,
Edit ile Daha önceden var olan bir kayıt üzerinde değişiklik,
Delete ile Kayıt Sil
Seek ile Kayıtlar arasında arama
Filter ile verdiğimiz kriterlere göre filtreleme
Close ile Kapat

işlemlerini yapabiliriz.

Visual Basic ortamında toolbox üzerinde standart Kontroller görünür

Bunlar şunlardır;

Label

Etiket; Sadece Bilgi vermek yada görüntü olarak form üzerinde durur.genellikle metin kutularını adlandırmak için kullanılır.

PictureBox

Form üzerine resim yerleştirmek için kullanılır

Textbox

En önemli özelliklerden biridir. Kullanıcının veri girmesi için kullanılır

Frame

Çerçeve ; Kontrolleri gruplamak için kullanılır.

Command Button

İşlemler için onay kutucuğu

CheckBox

İşaret Kutusu

Option Box

Seçenek Kutusu

ComboBox

Aşağı doğru açılır liste. Seçenekler için kullanılır

Listbox

Birçok veriyi liste şeklindeki pencerede göstermek için kullnaılır

DriveListBox

Sürücü Listesi

Kontroller Sadece Bukadar değildir. Project Menüsünden Components komutu ile ya da Araç kutusu üzerine sağ tıklayarak component kutusuna ulaşabilirsiniz. Aşağıda görülen

 

Şimdi Bunları teker teker görelim

PictureBox

Değişik Resim dosyalarını forma kare olarak çizdirdiğimiz resim çerçevesi içine yükleyebiliriz. Bunu şu şekilde yaparız. boş for üzerindeyken AraçKutusu Üzerinden "PicturBox" Simgesini tıklayarak Formun istenilen bir yerine gelip Kare çizeceğiz.  bundan sonrada o karenin içine istediğimiz resmi 2 yolla kopyalayabiliriz

birincisi formun sağ tarafında yer alan bu tabloda Bitmap Yazan yerin hemen sağindaki kutucuğu tıklıyoruz ikincisi ise Form1 'i  çift tıklayıp açılan pencerede kodlamayı yapıyoruz;

Picture1.picture=loadpicture ("c:\ windows\bulutlar.bmp")

Label (Etiket)

Form üzerinde bir Açıklama Yazısı olarak tanımlayabiliriz. Örnekte dahada iyi anlayacaksınız

Adı ve Soyadı Yazan Yazılar birer Label dir. Labeli seçtğinizde ilk önce oraya Label1, Label2 diye yazar onları İstediğiniz Biçimde yazmak için Properties tablosunda "Capture" nin Sağındaki label... diye yazan yerleri değiştiğinizde otomatik olarak ne yazdıysanız oraya geçer

TextBox

Bilgi girişi için kullanılır. Yukardaki form1 resminde text1 ve text2 yazan yerlerdir. Biçok proğramda kullanılan adısoyadı, adresi, telefonu vs gibi veri alanlarını proğrama girmek için kullanılır. Text kutucuklarına yazının ortalanması sağa dayalı veya sola dayalı olarak yazdırılması sizin elinizdedir bunun için şu işlemi yapacağız.

gördüğünüz gibi yine bu pencerede Alignment yazan yerdeki Left Justifiyi Seçerseniz Sola dayalı olarak Right ' ı seçerseniz Sağa Dayalı olarak ve Center' ı seçerseniz tam ortalanmış olarak yazar.

bunun yanıda yine aynı penceredeki Multiline özelliğini"true" olarak ayarlarsanız text kutusundaki veriyi birden çok satır olarak girebilirsiniz.

Hani görürüz ya bazı proğramları ilk başlattığımızda kullanızı adı ve şifre sorar şifreyi yazdığımızda "****" diye gözükür text kutusunda bunu da şu şekilde yaparız, yine properties penceresinde "Passwordchar" ın karşısına "*" yazarsak bunu elde etmiş oluruz

Textbox üzerinde kullanıcının hiç bir şekilde müdahale etmemesini istiyorsak "Locked" bölümünü "true" yapın

Yazının fontunu, rengini ve büyüklüğünü de yine properties penceresindeki "font" ve"forecolor" bölümlerinden ayarlayabiliriz.

ve önemli bir özellikte "ToolTipText" özelliğidir. bu özelilk text üzerine mausu götürünce küçük bir sarı açıklama bölümü getirir.

Frame (Çerçeve)

Kontrolleri gruplamak için kullnaılır.

Command Button

İşlemin başlatılmasını Sağlar

Frame lerin ve command button! un başlıklarını Caption özeliği ile ayarlıyoruz

 

bi kaç gün içinde bu sayfayı bitireceğim....

İşte Daha Önce "ya Acaba Şunu Nasıl Yapabilirm" deyipde yapamadığınız ve artık yapabileceğiniz çok fazla VB örnekleri


 

Listbox'a degisik renklerde item nasıl eklenir?
MSFlexGrid control kullanın

Form close butonu nasıl çalistirilir?
dim bClose as Boolean
Form'un QueryUnload event'ine ekle:
If bClose = false then cancel = true

Text dosyasina çift tirnak isaretleri olmadan nasıl string girisi yapılır?
Write # statement yerine Print # statement kullan
Print # statement stringlerin etrafina çift tirnak koymaz

Bir combo'nun içini diger bir combo'dan aldiklarinizla nasıl doldurursunuz?
Sub comboA_click()
comboB.text = comboA.text
End sub

Eger ComboA'daki seçili degerlerin ComboB'ye aktarilmasini istiyorsaniz
Sub comboA_click()
comboB.AddItem comboA.text
end sub


Birden fazla sütun içeren combolar nasıl yapılır?
Projenize Microsoft Forms 2.0 control ekleyin, oradaki
combo multi-column destekler.

Combo1.Clear
Combo1.ColumnCount = 2
Combo1.ListWidth = "6 cm" 'Total genislik
Combo1.ColumnWidths = "2 cm;4 cm" 'sütun genisligi
Combo1.AddItem "Ivir zivir"
Combo1.List(0, 1) = "Ivir zivir"

Dikine uzanan label nasıl yapılır?
Private Sub Form_Activate()
Dim s As String
Label1.Caption = "Visual Basic 2000"
For i = 1 To Len(Label1)
s = s & Mid$(Label1, i, 1) & vbCrLf
Next
Label1 = s
End Sub
dikkat: Label'i dikine çekmelisiniz

Joker karakterler kullanarak string nasıl aranir?
Dim Mystr As String
Mystr = "Hakan"
If Mystr Like "H*" Then
MsgBox "Bulundu"
Else
MsgBox "Bulunamadi"
End If

Her dile uyumlu tarih nasıl formatlanir?
Command1.Caption = Format$(Date, "Short Date")

Uyari isareti olan (X) mesaj kutusu nasıl yapılır?
MsgBox "Mesaj Buraya!!", vbCritical, "Önemli"

Sadece **** gösteren text kutusu nasıl yapılır?
Textbox'un PasswordChar property'sini "*" karakterine esleyin.

Içine tab yerlestirebileceginiz text kutulari nasıl yapılır?
Bir form içindeki tüm kontrollerin tabstoplarini False'e esitleyin

Text kutulari için kisayol tuslari nasıl belirlenir?
Kisayol tusuna sahip bir label hazirlayin ve label'in tabindex'ini textbox'un tabindexinden
bir asagiya esitleyin.

Text1 içerigi Text2 içine nasıl kopyalanir?
VB6.0 kullaniyorsaniz Replace Function ise yarar:

Text2 = Replace(Text1, vbCrLf, "" & vbCrLf)

Diger VB'lerde vbCrLf'leri bulmak için asagidaki kod kullanilir:

Dim sString As String
Dim sNewString As String
sString = Text1
While Instr(sString, vbCrLf)
sNewString = sNewString & Left(sString, _
Instr(sString, vbCrLf) - 1) & "" & vbCrLf
sString = Mid(sString, Instr(sString, vbCrLf) + 2)
Wend
Text2 = sNewString

Command butondan popup menü nasıl yapılır?

Öncelikle menü editör ile bir menü yaratin.
Asagidaki gibi:

Button Menu (Menu name: mnuBtn, Visible: False - Unchecked)
....SubMenu Item 1 (Menu name: mnuSub, Index: 0)
....SubMenu Item 2 (Menu name: mnuSub, Index: 1)
....SubMenu Item 3 (Menu name: mnuSub, Index: 2)
....SubMenu Item 4 (Menu name: mnuSub, Index: 3)


ve bir tane de command button hazirlayin ve kodu yerlestirin:

Private Sub mnuSub_Click(Index As Integer)

Call MsgBox("Kliklenen menü: " & Index + 1, vbExclamation)

End Sub

Private Sub Command1_Click()
Call PopupMenu(mnuBtn)
End Sub

Not: Isterseniz daha güzel etki için "Call PopupMenu(mnuBtn)" çagrisi yerine

Call PopupMenu(Menu:=mnuBtn, X:=Command1.Left, Y:=Command1.Top + _
Command1.Height)

çagrisini yada;

Call PopupMenu(mnuBtn, vbPopupMenuCenterAlign, Command1.Left + _
(Command1.Width / 2), Command1.Top + Command1.Height)

çagrisini kullanin.


Text kutusunda olan degisiklik nasıl farkedilir?

'Amaç kullaniciyi yaptigi degisiklikler konusunda programi kapatmadan uyarmaktir.

Public Degisti As Boolean 'Bu degisken textbox'ta herhangi bir degisiklik olup olmadigini tutar.
Private Sub Text1_Change()
Degisti= True
End SubPrivate

Sub Form_Unload(Cancel As Boolean)
If Degisti Then
If Msgbox("Degisiklikler kaydedilsin mi?", vbYesNo, "Kayit'") = vbYes Then
'Buraya kaydetme ile ilgili kodlar gelecek
Degisti = False
' Degisti degerini tekrar False yap ki bir sonraki degisiklikte tekrar çalisabilsin. (Bu Önemli!!!!)
'Bunu sadece buradaki If - End If blogu arasina yaz
End If
End If
End Sub

Çalisma aninda Statusbar içerigi nasıl degistirilir?
Statusbar1.Panels(1).Text = "Ivir zivir"

Listbox'a bir text dosyasi içerigi nasıl yüklenir?
Private Sub Command1_Click()
Dim BulunanKelimeler As String
Open "C:\test.txt" For Input As #1
List1.Clear
While Not EOF(1)
Input #1, StringHold
List1.AddItem BulunanKelimeler
Wend
Close #1
End Sub

Textbox ve Combobox için Undo (geri al) fonksiyonu nasıl kullanilir?
'Bir Windows API undo islemi yapar

'asagidaki deklerasyonlari yaz
Declare Function SendMessage Lib "User" (ByVal hWnd As _
Integer, ByVal wMsg As Integer, ByVal wParam As _
Integer, lParam As Any) As Long

'asagidaki degismezleri yaz

Global Const WM_USER = &h400
Global Const EM_UNDO = WM_USER + 23

' Undo Sub 'lara asagidaki kodu yaz
UndoResult = SendMessage(myControl.hWnd, EM_UNDO, 0, 0)

'UndoResult = -1 olursa hata var demektir
'UndoResult sadece bir rakamdir ve hiç bir önemi yoktur. Sadece yer tutmasi için yazilir.
'VB'nin buna benzer gariplikleri vardir. Bir amaci varsa da ben bilmiyorum

Clipboard'dan text nasıl kopyalanir?
'Textbox'ta texti isaretle ve isaretlenen yeri clipboard'dan kopyaladiginla degistir:

txtBox.SelText = Clipboard.GetText

'Yada tüm text'i clipboarddan aldiginla degistir.

txtBox.Text = Clipboard.GetText

Clipboard'a text nasıl kopyalanir?
'Önce clipboard'u temizle
Clipboard.Clear

'Sonra kopyalanacak alani seç ve clipboard'a kopyala
Clipboard.SetText txtBox.Text, vbCFText

Toolbar'in click olayi nasıl kodlanir?

Private Sub Toolbar1_ButtonClick(ByVal Button As Button)

'button clicklerini saptamak için:

Select Case Button.Key
Case Is = "Exit"
If MsgBox("Çikmak istiyor musunuz??", vbQuestion + vbYesNo + _
vbDefaultButton2, "Programdan çikiyorsunuz!") = vbNo Then Exit Sub
Call ExitProgram
Case Is = "Repair"
Call Repairdb
Case Is = "Delete"
Call DeleteRoutine
Case Is = "Edit"
Call EditRoutine
Case Is = "New"
Call NewRoutine
Case Is = "Copy"
Call CopyToClipboard
Case Is = "Help"
Call ShowHelpContents
End Select
End Sub

Cdbl ile Val fonksiyonlari arasindaki fark nedir?
print Val("12345")
12345

print Val("12,345")
12

print CDbl("12,345")
12345

print CDbl("12345")
12345

Dogum gününden kişinin yaşı nasıl hesaplanır?
'Text'i Date data türüne çevir

Dim Birth as Date
Birth = DateValue(txtDOB)

'Yasi hesapla
Dim Age as Integer
Age = Int(DateDiff("D", Birth, Now) / 365.25)

4 rakamlı tarih nasıl kontrol edilir?

Public Function ValidDate(MDate)

'Amaç: 4 digitli "yyyy" formatindaki tarihi kontrol etmek; hata var ise kullaniciyi uyarmaktir.
'Input: Texbox'tan string
'Output: True yada False
'Default : False

ValidDate = False

'Eger uzunluk "m/d/yyyy" 'den kisa ise fonkiyondan çik
If Len(MDate) < 8 Then Exit Function

'Geçerli bir tarih türü girilmemisse terket
If IsDate(MDate) = False Then Exit Function

'Sonu "yyyy" ile bitmiyorsa yada baslamiyorsa terket
Dim StartDate As String
Dim EndDate As String

EndDate = Right(MDate, 4)
StartDate = Left(MDate, 4)

If ValidChar(EndDate, "0123456789") = False And _

ValidChar(StartDate, "0123456789") = False Then Exit Function


'Tüm bu testlerden geçilirse True yükle
ValidDate = True
End Function

Hata kontrol blokları nasıl denetlenir?
'error kodunu baslat
On Error GoTo HataKontrol

'Buraya program kodlarini gir. Buradan sonrasi artik hata denetimine açiktir.
'Hata kontrolundan çikmak istersen 0 (sifir) a git
On Error GoTo 0 : Exit Function ' ve fonksiyonu terket

:HataKontrol
Dim strErr As String

'Kullaniciya olusan hata ve tanimini ver
strErr = "Hata olustu: " & Err.Number & " " & Err.Description
MsgBox strErr, vbCritical + vbOK, "Hata!"

Web adresleri nasıl açılır?
'Asagidaki kodu bir kontrolun click event'ine yaz
Dim iRet As Long
Dim Cevap As Integer

Cevap = MsgBox("www.hakanersoz.com adresini açmak istiyor musunuz?", vbInformation + vbYesNo, "www.hakanersoz.com")

Select Case Cevap
Case vbYes
iRet = Shell("start.exe http://www.hakanersoz.com", vbNormal)
Case vbNo
Exit Sub
End Select

10, 100, 1000 gibi rakamlara en yakın sayı nasıl yuvarlanır?

'Örnek 100' yuvarla:
Round(RatioBolus * Val(txtDW), 100)

'BAS module'ü içine yaz
Public Function Round(Dose, Factor)
'Amaç: Sayiyi yuvarlamak
'Girdi: Sayi, Factor (10, 100, 1000, etc)
'Çikti: Yuvarlanmis sayi

Dim Temp As Single
Temp = Int(Dose / Factor)
Round = Temp * Factor
End Function

Menüye 13x13 bitmaplar nasıl eklenir?

'Bir Picturebox control ekle
'Autosize özelligini 'True' yap unutma: bitmap olacak (Icon degil)
'maximum 13X13 bitmap olmali.

'Asagidaki deklerasyonlari bir Bas modulune ekle:
'Bu örnek VB4 içindir

Private Declare Function VarPtr Lib "VB40032.DLL" (variable As Any) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function SetMenuItemBitmaps Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long

Const MF_BYPOSITION = &H400&
'form load event içine asagidaki kodu yerlestir

Dim mHandle As Long, lRet As Long, sHandle As Long, sHandle2 As Long
mHandle = GetMenu(hwnd)
sHandle = GetSubMenu(mHandle, 0)
lRet = SetMenuItemBitmaps(sHandle, 0, MF_BYPOSITION, imOpen.Picture, imOpen.Picture)
lRet = SetMenuItemBitmaps(sHandle, 1, MF_BYPOSITION, imSave.Picture, imSave.Picture)
lRet = SetMenuItemBitmaps(sHandle, 3, MF_BYPOSITION, imPrint.Picture, imPrint.Picture)
lRet = SetMenuItemBitmaps(sHandle, 4, MF_BYPOSITION, imPrintSetup.Picture, imPrintSetup.Picture)
sHandle = GetSubMenu(mHandle, 1)
sHandle2 = GetSubMenu(sHandle, 0)
lRet = SetMenuItemBitmaps(sHandle2, 0, MF_BYPOSITION, imCopy.Picture, imCopy.Picture)

Çalisma aninda menü nasıl olusturulur?

Dim index As Integer
index = mnuHook.Count
Load mnuHook(index)
mnuHook(index).Caption = "New Menu Entry"
mnuHook(index).Visible = True

'Yeni girdiler mnuHook 'dan sonra olusur. Ancak unutmayin mnuHook halihazirda varolan bir menü elemanidir.

Text nasıl sifrelenir?
'encryption function :

Public Function Encrypt(ByVal Plain As String)
For I=1 To Len(Plain)
Letter=Mid(Plain,I,1)
Mid(Plain,I,1)=Chr(Asc(Letter)+1)
Next
Encrypt = Plain
End Sub

Public Function Decrypt(ByVal Encrypted As String)
For I=1 to Len(Encrypted)
Letter=Mid(Encrypted,I,1)
Mid(Encrypted,I,1)=Chr(Asc(Letter)-1)
Next
Decrypt = Encrypted
End Sub

Print Encrypt("This is just an example")
Print Decrypt("Uijt!jt!kvtu!bo!fybnqmf")

Form nasıl yavas yavas karartilir? (Fade to black)

Sub FormFade(frm As Form)
' Formu yavas yavas karartir

For icolVal% = 255 To 0 Step -1
DoEvents
frm.BackColor = RGB(icolVal%, icolVal%, icolVal%)
Next icolVal%
End Sub

Formun caption'una nasıl kayan yazı yazılır?

Sub KayanYazi(frm As Form)
Dim X As Integer
Dim current As Variant
Dim Y As String
Y = frm.Caption
frm.Caption = ""
frm.Show
For X = 0 To Len(Y)
    If X = 0 Then
    frm.Caption = ""
    current = Timer
        Do While Timer - current < 0.1
           DoEvents
        Loop
   GoTo bitti
Else: End If
frm.Caption = left(Y, X)
current = Timer
Do While Timer - current < 0.05
DoEvents
Loop
bitti:
Next X
End Sub

Verilen kredi karti numarasinin geçerli olup olmadigi nasıl anlasilir?
'Asagidaki fonksiyonu bir BAS modulu içine kopyala
'Not: Tüm kredi kartlari belli bir algoritma ile üretilir. Rastgele sayilar bu algoritmaya uymaz. Bu fonksiyon bu hesaplamalari yapar
'Asagidaki Sub bir command butonuna ait olabilir. Kliklendiginde verilen kart numarasini kontrol eder.

Sub KartKontrolu_Click ( )
'KartGecerli degiskeni True olur eger fonksiyon dogru deger çevirirse
Dim KartGecerli as Boolean
KartGecerli = GecerliKartNumarasimi("4552012301230123")
If KartGecerli then
    Msgbox "Geçerli kart"
else
   Msgbox "Aman dikkat. Bu kart geçersiz!!!"
End if
End Sub

Public Function GecerliKartNumarasimi(ByVal pCardNumber As String) As Boolean

Dim CharPos As Integer
Dim CheckSum As Integer
Dim tChar As String

For CharPos = Len(pCardNumber) To 2 Step -2
    CheckSum = CheckSum + CInt(Mid(pCardNumber, CharPos, 1))
    tChar = CStr((Mid(pCardNumber, CharPos - 1, 1)) * 2)
    CheckSum = CheckSum + CInt(Left(tChar, 1))
    If Len(tChar) > 1 Then CheckSum = CheckSum + CInt(Right(tChar, 1))
Next

If Len(pCardNumber) Mod 2 = 1 Then CheckSum = CheckSum + CInt(Left(pCardNumber, 1))

If CheckSum Mod 10 = 0 Then
IsValidCreditCardNumber = True
Else
IsValidCreditCardNumber = False
End If

End Function


Ayin son günü nasıl bulunur?
Public Function AyinSonGunu(ByVal GecerliTarih As Date) As Byte
Dim SonGun As Byte
SonGun = DatePart("d", DateAdd("d", -1, DateAdd("m", 1, _
DateAdd("d", -DatePart("d", GecerliTarih) + 1, Date))))
AyinSonGunu = SonGun
End Function

Private Sub Command1_Click()
MsgBox Date & " tarihine ait ayin son günü : " & AyinSonGunu(Date)
End Sub

VB6 projeleri VB5'te nasıl açilir?
Notepad yada baska bir editör ile VB 6.vbp dosyasini açin ve bu dosyadaki
'Retained = 0' satirini silip dosyayi kaydedin.
Artik VB6 projelerini VB5'te açabilirsiniz.

MDB veritabanlarinda hataya neden olan Null field degerlerinden nasıl kurtulunur?
Default deger olarak Access string alanlari NULL deger tasir (Çift tirnak yani bos string girilmedikçe)
Null deger tasiyan bir alani recordset araciligiyla bir string içine kopyalamak istediginizde (sanirim birçogunuz bunu görmüstür) runtime type-mismatch hatasi olusur. Bundan kurtulmanin en kolay yolu & karakteri kullanarak her alan basina çift tirnak (yani bos string) eklemektir. Asagidaki örnek gibi:

Dim DB As Database
Dim RS As Recordset
Dim sAd As String
Set DB = OpenDatabase("Test.mdb")
Set RS = DB.OpenRecordset("Ad")
sAd = "" & RS![Adi Soyadi] ' Adi Soyadi alani içine "" ekleniyor, böylece null deger yokediliyor.


Ekran çözünürlügü nasıl bulunur?
Genelde ekran çözünürlügüne göre programlarinizdaki nesneleri resize etmek oldukça kullanisli bir yoldur.

Ekran çözünürlügünü söyle bulursunuz:
Asagidaki kodu form_load'a yazarsanız her açılışta ekran çözünürlüğünü kontrol eder.

Genislik = Screen.Width \ Screen.TwipsPerPixelX
Yukseklik = Screen.Height \ Screen.TwipsPerPixelY

Ekran_Cozunurlugu = Genislik & "x" & Yukseklik

Sonuç asagidaki gibi olur:

800x600

Veritabanina nasıl daha hizli ulasilir?

Bir recordset içinde daha hızlı döngü çalıstırmak için bir yol var. Genelde bir çok programcı aşagidaki kodu kullanır:

Do While Not Records.EOF   'Dosya sonuna kadar döngü baslat
Combo1.AddItem Records![Firma Adi]   'Combo'ya Records recordset'inin [Firma Adi] adli alanini ekle
Records.Movenext 'Bir sonraki kayda git
Loop

Buradaki problem her defasinda veritabaninin bir sonraki kayda gitmek için dosya sonuna ulasip ulasmadigini kontrol etmek zorunda olmasidir. Bu zorunluluk özellikle çok büyük veritabanlarinda büyük performans kayiplarina neden olur. Çözüm ise önce kayit adedini RecordCount ile bulmak ve For ---- Next döngüsü ile kayit okumaktir :

Records.MoveLast ' Recordset'in sonuna giderek kaç adet kayit oldugunu bulmalisiniz. Bu islemin bir kez yapilmasi yeterlidir.
KayitSayisi=Records.RecordCount   'Kayıt sayısı bir long değişken içine alındı
Records.MoveFirst 'Ilk kayda gel

For i =1 To KayitSayisi    'Şimdi kayıtları EOF telaşı olmadan birer birer okuyalim
        Combo1.AddItem Records![Firma Adi]
        Records.MoveNext
Next

İşte size garantili %33'lük performans artışı

Gökkusagi renklerinde text nasıl olusturulur?

1. Standart EXE projesi baslat
2. Asagidaki kodu Form'un Paint proc'una yaz:

Sub Form_Paint()
Dim I As Integer, X As Integer, Y As Integer
Dim C As String
Cls
For I = 0 To 91
X = CurrentX
Y = CurrentY
C = Chr(I)
Line -(X + TextWidth(C), Y = TextHeight(C)), QBColor(Rnd * 16), BF
CurrentX = X
CurrentY = Y
ForeColor = RGB(Rnd * 256, Rnd * 256, Rnd * 256)
Print "Merhaba Basic Programciligi"
Next
End Sub

3. Projeyi çalistirirsaniz formun degisik renklerde yaziyla kaplandigini görürsünüz.
and watch the form fill with lots of multi-coloured text


Text kutusundaki bosluklar nasıl yokedilir?
Kullanicilarin text kutusuna bosluk karakteri girmelerini engellemek için :
Textbox 'un KeyPress olayina asagidaki kodu yaz:

Private Sub Text1_KeyPress(KeyAscii As Integer)
If KeyAscii = 32 Then
    KeyAscii = 0
End If
End Sub


Tek harekette text dosyasi nasıl yüklenir?
FileText fonksiyonunu kullanarak istediginiz dosyayi açar ve textbox içine yerlestirirsiniz.
Fonksiyonu Bas modulu içine yaz

Function FileText (filename$) As String
Dim dosya As Integer
dosya = FreeFile
Open filename$ For Input As #dosya
FileText = Input$(LOF( dosya), dosya)
Close # dosya
End Function

Text1.Text = FileText("c:\autoexec.bat") 'Text1 textbox'una tek hamlede autoexec.bat içerigi yüklenir.


Windows Control Panel (Denetim masasi) uzantilari VB ile nasıl açilir?

Option Explicit
Private strPanelAdi As String
Private Sub Command1_Click()

strPanelAdi = File1.filename
If strPanelAdi = "" Then
MsgBox "Bir .CPL dosyasi seçilmedi." & vbCrLf & _
"Windows Control Panel açiliyor.",vbInformation
End If
Shell "rundll32.exe shell32.dll,Control_RunDLL " & _
strPanelAdi, vbNormalFocus
End Sub

Private Sub Form_Load()
With File1
'Sadece Control Panel uzantili dosyalari göster
.Pattern = "*.CPL"
'FileListBox yalnizca System yada System32 dizinini hedef alsin:
.Filename = "C:\Windows\System"
End With
End Sub

Bellegi bosaltmak için tüm formlar nasıl unload edilir?

Public Sub UnloadAllForms()
Dim Form As Form
For Each Form In Forms
   Unload Form
   Set Form = Nothing
Next Form
End Sub

Bu prosedürü çalistirmak için en uygun yer ana formun unload event'idir


Kontroller nasıl taşınabilir? (Drag&Drop)

Burada bir picturebox form üzerinde drag&drop ile tasinmaktadir.

Option Explicit
Public globalX As Integer
Public globalY As Integer

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Picture1.Move X - globalX, Y - globalY
End Sub

Private Sub Picture1_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
Picture1.Drag vbBeginDrag
globalX = X
globalY = Y
End Sub

Kendi Popup menünüz bir textbox içinde nasıl gösterilir?

Bu ipucu ile standart Windows pop up menüsünü bastirir kendi popup menünüzü çalistirirsinz.

Private Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 2 Then
With Text1
.Enabled = False
PopupMenu {KendiMenunuz}
.Enabled = True
.SetFocus
End With
End If
End Sub

Mesaj kutusunun ileri özellikleri nasıl kullanilir?

Dim Msg, Style, Title, Help, Ctxt, Cevap, MyString
Msg = "Devam edelim mi ?" ' Mesaji tanimla
Style = vbYesNo + vbCritical + vbDefaultButton2 'Butonlari tanimla
Title = "MsgBox Gösterimi" ' Title tanimla
Help = "DEMO.HLP" 'Bir help dosyasi bagla
Ctxt = 1000 ' Baslik tanimla

Cevap = MsgBox(Msg, Style, Title, Help, Ctxt) 'Masaji göster ve kullanici cevabini bekle
If Cevap = vbYes Then ' Kullanici evet'i seçti
      MsgBox "Kabul ettiniz" ' Karsilik ver
Else ' Tersi durumda kullanici hayir'i seçmis demektir
      MsgBox "Kabul etmediniz" ' Karsilik ver
End If


Menülerde seperatör (ayraç) nasıl yapılır?

mnu.Caption="-"


Bir textboxta tüm harfler nasıl küçükharfe çevirilir?

Eskiposizyon = Text1.SelStart
Text1.Text = LCase(Text1.Text) 'Üst karakter için UCase kullanilir
Text1.SelStart = Eskiposizyon


Listbox'taki tüm elemanlar nasıl seçilir?

'Asagidaki kodu cmdYeniEkle_Click() yordamina yaz

List1.AddItem Text1.Text ' Yeni bir item ekle

'Asagidaki kodu cmdTumunuSec_Click() yordamina yaz

For x = 0 To List1.ListCount - 1
List1.Selected(x) = True ' item(x) seç
Next x

Listview'deki satirlarin kaç tane oldugu nasıl sayilir?

lItemCount = lstCount.ListItems.Count

Msgbox lItemCount



Picturebox'a çalisma aninda nasıl resim eklenir?

Picture1.Picture = LoadPicture("c:\xxxxxx.bmp")


Picturebox'tan çalisma aninda nasıl resim silinir?

Picture1.Picture = LoadPicture("")


Form konfetti ile nasıl doldurulur?


DrawWidth = 5 ' noktaciklarin genisligi
Dim x As Long
Dim y As Long
Dim r As Integer
Dim g As Integer
Dim b As Integer

Randomize
Do
x = Val(Screen.Width) * Rnd
y = Val(Screen.Height) * Rnd
bir sonraki noktacigin rengi rastgele seçilir
r = 255 * Rnd
g = 255 * Rnd
b = 255 * Rnd
Form1.PSet (x, y), RGB(r, g, b)
Loop

Form üzerindeki Picturebox nasıl ortalanir?

Picture1.Left = (Form1.Width - Picture1.Width) / 2

Clipboard kullanarak bir Picturebox içerigi resim diger bir picturebox'a nasıl kopyalanir?

Command1_Click()
Clipboard.Clear 'Clipboard'i mutlaka sil
Clipboard.SetData Picture1.Picture

Command2_Click()
Picture2.Picture = Clipboard.GetData ' Clipboard içerigini Picture2 içine yapistir.

Bir string'in uzunlugu nasıl tespit edilir?

Dim i As Long
i = Len(sSizinStringiniz)

Mouse pointer nasıl saklanir?
Bu is için ShowCursor API'si kullanilir. Asagidaki kodu bir module içine yaz:

Declare Function ShowCursor Lib "user32" (ByVal bShow
As Long) As Long

Bu kod mouse imlecini saklar:
FareImleci = ShowCursor(False)

Bu kod mouse imlecini görünür hale getirir:
FareImleci = ShowCursor(True)

Programiniz disinda keypress nasıl saptanir?

GetAsyncKeyState API'si kullanilir. Asagidaki kodu module içine yazin

Declare Function GetAsyncKeyState Lib "user32"
(ByVal vKey As Long) As Integer


' Asagidaki constant TAB tusu için. Diger tuslar için
' API Text Viewer'i kullanin

Public Const VK_TAB = &H9

'Timer1_Timer() içine asagidaki kodu ekleyin

If GetAsyncKeyState(VK_TAB) Then
Beep ' TAB'a basilirsa beep
End If

Yazdirma islemi nasıl iptal edilir?
'Bu örnekte ayrica birden fazla sayfanin nasıl yazilacagi da gösteriliyor

Printer.Print "Page 1"
Printer.Newpage
Printer.Print "Page 2"
Printer.KillDoc


Resim nasıl yazdırılır?

Printer.PaintPicture Picture1.Picture
Printer.EndDoc


Windows'un Belgeler içerigi nasıl silinir?

Bir module asagidaki API deklerasyonunu ekle:

Declare Sub SHAddToRecentDocs Lib "shell32.dll" (ByVal uFlags As Long,
ByVal pv As String)

Herhangi bir click içine de asagidaki kodu ekle:

SHAddToRecentDocs(2,vbNullString)


Windows'un Belgeler içine nasıl ekleme yapılır?

Bir module asagidaki API deklerasyonunu ekle:

Declare Sub SHAddToRecentDocs Lib "shell32.dll" (ByVal uFlags As Long,
ByVal pv As String)

Herhangi bir click içine de asagidaki kodu ekle:

Dim ekleme as String
ekleme="c:\falan dizin\filan dosya.txt"

SHAddToRecentDocs(2,ekleme)


Alan adina göre bir Recordset içindeki kayitlar nasıl siraya konur?

'Bu kod tüm kayitlari Z-A (geriye dogru) siraya dizer

' A-Z (ileri dogru) sirasi isterseniz ,DESC yerine ASC kullanin.

Dim DB as Database
Dim Kayitlar as Recordset

Set Kayitlar = DB.OpenRecordset("SELECT * FROM _
Personel " & "ORDER BY Personel.Adi DESC;")

Personel tablosundan tüm kayitlari Adi (personel adi) field degerine göre azalan (Z-A ) sekilde siraya dizer


Listbox'u Access (mdb) veritabanina nasıl baglarsiniz?

On Error GoTo Hata_Kontrol

Dim DB as Database
Dim Kayitlar as Recordset
Dim X as Long, record_count as Long

'Veritabanini açalim

Set DB = OpenDatabase("Ogrenci.mdb", dbOpenSnapshot)
Set Kayitlar = DB.OpenRecordset("Ogrenciler")

' Dikkat ederseniz asagida yapilan islem önce veritabaninin sonuna gitmek, RecordCount degerini
' ögrenmek ve sonra tekrar veritabani basina dönmektir. Veritabani sonuna gitmeden kaç adet kayit
' oldugunu ögrenemezsiniz.

Kayitlar.MoveLast
X = Kayitlar.RecordCount
Kayitlar.MoveFirst

' Listbox içine adlari yerlestirelim
' Ilk kayita geldikten sonra artik sirayla ögrenci adlarini listbox içine alabiliriz

Do
List1.AddItem Kayitlar!OgrenciAdi
Y = Y + 1
Kayitlar.MoveNext
Loop Until Y = X ' X = Recordcount, yani son kayit

Hata_Kontrol:
Select Case (Err)
Case 3021 ' Kayit yok
record_count = 0 'Kayit yoksa degeri 0 a esitleyelim.
Exit Sub
List1.Refresh
End Select


Iki integer degisken nasıl swap (degistokus) edilir?

Asagidaki algoritma kullanilarak iki integer'in degerleri birbirine aktarilir

a = a Xor b

b = a Xor b

a = a Xor b




Bir form nasıl asagi ve yukari katlanir? (açilista splash screen olarak kullanmak üzere..)

Sub FormuYukariKatla(frm As Form, yukari As Integer)

' Formunuzun Scalemode property'sine dikkat edin. Eger degeri pixel ise
' ve siz twip deger kullanirsaniz form sonsuz bir döngü içinde katllanir.
' formunuzun ne kadar katlanmasini istiyorsaniz yukari degerini o kadar yükseltin
' Açilista splash screen olarak kullanilir...

Dim NereyeKadar

NereyeKadar = frm.Height - yukari
If NereyeKadar <= 0 Then Exit Sub
If yukari < 0 Then Exit Sub

Do
frm.Height = frm.Height - 1
DoEvents
Loop Until frm.Height <= NereyeKadar
End Sub

Sub FormuAsagiKatla(frm As Form, asagi As Integer)

'Yine scalemode'a dikkatedin!
' Formun ne kadar asagi katlanmasini istiyorsaniz "asagi " degerini o kadar büyütün

Dim NereyeKadar

NereyeKadar = frm.Height + yukari
If yukari < 0 Then Exit Sub

Do
frm.Height = frm.Height + 1
DoEvents
Loop Until frm.Height >= NereyeKadar
End Sub

'Asagidaki sub yordamimiz çagirir
Private Sub Command1_Click()
Call FormuAsagiKatla(Form1, 100)
End Sub


isEven fonksiyonu nasıl kullanilir?

'Bu fonksiyon tek sayilarda TRUE döndürür

Function isEven(n As Integer) As Boolean
isEven = True
If n And 1 Then isEven = False
End Function


Dosya boyutu nasıl ögrenilir?

Aslinda dosya boyutu ögrenmek kolaydir. Buradaki ipucu kullanicinyn seçtigi dosyalarin boyutunu çalisma aninda buluyor.

Bir form üzerine bir dirlistbox (lstDizin) ve bir filelistbox (lstDosya) ve
bir Label (lblDosyaBoyutu) yerlestirin.
Kullanici istedigi dizine gidebilir ve dosya seçebilir. Bu program kullanicinin seçtigi dosyalarin boyutunu gösterecek:

Private Sub cmdDosyaBoyutunuGoster_Click()

Dim strDosyaTemp As String
Dim strBoyutTemp As String
Dim strDizin As String
Dim strDosya As String

' Kullanicinin seçtigi dizin ve dosya kutulari araciligiyla degiskenlerimize deger yüklüyoruz:
strDizin = lstDizin.Path
strDosya = lstDosya.File

' Yukaridan alinan degerlerle ulasilan path degerini geçici dosya degiskenine yükleyip
' o degiskenin dosya boyutunu hesaplatiyoruz.:
strDosyaTemp = strDizin & "\" & strDosya
strBoyutTemp = FileLen(strDosyaTemp)

lblDosyaBoyutu.Caption = strDosyaTemp & " adli dosya " & _
Format(strBoyutTemp, "#,##0") & " byte boyutundadir."

End Sub


Title bar nasıl yanıp söner?

Yeni bir EXE projesi aç ve bir modul içine asagidaki WinApi'yi yaz:

Public Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, _
ByVal bInvert As Long) As Long

Bir Form üzerine bir timer ve 2 commandbutton yerlestir (özellikleri sagida) :

command1.caption="Baslat"
command2.caption="Durdur"
timer1.interval=500 'yarim saniyede bir yanpi sönecek
timer1.enabled=false

Private Sub Timer1_Timer()
a& = FlashWindow(Me.hwnd, 1)
End Sub

Private Sub Command1_Click() 'Programi çalistirir ve form caption'u yanip söner
Timer1.Enabled = True
End Sub

Private Sub Command2_Click() 'Yanip sönme isini kapatir
Timer1.Enabled = False
End Sub


Ctrl-Alt-Delete ve Ctrl-Esc tus kombinasyonlarinin çalismasi nasıl iptal edilir?


Asagidaki kodu projenizin declarations kismina yazin:

Private Declare Function SystemParametersInfo Lib _
"user32" Alias "SystemParametersInfoA" (ByVal uAction _
As Long, ByVal uParam As Long, ByVal lpvParam As Any, _
ByVal fuWinIni As Long) As Long


Sub CtrlAltDeleteKapat(Kapali As Boolean)
Dim X As Long
X = SystemParametersInfo(97, Kapali, CStr(1), 0)
End Sub


Ctrl-Alt-Delete kombinasyonunu kapatmak için:

Call CtrlAltDeleteKapat(True)


Ctrl-Alt-Delete kombinasyonunu açmak için:

Call CtrlAltDeleteKapat(False)


Sistemin bir ses kartina sahip olup olmadigi nasıl bulunur?

Asagidaki kodu projenizin declarations kismina yazin:

Declare Function waveOutGetNumDevs Lib "winmm.dll" _
Alias "waveOutGetNumDevs" () As Long

Dim i As Integer

i = waveOutGetNumDevs()
If i > 0 Then
MsgBox "Sisteminiz ses dosyalarini çalabilir.", _
vbInformation, "Sound Card Test"
Else
MsgBox "Sisteminiz ses dosyalarini çalamaz.", _
vbInformation, "Sound Card Test"
End If

Hangi kullanicinin login yaptigi nasıl anlasilir?

Dim s As String
Dim cnt As Long
Dim dl As Long
Dim AktifKullanici as String

cnt = 199
s = String$(200, 0)
dl = GetUserName(s, cnt)

If dl <> 0 Then AktifKullanici = Left$(s, cnt) Else AktifKullanici = ""


Asagidaki API fonksiyonunu ya formun decleration kismina yada bir modul içine yazacaksinz:

Declare Function GetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) _
As Long


Bos disk alanı nasıl saptanır?

GetDiskFreeSpace API fonksiyonunu kullanmalisiniz. Bu fonksiyonun declarasyonu söyledir:

Declare Function GetDiskFreeSpace Lib "kernel32" Alias _
"GetDiskFreeSpaceA" (ByVal lpRootPathName As String, _
lpSectorsPerCluster As Long, lpBytesPerSector As Long, _
lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters _
As Long) As Long

Dim SectorsPerCluster&
Dim BytesPerSector&
Dim NumberOfFreeClusters&
Dim TotalNumberOfClusters&
Dim BosAlan&

temp& = GetDiskFreeSpace("c:\", SectorsPerCluster, _
BytesPerSector, NumberOfFreeClusters, TotalNumberOfClusters)

' BosAlan degiskeni toplam bos byte degerini tutar:

BosAlan = NumberOfFreeClusters * SectorsPerCluster * _
BytesPerSector

Bir form altina nasıl gölge eklenir ve form yukarida hissi verilir?

Formlarin altinda bulunan gölgeleri merak etmissinizdir. Formu sanki birkaç santimetre havada duruyormus hissi veren bu isleme "Dithering" denir:

Asagidaki kodu bir forma ekleyin.

Sub Dither(vForm As Form)

Dim intLoop As Integer

vForm.DrawStyle = vbInsideSolid
vForm.DrawMode = vbCopyPen
vForm.ScaleMode = vbPixels
vForm.DrawWidth = 2
vForm.ScaleHeight = 256

For intLoop = 0 To 255

vForm.Line (0, intLoop)-(Screen.Width, intLoop - 1), _
RGB(0, 0,255 -intLoop), B

Next intLoop

End Sub

Kodu çalistirmak için formun Activate olayina ise asagidaki kodu ekleyin:

Form_Activate ()
Dither Me

Kontroller nasıl gölgelendirilir?


Yeni bir proje baslatip form üzerine bir textbox yerlestirin

Asagidakini bir module yerlestirin:

Global Const GFM_BACKSHADOW = 1
Global Const GFM_DROPSHADOW = 2

Public Sub ControlShadow(f As Form, C As Control, shadow_effect _
As Integer, shadow_width As Integer, shadow_color As Long)

Dim shColor As Long
Dim shWidth As Integer
Dim oldWidth As Integer
Dim oldScale As Integer
shWidth = shadow_width
shColor = shadow_color
oldWidth = f.DrawWidth
oldScale = f.ScaleMode

f.ScaleMode = 3
f.DrawWidth = 1

Select Case shadow_effect

Case GFM_DROPSHADOW
f.Line (C.Left + shWidth, C.Top + shWidth)-Step(C.Width - 1, _
C.Height - 1), shColor, BF

Case GFM_BACKSHADOW
f.Line (C.Left - shWidth, C.Top - shWidth)-Step(C.Width - 1, _
C.Height - 1), shColor, BF

End Select

f.DrawWidth = oldWidth
f.ScaleMode = oldScale

End Sub

Form'un Load procedurüne asagidaki kodu ekleyin:

Private Sub Form_Load()

Dim r
r = ControlShadow(me,text1,1,2,black)

End Sub

Title bar'ın rengi nasıl değiştirilir?

Windows'un tüm desktop renklerini SetSysColors API fonksiyonu ile degistirebilirsiniz.
Bu fonksiyon 3 parametre alir :
1. Rengi degisecek elemanlarin sayisi
2. Color nesnesi degismezleri (const)
3. RGB degeri

API:

Declare Function SetSysColors Lib "user32" Alias _
"SetSysColors" (ByVal nChanges As Long, lpSysColor As _
Long, lpColorValues As Long) As Long



Degismezler:

Public Const COLOR_SCROLLBAR = 0 'Scrollbar rengi
Public Const COLOR_BACKGROUND = 1 'Duvarkagidi yokken masaüstü arkaplan rengi
Public Const COLOR_ACTIVECAPTION = 2 'Aktif pencere adi rengi
Public Const COLOR_INACTIVECAPTION = 3 'Aktif olmayan pencere adinin rengi
Public Const COLOR_MENU = 4 'Menu
Public Const COLOR_WINDOW = 5 'Windows arkaplan
Public Const COLOR_WINDOWFRAME = 6 'Pencere çerçevesi
Public Const COLOR_MENUTEXT = 7 'Pencere Texti
Public Const COLOR_WINDOWTEXT = 8 '3D koyu gölge (Win95)
Public Const COLOR_CAPTIONTEXT = 9 'Pencere caption text rengi
Public Const COLOR_ACTIVEBORDER = 10 'Aktif pencere sinirlari rengi
Public Const COLOR_INACTIVEBORDER = 11 'Inaktif pencere sinirlari rengi
Public Const COLOR_APPWORKSPACE = 12 'MDI desktop arkaplan rengi
Public Const COLOR_HIGHLIGHT = 13 ' seçili alan arkaplan rengi
Public Const COLOR_HIGHLIGHTTEXT = 14 'Seçili menü rengi
Public Const COLOR_BTNFACE = 15 'Button
Public Const COLOR_BTNSHADOW = 16 '3D buton gölgeleme
Public Const COLOR_GRAYTEXT = 17 'Gri text
Public Const COLOR_BTNTEXT = 18 'Button text
Public Const COLOR_INACTIVECAPTIONTEXT = 19 'Inactive pencere rengi
Public Const COLOR_BTNHIGHLIGHT = 20 'Butonun 3D isaretlenmesi rengi


Aktif pencere title bar rengini degistirmek için :

t& = SetSysColors(1, COLOR_ACTIVECAPTION, RGB(255,0,0))

Bu örnek kirmiziya çevirir.

 


VB de sayı, yazı ile nasıl yazılır(127 yi yüzyirmiyedi gibi)

yeni proje açın, 1 textbox, 2 tane de label yerleştirin, declaration'a aşağıdaki kodları ekleyin.

KOD:

Function YAZIYLA$(sayi)
Dim b$(9), y$(9), m$(4), v(15), c(3)
 
 
b$(0) = "":b$(1) = "Bir":b$(2) = "İki"
b$(3) = "Üç":b$(4) = "Dört":b$(5) = "Beş"
b$(6) = "Altı":b$(7) = "Yedi"
b$(8) = "Sekiz":b$(9) = "Dokuz"
 
 
y$(0) = "":y$(1) = "On":y$(2) = "Yirmi"
y$(3) = "Otuz":y$(4) = "Kırk"
y$(5) = "Elli":y$(6) = "Altmış"
y$(7) = "Yetmiş":y$(8) = "Seksen"
y$(9) = "Doksan"
 
 
m$(0) = "Trilyon ":m$(1) = "Milyar "
m$(2) = "Milyon ":m$(3) = "Bin "
m$(4) = ""
 
 
a$ = Str(sayi)
If Left$(a$, 1) = " " Then pozitif = 1 Else pozitif = 0
a$ = Right$(a$, Len(a$) - 1)
For x = 1 To Len(a$)
If (Asc(Mid$(a$, x, 1)) > Asc("9")) Or _
  (Asc(Mid$(a$, x, 1)) < Asc("0")) Then GoTo hata
Next x
If Len(a$) > 15 Then GoTo hata
a$ = String(15 - Len(a$), "0") + a$
For x = 1 To 15
v(x) = Val(Mid$(a$, x, 1))
Next x
s$ = ""
For x = 0 To 4
c(1) = v((x * 3) + 1)
c(2) = v((x * 3) + 2)
c(3) = v((x * 3) + 3)
If c(1) = 0 Then
e$ = ""
ElseIf c(1) = 1 Then
e$ = "Yüz"
Else
e$ = b$(c(1)) + "Yüz"
End If
e$ = e$ + y$(c(2)) + b$(c(3))
If e$ <> "" Then e$ = e$ + m$(x)
If (x = 3) And (e$ = "BirBin ") Then e$ = "Bin"
s$ = s$ + e$
Next x
If s$ = "" Then s$ = "Sıfır"
If pozitif = 0 Then s$ = "Eksi" + s$
YAZIYLA$ = s$
GoTo tamam
hata:
YAZIYLA$ = "Hata"
tamam:
End Function
 
 
Private Sub Text1_Change()
sayi = Val(Text1.Text)
Label1.Caption = YAZIYLA(sayi)
Label2.Caption = Format$(sayi, "#,#")
End Sub

 

 

 

 

 

 

 

 

 

 

 

 

Animasyonlu gifleri göstermek(vb5+)

Animasyonlu bir gif'i picturebox kullanarak göstermeye çalışırsak. Animasyonun ilk karesini gösterir ve kalır. Yani animasyon olmaz. Eğer Webbrowser kontrolünü kullanırsak anim gifleri gösterebiliriz. Bilgisayarınızda IE 3 yada üstü yüklü olması gereklidir. Yeni proje açın Ctrl-T ye basın Kontroller listesinden "Microsoft Internet Control" ü işaretleyin. Form_Load olayına aşağıdaki kodu yazın ve çalıştırın. c:\vb5\anim.gif i kendinize göre değiştirin.

WebBrowser1.Navigate "c:\vb5\anim.gif"

Bu şekilde yaptığımızda varsayılan olarak kutunun sağında bir kaydırma çubuğu çıkacak. Yukardaki kodu aşağıdaki ile değiştirirsek bu çubuk kaybolacaktır.

WebBrowser1.Navigate _ 
 "about:<html><body scroll='no'><img src='c:\vb5\anim.gif'></img></body></html>"
Birbaşka if : IIf Fonksiyonu(vb3+)

Yeni farkketiğim bir fonksiyonu sizlere aktarmak istedim. VB3 de bile bu fonksiyonun olması ve farketmemiş olmam beni şaşırttı. Bu fonksiyon Excel deki EĞER fonksiyonuna çok benziyor.
IF THEN ELSE nin yaptığını yapıyor ama daha az kod kullanarak

IIF (şart , Doğruysa , Yanlışsa)
'IF THEN ELSE ENDIF ile
'-------------
sayi = 5
if sayi>0 then
 a$="Pozitif"
else
 a$="Negatif"
end if
'IIF ile
'-------
sayi = 5
a$ = IIf(sayi > 0, "Pozitif", "Negatif")   
Metin kutusunda tarih kontrolü
Sub Tarihmi(kontrol As TextBox)
With kontrol
    If Not IsDate(.Text) And .Text <> "" Then
        MsgBox "Hatalı tarih değeri girildi", 48, "Hata"
            .Text = Date
            .SetFocus
        End If
End With
 
 
End Sub
 
 
Private Sub Text1_LostFocus()
Tarihmi Text1
End Sub
Metin kutusunda default popup menünün önlenmesi

Form'a bir metin kutusu ve adı popup1 olan bir menü ekleyin

Private Sub Text1_MouseDown(Button As Integer, _ 
Shift As Integer, X As Single, Y As Single)
 
 
If Button = vbRightButton Then
Text1.Enabled = False
PopupMenu Popup1
Text1.Enabled = True
End If
End Sub
Metin kutularında enter tuşu

Formunuzda birkaç tane metin kutusu varsa diğer metin kutularına atlamak için tab tuşuna basılır. Ama enter tuşunu da kullanabilirsiniz. Bunu için aşağıdaki kodu ekleyin.

Private Sub Form_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then 'vbKeyReturn=13
    SendKeys "{TAB}"
    KeyAscii = 0
  End If
End Sub
Form her zaman üstte(vb5)

Çalışan programınızda yeni bir form açıldığında bunun en üstte görünmesi için; örn 2 form oluşturun form1_load 'a

form2.Show ,me

yazın.

Bu yöntem yalnızca programınızdaki formlar için geçerlidir. Diğer bir program çalıştığında bunun üzerini örtebilir.
Tüm uygulamaların üzerinde kalan bir form oluşturmak için; declare kısmına

Private Declare Function SetWindowPos Lib "user32"
 (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal x As Long,
 ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, 
ByVal wFlags As Long) As Long
 
 
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2

En üstte kalmasını istediğinizde:

SetWindowPos hwnd, _
HWND_TOPMOST, 0, 0, 0, 0, _
SWP_NOMOVE + SWP_NOSIZE

Bu özelliği geri almak için:

SetWindowPos hwnd, _
HWND_NOTOPMOST, 0, 0, 0, 0, _
SWP_NOMOVE + SWP_NOSIZE
Projenizin sürüm(version) numarası (VB 5.0)

Projeniz bittikyen sonra kullanmak için exe haline dönüştürürsünüz. Her exe'ye dönüştürme sırasında sürüm numarasının artmasını isterseniz şunları yapın.

File / Make project.exe
çıkan diyalog da OPTIONS ' tıklayın. Burada MAKE tabı seçili olsun. Burada Version ile ilgili 3 sayı var
Major :Projenizde büyük değişiklikler yaptıysanız bir büyük rakam yazın. Başlangıcı 1.
Minor :Küçük değişiklikler, yenilikler varsa. Başlangıcı 0
Revision: Projenizdeki her değişiklikde değiştirmek için.
Alt kısımdaki AUTO INCREMENT i seçili yaparsanız. Her exe yapmada bu sayı bir artar. Yani sürüm no başlangıçta 1.0.0 iken ikinci exe yapışta 1.0.1 olur.
Bu sayıları vb içinden almak için APP nesnesinden faydalanılır. Aşağıdaki kodu Form_Load'a ekleyebilirsiniz.

Me.Caption = App.title & " Version " & App.Major & "."_
 & App.Minor & "." & App.Revision
Text kutusuna yalnız rakam girmek
Sub Text1_KeyPress (KeyAscii As Integer)
  Dim N$
  N = "0123456789."
  If KeyAscii <> 8 Then
    If InStr(N, Chr(KeyAscii)) = 0 Then
      Beep
      KeyAscii = 0
      Exit Sub
  End If
End If
End Sub

Dikkat: Yapıştırma yapıldığında harf girilebilir.

Text kutusuna yeni satır eklemek

Text kutusunu diğer satırlarını görebilmek için yüksekliğini arttırın. Multiline özelliğini TRUE yapın yoksa Entere bastığınızda veya aşağıdaki kodu eklediğinizde çalışmaz.

Text1.Text = Text1.Text & Chr(13) & Chr(10) & "Ek Satır"
Aktif Text Kutusunu seçili yapmak

Text kutusuna geldiğinizde (GOTFOCUS) kutu içindeki karakterlerin seçili olmasıiçin o text kutusunun GotFocus olayına
SeciliTxBox
yazın

Sub SeciliTxBox ()
Screen.ActiveControl.SelStart = 0
Screen.ActiveControl.SelLength = Len(Screen.ActiveControl.Text)
End Sub
Formdaki tüm Text kutularının içeriğinin temizlenmesi (vb5)

Forma yerleştirdiğiniz textboxların içeriğinitemizlemek için aşağıdaki kodları kullanın.

Dim Control
For Each Control In Form1.Controls
  If TypeOf Control Is TextBox Then Control.Text = "
Next
Clipboard (pano) kullanımı
Sub Kes(x As Form, CntTxt As Control)
If x.CntTxt.SelText > "" Then
Clipboard.SetText x.CntTxt.SelText
x.CntTxt.SelText = ""
End If
End Sub
'-----------
Sub kopyala(x As Form, CntTxt As Control)
If x.CntTxt.SelText > "" Then
Clipboard.SetText x.CntTxt.SelText
End If
End Sub
'------------
Sub yapıştır(x As Form, CntTxt As Control)
clp$ = Clipboard.GetText()
If clp$ > "" And Clipboard.GetFormat(1) Then
x.CntTxt.SelText = clp$
End If
End Sub
Form'u en üstte tutmak (vb3)
Sub AlwaysOnTop (frmIn As Form, flgOnTop%)
 
 
If flgOnTop Then
SetWindowPos frmIn.hWnd, -1, 0, 0, 0, 0, &H1 Or &H2
Else
SetWindowPos frmIn.hWnd, -2, 0, 0, 0, 0, &H1 Or &H2
End If
 
 
End Sub
.wav dosya' nın çalınması (vb3)
Declare Function sndPlaySound Lib "MMSYSTEM.DLL"_
 (ByVal ses$, ByVal ozellik%) As Integer
 
 
x% = SndPlaySound("dosyaadi.wav", &H0 Or &H2)
Windowsdan çıkmak (vb3)
'API tanımlama
Declare Function ExitWindows% Lib "User"_
 (ByVal dwReserved&, ByVal wReturnCode%)
'Fonksiyonun kullanımı
R% = ExitWindows(66, 66) 'windowsdan çıkar
Visual basic' in açılışının hızlandırılması.

Vb ilk kurulduğunda tüm Custom Control' leri yüklemek için bir versiyona göre .mak veya .vbp dosya oluşturur. Bu dosya Autoload ile başlar ve vb'nin kurulduğu klasördedir. Bu dosyayı siler veya adını değiştiriseniz vb yine açılır yalnızca standart kontrolleri yükler. Böylece açılış daha hızlı olur. Eklemek istediğiniz kontrol olursa 3.0 da Ctrl-D, 4.0 'da Ctrl-T 'ye basın.

Başlığı olmayan formun taşınması

form'un Borderstyle özelliğini 0 'layın, form'a picture ekleyin, bir de modül oluşturun

'Modül'e
 
 
Type POINTAPI
X As Integer
Y As Integer
End Type
 
 
Type ConvertPOINTAPI
xy As Long
End Type
 
 
Declare Function SendMessage Lib "User"_
 (ByVal hWnd As Integer, ByVal wMsg As Integer,_
 ByVal wParam As Integer, ByVal lParam As Any) As Long
Declare Sub GetCursorPos Lib "User" (lpPoint As POINTAPI)
Global Const WM_LBUTTONUP = &H202
Global Const WM_SYSCOMMAND = &H112
Global Const MOUSE_MOVE = &HF012
'form'a
Sub Picture1_MouseDown (Button As Integer,_
 Shift As Integer, X As Single, Y As Single)
Dim mpos As POINTAPI
Dim p As ConvertPOINTAPI
Dim ret As Integer
 
 
Call GetCursorPos(mpos)
LSet p = mpos
 
 
ret = SendMessage(picture1.hWnd, WM_LBUTTONUP, 0, p.xy)
ret = SendMessage(Me.hWnd, WM_SYSCOMMAND, MOUSE_MOVE, p.xy)
End Sub
Formu ortala
Sub f_ortala (frm As Form)
frm.Move screen.Width / 2 - frm.Width_
 / 2, screen.Height / 2 - frm.Height / 2
End Sub
Hakkında penceresi. Bu küçük püf hoşunuza gidecektir. (vb3)
Declare Sub ShellAbout Lib "shell.dll"_
 (ByVal hWndOwner%, ByVal lpszAppName$,_
 ByVal lpszMoreInfo$, ByVal hIcon%)
 
 
Sub Form_Click ()
ShellAbout hwnd, App.EXEName, App.Title, icon
End Sub
 
 
Buradaki Microsoft ve Copyright yazısı hoşunuza gitmeyebilir.
Spin(fırıldak) vbx veya ocx yüklenmeden spin kullanımı

spin vbx kullanılmadan da spin kullanılabilir. Ben önceleri fazla yer işgal etmesin diye spin'i kullanmıyordum. Ama sonradan farkettiğim(örn.word)bir teknik var. Artık vbx'siz spin kullanıyorum. Hscroll ve Vscroll aletleri vb ile standart olarak yükleniyor. Bunları aradaki kaydırma düğmesi kayboluncaya kadar küçültün ve bir text kutusunun yanına koyun. Hscroll1'i çift tıklayıp Change olayına(event) şu kodları yazın

Sub HScroll1_Change ()
text1.Text = Hscroll1.Value
End Sub

Hscroll1'in
1. Min ve Max özelliklerini de değiştiriseniz istediğiniz değerler arasında değişim olur. Yalnız dikkat Max 2 byte uzunluğundadır. Yani sonsuz değildir.
2. SmalChange özelliğini 1 den farklı verirseniz verdiğiniz sayıda artış veya azalış olur.
Eğer Vscroll yerleştirirseniz artırma ve azaltma ters olur. Buna çare de; örnek 1-100 arası sayı için: Vscroll un min değerine -100 , max değerine -1 yazın. Change olayına da aşağıdakini yazın

text1.Text = Abs(Vscroll1.Value)
Tabindex'in sıraya sokulması

Program çalışırken formdaki aletlere tab tuşuyla ulaşabiliriz. Fakat bazen istediğimiz sırada olmaz. İstediğimiz sırayı oluşturmak için belirlediğimiz sırada aletlerin tabindex değerini değiştirmemiz gerekir. Fakat bu karmaşık bir yöntemdir.
İşin kolayı : Tab tuşunun son duracağı aleti tıklayın F4' e basıp Tabindex değerini 0 yapın, sıralamadaki sondan bir önceki aleti tıklayıp 0 tuşuna basın, bir önceki aleti tıklayıp 0 tuşuna basın ... son alete kadar. Aletlerin tabindex sıralaması istediğiniz gibi olacaktır.

Ansi(win) karakterlerin Ascii(dos) 'ye çevrilmesi (vb3)

Windows'ta hazırladığınız Türkçe karakterler içeren metin'e dos' a geçip baktığınızda Türkçe karakterlerin yerinde başka anlamsız karakterler görürsünüz. Dos'tan yazdırmak isterseniz'de yine hatalı yazım oluşur. Çözümü :
Projedeki (yoksa ekleyin) .bas dosyaya şunları ekleyin

Declare Sub AnsiToOemBuff Lib_
 "Keyboard" (ByVal lpAnsiStr As String,_
 ByVal lpOemStr As String, ByVal nLength As Integer) ' tek satır
'-----
Function OEMe (ByVal metin$) As String
Dim gMetin As String, L%
gMetin = metin$ + " "
L% = Len(metin$)
AnsiToOemBuff metin$, gMetin$, L%
OEMe = gMetin$
End Function
'------
Artık istediğiniz form'dan 
x$=OEMe(text1.text) veya x$=OEMe("ÜüĞĞ")
gibi komutlar verebilirsiniz
Tersi için
.bas dosyaya :
Declare Function OemToAnsi Lib_
 "Keyboard" (ByVal lpOemStr As String,_
 ByVal lpAnsiStr As String) As Integer 'tek satır
'-----
Function ANSIye (ByVal metin$) As String
Dim gM$, x%
gM$ = metin$ + " "
x% = OemToAnsi(metin$, gM$)
ANSIye = gM$
End Function
' ekleyin
Fonksiyonun kullanımı :
x$=ANSIye(text1.text)

 

 

 

 

 

 

Programım Birden Fazla Çalışmasın

AYNI anda bir çok dosya açma yeteneğine sahip, MDI formlardan oluşan bir uygulamanın birden fazla kopyasının yüklenmesi mantıksız bir durum olurdu. Düşünsenize, program ile ilişkilendirilmiş bir dosyaya tıklandığında dosya ayrı bir MDI form içinde açılacağına o uygulamanın ayrı bir kopyası yükleniyor... Eğer siz de uygulamanızın sadece bir kopyasının yüklenmesini istiyorsanız aşağıdaki kodları kullanabilirsiniz.

Private Sub Form_Load()
If App.PrevInstance Then
Kaydet$ = App.Title
App.Title = ' ... İkinci Kopya.' 
Form1.Caption = ' ... İkinci Kopya.' 
AppActivate Kaydet$
SendKeys ' % R' , True
End
End If
End Sub
Vbasic öğrenmek isteyenler için bedava: Vbasic 5 cce

http://msdn.microsoft.com/vbasic/downloads/cce adresinden bedava olarak Visual Basic 5 Control Creation Edition (CCE) sürümnü indirebilirsiniz. Bu sürüm exe dosya oluşturamaz ama yazdığınız kodları çalıştırır, kaydeder, ocx dosyalar oluşturabilir.

Renk kodlarından ana renk tonlarını al

Bir rengin Ana renk(Kırmızı, Mavi, Yeşil) tonlarının değerlerini almak için aşağıdaki kodlardan faydalanılabilir.

Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
 
 
Private Sub RenkleriAl(ByVal color&, ByRef r&, ByRef g&, ByRef b&)
If color = &HFFFFFFFF Then Exit Sub
If color And &H80000000 Then color = GetSysColor(color And &HFFFFFF)
r = color And &HFF& 'Kırmızı renk
g = (color And &HFF00&) \ &H100& 'Yeşil
b = (color And &HFF0000) \ &H10000 'Mavi
End Sub

Kodları denemek için 4 etiketli(label) bir form oluşturun üstteki kodlarla beraber alttaki kodları da ekleyip çalıştırıp form üzerinde tıklayın.

Private Sub Form_Click()
Dim r&, g&, b&, zeminr&
Me.Cls
zeminr = Rnd(1) * 2 ^ 24
Label1 = "Zemin " & zeminr & "(" & Hex(zeminr) & ")"
Me.BackColor = zeminr
RenkleriAl zeminr, r, g, b
Label2 = "Kırmızı " & r & "(" & Hex(r) & ")"
Label3 = "Yeşil " & g & "(" & Hex(g) & ")"
Label4 = "Mavi " & b & "(" & Hex(b) & ")"
End Sub
VB de sayı, yazı ile nasıl yazılır(127 yi yüzyirmiyedi gibi)

yeni proje açın, 1 textbox, 2 tane de label yerleştirin, declaration'a aşağıdaki kodları ekleyin.

KOD:

Function YAZIYLA$(sayi)
Dim b$(9), y$(9), m$(4), v(15), c(3)
 
 
b$(0) = "":b$(1) = "Bir":b$(2) = "İki"
b$(3) = "Üç":b$(4) = "Dört":b$(5) = "Beş"
b$(6) = "Altı":b$(7) = "Yedi"
b$(8) = "Sekiz":b$(9) = "Dokuz"
 
 
y$(0) = "":y$(1) = "On":y$(2) = "Yirmi"
y$(3) = "Otuz":y$(4) = "Kırk"
y$(5) = "Elli":y$(6) = "Altmış"
y$(7) = "Yetmiş":y$(8) = "Seksen"
y$(9) = "Doksan"
 
 
m$(0) = "Trilyon ":m$(1) = "Milyar "
m$(2) = "Milyon ":m$(3) = "Bin "
m$(4) = ""
 
 
a$ = Str(sayi)
If Left$(a$, 1) = " " Then pozitif = 1 Else pozitif = 0
a$ = Right$(a$, Len(a$) - 1)
For x = 1 To Len(a$)
If (Asc(Mid$(a$, x, 1)) > Asc("9")) Or _
  (Asc(Mid$(a$, x, 1)) < Asc("0")) Then GoTo hata
Next x
If Len(a$) > 15 Then GoTo hata
a$ = String(15 - Len(a$), "0") + a$
For x = 1 To 15
v(x) = Val(Mid$(a$, x, 1))
Next x
s$ = ""
For x = 0 To 4
c(1) = v((x * 3) + 1)
c(2) = v((x * 3) + 2)
c(3) = v((x * 3) + 3)
If c(1) = 0 Then
e$ = ""
ElseIf c(1) = 1 Then
e$ = "Yüz"
Else
e$ = b$(c(1)) + "Yüz"
End If
e$ = e$ + y$(c(2)) + b$(c(3))
If e$ <> "" Then e$ = e$ + m$(x)
If (x = 3) And (e$ = "BirBin ") Then e$ = "Bin"
s$ = s$ + e$
Next x
If s$ = "" Then s$ = "Sıfır"
If pozitif = 0 Then s$ = "Eksi" + s$
YAZIYLA$ = s$
GoTo tamam
hata:
YAZIYLA$ = "Hata"
tamam:
End Function
 
 
Private Sub Text1_Change()
sayi = Val(Text1.Text)
Label1.Caption = YAZIYLA(sayi)
Label2.Caption = Format$(sayi, "#,#")
End Sub
Eliptik form

Aşağıdaki kodları projenize ekleyin.

Private Declare Function CreateEllipticRgn Lib "gdi32" _
(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _
ByVal Y2 As Long) As Long
 
 
Private Declare Function SetWindowRgn Lib "user32" _
(ByVal hWnd As Long, ByVal hRgn As Long, _
ByVal bRedraw As Boolean) As Long
 
 
Private Sub Form_Load()
Show
SetWindowRgn hWnd, CreateEllipticRgn(10, 10, 300, 200), True
End Sub
Vb içinden Word ü kullanmak.

Yeni proje açın. 1 text box ve 1 command buton ekleyin. Project / References Menüsündeki listede "Microsoft Word 8.0 Object Library" nin solundaki kutuyu işaretleyin. Bu Ofis97 deki word ü kullanmanızı sağlayacaktır. Eğer farklı sürüm Word warsa onu listeden bulmaya çalışın. Aşağıdaki kodları ekleyin.

Private Sub Command1_Click()
Dim objWord As New Word.Application
' Word ü aç
objWord.Visible = True
'yeni belge
objWord.Documents.Add
With objWord.Selection
'text1 i word e aktar
.TypeText Text1.Text
'tümünü seç
.WholeStory
'font özellikleri
.Font.Size = 50
.Font.Outline = True 'sadece kenar çizgili
.Font.Italic = True 'eğik
.Font.ColorIndex = wdBlue 'mavi renk
.HomeKey Unit:=wdStory 'ctrl Home
End With
Set objWord = Nothing
End Sub
Proje çalışırken kontrol eklemek(vb5+)

Yeni proje oluşturup form a bir Command Buton ekleyin. F4 e basarak Index özelliğini 0 a eşitleyin. Eklediğiniz butonu çift tıklayıp sub end sub arasına aşağıdaki kodu ekleyin. Aynı işlemi diğer kontroller için de uygulayabilirsiniz.

Dim btn As CommandButton
Dim Tbs As Integer
Tbs = Command1.Count
Load Command1(Tbs)
Set btn = Command1(Tbs)
With btn
 .Top = Command1(Tbs - 1).Top + .Height + 50
 .Caption = "Command" & Tbs + 1
 .Visible = True
End With
Set btn = Nothing
Animasyonlu gifleri göstermek(vb5+)

Animasyonlu bir gif'i picturebox kullanarak göstermeye çalışırsak. Animasyonun ilk karesini gösterir ve kalır. Yani animasyon olmaz. Eğer Webbrowser kontrolünü kullanırsak anim gifleri gösterebiliriz. Bilgisayarınızda IE 3 yada üstü yüklü olması gereklidir. Yeni proje açın Ctrl-T ye basın Kontroller listesinden "Microsoft Internet Control" ü işaretleyin. Form_Load olayına aşağıdaki kodu yazın ve çalıştırın. c:\vb5\anim.gif i kendinize göre değiştirin.

WebBrowser1.Navigate "c:\vb5\anim.gif"

Bu şekilde yaptığımızda varsayılan olarak kutunun sağında bir kaydırma çubuğu çıkacak. Yukardaki kodu aşağıdaki ile değiştirirsek bu çubuk kaybolacaktır.

WebBrowser1.Navigate _ 
 "about:<html><body scroll='no'><img src='c:\vb5\anim.gif'></img></body></html>"
Birbaşka if : IIf Fonksiyonu(vb3+)

Yeni farkketiğim bir fonksiyonu sizlere aktarmak istedim. VB3 de bile bu fonksiyonun olması ve farketmemiş olmam beni şaşırttı. Bu fonksiyon Excel deki EĞER fonksiyonuna çok benziyor.
IF THEN ELSE nin yaptığını yapıyor ama daha az kod kullanarak

IIF (şart , Doğruysa , Yanlışsa)
'IF THEN ELSE ENDIF ile
'-------------
sayi = 5
if sayi>0 then
 a$="Pozitif"
else
 a$="Negatif"
end if
'IIF ile
'-------
sayi = 5
a$ = IIf(sayi > 0, "Pozitif", "Negatif")   
Metin kutusunda tarih kontrolü
Sub Tarihmi(kontrol As TextBox)
With kontrol
    If Not IsDate(.Text) And .Text <> "" Then
        MsgBox "Hatalı tarih değeri girildi", 48, "Hata"
            .Text = Date
            .SetFocus
        End If
End With
 
 
End Sub
 
 
Private Sub Text1_LostFocus()
Tarihmi Text1
End Sub
Metin kutusunda default popup menünün önlenmesi

Form'a bir metin kutusu ve adı popup1 olan bir menü ekleyin

Private Sub Text1_MouseDown(Button As Integer, _ 
Shift As Integer, X As Single, Y As Single)
 
 
If Button = vbRightButton Then
Text1.Enabled = False
PopupMenu Popup1
Text1.Enabled = True
End If
End Sub
Metin kutularında enter tuşu

Formunuzda birkaç tane metin kutusu varsa diğer metin kutularına atlamak için tab tuşuna basılır. Ama enter tuşunu da kullanabilirsiniz. Bunu için aşağıdaki kodu ekleyin.

Private Sub Form_KeyPress(KeyAscii As Integer)
  If KeyAscii = vbKeyReturn Then 'vbKeyReturn=13
    SendKeys "{TAB}"
    KeyAscii = 0
  End If
End Sub
Form her zaman üstte(vb5)

Çalışan programınızda yeni bir form açıldığında bunun en üstte görünmesi için; örn 2 form oluşturun form1_load 'a

form2.Show ,me

yazın.

Bu yöntem yalnızca programınızdaki formlar için geçerlidir. Diğer bir program çalıştığında bunun üzerini örtebilir.
Tüm uygulamaların üzerinde kalan bir form oluşturmak için; declare kısmına

Private Declare Function SetWindowPos Lib "user32"
 (ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, ByVal x As Long,
 ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, 
ByVal wFlags As Long) As Long
 
 
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2

En üstte kalmasını istediğinizde:

SetWindowPos hwnd, _
HWND_TOPMOST, 0, 0, 0, 0, _
SWP_NOMOVE + SWP_NOSIZE

Bu özelliği geri almak için:

SetWindowPos hwnd, _
HWND_NOTOPMOST, 0, 0, 0, 0, _
SWP_NOMOVE + SWP_NOSIZE
Projenizin sürüm(version) numarası (VB 5.0)

Projeniz bittikyen sonra kullanmak için exe haline dönüştürürsünüz. Her exe'ye dönüştürme sırasında sürüm numarasının artmasını isterseniz şunları yapın.

File / Make project.exe
çıkan diyalog da OPTIONS ' tıklayın. Burada MAKE tabı seçili olsun. Burada Version ile ilgili 3 sayı var
Major :Projenizde büyük değişiklikler yaptıysanız bir büyük rakam yazın. Başlangıcı 1.
Minor :Küçük değişiklikler, yenilikler varsa. Başlangıcı 0
Revision: Projenizdeki her değişiklikde değiştirmek için.
Alt kısımdaki AUTO INCREMENT i seçili yaparsanız. Her exe yapmada bu sayı bir artar. Yani sürüm no başlangıçta 1.0.0 iken ikinci exe yapışta 1.0.1 olur.
Bu sayıları vb içinden almak için APP nesnesinden faydalanılır. Aşağıdaki kodu Form_Load'a ekleyebilirsiniz.

Me.Caption = App.title & " Version " & App.Major & "."_
 & App.Minor & "." & App.Revision
Text kutusuna yalnız rakam girmek
Sub Text1_KeyPress (KeyAscii As Integer)
  Dim N$
  N = "0123456789."
  If KeyAscii <> 8 Then
    If InStr(N, Chr(KeyAscii)) = 0 Then
      Beep
      KeyAscii = 0
      Exit Sub
  End If
End If
End Sub

Dikkat: Yapıştırma yapıldığında harf girilebilir.

Text kutusuna yeni satır eklemek

Text kutusunu diğer satırlarını görebilmek için yüksekliğini arttırın. Multiline özelliğini TRUE yapın yoksa Entere bastığınızda veya aşağıdaki kodu eklediğinizde çalışmaz.

Text1.Text = Text1.Text & Chr(13) & Chr(10) & "Ek Satır"
Aktif Text Kutusunu seçili yapmak

Text kutusuna geldiğinizde (GOTFOCUS) kutu içindeki karakterlerin seçili olmasıiçin o text kutusunun GotFocus olayına
SeciliTxBox
yazın

Sub SeciliTxBox ()
Screen.ActiveControl.SelStart = 0
Screen.ActiveControl.SelLength = Len(Screen.ActiveControl.Text)
End Sub
Formdaki tüm Text kutularının içeriğinin temizlenmesi (vb5)

Forma yerleştirdiğiniz textboxların içeriğinitemizlemek için aşağıdaki kodları kullanın.

Dim Control
For Each Control In Form1.Controls
  If TypeOf Control Is TextBox Then Control.Text = "
Next
Clipboard (pano) kullanımı
Sub Kes(x As Form, CntTxt As Control)
If x.CntTxt.SelText > "" Then
Clipboard.SetText x.CntTxt.SelText
x.CntTxt.SelText = ""
End If
End Sub
'-----------
Sub kopyala(x As Form, CntTxt As Control)
If x.CntTxt.SelText > "" Then
Clipboard.SetText x.CntTxt.SelText
End If
End Sub
'------------
Sub yapıştır(x As Form, CntTxt As Control)
clp$ = Clipboard.GetText()
If clp$ > "" And Clipboard.GetFormat(1) Then
x.CntTxt.SelText = clp$
End If
End Sub
Form'u en üstte tutmak (vb3)
Sub AlwaysOnTop (frmIn As Form, flgOnTop%)
 
 
If flgOnTop Then
SetWindowPos frmIn.hWnd, -1, 0, 0, 0, 0, &H1 Or &H2
Else
SetWindowPos frmIn.hWnd, -2, 0, 0, 0, 0, &H1 Or &H2
End If
 
 
End Sub
.wav dosya' nın çalınması (vb3)
Declare Function sndPlaySound Lib "MMSYSTEM.DLL"_
 (ByVal ses$, ByVal ozellik%) As Integer
 
 
x% = SndPlaySound("dosyaadi.wav", &H0 Or &H2)
Windowsdan çıkmak (vb3)
'API tanımlama
Declare Function ExitWindows% Lib "User"_
 (ByVal dwReserved&, ByVal wReturnCode%)
'Fonksiyonun kullanımı
R% = ExitWindows(66, 66) 'windowsdan çıkar
Visual basic' in açılışının hızlandırılması.

Vb ilk kurulduğunda tüm Custom Control' leri yüklemek için bir versiyona göre .mak veya .vbp dosya oluşturur. Bu dosya Autoload ile başlar ve vb'nin kurulduğu klasördedir. Bu dosyayı siler veya adını değiştiriseniz vb yine açılır yalnızca standart kontrolleri yükler. Böylece açılış daha hızlı olur. Eklemek istediğiniz kontrol olursa 3.0 da Ctrl-D, 4.0 'da Ctrl-T 'ye basın.

Başlığı olmayan formun taşınması

form'un Borderstyle özelliğini 0 'layın, form'a picture ekleyin, bir de modül oluşturun

'Modül'e
 
 
Type POINTAPI
X As Integer
Y As Integer
End Type
 
 
Type ConvertPOINTAPI
xy As Long
End Type
 
 
Declare Function SendMessage Lib "User"_
 (ByVal hWnd As Integer, ByVal wMsg As Integer,_
 ByVal wParam As Integer, ByVal lParam As Any) As Long
Declare Sub GetCursorPos Lib "User" (lpPoint As POINTAPI)
Global Const WM_LBUTTONUP = &H202
Global Const WM_SYSCOMMAND = &H112
Global Const MOUSE_MOVE = &HF012
'form'a
Sub Picture1_MouseDown (Button As Integer,_
 Shift As Integer, X As Single, Y As Single)
Dim mpos As POINTAPI
Dim p As ConvertPOINTAPI
Dim ret As Integer
 
 
Call GetCursorPos(mpos)
LSet p = mpos
 
 
ret = SendMessage(picture1.hWnd, WM_LBUTTONUP, 0, p.xy)
ret = SendMessage(Me.hWnd, WM_SYSCOMMAND, MOUSE_MOVE, p.xy)
End Sub
Formu ortala
Sub f_ortala (frm As Form)
frm.Move screen.Width / 2 - frm.Width_
 / 2, screen.Height / 2 - frm.Height / 2
End Sub
Hakkında penceresi. Bu küçük püf hoşunuza gidecektir. (vb3)
Declare Sub ShellAbout Lib "shell.dll"_
 (ByVal hWndOwner%, ByVal lpszAppName$,_
 ByVal lpszMoreInfo$, ByVal hIcon%)
 
 
Sub Form_Click ()
ShellAbout hwnd, App.EXEName, App.Title, icon
End Sub
 
 
Buradaki Microsoft ve Copyright yazısı hoşunuza gitmeyebilir.
Spin(fırıldak) vbx veya ocx yüklenmeden spin kullanımı

spin vbx kullanılmadan da spin kullanılabilir. Ben önceleri fazla yer işgal etmesin diye spin'i kullanmıyordum. Ama sonradan farkettiğim(örn.word)bir teknik var. Artık vbx'siz spin kullanıyorum. Hscroll ve Vscroll aletleri vb ile standart olarak yükleniyor. Bunları aradaki kaydırma düğmesi kayboluncaya kadar küçültün ve bir text kutusunun yanına koyun. Hscroll1'i çift tıklayıp Change olayına(event) şu kodları yazın

Sub HScroll1_Change ()
text1.Text = Hscroll1.Value
End Sub

Hscroll1'in
1. Min ve Max özelliklerini de değiştiriseniz istediğiniz değerler arasında değişim olur. Yalnız dikkat Max 2 byte uzunluğundadır. Yani sonsuz değildir.
2. SmalChange özelliğini 1 den farklı verirseniz verdiğiniz sayıda artış veya azalış olur.
Eğer Vscroll yerleştirirseniz artırma ve azaltma ters olur. Buna çare de; örnek 1-100 arası sayı için: Vscroll un min değerine -100 , max değerine -1 yazın. Change olayına da aşağıdakini yazın

text1.Text = Abs(Vscroll1.Value)
Tabindex'in sıraya sokulması

Program çalışırken formdaki aletlere tab tuşuyla ulaşabiliriz. Fakat bazen istediğimiz sırada olmaz. İstediğimiz sırayı oluşturmak için belirlediğimiz sırada aletlerin tabindex değerini değiştirmemiz gerekir. Fakat bu karmaşık bir yöntemdir.
İşin kolayı : Tab tuşunun son duracağı aleti tıklayın F4' e basıp Tabindex değerini 0 yapın, sıralamadaki sondan bir önceki aleti tıklayıp 0 tuşuna basın, bir önceki aleti tıklayıp 0 tuşuna basın ... son alete kadar. Aletlerin tabindex sıralaması istediğiniz gibi olacaktır.

Ansi(win) karakterlerin Ascii(dos) 'ye çevrilmesi (vb3)

Windows'ta hazırladığınız Türkçe karakterler içeren metin'e dos' a geçip baktığınızda Türkçe karakterlerin yerinde başka anlamsız karakterler görürsünüz. Dos'tan yazdırmak isterseniz'de yine hatalı yazım oluşur. Çözümü :
Projedeki (yoksa ekleyin) .bas dosyaya şunları ekleyin

Declare Sub AnsiToOemBuff Lib_
 "Keyboard" (ByVal lpAnsiStr As String,_
 ByVal lpOemStr As String, ByVal nLength As Integer) ' tek satır
'-----
Function OEMe (ByVal metin$) As String
Dim gMetin As String, L%
gMetin = metin$ + " "
L% = Len(metin$)
AnsiToOemBuff metin$, gMetin$, L%
OEMe = gMetin$
End Function
'------
Artık istediğiniz form'dan 
x$=OEMe(text1.text) veya x$=OEMe("ÜüĞĞ")
gibi komutlar verebilirsiniz
Tersi için
.bas dosyaya :
Declare Function OemToAnsi Lib_
 "Keyboard" (ByVal lpOemStr As String,_
 ByVal lpAnsiStr As String) As Integer 'tek satır
'-----
Function ANSIye (ByVal metin$) As String
Dim gM$, x%
gM$ = metin$ + " "
x% = OemToAnsi(metin$, gM$)
ANSIye = gM$
End Function
' ekleyin
Fonksiyonun kullanımı :
x$=ANSIye(text1.text)

 

 

Visual Basic Program Örnekleri 
 
 
 
Visual Basic ve Renk 
 
Visual Basic’in renk kutusundan seçtiğiniz renkler 16’lık sayı 
 
düzenine KK, YY, MM iki haneli ve 16’lık düzende sayılardır. 
 
Visual Basic’i kullanarak her bir renk’ten 1’den 255’e kadar 
 
bir ton alabilir, bunları karıştırabilir ve böylece 16.581.375 
 
adet değişik renk elde edebilirsiniz. İşte size RGB komutu 
 
kullanılarak form üzerine basit bir palet yaratan ufak bir 
 
program. RGB değerini değiştirerek çok değişik görüntüler elde 
 
edebilirsiniz. Örnekte ayrıca bir formun ortasının nasıl 
 
bulunacağını da görebilirsiniz. 
 
   Private Sub Form_Click()
 
   ScaleMode = 1   ' Ölçü sistemini piksele çevir
 
   CX = ScaleWidth / 2 ' Formun dikey ortasını bul
 
   CY = ScaleHeight / 2    ' Formun yatay ortasını bul
 
   DrawWidth = 3   ' Çizim genişliğini ayarla
 
   r = 100
 
   For I = 50 To 0 Step -1
 
   F = I / 50
 
   F1 = 1 - F: F2 = 1 + F  ' Hesaplamalar...
 
   r = r + 10: b = b + 10
 
   If b > 50 Then g = g + 5
 
   ForeColor = RGB(r, g, b) ' Önalan rengini belirle
 
   Line (CX * F1, CY * F1)-(CX * F2, CY * F2), , BF
 
   Next I
 
   End Sub
 
 
 
Programınızı yazdıktan sonra formunuzun üzerine bir kere tıklayın. 
 
Güzel bir renk paletinin oluştuğunu göreceksiniz.
 
Visual Basic’in size sunduğu diğer bir renk komutu ise 
 
QBColor komutudur. Bu komutu kullanarak QBASIC’ten kalan sınırlı 
 
15 tane temel rengi kullanabilirsiniz. Aktif formun arkaplan rengini 
 
maviye boyamak için şunun gibi bir komut kullanmalısınız: 
 
 
 
             Form1.ForeColor = QBColor(1)
 
 
 
Visual Basic'te yeni sürümlerdeki kolaylık 
 
VB’nin her yeni sürümü ile programcıların işini daha da 
 
kolaylaştıracak komutlar ve özellikler geliyor. 
 
İşte With (Birlikte) komutu bunlara en güzel örnek. 
 
Şimdi aşağıdaki satırları inceleyin ve bazı 
 
komutların ne kadar gereksiz olarak kullanıldığını görün: 
 
 
 
        Private Sub Form_Load()
 
        Form1.Height = 4000
 
        Form1.Caption = "With Örneği"
 
        Form1.BackColor = QBColor(6)
 
        End Sub
 

 

Burada dikkat ettiğiniz gibi Form1 nesnesi her satırda tekrarlanmış. 
 
VB 4.0 ile bu soruna bir çözüm 
 
getirilerek With komutu yaratılmıştır. 
 
Aşağıdaki örnek size bu komutun nasıl kullanıldığı hakkında 
 
fikir verecektir. 
 
 
 
  Private Sub Form_Load()
 
  With Form1 'Form1'i kullanarak...
 
  .Height = 4000 'Yüksekliği 4000,.Caption = "With Örneği" 
 
  'Form başlığını "With Örneği",
 
  .BackColor = QBColor(6) 'Arkaplan rengini yeşil yap.
 
  End With 'Komutu bitir
 
  End Sub
 

 

Bu komutu kullanırken With ve End With satırları 
 
arasına yine With ve End With satırlarını 
 
girebilirsiniz fakat bu iki komut arasına 
 
komplike komutlar ve döngüler eklememelisiniz.
 
Bu hem programınızı yavaşlatır hem de ciddi 
 
hatalara sebep olabilir. 
 
Visual Basic ile Kes - Kopyala -Yapıştır 
 
Windows altında çalışan hemen hemen tüm metin editörleri 
 
panoyu kullanır. Panoya veri yapıştırmayı, panodan veri 
 
almayı geçen aylarda verdiğimiz örneklerle iyice açıkladık. 
 
Peki metin editörleri metinin hangi parçasının seçildiğini 
 
nasıl anlıyor. Metnin belirli bir kısmını nasıl kesip alıyor?
 
 İstenilen metni bütün bir yazı içinde nasıl buluyor? 
 
Bu dediklerimizi yapmak için Visual Basic ile hazırlanmış 
 
tüm metin editörleri hemen hemen aynı teknikleri uygular. 
 
İşte bunlardan bir kaçı:
 
Metnin, kullanıcı tarafından seçilen kısmının anlaşılıp 
 
panoya kopyalanması için (Kopyala)
 
 
 
 
 
     ClipBoard.SetText screen.ActiveControl.SelText
 
 
 
Metnin, kullanıcı tarafından seçilen kısmının anlaşılıp panoya 
 
kopyalanması ve seçilen yerin silinmesi için (Kes)
 
·  
 
ClipBoard.SetText screen.ActiveControl.SelText 
 
 
 
 
 
 
 
' Seçilen metni ilk önce kopyala
 
 
 
            screen.ActiveControl.SelText = "" 
 
 
 
' Sonra işaretlenen yeri sil.
 
Panodan yapıştırılan kısmın kullanıcı tarafından seçilen 
 
kısmın üzerine yazılması için(Yapıştır)
 
 
 
    screen.ActiveControl.SelText = ClipBoard.GetText() 
 
 
 
Metnin belirtilen kısmını anlamak ve metnin herhangi 
 
bir kısmını otomatik olarak seçtirmek için SelText komutunu, 
 
metnin hangi kısımdan seçilmeye başlanacağını tayin etmek için 
 
SelStart komutunu, Seçilecek metnin uzunluğunu ayarlamak için 
 
ise SelLength komutunu kullanıyoruz. Hatırlayacağınız gibi 
 
Microsoft Word kullanılırken CTRL+A tuş kombinasyonu tüm metni 
 
otomatik olarak seçebiliyordu. Sadece ufacık bir kod parçasıyla 
 
bunu gerçekleştirebiliriz.
 
 
 
 
 
                  text1.SelStart = 0 
 
   ' SelStart komutu metnin işaretlenen kısmının nereden
 
   ' başlayacağını belirtir. Biz işaretlemeye metnin 
 
   ' başından başlamak istiyoruz...
 
 
 
           text1.SelLength = Len(text1.Text) 
 
 
 
'Metnin işaretlenen kısmı metnin uzunluğu kadar olacak
 
Peki metin editörleri uzun bir yazının içinde istediğimiz kelimeyi nasıl arayıp buluyorlar?
 
Bunu anlamak için aşağıdaki kodu bir inceleyin.
 
  
 
  Dim ara, nerede  ' Kullanacağımız değişkenleri atayalım
 
  ' Kullanıcıdan aranacak metni iste
 
  ara = InputBox("Aranacak metni girin:", 
 
  "Metin Teknikleri Örneği", , 1000, 1000)
 
  nerede = InStr(text1.Text, ara) ' Metni yazı içinde ara
 
  If nerede Then ' Bulunursa...
 
  text1.SelStart = nerede - 1  
 
 ' Bulunan metnin başını işaretle
 
  text1.SelLength = Len(ara)   
 
 ' Bulunan metnin uzunluğu kadar yazıyı işaretle
 
  Else   ' Metin bulunamazsa...
 
  MsgBox "Metin bulunamadı!", 64
 
  End If
 
 
 
 
 
Bütün bunları bildikten sonra oturup kendi metin editörünüzü kolayca yazabilirsiniz...
 
Yeni Kontroller: TreeView 
 
Zaman zaman Visual Basic 4.0 ile gelen yeni kontrollere değiniyoruz. 
 
İşte bu yeni kontrollerden birisi: Treeview. Windows 95’in Gezgininde 
 
sol klasör penceresi bu kontrolle oluşturulmuş. Kontrolün kullanımı 
 
gayet basit, nasıl kullanıldığını merak ediyorsanız hemen boş bir 
 
formun üzerine bir Treeviev kontrolü yaratın ve aşağıdaki kodları 
 
yazmaya başlayın. Kontrolün kullanımı hakkındaki tüm açıklamalar 
 
kodların arasında verilmiştir. 
 
  Private Sub Form_Load()
 
  Dim nodX As Node
 
  ' Bir metni ana başlık olarak atamak için aşağıdaki 
 
   gibi bir komut kullanmalısınız.
 
 
 
  Set nodX = TreeView1.Nodes.Add(, , , "Müzik")
 
  'Aşağıdakinin amacı 1. Başlığa bir alt başlık eklemektir.
 
  ' Eklediğiniz altbaşlıklar eklenme sıralarına göre 
 
  görüntülenir.
 
 
 
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Jazz")
 
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Pop")
 
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Klasik")
 
  Set nodX = TreeView1.Nodes.Add(1, tvwChild, , "Rock")
 
 
 
  ' Pop alt başlığı altına 2.altbaşlık daha ekliyoruz.
 
  
 
  Set nodX = TreeView1.Nodes.Add(3, tvwChild, , "Techno")
 
  Set nodX = TreeView1.Nodes.Add(3, tvwChild, , "Rave")
 
 
 
  ' 2. Anabaşlığı ekliyoruz.
 
 
 
  Set nodX = TreeView1.Nodes.Add(, , , "Resim")
 
 
 
  ' Tüm ağacı göstermek için kontrolü tazele.
 
 
 
   nodX.EnsureVisible
 
 
 
   End Sub
 
' Ağacın dallarından birine tıklandığında...
 
   Private Sub TreeView1_NodeClick(ByVal Node As Node)
 
   mesaj$ = "Tıkladığınız Liste Seçeneği: " + Node.Text
 
   tip = 64
 
   baslik$ = "Treeview Örneği"
 
   ' Hangi dala tıklandığını söyle.
 
   MsgBox mesaj$, tip, baslik$
 
   End Sub
 
 
 
Dosya Kopyalamak 
 
VB'de dosyaları bir yerden bir yere kopyalamak için FileCopy isimli bir 
 
komut olduğunu biliyor muydunuz? 
 
 
 
FileCopy "C:\COMMAND.COM", "C:\COMMAND.XXX" 
 
gibi bir komut verdiğinizde ana dizinde bulunan COMMAND.COM isimli 
 
dosyanın yine aynı dizinde COMMAND.XXX isimli bir kopyası oluşacaktır. 
 
KeyPreview 
 
   
 
   Option Explicit
 
   Const KEY_F1 = &H70
 
   Const KEY_F2 = &H71
 
   Const KEY_ESCAPE = &H1B
 
 
 
Şimdi de bu yukarıda belirttiğiniz tuşlara basıldığında neler 
 
olacağını tayin edelim. Yukarıda belirtmediğiniz tuşlara bastığınızda 
 
(Aşağıda bunları kullanmış olsanız bile) Formunuz bunu daha önceden 
 
olduğu gibi sıradan tuş vuruşları olarak algılayacaktır. 
 
 
 
  Sub Form_KeyDown (KeyCode As Integer, Shift As Integer)
 
  Select Case KeyCode
 
    Case KEY_F1: Text1.text = Date$ 
 
  ' F1 tuşuna basıldığında metin kutusundaki metin
 
  ' silinsin ve yerine tarih atansın.
 
   Case KEY_F2: Text1.Text = Time$ 
 
  'F2 tuşu ise metin kutumuza zamanı yazsın
 
   Case KEY_ESCAPE: Unload Me 
 
  ' ESC tuşumuz ise aktif formu bellekten atsın.
 
    End Select
 
  End Sub
 
 
 
Programlarınızda kullanabileceğiniz diğer tuş kodlarını Visual Basic 
 
ile gelen ve tüm diğer sabitlerin bulunduğu CONSTANT.TXT dosyasından 
 
bulabilirsiniz. Ayrıca yukarıda belirttiğimiz tuşları diğer tuş 
 
kombinasyonlarıyla da kullanabilirsiniz (Örnek CTRL+ALT+F5 gibi.)
 
Masaüstünün Resmini değiştirmek 
 
Visual Basic ile masaüstü resmini değiştirmek çok kolaydır. 
 
Sadece USER32.DLL dosyasında bulunan bir fonksiyonu çağırmak 
 
yeterlidir. Yemedik, içmedik sizin için bu API'yi kullanan bir 
 
program oluşturduk. Öncelikle FORMdan ayrı bir BAS modülüne 
 
aşağıdaki tek bir satırı girin. 
 
  Declare Function SystemParametersInfo Lib "user32" Alias
 
  "SystemParametersInfoA" (ByVal uAction As Long, ByVal
 
  uParam As Long, ByVal lpvParam As Any, ByVal fuWinIni
 
  As Long) As Long
 
 
 
Fonksiyonu programınıza tanıttıktan sonra şekildeki gibi 
 
bir form oluşturun ve ilgili bölümlere kodları yazın. 
 
   Private Sub Form_Load()
 
   Dim Temp As String
 
   Temp = InputBox("Lütfen WINDOWS 
 
   klasörünü girin", "", "C:\WINDOWS\")
 
   If Temp = "" Then End   'Vazgeç'e basıldı
 
   If Right$(Temp, 1) <> "\" Then Temp = Temp + "\"
 
   list1.Tag = Temp
 
   Temp = Temp + "*.bmp"
 
   Temp = Dir$(Temp) 
 
   Do While Temp$ <> "" 
 
   Temp = Dir$  
 
   'Dosya bulunamazsa döngüden çık.
 
 
 
   If Temp = "" Then Exit Do
 
   list1.AddItem Temp
 
   Loop
 
  
 
   list1.AddItem "(Yok)"
 
   Show 
 
   list1.SetFocus
 
   list1.ListIndex = 0
 
   End Sub
 
'Küçük açıklama: Formun yüklenme aşamasında 
 
'Setfocus olayını kullanırsanız VB hata verir.
 
 
 
 
 
   Private Sub list1_DblClick()
 
    Dim Temp As String
 
    Dim BMPFile As String   
 
    Temp = Tag
 
    If list1.Text = "(Yok)" Then
 
    BMPFile = "(Yok)"
 
    Else
 
     BMPFile = Temp + (list1) 
 
    End If
 
   SystemParametersInfo SPI_SETDESKWALLPAPER, 0, 
 
   ByVal BMPFile, SPIF_UPDATEINIFILE
 
   End Sub
 
'Değiştir tuşu
 
 
 
 
 
  Private Sub Command1_Click()
 
  list1_DblClick
 
  End Sub
 
 
 
 
 
Programınızı çalıştırdıktan sonra karşınıza BMP dosyalarınızın 
 
yerini soran bir mesaj kutusu gelecektir. 
 
Mesaj kutusuna uygun bir dizin girdikten sonra artık liste kutusundaki 
 
ilgili resme çift tıklayarak veya değiştir tuşuna basarak resmi 
 
masaüstüne yükleyebilirsiniz. Program aynı zamanda WIN.INI dosyasını 
 
da haberdar ediyor. 
 
 
 
--------------------------------------------------------------------------------
 
Not : ilerleyen Zaman içinde bu sayfaya değişik kod konulacaktır. 
 
Bu Bilgiler Günümüzde yayınlanmakta olan BYTE, PC WORLD, CHIP Degilerinden 
 
ve verdikleri CD lerden yararlanarak hazırlanmıştır. 
 

 

 Visual Basic

 
 

Değişkenlere Isim Verme Kuralları

Visual Basic’de daha etkin bir programlama yapabilmek için kullanılan veri tiplerini ve veri yapılarını iyi bir şekilde bilmeliyiz. Burada önemli olan nerede hangi veri tipini kullanacak oluşumuzdur. Veri tiplerini anlatmadan önce kullanacağımız değişkenleri nasıl isimlendireceğimizi görelim.

Değişkenleri isimlendirirken daha sonra bakdığınızda akılda kalabilecek ve anlamlı bir isim veriniz
Aşağıda verilen kurallar dogrultusunda degiskenler tanımlıyabılmemiz mümkündür. Tanımlanacak degiskenlerin ilk karakteri mutlaka bir harf ile başlamalıdır.Geri kalan karakterler ; harflerden , rakamlardan, alt çizgi karakterinden oluşabilir. Degişken isimlerinde noktalama isaretlerini ,matematiksel ve mantıksal ve karşılaştırma operatörleri kullanamayız. Değişken isimleri 255 karaktere kadar uzunlukta olabilir. Aşağıda değişken tanımlamaları ile ilgili örnekler verilmiştir.
Örnek :

Adi , soyadi , yasi , Maas98 , Dogum_Yeri , SANAT_DALI

Yukarıda geçerli değişken isimlerine örnek verilmistir
Örnek :

2ADI , ad soyad , Mal+Bildirimi

Burada da geçersiz değişken isimlerine örnekler verilmistir.
2ADI : Çünki ilk karakter bir sayi ile başlamış.
Ad soyad : Değişken isminde boşluk kullanılmış
Mal+Bildirimi : Değişken isminde geçersiz bir karakter kullanılmış.
Zaten bu degiskenleri tanımlarken Visual Basic bizi hata mesaji ile uyaracaktır.

Visual Basic’de Degisken Tanımlama

Degisken tanimlarken Visual Basic’te Dim bildiri deyimini kullanabiliriz. Degiskenin tanımlanması hafızada ayrılacak hafıza miktarının belirli olmasını saglar. Eger degiskenlerin tipini belirtmeden bir kullanım yaparsak bu degiskenlerin Variant tipinde oldugu kabul edilir.Bu da hafızada gereksiz yer kaybına sebep olur.Eger tanımlanan bütün degiskenlerin tiplerinin belli olmasını isterseniz kod penceresinin General,Declarations kısmına  Option Explicit   yazılır.
Ayrıca degisken tanımlarken kullanilabilecek bir baska bildiri deyimide Def- bildiri deyimidir.Bu bildiri deyimi daha genel tanimlamalar yapmak için kullanilir..Def bildiri deyimleri asagida verilmistir.

Def bildiri deyimi projenin general,declarations bölümünde tanımlanmalıdır
DefBool : Boolean tipinde değişken tanımlamak için kullanırız.
DefByte : Byte tipinde değişken tanımlamak için kullanırız.
DefInt : Integer tipinde değişken tanımlamak için kullanırız.
DefLng : Long tipinde değişken tanımlamak için kullanırız.
DefCur : Currency tipinde değişken tanımlamak için kullanırız.
DefSng : Single tipinde değişken tanımlamak için kullanırız.
DefDbl : Double tipinde değişken tanımlamak için kullanırız.
DefDate : Date tipinde değişken tanımlamak için kullanırız.
DefStr : String tipinde değişken tanımlamak için kullanırız.
DefVar : Variant tipinde değişken tanımlamak için kullanırız.
Örnek :

Private Sub Form_Load()
Dim Ad As String
Dim Maas As Currency
Dim D_tarihi As Date
Dim Adres As String
Dim Sira As Integer
End Sub

Burada görmüs oldugunuz gibi 5 adet degisken tanimlanmaktadir.Ad degiskeni string tipinde bir degiskendir.Maas degiskeni Currency tipinde bir degiskendir.D_tarihi degiskeni Date tipinde bir degiskendir.Adres degiskeni string tipinde bir degiskendir.Sira degiskeni integer tipinde bir degiskendir.
Asagidaki satirlari formun general,declarations bölümüne yazalım.
Örnek :

DefInt A-C
DefStr S
DefVar K
DefDate D
DefSng V

Bu örnekte
A , B, C ile baslayan bütün karakterler Integer türünde olmak zorundadır.
D ile baslayan bütün karakterler Date türünde olmak zorundadır.
V ile baslayan bütün karakterler Single türünde olmak zorundadır.
K ile baslayan bütün karakterler Variant türünde olmak zorundadır.
S ile baslayan bütün karakterler String türünde olmak zorundadır.

Def deyimi dim deyiminden farklıdır. Def ile sadece bir harf yada harf aralığı belirtilebilir.Burada belirtilen harf ile baslayan bütün degiskenler artık o bildiri deyimindeki tipdedir

Örnek :

Private Sub Form_Load()
Dim ad As String , soyad As String
Dim maas As Currency
End Sub

Bu örnektede ad ve soyad isimli iki degisken string türünde ve maas degiskeni ise Currency tipindedir.
Veri Tipleri

Integer :
Visual Basic’te tam sayi degiskenleri tanimlamak için kullanilir. Hafizada 2 byte yer kaplarlar. Alabilecegi deger araligi -32768 ile +32767 arasindadir.DefInt bildiri deyimi ile tanimlanabilirler. Ayrica bir degiskenin sonunda % karakteri bulunuyorsa bu degisken integer tipindedir.
Örnek :

Private Sub Form_Load()
Dim Maas As Integer
DefInt A-C
Oran% = 100
A_sayi = 100
B_sayi = Oran*A_sayi
C_sayi = B_sayi + A_sayi - 1000
Maas= 32767
End Sub

Eger burada tanımlanan degiskenlere daha büyük sayılar atanırsa overflow oluşur.
Long :
Daha büyük bir aralıkta integer yani tamsayi tanimlamak için kullanabilecegimiz bir veri tipidir. Hafizada 4 byte yer kaplar. Kullanilabilecek uç degerler +2,147,483,647 ile -2,147,483,648 dir. Long tipinde bir degisken tanımlamak için DefLng bildirimini veya degisken sonunda & karakterini kullanabiliriz.
Örnek :

Private Sub Form_Load()

DefLng A-B

Bölüm=50000

cikan&=600000

Kalan& = (cikan / Bölüm ) * 10000

End Sub

Single :
Tam sayi olmayan küsüratli sayilar için kullanabilecegimiz bir veri tipidir. Kayan-noktali sayi olarak isimlendirilir. Single tipindeki veriler bellekte 4 byte yer kaplarlar. Nekatif sayilar için alabilecegi aralik -3.402823E38 ile -1.401298E-45 ,pozitif sayilar için alabilecegi aralik 1.401298E-45 ile 3.402823E38 arasindadir.Single tipinde veri tanimlamak için DefSgn bildirimi veya degisken sonuna ! karakteri konur. 7 haneye kadar hassastir.Daha sonrasi yuvarlatilir.
Örnek :

Private Sub Form_Load()
DefSgn A-B
Bölüm=50000
Cikan!=600000
End Sub

Double :
Visual Basic’te kullanilabilecek en büyük sayisal degerlerin veri tipidir. Hafizada 8 byte yer kaplarlar. 16 haneye kadar hassastirlar. Maximum alabilecegi degerler pozitif sayilar için 4.94065645841247E-324 ile 1.797693134862232E308 , nekatif sayilar için de -1.797693134862232E308 ile -4.94065645841247E-324 arasindadir. DefDbl bildirimi veya # sembölü ile double tipinde degiskenler tanimlanabilir
Örnek :

Private Sub Form_Load()
DefDbl A-K
Dari=50000
Bugday=600000
Arpa=340.56
End Sub

Veri Tipleri

Currency :
Sayisal tipdeki veriler için tanimlanmis özel bir veri tipidir.Hafizada 8 byte yer kaplarlar. 4 hane ondalik kismi olmak üzere toplam 19 haneden olusur.(nokta hariç) Alabilecegi maximum degerler -922,337,203,685,477.5808 ile 922,337,203,685,477.5807 arasindadir. @ sembolü veya DefCur bildirimi ile Currency tipinde degisken’ler tanimlanabilirler.
Örnek :

Private Sub Form_Load()
Dim Maas As Currency , Borc As Currency
Maas = 500000000
Borc = 68000000
Zayi@ = 340000.56
End Sub

Date :
Tarih türündeki bilgileri kullanmak için olusturulmus bir veri tipidir. Hafizada 8 byte yer kaplarlar. 1 Ocak ile 31 Aralik 9999 arasindaki tarihleri kullanabilirsiniz. DefDate bildirisi ile tarih türünde degiskenler tanimlayabiliriz.
Örnek :

Private Sub Form_Load()
Dim Dogum_tarihi As Date , Evlenme_Tarihi As Date
Dogum_tarihi =#Dec,9,1977#
Evlenme_Tarihi=#May,15,1998#
End Sub

Boolean :
Mantiksal veri tipleri için kullanilir. Iki seçenekten birisini alabilir.Bunlar True veya False degerleridir. Bellekte 2 byte yer isgal ederler.Boolean tipindeki bir degiskeni tanimlamak için DefBool sözcügü kullanilir.
Örnek :

Private Sub Form_Load()
Dim Durum As Boolean , Duyum As Boolean
Durum = True
Duyum = False
End Sub

Byte :
O ile 255 arasindaki tamsayilari ifade etmek için kullanilabilecek veri tipidir.DefByte deyimi ile byte tipinde degiskenler tanimlanabilir.
Örnek :

Private Sub Form_Load()
Dim Durum As Byte , Duyum As Byte
Durum =23
Duyum = 143
End Sub

String :
Metin türü bilgileri saklamak için kullanilabilecek veri türüdür. 16 bitlik versiyonda 0 ile 65538 arasinda , 32 bitlik versiyonda ise 0 ile 2,000,000,000 arasinda karakter alabilir. String türünde degisken tanimlamak için Defstr veya $ sembolü kullanilir.
Örnek :

Private Sub Form_Load()
Dim Adi As String , Soyadi As String
Adi ="Kemal"
Soyadi = "Tas"
No$="1323970067"
 

End Sub

Variant :
Bu tipte tanimlanmis bir degiskene herhangi bir tip’te veri yüklenebilir.Yani ne tür bir veri girecegimizi bilmedigimiz degiskenleri Variant tipinde tanimlamaliyiz. Bu tür degiskenler hafizada 16 byte tan fazla yer kaplarlar. DefVar bildiri sözcügü ile Variant türünde degiskenler tanimliyabiliriz.

Variant türünde degiskenler tanimlamak fazla kullanisli degildir.Çünki hafizada fazla yer kaplarlar.

Örnek :

Private Sub Form_Load()
Dim Ad As Variant , Maas As Variant , Tel As Variant
Dim Dogum_tarihi As Variant
Ad="Aydin Kale"
Maas=200000
Tel="500-45-00"
Dogum_tarihi=#Apr,3,1970#
End Sub

Veri Yapıları

Const :  Bunlar program içinde degeri degistirilemeyen sabitlerdir. Public ve Private tipinde sabitler tanimlanabiliilir. Public sabitlere tüm modüller içinden ulasilabilir.Private türündeki sabitler ise sadece tanimlandiklari modül içersinde geçerlidirler.Ayrica Visual Basic içinde tanimlanmis çok sayida sabit vardir. Bunlara CONSTANT.TXT dosyasini açarak inceleyebiliriz.
Örnek :

Const sehir="Istanbul"

Const Ulke="Turkey"

Const posta_kodu=34650

Const tek_kod=212

Type - End Type Yapisi :
Type yapisini kullanarak programici farkli veri tiplerini kullanarak kendi veri yapisini olusturabilir. Bu C deki Struct yapisina benzetilebilir. Bu yeni veri tipine record adi verilir. Herhangi bir modülün Declarations kisminda asagidaki gibi bir tanimlama yapabiliriz.
Örnek :

Type Ogrenci

Ad As String *10

Soyad As String *12

Not As Byte

Kredi As Integer

End Type

'Ogrenci veri tipi toplam hafizada 25 byte yer kaplamaktadir. Bu veri tipini kullanmak için 'Ogrenci tipinde degiskenler tanimlamak gerekmektedir.

Private Sub Form_Load()

Dim A As Ogrenci

Dim B As Ogrenci

'Bu degiskenlere bilgi atamak asagidaki sekildeki gibidir.

A.Ad="Ali"

A.Soyad ="Armer"

End Sub

String türü degiskenlere sabit bir uzunlukta yer ayirmak istersek asagidaki sekilde bir tanimlama yapmaliyiz.
Dim Name As String *12
Dim Address As String *50

Diziler

Aynı tür bilgileri bellekte tutmak için kullanabilecegimiz listelere dizi adi verilir. Dizi kullamanin avantaji ayni tür bilgiler bir listede tutularak daha hizli islem yapilabilmesi saglanmis olacaktir.Visual Basic'de dizi su sekildedir
Dizi_adi(Indis)
olacaktir.
Örnek:

Private Sub Form_Load()

Dim ad(2) As String

Dim no(2) As Integer

ad(0) = "ali"

ad(1) = "ahmet"

ad(2) = "ebru"

no(0) = 133

no(1) = 56

no(2) = 67

End Sub

Bu örnek'te ad ve no olmak üzere iki adet dizi tanimlanmaktadir. ad dizisi string türünde bilgileri tutacak ve no dizisi ise integer türündeki bilgileri saklayacaktir. Görmüs olgunuz gibi dizilere bilgi atama sekli
dizi_adi(indis_sirasi)=atanacak_bilgi
<font face="C

Visual Basic İle MP3 Player Oluşturmak

Sizlerle bu ay basit bir MP3 Player oluşturacağız. Visual Basic içinden MP3 çalmak için MP3Play adlı bir OCX bulunmaktadır. Bu OCX’i ailenizin Web sitesi PC Magazine Online Dergide Adı Geçen Dosyalar bölümünden download edebilirsiniz. Dosyanın adı MP3Play.zip. Bu OCX MP3lerin ilk 30 saniyesini çalabilmektedir. Programı kayıt ettiğiniz taktirde MP3leri tam bir biçimde çalabiliyor. Bu OCX’i biraz tanıyalım.

MP3Play.Open => Bir MP3’ü açmaya yarar.

MP3Play.Play => Bir MP3’ü çalmaya yarar.

MP3Play.Stop => Çalan MP3’ü durdurur.

MP3Play1.Pause => Çalan bir MP3’ü dondurur.

MP3Play.Close => MP3’ü kapatır.

MP3Play1.Authorize => MP3Play kontrolünü kayıt etmeye yarar.

MP3Play kontrolünü download ettiğinizde içinden bir tane örnek hazırlanmış MP3 Player örneği çıkacaktır. Buradaki komutları öğrenerek kendi MP3 Player’ınızı yapabilirsiniz. Ancak bu kontrol içinden çıkan örnek karışık bir örnektir. Yazımızın devamında kendimizin nasıl bir MP3 Player yapacağımızı anlatacağım.

Öncelikle aşağıdaki gibi bir örnek form hazırlayın.

Command butonlarının yazı tiplerini ‘Marlett’ olarak belirleyin. Böylece sembolleri kolayca yerleştirebilirsiniz.

MP3Play.OCX ile gelen örnekte bir çok metin kutusu kullanıcının kafasını karıştırmakta. Onların bir çoğu hata döndürmek için kullanılmıştır. Örnek formumuzda biz bunları kullanmayacağız. Şimdi formumuza zip paketinden çıkan MP3 Play kontrolünü ekleyin. Ancak bundan önce her kontrolü olduğu gibi bunu da Windows’a tanıtmalıyız. Windows\System dizini altındaki Regsvr32(Register Server) programının üzerine MP3play.OCX ini sürükleyip bırakın. Ekrana OCX’in kaydedildiğine dair bir mesaj gelecektir.

Şimdi Visual Basic penceresine geri dönüp kontrolü formumuza ekleyelim. Öncelikle çalınacak MP3’ün nerede olduğunu ‘Çalan parçanın ismi’ adlı yere yazıyoruz. (Örn:C:\MP3s\Deneme.MP3) Daha sonra Play butonunun click olayına şu kodu giriyoruz:

Private Sub Command3_Click()

MP3Play1.Open Text2.Text, " "

MP3Play1.Play

End Sub

Bu kodu girdiğimizde text2’ye yazdığımız parça açılıp çalınacaktır. Bunu bir CommonDialog kontrolü ile de yapmak mümkündür. Şimdi Pause butonunun click olayına şu kodları girin

Private Sub Command4_Click()

MP3Play1.Pause

End Sub

Bu kodu girdiğimizde Player’ın pause olayını da halletmiş oluyoruz. Son olarak Stop butonunun click olayına aşağıdaki kodu girin:

Private Sub Command2_Click()

MP3Play1.Stop

End Sub

Ve stop olayını da hallettikten sonra Player’ımız hazırlanmış oluyor. Şimdi süre yazan text kutusuna, çalan parçanın süresini yazabiliriz. Bunun için MP3play1.ActFrame olayına şu kodu girin:

Private Sub MP3Play1_ActFrame(ByVal ActFrame As Long)

Text1 = (ActFrame * MP3Play1.MsPerFrame) \ 1000

End Sub

Programımızı çalıştırdığımızda artık bir MP3 ile deneyebiliriz. İçerisinde ‘...’ simgesi bulunan text kutusunu da bir CommonDialog çağırmak için kullanabiliriz.

Yazının başında da anlattığım gibi Dialog Medien firmasının MP3Play kontrolü ücretli bir kontroldür. Kayıt etmediğiniz taktirde MP3lerin ilk 30 saniyesini çalabilmektedir. Şimdi anlatacağım ikinci yöntemle MP3lerin tamamını çalabileceğiz.

Windows Media Player’ın 6.x sürümünden itibaren Microsoft MP3’lere de destek verdi. Yani Windows Media Player Kontrolünü kullanarak da MP3’leri çalabiliriz. Öncelikle formumuza yeni bir Windows Media Player kontrolü ekleyin. Bu kontrol ile MP3leri çalmak için:

MediaPlayer1.Open "c:\MP3s\deneme.MP3"

şeklinde bir kod kullanabiliriz. MP3leri durdurmak için:

MediaPlayer1.Stop

MP3leri dondurmak için:

MediaPlayer1.Pause

kodlarını kullanabiliriz.

Bu ay basit bir MP3 Player’ın nasıl hazırlanacağını gördük. Gelecek ay OCX kullanmadan MP3’leri nasıl çalacağımızı, MP3 Player için nasıl bir Play List Editor oluşturacağımızı ve ID3 taglarının nasıl okunacağını anlatacağım. Gelecek ay görüşmek üzere...

Hakan Yamanoğlu

hakan_MP3@yahoo.com

the_passenger@kgg-tr.org

Delphi Kullanarak

Oyun Programlama -V-

Yeniden merhaba. Bu ay DGC Map Editör kullanmayı ve oluşturduğumuz map’i programlarımızda kullanmayı göreceğiz. Konumuza geçmeden önce DGC7 Beta versiyonunun çıktığını bir kez daha hatırlatmak isterim. DGC7 Beta versiyonunu http://www.ex.ac.uk/~PMBearne/

DGC.html adresinden temin edebilirsiniz.

DGC nin bu versiyonu DirectX 6 desteklemekte. Şu ana kadar pek incelemedim ama 16bit desteklemesi ilgimi çekti açıkçası. Ama hala eksiklikler var. Örneğin Map Editör de hala 16bit bitmap kullanılamıyor. Ama yakın zamanda bir kişi bunu yapacaktır. Eğer sabredemiyorsanız kendinizde bir Map Editör yapabilirsiniz.

Evet, İlk olarak DGC ile birlikte gelen Map Editör’ü kullanmayı öğrenelim. Nedir bu Map Editör, ne işe yarar? Map editörü kullanarak oyunumuzun arkaplanını oluşturabilir ve arkaplanı "scroll" edebiliriz, yani kaydırabiliriz. Buna en iyi örnek Mario oyunu olur sanırım.

Map Editörü çalıştırmak için Başlat*Programlar*DGC*Map Editor’den Map Editörü çalıştıralım. Menüden MAP seçeneğine gelip INSERT’ü seçelim. Karşımıza bir pencere çıkacak. Buraya Map ismi verdikten sonra haritamızın X ve Y uzunluğunu girelim. Bu bizim haritamızın boyutunu belirleyecektir.

Bu işlemden sonra haritamızda kullanacağımız Tile’ların bulunduğu image library dosyasını File*Open Image Library’den yükleyelim. Tile yani haritamızda kullanacağımız toprak, taş, ev gibi nesnelerin boyutu 16*16*256 renk veya 32*32*256 renk olmalıdır. Eğer büyük nesneleri sığdıramıyorsanız mecburen nesneyi 16*16 veya 32*32 boyutlarında bölmelisiniz. Map Editör’de bunları birleştirebilirsiniz. Map Editör hakkında daha fazla bilgi vermeyeceğim, çünkü kullanımı çok zor değil.

Evet artık hazırladığımız Map dosyasını nasıl kullanacağımızı görelim. Kondoplay grubunun bir üyesi olan Fatih Şahin arkadaşımızın yapmış olduğu Mario oyununu size parça parça vereceğim. Şu ana kadar gördüğümüz pek çok şey bu oyunda mevcut.

Formumuza TDGCScreen, iki adet TDGCImageLib, TDGCMapLib ve bir tanede Timer Component’i koyalım. TDGCScreen1 Component’inin ImageLibrary özelliğini DGCImageLib1, MapLibrary özelliğini MapLib1, TileLibrary özelliğini de DGCImageLib2’ye eşitleyelim. Görünüm açısından DisplayMode’u 3230*200 olarak ayarlayabilirsiniz.

DGCImageLib1’e oyunda kullanılan Sprite’ların bulunduğu *.iml dosyasını , DGCImageLib2’ye haritada kullanılan nesnelerin bulunduğu *.iml dosyalarını, DGCMapLib1’e de Map editörde oluşturduğumuz haritamızı ekleyelim. Timer1 nesnesinin Enabled özelliğini de False olarak değiştirelim. Artık kodlamaya başlayabiliriz.

unit marunit;

// Programlayan FATİH ŞAHİN

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

DGCMap, DGCILib, DGC, mmsystem, ExtCtrls;

const

yaratiksayisi=15;

ciceksayisi =10;

HIZ = 2;

yukselis:array[0..53] of integer=(-5,-5,-6,-6,-5,-5,-5,-4,-4,-4,-3,-3,-3,-3,-3,-3,-3,-2,-2,-2,-2,-2,-2,-1,-1,0,
0,0,0,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,4,4,4,5,5,5,6,6,5,5);

type

TForm1 = class(TForm)

DGCScreen1: TDGCScreen;

DGCImageLib1: TDGCImageLib;

DGCMapLib1: TDGCMapLib;

DGCImageLib2: TDGCImageLib;

Timer1: TTimer;

procedure DGCScreen1Flip(Sender: TObject);

procedure FormKeyPress(Sender: TObject; var Key: Char);

procedure DGCScreen1Initialize(Sender: TObject);

procedure UpdateTrack;

Procedure CheckLeft;

Procedure CheckRight;

Procedure CheckBottom;

Function CheckBottomTile(x,y :integer):boolean;

Procedure Checkup;

Function CheckupTile(x,y:integer):boolean;

private

{ Private declarations }

XPos,

PX,PY,

Speed,

anim,

AnimDir,

animcount,

kayma,

havacount,

yon : integer;

sira,sira1: integer;

dur,

dusus1,dusus2,

durus1,durus2,

durus3,

yukaritus,

yerde,

yukari1,yukari2,

havada,

yukselebilir,

dusebilir,

havadadurus : boolean;

counter,

kareno,

karesayisi,

yaratikx,

artis,

solyon,

sagyon,

yaratikyon :array[1..yaratiksayisi] of integer;

donus,yaratikvar : array [1..yaratiksayisi] of boolean;

cicekanim,cicekcount : array[1..ciceksayisi] of integer;

MapHold : Array[0..14, 0..199] of byte;

procedure CheckKeyboard;

procedure yaratikgoster(no,karakterx1,karakterx2,karaktery,baslangic : integer);

Procedure cicekanimate(no,x,y:integer);

procedure Animate;

Function CheckTile(X,Y : Integer):boolean;

procedure ShowIntro;

Procedure yuksel(a:integer);

public

{ Public declarations }

end;

var

Form1 : TForm1;

HumFreq : Array[0..3] of Integer = (11000,19500,26300,33100);

ShowTitle : Boolean = True;

ShowHelp : Boolean = False;

Quit : Boolean = False;

GameOver : Boolean = False;

implementation

Önümüzdeki ay kaldığımız yerden devam edeceğiz. Şimdilik hoşçakalın.

Kartal TURGUT

Kartaltr@superonline.com

mr_eagle@hotmail.com

C++

C++ Dinamik Bellek Yönetimi uygulamalarında dikkat edilmesi gereken noktalara devam ediyoruz: Bu ay doğrudan Dinamik Bellek Yönetimi ile ilgili olmasa da, yine de onun eksik uygulanması sonucunda ortaya çıkan ve "operator overloading" kullanılan class’larda dikkatsiz bir programcının başını ciddi biçimde belaya sokabilecek bir tuzaktan söz edeceğiz: Varsayalım ki oluşturacağınız class’in içinde "assignment" operatörünü (=) overload etmek istiyorsunuz. class’inizin içinde de, yaygın olarak rastlandığı gibi, "data member" olarak bir "pointer" bulunuyor. Bunu kod olarak şöyle deklare edebiliriz:

class Eleman {

public :

Eleman(int _KimlikNo, const char * _Isim);

//constructor fonksiyon

~Eleman ();

// destructor fonksiyon

Eleman& operator=(const Eleman& Yeni);

// assignment operator overloader fonksiyonu

private:

int KimlikNo;

char * Isim;

// pointer data member; constructor icinde new ile initialize edilecek

};

Şimdi yukarıda deklare ettiğimiz "operator overloader" fonksiyonun yanlış ama öğretici bir tanımlanmasını görelim.

Eleman& Eleman::operator= (const Eleman& Yeni)

{

KimlikNo = Yeni.KimlikNo;

delete [ ] Isim;

// pointer data member yok edildi, simdi yeni bir bellek adresi ataniyor

Isim = new char [ strlen(Yeni.Isim) + 1 ];

strcpy(Isim, Yeni.Isim);

// a = b = c = d gibi zincirleme assignment’lerin yapilabilmesi icin yeni nesneye bir referansin

geri donus degeri olarak verilmesi sarttir

return *this;

}

Peki bu fonksiyon tanımlamasındaki hata nerede? Geri dönüş değeri de dahil olmak üzere her şey tamam gözüküyor, öyle değil mi? İşin aslı bu fonksiyon tanımlaması bir çok uygulamada işinizi görecektir de, ama eğer uygulamanızda alias kullanımına yer veriyorsanız bu tanımlamayı kullanmak büyük bir hatadır. Aşağıdaki örneğe bir göz atalım.

Eleman SatisMemuru;

Eleman & Satis = SatisMemuru;

Artık Satis, SatisMemuru nesnesi icin bir "alias", yani ikinci bir addan başka bir şey değildir. Bu kafa karışıklığı yaratsa da kimi zaman kullanılan bir yöntemdir. Fakat aşağıdaki satır her şeyi mahveder.

SatisMemuru = Satis;

Önce bu deyimin zararsız olduğu düşünülebilir. Ama Eleman class’ının nesneleri için overload edilmiş olan assignment operatörünün yeni tanımına baktığımızda sorun anlaşılır. Şöyle ki, bu fonksiyon tanımlanırken sol taraftaki nesnenin pointer data member’i tamamen yok edilmiş, ama bu işlem yapılmadan önce sol taraftaki nesneyle sağ taraftaki nesnenin eş (identical) olup olmadığına bakılmamıştır. Oysa yukarıdaki assignment’te Satis, yalnızca bir alias olduğundan kendine özgü bir bellek adresi yoktur. Yani "delete [ ] Isim;" deyimi aslında aynı anda hem Satis hem de SatisMemuru nesnelerini etkilemektedir gibi düşünülebilir. Elbette pointer data member yok edildikten sonra fonksiyon tanımı içinde daha sonra geçen

Isim = new char [ strlen(Yeni.Isim) + 1 ];

fonksiyonunun ne gibi sakıncalar doğuracağını söylemeye gerek yok. Belki de çok ufak gibi görünen ve bu yüzden gözden kaçan bir olasılık, basit bir assignment işlemini bile bütün bir veriyi yok eder konuma sokmuştur. Oysa overloader fonksiyonun tanımının hemen başında kullanılacak olan bir "if (Isim != Yeni.Isim)" deyimi bütün bu sorunu ortadan kaldırırdı.