DELPHI'DE ŞARTLI CALIŞMA VE BLOK KONTROL İŞLEMLERİ


IF THEN KONTOL DEYİMİ= İstenilen şartın gercekleşmesiyle, şarta bağlı olan kodlar işletilir. Ne dediğimi şimdi anlarsınız If-then deyiminin kalıbı şoyledir.

If Şart Then
begin
.
.
end
else //-> Şuanlık kullanmayacağız.
begin
.
.
end;

Ornek: Yazdığımız programda bir butona tıklanıldığında daha once vediğimiz şifrenin doğru olup olmadığını soylesin. Şifre abc123 olsun. Buton'umuz icin yukarıda bulanan Standart sekmesinde OK yazan dikdortgen şeklindeki butona tıklayın ve daha sonra başka hic bir
yere tıklamadan direk formun uzerine tıklayın. Formun uzerinde bir buton oluştuğunu goreceksiniz. Bu butonun uzerine cift tıklayın, ve onunuze kod penceresi gelecektir.

procedure TForm1.Button1Click(Sender: TObject); //-> Buton1 tıklanıldığında buna ait olan kodlar calışacak.
begin //-> Kodların yazılması icin bunun yazılması şarttır. Kodların artık başladığını belirtir.

end; //-> Buna en yakın begin hangisiyse, o begin ile buradaki end arasındaki kodlar son bulmuş anmanıa gelir. Begin gibi bunun da yazılması gerekir.

end. //-> Buradaki end'le bundan onceki end'i karıştırmayın. Buradaki end ise programın tamamiyle son bulduğunu anlatır. Ve dolaylı olarakta projede sadece ve sadece 1 kez ve en sonda olarak kullanılır. Birisinin sonu ";" ile birisinin sonuda "." ile biter.

procedure TForm1.Button1Click(Sender: TObject);
begin //-> Başlıyoruz.
If Edit1.Text='abc123' then //-> Eğer ki Edit1'in icinde abc123 kelimesi yazıyorsa (veya icideki abc123'yazısına eşitse) bunları işle...
ShowMessage('Şifre Doğru'); //-> Şifre doğruysa ekranımıza Şifre Doğru diye bir mesaj cıkartacak.
end; //-> Button1 tıklanıldığında yapacağı gorevler boylece bitiyor.
end. //-> Program sonu.

Birde if-then kontrol'une ek olarak bir deyim daha kullanılır bu da else'dir anlamı: değilse? Sart gercekleşmez ise?

procedure TForm1.Button1Click(Sender: TObject);
begin //-> Başlıyoruz.
If Edit1.Text='abc123' then //-> Eğer ki Edit1'in icinde abc123 kelimesi yazıyorsa bunları işle...
ShowMessage('Şifre Doğru') //-> Şifre doğruysa ekranımıza Şifre Doğru diye bir mesaj cıkartacak.
else -> //-> Ya edit'in icinde abc123 yazmıyorsa?
ShowMessage('Şifre Yanlış'); //-> Bu sefer Şifre Yanlış diye bir mesaj karşımıza gelecek.
end; //-> Button1 tıklanıldığında yapacağı gorevler boylece bitiyor.
end. //-> Program sonu.

Burada dikkat etmemiz gereken birkac nokta var onlara deyineyim. Her kod satırının sonuna ; gelmelidir. Bunun anlamı o satırdaki
kodun artık sona erdiğini ve dolaylı olarak bundan sonraki kodun işleyeceğini belirtir. Siz şimdi diyeceksiniz ki programa else
eklediğiniz zaman ShowMessage('Şifre Doğru'); buradaki ; kalktı niye? Bunun anlamı demiştik ; o satırdaki kodları bitirir. Ama aslında burada kodlar bitmiyor halen devam ediyor. yani else If Edit1.Text='abc123' then komutunun bir parcası ve ondan once bir ; gelirse bu onun işleyişini engelleyecektir. Bu da onun anlamsız yere yazıldığı anlama gelecektir, ve program hata verektir. Deyinmek istediğim
başka bir konu ise Edit1.Text='abc123' burada abc123'un başına ve sonuna niye '(tırnak) işareti geldiğidir. Bunun sebebi abc123 bir string'dir yani bir karekter katarıdır. Mesela oraya '123' yazsaydınız bu bir rakam değil sadece yazı olcaktı eğer ki sadece 123
yazsaydınız rakam olacaktı. Niye boyle olmak zorunda olduğunu soracak olursanız belli bir zaman gectikten sonra, bunu sizde olmazsa olmaz olarak kabul edeceksiniz. Şimdi gelelim bir sonraki blok-kontrol deyimine...


CASE OF DEYİMİ= Herşeyi ile if-then deyimine benzemektedir. Bazı zamanlarda if-then'den daha pratiktir. İc ice gecmiş bir if-then deyimleri gibidir. Fakat pratik olmasının sebebi defalarca if-then deyimini yazmak yerine bir tek komutla hepsini birden kontol
etmeği sağlamaktadır. Kalıbını yazmadım aşağıdaki ornekte acıkca belli.

Ornek: Bu programda ise bir butona tıkladığımızda edit1'de yazdığımız notumuzu, bizim zayıf orta gibi durumumuzu soyleyen bir mesaj cıkarsın...

procedure TForm1.Button1Click(Sender: TObject);
var //-> Değişken yazmak icin kullanır. Bu koddan sonra değişkenler atanmaya başlar.
notum : integer; //-> notum isminde bir tamsayı(integer) değişkeni atıyoruz. Sadece icirisinde sayı tutabilir. Bu değişkenleri Değişik branşlardaki oğretmenler gibi duşune bilirsiniz. Hepside farklı farklı işler yapar. Ve biz ona gore onun dersinden faydalanırız. Mesela yukarıda bir string'den bahsetmiştim, bu da bir değişkendir ve icerisinde yazı katarları tutabilir. Ne istiyorsak ona gore değişkenimizi
doğru belirlemeliyiz. Aksi taktirde program abuk sabuk işlemler yapar veya hata verip calışmaz bile. Neyse konuya donelim.
begin //-> Başıyoruz.
notum:=strtoint(Edit1.Text); //-> İşte burası cok onemli buradaki notum'un sadece rakamları tutabileceğini oğrenmiştik. Fakat edit'in icinde hic bir zaman rakam değil yazı vardır. Edit icine yazdığınız rakamlar rakam gibi gozuksede aslında onlar bir rakam değildir daha
once dediğim gibi onlar bir string(karakter katarı)dir. İşte bundan dolayı notum bir rakam edit1.text(edit'in icindeki yazı) bir yazıdır. Bundan dolayı Edit1.text'in icinde yeralan rakamları gercektende birer rakam yapmamız gerekiyor. Yukarıda olduğu gibi Edit1.text'i iki parantez icine almak zorundayız (). Ve daha sonra bunu strtoint ile string'den integere cevirmeliyiz. Yani yazıdan rakama. Zaten adı uzerinde String to Integer, StrToInt olmuş. Bunu tam tersi ise IntToStr'dir. Peki bu ne demektir duşunun bakalım? Sonuc olarak birini
birine mutlaka benzetmeliyiz aksi takdirde elma ile armut toplanmaz. Program gereyi yazıdan karaktere doşturmek zorundayız.
Case notum of //-> notum değişkeni attakilerden hangisine eşitse onu yap.
0..44: Showmessage('Zayıf Not Aldınız'); //-> Eğer Edit'de 0 ile 44 arası bir rakam girilmişse Zayıf not aldınız diye bir mesaj kutusu cıkar. Diğerleride aynısı.
45..59: Showmessage('Başarısız Not Aldınız');
60..69: Showmessage('Orta Not Aldınız');
70..84: Showmessage('İyi Not Aldınız');
85..100: Showmessage('Pekiyi Aldınız tebrikler!');
else Showmessage('Lutfen 0 ile 100 arası bir not girin'); //-> Eğerki girdiğiniz sayı 0 ile 100 arası değilse bu mesajı cıkartıyor. Zaten 0 ile 100 arası bir rakam olsaydı coktan yukarıdakilerden biridi uygulamıştı.
end; //-> Case-of deyimini sonlandırıyor.
end; //-> Buton Basıldığında yapacak olduğu işler artık bitti. İlk baştaki begin ile en sondaki end; i yazmanıza gerek yok zaten Delphi onları kendisi koyar.

Yukarıda anlattığım gibi, eğer Case-of kullanmasaydık her durum icin yani 0 ile 44, 45 ile 59 vs.. farklı farlı diyecektik ki şunla şunun arasındaysa şunları yap, şunla şunun arasındaysa şunları yap gibi bir cok if-then deyimi kullanacaktır. Başlangıcta pratik dememin
sebebi buydu. Ornekte maksimum ve minumum sayılar yanlış olabilir cunku %85'inde yazılılardan 5 alıyorum da soylemesi ayıp.
Neyse bir sonda ki...


FOR TO DO DONGUSU= İcerisindeki komutları istenilene gore tekrar tekrar işler. For-to-Do dongusu kalıp olarak şoyle kullanılır.

For başlangıc değeri to bitiş değeri Do
Begin
.
.
end;

Ornek: Programı yazamaya başlamadan once yukarıdaki Standart sekmesinden ListBox(Liste kutusu) isimli bileşeni formun uzerine yerleştirin. Bu arada butun orneklerimizde bir tana buton kullanıyoruz. Her zamanki gibi onuda koymayı unutmayın. Bu programla
verilen sayılar arasındaki sayıları ListBox'a ekleyeceğiz.


procedure TForm1.Button1Click(Sender: TObject);
var
ilkdeger : integer; //-> Tam sayı değişkenimiz.
begin //-> Başlıyoruz.
For ilkdeger:=1 to 20 do //-> 1'de başlayarak bu komutları 20 kere tekrarla eğer i'ye 5 verseydik 5'den başlayacaktı yani bu olayı 15
kere tekrarlayacaktı. Burada bilmeniz gerek onemli bir husus daha var fakat bunu biraz sonra acıklayayım.
begin //-> Dongunun başlangıcı.
ListBox1.Items.Add(inttostr(ilkdeger)); -> Burayla uzun bir sure ilgileneyim. Bu komut "ilkdeger" integer'ını her seferinde her seferinde listbox(liste)a ekliyor. peki bu nasıl oluyor. Şimdi programın en başına donelim for-to-do dongusunun başlagıc değerini 1 olarak
atamıştık. ve progarmımız geldi geldi geldi. İlk değerimiz o anlık 1'di ve Listbox'a 1'i yazdı. Daha sonra dongu tekrar başa dondu bu sefer başlangıcı (bir anlamıda sayac deniliyor, counter) 1 arttıdı ve sayacımız 2 oldu ve geldi geldi geldi Bu sefer sayac yani ilkdeger 1 arttırılıp
2 olduğu icin Listbox'a bu sefer 2 eklendi. Bu boyle devam edecek. Fakat nereye kadar? Tabiki 20'ye kadar cunku dongunun bitiş
noktasını 20 olarak daha once belirlemiştik. Sonuc olarak program Listbox'a 1'den 20'ye kadar sıralayacak.
end; //-> For-to-Do dongusu sona eriyor.
end; //-> Button1 tıklanıldığında yapacağı gorevler boylece bitiyor.
end. //-> Program sonu.

Birde if-then dongusundeki else gibi for-to-do 'nun bir bir de break diye bir deyimi vardır. Bunu da Donguyu onceden neler yapacağını ne kadar devam edeceğini belirtiyorduk, bu komut ile istenilen zamanda daha donunun işi bitmeden donguden cıkılabilinir. Mesela
dongunun icine bir if-then şartı koyarsınız eğer dongu işlenirken bu şarta uyulduğu gorulduyse ve if-then şartının icinde de break
komutu yer alıyorsa o şarta bağlı olarak dongu icerisinden cıkılmış olur. Başka bir konu ise For ilkdeger:=1 to 20 do 'da ortada bulunan
to eğer downto olarak değiştirilirse bu sefer geriye doğru sayım yapılır. Mesela bu sefer 100'de 20'ye kadar sayar. Yani dongu 80 kere donmuş olur. Gelelim bir sonraki donguye...


WHILE DO DONGUSU= Bu dongu aslında For-to-Do dongusunun tıpatıp aynısıdır. Tek fark while-do dongusunde onceden bir başlangıc
veya bitiş boktası gibi kısıtlamalar yoktur. Yani bu dongunun icerisindeki şart gercekleşmediyi surece dongu sonsuza kadar surecektir. Kalıbı şoyledir.

While koşul1 do
begin
.
.
if koşul2 then
Break; //-> Yukarıda anlaşıldığı gibi, koşul2 gercekleşmedikce dongu devamlı donecektir.
end;
__________________