
Delphi 8 ve sonrasında bu diyalog kutusunun adı ve işlevi aynı kalmakla birlikte şeklinde değişiklik yapıldı. Aşağıda Delphi 2006'dan alınma Project Options diyalog kutusu var. Her iki diyalog kutusunda da Application sekmesinde aynı seçenekler bulunmaktadır.

Burada yazdıklarım bilinmeyen şeyler değildir. Birçok kaynakta TApplication sınıfının Terminate, Minimize, Maximize, Run gibi metotlarından söz edilmektedir. Örneğin Terminate metoduyla ilgili olarak bir çok kaynakta şöyle denilmektedir:"Projenin çalışmasını sona erdirmek için Application.Terminate; yazmak yeterlidir." Bu söylenenler yanlış olmamakla birlikte TApplication sınıfı hakkında yüzeysel bilgi verildiği için bu sınıfın olaylarını kullanmak gerektiği zaman yazılanları anlamak zorlaştığı için ezberleme yoluna gidiliyor.
Konu TApplication sınıfının olaylarını kullanmak olduğunda ek bilgilere gerek duyulmaktadır. Şimdi gelelim bunları neden yazdığıma; Delphi 7 üzerine yazılmış bir kitapta; üzerinde çalışılan formun ActiveControl özelliğinin içeriğinin işlevini anlatmak için forma bir Timer nesnesi yerleştirip TTimer sınıfının tek olayına şöyle bir satır yazılarak kullanıcının aktif kontrol hakkında bilgilendirileceği önerilmektedir.
If Form1.ActiveControl = Edit1 Then
Form1.Caption := 'Aktif kontrol Edit1';
Programcılık kitabı yazarları okurlarına bir metot, özellik veya olay hakkında bilgi verirken çoğunlukla pratik değeri olan örnek vermek yerine hemen anlaşılan örnekleri seçerler. Yazarımızın Delphi kitabında kullandığı bu kısa kodun işlevi hemen anlaşılıyor ve gerisi kitabı okuyan okura bırakılmaktadır.
Şu günlerde yazmaya çalıştığım Delphi 2007 kitabımda formun ActiveControl özelliğinin nasıl kullanıldığını anlatırken cesaret örneği gösterip ben de forma bir Timer nesnesi yerleştirdim. Çünkü sözünü ettiğim Delphi kitabının yazarı çıkıp bu konuyu benim gibi anlatmışsın dolayısıyla çalıntı yaptın; buyur mahkemeye diyebilir.
procedure TForm1.Timer1Timer(Sender: TObject); Var
Kontrol : TControl;
Kontrol_adi : String;
Bilesen : TComponent;
begin
Kontrol := Self.ActiveControl;
Kontrol_adi := Kontrol.Name;
Bilesen := TComponent(Self.ActiveControl);
Self.Caption := Kontrol_adi + '(' + Bilesen.ClassName +')';
end;
Böyle kod yazarak mahkemeye verilme olasılığını biraz azalttıktan sonra bu kod ile benzer işleve sahip başka kod yazılıp yazılamayacağını düşünüyorken aklıma TApplication sınıfı geldi. Her ne kadar kitabımda aktif kontrolü Screen nesnesinin ActiveControl özelliğinden yararlanarak öğrenmek mümkündür deyip aşağıda verdiğim kodu yazsam da tehlike henüz tamamıyla geçmiş değil.
procedure TForm1.Timer1Timer(Sender: TObject);
Var
Kontrol : TControl;
Kontrol_adi : String;
begin
Kontrol := Screen.ActiveControl;
Kontrol_adi := Kontrol.Name;
Self.Caption := Kontrol_adi;
end;
Üstüne üstlük bir de TApplication sınıfının "idle" olayından söz edersem... Aslında yazarımız idle nedir nereden geliyor vs açıklamalar yapmadan şuna benzer bir cümle kurmuş "bu sorunu idle olayı yaratıp çözeceğim". Olay veya Event'ın ne olduğunu bilenlerin affına sığınıp biraz açıklama yapalım. Çünkü olaylar yaratılmaz. Söz konusu sınıfın ilgilenilen olayları için metot yazılıp olaylar yakalanır.
Nesneye yönelik programcılıkta Class'ların olayları, metotları, özellikleri vs olur. Yani TApplication sınıfının zaten Idle olayı vardır; programcıların bu olayı yaratmaları gerekmiyor. Delphi'nin bir çok sınıfının kodları programcılara açık olduğu için belki meraklı birisi TApplication sınıfı üzerinde oynar. Programcının(burada yazarın) yapması gereken, söz konusu olay meydana geldiği zaman işletilecek metodu hazırlamaktır.
Bazılarınız şöyle diyebilirler: Her kitapta böyle cümleler olabilir, 1000 sayfalık kitapta böyle 3-5 cümleyi normal karşılamak gerekir. Böyle diyenler haklıdırlar. Ancak yazarımız kitabının başka bir yerine yine idle olayını yaratmaktan söz ediyor. Benim bunları yazmamdaki amacım idle olayı hakkında bilgi sahibi olduğumu kanıtlayıp kitabımda bu olaydan söz edebilme hakkı elde etmektir. Eğer bu cümleleri buraya yazmamış olsaydım yarın bir gün mahkemeye verildiğimde bilirkişi 2 kitabı önüne alıp inceleyip şöyle diyebilir: Memik Yanık kitabında tıpkı .... 'nın kitabında olduğu gibi idle olayından söz etmektedir. Bu nedenle alıntı ve esinleme iddiasını güçlendirmektedir.
Yazarımız her ne kadar idle olayını "yaratırken" yazdığı kod çalışıyor olsa bile ve kodda ister istemez Application nesnesinin adını yazmış olsa da idle olayının kaynağından yani TApplication sınıfından hiç söz etmemektedir. Kitabı baştan sonra taradım ama TApplication sınıfından söz edildiğini görmedim.
Kısaca açıklamak gerekirse; çalıştırdığınız Delphi uygulaması herhangi bir işlem yapmazken TApplication sınıfıyla ilgili olarak Idle olayı meydana gelmektedir. Bu olay için kod yazıp otomatik olarak hazırlanan Application nesnesini bundan haberdar ederseniz yukarıda verdiğim ve aktif kontrolü öğrenmeye yarayan kod için Timer nesnesinden yararlanmak zorunda kalmazsınız. TApplication sınıfının idle olayı meydana geldiği zaman işletilmek üzere aşağıdaki gibi kod yazdım.
procedure TForm1.bekleme_ani(Sender: TObject; Var Done : Boolean);
Var
Kontrol : TControl;
Kontrol_adi : String;
Bilesen : TComponent;
begin
Kontrol := Self.ActiveControl;
Kontrol_adi := Kontrol.Name;
Bilesen := TComponent(Self.ActiveControl);
Self.Caption := Kontrol_adi + '(' + Bilesen.ClassName +')';
end;
Application nesnesinin Idle olayına adı aktarılacak metodun 2 parametreye sahip olması gerekiyor. İlk parametre TObject tipinde iken 2. parametre Boolean tipindedir. 2. parametreye ad verirken ne olur olmaz diye Borland'ın tercihine bağlı kaldım ve "Done" adını verdim. Bu şekilde metot hazırladıktan sonra Application nesnesini bundan haberdar etmek için FormCreate yordamına aşağıdaki gibi bir satır yazdım.
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle := bekleme_ani;
end;
Bu andan itibaren çalışma anında hangi kontrolün üzerine gidilirse o kontrolün ve kontrolün türetildiği sınıfın adı formun başlığına yazılır. Sanırım idle olayı ve TApplication sınıfı hakkında azda olsa bilgi sahibi olduğumu kanıtladım. Bu düşünce ile; yazmakta olduğu Delphi 2007 kitabımda "Idle" olayını "yaratmaya" kalkışmasam bile nasıl kullanıldığından söz edebilirim.
*Bu metni 2006 ylının son çeyreğinde Delphi 2007 kitabımı kaleme aldığım günlerde yazmıştım. Sonradan bu yazdıda küçük değişiklikler yaptım.