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)
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.