Yazılımcının Günlüğü | YazilimGunlugu.Com
Arama
Makale Kategorileri
Üye Girişi
Şuanki online üyeler()
Aktif üye bulunmamaktadır.


Delphi'nin TApplication Sınıfı

Yazar: Memik YANIK

Kategori: Delphi

Eklenme Tarihi: 22.06.2007 15:46:42

Daha önce Delphi ile az çok program yazmış olanların bileceği gibi Delphi TApplication adında bir sınıfa sahiptir ve Delphi her uygulama için bu sınıfın örneğini otomatik olarak hazırlamaktadır. Global özelliğe sahip olan ve Application adı verilen bu nesnenin çok sayıda metodu, özelliği ve olayı bu
Daha önce Delphi ile az çok program yazmış olanların bileceği gibi Delphi TApplication adında bir sınıfa sahiptir ve Delphi her uygulama için bu sınıfın örneğini otomatik olarak hazırlamaktadır. Global özelliğe sahip olan ve Application adı verilen bu nesnenin çok sayıda metodu, özelliği ve olayı bulunmaktadır. Otomatik olarak hazırlanan Application nesnesi görsel bir nesne olmadığı için özellikleri ve olayları Object Inspector penceresinde yer almaz. Ancak bu nesnenin bazı özelliklerini Project Options diyalog kutusunda ayarlamak mümkündür. Aşağıda verdiğim ekran görüntüsünü Delphi 7'den aldım.

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.

Burada yazdıklarım bilinmeyen şeyler değil. Birçok kaynakta TApplication sınıfının Terminate, Minimize, Maximize, Run gibi metotlarından söz edilmektedir. Bir çok kaynakta şöyle denilmektedir: "Projenin çalışmasını sona erdirmek için Application.Terminate; yazmak yeterlidir." 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. Burada yazarımızın verdiği kısa kod hemen anlaşılıyor ve gerisi programcı olmak amacıyla yazarın kitabını okuyan okura bırakılmaktadır.

Şu günlerde yazmaya çalıştığım Turbo Delphi 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.

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 yordamı 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ıtlatıp kitabımda bu olaydan söz edebilmektedir. Eğer bu cümleleri buraya yazmamış olsaydım 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 veya 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 hiç görmedim.

Kısaca açıklamak gerekirse; çalıştırdığınız Delphi uygulaması herhangi bir işlem yapmazken TApplication sınıfının 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 yordamın 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 yordam hazırladıktan sonra Application nesnesini bundan haberdar etmek için FormCreate yordamına aşağıdaki gibi 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 Turbo Delphi kitabımda "Idle" olayını "yaratmaya" kalkışmasam bile nasıl kullanıldığından söz edebilirim.

Yazar Hakkında Yorum Yok Yorum Yaz Yazara ait diğer Makaleler
Tema
Anket
Visual Studio 2010 Beta 2'yi denediniz mi?


En Çok Okunan Makaleler
En Son Eklenen Makaleler
Soru Merkezinde Bekleyenler
Ana Sayfa | Hakkımızda | Editörler | Yazarlar | RSS RSS | İletişim
Yazılım Günlüğü 2007-2009 © Tüm Hakları Saklıdır.