Delphimweb delphi sitesine hoş geldiniz...


Delphimweb.com->Object Pascal

1.Object Pascal Dilinin temelleri
     Object Pascalda Değişkenler ve Değişken tipleri
     Object Pascalda Tarih ve Zaman tipleri
     Object Pascalda Dizi Değişkenler
     Object Pascalda Pointer tipi değişkenler ve Pointer işlemleri
     Object Pascalda Sabitler
     Object Pascalda Etiketler ve Goto Komutu
     Object Pascalda Tip Tanımlamaları
     Object Pascalda Alt Programlar (Procedure ve Function)
     Alt Programların Birbirini Çağırması
     Alt Programlarda Aşırı Yükleme
     Alt Programların Kendi Kendini Çağırma (Recursive) şeklinde kullanılması
     Object Pascalda Operatörler
     Object Pascalda Begin End Bloğu
     Object Pascalda With Do Bloğu
     Object Pascalda Döngüler
     Döngü Yönlendirme Komutları
     Object Pascalda Karşılaştırma İşlemleri
2.Delphide Unicode Kullanımı
3.Delphide Mesaj Pencereleri
4.Delphide Değer Giriş Pencereleri
5.Delphide İstisnai Durumlar Ve Hata Yakalama
6.Windows Api'leri ve Delphi ile Api Kullanma
7.Delphide Dll Oluşturma ve Kullanma
8.Delphide Asm Kullanımı
9.Delphide En Sık Kullanılan Komutlar
     Inttostr fonksiyonu
     Floattostr fonksiyonu
     FloattostrF fonksiyonu
     FormatFloat fonksiyonu
     Strtoint fonksiyonu
     Strtointdef fonksiyonu
     Strtofloat fonksiyonu
     Strtofloatdef fonksiyonu
     Chr fonksiyonu
     Ord fonksiyonu

Not : Standartlara uygun bir kodlama yapmak için Borland Kodlama Standartları yazısına bakabilirsiniz.

1. OBJECT PASCAL DİLİNİN TEMELLERİ: Object Pascalda değişkenler (Variable) ve değişken tipleri:

Delphide (Object Pascal) bilgileri hafızada saklamak için değişkenleri kullanır. C++ dilinde programın herhangi bir yerinde değişken tanımlaması yapılırken bu delphide (pascal dilinden dolayı) imkansızdır. Object Pascalda değişkenler Var bloğunda tanımlanırlar. Object Pascalda iki tip değişken tanımlanabir: Global ve local değişkenler. Global değişkenler tüm programda kullanılırlabilirler. Global değişkenleri tanımlamak için programın başında var bloğunun içinde yazılmaları gerekir. Local değişkenler ise sadece ilgili prosedür veya fonksiyonun (alt program) içinde kullanılabilen değişkenlerdir. Alt program dışında kullanılamazlar. Alt programa girerken oluşturulurlar, alt programdan çıkarken hafızadan silinirler.

Global ve local değişkenler

Programlar sayıları iki farklı şekilde (tamsayı ve reel sayı) saklayabilir ve kullanabilir.

Aşağıda Object Pascalda kullanılabilen tamsayı (integer) tipindeki değişkenler, alabildikleri değişken aralıkları ve formatları listelenmiştir:

TipAralıkFormat
Integer-2147483648..2147483647işaretli 32-bit
Cardinal0..4294967295işaretsiz 32-bit
Shortint-128..127işaretli 8-bit
Smallint-32768..32767işaretli 16-bit
Longint-2147483648..2147483647işaretli 32-bit
Int64-2^63..2^63-1işaretli 64-bit
Byte0..255işaretsiz 8-bit
Word0..65535işaretsiz 16-bit
Longword0..4294967295işaretsiz 32-bit
UInt640..2^64-1işaretsiz 64-bit

Aşağıda Object Pascalda kullanılabilen gerçek (real) tipindeki değişkenler, alabildikleri değişken aralıkları,basamakları ve kapladıkları alanlar listelenmiştir:

TipAralıkGösterebildiği BasamakKapladığı bayt
Real5.0 x 10^-324 .. 1.7 x 10^30815-168
Real482.9 x 10^-39 .. 1.7 x 10^3811-126
Single1.5 x 10^-45 .. 3.4 x 10^387-84
Double5.0 x 10^-324 .. 1.7 x 10^30815-168
Extended3.6 x 10^-4951 .. 1.1 x 10^493219-2010
Comp-2^63+1 .. 2^63 -119-208
Currency-922337203685477.5808 .. 922337203685477.580719-208

Boolean değişken tipi: İkili (True, False) tipinde değişkendir. Hafızada 1 bayt yer kaplar. True (Doğru) ve False (Yanlış) olmak üzere iki tip değer alabilir. Boolean'da değişkende değer Sıfır ise False, Sıfırdan farklı ise True şeklindedir. Windows ile uyum için 32 bitlik çeşiti de vardır (LongBool)

Variant değişken tipi: Genel kullanım için geliştirilmiş bir değişken tipidir. Tanımlanırken tipi yoktur. Tanımlandıktan sonra sayı (tam veya gerçek) veya yazı tipinde değer alabilir. Aldığı bilgiye göre tipi belirlenir. Bu değişken tipinin alabileceği tipler "varArray, varBoolean, varByRef, varCurrency, varDate, varDispatch, varDouble, varEmpty, varError, varInteger, varNull, varOleStr, varSingle, varSmallint, varString, varTypeMask, varUnknown, varVariant " şeklindedir. İlk tanımlanıp değer verilmediğinde variant değişkenin tipi varEmpty'dir. Variant değişkenlere bir tipde bilgi girip başka bir tipte okumak mümkündür.

Bir değişkenin hafızada kapladığı yeri bayt cinsinden öğrenmek için Sizeof fonksiyonu, en küçük değerini bulmak için Low fonksiyonu, en büyük değerini bulmak için High fonksiyonu kullanılabilir.

Aşağıda Object Pascalda kullanılabilen string (yazı saklamak için kullanılan değişkenler) tipindeki değişkenler, kapasiteleri, kapladıkları alanlar listelenmiştir:

String değişken tipi: Turbo ve Object Pascalda kullanılan string türüdür. Ansistring ile aynıdır. (Rad studio 2009'a kadar). Yazının uzunluğu ilk baytın içinde saklanır. Örneğin "Delphi" yazısı string olarak saklanırsa hafızada "6Delphi" şeklinde yerleştirilecektir.

TipKapasitesiKapladığı bayt
ShortStringMaksimum 255 karaktere kadar2 den 256'a kadar (ilk bayt karakter sayısıdır)
AnsiString (LongString)Maksimum 2 GB'a kadar2 Gb'a kadar Ansi karakterler
UnicodeStringMaksimum 2 GB'a kadar2 Gb'a kadar Unicode karakterler
WideStringMaksimum 2 GB'a kadar2 Gb'a kadar Unicode karakterler
PChar#0 karakterine kadar#0 karakterine kadar
PAnsiChar#0 karakterine kadar#0 karakterine kadar Ansi karakterler
PWideChar#0 karakterine kadar#0 karakterine kadar Unicode karakterler

PChar değişken tipi: Null terminated olarak adlandırılan bir string türüdür. Bu tür C++ dilinde ve Windows Api'lerinde kullanılır. Bu türdeki stringlerin sonunda #0 karakteri bulunur. Bu karakter stringin bittiği noktayı belirler. Diğer string türleri ile Pchar arasında atamalar veya benzer işlemler (birleştirme gibi) yapılabilir. Rad Studio 2009'dan sonra PWideChar ile aynıdır.

PWideChar değişken tipi: Pchar gibidir. Unicode karakterler içindir.

PAnsiChar değişken tipi: Pchar gibidir. Ansi karakterler içindir.

AnsiChar değişken tipi: Byte değişken tipi ile aynı yer kaplar (1 bayt - 8 Bit). Byte 0..255 arasında sayı saklayabilirken Char 0 ile 255 arasında 256 karakter saklayabilir. Byte ile Char benzemelerine rağmen birbirlerinin yerine kullanılamazlar. (C++ dilinde değişken tipleri birbirlerinin yerine kullanılabilir. Karakter yazıp sayı okunabilir veya tersi olabilir)

Char değişken tipi: AnsiChar ile aynıdır. (Rad studio 2009'a kadar)

WideChar değişken tipi: (2 bayt - 16 Bit). Diğer Char tipinden farklı olarak Unicode desteği için 65536 karakter saklayabilir. Bu destek çeşitli dillerdeki farklı karakterlerin kullanılabilmesini sağlar. WideChar, AnsiChar'daki bütün karakterleri kapsar.

Not Delphinin 2009 sürümünden sonra Unicode uyumluluğu için String tipi UnicodeString, Char tipi ise WideChar tipine eşitlenmiştir. Bundan dolayı String içerisinde karakter işlemleri yaparken dikkat edilmelidir.

Object Pascalda değişken ismi seçerken dikkat edilmesi gereken bazı hususlar vardır:

Değişken ismi kesinlikle rakam ile başlayamaz. Fakat değişken ismi içerisinde veya sonunda rakam olabilir. Örneğin 5Elma değişken ismi olarak kullanılamaz fakat Elma5 veya El5ma olabilir
Değişken isminde özel karakterler yer alamaz. Örneğin Elma# veya El#ma değişken ismi olarak kullanılamaz. Özel karakterlerden bazıları şunlardır: # $ & ' ( ) * + , - . / : ;< = > @ [ ] ^ { }
Değişken ismi içerisinde boşluk karakteri yer alamaz. Örneğin El ma değişken ismi olarak kullanılamaz.
Object Pascal için ayrılmış komutlar değişken ismi olarak kullanılamaz. Örneğin Not Object Pascalda kullanılan bir komuttur. Değişken ismi olarak kullanılamaz.
Object Pascalda büyük-küçük harf ayrımı yoktur. Değişken ismi tanımlarken büyük veya küçük harfler beraber kullanılabilir. Örneğin Elma, elma, ELMA, ELma isimleri aynı değişkeni göstermektedir.
Object Pascalda değişken ismi içerisinde Türkçe harf (ç, Ç, ğ, Ğ, ı, İ, ö, Ö, ş, Ş, ü, Ü) kullanılamaz. Örneğin 'Sonuç' değişken ismi olarak kullanılamaz onun yerine 'Sonuc' kullanılmalıdır. (Delphi 2009'dan sonra Türkçe veya diğer diller kullanılabilir)

Değişkenlere değer atanması iki nokta üstüste ve eşittir ":=" kullanılır. Sadece eşittir karşılaştırma işlemleri içindir. Değişkenler tanımlanırken bir başlangıç değeri atanabileceği gibi bir değişkenin değeride diğerine aktarılabilir. Karakter (char) ve yazı (string) değer atanırken başlangıç ve bitişte tek tırnak kullanılır. Tamsayı (integer) değişkenlerde "+" operatörü toplama yaparken, Yazı (String) değişkenlerde ise yazılar ardarda eklenir. Eğer yazı içinde tırnak kullanılması gerekiyorsa bunun için tırnak yazılacak yere 2 tane tek tırnak yazılır. Aşağıda değişkenlere değer atama örnekleri görülmektedir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
Procedure TForm1.Button1Click(Sender: TObject);
Var a, b, c : Integer;
 d, e : Char;
 f, g, h : String;
Begin
 a := 10;
 b := a; // b = 10
 c := a + b; // c = 20
 c := $25; // c = 37 (hexadecimal 25)

 d := 'A';
 e := #66; // e = #66 = 'B'

 f := e + d; // f = BA
 g := 'DENEME'; // g = DENEME
 g[1] := d; // g = AENEME
 g[2] := e; // g = ABNEME

 f := 'Deneme';
 g := ' yazısı';
 h := f + g; // h = Deneme yazısı
 h := 'Delphi''de veritabanı'; // h = Delphi'de veritabanı
End;


Object Pascalda Tarih ve Zaman tipleri :

Değişken olmamalarına rağmen tarih ve zaman bilgilerini saklamak için double değişken tipinde tanımlanmış tipler vardır. Bu tipler kullanılarak tarih, zaman veya ikisi birden saklanabilir veya saklanan bilgi üzerinde işlem yapılabilir. Tarih ve zaman tipleri aşağıdadır :

TDateSadece Tarih saklamak için kullanılır
TTimeSadece Zaman saklamak için kullanılır
TDateTimeTarih ve zaman saklamak için kullanılır

Object Pascalda Dizi Değişkenler (Arrays) :

Dizi değişkenler bir değişken tipinin birden fazla kullanılması gereken yerlerde kullanılan değişkenlerdir. Object Pascalda dizi değişkenlerin tanımlanması ve kullanılması çok kolaydır. Değişkenlerin dizi olarak tanımlanması programı hızlandıracağı gibi, kod satırlarının da kısalmasını sağlayacaktır. Sabit ve değişken uzunluklu olmak üzere iki çeşit dizi mevcuttur.

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ğıda sabit uzunluklu dizi değişken tanımlamaları ve kullanımları görülmektedir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
Var
 dizi : Array[0..10] of Integer;
 // 0 ile 10 arasında 11 elemanlı integer tipinde dizi değişken tanımlandı
 liste : Array[1..5] of String;
 // 1 ile 5 arasında 5 elemanlı string tipinde dizi değişken tanımlandı
 ikilidizi : Array[0..2, 0..1] of Integer;
 // 3 x 2 = 6 elemanlı integer tipinde iki boyutlu dizi değişken tanımlandı
 ikilidizi2 : Array[0..2] of Array[0..1] of Integer;
 // Yine 3 x 2 = 6 elemanlı integer tipinde iki boyutlu dizi değişken tanımlandı
Begin
 dizi[1] := 150; dizi[2] := 85;
 liste[1] := 'Ahmet'; liste[2] :='Mehmet';
 ikilidizi[0,0] := 150; ikilidizi[0,1] := 85; ikilidizi[2][1] := 120;
 ikilidizi2[0,0] := 150; ikilidizi2[0][1] := 85; ikilidizi2[2,1] := 120;


Normal değişkenler için geçerli kurallar Dizi değişkenler için de geçerlidir. Değişken dizileri tek, iki veya üç boyutlu olabilir. Dizi başlangıç ve bitiş numarası istenildiği seçilebilir. Program yazılırken verilen dizi başlangıç ve bitiş değerlerine dikkat edilmelidir.

Değişken uzunluklu (Dinamik) dizi değişkenler ise boyutları sabit olmayan sonradan değiştirilebilen dizi değişkenlerdir. Normal değişkenler için geçerli kurallar Dinamik dizi değişkenler için de geçerlidir. Dinamik dizi değişkenleri tek, iki veya üç boyutlu olabilir. Aşağıda Dinamik dizi değişken tanımlaması ve kullanımı görülmektedir:

1
2
3
4
5
6
7
8
9
10
11
12
13
 
Var
 dizi : Array of Integer; // Integer tipinde dinamik dizi değişken tanımlandı
 liste : Array of String;// String tipinde dinamik dizi değişken tanımlandı
 ikilidizi : Array of Array of Integer;
 // Integer tipinde iki boyutlu dinamik dizi değişken tanımlandı

Begin
 SetLength(dizi, 11);
 SetLength(liste, 5);
 SetLength(ikilidizi, 3, 1);

 dizi[1] := 150; dizi[2] := 85;
 liste[1] := 'Ahmet'; liste[2] := 'Mehmet';
 ikilidizi[1,1] := 150; ikilidizi[1,2] := 85; ikilidizi[2,2] := 120;


Dinamik dizilerin boyutu tanımlandıktan sonra SetLength komutu ile boyutları değiştirilebilir. Yalnız yeni boyut eskisinden küçük olursa bilgi kaybı olacaktır.

Object Pascalda Pointer tipi değişkenler ve Pointer işlemleri:

Pointer değişken tipleri 4 bayt yer kaplayan (32 bit hafıza adresini saklayabilecek şekilde) ve hafızadaki değişkenler üzerinde işlem yapmak için kullanılan değişkenlerdir. Değişken ve tip tanımlamalarının pointer değişkeni tanımlanıp kullanılabilir. Pointer değişkenler hafızada kapladığı alan bakımından Integer değişkenlere benzetilebilir. Fakat pointer değişkenler değişken değeri olarak hafıza adresi saklarlar. Windows işletim sistemi rastgele hafıza adresleri üzerinde işlem yapmaya izin vermemektedir. Fakat programcı kendi programındaki tanımladığı değişkenler üzerinde Pointerleri kullanarak her türlü işlem yapabilir. Pointer değişkenin hafızada saklandığı kendi adresi vardır, ayrıca pointer değişken değer olarak başka bir adres saklar. Bu iki adres birbirine karıştırılmamalıdır. Pointer değişken tanımlamasına ve kullanımına aşağıdaki örnek verilebilir:

1
2
3
4
5
6
7
8
9
10
11
 
Var
 X, Y: Integer; // X ve Y Integer değişkenlerdir
 P: ^Integer; // P, Integer tipinde Pointer değişkendir
Begin
 X := 17; // X değişkenine 17 değeri verilmektedir
 P := @X; // P Pointerine X değişkeninin adresi değer olarak verilmektedir
 // Buradan sonra P pointeri üzerindeki işlemler X değişkeni içinde geçerlidir

 Y := P^;
// Y değişkeni P Pointerinin Gösterdiği adresteki değere (X değişkeni) eşitlenmektedir
 // X değişkeni ile Y değişkeni aynı değere (17) sahiptir

end;


Pointerler pointer tipinde olabilecekleri gibi başka değişkenlerin pointerleri olarakta tanımlanabilirler. Genelde pek bir fark olmaz çünkü sonuçta pointer 4 bayt yer kaplamaktadır ve 32 bit hafıza adresi saklayacaktır. Pointerler ilk tanımlandıklarında nil (0) değerine sahiptirler. Bundan dolayı sabit bir değişken adresine eşitlenmedikleri sürece üzerlerindeki işlemler hataya sebep olacaktır. Aşağıdaki uygulamada tanımlanmış dizi değişkene pointer ile ulaşım ve elemanlarının değerleri arasında pointer ile dolaşma yapılmaktadır. Ayrıca dizi değişken elemanların adresleri ve pointerin kendi adresi görüntülenmektedir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
...
Var
 Form1: TForm1;
 P: ^Integer; // P, Integer tipinde Pointer değişkendir. Global değişkendir.

Implementation
{$R *.dfm}

Procedure TForm1.Btn1Click(Sender: TObject);
Var
 X:array [1..3] of Integer; // X Integer dizi değişkendir
 Y: Integer; // Y Integer değişkendir
Begin
 memo1.Clear;
 X[1] := 17; X[2] := 27; X[3] := 37; // X dizisinin elemanlarına 3 farklı değeri verilmektedir

 P := @X; // P Pointerine X değişkeninin adresi değer olarak verilmektedir
 Y := P^; // Y değişkeni P Pointerinin Gösterdiği adresteki değere (X değişkeni) eşitlenmektedir
 // X[1] değişkeni ile Y değişkeni aynı değere (17) sahiptir
 memo1.Lines.Add(Inttostr(Y)); // Y değişkeninin değeri memoya ekleniyor (17)
 memo1.Lines.Add(inttostr(P^)); // Pointerin gösterdiği adresin değeri (17)
 memo1.Lines.Add(Format('%p', [P])); // Pointer adresi değeri memoya ekleniyor (0012F5B4)
 memo1.Lines.Add(Format('%p', [@P])); // Pointer kendi adresi değeri memoya ekleniyor (00453B68)
 memo1.Lines.Add('');

 Inc(P, 2); // Pointer adresi 2 artılıyor. Integer olduğu için hafıza değeri 8 bayt artıyor
 Y := P^; // Y değişkeni P Pointerinin Gösterdiği adresteki değere (X değişkeni) eşitlenmektedir
 // X[3] değişkeni ile Y değişkeni aynı değere (37) sahiptir
 memo1.Lines.Add(Inttostr(Y)); // (37)
 memo1.Lines.Add(inttostr(P^)); // (37)
 memo1.Lines.Add(Format('%p', [P])); // (0012F5BC)
 memo1.Lines.Add(Format('%p', [@P])); // (00453B68)
 memo1.Lines.Add('');

 Dec(P); // Pointer adresi 1 azaltılıyor. Integer olduğu için hafıza değeri 4 bayt azalıyor
 Y := P^; // X[2] değişkeni ile Y değişkeni aynı değere (27) sahiptir
 memo1.Lines.Add(Inttostr(Y)); // (27)
 memo1.Lines.Add(inttostr(P^)); // (27)
 memo1.Lines.Add(Format('%p', [P])); // (0012F5B8)
 memo1.Lines.Add(Format('%p', [@P])); // (00453B68)
...


Not Burada bulunan kodu dosya halinde sitenin kaynaklar sayfasında bulabilirsiniz.

Object Pascalda Sabitler (Const) :

Sabitler program yazılırken belirlenen, program çalışması sırasında değiştirilemeyen bildirimlerdir. Sabitler, numerik ve karakter olmak üzere iki çeşittir. Numerik sabitler 0..9 arasında rakamlarla veya $ işareti ile başlamak zorundadır. Hexadecimal sayıların başında $ işareti olmalıdır. (Örneğin BAD4 yerine $BAD4 şekilde). Karakter sabitlerinin ise başına ve sonuna tek tırnak eklenmelidir. Sabit belirlenirken tipide belirtilebilir.

Sabit ismi tanımlarken uyulması gereken kurallar değişken ismi için gerekli kurallar ile aynıdır. Sabit ismi için genel olarak tümü büyük harf olması tercih edilir. Zorunlu değildir fakat sabitleri değişkenlerden ayırmayı kolaylaştırır. Aşağıda tanımlanmış birçok sabit örneği görülmektedir:

1
2
3
4
5
6
7
 
Const
  SABIT1 = 100;
  SABIT2 = $BAD4;
  SABIT3 = 'Delphimweb';
  SABIT4 = 'Delphi Sitesi';
  SABIT5 : Byte = 25;
  SABIT6 : Integer = 150;


Sabitler sonradan değiştirilemez. Fakat {$J+} veya {$WRITEABLECONST ON} direktifleri ile sabitlerini sonradan değiştirilebilmesi sağlanabilir. {$J-} veya {$WRITEABLECONST OFF} direktifleri ile ise sabitlerin sonradan değiştirilememesi sağlanır

Object Pascalda Etiketler (Label) ve Goto Komutu :

Basic'te program kodunda bir noktadan diğer bir noktaya geçiş için Go to komutu kullanılır. Go to komutu kullanışlı olmasına rağmen çok sık kullanılması durumunda spagetti kod denilen karışık, anlaşılması zor programlar ortaya çıkmaktadır. Object Pascalda gelişmiş döngü komutları (Repeat ... Until(); veya While () do ...;) bulunmaktadır. Bu komutlar ile istenilen döngüler kolayca oluşturulabilir. Ayrıca Basic'te bulunan Go to komutuna karşılığı Object Pascalda da bulunmaktadır. Object Pascalda Goto komutu ile gidilecek etiketler önceden tanımlanmak zorundadır. Etiket ismi tanımlarken uyulması gereken kurallar değişken ismi için gerekli kurallar ile aynıdır. Aşağıda etiket tanımlama ve Goto komutunun kullanımı ile ilgili örnek kod görülmektedir:

1
2
3
4
5
6
7
8
9
 
Procedure TForm1.Button1Click(Sender: TObject);
Var a : byte;
Label Etiket1;
Begin
  a : = 0;
Etiket1:
  a : = a + 1;
  if a < 5 then Goto Etiket1;
end;


Burada kodda Button1 tuşuna basılması durumunda a değişkeni önce sıfır değeri almaktadır. Önceden tanımlanmış olan Etiket1 isimli etiket ve Goto komutu yardımı ile bir döngü oluşturulmuştur. Bu döngü içerisinde a değişkeninin değeri artırılmaktadır. Döngünün devamı a değişkeninin 5 değerinden küçük olmasına bağlıdır. Kontrol if komutu ile yapılmaktadır. Döngünün devamını sağlayan şart devam ettikçe program satırı Etiket1 ile Goto komutu arasında devamlı olarak çalışacaktır.

Object Pascalda Tip Tanımlamaları :

Type, Object Pascalda bulunmayan yeni tipler tanımlamak için kullanılır. Type ile yeni değişken, sınıf, küme ve yapılar oluşturulabilir. Kullanımı şu şekildedir: Type YeniTipÇeşiti = Tip . Tip tanımlarken uyulması gereken kurallar değişken ismi için gerekli kurallar ile aynıdır. Aşağıda tip tanımlama ceşitleri ve tip tanımları görülmektedir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
Type
 Kelime10 = String[10]; //Özel bilgi tipi tanımlamaları
 Dizi15 = Array[1..15] of Integer;
 Matris5x5 = Array[1..5, 1..5] of Integer;

 Adres = Record //Kayıt (record) tipi tanımlaması
  AdSoyad : String[25];
  Telefon : String[15];
 End;

 Sayi = 0..100; //Aralık bilgi tipi tanımlamaları
 Karakter = 'A'..'Z';
 Haftaici = (Pazartesi, Sali, Carsamba, Persembe, Cuma);
 HaftaSonu = (Cumartesi=6, Pazar=7);

 PInteger = ^Integer; //Pointer tipi tanımlaması

 Ad = Set of Char; //Küme tipi tanımlamaları
 Deger = Set of Sayi;
 Deger1 = Set of 0..150;
 Karakterler = Set of 'A'..'Z';

 TNesne = class //Nesne tipi tanımlama
 private
  isim : string;
 public
  function IsimAl : string;
  constructor Create(i : string);
 End;


Object Pascalda Alt Programlar (Procedure ve Function) :

Aynı kodun birden fazla işletileceği durumlarda, işletilecek kodun tek bir yerde tanımlanıp gerekli yerlerden kullanılması sağlanabilir. Bu tanımlamaya alt program denir. Alt programların kullanılabilmesi için çeşitli şartlar ve seçenekler vardır:

Her alt programın bir ismi vardır. Alt program isimleri değişkenler için geçerli kurallara tabidir.
Alt programlar asıl programdan veya başka bir alt programdan çağrılabilirler.
Alt programlar istenilirse çalışmak için dışardan parametre veya parametreler (değişken) alabilir. Bu değişkenler normal veya dizi değişken olabilir.
Alt programlar -herhangi bir sınıf (class) için tanımlanmamışlarsa- çağrıldıkları program satırının veya alt programın satır olarak üstünde olmalıdırlar.
Alt programlar -herhangi bir sınıf (class) için tanımlanmamışlarsa- başka bir unitin içinde kullanılabilmeleri için bulunduğu unitin içerisinde Interface ile Implementation satırları arasında isim olarak tanımlanmalıdırlar. Harici kütüphanelerin içindeki alt programların isimleri de burada tanımlanır.

1
2
3
4
5
6
7
8
9
 
Interface
 Function Topla(x, y:integer):integer;
 Procedure Kontrol(fn:string; tp:byte);external 'Readlib.dll';

Implementation
Function Topla(x:integer; y:integer):integer;
Begin
 result := x+y;
End;


Alt programların dışarıdan aldıkları parametrelerin alt program içerisinde değiştirilmemesi isteniyorsa parametre değişkeninin başına Const eklenmelidir.

1
 
function Topla(Const x;integer; Const y:integer):integer;



Alt program tipleri iki çeşittir:
Procedure (Prosedür): Sonlandığında herhangi bir değer döndürmeyen alt programlardır. Procedure kelimesi ile başlarlar.

1
 
Procedure EkranaYaz(x;integer; y:integer);


Function (Fonksiyon): Sonlandığında değer döndüren alt programlardır. Function kelimesi ile başlarlar. Döndürmesi istenen tip fonksiyonun sonunda tanımlanır. Tek bir değişken döndürebilirler. Bu değişkenler normal veya dizi değişken olabilir. Fonksiyonun sonunda result değişkenine döndürülecek değer(ler) eşitlenir.

1
 
Function Topla(x, y:integer) : integer;


Not Alt programlardan Function bir değer döndürmek için kullanır. Birden fazla değer döndürülmesi gereken yerlerde ise Var kelimesi kullanılır. Tanımlama için değer döndürmesi gereken değişkenin başına Var yazılmalıdır, değer döndürmesi için ise Var kelimesi kullanılan değişkene alt program içerinde değer atanması yeterlidir.

1
2
3
4
 
Procedure EkranaYaz(Var x;integer; Var y:integer);
Begin
 x := 100; y :=250;
 ...


Not Eğer alt programlara büyük miktarda bilgi gönderilmesi gerekiyorsa alt programa değişken değerinin kopyasını göndermek yerine değişkenin adresi (pointer) gönderilebilir. Bu şekilde gönderilen alt program içindeki işlemler doğrudan gönderilen değişken üzerine yapılmış olur. Bu yöntem Windows programlarında (Api fonksiyonlarında) çok sık kullanılır. Hafıza tasarrufu sağlar. Bu yöntem aşağıdaki örneklerde görülebilir

9
...
20
...
...
29
30
31
32
33
34
35
36
37
38
39
40
...
 
Type
...
 PInteger = ^Integer; // Altprogramda Integer pointer kullanımı için gerekli tanımlama
...
...
Procedure Altprogram1(x : PInteger);
Begin
 x^ := x^ + 3; // Gönderilen pointer değeri 3 artırılıyor
End;

Procedure TForm1.Button1Click(Sender: TObject);
Var i : Integer;
Begin
 i := 2; // i değişkeninin değeri 2
 Altprogram1( @i ); // i değişkeninin pointer adresi Altprograma parametre olarak gönderiliyor
 // i değişkeninin değeri 5
End;
...


1
2
3
4
5
6
7
 
Procedure TForm1.Button1Click(Sender: TObject);
Var temp_klasor: array[0..MAX_PATH] of char;
Begin
 GetTempPath(SizeOf(temp_klasor), @temp_klasor);
 // GetTempPath api fonksiyonuna temp_klasor parametresi pointer olarak gönderilmektedir
 ShowMessage(temp_klasor);
End;


Alt Programların Birbirini Çağırması:

Delphide üst kısımda yazılmış bir alt program alt kısımda bulunan başka bir alt programı çağıramaz. Bu çağırma işleminin yapılabilmesi için altta bulunan alt programın üst kısımda tanıtılması gerekir. Bunun için forward kelimesi kullanılır. Nesneler içinde tanımlanmış alt programlarda bu sorun yoktur. Aşağıda birbirini çağırabilen altlı üstlü iki alt program bulunmaktadır:

1
2
3
4
5
6
7
8
9
10
11
 
Procedure Altprogram2; forward;

Procedure Altprogram1;

Begin
 Altprogram2;
End;

Procedure Altprogram2;
Begin
 Altprogram1;
End;


Alt Programlarda Aşırı Yükleme:

Delphi aynı isme sahip farklı parametreli birden fazla alt program tanımlanmasına izin vermektedir. Bu olaya (Overload) Aşırı Yükleme denir. Delphi çalışırken kod içerisinde hangi alt programı kullanacağına parametre sayılarına ve tiplerine bakarak karar verir. Birden fazla aynı isimli alt programı aşırı yüklemeli tanımlamak için her bir alt programın başlık kısmına Overload; kelimesi eklenmelidir. Aşağıda aynı isme sahip iki alt program aşırı yükleme yapılarak tanımlanmıştır:

1
2
3
4
5
6
7
8
9
 
Function Bol(X, Y: Real): Real; overload;
Begin
 Result := X / Y;
End;

Function Bol(X, Y: Integer): Integer; overload;
Begin
 Result := X div Y;
End;


Burada alt program Real tipinde değişkenler kullanılarak çağrılıyorsa birincisi, Integer tipinde değişkenler kullanılarak çağrılıyorsa ikincisi kullanılır. Tanımlama yapılırken alt programların parametre tiplerinde, sayılarında farklılık yoksa Delphi hata verecektir.

Alt Programların Kendi Kendini Çağırma (Recursive) şeklinde kullanılması:

Tanımlanmış olan fonksiyon, kod bloğu içerisinde, kendi kendisini çağırıyorsa bu tip fonksiyonlara "Rekürsif" fonksiyon denir. Aşağıdaki faktöriyel hesaplayan örnek fonksiyonda, bu yapıya ait kullanım şekli görülmektedir:

1
2
3
4
5
6
7
8
9
10
11
12
 
{$J+} // Sabitlere yazılabilmesini sağlıyor

Function faktoriyel(sayi : Integer):Double;
 Const Toplamlar : Double = 1;
Begin
 if sayi>1 then Toplamlar := sayi * faktoriyel(sayi-1);
//Fonksiyon kendi kendini çağırıyor
 Result := Toplamlar;
 Toplamlar := 1;
End;

Sonuc := faktoriyel(5);//Alt programın çağırılması


Not Alt programların kendi kendine çağırmaları şeklinde kullanılmaları kodlama açısından birçok faydalar sağlar. Fakat alt programlar çağrıldıklarında çağıran yere geri dönebilmeleri için dönecekleri adres Stack denilen hafızada saklanır. Bu sebeple bir alt programın sürekli kendini çağırması Stack Taşması (Stack Overflow) hatasına sebep olacaktır.

Object Pascalda Operatörler :

Object Pascalda matematiksel ve string işlemlerde kullanan operatörler aşağıda tablo halinde verilmiştir:

OperatörGöreviÖrnekSonuç
+Toplama-String işlemlerinde ikinci yazıyı ilk yazının arkasına ekleme10+2030
-Çıkarma-Fark10-20-10
-Negatifini alma-10-10
*Çarpma10*20200
/Bölme20/102
ModMod-Bölüm kalanı10 Mod 31
DivTam Bölüm10 Div 33
IncBir veya birden fazla artırmaInc(a, 2)a+2
DecBir veya birden fazla azaltmaDec(a)a-1

Object Pascalda mantıksal ve karşılaştırma işlemlerinde kullanan operatörler aşağıda tablo halinde verilmiştir:

OperatörGöreviÖrnek
NotMantıksal Değil(Not) işlemi-Karşılaştırmada sonucun tersini vermeNot(x)
AndMantıksal Ve(And) işlemi-Karşılaştırmada iki sonucunda doğru olması durumunda doğru olmax AND y
OrMantıksal Veya(Or) işlemi-Karşılaştırmada iki sonuçtan herhangi birisinin doğru olması durumunda doğru olmax OR y
XorMantıksal ÖzelVeya(Xor) işlemix XOR y
ShlMantıksal Sola kaydırma (Shl)x SHL y
ShrMantıksal Sağa kaydırma (Shr)x SHR y

Object Pascalda Koşul işlemlerde ve Atamada kullanan operatörler aşağıda tablo halinde verilmiştir:

OperatörGöreviÖrnek
:=Atama. Soldaki değişkene sağdaki değeri atamaA:=10
=İki koşulun eşit olması kontrolüA=B
<>İki koşulun farklı olması kontrolüA<>B
<İlk koşulun ikincisinden küçük olması kontrolüA<B
>İlk koşulun ikincisinden büyük olması kontrolüA>B
<=İlk koşulun ikincisinden küçük-eşit olması kontrolüA<=B
>=İlk koşulun ikincisinden büyük-eşit olması kontrolüA>=B

Object Pascalda Begin End Bloğu :

Object Pascalda döngüler, karşılaştırma ifadeleri gibi duruma göre komutların çalıştırıldığı yerler bulunmaktadır. Döngü veya karşılaştırma ifadeleri bir tane komut ile kullanılabilir. Fakat bazı durumlarda birden fazla komutun bir ifade için işletilmesi gerekebilir. Bu durumlar için Begin End bloğu kullanılır. Begin End bloğu içerisine istenildiği kadar komut konulabilir ve döngü, karşılaştırma ifadeleri bu bloğu tek bir komutmuş gibi kullanır. Begin end bloğu program içerisinde istenildiği kadar kullanılabilir. Begin end komutu içerisine tek komut konulması hataya sebep olmaz fakat kodun okunmasını zorlaştırır. Aşağıda Begin end bloğu kullanımış örnek görülmektedir:

1
2
3
4
5
 
for s := 1 to 10 do
Begin
 a := a + b;
 c := a / 5;
End; //For döngüsü Begin end bloğu içerisindeki komutları tek bir komut gibi işlemektedir.


Object Pascalda With Do Bloğu :

Nesne ve Record tipleri gibi tanımlamalarda kodu basitleştirmek ve okunmasını kolaylaştırmak amacıyla With Do bloğu kullanılır. Aynı ifade tekrar tekrar yazılmak yerine With Do ile bir sefer yazılır ve blok içerisindeki her ifade için geçerli olur. Aşağıda With do kullanımına ait örnek bulunmaktadır.

...
9
...
20
21
22
23
24
25
26
27
...
33
34
35
36
37
38
39
40
41
42
43
...
 
...
Type
...
TOgrenci = Record
 isimsoyad : string[20];
 numara : Integer;
End;

Var
Form1: TForm1;
Ogrenci1, Ogrenci2 : TOgrenci;
...
Procedure TForm1.Button1Click(Sender: TObject);
Begin
 Ogrenci1.isimsoyad := 'ahmet';
 Ogrenci1.numara := 123;

 With Ogrenci2 Do
  Begin
   isimsoyad := 'mehmet';
   numara := 345;
  End;
End;
...


Object Pascalda Döngüler :

Döngüler yazılım dilleri içerisinde çok önemli yer tutan komutlardır. Arka arkaya bir çok kez işletilmesi gereken kodların bulunduğu durumlarda, veya belirlenen şartın gerçekleşmesine veya gerçekleşmemesine kadar işletilmesinde döngüler kullanılır. Object Pascalda üç çeşit döngü vardır:

For to ve For downto döngüleri: Bu döngü ile bir başlangıç ile bir bitiş arasındaki fark kadar bir blok çalıştırılır. İki farklı For döngüsü vardır. Bunlar başlangıcın bitişten küçük olduğu For to döngüsü ve başlangıcın bitişten büyük olduğu For downto döngüsüdür. Bu döngülerdeki başlangıç ve bitiş değerleri sabit sayılar olabileceği gibi değişkenlerde kullanılabilir. Yalnız değişkenlerin değeri değiştirilirken başlangıcın bitişten farkına göre döngü seçilmelidir. Aksi halde program hata verecektir. (C++ dilinde böyle bir sorun yoktur). Aşağıda For to ve For downto döngüleri hakkında örnekler görülmektedir:

1
2
3
4
5
6
7
8
9
10
11
12
13
 
 For s := 1 To 10 do EkranaYaz;
 //EkranaYaz, For to döngüsü içerisinde 1 den 10 a kadar toplam 10 defa çağrılıyor.

 For s := 10 Downto 1 do EkranaYaz;
 //EkranaYaz, For downto döngüsü içerisinde 10 dan 1 e kadar toplam 10 defa çağrılıyor.

 Bs := 5; Bt := 8;
 For s := Bs To Bt do EkranaYaz;
 //EkranaYaz, For to döngüsü içerisinde 5 den 8 e kadar toplam 3 defa çağrılıyor.

 Bs := 8; Bt := 3;
 For s := Bs Downto Bt do EkranaYaz;
 //EkranaYaz, For downto döngüsü içerisinde 8 den 3 e kadar toplam 5 defa çağrılıyor.


Repeat Until döngüsü: Object Pascalda kullanılan döngülerden biride Repeat until döngüsüdür. Bu döngüde Repeat ile until arasındaki blok Until kelimesinden sonraki kontrol şartı yanlış oldukça çalışacaktır. Yani Untildeki karşılaştırma doğru çıkana kadar döngüden çıkılmaz. Bu döngüde kontrol sonda yapıldığı için döngüden hemen çıkılsa bile döngü içerisindeki kod en az bir defa çalıştırılacaktır. Buna dikkat edilmelidir. Eğer ters karşılaştırma yapılması isteniyorsa yani şart oluştuğunda döngüden çıkılması isteniyorsa döngü Not operatörü ile kullanılabilir. Aşağıda Repeat until döngüsüne iki ayrı örnek verilmiştir:

1
2
3
4
5
6
 
a := 0; c := 0;
Repeat
 a := a + 1;
 c := a + 5;
Until (a>=5);
//Repeat until döngüsünde a değişkeni 5'ten küçük oldukça döngü çalışacaktır.


1
2
3
4
5
6
 
a := 0; c := 0;
Repeat
 a := a + 1;
 c := a + 5;
Until Not(a<5);
//Repeat until döngüsünde a değişkeni 5'ten küçük oldukça döngü çalışacaktır.


While do döngüsü: Object Pascalda kullanılan döngülerden biri de While do döngüsüdür. Bu döngüde While ile do arasında şart, do'dan sonraki blokta çalıştırılacak döngü bulunur. While ile do arasındaki kontrol şartı doğru oldukça döngü çalışacaktır. Yani While do'da karşılaştırma yanlış çıkana kadar döngüden çıkılmaz. Bu döngüde kontrol başta yapılmaktadır. Eğer ters karşılaştırma yapılması isteniyorsa yani şart oluşmadığında döngüden çıkılması isteniyorsa döngü Not operatörü ile kullanılabilir. Aşağıda While do döngüsüne iki ayrı örnek verilmiştir:

1
2
3
4
5
6
 
a := 0; c := 0;
While(a < 5) do //While do döngüsünde a değişkeni 5'ten küçük oldukça döngü çalışacaktır.
Begin
 a := a + 1;
 c := a + 5;
End;


1
2
3
4
5
6
7
 
a := 0; c := 0;
While Not(a >= 5) do
//While do döngüsünde a değişkeni 5'ten küçük oldukça döngü çalışacaktır.

Begin
 a := a + 1;
 c := a + 5;
end;


Döngü Yönlendirme Komutları :

Döngü kodlarınızın işletilmesi anında, belirlenmiş olan şartın (veya şartların) gerçekleşmesi durumunda, döngüden veya alt programdan çıkmak veya tekrar başa (döngünün başına) dönmek istenebilir. Bu tip durumlar için Object Pascalda çeşitli komutlar vardır:

Continue komutu : Bir döngü içerisinde belirli bir şartın sağlanması durumunda, döngünün içerisindeki diğer kodları işlenmeden tekrar döngü başına dönülmesini sağlayan komuttur. Burada for döngüleri için sayaç değişkeni değeri artacaktır. Continue komutun amacı belirli şartlarda döngü içerisindeki belirli komutların işlenmemesi ve döngüye işlenmiş gibi devam edilmesidir.

1
2
3
4
5
6
7
8
 
a := 0; c := 0;
Repeat
 a := a + 1;
 if a = 3 then Continue;
 {Döngü içerisinde a değişkeni 3 değeri aldığında
 alttaki komutlar işlenmeden döngü başına dönülecektir.}

 c := a + 5;
Until (a>=5);


Break komutu : Bir döngü içerisinde belirli bir şartın sağlanması durumunda, döngünün içerisindeki diğer kodları işlenmeden döngü dışına çıkılmasını sağlayan komuttur. Break komutun amacı belirli şartlarda döngü içerisindeki belirli komutların işlenmemesi ve döngüden çıkılmasıdır.

1
2
3
4
5
6
7
8
 
a := 0; c := 0;
Repeat
 a := a + 1;
 if a = 3 then Break;
 {Döngü içerisinde a değişkeni 3 değeri aldığında
 alttaki komutlar işlenmeden döngüden çıkılacaktır.}

 c := a + 5;
Until (a>=5);


Exit komutu : Bir döngü içerisinde belirli bir şartın sağlanması durumunda, döngünün içerisindeki diğer kodları işlenmeden hem döngü dışına hem alt program dışına çıkılmasını sağlayan komuttur. Exit komutunun kullanılması için döngü illa gerekli değildir. Alt programlarda da aynı amaçla kullanılabilir.

1
2
3
4
5
6
7
8
 
a := 0; c := 0;
Repeat
 a := a + 1;
 if a = 3 then Exit;
 {Döngü içerisinde a değişkeni 3 değeri aldığında
 alttaki komutlar işlenmeden döngüden ve alt programdan çıkılacaktır.}

 c := a + 5;
Until (a>=5);


Halt komutu : Belirli bir şartın sağlanması durumunda, diğer kodların işlenmeden program dışına çıkılmasını sağlayan komuttur. İstenirse program çıkışında işletim sisteminin kullanımı için bir çıkış değeri ile kullanılabilir.

1
2
3
4
5
6
7
8
 
a := 0; c := 0;
Repeat
 a := a + 1;
 if a = 3 then Halt(1);
 {Döngü içerisinde a değişkeni 3 değeri aldığında programdan çıkılacaktır.
  Program çıkışında işletim sistemi kullanımı için 1 değeri üretilecektir.}

 c := a + 5;
Until (a>=5);


NotApplication nesnesinin Terminate komutu Halt ile benzer çalışmaktadır. Herhangi bir döngü içerisinde Halt kullanılırsa direkt program sonlanır. Fakat Application.Terminate kullanılırsa ancak döngü bittikten sonra program sonlanır. Application.Terminate ile programın direkt sonlanması istenirse Application.Terminate komutu Exit komutu ile birlikte kullanılmalıdır.

Sleep komutu : Özellikle döngülerde çok hızlı işleyen kodları izleyebilmek veya zaman kazanmak amaçlı kullanılan bir komuttur. Parametre olarak girilen değer "milisaniye" (Saniyenin binde biri) cinsindendir.

1
2
3
4
5
6
7
 
a := 0; c := 0;
Repeat
 a := a + 1;
 c := a + 5;
 Sleep(100);
 //Döngü içerinde her çalışmada 100 milisaniye program beklemektedir.
Until (a>=5);


Application.ProcessMessages komutu : Yazılan döngüler yoğun işlemlere sahipse ve döngünün bitirilmesi uzun sürüyorsa program donacaktır ve işletim sistemin hiçbir mesajına cevap veremeyecektir. Bu durumda program Windows Görev Yöneticisinde "Cevap vermiyor" şeklinde görünecektir ve kullanıcının hiçbir isteğine karşılık veremeyecektir. (Program taşınamaz, küçültülüp, büyültülemez, kapatılamaz, ekran görüntüsü tazelenemez).Bu duruma engel olmak için döngü içerisine Application.ProcessMessages komutu eklenmelidir. Bu komut döngüyü kısa bir süre durduracak ve windows mesajlarının işlenmesini sağlayacaktır. Bu komutun tek sakıncası döngüyü yavaşlatmasıdır.

1
2
3
4
5
6
7
 
a := 0; c := 0;
Repeat
 a := a + 1;
 c := a + 5;
 Application.ProcessMessages;
 //Döngü içerinde her çalışmada windows mesajlarına bakılması sağlanmaktadır.
Until (a>=35000);


Object Pascalda Karşılaştırma İşlemleri :

Program yazılırken belirli durumlarda belirli komutların işlenmesi veya işlenmemesi gerekir. Bunun için bütün programlama dilleri karşılaştırma komutu içerir. Object Pascalda If Then ve If Then Else komutları ile karşılaştırma işlemleri yapılır:

If Then ile karşılaştırma işlemi: Bu karşılaştırma komutuyla bir şart doğru olduğunda bir komutun işlenmesi sağlanır. If ile Then arasına karşılaştırma işlemi yazılır. Karşılaştırma işlemi için karşılaştırma operatörleri kullanılır. Then kelimesinden sonra ise işlenecek tek komut yazılır ve ; işareti ile blok bitirilir. Then kelimesinden sonraki komut şart sadece doğru olduğunda çalışacaktır. Then kelimesinden sonra birden fazla komut çalışması isteniyorsa Begin End bloğu kullanılmalıdır. Eğer şart yanlış olduğunda çalıştırma isteniyorsa If ile Then arasındaki karşılaştırma işleminin başında Not operatörü kullanılabilir.

1
2
3
4
5
6
7
8
9
10
11
 
If a = 5 Then c := 0; // a değişkeni 5'e eşit olduğunda c := 0 komutu işlenecektir.

If a = 5 Then
Begin
 c := 0; d := 5;
End; // a değişkeni 5'e eşit olduğunda c := 0 ve d := 5 komutları işlenecektir.

If Not(a = 5) Then c := 0;
 // a değişkeni 5'den farklı olduğunda c := 0 komutu işlenecektir.


If a < > 5 Then c := 0; // a değişkeni 5'den farklı olduğunda c := 0 komutu işlenecektir.

If Then Else ile karşılaştırma işlemi: Bu karşılaştırma komutuyla bir şart doğru olduğunda bir komutun yanlış olduğunda ise başka bir komutun işlenmesi sağlanır. If ile Then arasına karşılaştırma işlemi yazılır. Karşılaştırma işlemi için karşılaştırma operatörleri kullanılır. Then kelimesinden sonra şart doğru olduğunda, Else kelimesinden sonra ise şart yanlış olduğunda çalışacak komut yazılır ve ; işareti ile blok bitirilir. Then ve/veya Else kelimelerinden sonra birden fazla komut çalışması isteniyorsa Begin End bloğu kullanılmalıdır. Eğer şart yanlış olduğunda çalıştırma isteniyorsa If ile Then arasındaki karşılaştırma işleminin başında Not operatörü kullanılabilir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
If a = 5 Then c := 0 Else c :=10;
// a değişkeni 5'e eşit olduğunda c := 0, yanlış olduğunda c := 10 komutu işlenecektir.

If a = 5 Then
Begin
 c := 0; d := 5;
End Else
Begin
 c := 10; d := 0;
End; { a değişkeni 5'e eşit olduğunda c := 0 ve d := 5, yanlış olduğunda c := 10 ve d := 0 komutları işlenecektir.}

If a = 5 Then c := 0 Else
Begin
 c := 10; d := 0;
End; { a değişkeni 5'e eşit olduğunda c := 0 komutu, yanlış olduğunda c := 10 ve d := 0 komutları işlenecektir.}

If a = 5 Then
Begin
 c := 0; d := 5;
End
Else d := 0; { a değişkeni 5'e eşit olduğunda c := 0 ve d := 5 komutları, yanlış olduğunda d := 0 komutu işlenecektir.}

Case of yapısı ile karşılaştırma işlemi: If karşılaştırma operatörleri ile sadece bir karşılaştırma yapılabilmektedir. Birden fazla karşılaştırma yapılabilmesi için her karşılaştırma için If operatörlü ifade yazılması gerekir. Bu da program kodunun uzamasına ve karışık olmasına sebep olur. Case yapısı bu durumlar için kullanılır. Eğer bir degişken birden fazla değer ile karşılaştırılacaksa Case operatörü kullanılır. Kullanımı aşağıdaki şekildedir:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
Case a of
 1..5: Label1.Caption := 'Düşük';
 6..9: Label1.Caption := 'Yüksek';
 0, 10..99: Label1.Caption := 'Sınırların dışında';
else
 Label1.Caption := '';
end;

// Aynı işi yapan kodun If else ile yazılması

if a in [1..5] then
 Label1.Caption := 'Düşük'
else if a in [6..10] then
 Label1.Caption := 'Yüksek'
else if (a = 0) or (a in [10..99]) then
 Label1.Caption := 'Sınırların dışında'
else Label1.Caption := '';

2. DELPHIDE UNICODE KULLANIMI :

Rad Studio 2009 ve sonraki sürümlerde Delphi ve C++ Builder'a eklenen en önemli özellik Unicode (Evrensel Kod) desteğinin standart hale getirilmesidir. Bu sürümlerle yapılan programlar aksi bir tasarım yoksa otomatik olarak Unicode desteklidir. Bunun sebebi temel değişken tiplerinin değiştirilmiş olmasıdır. Örneğin Delphide aşağıdaki değişiklik olmuştur:

1
2
3
4
 
Type
 String = UnicodeString;
 Char = WideChar;
 PChar = PWideChar;

Yani standart tipler değiştirilmiştir. Eski standart tipleri kullanmak isteyenler String yerine AnsiString, Char yerine AnsiChar, PChar yerine PAnsiChar kullanacaklardır.

1
2
3
4
5
6
7
8
9
10
11
 
Var
 UChar: Char;
 UString: String;
 AChar: AnsiChar;
 AString: AnsiString;
Begin
 UString := 'Bu bir unicode yazıdır';
 UChar := UString[1];
 AString := 'Bu bir ansi yazıdır';
 AChar := AString[1];
end;

İki yazıda Türkçedir ve Türkçe windows yüklü bilgisayarda normal gözükürler. Fakat 'Bu bir ansi yazıdır' yazısındaki 'ı' harfleri başka bir dil yüklü bilgisayarda hatalı gözükecektir. Diğer yazıda görüntü problemi yoktur.

Unicode değişimi sadece karakterler için değildir. Delphi içinde Api çağıran komutlarda bundan sonra 'W' ile biten yani unicode fonksiyonları çağıracaktır. (bkz. Windows Api'leri ve Delphi ile Api Kullanma). Ayrıca bundan sonra değişken ve fonksiyon isimleri İngilizce harflere mahkum değildir. Yani isimler için Türkçe veya diğer dillerdeki harfler kullanılabilir.

Devam edecek...

3. DELPHIDE MESAJ PENCERELERİ :

ShowMessage: Basit anlamda kullanıcıyı bilgilendirme amaçlı kullanılabilen bir mesaj penceresidir. Sadece ekranda gösterilecek mesajı alan tek bir parametresi vardır. Pencerenin başlığı projeni ismidir. OK butonundan başka tıklama seçeneği yoktur. Mesaj penceresi ekranın ortasında gösterilir.

Kullanımı: ShowMessage('Ekranda gösterilecek mesaj metni');


ShowMessage

ShowMessage('Delphimweb sitesine hoş geldiniz');

ShowMessagePos: ShowMessage ile kullanımı ve mantığı aynıdır. Tek farkı mesaj penceresinin konumunun parametre olarak verilebilmesidir.

Kullanımı: ShowMessagePos('Ekranda gösterilecek mesaj metni', x_koordinatı, y_koordinatı);

ShowMessagePos

ShowMessagePos('Delphimweb sitesine hoş geldiniz', 300, 200);

ShowMessageFmt: ShowMessage ile kullanımı ve mantığı aynıdır. Tek farkı mesaj penceresinde gösterilecek metinde formatlama işlemi yapılabilmesidir. Formatlama mesaj metni içerisinde % işareti ve harfler ile yapılır.

Kullanımı: ShowMessageFmt('Ekranda gösterilecek mesaj metni ve gösterim formatları', [Değişkenler ve/veya değerler]);

ShowMessageFmt

ShowMessageFmt('Alinin yaşı %d, parası %m dir.', [10, 25.86]);

Formatlamada kullanılabilecek seçenekler ve anlamları:

%dDesimal (integer)
%eBilimsel
%fOnarılmış (Fixed)
%gGenel
%mPara (Money)
%nNumara
%pPointer
%sYazı (String)
%uİşaretsiz Desimal
%xOnaltılı (Hexadecimal)

MessageDlg: Kullanıcıya seçme şansı veren pencereler açmak için kullanılan bir methoddur. Pencere açıldığı zaman üzerinde birden fazla button yerleştirilebileceği için, farklı düğmelerin seçilmesiyle de farklı işlemler yapılması sağlanabilir. Bunun için MessageDlg fonksiyonunun döndürdüğü integer değer değerlendirilmelidir. Düğme seçeneklerinin arasına virgül konur. Aşağıda bulunan tablolarda seçilebilecek değerler bulunmaktadır.

Kullanımı: Düğmedegiskeni := MessageDlg('Ekranda gösterilecek mesaj metni', mesaj penceresinin ikon çeşidi, [Düğme veya düğmeler], Aktif olacak düğme nosu);

Aşağıda MessageDlg penceresinin açılması ve çıkan sonucun değerlendirilmesi ile ilgili kod görülmektedir:

MessageDlg


1
2
3
4
5
6
7
8
 
Procedure TForm1.Button1Click(Sender: TObject);
Begin
 case (MessageDlg('Dosyayı kaydetmek istiyor musunuz?', mtconfirmation, [mbyes, mbno, mbcancel], 0)) of
  mryes: label1.Caption := 'Eveti seçtiniz';
  mrno: label1.Caption := 'Hayırı seçtiniz';
  mrcancel: label1.Caption := 'İptali seçtiniz';
end;End;


Mesaj Penceresi Ikon SeçenekleriGörünecek ikon
mtWarningUyarı Ikonu
mtErrorHata Ikonu
mtInformationDanışma, Bilgi Ikonu
mtConfirmationBilgilendirme Iconu
mtCustomGenel

Mesaj Penceresi Düğme SeçenekleriPencerede bulunacak düğme
mbYes'Yes' - Evet düğmesi
mbNo'No' - Hayır düğmesi
mbOK'OK' - Tamam düğmesi
mbCancel'Cancel' - İptal düğmesi
mbAbort'Abort' - İptal et düğmesi
mbRetry'Retry' - Tekrarla düğmesi
mbIgnore'Ignore' - Yoksay düğmesi
mbAll'All' - Tümü düğmesi
mbNoToAll'NoToAll' - Hepsine Hayır düğmesi
mbYesToAll'YesToAll' - Hepsine Evet düğmesi
mbHelp'Help' - Yardım düğmesi

Mesaj Penceresi Dönüş DeğerleriSeçilen düğme
mrYes'Yes' - Evet düğmesi
mrNo'No' - Hayır düğmesi
mrOK'OK' - Tamam düğmesi
mrCancel'Cancel' - İptal düğmesi
mrAbort'Abort' - İptal et düğmesi
mrRetry'Retry' - Tekrarla düğmesi
mrIgnore'Ignore' - Yoksay düğmesi
mrAll'All' - Tümü düğmesi
mrNoToAll'NoToAll' - Hepsine Hayır düğmesi
mrYesToAll'YesToAll' - Hepsine Evet düğmesi

MessageDlgPos: MessageDlg ile çalışması ve mantığı aynıdır. Tek farkı mesaj penceresinin konumunun parametre olarak verilebilmesidir.

Kullanımı: Düğmedegiskeni := MessageDlgPos('Ekranda gösterilecek mesaj metni', mesaj penceresinin ikon çeşidi, [Düğme veya düğmeler], Aktif olacak düğme nosu, x_koordinatı, y_koordinatı);

Sonuc := MessageDlgPos('Dosyayı kaydetmek istiyor musunuz?', mtconfirmation, [mbyes, mbno, mbcancel], 0 , 300, 200);

MessageBox: Kullanıcıya seçenekli mesaj penceresi açmak için kullanılır. En çok kullanılan ve en iyi sonucu veren methoddur. Windows'da diğer programlama dillerinin de kullandığı methoddur. Kullanımı diğer methodlara göre kolaydır. Pencere açıldığı zaman üzerinde birden fazla button yerleştirilebileceği için, farklı düğmelerin seçilmesiyle de farklı işlemler yapılması sağlanabilir. Bunun için MessageBox fonksiyonunun döndürdüğü integer değer değerlendirilmelidir. Pencere başlığı, ekranda ikon gösterilip gösterilmeyeceği gibi çeşitli ayarları vardır. Aşağıda bulunan tabloda genel seçeneklerde seçilebilecek ayarlar bulunmaktadır. Genel seçeneklerin arasına + işareti konur.

Kullanımı: DugmeDegiskeni := MessageBox('Ekranda gösterilecek mesaj metni', 'Pencere başlığı', Genel seçenekler);

Aşağıda MessageBox penceresinin açılması ve çıkan sonucun değerlendirilmesi ile ilgili kod görülmektedir:

Messagebox


1
2
3
4
5
6
7
8
 
Procedure TForm1.Button1Click(Sender: TObject);
begin
 case (Application.messagebox('Dosyayı kaydetmek istiyor musunuz?', 'Dosya kaydetme sorusu', MB_YESNOCANCEL+ MB_ICONQUESTION+ MB_DEFBUTTON1)) of
  idyes: label1.Caption:='Eveti seçtiniz';
  idno: label1.Caption:='Hayırı seçtiniz';
  idcancel: label1.Caption:='İptali seçtiniz';
end;End;


MessageBox Genel SeçenekleriAçıklaması
MB_OKSadece OK butonu
MB_OKCancelOK ve Cancel (İptal) butonları
MB_YesNoYes (Evet) ve No (Hayır) butonları
MB_YesNoCancelYes (Evet), No (Hayır) ve Cancel (İptal) butonları
MB_RetryCancelRetry (Tekrarla) ve Cancel (İptal) butonları
MB_AbortRetryIgnoreAbort(İptal), Retry (Tekrarla) ve Ignore (Yoksay) butonları
MB_ICONSTOPHata ikonu
MB_ICONQUESTIONSoru ikonu
MB_ICONINFORMATIONBilgi verme ikonu
MB_ICONINFORMATIONHata ikonu
MB_ICONEXCLAMATIONUyarı ikonu
MB_ICONASTERISKBilgi verme ikonu
MB_ICONWARNINGUyarı ikonu
MB_ICONERRORHata ikonu
MB_ICONMASKKullanıcı tanımlı ikon (Kullanıcının tanımlaması gerekmektedir)
MB_DEFBUTTON1Birinci buton aktif (Varsayılan)
MB_DEFBUTTON2İkinci buton aktif (En az iki buton olmalı)
MB_DEFBUTTON3Üçüncü buton aktif (En az üç buton olmalı)
MB_DEFBUTTON4Dördüncü buton aktif (En az dört buton olmalı)
MB_SYSTEMMODALPencere her zaman en üstte
MB_APPLMODALPencere arkada olabilir (Varsayılan)
MB_TASKMODALPencere arkada olabilir
MB_RIGHTPencere metni sağa yaslanmış şekilde
MB_PRECOMPOSEDPencere kapatma butonu solda
MB_COMPOSITEPencere kapatma butonu pasif (yok)


MessageBox Dönüş DeğerleriSeçilen Düğme
IDYES'Yes' - Evet düğmesi
IDNO'No' - Hayır düğmesi
IDOK'OK' - Tamam düğmesi
IDCANCEL'Cancel' - İptal düğmesi
IDABORT'Abort' - İptal et düğmesi
IDRETRY'Retry' - Tekrarla düğmesi
IDIGNORE'Ignore' - Yoksay düğmesi

4. DELPHIDE DEĞER GİRİŞ PENCERELERİ :

InputBox: Basit anlamda kullanıcının bilgi girişi yapabileceği bir kutundan oluşan bilgi giriş penceresidir. Üç adet parametresi vardır. Birincisi pencere başlığı yazısı, ikincisi pencere içinde giriş için açıklama yazısı, üçüncüsü ise kutunun içinde varsayılan olarak gelecek değerdir. Bu parametreler boş olarak verilebilirler. Bu fonksiyon String tipinde dönüş değeri üretir. Değerlendirme yapmak için dönüşü diğer tiplere kullanıcı dönüştürmelidir.

Kullanımı: DegerDegiskeni := InputBox('Pencere Başlığı', 'Açıklama', 'Varsayılan değer');


InputBox

sonuc := InputBox('Değer Girme Penceresi', 'Lütfen değer girin :', 'Önceden girili değer');

InputQuery: InputBox fonksiyonuna benzeyen fakat pencere üzerindeki Ok ve Cancel tuşlarına basılmasına göre farklı işlemler yapılabilmesini sağlayan bir fonksiyondur. Üç adet parametresi vardır. Birincisi pencere başlığı yazısı, ikincisi pencere içinde giriş için açıklama yazısı, üçüncüsü ise fonksiyonun dönüş değişkenidir. Bu parametrelerden ilk ikisi boş olarak verilebilirler. Bu fonksiyon Boolean tipinde dönüş değeri üretir ve ücüncü parametre olarak verilen değişkene girilen değeri yazar. Boolean tipindeki değişken eğer Ok tuşuna basılırsa True, Cancel tuşuna basılırsa False değeri alacaktır.

Kullanımı: İkiliDegisken := InputQuery('Pencere Başlığı', 'Açıklama', DegerDegiskeni);


InputQuery


1
2
3
4
5
6
 
procedure TForm1.Button1Click(Sender: TObject);
 var yazi : string; sonuc : boolean;
begin
 sonuc := InputQuery('Değer Girme Penceresi', 'Lütfen değer girin :', yazi);
 if sonuc then label1.Caption := yazi;
end;

5. DELPHIDE İSTİSNAİ DURUMLAR VE HATA YAKALAMA :

Bir bölme işleminde bölenin sıfır olması, sayısal çevirme işlemi yaparken çevrilecek değerin sayısal olmaması veya olmayan bir dosyanın açılmaya çalışılması gibi durumlar istisna durumlardır. Programcı programı yazılırken bu gibi istisna durumları da göz önüne almalıdır. Yazılan programda istisnai durumlar göre kodlar bulunmuyorsa program ya hata verip kapanacaktır veya istenmeyen hatalı işlemler yapacaktır.

Delphide bir prosedür veya foksiyon içerisinde oluşabilecek hataları (istisna durumları) yaklamak için try .. except ve try..finally blokları kullanılır.

Try .. Except Bloğu : Bu blokla hata olabilecek yer belirlenmekte ve hata durumunda ne yapılacağı kodlanmaktadır. Try ile Except arasına hata verebilecek kodlar yazılır. Except ile End arasına ise hata durumunda programın işleyeceği kodlar yazılır. Herhangi bir hata olmazsa Except ile End arasındaki kodlar hiç çalıştırılmaz.

Aşağıdaki uygulamada Edit1'in içerisindeki değer Button1'e basıldığında sayısal değere çevrilmektedir. Hata durumunda yapılacaklar ise Except bloğunda kodlanmştır:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
Procedure TForm1.Button1Click(Sender: TObject);
 Var sayi:integer;
Begin
 Try
  sayi := StrToInt(Edit1.Text); // Sayısal çevirme işlemi yapılmaktadır.
 // Eğer Edit1 içerisine sayısal olmayan değer girilirse hata verecektir.

 Except // Hata olursa işletilecek kod(lar).
  Begin
   Showmessage('Lütfen sayısal değer girin...'); // Ekranda hata mesajı görüntüleniyor.
   Edit1.Text := ''; // Edit1'in içi siliniyor.
   Edit1.SetFocus; // Dönüşte kontrol Edit1'e veriliyor.
  End;
 End;
End;


Not Delphide yazılı program denenirken hata durumunda aşağıdaki pencere gelecektir. Bu pencerede OK tuşuna basıldıktan sonra Delphide tekrar Run yapılarak Except bloğundaki kodların çalışması sağlanabilir. Bu sadece Delphi içerisinde geçerlidir. Program Exe haline getirilip Delphi dışında çalıştırıldığında hata durumuna Except bloğu direkt çalıştırılacaktır.


Yakalanan Hatanın Değerlendirilmesi : Hata yakalandığı zaman yakalanan hatanın da değerlendirilip duruma göre işlem yapılması gerekir. Aşağıda hatalı bir tarihin dönüştülmesi ve hatanın yakalanıp değerlendirilmesi ile ilgili kod bulunmaktadır. Detaylı bilgi için Delphi yardımında SysUtils kütüphanesinde Classes kısmına bakınız.

Çevirme hatası

1
2
3
4
5
6
7
8
9
10
 
Const
 LF = #10;
Var Gecicitarih : TDateTime;
Begin
 Try
  Gecicitarih := StrToDateTime('99/99/1998');
// Çevirilecek tarih hatalı. İstisnai durum oluşacak.
Except
 on E: EConvertError do ShowMessage(E.ClassName + LF + E.Message);
// Do kelimesinden sonra programcı istediği mesajı verebilir veya kodu yazabilir.


Try .. Finally Bloğu : Bu blokla hata olabilecek yer belirlenmekte ve hata durumunda da, normal durumda da yapılacak işlemler kodlanmaktadır. Try ile Finally arasına hata verebilecek kodlar yazılır. Finally ile End arasına ise hem hata durumunda hem normal durumda çalıştırılacak kodlar yazılır. Bunun amacı normal çalışma sırasında çalıştırılacak kodların hata olduğu zaman da çalıştırılmasıdır. Yani hata olsa bile program sekteye uğramaz ve çalışmaya devam eder.

Hata olmazsa Try .. Finally ve Finally .. End arasındaki kodların hepsi çalıştırılacaktır. Hata durumunda ise çalışma Try bloğu içinde kesilir ve Finally bloğuna gider. Böylece kaynakların serbest bırakılması, dosyaların kapatılması gibi işlemler sekteye uğramaz. Aşağıda Try .. Finally kullanılmış kodlar görülmektedir.

1
2
3
4
5
6
7
8
 
Try
 Btmp := TBitmap.Create; // Bitmap nesnesi oluşturuluyor.
 // Hata olursa Finally'e kadar olan kodlar çalıştırılmayacaktır.

 .. // Diğer işlemler.
 ..
Finally // Hata olsa da olmasa da buradaki kod(lar) çalıştırılacaktır.
 Btmp.free;
End;


6. WINDOWS API'LERİ VE DELPHİ İLE API KULLANMA :

Programlama dilleri standart olarak kütüphanelere ve komutlara sahip olarak gelirler. Programcılar bu komutları kullanarak programlarını yazarlar. Fakat windows için program yazılan bir programlama dilinde bulunmayan komut veya fonksiyon için programcının yapabileceği iki seçenek vardır; Bu seçeneklerden birincisi asm dili veya programlama dilinin kendisini kullanarak yeni bir komut oluşturma ve kullanmadır. Bu zor ve zahmetli olan yoldur. İkincisi ise zaten var olan api fonksiyonunu tanımlayarak kullanmaktır. Windows api'leri daha önceden kodlanmış fonksiyonlardır. Windows ortamında donanım üzerinde işlem yapabilmek ve windows fonksiyonlarını kullanabilmek için Windows Api'leri kullanılmaktadır. Zaten programlama dillerinin kendileri de birçok komutları için apileri kullanmaktadır. Windows api'leri gruplandırılarak bir çok DLL ve EXE dosyasına konulmuştur. Api'lerden birini kullandığınızda Api'nin bulunduğu DLL sisteme daha önce yüklenmemişse önce bu DLL yüklenir ve Api çalıştırılır. Aşağıda bazı dosyalar ve içerdikleri api fonksiyonları ile ilgili liste bulunmaktadır:

Advapi32.dllŞifre ve Kayıt dosyası işlemleri gibi gelişmiş bir çok Api.
Comdlg32.dllDiyalog pencereleri ile ilgili Api'ler
Gdi32.dllGrafik Api'leri
Kernel32.dllWindows Çekirdek Api'leri
Netapi32.dll32-bit Network Api'leri
Shell32.dll32-bit Shell Api'leri
User32.dllKullanıcı arabirimi Api'leri
Winmm.dllMultimedia Api'leri

Windows'un api fonksiyonlarının listesini ve fonksiyonlar ile ilgili bilgi almak için 2004 yılında üretilmiş olan ücretsiz ApiViewer 2004 programını kullanılabilir. Bu program internetten kolayca bulunabilir. Program uzun süredir güncellenmemesine rağmen yeterince detaylıdır. Ayrıca API Monitor programı ile hangi programların hangi api'leri çağırdığını yakalamak çok kolaydır. Bu program da internetten kolayca bulunabilir. Apiler ile detaylı bilgi için Win32.hlp (Microsoft Win32 Programmer's Reference) dosyası internetten indirilip bakılabilir.

Delphi'de Api fonksiyonlarını kullanmak son derece kolaydır. Delphi ile gelen Windows ve ShellApi gibi Unitler sayesinde Api fonksiyonlarını Delphi fonksiyonuymuş gibi kullanmak mümkündür. Bu unitlerde Windows'un yüzlerce api fonksiyonu tanımlıdır. Bu unitlerin olduğu Windows.pas ve ShellApi.pas kod dosyalarında Api fonksiyonları hakkında birçok bilgi bulunabilir. Programcılar hazır tanımlanmış bu api fonksiyonlarını kullanabileceği gibi yenilerini de tanımlayabilir. Windows'un Api fonksiyonları C++ dili ile yazılmıştır. Bu nedenle bu fonksiyonları Delphi'ye uyarlamak gerekmektedir. Bu son derece basit bir işlemdir. C++ dilindeki programları ve api fonksiyonlarını çevirmek için Diyezon.com sitesindeki "C / C++ 'dan Delphi'ye Kod Çevirme Klavuzu" makalesine bakabilirsiniz. Delphinin Messagebox komutu (Delphide mesaj pencereleri konusuna bakınız) aslında Windows'un User32.dll dosyasındaki MessageBoxA Api fonksiyonunun çağrılmasından başka birşey değildir. Windows.pas dosyasında aşağıdaki tanımlar bulunmaktadır:

Interface kısmında:

function MessageBox(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;
function MessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
function MessageBoxW(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;


Implementation kısmında:

function MessageBox; external user32 name 'MessageBoxA';
function MessageBoxA; external user32 name 'MessageBoxA';
function MessageBoxW; external user32 name 'MessageBoxW';

Görüldüğü gibi tanımlama iki farklı yere eklenen iki satırla yapılmaktadır. Tanımlamada parametrelerin (fonksiyonun parametreleri, dönüş parametresi) tipleri ve sayıları orjinal api fonksiyonla aynı olmak zorundadır. Tanımlama yapılırken buna dikkat edilmelidir.

Parametre tiplerinin C++ ile uyumlu olması açısından Delphi için gerekli tip tanımlamaları (SHORT, DWORD, UINT, HWND, BOOL vb) windows.pas dosyasında bulunmaktadır. Örneğin C++ deki DWORD tipinin karşılığı Delphide Longword'dur. Tanımlama yaparken Longword kullanılabileceği gibi windows.pas'taki tamımlamalar sayesinde C++'deki gibi DWORD kullanılabilir.

Burada dikkat edilecek olursa user32.dll dosyasının içindeki fonksiyonun ismi MessageBox değil MessageBoxA ve MessageBoxW'dir. Bunun sebebi Windows işletim sisteminin farklı dilleri desteklemesidir. Sondaki 'A' harfi ANSI, 'W' harfi ise UniCode fonksiyonları göstermektedir. MessageBox fonksiyonu MessageBoxA fonksiyonuna tanımlıdır.

Not Delphinin 2009'dan önceki sürümlerindeki Api kullanan fonksiyonlar sonu A ile biten fonksiyonlarına tanımlı iken Delphi 2009'da Unicode desteği için fonksiyonlar sonu W ile biten unicode fonksiyonlarına tanımlanmıştır.

7. DELPHIDE DLL OLUŞTURMA VE KULLANMA :

Dll (Dynamic Link Library) yani dinamik bağlantı kütüphaneleri Windows'un en önemli özelliklerinde birisidir. Bir Dll dosyası .exe gibi çalıştırılabilir bir programın çalışma anında çağırabileceği fonksiyonları barındırmaktadır. Yani DLL programların bağlantı kurabileceği fonksiyonların bulunduğu kütüphanelerdir. Dll fonksiyonlarını program tarafından çağırıldığında windows dosyayı hafızaya yükler. Hafızadaki Dll gerekli olmadığında windows tarafından hafızadan silinir. Windows Api fonksiyonlarının çoğu windows dizininde dll dosyalarında saklanır. Api kullanımı çoğunlukla Dll kullanımıdır.

DLL dosyaların avantajı sık kullanılan kodların her programda tekrar tekrar yazılması yerine bir Dll dosyasına konması ve bütün programların o dosyayadaki fonsiyonları kullanabilmesidir. Bu hem program boyutu bakımından hem de hafıza kullanımı bakımından avantaj sağlar. Dll dosyaların dezavantajı ise dosya kayıpsa veya sürümü yanlışsa (Farklı programlar aynı dll dosyasının farklı sürümlerini kullanabilir) program fonksiyonları çağırması esnasında hata oluşacaktır.

İsteyen her programcı kendi Dll dosyalarını oluşturabilir ve onları programlarında kullanabilir. Delphi ile Dll dosyası oluşturmak çok kolaydır. Metin olarak hazırlanan Dll taslağı derlenir ve aynı dizinde Dll dosyası otomatik oluşur. Bu işlem Exe programın derlenip çalıştırılması gibidir. Delphide File menüsünden New->Others... ve gelen diyalogdan "Dll Wizard" seçilerek boş dll taslağı otomatik oluşturulur. Taslak aşağıdaki gibidir:

1
2
3
...
11
12
13
14
15
16
17
18
19
20
 
Library Project1;

{ Important note about DLL memory management: ShareMem must be the
  ...
 using PChar or ShortString parameters. }


Uses
 SysUtils,
 Classes;

{$R *.res}

Begin
End.


Görüleceği gibi taslağın başlangıç kısmında açıklama vardır. Bu açıklamada Dll hafıza yönetimi, ShareMem uniti ve BORLNDMM.DLL dosyasının kullanımı anlatılmaktadır. Bu açıklama ileri Dll programlaması içindir. Taslağa aşağıdaki düzenleme ve eklemeler yapılarak ilk Dll taslağı oluşturalım:

1
2
3
...
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
Library TestDll;

{ Important note about DLL memory management: ShareMem must be the
  ...
 using PChar or ShortString parameters. }


Uses
 SysUtils ,Classes, Dialogs; // Dialogs uniti Showmessage fonksiyonu için ekleniyor

{$R *.res}

Procedure DllMesaj; export; // Kullanılacak Dll fonksiyonun kendisi
Begin
 ShowMessage('Herkese merhabalar');
End;

Exports DllMesaj; // Dll dosyasının dışarıda kullanılacak fonksiyonları

Begin
End.


Dllmesaj prosedürü eklenmiş ve Exports kısmına prosedür ismi yazılarak dışarıdan çağrılabilmesi sağlanmıştır. Dışarıdan çağrılması istenen bütün fonksiyonların isimleri bu kısımda aralarında virgül olacak şekilde yazılır. Yazım işlemi bittikten sonra taslak "Testdll.dpr" ismi ile kaydedilir ve Project menüsünden "Build all projects" seçilerek dll dosyası derlenir. Projenin kaydedildiği yerde "Testdll.dll" dosyası otomatik oluşmalıdır. Böylece ilk Dll dosyasını oluşturmuş olduk. Aşağıdaki uygulamaların çalışabilmesi için projelerin kaydedildiği yere "Testdll.dll" dosyası kopyalanmalıdır.

Dll dosyalarındaki fonksiyonlar iki şekilde kullanılabilir. Statik kullanımda fonksiyonlar yazılan program içinde tanımlanır ve bu tanımlar değişitirilemez. Eğer Dll dosyanın adı değişirse, kayıp olursa veya yeri değişirse yazılan program kesinlikle çalışmayacaktır. Statik tanımlama ve kullanım aşağıdaki şekildedir:

21
22
23
24
25
26
27
28
29
30
31
32
 
...
Procedure DllMesaj; external 'Testdll.dll'; // Statik tanımlama

implementation

{$R *.dfm}

Procedure TForm1.button1Click(Sender: TObject);
Begin
 DllMesaj; // Dll fonksiyonun kullanımı
End;
...


Dinamik kullanımda fonksiyonlar yazılan program içinde tanımlanmazlar. Fonksiyonlar kullanılacakları zaman tanımlanırlar. Dll dosya ve/veya fonksiyonların var olup olmadıkları kullanmadan önce test edilebilir. Eksik olmaları durumunda yazılan program durdurulmadan hata mesajı ile eksik durum belirtilebilir. Dinamik tanımlama ve kullanım aşağıdaki şekildedir:

...
9
10
...
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
...
 
...
Type
 TFonksiyon = procedure; // Fonksiyonu kullanabilmek için gerekli tip tanımlaması
...
Var
 Form1 : TForm1;
 Fonksiyon : TFonksiyon; // Fonksiyonu kullanabilmek için gerekli değişken tanımlaması

Implementation

{$R *.dfm}

Procedure TForm1.button1Click(Sender: TObject);
 Var DLLHandle: THandle;
Begin
 Try
  DLLHandle := loadLibrary ('testdll.dll');
  If DLLHandle <> 0 then Begin
   @fonksiyon := getProcAddress (DLLHandle, 'DllMesaj');
   if addr ( fonksiyon ) <> nil then Begin // Eğer yüklenen dll içinde istenen fonksiyon mevcutsa
    Fonksiyon; // Dll fonksiyonun kullanımı
   End else
   showMessage ('Fonksiyon bulunamadı...'); // Dll içinde fonksiyon bulunamadı mesajı ver
  End else
  showMessage ('DLL bulunamadı...'); // DLL bulunamadı veya yüklenemedi mesajı ver
 Finally
  FreeLibrary (DLLHandle); // DLL ile iş bitince tekrar hafızadan kaldır
 End;
End;
...


Not : Burada bulunan kodları dosya halinde sitenin kaynaklar sayfasında bulabilirsiniz.

8. DELPHIDE ASM KULLANIMI :

Programlar hangi dille yazılırsa yazılsın derleyiciler komutları asm'ye çevirmektedir. Fakat bazı durumlarda (çok hızlı çalışmanın gerekmesi, kodun çok sayıda çağrılması) direkt olarak asm kullanmak gerekir. Delphide asm komutlarını kullanmak ve asm program yazmak çok basittir. Aşağıda delphide yazılmış kod ve asm karşılığı görülmektedir:

1
2
3
4
5
6
7
8
9
 
Function Ikiylecarp(Sayi: Integer): Integer;
Begin
 Result := Sayi * 2;
End;

Function IkiylecarpAsm(Sayi: Integer): Integer;
Asm
 Add eax, eax // Result := Sayi * 2;
End; // Ret


Asm komutu yazmak için "Asm" kelimesi ile koda başlanır, "End" kelimesi ile asm kod bitirilir. Buradan görüldüğü gibi "Sayi" parametresi, eax register’ı ile geliyor ve tekrar çıktı olarak eax olarak çıkıyor. Bu register çağırımı, Delphi'de default olarak kullanılır. Burada yapılan işlem çok basittir. 2 ile çarpmak için, değişkenin kendisini kendisi ile toplatılıyor. End (Ret) ile de tekrar çalışma satırına dönülür.

9. DELPHIDE EN SIK KULLANILAN KOMUTLAR :

Inttostr fonksiyonu: (SysUtil) (String içerikli komut)

Girilen integer tipindeki sayıyı String tipinde yazıya çevirmek için kullanılır. Kullanımı şu şekildedir: Sonuç := Inttostr(Sayı);

1
2
3
4
 
Var yazi: String; sayi: Integer;
Begin
 sayi := 1453;
 yazi := Inttostr(sayi);


Floattostr fonksiyonu: (SysUtil) (String içerikli komut)

Girilen noktalı Extended tipindeki sayıyı String tipinde yazıya çevirmek için kullanılır. Sonuç yazısını formatlı şekilde almak mümkündür. Kullanımları şu şekildedir: Sonuç := Floattostr(Sayı) veya Sonuç := Floattostr(Sayı, FormatŞekli). İkinci kullanım için format şekli sistemden okunabilir veya programcı tarafından belirlenebilir.

1
2
3
4
 
Var yazi: String; sayi: Integer;
Begin
 sayi := 123.456;
 yazi := Floattostr(sayi); // Sonuc = 123,456 (Türkçe format ayarlı bilgisayarda)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
// İkinci kullanım örneği:
Var s:string; fs:TFormatSettings;
Begin
 GetLocaleFormatSettings(0, fs); // Sistem formatlama ayarı okunuyor
 s := Floattostr(123.456, fs);
 // Sonuc = 123,456 (Sistemi Türkçe format ayarlı bilgisayarda)


 GetLocaleFormatSettings(1033, fs); // Amerikan sistem formatlama ayarı okunuyor (1033)
 s := Floattostr(123.456, fs); // Sonuc = 123.456 (Amerikan format ayarı)

 GetLocaleFormatSettings(1055, fs); // Türkçe sistem formatlama ayarı okunuyor (1055)
 s := Floattostr(123.456, fs); // Sonuc = 123,456 (Türkçe format ayarı)

 fs.DecimalSeparator := '#';
 s := Floattostr(123.456, fs); // Sonuc = 123#456 (Kullanıcı format ayarı)


FloattostrF fonksiyonu: (SysUtil) (String içerikli komut)

Girilen noktalı Extended tipindeki sayıyı String tipinde yazıya çevirmek için kullanılır. Sonuç yazısının formatını ve çıkış şeklini (parasal, üstel, 1000'erli ayrılmış, genel) ayarlamak mümkündür. Kullanımları şu şekildedir: Sonuç := Floattostrf(Sayı, ÇıkışŞekli, BasamakSayısı, OndalıkBasamakSayısı) veya Sonuç := Floattostrf(Sayı, ÇıkışŞekli, BasamakSayısı, OndalıkBasamakSayısı, FormatŞekli). İkinci kullanım için format şekli sistemden okunabilir veya programcı tarafından belirlenebilir.

1
2
3
4
5
 
Var yazi: String; sayi: Integer;
Begin
 sayi := 123.456;
 yazi := Floattostrf(sayi, ffCurrency, 20, 2);
 // Sonuc = 123,46 TL (Türkçe format ayarlı bilgisayarda)



1
2
3
4
5
6
 
// İkinci kullanım örneği:
Var s:string; fs:TFormatSettings;
Begin
 GetLocaleFormatSettings(0, fs); // Sistem formatlama ayarı okunuyor
 s := Floattostrf(123.456, ffCurrency, 20, 2, fs);
 // Sonuc = 123,46 TL (Sistemi Türkçe format ayarlı bilgisayarda)



Çıkış ŞekliAçıklaması
ffCurrencyParasal Format için kullanılır
ffNumberBinlik ayıraç uygulanmış halde gösterilir
ffFixedOndalıklı Formatta gösterilir
ffExponentSayı üstel olarak gösterilir
ffGeneralÜstel veya normal gösterim

Formatfloat fonksiyonu: (SysUtil) (String içerikli komut)

Girilen noktalı Extended tipindeki sayıyı String tipinde yazıya çevirmek için kullanılır. Bu komutun FloattostrF komutundan farkı çıkış şeklinin programcı tarafından istenidiği gibi ayarlanabilmesidir. Kullanımları şu şekildedir: Sonuç := Formatfloat(ÇıkışŞekli, Sayı) veya Sonuç := Formatfloat(ÇıkışŞekli, Sayı, FormatŞekli). İkinci kullanım için format şekli sistemden okunabilir veya programcı tarafından belirlenebilir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
Var sayi : extended; yazi : string;
begin
 sayi := 1234.567;

// Sayı formatlama
 yazi := FormatFloat('#####', sayi); // sonuç = 1235
 yazi := FormatFloat('00000', sayi); // sonuç = 01235
 yazi := FormatFloat('0' , sayi); // sonuç = 1235
 yazi := FormatFloat('#,##0', sayi); // sonuç = 1.235 (Türkçe formatlı sistemde)
 yazi := FormatFloat(',0' , sayi); // sonuç = 1.235 (Türkçe formatlı sistemde)

// Basamaklı sayı formatlama
 yazi := FormatFloat('0.####', sayi); // sonuç = 1234,567 (Türkçe formatlı sistemde)
 yazi := FormatFloat('0.0000', sayi); // sonuç = 1234,5670 (Türkçe formatlı sistemde)

// Bilimsel sayı formatlama
 yazi := FormatFloat('0.0000000E+00', sayi);
 // sonuç = 1,2345670E+03 (Türkçe formatlı sistemde)

 yazi := FormatFloat('0.0000000E-00', sayi);
 // sonuç = 1,2345670E03 (Türkçe formatlı sistemde)

 yazi := FormatFloat('#.#######E-##', sayi);
 // sonuç = 1,234567E3 (Türkçe formatlı sistemde)


// Yazı içeren formatlama
 yazi := FormatFloat(' "Bulunan = " 0.0', sayi);
 // sonuç = Bulunan = 1234,6 (Türkçe formatlı sistemde)


// Negatif sayıları formatlama
 yazi := FormatFloat('0.0', -1234.567); // sonuç = -1234,6 (Türkçe formatlı sistemde)
 yazi := FormatFloat('0.0 "Pozitif";-0.0 "Negatif";0.0 "Sıfır" : ', 1234.567);
 // sonuç = 1234,6 Pozitif (Türkçe formatlı sistemde)

 yazi := FormatFloat('0.0 "Pozitif";-0.0 "Negatif";0.0 "Sıfır" : ', -1234.567);
 // sonuç = -1234,6 Negatif (Türkçe formatlı sistemde)

 yazi := FormatFloat('0.0 "Pozitif";-0.0 "Negatif";0.0 "Sıfır" : ', 0.0);
 // sonuç = 0,0 Sıfır (Türkçe formatlı sistemde)



KarakterlerAnlamları
0Basamağı kesinlikle gösterir, ilgili basamak yoksa 0 gösterir
#Basamak varsa gösterir yoksa göstermez
,Binlik ayırıcıyı gösterir
.Ondalık ayırıcıyı ve basamakları gösterir
E+Bilimsel gösterimde pozitif olsa bile üstel işareti gösterir
E-Bilimsel gösterimde negatif işaret varsa üstel işareti gösterir
;Pozitif, negatif ve sıfır sayılar için farklı formatlar kullanılabilmesini sağlar
' ' veya " "Formatlama içerisine yazı eklenebilmesini sağlar

Strtoint fonksiyonu: (SysUtil) (String içerikli komut)

Girilen yazıyı (string) Integer tipinde sayıya çevirmek için kullanılır. Eğer yazı içerisinde hatalı karakterler varsa EConvertError hatası döner. Detaylı bilgi için "Delphide İstisnai Durumlar Ve Hata Yakalama" konusuna bakınız. Kullanımı şu şekildedir: Sonuç := Strtoint(Yazı);

1
2
3
4
 
Var yazi: String; sayi: Integer;
Begin
 yazi := '1453';
 sayi := Strtoint(yazi);


Strtointdef fonksiyonu: (SysUtil) (String içerikli komut)

Girilen yazıyı (string) Integer tipinde sayıya çevirmek için kullanılır. Strtoint fonksiyonuna benzer fakat hatalı karakterler varsa hata döndürmez, fonksiyonla verilmiş varsayılan değeri geri döndürür. Kullanımı şu şekildedir: Sonuç := Strtointdef(Yazı, Varsayılan Sayı);

1
2
3
4
 
Var yazi: String; sayi: Integer;
Begin
 yazi := '1453';
 sayi := Strtointdef(yazi, 1000);


Strtofloat fonksiyonu: (SysUtil) (String içerikli komut)

Girilen yazıyı (string) Extended tipinde sayıya çevirmek için kullanılır. Eğer yazı içerisinde hatalı karakterler varsa EConvertError hatası döner. Detaylı bilgi için "Delphide İstisnai Durumlar Ve Hata Yakalama" konusuna bakınız. Kullanımı şu şekildedir: Sonuç := Strtofloat(Yazı); veya Sonuç := Strtofloat(Sayı, FormatŞekli). İkinci kullanım için format şekli sistemden okunabilir veya programcı tarafından belirlenebilir. Yazı girilirken sistemin sayı formatlama ayarları göz önüne alınmalıdır.

1
2
3
4
 
Var yazi: String; sayi: Extended;
Begin
 yazi := '123,456';
 sayi := Strtofloat(yazi);// Sonuc = 123,456 (Türkçe format ayarlı bilgisayarda)


1
2
3
4
5
6
7
 
// İkinci kullanım örneği:
Var s:extended; fs:TFormatSettings;
Begin
 GetLocaleFormatSettings(0, fs); // Sistem formatlama ayarı okunuyor
 s := Strtofloat('123,456', fs);
 // Sonuc = 123,456 (Sistemi Türkçe format ayarlı bilgisayarda)
end;


Strtofloatdef fonksiyonu: (SysUtil) (String içerikli komut)

Girilen yazıyı (string) Extended tipinde sayıya çevirmek için kullanılır. Eğer yazı içerisinde hatalı karakterler varsa atalı karakterler varsa hata döndürmez, fonksiyonla verilmiş varsayılan değeri geri döndürür. Kullanımı şu şekildedir: Sonuç := Strtofloatdef(Yazı, Varsayılan sayı); veya Sonuç := Strtofloatdef(Sayı, Varsayılan Sayı, FormatŞekli). İkinci kullanım için format şekli sistemden okunabilir veya programcı tarafından belirlenebilir. Yazı girilirken sistemin sayı formatlama ayarları göz önüne alınmalıdır.

1
2
3
4
 
Var yazi: String; sayi: Extended;
Begin
 yazi := '123,456';
 sayi := Strtofloatdef(yazi, 3.14);// Sonuc = 123,456 (Türkçe format ayarlı bilgisayarda)


Chr fonksiyonu: (System) (Karakter içerikli komut)

Parametre ile girilen Ascii (0-255 arası) değerinin karakter karşılığını bulmak için kullanılan fonksiyondur.

1
2
3
4
5
6
7
 
// Buton1'e tıklandığında ilk 127 karakter noları ve karakterler memo içerisine yazılıyor
Procedure TForm1.Button1Click(Sender: TObject);
Var s:Byte;
Begin
 For s:=0 to 127 do
  Memo1.Lines.Add(Chr(s)+' = '+IntToStr(s));
End;


Ord fonksiyonu: (System) (Karakter içerikli komut)

Parametre ile girilen karakterin ascii karakter numarası karşılığını bulmak için kullanılan fonksiyondur.

1
2
3
4
5
6
7
 
// Edit1'e yazı yazıldığında basılan tuşun karakter nosu label1'e yazılıyor
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Begin
 label1.Caption := IntToStr(Ord(Key));
 edit1.Clear;
End;