BÖLÜM 1 DELPHI 7’YE GİRİŞ


 

Delphi 7’ye Giriş:

“Delphi 7’ye hoşgeldiniz.” diyerek, kitabımın ilk kısmına geçmek istiyorum. Çok gelişmiş bir yazılım diliyle karşı karşıya olduğunuzun sanıyorum siz de farkındasınız. Gerek veri tabanı uygulamaları, gerekse diğer uygulamalarda (Internet, Intranet, XML, HTML ve .NET desteği) son derece gelişmiş projeler oluşturmak, Delphi ile çok kolaylaşmıştır (çok da güvenilirdir). Bu yüzden ticari yazılımların ülkemizde (diğer bir çok ülkede de) en yaygın olanı sanıyorum Delphi’dir. Kitapta uygulama ve geliştirme alanında kullanabileceğiniz tüm konulara değinilecektir. Eğer herhangi bir kısımda uzmanlaşmak isterseniz, (işiniz gereği vs.) daha fazla teknik bilgiye ihtiyacınız olursa “e-mail” adresimize başvurabilir veya direkt olarak Prestige Education Center’dan yazılım desteği alabilirsiniz (Gerek piyasada bulunan projelerimizle, gerekse de yetiştirdiğimiz binlerce öğrencimizden sonra; bu hususta çok güvenilir bir kaynak olduğumuzu düşünüyoruz). Kitapta; temel konular ve diğer uzmanlık alanlarını da içeren bir çok konu detaylı örneklerle önünüze sunulacaktır. Tecrübemiz; size hikaye anlatmaktan çok, örnek kodlarla beraber detaylıaçıklamalarda bulunmamız gerektiğini göstermiştir. Mümkün olduğu kadar bu amacın dışına çıkmamaya çalışacağız. Artık Delphi ekranını tanıyarak, basitten zora doğru kod yazma işlemine geçebiliriz.

“Delphi 7” programını bilgisayarınıza kurduktan sonra, aşağıdaki adımlarıizleyerek (Start-> Programs-> Borland Delphi 7-> Delphi 7) kolayca çalıştırabilirsiniz.

Yukarıdaki adımları izledikten sonra, karşınıza “Delphi 7” açılışına ait (Bilgisayarınızın hızına bağlı olarak ekranda biraz kalabilir.) pencere gelecek, arkasından tasarım ekranına ulaşılacaktır. Bu ekran, hepinizin bildiği gibi Windows Formlarından (veya diğer nesnelerinden) oluşmaktadır. Diğer yardımcı nesneleri bu formlara ekleyerek proje geliştirebilmekteyiz (Windows Formları olmadan da proje geliştirilebilir).

Aşağıda karşınıza açılan penceredeki Windows Formlarına ait nesneler gösterilmiştir:

Bu ekran bir çok Windows nesnesinden oluşmakta olup, şimdi sizlere bu pencerelerin ne tür işlemler için kullanılabileceklerinden bahsetmek istiyorum.

Component Palette:

Bu pencere, “Delphi 7” içerisinde uygulama geliştirebilmeniz için kullanabileceğiniz form dışındaki tüm kontrolleri (Kullanım amaçlarına göre gruplandırma yapılarak ayrı ayrı yapraklar halinde verilmişlerdir.) içerisinde barındıran bir nesnedir.

Bu yapraklardan birtanesine tıkladığınız zaman, o gruba ait tüm kontrolleri görebilirsiniz. Hangisini projenizde kullanacaksanız üzerine mousun sol tuşuyla çift tıklayıp, formunuzun üzerine ekletebilirsiniz.

Örnek olması açısından “Standart” yaprağında bulunan “Button” kontrolünün üzerine çift tıklayın, formunuzun üzerine eklendiğini göreceksiniz. Boyutlarınıve koordinatlarını mousunuzla kolayca değiştirebilirsiniz. Şimdi de aynı işlemi “Edit” kontrolü için yapın, formunuz aşağıdaki hali alacaktır.

Burada asıl göstermek istediğim; eklemiş olduğunuz her kontrolün kullanacağıkütüphaneyi Delphi’nin otomatik olarak projeye dahil ettiğidir. Peki ama bu kodu nereye ekledi? Tabii ki aşağıdaki “Unit.pas” penceresinin (Formun üzerine çift tıklarsanız erişebilirsiniz.) içerisine (“pas” uzantılı dosyalar yazmışolduğunuz kodları saklarlar.) dosyayı kaydettikten sonra bu kodlar “pas” uzantılıolarak yeni bir dosya oluşturmaktadır.

Buradaki mantık “Nesneden nesne yaratma (Object Oriented)” şeklinde işlemektedir. Daha detaylı olarak açıklayacak olursak, “TButton” Delphi içerisinde bu kontrole ait tüm özelliklerin ve metodların tanımlandığı bir class’tır. “Button1” de, bu Class’tan türetilen yavru üyenin adıdır. Dolayısıyla bu sınıfa ait statik olmayan (Daha sonra açıklanacaktır.) tüm yöntemleri de bünyesinde barındıracaktır.

Delphi’nin tüm kontrollere ait kütüphaneleri projenize başlangıç anında eklememesinin sebebi, performansı en üst düzeyde tutmak istemesinden kaynaklanmaktadır (Kullanılmayan bir class’ın projeye eklenmesi sanırım pek hoş olmayacaktır). Neyse son derece teknik olan bu hususlara daha sonraki bölümlerde detaylı olarak değinecek olup, şimdiden kafanızı fazla şişirmek istemiyorum.

Object Inspector, Exploring Unit.pas:

Bu pencereden projenize eklemiş olduğunuz form ve diğer nesneleri (Button, Edit vs.) izleyebilirsiniz. Şayet buradaki nesnelerden herhangi birtanesinin üzerine mous ile çift tıklarsanız, “Unit.pas” penceresinde o nesnenin tanımlanmış olduğu satıra ulaşabilirsiniz.

Alt kısımda yer alan diğer pencereden de eklemiş olduğunuz kontrole ait özellikleri “Properties” yaprağından değiştirebilirsiniz. Eğer bu pencere ekranda gözükmüyorsa, “View->Object Inspector” adımlarını izleyerek gözükmesini sağlayabilirsiniz.

Events’lara Erişebilmek:

Delphi içerisinde kod yazabileceğiniz yordamlara (Tetikleyiciler) ulaşabilmek için yukarıdaki pencerenin (Object Inspector) “Events” yaprağına tıklayabilirsiniz. Bu yaprakta hangi yordama kod yazacaksanız, sağında yer alan beyaz kutunun içerisine mous ile çift tıklamalısınız.

Aşağıda “Events” yaprağına ait görüntü ekranı verilmiştir. Burada Form’a ait (Seçili eleman form olduğu için) bir çok tetikleyici görüntülenecektir. Bunlar daha sonra detaylı olarak kitabın ilerleyen kısımlarında anlatılmıştır.

Kod Penceresine Ulaşmak:

Yukarıdaki pencerede herhangi bir yordama (İsimlerinin sağındaki beyaz alana) mous ile çift tıklarsanız, kodları yazabileceğiniz ekrana kolayca ulaşabilirsiniz. Aşağıdaki pencereye “OnCreate” yordamı çift tıklanılarak ulaşılmıştır.

Bu yordama ait işleteceğiniz kodları yukarıda işaretlenen yerlere yazmalısınız.

Kod (Unit) Penceresinin Özellikleri:

Yukarıda açmış olduğunuz “Unit” penceresi, görsel dillerle beraber kullanılmaya başlayan bir çok özelliği de beraberinde getirmektedir. Bu ekran bir Editör programının parçası olup, epeyce kullanışlı özelliği bulunmaktadır. Aşağıda en önemli özelliklerinden bahsedilmektedir.

Ctrl+Space Tuşunun Beraber Kullanılması:

Unit penceresinde kodlarınızı yazarken herhangi bir komutun baş harflerini hatırlamanız, satırı tamamlamanız için yeterli olacaktır (Kodun doğru yazılabilmesi için devamlı kullanmanızı tavsiye ederim). Aşağıdaki pencerede izlenen adımlara dikkat ediniz.

Bu ekranda “Edi” yazıp “Ctrl+Space” tuşlarına beraberce basarsanız, eklenmişolan kütüphanelere ait yazabileceğiniz tüm komutları listeleyen yeni bir pencereyle karşılaşacaksınız. Enter tuşuna basarak bu pencereden istediğiniz komutu seçebilirsiniz.

Kod Penceresinde “.” Karakterinin Kullanılması:

Yukarıda anlatılan şekilde (Ctrl+Space), kullanacağınız komutun ismini tam olarak yazdırdıktan sonra (Ezbere de yazabilirsiniz tabii ki) klavyeden “.” tuşuna basarsanız, o kontrole (veya komuta) ait tüm özellik ve metodların içerisinde bulunduğu yeni bir listeyle karşılaşırsınız. Hangi özelliği (veya metodu) kullanacaksanız “Enter” tuşuyla seçebilirsiniz (Bu özellik kod yazma kolaylığıaçısından gerçekten devrim sayılabilecek bir olaydır). Burada dikkat edeceğiniz husus, eğer bir kontrole ait tüm özellikleri listelemek istiyorsanız; o kontrolün sürüklenip (veya kodla eklenmesi gerekir) formun üzerine bırakılmasıgerektiğidir. Projeye tanıtılmamış bir kontrolün özelliğini listelemeniz mümkün olmamaktadır. Aşağıda bu olay örneklendirilmiştir.

Kod yazarken bu pencere sizi devamlı olarak yönlendirecektir. Sonuç olarak her zaman doğru kod satırları oluşturmuş olacaksınız. Açılan pencerenin sol kısmına dikkat edecek olursanız komutun bir özellik, procedure veya function olduğu da belirtilmektedir. Sağ tarafta ise metodun veya özelliğin döndürdüğü tip gösterilmektedir.

Object TreeView Penceresi:

Bu pencere, eklemiş olduğunuz kontrollere ait bilgileri ağaç yapısışeklinde listelemek için kullanılabilmektedir. Herhangi bir kontrolün üzerine mousun sol tuşuyla tıklarsanız, o kontrolün aktifleşmesini sağlayabilirsiniz. Aynışekilde mous ile çift tıklama yaparsanız sizi kod sayfasına ulaştıracaktır.

Eklemiş olduğunuz tüm kontrolleri bu pencereden takip edebilirsiniz.

Eğer ekranınızda bu pencere gözükmüyorsa “View->Object TreeView” adımlarını izleyerek gözükmesini sağlayabilirsiniz.

Yukarıdaki pencereleri dilerseniz üst üste mous ile yerleştirerek tek bir pencerede gösterilmesini de sağlayabilirsiniz. Uygulama açısından pencerelerin nerede olduğu Delphi’yi fazla ilgilendirmemektedir, hangisi kolayınıza geliyorsa

o şekilde kullanabilirsiniz.

Pencereye dikkat edecek olursanız üç farklı yaprağın bulunduğunu görecekseniz. Ekranınızda daha rahat çalışabilmeniz için bu yöntemi uygulamanızı tavsiye ederim.

Delphi Dosya Uzantıları:

Oluşturduğunuz Delphi projesi aşağıdaki uzantılı dosyaları otomatik olarak oluşturacaktır.

Bu uzantılı dosyaları açıklamaya çalışalım.

Dosya Uzantısı İçeriği
Dof Pencere Ayarları
Dfm Windows Formlarına ait bilgileri Tutar
Res Grafiksel kaynak kodlarını tutar (resim vs.)
Pas Unit lere ait kodları Tutar
Dpr Projeye ait Bilgiler Tutulur

Projenizi kaydedip bir kere çalıştırdıktan sonra aşağıdaki iki dosyada klasörünüze eklenecektir.

Dosya Uzantısı İçeriği
Exe Tek başına çalıştırılabilir Dosya
Dcu Unit kodlarınızın derlendikten sonra tutulduğu dosyadır

Bu iki dosyayı silerek projelerinizi diskete kaydedebilirsiniz. Uygulamanızı her çalıştırdığınızda, bu dosyalar yeniden Delphi tarafından oluşturulacaktır.

Kod Penceresine Ait Font Ayarları:

Delphi, sizlere Unit penceresine yazacağınız kodları belirlemiş olduğu grup dahilinde değişik formatlarda yazmanıza imkan tanımaktadır. Mesela aynıpencere içerisinde kod satırları ile açıklama satırlarının farklı renkte olması(veya farklı kalınlıkta) bu sayede mümkün olabilmektedir. Dilerseniz tamamen sizin hoşunuza gidebilecek bir düzende oluşturabilirsiniz. Aşağıda kod penceresine ait Editör ayarlarını nasıl yapabileceğiniz açıklanmıştır.

“Tools->Editor Options” adımlarından sonra karşınıza aşağıdaki “Editor Properties” penceresi açılacaktır. Bu pencerenin “Color” yaprağını aktif hale getirin.

“Elements” kısmında gruplandırılmış olarak bulunan seçeneklerden bir tanesini seçip, o elemana ait tüm font ayarlarını belirleyebilirsiniz. Yapacağınız değişiklikler sadece “Elements” kısmından seçmiş olduğunuz gruba etki edecektir. Diğer grupta bulunan elemanlar bu değişikliklerden etkilenmeyecektir.

Uses İfadesi:

Uses deklarasyonu sayesinde, Delphi içerisinde tanımlı olan kütüphaneler (veya sizin oluşturduğunuz diğer Unit leri çağırmak) projeye dahil edilebilirler. Bu sayede kütüphanelerin içerisinde tanımlı olan fonksiyon, değişken, procedure ve özellikleri kolayca kullanabilirsiniz. Uygulamanızın ilk çalışması anında en çok kullanılan kütüphaneleri Delphi otomatik olarak projenize dahil edecektir. Fakat bazı durumlarda sizin dahil edilmeyen kütüphaneler içerisinde tanıtılmış olan metodlara ihtiyacınız olacaktır. İşte bu kütüphaneleri uygulamanıza ancak “Uses” bildirisiyle çağırabilirsiniz.

“Uses” bildirisinin nasıl yapılacağı aşağıda gösterilmiştir.

Pencereye dikkat edecek olursanız tek bir “uses” deklarasyonu sayesinde araya “,” konularak bir çok kütüphane uygulamanıza dahil edilmiştir (Dahil edilen bu kütüphaneler sadece Unit1 tarafından kullanılabilir).

Uses bildirimini daha iyi anlamanız için aşağıdaki örneği dikkatlice inceleyiniz.Örnekte Buttona tıklanılarak kullanıcıya basit bir mesaj iletilmesi istenmiş olup, bu amaçla aşağıdaki kod satırı eklenmiştir.

Programı çalıştırıp Button2’ye tıklayacak olursanız aşağıdaki pencereyle belirtmiş olduğunuz uyarı kullanıcıya iletilecektir.

Peki neden bu uyarı gözüktü? Hemen izah edeyim, çünkü “ShowMessage” fonksiyonu “Dialog” kütüphanesinin içerisinde tanımlanmıştır (Dilerseniz Ctrl tuşu basılıyken mousun sol tuşu ile “ShowMessage” yazısının üzerine tıklayın) .

Uses satırında da bu kütüphane projenize dahil edildiği için, Buttona her tıkladığınızda mesaj ayrı bir pencere olarak karşınıza gelecektir.

Şimdi Uses satırında yer alan kütüphanelerden “Dialogs” olanını silip uygulamanızı çalıştırırsanız (çalıştıramayacaksınız) “ShowMessage” fonksiyonunu bulamadığına dair uyarıyı sizlere iletecektir.

Project Manager Penceresi:

Bu pencere sayesinde projeniz için oluşmuş olan dosyaların kayıtlı olduklarıadresleri izleyebilirsiniz. Burada gözüken bir proje grubudur ve bu gruba ait bir çok Delphi dosyasının bulunduğu sanıyorum dikkatinizi çekmiştir.

Şayet bu pencere ekranda gözükmüyorsa “View->Project Manager” adımlarınıizleyerek ekranda açtırabilirsiniz. “New” komutuyla ekleme, “Remove” komutuyla da silme işlemini gerçekleştirebilirsiniz.

Window List Penceresi:

Ekranda gözüküyor konumda olan tüm nesneleri izleyebileceğiniz bir penceredir.

Bu pencereden herhangi bir nesneyi seçip “OK” Buttonuna tıklarsanız, seçmişolduğunuz pencereniz aktifleşecektir. Şayet bu pencere ekranda gözükmüyorsa “View->Windows List” adımlarını izleyerek gözükmesini sağlayabilirsiniz.

16

BÖLÜM 2 DELPHI’NİN TEMELLERİ

18

Örnekleri Yapabilmeniz İçin Gerekli Olan Pratik Kodlar:

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 değişkenin değerini yazdırmak

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.

Uyarı:Bu tür tip dönüştürme işlemlerinde kullandığınız atama operatörünün (“:=”) solundaki ve sağındaki verinin tiplerinin aynı olması gerekmektedir.

Ayrıca kontroller üzerinde klavye ile girilebilen veri tiplerinin string olduğunu da unutmayınız.

EditBox’ın içerisinde bulunan değeri Reel Sayı tipli değişkene aktarmak

Uygulanan yöntem şu; atama operatörünün sol ve sağında yer alan veri tiplerinin aynı olmasını sağlamak için “Edit” kontrolünün içerisinde yer alan değer “StrToFloat” fonksiyonu sayesinde reel sayı tipine çevrilmekte, ondan sonra atama işlemi gerçekleştirilebilmektedir.

Reel Sayı Tipli Bir Değişkenin Değerini Yazdırmak:

Aynı mantık uygulanarak reel sayı değişkeni “FloatToStr” tip dönüştürme fonksiyonu sayesinde stringe çevrilip, arkasından da EditBox’ın içerisinde yazdırılmaktadır (Herhangi bir tipteki matematiksel değişkenin değerini yazdırabilmeniz için muhakkak stringe dönüştürmeniz gerekir. Aksi halde Delphi size hata mesajı iletecektir).

EditBox’ın İçerisine String Veri Yazdırmak:

String tipli bir değişkenin değerini (veya direkt string i) EditBox kontrolünde yazdırabilmeniz için (‘) operatöründen faydalanabilirsiniz. Aşağıda her iki durum içinde örneklendirme yapılmıştır.

Aşağıda verilen örnekte ise procedure içerisinde string tipli bir değişken tanımlanarak, bu değişkene aktarılacak olan içerik yazdırılmaktadır.

Burada kullanılan “x” değişkeninin tipi string olarak verildiği için atama (:=) operatörünün sol ve sağındaki tipler aynı olmaktadır. Bu yüzden tip dönüşüm işlemi uygulamak zaten mantıksız olurdu.

EditBox’ın içerisinde bulunan değeri Tarihsel tipli değişkene aktarmak

Bir çok uygulamanızda tarihsel veri içeren değerlerle işlem yapmak zorunda kalacaksınız. Bu elinizdeki tarihsel değişkenin değerini yazdırmak, veya tarihsel değer barındıran bir kontrolün içeriğini değişkene aktarmak şeklinde olabilir. Şimdi sizlere EditBox’ın içerisinde bulunan string (Ama tarihe dönüştürülebilir) içeriği tarihsel bir değişkene nasıl aktarabileceğinizi göstereceğim.

Kodu inceleyecek olursak, kontrolün içerisindeki string tipli veri “StrToDate” fonksiyonu sayesinde tarihsel içeriğe dönüştürülüp bir gün eklenmektedir. Ardından tekrar ters dönüşüm yapılarak (tarihten-stringe), formunuzun başlığında yazdırılmaktadır.

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.

Bu tip dinamik diziler (Tam sayı tiptekiler) oluşturuldukları anda ilk değer olarak “0” alırlar.

Yukarıdaki uygulama için

Form3.Caption:=IntToStr(dizi[3,0]);// 0 yazacaktır.

Dinamik Dizileri Yeniden Boyutlandırmak:

Delphi’de boyutlandırmış olduğunuz dinamik diziyi yeniden boyutlandırırsanız, eski dizi elemanları değerlerini aynen koruyacaktır (Tabii ki elemanın numarasından daha küçük bir boyut vermezseniz). Aşağıda bu husus örneklendirilmiştir.

Bazı durumlarda yukarıdaki kod penceresinde olduğu gibi boyutlandırmışolduğunuz bir dinamik diziyi (Sınıfa yeni bir öğrenci daha eklenebilir veya oyuna yeni bir şahıs daha katılabilir.) yeniden boyutlandırma gereği duyabilirsiniz. Bu durumlarda, Delphide daha önceden değer alan değişkenler değerlerini aynen saklı tutacaktır. Yukarıdaki örnekte de bu tema işlenmiştir. İki kere boyutlandırılan dizi değişken önceki boyutlandırmadan sonra atanan değerini, ikinci boyutlandırmadan sonra hatırlayıp korumaktadır (Yeni boyutlanan dizinin üst sınırı o elemanın indexinden daha büyük olmalıdır).

Bir çok projede Dizi işlemlerini Dinamik dizilerle çözmek zorunda kalacaksınız. Bu yüzden bu kısmı çok iyi öğrenmelisiniz. Her zaman söylerim, dizilerle döngüleri çok iyi kullanabilen programcıların geleceğinin parlak olacağından eminim. Sizde anlatılan hikayelerden ziyade (Emin olun karşılıklı konuşacağınız bir çok konu başlıkçısı olacaktır. Bu konu başlıkçıları, genellikle kodlardan haberleri olmayıp öteden beriden (dergi, gazete vs) duydukları hikayeleri sizlere yutturmaya çalışan şahıslardan ibaret olacaktır. Bu tip şahısları her zaman beyaz tahtanın başına kod yazmaya davet edecek kadar kendinize güven duyacak seviyeye gelmek en önemli hedefiniz olmalıdır) tahtaya yazdıracağınız kodlara ve o kodu yazan şahıslara değer veriniz.

BÖLÜM 3 DELPHI’DE ATAMA İŞLEMLERİ& OPERATÖRLER

64

Delphi’de Kullanılan Operatörler:

Bu kısımda sizlere, Delphi’de kullanabileceğiniz operatörleri gruplandırarak bilgi verelim.

Matematiksel Operatörler:

Matematiksel işlemlerde kullanabileceğiniz operatörler tablo halinde verilmiştir.

Operatör Görevi Örnek

+ Toplama 10+20

-Fark 30-20

* Çarpım 20*50 / Bölme 10/5 Mod Mod 10 mod 3 Div Tam Bölüm 10 div 3 = Eşitlik if(ad=’Nihat’) then > Büyüktür if(yas>50) then < Küçüktür if(yas<50) then >= Büyük Eşittir if(yas>=50) then <= Küçük Eşittir if(yas<=50) then <> Eşit Değil if(yas<>50) then

:= Atama Ad:=’Nihat’

Sanıyorum diğer operatörler için örnek yapmaya gerek yok. Zaten ilerleyen kısımlarda hepsini bolca kullanma imkanı bulacağız.

Logical Operatörler:

Mantıksal işlemlerinizde kullanabileceğiniz bir çok operatörü Delphi size sunmaktadır. Aşağıda bu operatörlerden bahsedilmektedir.

o Not

Dönen değerin olumsuzunu belirtmek için kullanılan Mantıksal operatördür (Eğer true dönerse false. False dönerse true). Genellikle dallanma, karşılaştırma işlemlerinde kullanılır.

Eğer yukarıdaki if satırında “not” komutu kullanılmazsa, formun başlığında hiç bir zaman metninizi yazdıramazsınız. Burada şunu da hatırlatalım, Boolean tip bir değişken tanımlandığı anda varsayılan değeri false dır.

o And

Aynı anda iki sonucu beraber değerlendirebilmek amaçlı kullanılan bir operatördür. Genellikle karşılaştırma gerektiren (if - Case vs.) durumlar için aynı anda birden fazla şartı sağlama amaçlı kullanılmaktadır.

o Or

Belirtilen sonuçlardan herhangi bir tanesinin doğruluğunun yeterli olduğu durumlarda kullanılan bir operatördür. Genellikle karşılaştırma gerektiren (if – case) durumlar için şartlardan herhangi bir tanesinin sağlanmasının yeterli olduğu durumlar için kullanılır.

Aşağıda hem “and” hem de “or” için örneklendirme yapılmıştır.

İlk Olarak “and” operatörünü örneklendirelim. Örnekte notun 50 ile 100 arasında olmasışartı aranmaktadır. Dikkat edeceğiniz husus hem 50 den büyük, hem de 100 den küçük olma zorunluluğudur.

Şimdi de diğer operatörümüz olan “Or” seçeneğini örneklendirelim. Örneğimizde notlar isimli değişkenin değeri kontrol edilerek, şayet “0” dan küçük veya “100” den büyük olması durumunda gerekli olan uyarı, formun başlığında kullanıcıya iletilmektedir. Dikkat edeceğiniz husus, belirtilen şartlardan bir tanesinin true değeri döndürmesinin (doğru olması) uyarının verilmesi için yeterli olacağıdır.

Procedure içerisinde notlar isimli değişkenin değeri “100” den büyük olduğu için ikinci şart sağlanmakta, dolayısıyla (şartlardan birisi true olduğu için) if satırı true değerini döndürmekte ve uyarı mesajını da formun başlığında kullanıcıya göstermektedir.

Delphi’de Diğer Atama İşlemleri:

Delphi’de atama işlemleri “:=” operatörüyle yapılabilmektedir. Bu hususu sanıyorum şu ana kadar yaptığımız örneklerden anlamışsınızdır. Fakat Delphi kendi fonksiyonlarını kullanarak daha hızlı atamalarda yapabilmektedir. Atama işleminin anlaşılması için ikilik düzendeki (Bilgisayar tüm işlemleri ikilik düzende gerçekleştirir.) aşağıdaki örnekleri dikkatlice inceleyiniz.

Bellekte iki bayt (16 bit) yer tutan bir değişkene nasıl atama yapılabileceğini göstereceğim. Örneğimiz için kullandığım kod aşağıda verilmiştir.

Burada Delphi’nin ilk yaptığı iş “x” değişkenine bellekte 16 bitlik (her 0 veya 1 bir bit demektir) yer ayırmaktır (içerisinde de rastgele 0 – 1 ler bulunur).

Yukarıdaki şekil x değişkenine ayrılan 16 bitlik yeri göstermektedir. Daha sonra bu değişkene aktarılmak istenen “7+5” değeri, için iki sayıyı da ikilik düzene çevirip ondan sonra toplama işlemini yapmaktadır.

“7” Sayısının ikilik düzende karşılığı (devamlı bölüm değerini 2 ye bölün) alt satırda verilmiştir.

Aynışekilde “5” sayısının ikilik düzendeki karşılığı da aşağıdaki satırda size verilmektedir.

Artık bu ikisini kolaylıkla toplayacaktır.

+

=

“7+5=13” satırını Delphi size yukarıdaki şekilde hesaplayabilmektedir. İlk etapta size biraz karışık gelebilir, ama bu yöntem gerçekten son derece kolaydır. Kullandığınız hesap makineleri de sonuçları hep bu mantıkla hesaplamakta (Yoksa bütün çarpım sonuçları hafızada tutulmamaktadır. Zaten böyle bir veritabanı oluşturmak her babayiğidin harcı olmayacaktır) sonucu kısa süre içerisinde verebilmektedir.

x:=x+1 Ataması:

Bu atama yöntemiyle “x” değişkeninin bir fazlası tekrar “x” değişkenine aktarılmaktadır (Burada eşitlik söz konusu değildir. Hiç bir matematiksel değerin bir fazlası kendisine eşit olamaz).

procedure TForm1.Button6Click(Sender: TObject); var

x:Integer;

begin

x:=10;
x:=x+1; //Sonuç x 11 oldu.

end;

• x:=a+b Ataması:

“a” değişkeni ile “b” değişkeninin matematiksel değerleri toplanıp “x” değişkenine aktarılmaktadır.

procedure TForm1.Button6Click(Sender: TObject); var

x:Integer;

begin

x:=20+70; //Sonuç x 90 oldu.

end;

Burada yapılan işlemlerin eşitlik değil, atama olduklarını tekrar hatırlatırım.

Inc(x) Ataması:

x:=x+1; “x” değişkeninin değerini bir artırarak tekrar “x” değişkenine aktarır.

procedure TForm1.Button6Click(Sender: TObject); var

x:Integer;

begin

x:=10 ; inc(x); //Sonuç x değişkeninin değerini bir artır. Form1.Caption:=IntToStr(x); //11 yazar.

end;

Aşağıdaki şekilde bir kullanıma Delphi izin vermeyecektir.

procedure TForm1.Button6Click(Sender: TObject); var

x:Integer;

begin

x:=10 ;
//inc(x);//Sonuç x 11 oldu.
Form1.Caption:=IntToStr(inc(x)); // Delphi bu atamaya izin vermez

end;

• Inc(x,5) Ataması:

x:=x+5; “x” değişkeninin değerini beş (5) artırarak tekrar “x” değişkenine aktarır.

procedure TForm1.Button6Click(Sender: TObject); var

x:Integer;

begin

x:=10 ; inc(x,5);//Sonuç x 15 oldu. Form1.Caption:=IntToStr(x); //15 yazar

end;

Inc(x,5); satırında “5” in yerine herhangi bir değişkenin ismini de kullanabilirsiniz.

procedure TForm1.Button6Click(Sender: TObject); const

deger:Integer=15;

var

x:Integer;

begin

x:=10 ;
inc(x,deger);//Sonuç x 25 oldu.
Form1.Caption:=IntToStr(x); //25 yazar

end;

Görüldüğü gibi değişken değeri kullanılarak da fonksiyon işlevini yapabilmektedir.

Dec(x) Ataması:

x:=x-1; “x” değişkeninin değerini bir azaltarak tekrar “x” değişkenine aktarır.

procedure TForm1.Button6Click(Sender: TObject); var

x:Integer;

begin

x:=10 ; Dec(x); //Sonuç x değişkeninin değerini bir azalt. Form1.Caption:=IntToStr(x); //9 yazar.

end;

• Dec(x,5) Ataması:

x:=x-5; “x” değişkeninin değerini “5” azaltarak tekrar “x” değişkenine atar.

procedure TForm1.Button6Click(Sender: TObject); var

x:Integer;

begin

x:=10 ; Dec(x,5);//Sonuç x 5 oldu. Form1.Caption:=IntToStr(x); //5 yazar

end;

Dilerseniz Dec(x,degisken) şeklinde de kullanabilirsiniz. Aşağıda bu husus örneklendirilmiştir.

procedure TForm1.Button6Click(Sender: TObject); const

deger:Integer=15;

var

x:Integer;

begin

x:=10 ; Dec(x,deger); //Sonuç x -5 oldu. Form1.Caption:=IntToStr(x); //-5 yazar

end;

Inc() ve Dec() fonksiyonuyla yapacağınız atamaların daha hızlı çalışacaklarınıbelirtip bu konuyu burada kapatmayı uygun gördüm.

BÖLÜM 4
DELPHI’DE DALLANMA
&
DÖNGÜ KOMUTLARI

74

IF Yapısının Delphi’de Kullanım Şekilleri:

Programlarınızda oluşabilecek olan farklı dallanmaları çözüme kavuşturabilmeniz için kullanabileceğiniz en güvenli yol sanıyorum bu yapıdır. Bütün dillerde olduğu gibi Delphi komutları içerisinde de if yapısı gerçekten yeri doldurulamaz bir öneme sahiptir. Kullanımında herhangi bir zorluk sözkonusu değildir, fakat uygulamaları çok dikkatlice takip etmenizi tavsiye ederim.

Basit Anlamda if Yapısı:

Şimdi sizlere if yapısının en basit kullanım şekillerinden bahsedeceğim. Buradaki kullanım sadece tek alternatifli durumlar için geçerlidir.

İf şart then // Tek satırdan oluşan kod

Bu yapıya ait örneklendirme aşağıda verilmiştir.

Şartın doğru olması durumunda işletilecek olan satır sayısı birden fazla ise bu durumda aşağıdaki yapıyı kullanmalısınız.

İf şart then begin

// Şart doğru olduğu zaman işleyecek kod //ikinci satır

end;

Şart doğru olduğu zaman işleyecek olan kod satırları birden fazla olduğu için, bu satırlar begin-end bloğu içerisinde yazılmalıdır. Hatırlatalım tek satırlıkodlarıda begin-end bloğu içerisinde yazabilirsiniz.

Yukarıdaki if yapısında “begin-end” bloğu kullanmazsanız (hata vermez) “ad” ın “Prestige Education Center” dışındaki bir metne eşit olması durumunda bile “Doğru Eğitim Kurumundasınız” uyarısını her zaman alırsınız.

if – else Yapısı:

Bu yapı alternatiflerin birden fazla olması durumunda kullanılması gereken bir kod bloğudur. Aşağıda bu husus örneklendirilmiştir.

If şart then //Tek satır kod buraya yazılacak

else

//Tek satır kod buraya yazılacak.

Burada şartın doğru olması durumunda işletilecek olan kod tek satırdan oluşuyorsa “begin – end” bloğu kullanmaya gerek yoktur. Fakat bu durumda if ile else arasına yazılmış olan satırın sonuna “;” konulmaz. Buradaki satırın sonunda “;” konulursa muhakkak “begin-end” bloğu içerisine alınmalıdır. Aşağıda bu hususların hepsine ait örneklendirmeler yapılmıştır. Dikkatlice inceleyiniz.

Yukarıdaki kodu aşağıdaki şekilde de yazabilirsiniz. Her ikiside aynı sonucu verecektir.

Uzmanlaşmadan önce yazacağınız kodları (if için) muhakkak “begin-end” bloğu içerisinde yazmaya gayret edin. Bu şekilde bir hareket, hata yapma şansınızıminimuma indirecektir. Daha sonra Delphi’ye hakim olursanız o zaman dilediğiniz şekilde kodlama yapabilirsiniz. Kodları Editor’ünüze yazarken de biraz dikkatli olursanız, daha sonra kodu incelerken sizin için çok büyük kolaylık sağlayacaktır.

Eğer if – else arasına yazılacak olan kod satırları birden fazla ise bu durumda “begin – end” bloğu kullanmak sizin için zorunlu olacaktır.

if şart then begin

//kod satırları //Kod satırlarıend //Burada “;” olmayacak else begin

//kod satırları

//kod satırları

end; //Burada “;” olacak

Aşağıda bu husus örneklendirilmiştir.

Buradaki “else” ifadesi, if’te belirtilen koşul dışındaki tüm durumlar için kullanılabilecek bir bloktur. Yani if’te belirtilen şart (Bu örnek için notun 50 den büyük olmasıdır) sağlanamadığı anda işleyecek olan kodlar else bloğu içerisinde yazılmalıdır. Bazı durumlarda, kalan tüm şartları ifade etmek mümkün olamayabilir (veya çok fazla irdeleme yapmak gerekebilir), bu durumlarda geriye kalan tüm şartları kastetmek için de else bloğu çok uygun olacaktır.

If – else if – else Yapısı:

Alternatiflerin ikiden fazla olması durumunda kullanılabilecek olan bir yapıdır. Alternatif durumuna göre “else if” blokları çoğaltılabilir. Tüm “else if” bloklarıiçin yeni bir şart belirtmek zorunludur. Eğer tüm şartları ifade edebildiyseniz (bir çok durumda edemeyeceksiniz) “else” kullanma zorunluluğunuz yoktur. Aşağıda bu husus örneklendirilmiştir. Dikkatlice inceleyiniz.

Koda dikkat edecek olursanız, personelin ikamet ettiği şehir kontrol ettirilmekte ona görede gerekli kod satırları işletilebilmektedir. Burada hem “if” in hem de “else if” lerden birtanesinin beraber işletilme şansı yoktur. Belirtilen bloklardan sadece bir tanesi işletilecektir.

Yukarıdaki örneği dört farklı “if” yapısı kullanarak da çözebilirdiniz. Fakat siz birbiriyle alternatifli olan bu tür kodları “if-else if” bloğuyla çözün, hız kazanacaksınız. Sebebi çok basittir, şartlardan herhangi bir tanesi gerçekleştiği anda Delphi “if” in bitiş noktasını arayacak haliyle de diğer “else if” ler kontrol edilmeyecektir.

Tek Satırda Birden Fazla Şartı Kontrol Etmek (And & Or):

Bir çok durumda tek satırda birden fazla şartı kontrol ettirebilirsiniz. Bu size kod satırlarınızın kısalmasını sağlayacaktır.

Aşağıdaki örnekleri birbirleriyle kıyaslayınız.

Bu örnekte notun “0” dan küçük veya “100” den büyük olması aynı kodun işletilmesini sağladığı için bu iki şartı tek satırda kontrol edebiliriz.

“And” işleminde o satırdaki tüm şartların sağlanması gerekmektedir. Şimdi de aynı problemi “Or” operatörünü kullanarak çözelim.

“Or” yapılan çözümde koşulların yerleri önem arz etmektedir. Yani “if” teki şartları “else if” e, “else if” teki şartları da “if” e alırsanız sonuçlarınızın bir çoğu yanlış olacaktır.

Mesela “(notu<0) or (notu>100)” satırı ile “notu<50” satırlarını yer değiştirirseniz, “0” dan küçük olan sayılar zaten “50” den küçük olacağı için “else if” i işletme şansınız olmayacaktır (Aralık kesişmesi vardır). “And” için böyle bir durum söz konusu değildir, satırların yerlerini değiştirseniz bile sonuç değişmeyecektir (Çünkü aralık kesişmesi yoktur).

Bu bölümde if yapısının detaylarını sizlere aktarmaya çalıştım. Bir yazılım dilinin en çok başvurduğu yapı sanıyorum budur. Bu yüzden hiç bir pürüz kalmadan kullanılabilecek tüm şekillerine adapte olmalısınız. Ne kadar karmaşık olursa olsun sorunun çözümünü yukarıdaki şekillerden bir tanesiyle gerçekleştireceksiniz. Bazı durumlarda if içerisinde başka bir if daha (belki onun içinde başka bir if yapısı daha vs.) olabilir. Bu tip durumlarda bloklara dikkat ederseniz hiç bir sorun yaşamazsınız.

Şimdi sizlere if yapısı ile ilgili güzel bir örnek çözeceğim. Örneğimiz hala okullarımızda uygulanan sınıf geçme notuyla ilgili olacak. Formunuzun üzerine 4 adet EditBox, iki adette label yerleştirerek aşağıdaki tasarımı oluşturunuz. Geçme notu vizelerin %30 u ile final notunun %70 i toplanarak bulunacaktır.

Aşağıdaki tasarımı oluşturunuz.

Aşağıdaki kodları da projenizin gerekli yordamlarına ekleyiniz.

Yukarıdaki kod sayesinde ikinci GroupBox ta yer alan bütünlemeyle ilgili nesnelerin gözükmemesi sağlanmaktadır.

Şimdi de girilen notları değerlendirecek olan Event’ları oluşturalım. Kodun yazıldığı event’lar Edit3 (Final notu) ile Edit4 (Bütünleme notu) ün Keypress leri olacaktır. “Keypress” yordamı klavyeden herhangi bir tuşa basılmasıdurumunda otomatik olarak işleyen bir yordamdır. Bu yüzden her tuşa basılmasıbizim kodumuzu işletmesin diye Enter tuşu için (“Key=#13”) kontrol konulmuştur. Artık kodumuz sadece Enter tuşuna basıldığı zaman işleyecek, diğer tuşlar hesaplatma işlemini gerçekleştiremeyecektir.

“Keypress” yordamı hakkında detaylı bilgileri Event’lar kısmında bulabilirsiniz. Şimdilik sadece Cursor o kontrolde iken klavyeden bir tuşa basılmasıdurumunda işletileceğini bilin yeter.

Artık aşağıda verilen kodlarıda projenize ekleyebilirsiniz. Kodların Edit3 ve Edit4 kontrolünün Keypress ine yazıldıklarını tekrar hatırlatalım.

Bu yordama yazılan kod sadece Final de geçen öğrencilerle ilgilidir. Girilen vize notlarının ortalamasının %30 u ile Final notunun %70 i toplanarak, bulunacak değerin “50” den büyük veya küçük olduğuna bakılacaktır. Eğer ortalama değeri 50 nin üzerinde ise öğrencinin başarılı olduğuna dair uyarı 4 numaralı etikette kullanıcıya bildirilecektir. Aksi takdirde öğrencinin finalde başarılı olamadığıuyarısı yine aynı etikette öğretmenine iletilecektir.

Şayet öğrenci bütünlemeye kaldı ise; bu aşamadan sonra bütünlemeyle ilgili bilgiler gözükecektir. Bütünleme notu girildikten sonra, Enter tuşuna basınca aşağıdaki (Edit4 ün KeyPress yordamı) yordamın kodu işleyip bulunacak, yeni ortalamaya göre sınıfta kalıp kalmadığı belli olacaktır.

Bu tür bir programda if yapısı gerçekten programcının eli kolu gibidir. If yapısının anlaşılabilmesi için güzel bir örnek (Daha da güzelleştirilebilir. Onuda siz yapın) olduğunu düşünüyorum .

Bir programın algoritmasını doğru bir şekilde tasarlarsanız, projeyi yazarken size çok büyük bir kolaylık sağlayacaktır. Baştan savma olarak bir işe asla soyunmayınız. Tüm olasılıkları düşünüp, hesaplayıp, alternatifler türettikten sonra uygulamaya girişiniz. En önemlisi de ustalarınızın tavsiyelerine muhakkak uyun. Aksi takdirde bir projeyi birkaç kere tekrar yapmak zorunda kalabilirsiniz. Bu da sizde hayal kırıklığı yaratacaktır.

Is Operatörü Kullanarak Karşılaştırma Yapmak:

Nesneleri (Kontroller, classlar, type vs.) “=” operatörüyle kıyaslayamazsınız. Uygulamanızda bu tür kıyaslar yer alacaksa “Is” operatörünü kullanmalısınız. Aşağıda “Is” operatörörünün kullanımına ait yapı verilmiştir.

if ActiveControl is TEdit then begin

//Kodlar buraya yazılacak.

end;

Şimdi konuyu daha iyi anlayabilmeniz için aşağıdaki örnek uygulamayıyapalım. Örneğimiz için form tasarımı aşağıda verilmiştir.

Gerekli olan kodda aşağıda verilmiştir. Programı çalıştırdıktan sonra kontrolü alan Edit in içeriğinin silindiğini göreceksiniz.

procedure TForm3.Edit1Enter(Sender: TObject); begin if ActiveControl is TEdit then //Aktif kontrol Editse TEdit(ActiveControl).Clear; //Aktif kontrolü temizle end;

//Kontrolü kaybedince işler

procedure TForm3.Edit2Enter(Sender: TObject); begin if ActiveControl is TEdit then TEdit(ActiveControl).Clear; //Aktif kontrolü temizle

end; Case Yapısının Delphi’de Kullanım Şekilleri:

Bir çok durumda dallanma işlemlerinizi “if” ile gerçekleştireceksiniz. Fakat kodunuzun daha kolay anlaşılabilirliği (veya yazılması) açısından bazıdurumlarda “case” yapısını kullanmanız uygun olacaktır. Şunu hiç bir zaman unutmayın “case” yapısı ile gerçekleştireceğiniz tüm kodları if yapısıyla yazabilirsiniz, ama tersi mümkün değildir. Yani if yapısıyla oluşturacağınız kodları “case” ile yazamayabilirsiniz.

Aşağıda “case” yapısının kullanım şekilleri gösterilmiştir.

case sayi of 1:ShowMessage('Girdiğiniz Sayı 1 dir'); 2:ShowMessage('Girdiğiniz Sayı 2 dir'); 3:ShowMessage('Girdiğiniz Sayı 3 dür'); 4:ShowMessage('Girdiğiniz Sayı 4 dür'); 5:ShowMessage('Girdiğiniz Sayı 5 dir'); else ShowMessage('Girdiğiniz Sayı Yanlış dır'); end;

“Case” yapısının davranışışöyledir. Alternatifli değişkenin değerleri teker teker irdelenerek gerekli kodların işletilmesi sağlanır.

“Case” yapısıyla aralık kontrolü de yaptırabilirsiniz. Aşağıdaki örnekte bu husus incelenmiştir.

Şimdi başka bir örnek verelim.

Bu örnekte basılan tuşun asci değeri kontrol edilerek, aralığı belirlenmektedir. Ardından büyük harf aralığına uyuyorsa “Büyük Harfe Bastın” mesajı, küçük harf aralığına uyuyorsa “Küçük Harfe Bastın” mesajı, rakam aralığına uyuyorsa da “Rakam Tuşladınız” uyarısı kullanıcıya iletilmektedir.

Şimdide EditBox içerisine rakam girişi dışında değer girilmesini engelleyecek kodu “case” yapısıyla yazalım.

Aşağıdaki şekilde yazacağınız bir kodla da sadece büyük ve küçük harfleri yazdırabilen bir EditBox oluşturabilirsiniz.

“case” yapısı, string veriler için Delphi’de kullanılamamaktadır. Eğer dallanmaya uğrayacak değişkeniniz string veri içeriyorsa o zaman sorununuzu “if” yapısıyla çözmeyi deneyiniz.

Hemen bir sürpriz daha yapalım, “case” yapısı ondalıklı sayılar içinde kullanılamaz.

Döngüler:

Dögü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 belirlediğiniz şartın gerçekleşmesine kadar, döngüler baş vurulması gereken tek seçenektir. Bilhassa dizilerle beraber kullanılabildikleri zaman güçleri korkunç derecede artabilmektedir. Bu yüzden üzerinde çokça zaman harcamalı, konuyu tam anlamıyla kavrayabilmelisiniz.

Bu bölümde Delphi’de kullanılabilen tüm döngüler basitten, en karmaşığına doğru incelenecek ve detaylı örnekler verilecektir.

For Döngüsü:

İlk olarak döngü sayaç sayının belli olduğu “for” döngüsünü inceleyeceğim. Bu döngü sayesinde, döngü bloğu içerisine yazacağınız kodları arka arkaya istediğiniz kadar işletebilirsiniz. Döngünün bilinen bir diğer özelliği de blok içerisindeki kodların en az bir kere işletileceğidir (Aslında tam olarak öyle değildir. Mesela başlangıç değerini bitiş değerinden büyük verirseniz, döngü içerisindeki kodlar hiç işlemeden döngü sona erecektir. Fakat diğer döngülerin bu tip durumlarda kullanılması daha uygun olacaktır). Aşağıda yapı verilmiştir. Dikkatlice inceleyiniz.

for i:=baslangic to bitis do //Tek Satırlık Kod Buraya yazılacak;

Hemen bu yapıyı örneklendirelim.

Şayet “for” bloğu içerisinde birden fazla satır kod işletilecekse, o zaman ayrıca “begin-end” bloğu kullanmalısınız.

For i:=baslangic to bitis do Begin

//İşleyecek olan kod satırları //İşleyecek olan kod satırları

end;

Tek satır işleteceğiniz zamanlarda “begin-end” bloğu kullanırsanız yanlışolmayacaktır. İyice alışana kadar “begin-end” bloklarını tek satırlı durumlar içinde kullanmanızı öneririm (Alıştıktan sonra tek satırlı durumlar için bu bloğu kullanmayabilirsiniz).

Şimdi bu döngü ile ilgili basitten zora doğru örneklendirmeler yapalım. Örnekler için formunuzun üzerine tetikleme amaçlı bir button yerleştirmeniz yeterli olacaktır (Zaten kodlamadan formun üzerine eklenen kontroller hakkında bir fikriniz olacaktır).

Aşağıdaki örnekte “for” döngüsüyle “0-20” arasındaki sayıların toplamıhesaplanmaktadır.

Delphi’nin önceki versiyonlarında toplam değişkenine ilk değer olarak “0” atamak gerekiyordu, fakat burada buna ihtiyaç yoktur (Değer atanmadan işleme tabi tutulursa varsayılan değerini 0 yapmaktadır).

Eğer ara değerleri de görmek isterseniz yukarıdaki iki satırı “begin-end” bloğu içerisinde yazdırmalısınız (Bilgisayar en fazla zamanı değerleri kontroller üzerinde göstermek için harcayacaktır. Bu yüzden gerekmediği sürece, asla böyle bir şey yapmayın. Performansınız korkunç derecede düşecektir). Biz örnek olması bağlamında bunu yapıyoruz.

“for” döngüsünde kullanılan sayaç değişkenini (bu örnekte “i”) muhakkak tam sayı tiplerinden bir tanesiyle tanımlamalısınız. Aksi takdirde Delphi size hata mesajı iletecek, programınızı çalıştırmayacaktır. Aynı örneği aşağıdaki şekilde de çözebilirdiniz.

Burada tekrar hatırlatalım,

Form1.Caption:=FloatToStr(toplam);

Satırını hız açısından “begin-end” bloğunun dışında tutmalısınız. Sayaç bitişdeğerini artırırsanız, sonuç hesaplanmasının ne kadar gecikeceğini daha rahat izleyebilirsiniz.

Şimdi örneğimizi bir adım daha zorlaştırıp, “0” dan Edit kontrolüne girilecek olan değere kadar sayıları toplayacak bir proje yapalım.

Inc() fonksiyonunda kullanacağınız değişken tam sayı tipli olmalıdır. Aksi takdirde Delphi size işlemi yapamayacağına dair uyarı mesajı verecektir. Örneği bir adım daha zorlaştırarak, Edit’lere girilen değerler arasındaki sayıların toplamını hesaplatalım.

Bu örnekte Edit1 kontrolüne girilen değer, Edit2 kontrolüne girilen değerden daha büyükse döngü hiç çalışmayacak, başlıkta “0” değeri gözükecektir. Şimdi bu soruna da kontrol koyarak örneğimizi geliştirelim.

Programda kullanılan aşağıdaki blok, sayaç bitiş değerinin sayaç başlangıç değerinden küçük girilmesi durumunda, değişkenlerin yerlerini değiştirerek başlangıç değerinin bitiş değerinden her zaman küçük olmasını (Eşitte olabilir. Eşit olması durumunda döngü işletilecektir) sağlamaktadır.

if ilk>son then //ilk sondan büyükse

begin //yerlerini değiştir deger:=ilk; ilk:=son; son:=deger;

end;

Aynışekilde “Inc(toplam,i);” satırı yerine, “toplam:=toplam+i;” de (Şayet toplamın reel sayı tanımlanma durumu varsa Inc() fonksiyonu zaten kullanılamaz) yazabilirsiniz.

Örneğimizi biraz daha zorlaştırarak girilen iki sayı arasındaki çift sayılarıtoplatan bir algoritma geliştirelim.

Bu örnekte eklenen kontrol, döngü içerisinde toplam değişkenine eklenecek olan sayının çift olup olmadığının kontrol edilmesi işlemidir. Şayet kontrol edilen sayaç değeri tek sayıysa ekleme işlemi yapılmamakta, çift sayıysa ekletilmektedir. Sonuç olarak da girilen iki sayı arasındaki değerlerin toplamıkolaylıkla hesaplatılabilmektedir.

Bu soruyu “for” döngüsüyle çözmek iyi bir programcı için yanlış bir tercih olacaktır. Sebebi çok basittir, sonuç her zaman doğru çıkacaktır, fakat döngünün işletilme sayısı (Tek sayılar içinde sonuçta kontrol yapılmaktadır) iki kat fazla olacaktır. Bu yüzden bu tip problemleri, daha sonra gösterilecek olan diğer döngülerle çözünüz.

Delphi’de “for” döngüsü içerisinde sayaç değerine step verilemektedir. Yani sayacın ikişer ikişer artması maalesef mümkün olamamaktadır. Şayet sayaç artım değeri “1” den fazla ise diğer döngüleri kullanınız. Ayrıca “for” döngüsü içerisinde sayaç değerini değiştirmenize Delphi izin vermeyecektir.

for i:=ilk to son do begin

if i mod 2=0 then //Çift sayıysa ekle

Inc(toplam,i);

Inc(i); //Burada hata verir sayaç değerine for içerisinde manuel müdahale //edilemez

end;

Şimdi sizlere Döngü ve Dizileri iç içe kullanabileceğiniz sıralama algoritmalarından bahsetmek istiyorum. Lütfen dikkatlice İnceleyiniz.

Repeat Until Döngüsü:

Bazı durumlarda döngünüzün kaç kere işleyeceğini tahmin edemeyebilirsiniz. Yani döngünüz bir şarta (veya birden çok) bağlı olarak işleyecektir. Dolayısıyla bu işlemi “for” döngüsüyle çözemeyeceksiniz. Döngünüzün çalışma sayısı bir şarta bağlı olacaksa çözüm yollarından bir tanesi “Repeat-Until” döngüsüdür. Belirteceğiniz şart sağlanmadığı sürece döngünüz işlemeye devam edecektir.

repeat

//Döngü içerisinde işletilecek kodlar buraya yazılacak. Until ilk>son; //şart sağlanırsa bitir

Aşağıdaki örnek projede, daha önce “for” döngüsüyle çözmüş olduğumuz girilen iki sayı arasındaki sayıların toplamını hesaplayan projenin “Repeat – Until” döngüsüyle çözülmüş hali verilmiştir.

Şimdi de yine daha önceden “for” ile yazdığımız fakat iyi çözüm olmadığınıbelirttiğimiz girilen iki sayı arasındaki çift olanları toplayan programın kodlarınıverelim (Tabiiki çözümü Repeat-Until ile gerçekleştireceğiz).

Bu arada tekrar hatırlatalım. Inc() fonksiyonunu kullanabilmeniz için, fonksiyona giren iki değerinde tam sayı tipli değişken olması gerekmektedir. Aksi takdirde “toplam:=toplam+ilk” yazmalısınız.

Şimdi de programı çalıştırdığımız anda bize şifre soracak, eğer şifreyi bilemezsek yeniden girmemizi isteyecek pencereyle karşılaşacağımız bir program yapalım.

Şifre isteme işlemlerinin yapılacağı en uygun Event “FormCreate” yordamıdır. Bu yüzden kodumuzun tamamını bu procedure’e yazacağız. Şifre isteme işlemini döngü içerisinde yapacağımız için, şifreyi doğru girene kadar arka arkaya şifre penceresi ile karşılaşacaksınız. Bahsettiğimiz bu tür uygulamaları, şarta bağlı olarak işletilebilen döngülerle çözmek çok uygun bir çözüm yolu olacaktır.

Şifre uygulaması için aşağıdaki kodları projenizin gösterilen yordamlarına ekleyiniz.

Şimdi de uygulamamızı biraz daha geliştirerek, kullanıcının sadece üç kere şifre girebileceği, üç hakkında da bilemezse programın kapatılacağı bir hale dönüştürelim.

Döngü içerisinde kullanılan “Application.Terminate” komut satırı programıkapatmak için kullanılmaktadır. Yanlız burada ufak bir incelik var. Delphi “Application.Terminate” komutunu gördüğü zaman programı bitirir ama döngü tamamlandıktan sonra. Bu yüzden “exit” komutunu eklemezseniz, garip durumlarla karşılaşabilirsiniz (Döngü içerisinde Application.Terminate komutunu kullanırkan dikkat etmelisiniz).

While Do Döngüsü:

Bu döngü belirtilen şart gerçekleştiği sürece devamlı olarak işler. Repeat – Until döngüsünden farkı, şartın döngü çıkışında değil, girişinde kontrol edilmesidir. Belirtilen şart sağlanmıyorsa bu bloğa yazacağınız kod hiç işlemeyebilir. Aşağıdaki döngü için kullanacağınız yapı verilmiştir.

while ilk<=son do begin

//Kodlar Bu araya yazılacak end;

Belirtilen şart sağlandığı sürece döngü komutları işlemeye devam edecektir. Yine bloktaki kodlar bir satırdan fazla ise begin-end bloğu kullanmak zorunlu olacaktır. Aşağıda girilen iki sayı arasındaki çift sayıların toplamı bu döngü kullanılarak çözülmüştür.

Şimdi de şifre sorma uygulamasını “While-Do” döngüsüyle gerçekleştirelim.

Sıralama Algoritmaları:

Bir dizi elemanlarını sıralamanın bir çok çeşidi bulunmaktadır. Şimdi bu çeşitleri sizlere aktarmak istiyorum. Tüm sıralama algoritmalarını aşağıdaki form için oluşturacağız.

Şimdi formumuza yerleştirdiğimiz buttonlara, ait oldukları sıralamaya ait kodları ekleyelim.

o Bubble Sort:

En son elemandan başlayarak her eleman ikinci elemana kadar (İkinci elemanın index numarası 1 dir. i sayacı bu yüzden birden başlatılmıştır) bir önceki ile karşılaştırılarak gerçekleştirilebilmektedir. Şarta uyan dizi elemanları yer değiştirilerek dizinin sıralanması sağlanmaktadır.

Programı çalıştırdıktan sonra “BubbleSort” Buttonuna tıklarsanız ekran görüntünüz aşağıdaki şekilde (Elemanlar listBox2 de sıralanmış halde) oluşacaktır.

Burada yapılan işlem dizinin ilk elemanının en küçük, son elemanının da en büyük olmasını sağlamaktır (Aradakiler de sıralı halde tabii ki). Küçükten büyüğe doğru bir listeleme yapmak isteseydiniz, tek yapmanız gereken değişiklik, en sondaki “for” döngüsüyle ilgili olacaktı.

for i:=adet-1 downto 0 do ListBox2.Items.Add(IntToStr(dizi[i]));// Küçükten büyüğe doğru yaz.

Şimdi buttona tıklarsanız yukarıdaki gibi küçükten büyüğe doğru sıralı halde bir liste elde edersiniz.

o Bubble Sort 2:

Bu da ikinci sıralama yöntemimiz. Çalışma mantığışöyle, dizinin her elemanıkendisinden bir sonraki elemanla karşılaştırılarak, koşula uyanların yerlerini değiştirmek suretiyle iş görmektedir.

Bu sıralama algoritmasını kullanmanızı tavsiye etmiyorum. ListBox taki elemanların fazla olması durumunda çok ağır kalacaktır. Daha hızlı çalışan diğer algoritmaları kullanın.

o Shell Sort:

Şimdi de Shell Sort algoritmasının nasıl yazılabileceğine değineceğim. Üstteki algoritmalardan daha hızlı olduğunu belirtmek isterim.

Nedense hep böyledir. Karışık algoritmalı programlar, basit olanlardan daha hızlı çalışırlar.

o Selection Sort:

Şimdi de bu sıralama algoritmasını hazırlayıp programınızı çalıştırabilirsiniz. Sanıyorum içlerinde en anlaşılır olanı budur.

Buradaki mantık: Dizinin her elemanı kendisinden sonra gelen tüm elemanlarla karşılaştırılmaktadır. Karşılaştırma esnasında; belirtilen kurala uyan elemanlar, yer değiştirilerek düzgün bir sıralama elde edilebilmektedir.

Şimdi de bu sıralama algoritmalarının en hızlısı olanı ile ilgili örneğimize geçelim.

o Quick Sort:

Sıralama algoritmalarının en hızlı olanıdır. Bu örnekte procedure kendi kendisini çağıracağı için her defasında diziyi yeniden boyutlandırmak isteyecektir. Bu yüzden dizi elemanları global olarak başka bir procedure içerisinde boyutlandırılacaktır.

Biraz karmaşık gelebilir, ilk etapta dikkatli olmanızı öneririm. Procedure'ün bazışartlar sağlandığı anda kendi kendisini çağırması kafanızı fazla karıştırmasın.

Bu algoritmada, dizinin orta elemanı (10 eleman varsa “10 div 2” ile 5. eleman kastedilmektedir) bulunmakta, alt ve üst serideki elemanlar index numaralarına göre karşılaştırılarak koşula uyanlar birbirleriyle yer değiştirmektedir. Yine belirtilen koşullar neticesinde procedure'ün kendi kendisini çağırmasısağlanmaktadır.

Döngü Yönlendirme Komutları:

Döngü kodlarınızın işletilmesi anında, belirlemiş olduğunuz şartın (veya şartların) gerçekleşmesi durumunda, döngüden çıkmak veya tekrar başa (döngünün başına) dönmek isteyebilirsiniz. Şimdi bu tip durumlarda kullanabileceğiniz komutlardan bahsedeceğim.

Continue:

Şartınızın sağlanması durumunda, döngünün diğer kodlarını işletmeden tekrar başa dönülmesini sağlayan komuttur. Burada sayaç değişkeni değerini yine artıracaktır (for döngüsü için). Aşağıda girilen iki değer arasındaki çift sayılarıtoplatarak “Continue” komutunun işleyişini göstereceğim.

Yukarıdaki gibi bir örneği kesinlikle “for” döngüsüyle çözmeyin. Biz komutu anlamanız için böyle bir çözüme başvurduk. Örnekte aralıkta bulunan sayıların çift olup olmadıkları kontrol edilmekte, eğer çift sayı değilse ekleme işlemi yapılmadan tekrar başa dönülmektedir. Çift sayı olması durumunda ise, en son bulunan toplam değerine eklenmektedir.

Break:

Bu komut sayesinde, belirttiğiniz şart sağlandığı anda döngünün diğer komutlarıişletilmeden bloktan çıkabilmeyi sağlayabilirsiniz.

Aşağıdaki örnekte kaça kadar olan sayıların toplamının “100” ü ilk geçen değer olduğu hesaplanmakta, istenen şart sağlandığı anda döngü komutlarıişletilmeyerek procedure sonlandırılmaktadır.

Break komutunun işleyiş mantığı, koşul sağlandığı anda sadece o “for” (Diğer döngüler içinde kullanılabilir) döngüsünden çıkılmakta, procedure’e ait döngü dışındaki diğer kodlar okunmaya devam etmektedir.

Exit:

Bu komutla hem döngüden çıkılması sağlanır, hem de alt satırlarda kalan diğer kod satırlarının okunması engellenir. Aşağıda exit komutunun kullanılışına ait basit bir örneklendirme yapılmıştır.

Örnekte EditBox’a girilen not değerinin “50” den büyük olup olmadığı kontrol edilmektedir. Şayet notu “50” den büyük girerseniz, ikinci mesajınız yani “Bütünlemede Ders Almanız Gerekmektedir” uyarısını “exit” komutu işletildiği için asla göremezsiniz.

Şimdide hem döngüyü, hem de programı sonlandırabilecek Delphi komutlarınıgörelim.

Halt

Programı sonlandırmak için kullanılan bir komuttur. Kullanımına ait örnek aşağıda verilmiştir.

Application.Terminate:

Yine uygulamanızı sonlandırma amaçlı kullanabileceğiniz bir Delphi komutudur. Aşağıda kullanımına ait örnek verilmiştir.

Application.Terminate” komutunu döngü içerisinde kullanırsanız dikkatli olmalısınız. Size çok normal gözüken fakat Delphi tarafından enteresan değerlendirmeye sebebiyet vermektedir. Aşağıdaki örneği dikkatli inceleyiniz.

Program sanki toplam değer “10000” den büyük olduğu anda kapanacak gibi gözüksede öyle değildir. Programın döngü sonlandıktan sonra kapatılacağıkesindir. Eğer burada toplam değişkeninin değeri “10000” i geçtikten hemen sonra programın kapanması isteniyorsa kodu aşağıdaki gibi değiştirmelisiniz.

Aynı uygulama için “Halt” komutunu kullanırsanız, “exit” e ihtiyaç duymadan şart sağlandığı anda program kapatılacaktır.

var

ilk,son:Integer;toplam:Real;

begin

ilk:=10;son:=555555;toplam:=0; while true do //Sonsuz döngü yaratılıyor begin

toplam:=toplam+ilk; Form1.Caption:=FloatToStr(toplam);inc(ilk); if toplam>= 10000 thenbegin

Halt; //Programı kapat end; end;end;

Halt” komutu döngü içerisinde hiç bir extra kod istemeden uygulamayısonlandırmakta, “Application.Terminate” ise döngünün bitmesini bekledikten sonra programı kapatabilmektedir.

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” cinsindendir (Saniyenin binde biri). Komutu anlayabilmeniz için aşağıdaki iki kod bloğunu ayrı ayrı çalıştırıp sonucu izleyiniz.

Şimdi de kodu aşağıdaki hale dönüştürüp tekrar çalıştırın.

Programın öncekine göre çok daha ağır çalıştığını göreceksiniz. Bunun sebebi eklemiş olduğunuz “sleep(1000)” kod satırından kaynaklanmaktadır. Bu komut bilgisayarı her seferinde bir saniye uyutacaktır.

Application.ProcessMessages:

Uygulamanıza yoğun bir işlem yaptırırken (mesela döngü komutları işletilirken) diğer bir komuta programınız yanıt veremeyecektir. Bu durum sizin için sıkıcı, hatta bunaltıcı olacaktır. Bir döngü kodunu işletirken, dikkat ettiniz mi bilmiyorum, diğer hiç bir komutu tetikleyemezsiniz (Programı kapatamaz, formu taşıyamaz veya başka bir buttona tıklayamazsınız). “Application.ProcessMessages” böyle durumlara çözüm yaratmak için Delphi’ye dahil edilmiştir. Aşağıdaki iki kod bloğunu işletip aradaki farkıgörmeye çalışın.

Buttona tıkladıktan sonra deneyin; formunuzu taşıyamayacak, kapatamayacak ve başka bir buttona tıklayamayacaksınız.

Bu durumun iki çözümü bulunmaktadır. Bunlardan birincisi “Application.ProcessMessages” dır. Delphi “Application.ProcessMessages” satırını gördüğü zaman kontrolü kısa bir süre için windows’a bırakarak, kullanıcıya diğer isteklerini yerine getirebilme şansı vermektedir (Formu taşıyabilir, başka bir buttona tıklayabilirsiniz vs.). Diğer bir yöntemse (Bu çok gelişmiş bir tekniktir. Thread yaratarak sadece o uygulamanın çalışabileceği bir kanal yaratmaktır.) sadece sizin istediğiniz komutlara cevap verecek bir kanal yaratmaktır (Bu konuya daha sonraki kısımlarda değinilecektir). Uygulamanız da ne kadar çok kanal yaratırsanız, performansınızı o oranda düşürürsünüz.

Şimdi yukarıdaki kod bloğunu aşağıdaki hale çevirip uygulamanızı tekrar çalıştırınız.

Artık uygulamanız döngü komutları işlerken sizin komutlarınıza da cevap verebilecektir. Programı çalıştırdıktan sonra, button kontrolüne tıklayıp formunuzu taşımayı deneyin. Başarılı olduğunuzu göreceksiniz.

BÖLÜM 5 DELPHI’DE FONKSİYON & PROSEDÜRLER

116

Delphi’de Prosedürler:

Aynı kodun işletileceği durumlarda, işletilecek olan kodu tek bir yerde tanımlayıp gerekli yerlerden bu kodlara erişim sağlayabilirsiniz. Bu işlemler için genellikle kullanılan iki yöntem bulunmaktadır. Geriye değer döndürmeyen (aslında istenirse döndürtülebilir) bloğa procedure (buradan sonra prosedür olarak kullanılacaktır) adı verilmektedir.

Aşağıdaki bölümde Delphi içerisinde bir prosedürün nasıl tanımlanabileceğini, tanımlanan prosedüre projenizden nasıl erişebileceğinizi göstereceğim. Fakat daha önce Delphi’nin kullandığı forma ait prosedürlere bir örnek verelim.

Formunuzun üzerine bir adet button kontrolü yerleştirip, üzerine mous ile çift tıklarsanız, çalışma anında bu buttona tıklanılması durumunda işletilecek kodun yazılabileceği prosedüre ulaşırsınız.

Yukarıdaki işlem kitabın tamamında defalarca işlendiği için detaylara daha fazla değinmeden, sizin tanımlamak zorunda kalacağınız prosedürlerden bahsedelim. Kullanıcı tanımlı bir prosedürü aşağıdaki şekilde kolaylıkla tanımlayabilirsiniz.

Bu şekilde tanımladığınız prosedüre, sadece bu classa üye olan diğer prosedürler tarafından ulaşılabilir. Eğer oluşturduğunuz bu prosedürü dışarıdan çağırmak istiyorsanız (ikinci formdan), o zaman biraz daha beklemeniz gerekecektir.

Aşağıda mesaj ismiyle tanımlanan prosedüre “procedure TForm1.Button1Click (Sender: TObject)” yordamından nasıl erişebileceğinize dair örnek vereceğim.

Şimdi buttona tıklarsanız, mesaj isimli prosedürde belirtilen uyarıyla karşılaşırsınız.

Kullanıcı tanımlı prosedürler normal şartlar altında sadece tanımlandıklarıyerden sonraki yordamlar tarafından çağrılabilirler. Aksini yaparsanız, Delphi size komutu tanımadığına dair uyarı mesajı iletecektir. Peki bu işlemin başka bir yolu yok mu? Tabii ki var. Hemen izah edelim.

Prosedürleri Diğer Yordamlara Bildirmek:

Bir prosedürü tanımlandığı satırdan daha önceki bölümlerden çağırmaya kalkarsanız, Delphi’nin sizi hata mesajıyla uyaracağını yukarıda belirtmiştik. Bu hatayı engellemenin ikinci yolu (İlk yol en üstte tanımlanması gerektiğidir.) prosedürü “forward” ile declare etmektir.

Aşağıdaki kod bloğunda, öncelikle “mesaj” prosedürünün varlığı declare edilerek alttaki satırlarda tanımlansa bile, diğer yordamlar tarafından kullanılabilmektedir.

Her ne kadar sorun çözüldü gibi gözüksede ufak bir hususa dikkat etmelisiniz. Yazmış olduğunuz “procedure mesaj;forward;” kod satırının “mesaj” isimli prosedürün çağrıldığı satırdan önce yazılmış olması gerekmektedir.

Parametre İçeren Prosedür Tanımlamak:

Bazı durumlarda işleteceğiniz prosedür içerisinde kullanılmak üzere parametre (veya parametreler) göndermek isteyebilirsiniz. Bu gibi durumlarda prosedürünüzü parametreli olarak tanımlamalısınız. Prosedüre birden fazla parametre değeri gönderebileceğinizi de belirtmekte fayda var.

Aşağıda tek parametre içeren bir prosedürün nasıl tanımlanabileceği, daha sonra projeden tanımlamış olduğunuz prosedüre nasıl parametre değeri aktarabileceğiniz gösterilmiştir.

Şimdi de projenize bir adet button ve bir adet Edit kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz.

Bu örnekteki amaç buttona tıklanıldığı zaman EditBox’ın içerisindeki veriyi “bildir” isimli prosedüre parametre olarak göndermektir. Ardından prosedürdeki kod işletilerek, ekranda gözüken uyarıyı kullanıcıya iletmektir.

Burada “bildir” isimli prosedürün içerisine yazmış olduğunuz kodu “procedure TForm1.Button2Click(Sender: TObject)” yordamına da yazabilirdiniz. Aynısonucu almakla beraber, burada extra bir incelik bulunmaktadır. Şayet bu kodu başka yerlere de yazmanız gerekirse, hele de prosedür içerisindeki kodlar uzun ve karmaşıksa sizin için çok sıkıcı bir durum (Amerikayı ikinci kez keşfetmek sanıyorum fazla zevk vermeyecektir. Hatta sıkıcı bile olabilir.) yaratacaktır. Onun için tekrarlanacak olan kod satırlarını bir prosedür içerisinde depolayıp saklarsanız, dilediğiniz zaman çağırıp kullanabilirsiniz.

Aşağıda tek parametre içeren bir prosedür tanımlanmış olup, buttona tıklanınca işletilebilmektedir.

Şimdi buttona tıklarsanız, EditBox kontrolü içerisindeki bilginin mesaj penceresi içeriği olarak karşınıza geldiğini göreceksiniz.

Birden Fazla Parametreli Prosedür Tanımlamak:

Bazı durumlarda prosedürünüz birden fazla parametre kullanmak zorunda kalabilir. Bu tip durumlarda izleyeceğiniz yol aşağıda belirtilmiştir.

procedure kimlik(değişken1:AnsiString; değişken2:Integer); begin

// İşletilecek Olan Kod Buraya Yazılacak

end;

Birden fazla parametreli prosedür tanımlamak, tek parametreli prosedür tanımlamaktan hiçte zor değil. Aralarına “;” koyarak dilediğiniz sayıda parametre belirleyebilirsiniz. Tanımladığınız prosedürün sonuna “;” eklemeyi unutmayınız, hatırlatmasını da yeri gelmişken yapalım.

Şimdi formunuzun üzerine iki adet Edit, bir adet Button kontrolü yerleştirerek aşağıdaki tasarımı oluşturunuz. Ardından projenizi çalıştırıp text kutularına değerleri girin ve buttona tıklayınız.

Örneğimiz için prosedür içerisine iki adet parametre (isim ve yaşı) yollanarak blok kodunun işletilmesi sağlanmaktadır.

Aşağıdaki kodları da formunuza ait Unit içerisinde gerekli olan yerlere ekleyiniz.

Prosedürde kullanılan “#13#10” kod parçası, mesaj penceresinde ikinci satıra atlayıp, yazı yazmaya devam etmek için eklenmiştir. Bu komutlarıeklemezseniz, mesaj pencereniz bütün içeriği tek satırda göstermek zorunda kalacaktır. Bu ve buna benzer komutlar neredeyse bütün dillerde aynı amaçla bir çok kere kullanılmaktadır.

Dizi Parametreli Prosedür Tanımlamak:

Oluşturacağınız prosedür içerisinde parametre olarak dizi değişkende kullanabilirsiniz. İzlemeniz gereken yol aşağıda verilmiştir.

type hocalar=Array[0..2] of AnsiString; //Önce tip Tanımlamayı unutmayınız

procedure egitmenler(isim:hocalar); //Prosedür tanımlanıyor. begin

//Prosedürün işleteceği kodlar buraya yazılacak.

end;

Bu arada aşağıdaki şekilde tanımlayacağınız dizi değişkenli prosedürü Delphi kabul etmeyecektir. Dikkatli olunuz.

Procedure egitmenler(isim:Array[0..2] of AnsiString); //Delphi hata mesajıverir.

Dinamik Dizi Parametreli Prosedür Tanımlamak:

Prosedürünüzün parametrelerini (birden fazla da olabilir) dinamik dizi olarak tanımlayabilir, prosedür içerisinde kolayca boyutlandırabilirsiniz. Aşağıda dinamik dizi parametreli prosedüre örnek verilmiştir.

procedure sertifika(isim:Array of AnsiString); //Dinamik dizi parametre //Dinamik dizi için hata vermez Hata vermez

begin

// Gerekli olan prosedür kodları buraya yazılacak.

end;

Şimdi konuyu anlamak açısından formunuza bir adet button kontrolü ekleyerek aşağıdaki kodları çalıştırınız.

Görüldüğü gibi prosedür içerisinde dinamik dizi değerlerini kullanmak hiç de zor değildir. Olay sadece programcının hayal gücüne kalmıştır.

Opsiyonel Parametreli Prosedür Tanımlamak:

Prosedür tanımlarken bazı parametrelerin opsiyonel olmasını isteyebilirsiniz. Yani kullanıcı bu parametreye dilerse değer gönderir, eğer gerek görmezse sadece diğer parametrelere programdan değer göndererek prosedürü işletebilir.

procedure eleman(isim:AnsiString;vasif:AnsiString='');

//opsiyonel parametreli prosedür tanımlanıyor

begin

//İşletilecek olan kod buraya yazılacak.

end;

Aşağıdaki “eleman” isimli prosedürü oluşturup, button kontrolünün “procedure TForm1.Button6Click(Sender: TObject)” yordamına tıklandığı zaman işleteceğiniz kodu yazın.

Şimdi aşağıdaki form tasarımını oluşturup projenizi çalıştırınız. Ardından elemanın isminin girileceği kutuyu doldurup (Mesleği kısmını boş bırakın) buttona tıklayın. Karşınıza aşağıdaki ekran görüntüsü gelecektir (Adı Soyadıvar, meslek bilgisi vasıfsız işçi). Prosedürün tek parametreyle işletildiği sanıyorum dikkatinizi çekmiştir.

Bu sefer de “Meslek” bilgisinin yazılacağı text kutusuna değer girin ve projenizi çalıştırın. Aşağıdaki gibi hem “Adı Soyadı”, hem de “Meslek” bilgisinin yazılıolduğu mesaj penceresi kullanıcıyı bilgilendirecektir.

İkinci durumda prosedürün iki parametreyle işletildiğini sanıyorum belirtmeye gerek yok (ama biz yine de belirtelim).

Opsiyonel parametreli bir prosedür tanımlamak için yapmanız gereken tek şey, prosedür içerisinde opsiyonel değer alacak olan parametrelere default değer atamaktır. Default değer aktardığınız parametrelere programdan değer göndermek veya göndermemek tamamen kullanıcıya kalmıştır. Örneğimizde dikkat ettiyseniz; prosedür, mesleği kısmı boş bırakılırsa (vasıfsız eleman) tek parametreyle, doldurulursa iki parametreyle işletilerek kullanıcıbilgilendirilmektedir.

Bu tip prosedürlerde opsiyonel parametre sayısı tamamen programcıya kalmıştır. Dilediğiniz kadar oluşturabilirsiniz.

Delphi’de Fonksiyonlar:

Fonksiyon tanımlama işlemi prosedür tanımlamaya çok benzer. Aralarındaki tek fark fonksiyondan geriye dönen değerin olmasıdır (Aslıda prosedürden de istenirse değer döndürülebilir. Örneklerde alternatif olarak çözümler verilmiştir). Aşağıda Delphi’de fonksiyonların nasıl tanımlanacakları gösterilmiştir.

function hesapla(ilk:Integer;son:Integer):Real; begin

//Kodlar Buraya Yazılacak. //result:=Döndürülecek değer

end;

Function fonsiyon_adi(degiske1:Tip;degisken2:Tip):fonksiyon_Tipi;” satırıile iki parametreli fonksiyon tanımlanabilir. Fonksiyonun programdan çağrılmasını aşağıdaki şekilde yaptırabilirsiniz.

procedure TForm3.Button1Click(Sender: TObject); var

x,y:Integer;

sonuc:Real; begin

// kodlar buraya yazılacak //sonuc:=hesapla(x,y); //Fonksiyona parametreler yollanıyor.

end;

Şimdi olayı örnek üzerinde izah edelim. Aşağıdaki form tasarımını oluşturup programı çalıştırınız.

Editlere öğrencinin vize notlarını girip buttona tıklayın. Vize ortalamasının hesaplanıp, başlıkta yazdırıldığını göreceksiniz.

Programın işleyişini sağlayan kodlar aşağıda verilmiştir. Pencerede ortalama değerin tanımlanmış olan fonksiyon tarafından hesaplattııldığına dikkatinizi çekmek istiyorum.

Kod satırlarını inceleyecek olursak, Edit’lere girilen değerler değişkenlere aktarılıp parametre olarak “hesapla” isimli fonksiyona yollanmaktadır. Sırasıyla fonksiyon bu parametreleri “ilk” ve “son” isimli değişkenlerinin yerlerine koyarak sonucu hesaplamaktadır. Hesaplanan değer, sonuc (Geriye dönen değerle bu kastedilmektedir.) isimli değişkene aktarılarak başlıkta yazdırılmaktadır.

Fonksiyonlarda Aşırı Yükleme:

Delphi aynı isme sahip farklı parametreli birden fazla fonksiyonu tanımlamanıza izin vermektedir (Bu olaya fonksiyonlarda aşırı yükleme denir). Kod içerisinde işleteceği fonksiyona, parametre sayılarına ve tiplerine bakarak karar verir.

Her ne kadar Delphi aynı isme sahip farklı parametreli fonksiyon tanımlanmasına izin versede, bunu programda bildirmelisiniz. Yani normal şartlar altında aynı isme sahip iki fonksiyon bildirisi, program tarafından hata mesajı iletisi verilmesine sebep olacaktır. Bu hata mesajını engellemek için “overload” bildirisini yapmanız (hem de iki fonksiyon için yapmanız) gerekecektir. Bu bildiriden sonra programınız artık hata mesajı vermeyip, yazdığınız kodları işleterek sonuçları döndürecektir.

Aşağıdaki gösterimde, “ortalama” isimli aynı ada sahip iki fonksiyon tanımlanmıştır.

function ortalama(ilk:Integer;son:Integer):Real;overload;//bildiri yapıldıbegin

//Gerekli kodlar buraya yazılacak

//result:=Geriye dönecek değer end; function ortalama(ilk:Integer;orta:Integer;son:Integer):Real;overload;//bildiri begin

//result:=Geriye dönecek değer

end;

Sanıyorum fark ettiniz; fonksiyonlarda geriye dönecek olan değer “result” ifadesiyle belirlenmektedir (c++ da return).

Önemli olduğu için tekrar hatırlatalım, iki fonksiyonun sonuna da “overload” bildirisi ekleyerek aynı isimle iki fonksiyon tanımlayabilirsiniz.

Dizi Parametreli Fonksiyon Tanımlamak:

Bazı durumlarda fonksiyonunuza bir dizi değişken gönderip, elemanların değerleriyle ilgili işlemler yaptırabilirsiniz. Dizi değişkenli fonksiyonlarıaşağıdaki yaklaşımla tanımlayabilirsiniz.

function hesapyap(x:Array of Integer):Real; //Dizi parametresi içeriyor var

//Değişken Tanımlamaları

begin

//Gerekli kodlar buraya yazılacak //result:=Dönüş değeri; end;

Şimdi de göndereceğimiz dizi elemanlarının toplamını hesaplayacak bir fonksiyon yazalım. Aşağıdaki kod satırlarını projenize ekleyip çalıştırınız.

Okek Hesaplayan Fonksiyon:

Aşağıdaki fonksiyonla, fonsiyona gönderilen dizi elemanlarının “okek” lerini hesaplayabilirsiniz. Program için verilen form tasarımını oluşturup programıçalıştırınız.

Fonksiyonda kullanılan “Floor” ve “MaxIntValue” fonksiyonları “math” kütüphanesinde tanımlı olduğu için, bu kütüphaneyi “uses” satırına eklemelisiniz. Eklendikten sonra uses satırı aşağıdaki gibi olmalıdır.

 

Daha fazla bilgi için (yaklaşık 1200-1300 sayfa pdf dosyası) Tıklayınız...