Kayıt
21 Kasım 2007
Mesajlar
3.038
Beğeniler
0
2zew9bl.png


:idea: :idea: Delphi Konuları Prosedür ve Fonksiyonlar :idea: :idea:

Prosedür ve fonksiyonlar program kodlarının modüler kısımları olup özel görevler üstlenirler. Bunlar aynı zamanda " Altprogram" olarak ta bilinirler.
Prosedüre ve fonksiyonlar nesnelerle birlikte kullanıldığı zaman Methods adını alırlar.
Fonksiyon, Procedure'den farklı olarak geriye bir değer gönderebilir.Bu değer gönderme işlemi fonksiyon ismine geri dönecek değerin atanmasıyla olur.


PROSEDÜR

Bir prosedür şu şekilde tanımlanır.

Procedure ProsedürAdı (GirişParametreleri:Tipi);
Sabit,değişken, Tip tanımı
begin
Program Kodları;
End;


Prosedür Adı:Prosedüre verilecek addır. Prosedür bu isim kullanılarak tanımlanır. Değişken tanımı için geçerli olan kısıtlamalar bu ad içinde geçerlidir.

Giriş Parametreleri :Prosedüre, çağırıldığı yerden gönderilen bilgilerdir. Araya virgül konarak birden fazla giriş parametresi tanımlanabilir. Parametrenin tanımından sonra o parametrenin tipi iki nokta işaretinden sonra belirtilir.

Sabit, değişken,Tip tanımı :Prosedürenin kullanılacağı değişkenler, sabitler veya tipler bu blokta tanımlanır. Bu blokta tanımlanan değişkenler local değişkenlerdir. Yani bu değişkenleri sadece prosedür kullanabilir.


Program kodları :Bu kısımda prosedürün yapması gereken işi belirleyen kodlar bulunur.

Procedure içerisine değer göndermek ve/veya procedure içerisinde hesaplanan bir değeri dışarı göndermek için parametre kullanılır. Parametre tanımlamasını aşağıdaki gibi gösterebiliriz.


PROCEDURE ProcedureAdı([Var]deg1[deg2,...]:Tip[;......]);

Bu tanımlamada [ ] içerisine yazılan ifadeler zorunlu değil anlamındadır. Değişkenlerin değer alma ve değer gönderme işlemleri iki farklı şekilde gerçekleşir. Sadece değer alan değişkenler tek taraflı, hem değer alan hem de değer gönderen değişkenler ise çift taraflı çalışan değişkenlerdir.

Değişken isminden önce VAR tanımlama komutunun kullanılması durumunda belirtilen değişkenler çift taraflı olarak çalışırlar. Yani procedure içerisine hem değer alır hemde procedure' den çıkışta dışarıya değer gönderir. Bir VAR komutunun etkisi kendisinden sonra gelen ilk (:wink1: işaretine kadardır. Çift taraflı olarak çalışan değerlere karşılık mutlaka değişken kullanılmalıdır. Çünkü procedure içerisinde değişkenin alacağı son değer dışarı gönderilecek ve bilgi ise ancak bir değişkene aktarılabilir. Tek taraflı çalışan değişkenlere hem değişken hem de sabit değer aktarılabilir. Tek taraflı değişkenin procedure içerisinde aldığı son değer geri gönderilmez, procedure içerisinde kalır.

Çift ve tek taraflı olarak çalışan değişkenleri göstermek için bir kaç örnek yapalım.


Tek taraflı çalışan procedure örneği:

Procedure Toplam(x,y:integer);

// şimdi hatırlayalım: Procedure diye başladık, Toplam diye procedure adını yazdık, değişken tanımladık(x,y),tipini belirlemek için (:) işaretini koyduk ve tipini yazdık (integer).

Devam edelim, delphi yi açalım, forma 3 adet Edit.Text, 2 adet Label, 1 adet Buton koyalım.


Sıralama şu şekilde;

Edit1.Text +(label1 in captionuna artı işareti koyun)Edit2.Text =(label2 nin captionuna eşittir işareti koyalım) Edit3.Text
Alta da Buton1 koyalım.

Formumuzun unitine gelelim.(kodun yazıldığı kısım). Orada private public yazan kısmı bulun. Private yazan kısıma yazacağınız procedure, değişken vb. Bu unit içerisinde kulanılır (lokal). Public kısmına yazılanlar ise diğer formlardan da kullanılabilir yani global. Biz bu form içerisinde kullanacağımız için proceduremizi private kısmına yazalım şu şekilde;


Kod:
procedure toplam(x,y:integer);

private
    { Private declarations }
procedure toplam(x,y:integer);

  public
    { Public declarations }
    end;
Daha sonra {$R *.dfm} yazan kısımın altına procedure mizi yazalım.Aşağıda ki gibi.

Kod:
var
  Form1: TForm1;
implementation

{$R *.dfm}

procedure TForm1.toplam(x,y:integer);
begin
sonuc:=x+y;
end;
sonuc:=x+y; x ve y değişkenlerine verilecek olan değerleri toplama işaretini kullanarak sonuc değişkenine aktarıyoruz.

Burada programı çalıştırdığınızda sonuc yazan yerde hata vercektir çünkü tanıtmadık. Delpi diyecek ki; Tanıyamadım bu kelimeyi kimdir bu tipi nedir? (Undeclared Identifier)


Tamam dedik tanıtacağım sana şimdi;

Kod:
procedure TForm1.toplam(x,y:integer);
var
sonuc:integer;
begin
sonuc:=x+y;
end;
Diyelim var (değişken tanımlayacağım) sonuc:integer; dedik tanıttık. Şimdi delphi ne yapacağını biliyor.
x ve y değişkenine verilecek integer değerleri + işareti gereği toplayacağım ve sonuc değişkenine aktaracağım dedi.

Şimdi de kullanımını görelim.
Formumuza dönüp Button1 e tıklayalım ve yazalım. Önce Edit1 ve Edit2 ye girilecek değerleri kontol edelim. Eğer boş geçerse uyaralım.
Hatırlatma:
(Bu arada Trim fonkisyonunu boşluk tuşuna basarsa boşluğu silsin için kullanıyoruz.)


StrToIntDef -> String (karekter dizisi) i integer tipine çevir. Def ise default değer, yani hiç bir şey girilmezse belirtilen değer gir.
StrToIntDef(Edit1.Text,0) virgülden sonra sıfır değeri girdik görüldüğü üzere.
Delphi de sayısal değişkenleri stringlere atamadan önce tip değiştire işlemini yapmak zorundasınız.
VB de string bir özellik olan Text özelliğine bir sayı direkt olarak atanabilir. Ancak Delphide bu mümkün değildir.
IntToStr ->Tam sayıyı stringe çevirir.
FloatToStr -> Reel sayıyı stringe çevirir.
StrToInt -> Stringi tam sayıya çevirir.
StrToFloat -> Stringi reel sayıya çevirir.


Kod:
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Trim(Edit1.Text)<>'') and (Trim(Edit2.Text)<>'') then // Editler boş değilse
begin
sayi1:=StrToIntDef(Edit1.Text,0);
sayi2:=StrToIntDef(Edit2.Text,0);
toplam(sayi1,sayi2);
Edit3.Text:=InTtoStr(sonuc);
     end
     else
     begin
    ShowMessage('Eksik Veri Girişi');// Eğer Edit lere veri girilmemişse uyarı mesajı
    Edit1.SetFocus; // mesajın sonunda Edit1.Text kutusu içinde kursoru hazır beklet.
    Abort; // işlemi durdur. //Bunu yazmazsanız Edit1.SetFocus; işlemi için hata mesajı alırsınız.
     end;
     end;
Diyelim Button1 in onclick events inde yukarıdaki kodu gördük. Çalıştırdığımızda yine hata alacağız. Delphi diyecek ki; Hoppala şimdide sayi1,sayi2 (Undeclared Identifier) mesajı ile uyaracak sizi. Hatta sonuc içinde aynı mesajı verecek. sonuc için neden bu hata mesajını versin ki yukarıda tanımlamıştık.
İşte göstermek istediğim buydu. sonuc değişkenini tanımladığımız yer sadece lokal tanımladık. Yani yazıldığı yerde kullanılır. O zaman global olarak tanımlayalım unitin içerisinde her yerden kullanabilelim. Hatta sayi1,sayi2 değişkenlerinide global tanımlayalım ve unitin her yerinden kullanabilelim. Aşağıda görüleceği üzere private, public kısımlarının altında var ile başlayan bölüme yazıyoruz. Bu global değişkenlerimizi. Kontrolleriniz yapabilirsiniz.


Artık çalışan kodlarımız aşağıda.

Kod:
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Trim(Edit1.Text)<>'') and (Trim(Edit2.Text)<>'') then // Editler boş değilse
begin
sayi1:=StrToIntDef(Edit1.Text,0);
sayi2:=StrToIntDef(Edit2.Text,0);
toplam(sayi1,sayi2);
Edit3.Text:=InTtoStr(sonuc);
     end
     else
     begin
    ShowMessage('Eksik Veri Girişi');// Eğer Edit lere veri girilmemişse uyarı mesajı
    Edit1.SetFocus; // mesajın sonunda Edit1.Text kutusu içinde kursoru hazır beklet.
    Abort; // işlemi durdur. //Bunu yazmazsanız Edit1.SetFocus; işlemi için hata mesajı alırsınız.
     end;
     end;
Artık konumuza dönebiliriz.

Button1 de ilk olarak Edit1 ve Edit2 ye girilen değerler sayi1 ve sayi2 değişkenlerine aktarılıyor.
Daha sonra toplam(sayi1,sayi2) komutu ile ilgili procedur'e sayi1,sayi2 değişkenleri ile gidiliyor. sayi1 değişkeninin ssahip olduğu değer x değişkenine ve sayi2 değişkeninin sahip olduğu değer ise y değişkenine aktarılıyor. Procedure içerisinde sonuc:=x+y ile bir sonuc değeri hesaplanıyor ve procedure'den çıkılıyor.


procedure toplam(x,y:integer);

ifadesinde x ve y değişkenleri parametre olarak adlandırılır ve tek taraflı olarak çalışırlar. Yani procedure çağırıldığı anda bu procedure ' ye sadece bilgi gönderilir. Procedure içerisinde x ve y değişkenlerinin alacakları değerler sayi1 ve sayi2 değişkenlerinin değerlerini etkilemez. Dışarıdan toplam isimli procedure çağırılırken mutlaka parametre sayısı kadar parametre kullanılmalıdır..


Çift taraflı çalışan procedure örneği:

Kod:
private
    { Private declarations }
  procedure toplam(x,y:integer);
  procedure hesapla(b:integer; var c:Integer);
  public
    { Public declarations }

  end;

var
 Form1: TForm1;
sayi1,sayi2,sonuc:integer;
a:integer;
implementation

{$R *.dfm}

Procedure Tproce.hesapla(b:integer;var c:integer);
begin
C:=B*B;
end;
procedure hesapla(b:integer; var c:Integer);

Dikkat edilirse procedure'nin parametre kısmında c değişkeninden önce VAR kelimesi kullanılmış. Bu kelime kendisinden sonra yazılan değişkenin (c) çift taraflı olarak çalışmasını sağlar. Yani procedure çıkış esnasında c değişkenin sahip olduğu son değer buna karşılık gelen değişkene aktarılır.. c değişkeninin sahip olduğu son değeri aktarması için var kısmında global bir değişken tanımladık a:integer; ...

private kısmına proceduremizin adını yazdık. Kullanılacak yere de proceduremizi yazdık. Şimdide kullanımını yapalım:

Button2 ekleyelim forma ve tıklanınca işlem görecek kodları yazalım.

Kod:
procedure Tproce.Button2Click(Sender: TObject);
begin
hesapla(5,a);
Edit3.Text:=IntToStr(a);
     end;
Burada toplam proceduremizi anlatırken şu sözleri hatırlayın.
Button1 de ilk olarak Edit1 ve Edit2 ye girilen değerler sayi1 ve sayi2 değişkenlerine aktarılıyor.
Daha sonra toplam(sayi1,sayi2) komutu ile ilgili procedur'e sayi1,sayi2 değişkenleri ile gidiliyor. sayi1 değişkeninin ssahip olduğu değer x değişkenine ve sayi2 değişkeninin sahip olduğu değer ise y değişkenine aktarılıyor. Procedure içerisinde sonuc:=x+y ile bir sonuc değeri hesaplanıyor ve procedure'den çıkılıyor.

Burada da hesapla(5,a) 5 rakamı, porcedure'nin içerisinde b değişkenine aktarılıyor. c:=b*b; -> 5*5=25 c değişkenine 25 değeri aktarıldı. İşte şimdi çift taraf çalışacak ve c değişkenine karşılık gelen a değişkenine değer aktarılarak sonuç yazdırılıyor.


İstersek 5 sayısını Edit1.Text' e kullanıcının girmesini sağlayabiliriz. O zaman şu şekilde olur;

Kod:
procedure Tproce.Button2Click(Sender: TObject);
var
i:integer;
begin
if trim(Edit1.Text)<>'' then
begin
i:=StrToIntDef(Edit1.Text,0);
hesapla(i,a);
Edit3.Text:=IntToStr(a);
end
     else
     begin
    ShowMessage('Eksik Veri Girişi');
    Edit1.SetFocus;
    Abort;
     end;
     end;
Edit1.Text e girilen değer string tipte onu sayısal tipe dönüştürmek için burada da bir sayısal değişken tanımlayıp (i:integer) hesapla(i,a); olarak kullanıyoruz. (yukarıda bahsetmiştik)

FONKSİYON (FUNCTION) :

Bir fonksiyon şu şekilde tanımlanır.

Kod:
Function FonksiyonAdı (GirişParametreleri:Tipi):FonkTipi;
sabit,değişken,tiptanımı
begin
Program Komutları;
FonksiyonAdı:=deger;
End;
Procedure tanımından farklı olarak fonksiyon geriye bir değer göndereceği için bu değerin tipi fonksiyon tanımından sonra FonkTipi parametresi ile belirlenir. Ayrıca geri dönecek değer fonksiyon adına yada Result ifadesine atanan değer ile yapılır.

Kod:
Function FonksiyonAdı (GirişPArametreleri:Tipi):FonkTipi;
sabit,değişken,tip tanımı
begin
Program Komutları;
Result:=Deger;
End;
Örnek;

Birinci örneğimiz Memo1 kutusuna sayıları artırarak yazdıralım.
global olarak b:integer; değişken tanımlayalım. Artık yerini biliyorsunuz.


Kod:
function Artir(x:LongInt):LongInt;
begin
Artir:=x+1;
end;
Kullanımı;
Fonksiyon çağırma işlemi bir procedure çağırma işlemi gibidir ancak fonksiyondan geriye değer döneceği için sonucun bir değişkene aktarılması gerekir.


Kod:
procedure Tproce.Button4Click(Sender: TObject);
begin
b:=0;
repeat
b:=Artir(b);
Memo1.Lines.Add('b='+IntToStr(b));
until b=5;
end;
Açıklama:
b değişkenine başlangıçta sıfır (0) değeri verdik.
b:=Artir(b);
Artir:=0+1 ->1 olacak.
b değeri 1 oldu.
repeat until döngüsünü kullandık. Ve 5 oluncaya kadar da arttırarak memo1 e aktarmış olduk.
Yeri gelmişken kısaca bu konuya da değinelim.
Kullanımı;
Repeat
Komutlar
until Şart;
While - Do döngüsünden farklı olarak döngüye girerken değil çıkarken şart kontrol edilir. Böylece Repeat-until döngüsü içindeki komutlar en az bir kere çalışır.
until b=5; yazdığımız yerde şartımız sayılarımızı 5 e kadar yaz. Sınırlamış olduk yani.

Şimdi bir örnek daha yapalım içinde yukarıda bahsettiğimiz result ta olsun.
Bu örneğimiz de girilen sayıları binlik basamaklara ayıran bir fonksiyon olsun.


Kod:
function Binlik(s:Real):String;
begin
result:=FormatFloat('###,###,###',s);
end;
kullanımı;
Forma Bir Button daha ekleyelim ve tıklanınca çalışacak şu kodları yazalım.


Kod:
procedure Tproce.Button5Click(Sender: TObject);
begin
Edit2.Text:=Binlik(StrToFloat(Edit1.Text));// fonksiyon adı Binlik
end;
Programı çalıştırınca, Edit2.Text e girilen sayıları Edit1.Text 'e, yazılan fonksiyon sayesinde virgülle ayrılmış bir biçimde yazıldığını göreceksiniz. Eğer procedure konusunu iyi irdelemişseniz fonksiyon konusunu daha iyi anlayabilirsiniz.
 
Kayıt
16 Temmuz 2007
Mesajlar
145
Beğeniler
0
super paylaşim seni tebrik ediyorum delphi 7 yi programlama listeme ekledim...(en kısa zmanda öğreneceğiz inş.)
 
Kayıt
21 Kasım 2007
Mesajlar
3.038
Beğeniler
0
GOKHAN_81 demiş ki:
super paylaşim seni tebrik ediyorum delphi 7 yi programlama listeme ekledim...(en kısa zmanda öğreneceğiz inş.)
Bizi takipte kaldığınız sürece öğrenemeyeceğiniz şey yoktur. :wink1:
 
Yukarı Alt