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.