1. Reklam


    1. joysro
      ledas
      jungler
      keasro
      zeus
      karantina

Delphi Konuları Prosedür ve Fonksiyonlar


  1. Redefine

    Redefine Old School olduser rank8

    Kayıt:
    21 Kasım 2007
    Mesajlar:
    3.152
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    36
    [​IMG]

    :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.
     
  2. Roland Deschain

    Roland Deschain Öğretiyorum rank8

    Kayıt:
    28 Nisan 2007
    Mesajlar:
    690
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    0
    Meslek:
    Öğrenci
    Şehir:
    Gilead
    o.O kesinlikle harika :)
     
  3. DaRKeDeN

    DaRKeDeN Öğreniyorum rank8

    Kayıt:
    16 Temmuz 2007
    Mesajlar:
    149
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    0
    super paylaşim seni tebrik ediyorum delphi 7 yi programlama listeme ekledim...(en kısa zmanda öğreneceğiz inş.)
     
  4. Redefine

    Redefine Old School olduser rank8

    Kayıt:
    21 Kasım 2007
    Mesajlar:
    3.152
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    36
    Bizi takipte kaldığınız sürece öğrenemeyeceğiniz şey yoktur. :wink1:
     
  5. Aresa

    Aresa Tanınıyorum rank8

    Kayıt:
    25 Kasım 2007
    Mesajlar:
    395
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    0
    hacı hepsini okumaya zaman yok ama emeğine sağlık :headbang:
     
  6. FaZ

    FaZ Tanınıyorum rank8

    Kayıt:
    18 Aralık 2008
    Mesajlar:
    393
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    0
    Teşekkürler
     
  7. indetectables

    indetectables Keşfediyorum rank8

    Kayıt:
    11 Eylül 2009
    Mesajlar:
    20
    Beğenilen Mesajlar:
    0
    Ödül Puanları:
    0
    Meslek:
    öğrenci
    paylaşım için teşekkürler