Delphi Konuları -Şartlı Çalıştırma Deyimleri

"Squ4LL

Özel Üye
14 Tem 2009
14,316
592
Programlar normalde satır satır çalışırlar. İstenirse belirli şartlar aranarak programın bir kısmının çalıştırılmasını veya çalıştırılmamasını sağlayabiliriz.

IF YAPISI :

if şart yapısı bütün programlama dillerinde olan, bazı şartların gerçekleşmesi durumunda ve gerçekleşmemesi durumunda ayrı ayrı kodların çalıştırılmasına imkan veren yapıdır.

if Şart Then
komutlar // noktalı virgül yok
else
komutlar; // noktalı virgül var

Şartın gerçekleşmesi halinde Then deyiminden sonraki satır işletilir. Gerçekleşmemesi durumunda ise Else deyiminden sonraki satırlar işletilir.

Eğer şartın gerçekleşmemesi durumunda istenirse else bloğu yazılmayabilir.


if Şart then
Komutlar; // noktalı virgül var
// end; yok
Yalnız dikkat komutlar kısmı birden fazla komut içeriyorsa Begin End deyimleri kullanılmalıdır.
Tek satırlık ifadelerde begin - End deyimi genelde kullanılmaz.

İf Şart Then
Komut // noktalı virgül yok
Else
Komut; // noktalı virgül var

// end; yok

Burada yine dikkat if şart then satırının altındaki komut dizesinde ; noktalı virgül kullanılmamıştır.
Else den sonraki komut dizesinde kullanılmıştır.

Birden fazla satır kullanılacaksa begin -end deyimleri kullanılır.


if şart then
begin

komut1;
komut2;
.......
end
else
begin

komut1;
komut2
.....
end;

ÖRNEKLER ;

1. Edit1.Text kutusu olsun formumuzda ve bu Edit1.Text kutusuna değer girilerek sorgu yapılması isteniyor. Ancak kullanıcı bir değer girmedi diyelim.
Kod:
begin
if Trim(Edit1.Text)="" then // Eğer Edit1 kutusunda bilgi yoksa boş ise trim boşluk atmak için space boşluk tuşuna basmışsa onu yok sayması için.
ShowMessage('Sorgu için gerekli bilgi girilmemiş');
end;


Kod:
var
deger:string;
begin
deger:=Trim(Edit1.text); // Edit1.Text e bir değer girmesi isteniyor ve ona göre yönlendirme yapılacak diyelim
if deger='1000' then
Form2.Show
else
Form3.Show;
end;



2. Örnek : Tek satırlı şart örneği -> Kısayol fonksiyon tuşları
Formda DBGrid olsun ve burada iken kullanıcı entere basınca ilgili kayıt başka forumda görünecek olsun.
Button1 e tıklamadan F2 fonksiyon tuşuna basarak Button1 in onclick özelliğine yazılan kodlar çalışsın.
Bunun için Formun FormKeyDown olayına şu kodları yazarız. (Object Inspectorden,Formun Key Preview özelliği true yapıyorsunuz )

Kod:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_RETURN then
DBGrid1.OnDblClick(nil);
if Key=VK_F2 then //yeni
Button1.OnClick(nil);
if Key=VK_F9 then // Kaydet
Button2.OnClick(nil);
if Key=VK_F4 then
Button5.OnClick(nil); // Sil
end;



3. Örnek : Tek ve çok satırlı şart örneği
rehber adlı (mdb) veritabanı içinde de kisiler adlı table.
İki adet form, form1 de dbgrid1 ADOTable1,
Form2 de panel1 ve üzerinde kişisel kayıt için gerekli dbeditler, panel2 ve üzerinde Ticari kayıtlar için dbeditler. PAnellerin visible özellikleri False.
Tablemizde KAYIT fieldimiz olsun. KAYIT fieldinin mevcut değerine göre bu panelleri göstereceğiz kullanıcı da ona göre kayıtları incelesin veya değiştirsin. Yani kayıt kişisel ise kişisel kayıtlar olan panel görünsün yok ticari kayıt ise ticari kayıtların olduğu panel görünsün. Arkadaşım öğrenci ne diye ticari bilgiler görünsün. arkadaşım tüccar her iki bilgileri de var görünsün. gibi.
Değerleri belirtelim KAYIT 1 ise kişisel, KAYIT 2 ise Ticari , KAYIT değeri 3 ise iki panelde görünsün.

Önce ADOTablemiz aktif mi değilmi onu kontrol etmemiz lazım. Eğer aktif ise şart gerçekleşecek, değilse mesaj verecek.

Şart gerçekleşirse, Birden fazla komut olacağı için uygulayacağımız şablon;
if ADOTable1.Active=True then
begin

komut1;
komut2;
end
else
begin

end;


Şimdi DBGrid in ondblclick özelliğine şöyle bir kod yazalım.
Kod:
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
if ADOTable1.Active=True then
begin // şart gerçekleşirse Birden fazla komut satırı olacak
Form2.Show;
if ADOTable1.FieldValues['KAYIT']='1' then
Form2.Panel1.Visible:=True; // Tek satır
if ADOTable1.FieldValues['KAYIT']='2' then
Form2.Panel2.Visible:=True; // Tek satır
if ADOTable1.FieldValues['KAYIT']='3' then
begin // Birden fazla satır
Form2.Panel1.Visible:=True;
Form2.Panel2.Visible:=True;
end;
end
else
begin
ShowMessage('Kayıtlar aktif değil');
Abort;
end;
end;


CASE:
Bir değişkenin aldığı bir çok değere göre ayrı komutların çalıştırılması gereken durumlar için if yapısını kullanmak yerine CASE yapısını kullanmak daha avantajlıdır.

Case değişken of
durum1:Komutlar;
Durum2,Durum3:Komutlar;
Durum4..Durum7:Komutlar;
.....
Durum N:Komutlar;
Else Komutlar;
End;


Burada Değişken parametresi ile belirlenen değişkenin aldığı duruma göre DurmN değerinin karşısındaki komutlar işleme girer. Eğer değişkenin değeri durumlardan hiçbirine uymuyorsa Else kısmındaki komutlar çalışacaktır.

1. ÖRNEK: Kritere göre arama örneği
Veritabanımız da öğrencilere ait ogrenci tablemiz olduğunu varsayalım.
Formumuzda DBGrid ve ADOTable1 veya ADOQuery1 olsun.
Yine Bir Adet ComboBox1 ve items TStrings (Object Inspectorden) özelliğine tıklayarak;
Öğrenci No ya göre ara
İsme Göre Ara
bilgilerini giriniz.
Bir Adet Edit1.Text ve birde button yerleştirelim.
ComboBox1.Text bileşeninden seçilen veriye göre Edit1.Text kutusuna klavyeden veri girerek ara isimli Button1 e tıklama sonucu işlem gerçekleşecektir.


Kod:

procedure TForm1.Button1Click(Sender: TObject);
begin
Case ComboBox1.ItemIndex of
0:ADOTable1.Locate('OGNO',Trim(Edit1.Text),[loPartialKey,loCaseInsensitive] );
1:ADOTable1.Locate('ADI',Trim(Edit1.Text),[loPartialKey,loCaseInsensitive]);
else
ShowMessage('Lütfen Bulmak İstediğiniz Veriyi Kritere Göre Giriniz');
Edit1.Text:='';
Edit1.SetFocus;
end;
end;


Burada ComboBox1 items TStrings özelliğine yazılan veriler line yani satır satır yazılır. Satırlarda 0 (sıfırdan) başlayarak girilen veri miktarınca devam eder. Case ile yapılan iş ise ComboBox1 içerisindeki verilerin hangisi seçilirse bu satır numarasına göre işleme alınacağıdır. Bunuda ComboBox1.ItemIndex ile sağlıyoruz. Yani kullanıcı diyelim ikinci satırdaki veriyi seçti. itemindex i 1 (bir) Case 1 (bir) nci durumdaki komutu icra edecek. Oradaki yazılan yazının case ile bir ilgisi yoktur ama kullanıcı 1 rakamının neye karşılık geleceğini bilemeyeceği için kolaylık olduğunu bilelim.

Not :

locaseInsensitive kullanılırsa , aranan ifadede büyük küçük harf ayrımı yapılmaz.
loPartialKey kullanılırsa aranan ifade ile başlayan kayıtlar aranır.

2. Örnek :
Aşağıdaki örnekte sınav numarasına ve grup numarasına göre oluşturulmuş mysql veritabanınındaki table adını tespit ediyor ve ona göre bağlanıyoruz.
Kod:
procedure TOSS.ORDBGrid2DblClick(Sender: TObject);
var
ney:string;
grb:string;
secimD,secimDx:integer;
begin
if qoss1.Active=True then
begin
ney:=qoss1.fieldByName('SNVNO').AsString;
grb:=qoss1.fieldByName('GRBNO').AsString;
secimD:=length(ney);
Case secimD of
//grb0001_snv0005_sinav
1:ney:='000'+ney;
2:ney:='00'+ney;
3:ney:='0'+ney;
4:ney:=ney;
end;
secimDx:=length(grb);
Case secimDx of
//grb0001_snv0005_sinav
1:grb:='000'+grb;
2:grb:='00'+grb;
3:grb:='0'+grb;
4:grb:=grb;
end;
qoss2.Close;
qoss2.SQL.Clear;
qoss2.SQL.Add('select * from grb'+grb+'_snv'+ney+'_sinav');
qoss2.Open;
if not qoss2.IsEmpty then
begin
qoss2.Open;
end
else
begin
qoss2.Close;
ShowMessage('Seçili Sınav Listesinde Kayıt Bulunamadı');
Abort;
end;
Pagecontrol1.ActivePageIndex :=1;
end;
end;


Sınav listelerinin bulunduğu bir tablemiz ve her sınav yapıldıkça oluşturulan sınava girmiş kişilerin listesi,sonuçları gibi değerlerin tutulduğu ikinci bir tablemiz.
Önce sınav listesi tablesinden sınav no ve grupno yu alıyoruz. string değişken olarak atadığımız tiplere aktarıyoruz.
grb0001_snv0005_sinav -> grb den sonraki 0001 dört basamaktan oluşmuş sınav grubu için , snv0005 ise yine dört basamaklı sınav nolar. Yani Lise grubunun 2 nci sınavı dediğimiz zaman Lise grbunun kodu da 5 ise grb0005_snv0002_sinav tablemiz bu şekilde oluşturulmuş gibi...
Bizde bilmiyorsak hangi tableye bağlanacağımızı nasıl bağlanacaz.
Demeyin böyle bir durum olurmu diye, büyük kuruluşlarda bu tip programlar kullanılıyor.

Yapacağımız olay sınav listesindeki sınav no ve sınav gruplarının kaç basamak olduğunu tespit ederek bu basamaklara göre ilgili table adını yukarıda görüldüğü gibi çıkartırız.

case için gerekli olan secimD,secimDx:integer; değişkenimizi tanımladık.
secimD:=length(ney); komutu ile sınav listesi tablesinden sınav noyu aldık ve basamak sayısını buluyoruz. length() fonksiyonu ile.

Artık başlayabiliriz,

Kod:
Case secimD of
//grb0001_snv0005_sinav
1:ney:='000'+ney;
2:ney:='00'+ney;
3:ney:='0'+ney;
4:ney:=ney;
end;

Görüldüğü gibi kaç basamaklı gelirse gelsin sınav noyu tespit etmiş olduk ,
Aynı şekilde de sınav grubunu tespit ediyoruz.
Kod:
secimDx:=length(grb);
Case secimDx of
//grb0001_snv0005_sinav
1:grb:='000'+grb;
2:grb:='00'+grb;
3:grb:='0'+grb;
4:grb:=grb;
end;

Ve artık ilgili tableye bağlanıp verileri alma zamanı;
Kod:
qoss2.SQL.Add('select * from grb'+grb+'_snv'+ney+'_sinav');
Artık işlemler istediğiniz gibi elinizde....

 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.