Delphı’de Unıt Kavramı

Discussion in 'Programlama' started by sha., Nov 24, 2009.

  1. sha.

    sha. ..daha çirkin, daha huysuz

    Unit Penceresi:
    Bu bölümde kod penceresine (Bu pencere Delphi de Unit olarak
    adlandırılmaktadır.) ait tüm özellikleri sizlere izah edeceğim. Projenize eklemiş
    olduğunuz her formun kodlarının yazıldığı bir Unit i mevcuttur (Ama tersi
    geçerli değildir. Yani her Unit in formu olmak zorunda değildir. Formu olmayan
    Unit ler de bulunmaktadır). Aşağıdaki adımları izleyerek formunuza ait Unit
    penceresine ulaşabilirsiniz. “View->Units” adımlarından sonra karşınıza Unit
    inize ait pencere gelecektir. Eğer hiç bir kod eklemediyseniz görüntüsü
    aşağıdaki şekilde olacaktır.
    Pencereye dikkat ettiyseniz tüm önemli kalıplar satır numaralarıyla (Bu
    numaralandırmayı biz yaptık) adlandırılmış haldedir. Bu numaraları kullanarak
    tüm satırların ne işe yaradığını, nasıl değişiklik yapılabileceğini, ekleme silme
    işlemlerinin nasıl yapılacağını anlatacağım. Şimdi birinci satırdan itibaren
    inceleme işlemimize başlayalım.

    I.SATIR:
    Unit Unit1;
    Bu satır Unit inizin ismidir. Her formun bir Unit i olduğu için, adlandırmada
    aynı sıralamayla Delphi tarafından otomatik olarak yapılmaktadır. Yani ilk
    formun Unit ismi “Unit1”, ikinci formun Unit ismi “Unit2” vs. Delphi Unit
    isimlerini değiştirmeye şu aşamada imkan vermemektedir. Eğer ismini
    değiştirirseniz hatayla karşılaşırsınız .

    II.SATIR:
    İnterface
    Delphi Unit içerisindeki bölümleri programcılara blok blok göstermek için
    “interface” yapısı geliştirmiştir. Bu sayede Unit inizde yapmış olduğunuz genel,
    yerel tanımlamalarınızı kolayca izleyebilirsiniz. Şayet bu satırı silerseniz
    uygulamanız çalışmayacaktır.

    III.SATIR
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs;
    Programınızda kullandığınız tüm methodlar bu satır sayesinde
    kullanılabilmektedir. Delphi nesneden nesne yaratma (Object Oriented)
    mantığını desteklediği için, kullandığınız methodlar burada belirtilen
    kütüphaneler içerisinde tanımlıdırlar. Dolayısıyla kod bloklarınızda rahatlıkla
    kullanabilmektesiniz. Tek bir “uses” bildirisiyle araya “,” koyarak istediğiniz
    kadar kütüphaneyi projenize ekleyebilirsiniz. Hiç bir methodu kullanılmayacak
    olan kütüphaneleri projeye eklemek hem karmaşa yaratacak, hem de
    performansınızı düşürecektir. Bu amaçla Delphi sadece en çok kullanacağınız
    kütüphaneleri varsayılan olarak eklemiştir. Diğer kütüphanelerden
    faydalanmanız gerekirse, sizin manual olarak eklemeniz gerekmektedir. “uses”
    bildirisiyle Linux veya Windows işletim sistemlerine ait kütüphaneleri ekleyip
    çıkarabilirsiniz. Bu olayı anlamanız için iki tane örnek yapacağım. Bunlardan
    birincisi, “ShowMessage” methodunun tanımlı olduğu class ı (Dialogs) projeden
    silerek kullanmayı deneyeceğim. İkincisinde ise yukarıdaki class ların içerisinde
    tanımı olmayan bir methodun class ını ekleyerek nasıl kullanabileceğinizi
    göstereceğim.


    UYGULAMA 1:
    Bu örnekte “uses” satırında varsayılan olarak eklenmiş halde bulunan “Dialogs”
    kütüphanesini silerek aşağıdaki kodu projenize ekleyin.
    uses
    Windows, Messages, SysUtils, Variants, Classes,Graphics, Controls, Forms;
    //Dialogs’u sildim
    Şimdi formunuzun üzerine yerleştireceğiniz button kontrolünün “OnClick”
    yordamına aşağıdaki kodu ekleyiniz.
    Şimdi de programınızı çalıştırın. Daha önce çok kolay bir şekilde çalıştırdığınız
    uygulamanız hata mesajı verecektir. Sebebi çok basit “ShowMessage” methodu
    “Dialogs” class ı içerisinde tanımlıdır. Bu class ı projeden sildiğiniz için artık
    uygulamanız bu methodu bulamayacak, tanımayacak ve çalıştıramayacaktır.
    Uyarı mesajına dikkat ederseniz; ShowMessage ın declare edilmediğini, bu
    yüzden de uygulamanızı çalıştıramayacağını bildirmektedir.
    194
    Önemli Uyarı: Bir methodun tanımlı olduğu kütüphanesine ulaşmak için, Mous
    ile o komutun üzerine gidin “ctrl” tuşu basılıyken (mousun şekli değişecektir)
     
  2. sha.

    sha. ..daha çirkin, daha huysuz

    IV.SATIR:

    type
    TForm1 = class(TForm)
    Bu satır Wimdows Form uygulamalarının temelini oluşturmaktadır. Object
    Oriented mantığı kullanılarak class tan yavru üye türetilmektedir. Yaratılan
    yavru üyenin ismi “TForm1”, yaratıldığı ana class ise “TForm” (Windows
    formlarına ait tüm özellik ve methodlar “TForm” class ında tanımlanmıştır)
    adını taşımaktadır. Yavru üye kalıtımsal olarak yaratıldığı class a ait tüm
    özellikleri ve methodları üzerine alacaktır.
    Bir sonraki bölümde class yapısı detaylı olarak incelenecektir. Bu yüzden bu
    satıra ait izahat ve örnekleri o kısımda bulabilirsiniz.
    Görsel dillerde kod yazma işlemi çok basit olduğu için, formunuzun üzerine
    sürüklediğiniz kontrollerle örnekler geliştirebildiğinizi, bir çok kodu ezbere
    yazdığınızı maalesef biliyorum. Class kısmında yazılan kod satırlarından
    çoğunun ne içerdiği hakkında bilgisi olmayan programcıların olduğunu hatta

    bazılarının işi abartıp kitap bile yazdıklarını maalesef görüyoruz (Hatta
    kapaklarında 4. veya 5. baskı bile yazan var). Bu kitabı hazırlamamdaki asıl
    amaç, Fakülte içerisinde verdiğim derslere kaynak bulamadıkları için bu
    kalitesiz kitapları koltuğunun altına alıp gelen (Öğrencilerimi bu hususta
    suçlamıyorum) öğrencilerime ışık tutabilmek maksatlı olmuştur
    (Referanslarımız hakkında ufak bir fikir edinebilmeniz için kitabun açılış
    sayfalarına bakınız).
    Şimdi tekrar konumuza dönerek Unit satırlarımızı izah etmeye devam edelim.

    V.SATIR:
    private
    { Private declarations }
    Sadece o Unit tarafından (Buradaki Unit Forma ait olduğu için sadece form
    kontrolleri tarafından da denilebilir. Genel anlamda hangi class a aitse)
    kullanılabilecek değişken ve methodların declare edilebileceği bloktur. Burada
    tanımladığınız bir değişkeni diğer formlardan (veya Unit lerden) çağıramazsınız.
    Private bloğu içerisinde yapmış olduğunuz tanımlamalar “Implementation” dan
    sonra yapılanlardan farklıdır (class kısmında inceleyebilirsiniz). Burada
    tanımlayacağınız bir değişkeni proje içerisinde nasıl kullanabileceğinizi
    göstermek istiyorum.
    type
    TForm2 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    private
    deger:Integer; //Buradaki değişken tanımlamasında var kullanılmaz
    Tanımlamış olduğunuz “deger” isimli değişken bütün alt yordamlar tarafından
    kullanılabilecektir. Fakat başka bir Unit içerisinden bu değeri kullanabilmek
    mümkün değildir.
    Bu tip değişkenler devamlı olarak (Form kapatılana kadar) bellekte tutuldukları
    için son değerleri her zaman hatırlanacaktır. Yani Button1 “OnClick” olayında
    bu değişkene aktardığınız değeri, Button2 “OnClick” olayında rahatlıkla
    kullanabilirsiniz. Aşağıdaki kod satırlarını formunuzun gerekli yordamlarına
    ekleyip programınızı çalıştırınız.
    “deger” isimli değişkeni, Unit inizin “private” kısmında tanımladığınız için tüm
    alt yordamlar tarafından kullanılabilecektir.
    Bu kısımda ayrıca göstermek istediğim bir hususta “private” kısmında
    tanımlanan bir değişken (Bu proje için Form2 ye aittir) o formun diğer
    kontrolleri gibi davranacaktır.
    Yukarıdaki şekilde “private” kısmında tanımlanan değişkenin “Form2” yazıp “.”
    tuşuna basılınca açılan pencerede diğer methodlar (özellikler, kontroller vs.) gibi
    gözükeceğine dikkat ediniz.

    Şimdi de “private” kısmında bir prosedür tanımlayarak Unit içerisinde nasıl
    kullanabileceğimizi görelim.
    Aşağıdaki gibi “private” kısmında yeni prosedürünüzü tanımlayın.
    type
    TForm2 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    private
    deger:Integer; //Değişken tanımlandı
    procedure uyar();//Prosedür tanımlanıyor.
    Prosedürü bu şekilde tanımlayıp programı çalıştırmaya kalkarsanız, Delphi sizi
    hata mesajıyla uyaracaktır. Bu yüzden şimdi anlatacağım adımları
    gerçekleştirdikten sonra uygulamanızı çalıştırın. İmleç prosedürün tanımlandığı
    satırda iken “Ctrl+Shift+C” tuşlarına beraberce basın. Aşağıdaki gibi Unit in
    içerisinde Formun üyesi olan prosedür bloğunu oluşturacaktır.
    Artık programınızın çalıştırılması sırasında hata oluşmayacaktır (Delphi
    tanımlanmış prosedür bloklarının yaratılmış olmasını istemektedir). Burada
    hatırlatalım private bloğunda tanımlanan prosedüre diğer Unit lerden erişmek
    mümkün olamayacaktır.
    Prosedür Unit in “Private” kısmında tanımlandığı için “Form2.uyar” komutu
    kullanılarak prosedür işletilebilmiştir. Prosedürünüzün içerisine yazacağınız
    kodları, diğer yordamlardan aşağıdaki şekilde kolayca işletebilirsiniz.

    Burada değinmek istediğim diğer bir noktada, bu prosedüre formun diğer
    methodlarına nasıl erişebiliyorsanız o şekilde erişebileceğinizdir. Yani “Form2”
    yazıp “.” tuşuna basarsanız açılacak olan pencerede prosedürün ismi
    gözükecektir.
    “Private” bloğunda fonksiyon tanımlaması da yapabilirsiniz. Fakat değişken ve
    prosedürde olduğu gibi başka bir unitten ulaşılması mümkün olmayacaktır.
    Sadece tanımlandığı Unit içerisinde bulunan kontrollere ait yordamlardan
    çağrılabilecektir. Bu blokta fonksiyon tanımlamak için aşağıdaki adımları
    izlemelisiniz.

    type
    TForm2 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    private
    deger:Integer; //Değişken tanımlandı
    procedure uyar();
    function hesapla(ilk:Integer;son:Integer):Real;//Function tanımlandı
    { Private declarations }
    Prosedür kısmında yaptığınız gibi, imleç fonksiyonun tanımlandığı satırda iken
    “Ctrl+Shift+c” tuşlarına beraberce basıp aşağıdaki bloğun oluşmasını sağlayın.
    Hesapla isimli fonksiyonun “Form2” classının üyesi olduğunu sanıyorum
    söylememize gerek yok.
    Fonksiyona ait “begin-end” bloğu içerisinde hesaplama işlemini yapacak olan
    kod satırlarını yazabilirsiniz. Programa gönderilecek olan değer aynı şekilde
    “Result” ifadesiyle yakalanabilir. Şimdi fonksiyonumuzun kodlarını ekleyerek
    uygulamamızı çalıştıralım.
    Hatırlatmak istediğim diğer bir hususta, tanımlanan fonksiyon “Form2” class
    ında türetildiği için Editör de “Form2” yazıp “.” tuşuna basarsanız, aşağıdaki
    gibi açılacak olan pencerede fonksiyonunuzu bulabileceksiniz.
    Class içerisinde değişken, prosedür ve fonksiyon tanımlama işlemleri class
    yapısı kısmında daha detaylı olarak incelenecek ve örneklendirilecektir.
    Şimdilik bu kısmı kapatıp “Unit” penceremizde yer alan diğer satırları
    incelemeye devam edelim

    VI.SATIR:
    public
    { Public declarations }
    end;
    Proje içerisinde bu bloğun kullanım mantığı “private” ile tamamen aynıdır.
    Aralarındaki tek fark “public” bloğunda tanımlanan değişken, prosedür veya
    fonksiyona diğer Unitler den de ulaşılabilmesidir. Yani bu blokta tanımlanan bir
    değişken ait olduğu Unit inin eklendiği tüm formlardan (aslında Unitlerden)
    kolaylıkla çağrılabilmektedir.

    VII.SATIR:
    end;
    Bu satır, class a ait tanımlamaların bittiği yeri göstermektedir (TForm2).

    VIII.SATIR:
    var
    Form2: TForm2;
    “TForm2” class ından Object Oriented mantığı kullanılarak Form2 isminde yeni
    bir değişken türetilip kullanıma sunulmaktadır. Hatırlatalım “TForm2” nin tüm
    özellikleri bu yeni değişkene de aktarılmış olacaktır.
    IX.SATIR:
    implementation
    Forma ait Event lar için yazılacak olan kodlar bu satırdan itibaren başlar. Eğer
    Unit içerisinden silerseniz uygulamanız çalışmayacaktır.
    X.SATIR:
    {$R *.dfm}
    “.dfm” uzantılı dosyaya yazılacak olan kodları belirleyen çok önemli bir
    bildiridir. Sakın Unit inizin içerisinden silmeyiniz. Silerseniz uygulamanızın
    çalıştırılması başarısızlıkla sonuçlanacaktır.
     

Share This Page