Memik Yanık - Kişisel Web Sitesi Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS RSS | İletişim

Delphi : 6. Ders : Adım Adım Class Hazırlamak(*)


Daha önceki derslerde belirtildiği gibi Delphi uygulamalarında formların görsel yapısı ilgili bilgiler unit dosyası ile aynı ada sahip DFM uzantılı dosyalarda saklanmaktadır. Bir önceki derste Delphi ile hazır olarak gelen TForm sınıfını miras alan TForm1 adında bir Class ve bu Class’tan yola çıkarak Form1 adında bir nesne hazırladım. 

Tekrar etmek gerekirse Delphi projelerindeki her form için PAS uzantılı bir kod dosyası hazırlanmakta ve Unit adı verilen bu kod dosyalarında en az bir Class olmaktadır. Forma herhangi bir kontrolün yerleştirilmesi veya söz konusu kontrolle ilgili bir olay meydana geldiği zaman işletilecek yordam hazırlandığı zaman sınıfın Type ile başlayan ve End deyimi ile biten bloğuna yeni satırlar eklenmektedir. Aşağıda verdiğim kodu yeni hazırladığım projenin formuna bir Button yerleştirdikten sonra aldım.

unit Unit1;
interface
uses 
    Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
  private
     { Private declarations }
  public
     { Public declarations }
  end;
var
   Form1: TForm1;
implementation
  {$R *.dfm}
end.

Artık “TForm1” sınıfının “Button1” adında bir üyesi vardır ve bu üye Delphi’nin TButton sınıfından türetilen bir nesnedir. Konunun anlaşılmasını sağlamak için forma ayrıca bir Edit yerleştirdim ve Object Inspector penceresinde Button nesnesinin özellikleri listelenirken Events sekmesinde Click olayının üzerinde çift tıklama yapıp düğme tıklandığı zaman işletilecek yordamı hazırladım. 

Unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, 
         Graphics, Controls, Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
     Button1: TButton;
     Edit1: TEdit;
     procedure Button1Click(Sender: TObject);
  private
     { Private declarations }
  public
     { Public declarations }
  end;
var
   Form1: TForm1;
implementation
  {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
 begin
 end;
end. 

Bu şartlarda “TForm1” adındaki sınıfımız Button1Click adında bir metoda sahiptir. Benzer şekilde sınıfın alanlara ve özelliklere(property) sahip olması sağlanabilir. Bu sınıfımız TForm sınıfının mirasçısı olduğu için çok sayıda özelliğe (Caption, Text, Name vs) sahiptir.

Şimdi bu Delphi projesine 2. bir form dahil edip projenin 2. bir Class’a sahip olmasını sağlayacağım. File menüsünden komut verilerek projeye dahil edilen 2. forma ait Unit’te hazırlanan kodlar ilk forma ait Unit’ten pek farklı değildir. Projedeki bir formun Name özelliğini Object Inspector penceresinde değiştirmeniz halinde Class’ın adı kendiliğinden değişir.



Şimdi projedeki 2. formu temsil eden TForm2 adındaki Class’ta birisi private diğeri public 2 alan tanımlayacağım. Tahmin edeceğiniz gibi public alanlara diğer sınıflardan erişilebilinmektedir



Sınıfların alanları ile özellikleri aynı şeyler değildir. Alanlar “özellikler” gibi işlev gördüğü için bazen alanlardan özellik diye söz edilmektedir. Class’lar için alan hazırlamaya değişken tanımlama denilebilir. Bu koddaki Var bloğunda TForm2 sınıfından yani tipinden yola çıkılarak Form2 adında bir değişken tanımlanmaktadır. 

TForm2 sınıfı için bu şekilde biri Public diğeri Private 2 alan tanımladıktan sonra ilk Unit’e geçip Uses deyimi ile Unit2’yi Unit1’e dahil ettim. Ardından TForm2 adındaki Class’tan türetilen Form2 nesnesinin “Ay” ve “Yil” adını verdiğim alanlarına bilgi aktarmaya çalıştım.



Bu 2 satırdan 2. si hataya neden olur. Çünkü TForm2 adlı Class’tan yola çıkılarak hazırlanan “Form2” nesnesinin “Yil” adını verdiğim alanını Private bloğunda tanımladığım için bu alana başka bir Class’ın içinden erişim sağlanamaz. 

Kendiniz sınıf hazırlamak istiyorsanız sınıf için ayrı bir Type–end bloğu hazırlamanız gerekir. Üzerinde çalıştığım projedeki ilk Unit’i aşağıdaki gibi değiştirerek bu Unit’te “Sinif_1” “adında 2. bir sınıf hazırladım ve bu sınıftan yola çıkarak “Nesne_1” adında bir değişken tanımladım.



Bu şekilde herhangi bir özelliğe sahip olmayan Class hazırlanıp değişken tanımlandıktan sonra Class’ın örneği alınabilir veya nesne hazırlanabilir. Bu amaçla TForm sınıfının FormClick() metodunu(veya yordamını) aşağıdaki gibi düzenledim. Bu kod sayesinde elimizde TObject sınıfının örneği ile aynı özelliklere sahip “Nesne_1” adında bir nesnemiz olur.

procedure TForm1.FormClick(Sender: TObject);
begin
   Nesne_1 := Sinif_1.Create;
end;
 

Konunun kolay izlenmesini sağlamak için sınıf hazırlama ve kullanma işlemlerini konsol uygulaması üzerinde anlatacağım. Bu amaçla Delphi ile yeni bir konsol uygulaması hazırladım ve bu uygulamaya aşağıdaki gibi bir satır ekledim.



Bu konsol uygulaması çalıştırıldığında bir DOS penceresi açılır ve enter tuşuna basılınca programın çalışması sona erer. Şimdi bu konsol uygulamasında “Sinif_1” adında bir Class hazırlayacağım. Bu amaçla uygulamada Uses bloğundan sonra Type-End bloğu hazırladım. 

Program Project1;
{$APPTYPE CONSOLE}
uses
   SysUtils;
Type
    Sinif_1 = Class
 end;
begin
  Readln;
end.

Bu sırada konsol uygulaması herhangi bir özelliğe sahip olmayan bir sınıfa sahiptir. Delphi’nin TObject adında bir temel sınıfı bulunmaktadır ve bütün sınıflar TObject sınıfından türetilir. Burada Class deyimi ile sınıf hazırlarken sınıfın hangi sınıftan türetileceğini belirtmediğim için “Sinif_1” class’ı TObject class’ından türetildi. Class deyiminin kullanıldığı satırı aşağıdaki gibi düzenleseydim değişen bir şey olmazdı.

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;
Type
   Sinif_1 = Class(TObject)
 end;
begin
  Readln;
end.

Bu şekilde Class hazırladıktan sonra şimdi bu Class için bir metot veya procedure hazırlayacağım. Bu amaçla Class’a ait Type-end bloğu içinde hazırlamak istediğim procedure veya metodu aşağıdaki gibi deklare ettim. “Yaz()” adını verdiğim bu procedure herhangi bir parametreye sahip değildir.



Procedure bu şekilde deklare edildikten sonra kendisini hazırlamak gerekir. Deklare edilip henüz hazırlanmayan bir procedure varken bu konsol uygulaması çalıştırılırsa hata meydana gelir. 

Metoda ait satırları Class’a ait Type End bloğunun dışına yazmak gerekiyor. Hemen bir hatırlatmada bulunmak istiyorum; konsol uygulamalarında program sonunda nokta(.) bulunan Begin-end bloğundan itibaren çalışmaya başlar. Hazırlamak istediğim procedure yalnızca ekrana(burada konsola) mesaj yazacaktır.

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;
Type
   Sinif_1 = Class(TObject)
   procedure Yaz();
 end;

 Procedure Sinif_1.Yaz();
 Begin
    WriteLn('Çıkış için bir tuşa basın');
 end;

begin
   Readln;
End.

Burada yaptıklarımı kısaca anlatmak gerekirse; önce “Sinif_1” adında bir sınıf hazırladım ve bu sınıfın Type-end bloğunda “Yaz()” adında ve herhangi bir parametreye sahip olmayan bir metot deklare ederek sınıfın bir metoda sahip olacağını belirttim. En son olarak deklare ettiğim metodu hazırladım. Metot adının başına sınıfın adını yazarak ait olduğu sınıfı işaret ettim. 

Yukarıda anlatılan şekilde hazırlanan sınıftan yararlanabilmek için sınıftan yola çıkarak nesne hazırlamak gerekir. Bu amaçla konsol uygulamasına Var bloğu ekleyerek aşağıda verdiğim satır ile “Nesne_1” adında bir değişken tanımladım. 

Type
  Sinif_1 = Class(TObject)
  procedure Yaz();
 end;
 Procedure Sinif_1.Yaz();
  Begin
   WriteLn('Çıkış için bir tuşa basın');
  end;
Var
  Nesne_1 : Sinif_1;
begin
  Readln;
end.

Bu şekilde sınıftan yararlanarak nesne değişkeni tanımladıktan sonra konsol uygulamasının çalışmaya başladığı blokta Create metodundan yararlanarak nesneyi oluşturmak gerekir. Nesneyi oluşturduktan sonra sınıftaki, dolayısıyla nesnedeki metotlar kullanılabilir. Sınıftan yola çıkılarak nasıl nesne hazırlandığını aşağıda görebilirsiniz. Bu şekilde Create metodu ile nesne oluşturduktan sonra bu nesnenin Yaz() adını verdiğim metodunu işlettim.



* Bu metinde yer verdiğim 3-5 satırlık kodlarda tanımladığım değişkenlere ad seçerken yerli programcılık kitaplarından değişken adı çalmadığımı beyan eder ve değişken adlarındaki  muhtemel benzerlikler tesadüften ibarettir. Aslında Yil ve Ay yerine "kaybolan_yillar" ve "ayini_seveyim" adında değişkenler tanımlamış olsaydım değişken adı benzerliğinden dolayı suçlanıp hakim karşısına çıkma ihtimali belki biraz azalırdı.

Programcılık Dersleri 03.10.2009 14:26:38

YORUM YOK


YorumlarYorum Yaz
Ana Sayfa | Hakkımda | Kitap Önerileri | Fotoğraflarım | RSS | İletişim
Memik Yanık 2004-2009 © Tüm Hakları Saklıdır.
Hazırlayan www.semgoksu.com