EditBox’ın içerisinde bulunan değeri tamsayı tipli değişkene
aktarmak
Koda dikkat edecek olursanız ilk olarak “x”
isminde tamsayı değişkeni tanımlanmakta olup, kontroldeki değeri
alabilmesi için “StrToInt” (Stringi Tamsayıya çevir) tip çeviri
fonksiyonuna ihtiyaç duyulmaktadır. Eğer bu tip dönüştürme işlemini
yapmazsanız, Delphi size sonucu hesaplayamayacağına dair hata mesajı
iletecektir.
Tamsayı tipli bir değişkeni yazdırabilmek için
muhakkak “String”e çevirmelisiniz. Bu dönüşümü yapabilmeniz için
Delphi’de “IntToStr” fonksiyonu kullanılabilmektedir.
Tarihsel Değişkenin Değerini Yazdırmak:
Tarihsel içerikli bir değişkenin değerini
aşağıdaki şekilde oluşturacağınız bir kod satırı sayesinde
kolaylıkla yazdırabilirsiniz.
Tip dönüştürme işlemlerine lütfen dikkat ediniz.
Aktif Formu Kapatmak:
Çalışan aktif formu kapatmak (Eğer tek formunuz
varsa aynı zamanda programınız da sonlanacaktır.) için aşağıda
gösterilen şekilde basit bir kodlama kullanabilirsiniz.
Alt Satırdaki Kodların İşlemesini Engellemek:
Bazı durumlarda procedure içerisinde
belirlediğiniz bir koşul oluştuğu anda alt satırlardaki kodların
işlemesini istemeyip, kod okumayı sonlandırabilirsiniz. (C++ daki
return, veya Visual Basic deki Exit Sub). Şimdi bu tür kodlamaya
örnek vereceğim.
Şayet “exit” komut satırı olmasaydı formun
başlığında “Yüksel İnan” stringi yazacaktı. Fakat “exit” sayesinde
altta yer alan iki satır kod okutulmamakta, bundan dolayı formun
başlığında “Nihat Demirli” içeriği yazdırılmaktadır (Bir çok durumda
çok fazla işinize yarayacak bir komuttur).
Programı Sonlandırmak:
Aktif formla beraber diğer tüm formları da
kapatmak için aşağıdaki şekilde bir kod satırı kullanabilirsiniz.
Programıİkinci Formdan Başlatmak:
Şayet uygulamanızda birden fazla Windows formu
varsa ve siz projenizi ikinci (veya diğer herhangi bir formda
olabilir) formunuzdan başlatmak istiyorsanız, belirtilen adımları
izlemelisiniz.“Project->Options” menü adımlarından sonra
aşağıdaki pencere açılacaktır.
Bu pencerenin “Forms” yaprağını aktifleştirin. Bu
yaprakta bulunan “Main
Form kısmından programın ilk çalıştırılacağı formu
seçebilirsiniz (Bu pencerede uygulamanıza dahil edilmiş olan tüm
pencereler listeli halde bulunacaktır).
Herhangi Bir Exe Uygulamasını Çalıştırmak:
Aşağıdaki gibi projenize ekleyeceğiniz tek
satırlık kodla, istediğiniz “exe” (Dosya yolunu doğru giriniz.)
uzantılı dosyayı kolaylıkla çalıştırabilirsiniz.
Burada hatırlatmak isterim. Şayet yetki probleminiz
yoksa, aşağıdaki gibi “UNC” (Network adresi) path belirterek de
dilediğiniz bir bilgisayardaki dosyayı da çalıştırabilirsiniz.
Ağdaki Bir Bilgisayarda Bulunan Exe Uzantılı
Dosyayı Çalıştırmak:
Başka bir bilgisayardaki dosyayı çalıştırmak
istiyorsanız bu durumda “UNC” path i kullanmalısınız.
“UNC” path\\makineadı\\klasörpaylaşımadı\\dosyaadışeklinde kullanılmaktadır. Yukarıdaki kod satırında
Efsane isimli bilgisayarda, paylaşıma açılmış olan WINNT klasörünün
içerisindeki, Notepad.exe dosyası çalıştırılmak istenmektedir.
Değişkenler:
Paket yazılımların her firma için (veya kişi)
farklı sonuçlar oluşturması, programın içerisinde değişkenlerin
kullanılmasından kaynaklanmaktadır. Zaten böyle olmasaydı
yazılımların hiç bir anlamı kalmazdı. Delphi’de değişken temeline
dayalı yazılım dilidir ve bu hususta sanıyorum varılabilecek en üst
noktaya ulaşmış bulunmaktadır. Bu kadar önemli olan bir konuda
tabiidir ki dikkat edilecek birtakım önemli hususlar vardır. Şimdi
sizlere bu hususlardan bahsetmek istiyorum.
Delphi’de değişken kullanılacaksa muhakkak programa
bildirilmelidir. Bir değişkeni programa bildirmek için iki yöntem
bulunur. Bunlardan birincisi procedure’un dilediğiniz yerinde
değerini değiştirebilmenizi sağlayan “Var” bildirisi, diğeri
ise tanımlandığında atanacak olan değer dışında başka değer alamayan
(İstisnaları vardır. Daha sonra izah edilecektir.) “Const”
bildirisidir. Ayrıca Delphi’de değişkenlerinizi rastgele yerlerde
tanımlayamazsınız, değişken tanımlayabilmeniz için size procedure’un
içerisinde bir blok sunmaktadır.
Delphi size procedure-begin arasında değişken
tanımlama imkanı vermektedir. Başka rastgele bir yerde değişken
tanımlamanız mümkün olmamaktadır. Bu blokta Const’la tanımlanmış
değişkenlere ilk değerini atama dışındaki işlemleri yapamazsınız (Bu
tür kodsal işlemler sadece procedure’den sonra gelen begin-end bloğu
içerisinde yapılabilir).
Aşağıdaki kod penceresinde, procedure içerisinde
local (Sadece o procedure tarafından kullanılabilen ve işlem
bittikten sonra bellekten atılan değişkenlerdir.) değişkenlerin
nasıl tanımlanabileceği gösterilmiştir. Belirtilen blok içerisinde
tanımlanan tüm değişkenler local değişken olarak adlandırılırlar.
Bir değişkenin local olması diğer procedure’ler tarafından
kullanılamaması ve yordam bir kere işletildikten sonra o değişkenin
bellekten atılacağı anlamını taşımaktadır. Pencereyi dikkatlice
inceleyiniz.
Delphi’de aynı satırda araya ”,” koyarak aynı tipte
birden fazla değişken tanımlanabilmektedir. Ayrıca tek bir
“var” bildirisi kullanarak birden fazla satırda değişken
tanımlamakta mümkündür (Aynı işlem const içinde mümkün
olmaktadır).
Değişken Tanımlarken Dikkat Edilecek Olan
Hususlar:
Değişkeninizi tanımlarken aşağıdaki hususlara
dikkat etmelisiniz.
• Değişken isimleri kesinlikle rakamla başlayamaz.
Fakat ismin içerisinde veya sonunda rakam kullanılabilir.
Var //Değişken bildirisi için gereklidir. 5nih:integer; //Yanlış
tanımlanmış bir değişken nih55:integer; //Doğru tanımlanmış bir
değişken
• Değişken isimleri içerisinde değişik karakterler
kullanamazsınız (Başında veya sonunda da olamaz).
Var Nih#dem:integer; //Yanlış tanımlanmış bir değişken
Nih#3:AnsiString; //Yanlış tanımlanmış bir değişken
- Değişken isimlerinde araya space tuşuyla
boşluk bırakamazsınız. Yani değişkeninizin ismi birden fazla
kelimeden oluşamaz. Eğer böyle bir değişken (Adı ve soyadını ayrık
yazmak isteyebilirsiniz) tanımlamak zorunda kalırsanız, iki kelime
arasına “_” karakterini yerleştirin.
- Delphi içerisinde kullanılan herhangi bir
komut değişken ismi olarak kullanılamaz.
- Var bildirisiyle tanımlanan bir
değişkene tanımlandığı anda değer atamasıyapılamaz.
| Var
|
| N
demirli:AnsiString; |
//Yanlış bir
değişken tanımlandı |
| N_demirli:AnsiString; |
//Doğru bir
değişken tanımlaması |
| Var
|
| Not:integer;
|
//Yanlış bir
değişken tanımlandı |
| Not1:integer;
|
//Doğru bir
değişken tanımlaması |
| Var
|
| Sayi:integer=100; |
//Yanlış bir
atama |
| Numara:Double=200.25 |
//Yanlış bir
atama |
Sayısal bir değişken tanımlandığı anda ilk değer
olarak belirtilen tipe göre rastgele bir değer almaktadır (0 değil).
- Const ile yapılan bildiri sonucu
tanımlanmış olan değişkene ilk değerini atamak zorunludur.
- Var bildirisiyle tanımlanmış değişkene
procedure içerisinde istenildiği anda yeni bir atama yapılabilir.
- Const ile bildirilmiş sabit
değişkenlere procedure içerisinde yeni değer aktarılamaz (Bunun
istisnası vardır. Özel bildiriler eklenerek değişkene yeni değer
aktarılabilmektedir, fakat bu konu daha sonra detaylı olarak
işlenecektir).
- Local değişkenker procedure işlemeye başladığı
anda bellekte oluşturulup, kod sonlandığı anda da bellekten
atılırlar.
| Const
|
| Pi:Double; |
//Yanlış bir
değişken tanımlaması |
| Pi:Double=3.14; |
//Doğru bir
değişken tanımlaması |
Şimdi Delphi içerisindeki değişken tiplerini
inceleyelim.
Tam Sayı Değişken Tipleri:
Delphi içerisinde sadece tam sayı değeri
atayabileceğiniz değişken tipleri aşağıda sırasıyla sizlere
aktarılmaktadır.
• Shortint
(-128)-(+128) arasında değer alabilen tam sayı
tipli bir değişkendir. Eğer bu değerlerin dışında bir sayı
aktarılmaya çalışılırsa taşma (owerflow) hatasıverecektir. Bu
değişken bellekte 1 Byte (8 bit) lik yer işgal eder.
Var Yas:Shortint; //Sadece -128 ile 128 arasında değer
atanabilir.
• Smallint
(-32768)-(+32768) arasında tam sayı değeri
atanabilen değişken tipidir. Bellekte 2 Byte (16 bit) lık yer işgal
edecektir.
Var Sayi:Smallint; //Sadece -32768 ile 32768 arasında tam sayı
değeri atanabilir
• Longint
(-2147483648)-(+2147483647) arasında tam sayı
değerleri alabilen bir değişken tipidir. Bellekte 4 Byte (32 bit)
yer işgal edecektir.
Var Sayi:Longint; //Sadece -2147483648 ile 2147483648 arasında
değer atanabilir.
• Integer
(-2147483648)-(+2147483647) arasında tam sayı
değerleri alabilen bir değişken tipidir. Bellekte 4 Byte (32 bit)
yer işgal edecektir.
Var Sayi:Integer; //Sadece -2147483648 ile 2147483648 arasında
değer atanabilir.
• Int64
(-2^63)-(2^63-1) arasında tam sayı değeri
atanabilen değişken tipidir. Bellekte 8 Byte (64 bit) yer işgal
edilecektir.
Var Sayi:Int64; //Sadece -2^63 ile 2^63 arasında değer
atanabilir.
• Byte
0-255 arasında pozitif tam sayı değeri
alabilen değişken tipidir. Bellekte 1 Byte (8 bit) lık yer işgal
edecektir.
Var Sayi:Byte; //Sadece 0-255 arası pozitif tam sayı değeri
alabilir.
• Word
0-65535 arası pozitif değer alabilen değişken
tipidir. Bellekte 2 Byte (8 bit) lık yer işgal edecektir.
Var Sayi:Word; //Sadece 0-65535 arası değer atanabilir.
• Longword
0-4294967295 arası pozitif değer atanabilen
değişken tipidir. Bellekte 4 Byte (32bit) lık yer işgal edilecektir.
Var Sayi:Longword; //Sadece 0-4294967295 arası değer atanabilen
değişken tipidir.
• Cardinal
0-4294967295 arası pozitif değer atanabilen
değişken tipidir. Bellekte 4 Byte (32bit) lık yer işgal edilecektir.
Var Sayi:Cardinal; //Sadece 0-4294967295 arası değer atanabilen
değişken tipidir.
Reel Sayı Değişken Tipleri:
Delphi içerisinde ondalıklı sayı değeri
atayabileceğiniz değişken tipleri aşağıda sırasıyla sizlere
aktarılmaktadır.
• Real48
(+-2.9*10^-39) ve (+-1.7*10^38) arasında değer
alabilen reel sayı tipidir. Ondalıklı kısımdan 11-12 dijite kadar
hassas çalışabilir. Bellekte 6 Byte (48 bit) yer işgal etmektedir.
Var Sayi:Real48; //Sadece yukarıdaki sınırlar içerisinde değer
alabilir.
• Single
(+-1.5 x 10^-45) ve (+-3.4 x 10^38) arasında
değer alabilen reel sayı tipidir. Ondalıklı kısımdan 7-8 dijit
hassasiyetiyle işlem yapabilir, ve bellekte 4 Byte (32 bit) lık yer
işgal eder.
Var Sayi:Single; //Sadece yukarıda belirtilen sınırlar içerisinde
değer alabilir.
• Double
(+-5.0 x 10^-324) ve (+-1.7 x 10^308) arasında
değer alabilen reel sayı tipidir. Ondalıklı kısımdan 15-16 dijite
kadar hassasiyetle işlem yapabilmektedir. Ayrıca bellekte bu
değişken 8 Byte (64 bit) lık yer işgal edecektir.
Var Sayi:Double; //Sadece yukarıda belirtilen sınırlar içerisinde
değer alabilir.
• Real
(5.0 x 10^-324) ile (1.7 x 10^308) arasında
değer saklayabilen reel sayı tipidir. Bellekte 8 Byte (64 bit) lık
yer işgal edecektir.
Var Sayi:Real; //Sadece yukarıdaki sınırlar arasında değer
alabilir.
• Extended
(+-3.6 x 10^-4951) ve (+-1.1 x 10^4932)
arasında değer alabilen reel sayıdeğişken tipidir. Ondalıklı
kısımdan 19-20 dijite kadar hassasiyetle işlem yapabilir. Ayrıca
bellekte 10 Byte (80 bit) lık yer işgal edecektir.
Var Sayi:Extended; //Sadece yukarıda belirtilen sınırlar
içerisinde değer alabilir
• Comp
(-2^63+1) ile( 2^63 -1) değer alabilen değişken
tipidir. Ondalıklı kısımda 19-20 dijit hassasiyeti ile değer
saklayabilir. Ayrıca bellekte 8 Byte (64 bit) lik yer işgal
edecektir.
Var Sayi:Comp; //Sadece yukarıda belirtilen sınırlar içerisinde
değer alabilir.
• Currency
Parasal veriler için kullanılabilen bu değişken
tipi (-922337203685477.5808) (922337203685477.5807) arasında değer
alabilen 19-20 dijitlik bir değişken tipidir (Ondalıklı kısımdan 4
basamak hassasiyetiyle çalışır). Ayrıca bellekte 8 Byte (64 bit) lik
yer işgal edecektir.
Var Para:Currency; //Ondalıklı kısımdan sadece 4 basamak tutar.
Değişkenlerinizi en ekonomik tipte tanımlamanız,
size daha hızlı sonuca ulaşabilme özelliği kazandıracaktır. Bu
yüzden değişken tanımlarken nasıl olsa Extended hepsini kapsıyor, bu
tip tanımlayıp işlemlerimi yaptırayım düşüncesinden her zaman uzak
durmalısınız. Bir adamın yaşını aktaracağınız değişkeni Double
tanımlamanız sanıyorum size de fazla mantıklı gelmeyecektir.
Bu kısma kadar olan değişkenlerin hepsi sayısal
içerikliydi, buradan sonraki kısımda ise sayısal içeriği olmayan
diğer değişkenler incelemeye alınacaktır. Öncelikle String tipler.
String Değişken Tipleri:
Bu bölümde karakter işlemlerinde
kullanabileceğiniz değişken tiplerinden bahsedeceğim. Matematiksel
ve Tarihsel içeriği olmayan değerleri tutmak için kullanılan
tiplerdir.
• ShortString
255 Kraktere kadar veri alabilen string
değişken tipidir.
Bu tipteki değişkene (‘’) içerisinde bilgi
aktarıldığına dikkat ediniz.
• AnsiString
Yaklaşık olarak 2^31 karaktere kadar değer
atanabilen (en çok kullanacağınız) ve Ansi karakter desteği olan bir
değişken tipidir. Kullanımı ShortString değişkeniyle aynıdır.
• WideString
Yaklaşık olarak 2^31 karaktere kadar (Unicode)
değer atanabilen değişken tipidir.
Var Ad:WideString; //String değişken tanımlandı
String tipte değer alacak olan değişkenlerinizi
yukarıdaki üç tipten birtanesiyle tanımlayabilirsiniz.
Boolean Tip Değişken Tanımlamak:
Bir değişkeniniz sadece true veya
false değerlerini alacaksa bu durumda değişkeninizi Boolean
tip tanımlamalısınız. Bu tip değişkenlerde üçüncü bir durum söz
konusu değildir. Ayrıca değişken tanımlandığı anda varsayılan değeri
false dır.
Var Sonuc:Boolean; //true veya false değerini alabilir.
Tarihsel İçerikli Değişken Tanımlamak:
Delphi içerisinde tarih bilgisi içeren
değerleri tutabilecek olan değişkenler, TDate class’ından
türetilerek kullanılabilir. Aşağıda bu husus örneklendirilmiştir.
Burada tarihsel değişken olarak kullanılan iki
değişken aşağıdaki şekilde tanımlanmıştır.
Var İlktarih,sontarih:TDate; //Tarihsel değişkenler tanımlanıyor.
Daha sonra bu iki değişkene tip dönüştürme işlemi
uygulanarak EditBox kontrollerinden değer atanmıştır. Son olarak iki
tarih arasındaki fark hesaplanıp başlıkta yazdırılmıştır.
Delphi’de Sabit Değişken Tanımlamak:
Bazı durumlarda değeri hiç değişmeyen sabit bir
değişken tanımlamak isteyebilirsiniz. Mesela matematikteki pi sayısı
veya logaritmada kullanılan e sayısı gibi, işte bu tip değişkenleri
özel bir bildirimle yapmalısınız. Aşağıda bu husus
örneklendirilmiştir.
Const’la tanımlamış olduğunuz değişkenin değerini
procedure içerisinde değiştiremezsiniz (Özel birim ile
yapabilirsiniz).
Local Static Değişken Tanımlamak:
Procedure içerisinde (Global değişken
olabilmesi için özel tanımlama bloklarımevcuttur, daha sonraki
kısımlarda incelenecektir.) tanımlanan bir değişken, kod işletildiği
anda bellekte yaratılır, kodun tamamı işletildikten sonra da
bellekten atılır. Procedure’ü ikinci kez tekrar işlettiğiniz zaman
aynı işlemler tekrarlanacaktır. Bu durumda şöyle bir problemle karşı
karşıya kalırız. Procedure’ü ilk işlettiğimiz zaman değişkenimize en
son atanan değeri, ikinci işleteceğimiz zaman kullanmak istersek
(Yani değişkenin en son aldığı değeri bir sonraki çağrılmada
hatırlamak istersek) ne yapabiliriz? Cevabı çok basit, o değişkeni
static olarak tanımlarsınız. Local bir değişkenin static olarak
tanımlanması, o procedure’ü ikinci kez (veya daha fazla)
işlettiğiniz zaman önceki tur bulduğu değeri kullanmasını
sağlayacaktır. Bu olay bir çok durumda işinize tahmininizden daha
fazla yarayacaktır.
Aşağıda bu husus örneklendirilmiştir.
Formunuza bir adet button kontrolü ekleyip
aşağıdaki kodu Clik Yordamına yazın. Projeyi çalıştırdıktan sonra
arka arkaya buttona tıklayın, formun başlığındaki metne dikkat
ederseniz en son bırakılan değerlerin bir sonraki procedure
işletilmesi sırasında hatırlandığını göreceksiniz.
Pencerede kullanılan {$j+} satırı, Const ile
tanımlanan sabit değişkenin değerinin procedure içerisinde yeniden
atanabilmesi (değiştirilebilmesi) için gerekli olan bir kod
parçasıdır. Bu satırı eklemezseniz, Delphi size Const ile tanımlanan
bir değişkenin değerini değiştiremeyeceğinize dair hata
mesajıiletecektir. Hatırlatalım bu satırı procedure içerisinde de
tanımlayabilirsiniz (Ama Const tan sonra bildirmeniz anlamsız
olacaktır).
Tüm Alt Yordamlar Tarafından Kullanılabilecek
Değişken Tanımlamak:
Sanıyorum hepiniz biliyorsunuz, bu işleme
global değişken tanımlama adınıveriyoruz. Bu olayı örneklendirecek
olursak; birinci buttona tıkladığınız zaman değişkene atadığınız
değeri, ikinci buttona tıkladığınız zaman kullanmak isterseniz o
değişkeni global olarak tanımlamalısınız. Aşağıdaki Delphi Unit’i
içerisinde global değişkenleri nasıl tanımlayabileceğiniz
örneklendirilmiştir.
Formunuzun üzerine iki adet button kontrolü
ekleyip, aşağıdaki kodları da gerekli olan yordamlara yazınız.
Görüldüğü gibi iki procedure’de aynı “deger” isimli
değişkeni kolaylıkla kullanabilmektedir. Global değişkenler
procedure’ün işletilmesi bittiği anda bellekten atılmadıkları için,
bir procedure’ün sonundaki değişkenin değeri diğer procedure
içerisinde hatırlanabilmektedir.
Şimdi uygulamanızı çalıştırıp her iki buttona
tıklayın, değişkenin değerinin hatırlandığı sanıyorum dikkatinizi
çekecektir. Burada şunu sorabilirsiniz neden bütün değişkenleri
burada tanımlamıyoruz? Cevabı son derece basittir. Birincisi bu
değişkenler bellekte devamlı yer işgal edeceklerinden
performansıetkileyeceklerdir. İkincisi ise hangi değişkenin hangi
procedur’ler için tanımlandığı büyük uygulamalar için karmaşa
yaratacaktır. Bu sebeplerden dolayı önceliği hep local değişken
tanımlamaya veriniz.
Global değişken tanımlamak için Delphi size başka
bir blok daha sunmaktadır. Dilerseniz Sadece o Unit içerisinde
kullanmak üzere değişkeninizi Private Declarations kısmında
tanımlayabilirsiniz. Eğer global değişkeninizi bu blokta
tanımlayacaksanız, o zaman var veya const bildirisini
kullanamazsınız.
Yukarıdaki pencereye dikkat edecek olursanız
“deger” isimli değişken Unit in Private Declarations kısmında
tanımlanmış olup, tüm alt procedure lerin kullanımına sunulmuştur.
Formunuza iki adet button ekleyin, aşağıdaki kodlarıda gerekli olan
yerlere yazıp projenizi tekrar çalıştırınız.
Şimdi iki buttona arka arkaya tıklayıp sonucu
görebilirsiniz.
Tüm Formlar Tarafından Kullanılabilecek Değişken
Tanımlamak:
Bazı durumlarda birinci formda tanımlamış
olduğunuz bir değişkenin en son değerini ikinci forma ait herhangi
bir prosedürde kullanmak isteyebilirsiniz. Bu tip durumlarda
aşağıdaki yöntemi uygulamalısınız.
//Form1 e ait Unit1
type
TForm1 = class(TForm) Button1: TButton; procedure
Button1Click(Sender: TObject); procedure FormCreate(Sender:
TObject);
private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; var
x:Integer;//İkinci form bu değişkeni kullanabilir
implementation uses Unit2;//Eklemeyi unutmayınız {$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin
form2.show;//Form2 yi aç end; procedure
TForm1.FormCreate(Sender: TObject); begin
x:=155;
end;
Aşağıdaki kod bloğunu da ikinci forma ekleyiniz.
uses Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,Dialogs, Unit1;//Eklemeyi
Unutmayınız.
procedure TForm2.FormCreate(Sender: TObject);
begin
Form2.Caption:=IntToStr(x);//155 yazar
end;
Programı çalıştırıp Button kontrolüne
tıklarsanız Form2 niz açılacaktır. Bu aşamada başlığa dikkat
ederseniz “155” değerinin yazdığını görürsünüz.
Tip Tanımlamaları:
Delphi hesaplamalarınızı gerçekleştirebilmeniz
için size bir çok seçenek (class, değişken, yapı vs.) sunmaktadır.
Bu seçenekler çoğu kez işinizi görmekle beraber bazı durumlarda
kendinize has yeni tipler tanımlamak zorunda kalabilirsiniz. Şimdi
sizlere kendi tip tanımlamalarınızı nasıl yapabileceğinizi göstermek
istiyorum.
Delphi’de kendinize has yeni bir tip
tanımlayacaksanız, bunu type komutuyla
gerçekleştirebilirsiniz. Bu komutla class, yapı, dizi değişkenleri
çok kolaylıkla tanımlayabilirsiniz. Tip tanımlaması sırasında (ğ,ş
vs.) karakterlerinden kullanmayınız.
• Enumerated Types
Type Ad=(birinci=0,ikinci=1,ucuncu=2,dorduncu=3,............)
Yapılan tanımlamada ilk elemanın sayısal değeri 0,
sonrakilerde sırasıyla birer artarak devam edecektir. Dilerseniz
aşağıdaki şekilde bir tip tanımlaması da yapabilirsiniz.
Type
Ad=(birinci=10,ikinci=20,ucuncu=30,dorduncu=40..............)
Aşağıda bu foksiyona ait örneklendirme yapılmıştır.
Burada atanan elemanların sayısal değerlerini
yazdırmak için Ord fonksiyonu kullanılır.
Kodu inceleyecek olursak öncelikle Haftanın yedi
gününün belirlendiği yeni bir (Enumerated) tip tanımı yapılmış olup,
bu tanımlamadan sonra tüm alt yordamlar tarafından kullanılabilmesi
için “gun” isminde bu tipten türetilmişdeğişkenimiz bildirilmiştir.
Procedure içerisinde bu değişkene “Cuma” değeri aktarıldığı için
(type içerisinde herhangi bir değer ataması yapılmadığı için
değişkenlerin değerleri sıra numaralarına eşittir. İlk elemanın sıra
numarasının “0” olduğunu unutmayınız.) bu eleman 5. sırada
bulunmaktadır. Buradan hareketle ilk elemanın numarasının “0”
olduğunu hatırlarsak, formumuzun başlığında “4” değerini
yazdıracaktır.
Aşağıda Enumerated tip tanımlaması yapılarak
haftanın günlerinin ingilizce karşılıkları kullanıcıya
iletilebilmektedir.
Aşağıdaki form tasarımını oluşturunuz.
Şimdi de programda tıkladığınız günün İngilizce
karşılığını mesaj penceresi şeklinde kullanıcıya iletebilmek için
aşağıdaki kodları gerekli olan yordamlara ekleyiniz. Burada Option
buttonlarından birtanesini seçtiğiniz zaman yeni tanımlamış
olduğumuz tip değişkenimizin değeri de otomatik olarak değişecektir.
Tanımlamış olduğumuz değişken global olduğu için, form kapatılana
kadar son seçilen gün bellekte tutulmuş olacaktır.
Tabii bu uygulamayı daha değişik yöntemlerle yeni
tip tanımlaması yapmadan da çözebilirdiniz. Bu tip çözümler size
daha anlaşılır bir yapı sağlayacaktır. Aynı işlemi projenizin başka
bir yerinde tekrar yapmak zorunda kalırsanız; tekrar tekrar aynı
kodları yazmak zorunda kalmazsınız.
Tip tanımlamasından sonra haftanın gününün (Türkçe
olarak bilinen) İngilizce karşılığını kullanıcıya iletmek için
gerekli olan procedure tanımlamasına geçilmiştir (Procedure lere ait
işlemler sonraki bölümlerde çok detaylı olarak incelenecektir).
Yeni tanımladığımız tipe (hafta) ait değerler if
yapısıyla teker teker değerlendirmeye alınmış olup, tüm Türkçe
kelimelerin İngilizce karşılıklarıbelirlenmiştir.
Şimdi aşağıdaki gibi seçilen option buttonu
sayesinde, gün değerini yeni tanımladığımız tip değişkenimize
aktaracak aşağıdaki kodları da programınıza ekleyiniz.
Artık programınızı çalıştırıp sonuçları
görüntüleyebilirsiniz. Tetikleyicilerde önce değerin atandığına,
sonra da daha önce tanımladığımız procedure’ün işletildiğine dikkat
ediniz.
Bu tip içerisinde elemanlar arası geçiş işlemlerini
“inc” (bir sonraki) ve “Dec” (bir önceki) komutlarıyla kolayca
gerçekleştirebilirsiniz.
Programınıza yeni bir button ekleyerek, aşağıdaki
kod satırlarını da belirtilen yordama yazın.
Programı çalıştırıp buttona tıklarsanız formun
başlığındaki değerin devamlıarttığını göreceksiniz. Procedure ün
kodunu aşağıdaki şekilde değiştirirseniz, bu seferde bir önceki
eleman değerine ulaşabilirsiniz.
İlk elemana ulaştıktan sonra tekrar tıklarsanız 255
değerini yazacaktır.

• Subrange Types
Bu şekilde yapacağınız bir tip tanımlaması
sayesinde, aynı tipten türeteceğiniz yeni değişkenin belirlediğiniz
aralık dışında değer almasını engelleyebilirsiniz (Direkt atamalar
için geçerlidir. Dolaylı olarak aralık dışı değer atanabilmektedir).
Type
Karakter=’A’..’Z’; //Sadece büyük harf karakter
girilebilir Sayi=0..100; //Sadece 0-100 arası değer atanabilir.
Yukarıda yapılan tip tanımlaması sayesinde,
kullanacağınız değişkenlerin değerlerinin belirli bir aralıkta
olmasını sağlayabilirsiniz. Aşağıda bu husus örneklendirilmiştir.
type
karakter='A'..'Z'; //Tipler Tanımlanıyor. sayi=0..100;
procedure TForm2.Button6Click(Sender: TObject); var
yeni:karakter; notlar:sayi;
begin
yeni:=a; //Delphi size hata mesajı verecektir. yeni:='K';
//Hata Vermez notlar:=500; //Delphi size Hata Verecektir notlar:=55;
//Hata Vermez
end;
Bu tip tanımlaması sonucu türetmiş olduğunuz
değişkene, aralık dışında kalan değeri direkt olarak atamaya
çalışırsanız hata verecektir. Aşağıdaki gibi bir kod satırı
yazarsanız; programınızın çalışması anında EditBox içerisine aralık
dışında bir değer girseniz bile, program kırılmadan çalışmasına
devam edecektir.
notlar:=StrToInt(Edit1.Text); //Hata Vermez
Yanlışlıkla girebileceğiniz değerleri engellemek
amacıyla kullanabileceğiniz bir tiptir.
Set Types:
Toplu işlemler gerçekleştirebilen bir tip
tanımlamasıdır. Aşağıda bu tip bir deklarasyonu nasıl
gerçekleştirebileceğiniz açıklanmıştır.
Type Ad:Set of char; //Toplu eleman işlemleri için
tip tanımlama
Bu yapıyı anlamanız için aşağıdaki form tasarımını
oluşturup gerekli olan kodları da ekleyiniz.
Burada basılan her tuş (KeyPress Event ına
yazıldığı için) Key parametresine aktarılmakta, ardından tanımlanan
tipe ait belirtilen aralıkta olup olmadığıkontrol edilmektedir.
Key:=#0; satırı ise basılan tuşun iptali için
kullanılmaktadır.
Şimdi örneği biraz daha değiştirip sadece büyük ve
küçük harflere izin verebilecek olan bir program yapalım. İlk
yapacağımız işlem büyük harf ve küçük harf aralığını belirleyecek
olan yeni tiplerimizi tanımlamak olmalıdır. Daha sonra, basılan
karakterin bu aralıklardan bir tanesine ait olup olmadığınıkontrol
edeceğiz.
Aşağıdaki uygulama için formunuzun üzerine sadece
bir adet EditBox kontrolü eklemeniz yeterli olacaktır.
Kodu inceleyecek olursanız, ilk olarak büyük harf
aralığını gösteren değişkenimiz, ardından da küçük harf aralığını
gösteren ikinci değişkenimiz belirlenerek basılan tuşun bu
aralıklardan bir tanesinde bulunup bulunmadığıkontrol edilmektedir.
Bu Kod yüzünden silme işlemini yapan (BackSpace) tuşu
kullanılamayacaktır. Eğer bu tuşu da kullanmak isterseniz, kodu
aşağıdaki şekilde değiştirmelisiniz.
Artık uygulamanızda BackSpace tuşunu kullanarak
yanlış yazılan karakterleri silebilirsiniz.
Bu tip tanımlamasını aşağıdaki şekilde de
kullanabilirsiniz.
| type |
| aralik =
1..500; |
//Aralık
belirleniyor |
| deger =
set of aralik; |
//Aralığı
kullanabilecek olan değişken tanımlanıyor.
|
veya
type deger = set of 1..250; //Bu
şekildede tanımlanabilir.
Daha sonra bu değişkene programın içerisinden
aşağıdaki şekilde toplu değer de atayabilirsiniz.
| var ilk, son: deger; |
| ...
|
| ilk := [1, 3,
5, 7, 9]; |
//Toplu
değerler atanıyor |
| son := [2, 4,
6, 8, 10]; |
//Toplu
değerler atanıyor. |
Bu şekilde bir tip tanımlaması yaptığınız zaman
(Değişken toplu değerleri göstereceğinden dolayı) karşılaştırma
yapacağınız değerin, aralığın içinde olup olmadığını “in”
operatörüyle kontrol ettirmelisiniz (Biz de öyle yaptık).
İf ‘a’ in tip then //içinde varsa begin
//’a’ tip değişkeninin gösterdiği aralıktaysa end; else
begin
//’’ tip değişkeninin gösterdiği aralıkta değilse
end;
veyada
İf not(‘a’ in tip) then //içinde
yoksa begin
//’a’ tip değişkeninin gösterdiği aralıkta
değilse
end;
“not” kullanılarak da olumsuz durum kontrol
ettirilebilir. Tercih burada tamamen programcıya kalmıştır.


• Record Types
Kayıt işlemleri mantığıyla kullanılabilen ve
programcı tarafından tanımlanabilen bir tiptir. Aşağıda bu husus
örneklendirilmiştir.
type birey = record yil: Integer;
ay:(Ocak,Şubat,Mart,Nisan,Mayis,Haziran,Temmuz,Agustos,Eylul,Ekim,
Kasim, Aralik); gun: 1..31; end;
Programın içerisinden de aşağıdaki şekilde değer
ataması yapabilirsiniz.
var birey1: birey; //Tanımlanan tipe üye değişken
tanımlanıyor. ..... Record1.yil := 1973; //Doğum yılını gir
Record1.ay := Mayis; //Doğduğu ayı gir Record1.gun := 1; //Döğduğu
günü gir
With-do bloğu
Yukarıdaki değer atama işlemini kolaylık
açısından aşağıdaki şekilde With – do deyimiyle de
gerçekleştirebilirsiniz.
| with birey1 do |
| begin |
| yil :=
1973; |
//Doğum
yılını gir |
| ay := Mayis;
|
//Doğduğu
ayı gir |
| gun := 1; |
//Döğduğu
günü gir |
| end;
|
|
Yukarıdaki satırlara dikkat edecek olursanız
alt alta üç kere “birey1.” yazmak yerine, tek bir kerede hepsinin
birey1 in özelliğinin olduğunu with – do deyimiyle kolaylıkla
belirtebilmekteyiz. Büyük uygulamalarda satırların çoğalacağını
düşünürseniz işinizi epeyce kolaylaştıracaktır (Karmaşayı da
azalttığını sanıyorum).
Record tip tanımlamasının daha iyi anlaşılabilmesi
için aşağıdaki örnek pencereyi dikkatlice inceleyiniz.
Yapılan tip tanımlamasından sonra bu tipe ait bir
değişken tanımlarsanız belirlemiş olduğunuz tüm özellikleri sağ
tarafında “.” karakterine basarak listeletebilirsiniz.
Proramı çalıştırırsanız arka arkaya 3 kere InputBox
penceresi açılarak değerleri gerekli değişkenlere aktarmanız
sağlanacaktır.

Dizi Değişkenler:
Tüm dillerde olduğu gibi, Delphi de dizi
mantığına çok önem vermektedir. Değişkenlerin dizi olarak
tanımlanabilmesi (Her zaman mümkün olmayabilir.) programı
hızlandıracağı gibi, kod satırlarının da kısalmasını sağlayacaktır
(Yirmi tane öğrencinin notunu dizi değişken kullanmadan InputBox
penceresiyle istettiğinizi düşünsenize). Sabit ve değişken uzunluklu
olmak üzere iki çeşit dizi mevcuttur. Şimdi bu dizi çeşitlerini
detaylıca inceleyelim.
• Sabit Uzunluklu Dizi Değişken Tanımlamak:
Sabit uzunluklu dizi değişken, tanımlandığı
anda boyutunun belirlenmesi şeklinde tanımlanabilir. Belirtilen bu
boyut programın içerisinden kesinlikle değiştirilemez. Aşağıdaki
şekillerde sabit uzunluklu dizi değişken tanımlayabilirsiniz.
var dizi:Array[0..10] of Integer; // 11
elemanlı dizi değişken tanımlandı
veya
type diziler = array[1..10] of Real;
var dizi:diziler; // Bu şekildede dizi değişken tanımlanabilir.
Burada tanımlanan dizi değişkenlerde alt ve üst
sınır dahil olacaktır (Yukarıdaki satırda 11 eleman tanımlanmıştır).
Yani dizi[0] ile dizi[10] arasındaki tüm elemanlar Delphi tarafından
bellekte oluşturulacaktır.
Aşağıdaki şekilde de aynı elemanlara sahip dizi
değişken oluşturabilirsiniz.
Tanımladığınız dizi değişkenin boyutunu programın
içerisinde değiştirme şansınızın bulunmadığını, böyle bir teşebbüste
bulunursanız Delphi’nin size hata mesajını ileteceğini hatırlatmak
isterim.
Sabit uzunluklu dizi değişkenlere tanımlandıkları
yerde ilk değerlerini aşağıdaki şekilde atayabilirsiniz.
Const //Var la ilk değer ataması yapamazsınız
dizin:Array[0..2] of
AnsiString=('Mavi','Yeşil','Sari');
veya
const //Var la ilk değer ataması yapamazsınız.
dizin:Array[0..2] of Integer=(10,20,30);
Aşağıdaki şekilde de sabit uzunluklu dizi
tanımlayıp ona ilk değerini atayabilirsiniz.
type diziler = array[0..2] of
Real; //Reel tip tanımlanıyor ....
Const
dizi:diziler=(10,20,30); //3 elemanlı reel
değişken tanımlandı
Şimdi de basit bir örnek yapalım.
Aşağıdaki kod satırlarını projenizin gerekli olan
yerlerine ekleyiniz.
Dizi değişkenlere tanımlandıkları anda değer
atanabilmesi için, mutlak “const” bildirisiyle tanımlanmış
olmalıdırlar. Aksi takdirde Delphi sizlere hata mesajıiletecektir.
Dizi değişkenleri const ile tanımlarsanız,
procedure içerisinde değerini değiştirmek için aşağıdaki ek kod
satırını ilave etmelisiniz.
Artık procedure içerisinde dizi değişkeninizin
istediğiniz elemanına değer ataması yapabilirsiniz. Burada yapılan
işlemin local static dizi değişken tanımlamaktan hiç de farklı bir
şey olmadığını sanıyorum fark etmişsinizdir. Yapacağınız yeni
atamaların procedure ün bir sonraki işletilmesi sırasında
kullanılabileceği meydandadır.
Şimdide aşağıdaki örneği incelemenizi istiyorum.
Henüz for döngüsünü anlatmadık ama sanıyorum bir çoğunuzun bu
hususta bir fikri olacaktır. Kodun ne kadar anlaşılır ve teknik
olduğu hemen dikkatinizi çekecektir.
Yeni tip tanımlamanın kodun anlaşılabilirliğini ne
kadar artırdığını sanıyorum fark ettiniz. Size de bu tür yapı
tanımlarını kullanmanızı önemle tavsiye ediyoruz.
Sabit Uzunluklu İki Boyutlu Dizi Tanımlamak:
Özellikle matris işlemleri ve tablo oluşturmak
için en çok bilinmesi gereken yapıdır. Tablolar, satır ve sütun
numaraları kullanılarak kesişimleri bir hücre değerini gösterecek
şekilde tasarlanmışlardır. Bu yüzden bir çok veri tabanıişlemi iki
boyutlu dizi mantığı kullanılarak kolayca çözülebilmektedir
(Tablonuzun tüm hücre değerlerine ulaşabilmek için yapmanız gereken
işlem, iki adet for döngüsü içerisinde iki boyutlu tanımlamış
olduğunuz dizi değişkenin satır ve sütun numaralarıyla oynamaktan
ibarettir. Bu hususa veri tabanıkısmında detaylı, hem de çok detaylı
olarak değinilecektir).
Aşağıda iki boyutlu bir dizinin nasıl
tanımlanabileceği gösterilmektedir.
var
ikib_dizi:Array[0..2] of Array[0..1] of Integer; //iki
boyutlu dizi tanımlandı
Yukarıdaki satırda gerçekleşen işlem aşağıda
şematize edilmeye çalışılmıştır. Tanımlamaya dikkat edecek olursanız
ilk boyut için [0..2] (3 eleman), ikinci boyut içinde [0..1] (2
eleman) belirtilmiştir. Şu halde bellekte aşağıdaki gibi 6 eleman
otomatik olarak oluşacaktır.
ikib_dizi[0,0] ikib_dizi[0,1] ikib_dizi[1,0]
ikib_dizi[1,1] ikib_dizi[2,0] ikib_dizi[2,1]
Bu elemanlardan istediğinize değer ataması
yapabilirsiniz.
Bu diziyi aşağıdaki şekilde de tanımlayabilirdiniz.
type
i_dizi=Array[0..2] of Array[0..1] of Integer;
//Yeni tip tanımlandı....... var
cok_dizi:i_dizi; // 6 elemanlı dizi değişken tanımlandı
Yapılan işlemi açıklayacak olursak, ilk olarak
“i_dizi” isminde altı (6) elemandan oluşan dizi değişkene sahip bir
tip tanımlandı. Daha sonra bu yeni tipten “cok_dizi” isminde çok
boyutlu bir dizi değişken türetildi. Artık procedure içerisinde
istediğiniz bölümde bu dizi değişkenin elemanlarına değer
atayabilirsiniz.
Aşağıda bu husus örneklendirilmiştir.
Bir çok uygulamada karşılaşacağınız en büyük dizi
boyutu iki (2) olacaktır, ama biz yine de daha yüksek boyutta dizi
değişkenleri nasıl tanımlayabileceğinizi gösterelim. Aşağıdaki
şekilde kolayca üç boyutlu dizi değişken tanımlayabilirsiniz.
var
u_dizi:Array[0..2] of Array[0..2] of Array[0..1] of
Integer;
Yukarıdaki kod satırıyla 3 boyutlu, 18 elemanlı bir
dizi değişken tanımlanmıştır. Bu elemanlardan dilediğinize aşağıdaki
şekilde değer ataması yapabilirsiniz.
| u_dizi[0,0,0] |
u_dizi[0,0,1]
|
u_dizi[0,1,0]
|
| u_dizi[0,2,0] |
u_dizi[0,2,1] |
u_dizi[1,0,0] |
| u_dizi[0,1,1] |
u_dizi[1,0,1] |
u_dizi[1,1,0] |
| u_dizi[1,1,1] |
u_dizi[1,2,0] |
u_dizi[1,2,1] |
| u_dizi[2,0,0] |
u_dizi[2,0,1] |
u_dizi[2,1,0] |
| u_dizi[2,1,1] |
u_dizi[2,2,0] |
u_dizi[2,2,1] |
Tanımlamayı aşağıdaki şekilde de yapabilirsiniz.
type
boyutdizi=Array[0..2] of
Array[0..2] of Array[0..1] of Integer; .....
var
dizi:boyutdizi; //Dizi değişken tanımlandıÇok
boyutlu dizi değişken tanımlarken yukarıdaki yöntemlerden
dilediğinizi seçebilirsiniz. Herhalikarda sonuçlar aynı olacaktır.
Benim size tavsiyem her zaman tip tanımlaması yaparak kullanmanız
(ikinci kez tanımlamanız gerekirse daha kolay olacaktır).
Değişken Uzunluklu (Dinamik) Dizi Değişken
Tanımlamak:
Okulunuza bir program yazdığınızı düşünün.
Öğrencilerin notlarıyla (ve diğer konularla da) ilgili işlemleri
yapabilecek, karnelerini basabilecek bir program olsun.
Uygulamanızda şöyle bir problemle karşılaşırsınız; bütün sınıfların
mevcutları aynı olmadığı için sınıf mevcutlarını belirlerken
oluşturacağınız dizinin eleman sayısı sizin için sıkıntı
yaratacaktır. Düşünülebilecek en güzel çözüm en fazla öğrencisi olan
sınıfa göre eleman tanımlamak olacaktır. Bu durumda da belleği boş
yere işgal eden kullanılamaz değişkenleriniz oluşmasıkaçınılmazdır
(Tabii uygulamanızda çıkabilecek diğer problemlerden bahsetmiyorum).
İşte bu tür sorunları halledebilmeniz için Delphi sizlere
değişkenlerinizin boyutlarını programın içerisinde değiştirebilme
imkanısunmaktadır. Bu işleme, Dinamik dizi değişken tanımlama adını
veriyoruz.
Aşağıda dinamik dizileri nasıl tanımlayabileceğiniz
ve programın içerisinden onların boyutunu nasıl
belirleyebileceğinizi göstereceğim.
var dinamikdizi:Array of Integer; //Dizi değişken
tanımlandıDikkat ettiyseniz sabit uzunluklu dizi değişkenden tek
farkı dizinin eleman sayısının belirtilmemesidir. Bu şekilde
tanımlanan bir dizi değişken Delphi tarafından Dinamik dizi olarak
kullanılacaktır.
Programın içerisinden dizi değişkenin boyutunu
aşağıdaki şekilde belirleyebilirsiniz.
SetLength(dinamikdizi,10); // 0-9 on elemanlı
dizi değişken
SetLength komutunu kullanarak dizinize boyut
değerini verebilirsiniz. Aşağıdaki basit örneği inceleyiniz.
Dilerseniz dinamik dizinizi aşağıdaki şekilde de
tanımlayabilirsiniz.
type din_dizi=Array of Integer; //Dinamik dizi
içeren tip tanımlaması yapıldı
Program içerisinde aşağıdaki şekilde bir kullanım
mümkün olacaktır.
var
yeni_dizi:din_dizi; //Tanımlana tipten dinamik
dizi değişkeni türetildi. ....
SetLength(yeni_dizi,10);// 10 elemanlı olarak
dinamik dizi boyutlandırıldı.
Aşağıdaki örneği dikkatlice inceleyiniz.
İzleyeceğiniz yol tamamen size kalmıştır.
Çok Boyutlu Dinamik Dizi Tanımlamak:
Yukarıda tanımlanan dinamik diziler tek boyutlu
olarak belirlenmiştir. Şimdi sizlere iki ve daha fazla boyutlu
dinamik dizileri nasıl tanımlayıp kullanabileceğinizi göstereceğim.
Aşağıdaki şekilde iki boyutlu dinamik bir dizi
değişken tanımlayabilirsiniz.
var
dizi:Array of Array of Integer; //İki boyutlu
dizi değişken tanımlandı
Tanımlamış olduğunuz iki boyutlu dinamik dizi
değişkenini yine aynı SetLength komutuyla boyutlandırabilirsiniz.
SetLength(dizi,5,3); // 15 elemanlı oldu
Burada dikkat edeceğiniz husus ilk elemanın
dizi[0,0] son elemanında dizi[4,2] olduğudur (Burada üst sınırlar
kullanılamamaktadır. Çalışma anında hata mesajıyla karşılaşırsınız).
Yukarıdaki kod satırı sayesinde Delphi dizi değişkeniniz için 15
elemanlık boş bellek yeri ayıracaktır (Dizi değişkenler bellekte
arka arkaya bulunurlar. Hızlı işlem yapmalarının bir sebebi de
budur). Artık istediğiniz elemana değer atayabilirsiniz.
Aşağıdaki örneği dikkatlice inceleyiniz.
Aynı işlemi aşağıdaki şekilde de yaptırabilirsiniz.
İzleyeceğiniz yol tamamen size kalmıştır.
Bu kod penceresinde kullanılan SetLength(dizi,5,3);
satırı sayesinde dizi[0,0] dan dizi[4,2] ye kadar 15 eleman için
bellekte boş yer ayrılacaktır.