Delphi'de Unit'ler

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Delphi'de Unit'ler

Mesaj gönderen memiky »

Belki de sitede Unit'ler her yönü alı alınmıştır. DelphiTurkiye'nin izleyicilerinin affına sığınıp önce küçük bir açıklama yapıp sonra sorumu sorucağım. Umarım sorum fuzuli değildir.

Delphi’de DPR uzantılı proje dosyası hariç kod dosyaları Unit’ler şeklinde düzenlenmektedir. Bu nedenle Delphi’de üzerinde çalışılan projeye bir Unit dahil edilir veya File menüsünden komut verilerek yeni Unit hazırlandığında Delphi aşağıdaki gibi bir Unit kalıbı hazırlamaktadır.

unit Unit2;
interface

implementation

end.


Bu kalıpta interface ve implementation bölgeleri bulunmaktadır. Unit’lerde bu 2 bölgeden başka isteğe bağlı olarak initialization ve finalization bölgeleri olabilmektedir. Unit’te tek başına initilization bölgesine yer verilebilir ama derleyici initialization bölgesi olmayan Unit’lerin finalization bölgesine sahip olmasına izin vermiyor.

unit Unit2;
interface

implementation

initialization

finalization
end.


Initialization bölgesine yazılan satırlar söz konusu unit herhangi bir Unit’in veya DPR dosyasının Uses bloğunda uygulamaya dahil edildiğinde işletilmektedir. Finalization bölgesine yazılan satırlar ise projenin çalışması sona erdirildiğinde otomatik olarak işletilmektedir. Delphi programcıları tarafından bilinen bu konu üzerinde neden durdum diye sorabilirsiniz. Bu soruya başka bir soru ile cevap vereceğim: Uygulamaya dahil edilip işlevi biten Unit'lerden birisi istenilen zamanda uygulamadan uzaklaştırılıp finalization bölgesine yazılan satırlar işletilebilir mi?

unit Unit2;
interface
Uses
Dialogs;

implementation

initialization
ShowMessage('Uygulamaya Unit2 dahil edildi');
finalization
end.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Bildiğim kadarıyla finalization tanımlandığında bu bir procedure gibi AddExitProc ile çıkış procedure listesine dahil ediliyor. Delphi de uygulama kapatıldığında DoExitProc ile bu listedeki procedure'leri çalıştırıyor.

SysUtils'deki bu procedure'lerin kodlarını incelemenizi tavsiye ederim. Ancak buna neden ihtiyaç duyduğunuzu epey merak ettim doğrusu.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Merhaba,

Tabi, finalization bölgesindeki kodları işlemek için o unit'in UNLOAD eidlmesi gerekmektedir. Bunun için bir BPL projesi hazırlayıp, LoadPackage ile paketi yükleyin (unit), sonra UnloadPackage ile paketi kaldırdığınızda (runtime'da) finalization bölgesi çalışacaktır.

Ancak tek EXE'li uygulamalarda, finalization isteğe göre farklı amaçlar için kullanılabilir. Mesela initialization bölümüde bir tabloyu açar, finalization bölümünde tabloyu kapatabilirsiniz. Tabi, program CLOSE (destroy) olduğunda zaten tablo kapatılacktır.

Finalization bölümünü ben BPL projeler için kullandım, başka türlü kullanma ihtiyacı görmedim.

Saygılar..
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Murat DİCLE yazdı: Tabi, finalization bölgesindeki kodları işlemek için o unit'in UNLOAD eidlmesi gerekmektedir.
Yani uygulamanın kapatılmasına gerek kalmadan çalışır demek mi bu?Ben de @fduman'ın anlattığı gibi biliyordum olayı, meraklandım şimdi..
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

aLonE CoDeR yazdı:
Murat DİCLE yazdı: Tabi, finalization bölgesindeki kodları işlemek için o unit'in UNLOAD eidlmesi gerekmektedir.
Yani uygulamanın kapatılmasına gerek kalmadan çalışır demek mi bu?Ben de @fduman'ın anlattığı gibi biliyordum olayı, meraklandım şimdi..
@Murat DİCLE Delphi dinamik kütüphanelerinin de bellekten atılırken finalization yaptığını söylüyor sanırım. Yani bir dinamik kütüphane ile unit'i bellekten atmış gibi olacağız.
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Fahrettin hoca merhaba; devamında özür.. Benim mahkeme konularından dolayı size hemen cevap veremedim. Unit'ler ilgili araştırmamın veya unit'leri bellekten çıkarmayı düşünüyor olmam herhangi bir programda ihtiyaç duymam nedeniyle değldir.

Unit'ler hakkında birşeyler yazarken veya Unit'ler uygulamaya şöyle dahil edilir derken akla gelen "peki istenirse Unit'ler bellek nasıl çıkarılır?" sorusuna cevap aramaktı. İlgilendiğiniz için teşekkür, iyi çalışmalar..
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Tek EXE olan uygulamalar için FINALIZATION bölgesi ancak program sonlandığında çalışacaktır. Bir çok componentte bu vardır.

Ama RUNTIME'da bunu yapabilmek için ilgili unit'in bir BPL olması gerekir diye düşünüyorum. Aksi bir durumun nasıl olacağını bende bilmiyorum. Yani XLABEL.PAS unitini bellekten at diyebilmek zor gibi geliyor. Ancak XLABEL.BPL olarak yüklenmiş bir uniti bellekten atmak kolay olacaktır.

Şu örneğimi bir incelemenizi isterim, D2005 için yazılmış ve içindeki EXE de D2005 kütüphanesine ihtiyaç duyar. D2005 yüklü bir PC de deneyebilirsiniz ya da D7 için baştan derlemeniz gerekecektir.

http://www.musonya.com/delphisamples/mesajtest.zip

Bu örnek hem BPL hem de Windows Mesaj sistemine örnektir. Ayrıca örnek içinde EXCEPTION üretme ile ilgili kodda vardır.

Programı çalıştırıdığınızda hiç bir iş yapmaz. Aşağıdaki çentikleri tıklarsanız paketler yüklenir, çentikleri kaldırınca paketler hafızadan kaldırılır.

paket_Uretec.bpl paketi, rastgele sayılar üretir ve bu ürettiği sayıları tüm uygulamaya mesaj olarak geçer. Tabi öncesinde sayının çift ya da tek mi olduğuna burada karar verilir.

paket_Cift.bplve paket_Tek.bpl paketleri ise gelen mesaj tipine göre çalışır gelen mesaj M_TEK ya da M_CIFT olabilir.

paket_Mesajlar.bpl paketi ise, çıktı mesajlarını yazmak içindir.

Ana form main.exe ise sadece paketleri yükle ve kaldır ilevini görür, tek başına başka hiçbir görevi yoktur.

Bu örnek bir başka anlatımla bir uygulama içine başka bir uygulamayı enjekte etmeye benzer diyebiliriz.

Yüklenen paketlerin ana forma eklenişini initilization kısmından görebilirsiniz. Paket kaldırılınca ne olduğunu ise finalization kısmından görebilrisiniz.

Çok büyük uygulamalar için BPL teknolojisi kaçınılmazdır. Neden? çünkü gereksiz yere hafızada fazladan veri tutmamış olursunuz.

Saygılar.
Cevapla