Bir önceki dersimizde genel alışkanlıkların dışına çıkıp Delphi ile konsol uygulaması hazırlayıp Delphi’nin temel özellikleri hakkında bilgi vermeye çalışmıştık. Konsol uygulamaları üzerinde durmamızın nedeni işin geri planı hakkında bilgi sahibi olmanızı amaçlamamdır. Zira konsol uygulamalarına çok özel durumlarda gerek duyuluyor.
Bu derste normal Delphi projeleri ve kod yazma konusunda öncelikle bilmeniz gereken bir kaç konudan söz edilecektir. Delphi 2007/2009 ile klasik Delphi projesi hazırlamak istiyorsanız File menüsünden komut verip ekrana New Items diyalog kutusunu getirmelisiniz.

Bu diyalog kutusunda VCL Forms Application şablonunu seçip OK düğmesini tıkladığınızda "Form1" adında bir forma sahip Project1 adında bir proje hazırlanır. VCL Forma Application tipinde Delphi projesi hazırlamak için New Items diyalog kutusunu ekrana getirmek yerine File menüsünden VCL Forms Application komutunu verebilirsiniz. Aşağıda verdiğim ekran görüntüsünü VCL Forms Application şablonunu ile proje hazırladıktan sonra aldım.

Daha önceki derslerde Delphi’nin program geliştirme ortamı hakkında az çok bilgi verildiği için dikkatlerimizi hazırladığımız projeye çekeceğiz. Bu amaçla ilk olarak bu projeyi kaydedip kaydetme işlemi sonucu hazırlanan dosyalara bakacağız. Üzerinde çalıştığım projeyi kaydetmeden önce “C:” sürücüsünde “\Projeler” adında bir klasör hazırladım. Üzerinde çalıştığınız projeyi kaydetmek üzere File menüsünden Save All komutunu verdiğinizde ekrana ilk olarak Save Unit1 As başlıklı diyalog kutusu gelir.

Diyalog kutusunun başlığı o sırada kaydedilmek istenen formun kod tarafını temsil eden Unit’in mevcut adına göre seçilmektedir. Projeyi hazırladığım klasöre kaydetmek istediğim için klasör seçiminden sonra Kaydet düğmesini tıklayıp form ve formla ilgili Unit’i kaydetme işlemini tamamladım. Unit’in kaydedilmesi tamamlandıktan sıra proje dosyasını kaydetmeye gelir ve ekrana Save Project1 As başlıklı diyalog kutusu gelir. Bu sırada projeye istediğiniz adı verebilirsiniz.

Bu şekilde projeyi ve bileşenlerini kaydettikten sonra kaydetme işlemi sonucu hazırlanan dosyaları görmek üzere ilgili klasöre baktım. Aşağıda verilen ekran görüntüsünü incelediğinizde projedeki “Form1” adlı form için “Unit1.pas” ve “Unit1.dfm” adında 2 dosyanın hazırlandığını görürsünüz. Ayrıca Delphi 2007/2009'un proje için toplam 4 dosya hazırladığını fark etmiş olmalısınız. Delphi'nin eski sürümlerinde projelerle ilgili olarak yalnızca dpr uzantılı dosya hazırlanıyordu.

Şu aralar kullanıma sunulan Delphi 2009’da küçük değişiklikler olmakla birlikte bu dersler bağlamında ister Delphi 2006, ister Delphi 2007, isterse de Delphi 2009 kullanın değişen bir şey olmaz. Aşağıda verilen ekran görüntüsünü Delphi 2009 ile yeni bir proje hazırladıktan sonra aldım.

Bu ders boyunca kullanacağım ekran görüntüleri küçük olsun diye Delphi penceresi içinde proje hakkında bilgi içeren bazı pencereleri kapattım, bazılarını ise gizledim.

Tekrar etmek gerekirse File menüsünden VCL Forms Application komutu verilip yeni bir proje hazırlandığında bu proje bir forma, dolayısıyla bir Unit’e sahip olmaktadır. Yukarıda işaret edildiği gibi PAS uzantısına sahip kod dosyasından başka DPR uzantılı bir proje dosyası hazırlanmaktadır. Delphi projeleri çalışmaya DPR uzantılı proje dosyasından itibaren başladıkları için DPR uzantılı proje dosyası hakkında bilgi sahibi olmak gerekmektedir. Delphi tarafından projeler için otomatik olarak hazırlanan DPR dosyasının içeriğini görmek istiyorsanız Project menüsündeki View Source komutunu verebilirsiniz.

Delphi tarafından her proje için hazırlanan kodları görmek ve gerekirse değişiklik yapmak için Project menüsünden View Source komutunu verirseniz ekrana kod penceresi gelir. DPR dosyası ile ilgilenmeden usta işi programlar yazmak mümkündür. Çünkü Delphi bu dosya ile ilgili birçok işlemi otomatik olarak yapmaktadır. Örneğin projenin başlangıç formunu seçmek için DPR dosyasına doğrudan müdahale etmek zorunda değilsiniz.

Projeler için otomatik olarak hazırlanan bu kodun ilk satırında program deyimi ile projeye ad verilmektedir. Projelere program deyimi ile ad verilmesi konusunda yapabileceğiniz herhangi bir işlem yoktur. Çünkü projeyi hangi ad ile kaydederseniz “program” deyimi ile projeye o ad otomatik olarak verilmektedir. Program deyimi ile projeye verilen ad aynı zamanda projenin EXE dosyasının adı olmaktadır.
Usesdeyimi ile başlatılan blokta her projeye önce Forms adlı hazır unit(başka bir deyişle Delphi ile birlikte verilen “Forms.pas” adlı dosya), ardından projedeki formları temsil eden Unit’ler sıra ile dahil edilmektedir. Bu koddaki Uses bloğuna dikkat ederseniz projedeki “Form1” adlı formu temsil eden Unit1’in farklı bir şekilde koda dahil edildiğini görürsünüz. Çünkü Unit1, Delphi ile birlikte hazır olarak gelen Unit’lerin bulunduğu klasörde yer almamaktadır. Bu nedenle Unit’in yer aldığı PAS uzantılı dosya in deyimiyle işaret edilmektedir.
Delphi her proje için burada kullanılan Application nesnesini otomatik olarak hazırlamaktadır. TApplication sınıfı kaynaklı Application nesnesi Forms adlı Unit’te tanımlı olduğu için DPR uzantılı proje dosyasına bu Unit dahil edilmektedir. TApplication sınıfının CreateForm() metoduna 1. parametre olarak verilen Class, formu temsil eden Unit’te hazırlanmaktadır.
Bir forma, dolayısıyla bir Unit’e sahip Delphi projelerinde TForm1 adlı Class Unit1’de hazırlanmakta ve TForm1 tipindeki Form1 değişkeni ise Unit1’de tanımlanmaktadır. TForm1 adlı Class’tan yola çıkılarak form nesnesi hazırlama işlemi ise DPR dosyasında TApplication sınıfının CreateForm() metodu ile yapılmaktadır. İtalik yapılan bu paragraf nesneye yönelik programcılık konusunda temel kavramlara sahip olmayanlar tarafından anlaşılmaz bulunabilir.
Unit’ler PAS uzantısı ile ayrı dosyalara kayıt edildiği için Form1’i temsil eden Unit1’in “Unit1.pas” adlı dosyada tanımlı olduğu işaret ediliyor. Bu işaret etme işlemi “in” anahtar kelimesi ile yapılmaktadır.
Yukarıda kodlarını verdiğim proje “Form1” adında bir forma, dolayısıyla “Unit1” adında bir Unit’e sahipti. Bu projede 2. bir form olsaydı proje dosyasının içeriği aşağıdaki gibi olurdu.
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
Usesbloğunda formları temsil eden Unit’lerin proje dosyasına dahil edildiği satırlarda {Form1} ve {Form2} şeklinde açıklama metni kullanılarak unit’in hangi formu temsil ettiği işaret edilmektedir. Bu açıklama kelimeleri silinebilir.
Uses bloğunda gerek duyulan Unit’ler DPR uzantılı proje dosyasına dahil edildikten sonra {$R *.RES} direktifi ile RES uzantılı(varsa) Resource dosyaları projeye dahil edilmektedir.
Blok başlatan Begin deyiminden sonra Application.Initialize satırı ile proje başlatılmaktadır. Ardından Application.CreateForm(TForm1, Form1); satırındaki CreateForm metodu sayesinde “Form1” adında bir form veya nesne hazırlanmaktadır. Daha teknik bir anlatımla TForm1 sınıfının örneği hazırlanmaktadır. Burada TForm1 sınıfından yola çıkılarak hazırlanan nesneye “Form1” adı verilmektedir. Bir sonraki satırda ise Run metodu ile uygulama çalıştırılıyor.
Unit’lerin Yapısı
Delphi’de kod dosyaları Unit’ler şeklinde düzenlendiği için Unit konusu oldukça önemlidir. Başka bir deyişle Delphi’nin Unit’leri nasıl organize edip nasıl kullandığı anlaşılmadan bazı konular yüzeysel kalabilir.
Yeni bir proje hazırladığınızda Delphi penceresine formun görsel yapısının getirildiğini biliyorsunuz. Formdan kod yazılan “Unit1” penceresine geçmek için View menüsünden Toggle Form/Unit komutunu verebilirsiniz. Form aktif pencere iken bu komut verildiğinde Unit penceresine geçilmekte, Unit penceresinde iken bu komut verildiğinde ise forma geçilmektedir. Aşağıda verilen ekran görüntüsünü “Form1” aktif pencere iken View menüsünden bu komutu verdikten sonra aldım.

Projelere program deyimi ile nasıl ad veriliyorsa Unit’lere Unit deyimi ile ad verilmektedir. Daha sonra Unit’i başka bir ad ile kaydederseniz Unit’e verilen ad kendiliğinden değişir. Unit’lerde Unit adının belirtildiği ilk satırdan sonra Interface adlı bölgede Uses deyimi ile başlatılan blokta unit dahilinde kullanılmak istenen hazır Unit’ler işaret edilmektedir.
Formları temsil eden her Unit’e, başka bir deyişle TForm tipinde Class hazırlanan her Unit’e Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ve Dialogsadlı hazır unit’ler yani Delphi ile gelen Unit’ler dahil edilmektedir. Formları temsil etmeyen ve File menüsünden New-Unit komutu verilerek hazırlanan Unit’lere herhangi bir hazır unit dahil edilmiyor.
Typedeyimi ile başlatılan blokta ise Class anahtar kelimesi ile “TForm1” adında bir Class hazırlanmaktadır. Projelere dahil edilen formlar gerçekte birer sınıftır. Projedeki “TForm1” adlı sınıf class() deyimi ile Delphi’nin TForm sınıfından yararlanılarak(türetilerek) hazırlanmaktadır.
TForm1 = class(TForm)
Üzerinde çalışılan projeye File menüsündeki New-Form komutu ile 2. bir formun dahil edilmesi halinde UNIT2.PAS adında bir kod dosyası hazırlanıp projeye dahil edilir. Bu kod dosyasında ise “TForm2” adında bir Class hazırlanır. File menüsündeki New-Form komutu ile hazırlanan sınıf TForm sınıfının mirasçısı yapılmaktadır. Object Inspector penceresinde formların Name özelliği değiştirildiğinde belirtilen şekilde hazırlanan Class’ların adları kendiliğinden değişmektedir.
Typedeyimi ile başlatılan blokta Class dahilinde hazırlanacak Button ve Edit gibi nesnelerin ve Procedure’ların deklare edilmesi dışında varsa Public ve Private özellikli diğer üyeleri tanımlanabilmektedir. Type deyimi ile başlatılan bloğun sonu End deyimi ile işaret edilmektedir. Class hazırlamak gerçekte tip tanımlamak olduğu için Unit’in Interface bölgesinde 2. veya 3. bir Type bloğuna yer verip başka tipler veya Class’lar hazırlayabilirsiniz.
Interface bölgesindeki Var deyimi ile başlatılan blokta Unit’in her yerinde geçerli olacak yani yaşayacak değişkenler varsa tanımlanmaktadır. Henüz hazırlanan ve yalnızca “Unit1” adında bir Unit içeren projede daha önce Class deyimi ile TForm1 adında bir Class hazırlanmış yani tip tanımlanmıştı. Var bloğunda Class deyimi ile hazırlanan tipten(sınıftan) yararlanılarak değişken tanımlamaktadır.
Var
Form1: TForm1;
Vardeyimi ile başlatılan bloktan sonra Unit’in Implementation bölgesine, yani Unit’in asıl satırlarına geçilmektedir. Pascal programlama dilinin kurallarına göre Unit’ler End deyimi ile sona erdiği için Unit’in en son satırında, sonunda nokta(.) işareti olan “End” deyimi bulunmaktadır.
Yukarıda anlatılanlara göre Unit’lerde Interface ve Implementation adında 2 bölge bulunmaktadır. Implementation bölgesindeki “{$R *.dfm}” satırı ile ilgili formun görsel yapısı hakkında bilgiler içeren DFM dosyası okunmaktadır. Tasarım anında formun özelliklerinin değiştirilmesi veya forma herhangi bir nesnenin yerleştirilmesi halinde DFM dosyası otomatik olarak güncellenir.
Welcome Page’teki New Project düğmesi tıklanarak veya File menüsünden New komutu verildiği zaman açılan alt menüden VCL Forms Application komutu verilerek hazırlanan proje “Form1” adında bir forma sahip olmaktadır. Bu proje çalıştırıldığında “Form1” adındaki bu form TApplication sınıfının CreateForm() metodu ile oluşturulup ekrana getirilmektedir. Aşağıda verdiğim ekran görüntüsünü File menüsünden komut vererek hazırladığım projeyi çalıştırdıktan sonra aldım.

Proje çalıştırıldığında projedeki formu temsil eden bir pencerenin hazırlanıp masaüstüne getirilmesi sırasında formla ilgili olarak FormCreate olayı meydana gelmektedir. Formun Create edilmesi yani formu temsil eden bir pencerenin masaüstüne getirilmesi sırasında meydana gelen olayla aynı isme sahip bir Procedure Unit’te varsa işletilir.
Tasarım anında projedeki formun üzerinde çift tıklama yapmanız halinde hem Unit penceresi aktif pencere yapılır hem de Unit’te FormCreate() adında bir procedure hazırlanır. Formun Crate olayını temsilen hazırlanan metodun yani Procedure’ların adı 2 kısımdan meydana gelmektedir. Procedure veya metot adının ilk kısmında procedure’nin hangi sınıfa ait olduğu belirtilmektedir. Aşağıda ekran görüntüsünü verdiğim koddaki FormCreate() metodu TForm1 sınıfı ile ilgili olduğu için procedure veya metot adının önünde bu sınıfın adı var
Delphi gibi program geliştirme araçları ile hazırlanan projelerde çalışma anında herhangi bir olay gerçekleştiği zaman gerçekleşen olay ile aynı ada sahip bir yordamın(procedure) olup olmadığı araştırılır. Gerçekleşen olay ile aynı ada sahip bir procedure varsa işletilir. Bu paragraf konu nesneye yönelik programcılık olduğunda eksik olsa bile şimdilik doğru kabul etmekte bir sakınca yoktur.
Yukarıda verdiğim ekran görüntüsünü aldığım sırada üzerinde çalıştığım projenin Unit1 adındaki Unit’inde tanımlı olan TForm1 class’ında FormCreate() adında bir procedure olduğu için projenin başlatılması sırasında FormCreate(form oluşturma) olayı meydana geldiği için Unit1’deki FormCreate() yordamı işletilir.
Çalışma anında form tıklandığında formun üzerine bilgi yazmak istemiş olsaydım ilgili satırları OnClick olayını temsil eden metoda yazmam gerekirdi. OnClick veya başka bir olayı temsil eden yordamları hazırlamak istiyorsanız Object Inspector penceresindeki Events sekmesinden yararlanabilirsiniz.

Nesneye yönelik programcılıkta yordam ve fonksiyonların her ikisine birden metot denilmektedir. Delphi’de Procedure ve Function ayrımı olduğu için zaman zaman metot yerine procedure ve fonksiyon kavramlarını kullanmayı tercih ettim.
Events sekmesinde o sırada seçili durumda olan nesnenin veya bu nesneye kaynaklık eden sınıfın mevcut olayları listelenmektedir. Hangi olay için metot hazırlamak istiyorsanız Events sekmesinde o olayın adı üzerinde çift tıklama yapmalısınız. Aşağıda verilen ekran görüntüsünü OnClick olayının adı üzerinde çift tıklama yaptıktan sonra aldım.

Form1'in Click olayını temsil eden metoda yazılan satırlar çalışma anında form tıklandığında işletilir. Bu metot “TForm1” sınıfının içinde yer aldığı, başka bir deyişle “TForm1” sınıfına ait olduğu için procedure yani metot adının başına “TForm1” yazılmaktadır

Bu şekilde Events sekmesindeki ilgili olayın adı üzerinde çift tıklama yapıp procedure kalıbı hazırlarsanız hazırlanan procedure’nin adı olayın karşısına yazılır. Bu sırada olayın karşısına yazılan procedure veya metot adını silerseniz olay ile procedure arasındaki bağlantı kopar.
Unit’lere Yakından Bakalım
Yukarıda Unit’lerle ilgili olarak anlatılanlara bakılırsa Unit’lerde Interface ve Implementationbölgeleri mutlaka bulunmaktadır. Zaten File menüsünden yararlanılıp projeye yeni bir Unit dahil edildiğinde Delphi tarafından hazırlanan Unit kalıbında bu 2 bölge işaret edilmektedir. Aşağıda verilen ekran görüntüsünü Form1 adında bir forma, dolayısıyla Unit1 adında bir Unit’e sahip proje üzerinde çalışırken File menüsünden komut verip projeye 2. bir Unit dahil ettikten sonra aldım. Tam bu noktada şu ek açıklamayı yapmak isterim: Bu projedeki unit1'de Delphi'nin TForm sınıfının mirasçısı bir Class hazırlanırken Unit2'de hazırlanan bir Class yoktur. Başka bir deyişle Unit1 aynı zamanda Form1'in hazırlandığı kod dosyasıdır.
B
urada asıl anlatmak istediğim Unit’lerde interface ve implementation bölgelerinden başka isteğe bağlı olarak initialization ve finallization bölgelerinin olabileceğini göstermektedir. Unit’lerde finallization bölgesinin tek başına olmasına izin verilmiyor. finallization bölgesi ancak initialization bölgesi varsa olabilmektedir.

initializationbölgesindeki kodlar Unit herhangi bir amaçla başka bir Unit’e dahil edildiğinde otomatik olarak işletilmektedir. Bu konuda bilgi vermek için Unit2’de Uses bloğuna yer verip ShowMessage metodunun tanımlı olduğu Dialogs adlı Unit’i Unit2’ye dahil ettim.
unit Unit2;
interface
Uses
Dialogs;
implementation
initialization
finalization
end.
Unit2’ye Delphi ile gelen bu hazır Unit dahil edildikten sonra ShowMessage gibi metotlar kullanılabilir. Burada amacım initialization bölgesine yazılan kodların Unit’ler başka Unit’lere dahil edildiklerinde otomatik olarak işletildiğini anlatmak olduğu için bu Unit’in initialization bölgesine aşağıdaki gibi bir satır yazdım.

Diğer yandan File menüsünden yararlanılarak üzerinde çalışan projeye yeni bir Unit dahil edildiğinde DPR uzantılı proje dosyasına Delphi müdahale etmektedir. Aşağıda verilen ekran görüntüsünü projeye “Unit2” adında bir Unit dahil ettikten sonra aldım. Projeye dahil ettiğim 2. Unit bir formu temsil etmediği için PAS uzantılı kod dosyası adından sonra ilgili formun adı açıklama metni şeklinde satıra eklenmedi.
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Delphi projeleri çalışmaya DPR uzantılı proje dosyalarından başlamaktadır ve bu dosyada initialization bölgesine sahip olan “Unit2” yüklenmektedir. Bu nedenle proje çalıştırıldığında ilk olarak Unit2’nin initialization bölgesine yazdığım satır işletilir. Aşağıda verdiğim ekran görüntüsünü bu projeyi çalıştırdıktan sonra aldım.
Bu sırada OK düğmesi tıklanıp bu diyalog kutusu kapatılırsa, sıra TApplication sınıfının CreateForm() metodunun kullanıldığı satıra gelir ve projenin ilk formu ekrana getirilir. Unit’lerde ayrıca finalization bölgesine yer verebilirsiniz. Finalization bölgesine yazılan satırlar projenin çalışması sona erdiğinde işletilir.
Yukarıda içeriği verilen DPR dosyasında 2 Unit projeye dahil edilmektedir. Unit’lerin finalization bölgesinin işletilme sırası eklenme sırasının tersidir. Yukarıda önce Unit1, ardından Unit2 dahil edildiği için programın çalışması sona erdirildiğinde önce Unit2’nin ardından Unit1’in(varsa) finalization bölgesindeki satırlar işletilir.
Şimdiye kadar Unit’lerle ilgili olarak anlatılanları özetlemek gerekirse şunlar söylenebilir. Unit’lerde interface ve implementation bölgelerinin olması zorunlu, initialization ve finalization bölgelerinin olması ise isteğe bağlıdır. Unit’lerin Interface bölgelerinde Uses, Const, Type ve Var blokları olabilmektedir. Aşağıda verdiğim örnek Unit’te Var bloğuna yer verdim ve Integer tipinde bir değişken tanımladım.
Her ne kadar sayi’yi değişken adı olarak kullanma hakkı 2003 yılından bu yana programcılık kitapları yazan yerli bir yazara ait(!) olsa bile yılların alışkanlığına bağlı olarak suç işlemeyi(!) göze alıp sayi adında değişken tanımladım.
unit Unit2;
interface
Var
Sayi : Integer;
implementation
end.
Bu şekilde Unit’in interface bölgesinde Var bloğunda tanımlanan değişken projedeki diğer Unit’lerde kullanılabilir. Unit2’de tanımlanan değişkeni Unit1’de kullanabilmek için Unit2’nin Unit1’e Uses bloğunda dahil edilmesi gerekir. Unit2’yi Unit1’e dahil etme işlemini Unit1’in Interface veya implementation bölgesinde yapabilirsiniz.
Burada ne yaptığımı izninizle tekrarlayacağım. Üzerinde çalıştığım proje Unit1 ve Unit2 adında 2 unit’e sahiptir. Unit1 dahilinde TForm1 adında bir Class hazırlanmakta ve TForm1 Class’ından yola çıkılarak hazırlanan Form1 adlı form nesnesi projenin başlangıç formudur. Unit2’nin interface bölgesinde Var bloğunda tanımladığım değişkeni Unit1’de kullandım.
Doğal olarak Unit2’de tanımlanan değişkeni Unit1’de kullanabilmek için Unit2’yi Unit1’e dahil ettim. “Sayi” adını verdiğim değişkeni Unit2’nin interface bölgesindeki Var bloğu yerine implementation bölgesindeki Var bloğunda aşağıdaki gibi tanımlamış olsaydım ne olurdu?
Bu şartlarda tanımlanan “Sayi” değişkeni Unit1’de kullanılamaz. Unit2’in implementation bölgesindeki Var bloğunda tanımlanan değişken Unit2’in her yerinde yaşar ama başka Unit’lerde kullanılamaz. Bu nedenle özel bir amacınız yoksa veya amacınız global değişken tanımlamak değilse unit’lerin interface bölgelerinde değişken tanımlamayın derim.
Projelerde Birden Fazla Form Kullanmak
Üzerinde çalıştığınız projeye 2. bir form dahil etmek istiyorsanız File menüsünden New komutu verildiği zaman açılan alt menüden Form komutunu vermelisiniz. Aşağıda verilen ekran görüntüsünü projeye 2. bir form dahil ettikten sonra aldım.
Projeye form dahil etmenin proje dosyasına olan etkisini görmek üzere Project menüsünden View Source komutunu verebilirsiniz. Projeye 2. bir form eklendiğinde DPR uzantılı dosyaya formu temsil eden Unit’in Uses bloğunda koda dahil edilmesini sağlayan bir satır eklemektedir.
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
Ayrıca File menüsünden komut verip projeye 2. form dahil edildiğinde DPR uzantılı proje dosyasında değişiklik yapılıp TApplication sınıfının CreateForm() metodunun kullanıldığı 2. bir satır konulmaktadır.
Şimdi “Form1” ve “Form2” adında 2 form içeren bu projenin 2. formunu ekrana getireceğim. Bu amaçla ilk forma “Goster” adında bir düğme yerleştirdim. Çalışma anında bu düğme tıklandığı zaman ekrana “Form2” getirilecek. Form2’yi “Unit1.pas” aracılığı ile çağırıp kullanabilmek için Uses bloğunda Form2’yi temsil eden Unit2’yi Unit1’e dahil etmek gerekmektedir. Bu işlemi yapan satırı aşağıda görebilirsiniz.
Usesdeyimi ile “Unit2”, Unit1’e dahil edildikten sonra Unit1’de bulunan herhangi bir yordamın içinden Show metodu ile Form2 görüntülenebilir. Unit2’yi Unit1’e dahil eden satırı burada yapıldığı gibi Unit1’in Implementation kısmı yerine Unit’in üst kısmındaki mevcut Uses bloğuna yazabilirsiniz.
Bu satır ile Form2 nesnesinin hazırlandığı Unit2 adlı Unit’i Unit1’e dahil ettikten sonra Form1’e yerleştirdiğim düğmenin üzerinde çift tıklama yaparak bu düğmenin Click olayını temsil eden metodun hazırlanmasını sağladım. Mevcut formları görüntülemek için Show metodu kullanıldığı için bu düğmenin Click olayıyla ilgili metodunda Show metodunu kullandım.
Çalışma anında ekranda Form1 varken “Göster” düğmesi tıklanırsa Form2 ekrana getirilir. Burada gelişen olaylar şunlardır: Delphi varsayım olarak projeye dahil edilen bütün formları DPR dosyasında TApplication sınıfının CreateForm() metodu ile hazırlamaktadır. Yani varsayılan ayarlara göre programcının ayrıca söz konusu formu temsil eden Class’tan yola çıkıp nesne hazırlamasına gerek yoktur.
İlk form hariç diğer formlar gizlenmektedir. Show metodu daha önce hazırlanmış olmasına rağmen gizlenmiş olan Form2’nin görüntülenmesini sağlamaktadır. Aşağıda verilen ekran görüntüsünü projeyi çalıştırıp ilk formdaki düğmeyi tıkladıktan sonra aldım.

Şimdi bu projede değişiklik yapıp 2. forma bir düğme yerleştireceğim ve ilk formun üzerindeki “Göster” başlıklı düğme tıklandığında Form1 gizlenip “Form2” ekrana getirilecek. Form2’deki düğme tıklandığında ise Form2 gizlenip “Form1” tekrar ekrana getirilecek.
Yukarıda Form1’de çalışırken Form2 üzerinde işlem yapabilmek için Form2’nin tanımlı olduğu Unit2’yi Unit1’e dahil ettim. Form2’de iken Form1’i kullanabilmek için Form1’in tanımlı olduğu Unit1 için de aynı işlemi yapmak gerekir. Unit1’i Unit2’ye nasıl dahil ettiğimi aşağıda görebilirsiniz.
Form1’in üzerine yerleştirdiğim düğmenin Click yordamında Show metoduna yer verdiğim için çalışma anında ilk formdaki düğme tıklanınca Form2 görüntülenir. Form2 ekrana getirildiği zaman Form1’in gizlenmesini sağlamak için Form2’nin OnActivate olayını temsil eden metodu aşağıdaki gibi düzenledim.
procedure TForm2.FormActivate(Sender: TObject);
begin
Form1.Hide;
end;
Showmetodu ile Form2 ekrana getirildiği zaman Form2 ile ilgili olarak Activate olayı meydana gelir. Daha önce Form2 için FormActivate adında bir metot hazırladıysanız bu metot Form2 ekrana getirildiğinde otomatik olarak işletilir. Form2 ile ilgili Activate olayı için kod yazmak için Object Inspector penceresinde Form2’nin özellikleri listelenirken OnActivate olayının üzerinde çift tıklama yapmak gerekmektedir.
Yukarıda anlatılan şekilde Form2’nin Activate olayını temsil eden metoda kod yazarak Form1 nesnesini gizledik sonra Form2’deki düğme tıklandığı zaman Form1’i görüntülemek üzere ayarlama yapacağım. Bu amaçla Form2’deki düğmenin OnClick olayını temsil eden metodu aşağıdaki gibi düzenledim.
procedure TForm2.GosterClick(Sender: TObject);
begin
Form1.Show;
end;
Geriye bir tek “Form1” ekrana getirildiği zaman Form2’nin gizlenmesi kaldı. Bu amaçla Form1’in Activate olayını temsil eden metotta Hide metodu ile Form2’yi gizledim. Form2’deki düğme tıklanıp Form1 görüntülendiğinde Form1’le ilgili olarak FormActivate olayının meydana geleceğini biliyorsunuz.
procedure TForm1.FormActivate(Sender: TObject);
begin
Form2.Hide;
end;
Başlangıç Formunu Seçmek
Delphi'de projelerin çalışma şekline etki eden bazı ayarlamaları kod yazmadan yapabilirsiniz. Bu amaçla kullanılan Options komutu Project menüsünde bulunmaktadır. Project menüsünden Options komutunu verirseniz ekrana aşağıda verilen Project Options diyalog kutusu gelir.
Project Options diyalog kutusunda Form adı altında bir getirilmiş seçeneklerden Main form ile başlangıç formu seçilmektedir. Yukarıda verilen ekran görüntüsünü aldığım sırada üzerinde çalıştığım projede “Form1” ve “Form2” adında 2 form vardı.
Projede birden fazla form varsa proje başlatıldığında ilk olarak hangi formun ekrana geleceği konusunda seçim yapılabilir. Projeler varsayım olarak projeye ilk dahil edilen formdan başlarlar. Yukarıda verilen ekran görüntüsünden tespit edileceği gibi Main form seçeneğinin karşısında “Form1” var. Projeyi başka bir form ile başlatmak istiyorsanız Main form liste kutusunu açıp başlangıç formu olmasını istediğiniz formu seçmeniz gerekir.
Project Options diyalog kutusunda Forms sekmesinde Main Form kutusu dışında Auto-create forms başlıklı bir liste kutusu bulunmaktadır. Bu liste kutusunda listelenen formlar CreateForm() metodu ile otomatik olarak hazırlanan formlardır.
Yukarıda işaret edildiği gibi File menüsünden New Form komutu ile projeye yeni bir formun dahil edilmesi halinde proje dosyasına müdahale edilmektedir. Benzer şekilde projenin başlangıç formu değiştirilirse proje dosyasına müdahale edilir. Aşağıdaki ekran görüntüsünü Form2’yi başlangıç formu olarak seçtikten sonra aldım.

Tasarım anında çok sayıda form hazırlayıp projenize dahil ettiyseniz ve proje çalıştırıldığında bütün formların DPR dosyasında kullanılan CreateForm() metodu ile bir kopyasının(yani form nesnesi) hazırlanmasını istemiyorsanız bu formları Auto-create forms liste kutusundan Avaiable forms liste kutusuna taşımanız gerekir.
Project Optionsdiyalog kutusunda “Auto-create forms” liste kutusunda “Available forms” liste kutusuna taşınan formlarla ilgili satırlar DPR dosyasından silinir. “Available forms” liste kutusuna aktarılan formlardan birisine ne zaman gerek duyulursa TApplication sınıfının CreateForm() metodu ile hazırlanabilir. Bu konuda bilgi vermek için Project Options diyalog kutusunu ekrana getirip Form2’yi “Available forms” kutusuna aldım.

Project Options diyalog kutusunda bu ayarlamayı yapıp OK düğmesini tıklayınca Delphi DPR uzantılı proje dosyasında değişiklik yaptı ve Form2’yi oluşturan satır silindi. Aşağıda verilen ekran görüntüsünü Form2’yi “Auto-create forms” liste kutusundan “Available forms” kutusuna aktardıktan sonra aldım.

Bu şartlarda proje çalıştırılırsa “Form1” kendiğinden Create edilip yani TForm1 sınıfından yola çıkılıp Form1 adında bir nesne hazırlanıp ekrana getirilir. Form2 ekrana getirilmek istendiğinde ise önce TApplication sınıfının CreateForm() metodu ile TForm2 sınıfından yola çıkılıp nesne Form2 nesnesinin oluşturulması gerekir. Bu işlemin nasıl yapıldığını anlatmak için Uses deyimi ile Unit2’yi Unit1’e dahil ettikten sonra aşağıda verdiğim kodu hazırladım.
procedure TForm1.FormClick(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;
Bu kod sayesinde çalışma anında Form1’in üzeri tıklandığında Form2 nesnesi oluşturulup Show metodu ile ekrana getirilir. Ancak “Form1” ikinci kez tıklanıp bu kod tekrar işletildiğinde “TForm2” sınıfından yararlanıp Form2 nesnesi 2. kez hazırlanır. Bunun önüne geçmek için bu kodu aşağıdaki gibi düzenledim.
procedure TForm1.FormClick(Sender: TObject);
begin
if not Assigned(Form2) then
Begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
End;
end;
Yukarıda Unit2’de tanımlı olan “TForm2” adlı Class’tan yola çıkıp Form2’yi oluştururken TApplication sınıfının CreateForm() metodunu kullandım. Form2’yi oluştururken TForm sınıfının Create() metodunu kullanabilirsiniz. TForm sınıfının Create() metodunun nasıl kullanıldığını aşağıda görebilirsiniz.
procedure TForm1.FormClick(Sender: TObject);
begin
If not Assigned(Form2) Then
Begin
Form2 := TForm2.Create(Self);
Form2.Show;
End;
end;
Projenin ilk formu hariç File menüsünden New-Form komutu verilerek projelere dahil edilen 2. veya 3. formların Project Options diyalog kutusundaki Available forms kutusunda listelenmesini istiyorsanız Tools menüsündeki Options komutu ile ekrana getirilen diyalog kutusunda Auto-create forms & data modules seçeneğini pasif duruma getirmelisiniz.

Şimdi bu projedeki ilk formu kullanıcıdan şifre istenen başlangıç formu olarak kullanacağım. Bu amaçla ilk formu aşağıdaki gibi düzenledim.
Kullanıcı şifre girip “Tamam” düğmesini tıkladığında girilen şifre kontrol edilecek. Şifre geçerli değilse projenin çalışması sona erdirilecek. Projenin çalışmasını TApplication sınıfının Terminate metodu ile sona erdirdim.
procedure TForm1.TamamClick(Sender: TObject);
begin
if Edit1.Text = '12345' then
Begin
Form1.Hide;
Form2.Show;
end
else
Application.Terminate;
end;
Bir sonraki dersimizde Delphi'yi anlatmaya kaldığımız yerden devam edeceğiz.