Form Kapatma Anında Free

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
osmantaskiran
Üye
Mesajlar: 34
Kayıt: 17 Nis 2004 09:27
İletişim:

Form Kapatma Anında Free

Mesaj gönderen osmantaskiran »

Arkadaşlar
FormAdi := TFormAdi.Create(AnaForm)
FormAdi.show

şeklinde create ettiğim formum üzerinde 50 ye yakın dbtextedit nesnesi ve 3-4 grid var.
Bu formumum close olayında;
FormAdi.Free;

komutunu uyguluyorum, formu kapattığım sırada free komutunu işletirken FormAdi adli formumum x(kaptma) düğmesine bastıktan sonra 1-2 sn bekliyor , daha sonra kapanıyor ve anaformum üzerindeki treeview nesnem 3-4 sn donuyor. FormAdi.Free komutunu kullanmaktan vezgeçtiğimde form çok hızlı kapanıyor ve herhangibir donma işlemide olmuyor. Bu sizce normal mi, donma olayını kullanıcıdan saklamak yada bu donma olayının önüne gemek için neler yapmam gerekir.




İyi çalışmalar...
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Free edeceğin formun onclose'unda Free yapmamalısın. OnClose da bir parametre vardır. Adı Action . Onclose içinde:

Kod: Tümünü seç

procedure TFormun.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Action:= caFree;
end;
Yaptığında formun kapandıktan sonra otomatik olarak free edilir.
Kullanıcı avatarı
osmantaskiran
Üye
Mesajlar: 34
Kayıt: 17 Nis 2004 09:27
İletişim:

Mesaj gönderen osmantaskiran »

Ben hem yukarıda yazdığım kendi kodumu hemde
Action := Free;
komutunu denemiştim zaten. İkiside aynı şey yapıyor zaten ve sonucu aynı.

Sorunum devam ediyor.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

İkisi aynı şey değil. Formun handler'ı içinde Formu Free etmek ilerde başını çok ağrıtabilecek ve problemi bulmanı güçleştirecek sorunlara yol açabilir. Detayına girmiyorum. Bu yüzden Action kullanmalısın.

Bunları kullanmadığında ve çarpı ile kapattığında Formun visibility'si false oluyor. Yani formun hala bellekte ama kullanıcıya görünmez şekilde kalıyor. Bu yüzden kapanışı çok hızlı diyorsun.

Bu kadar yüklü bir formun geç kapanması normal olabilir. Çünkü Free ederken bellekten aldığını geri vermeye uğraşıyor.
Gene de Ondestroy, onclosequery veya onclose'un içine ne gibi kodlar yazdığını bilemediğimden kesin birşey diyemem. Belki bu handler lar içinde bir kodun vardır ve bu yavaşlatıcı bir etki yapıyordur.

Bu yüzden Free etmekten vazgeçip, görünmez olması ile yetinebilirsin. Zaten programdan çıkarken bu form da otomatik olarak free edilecektir.
Kullanıcı avatarı
osmantaskiran
Üye
Mesajlar: 34
Kayıt: 17 Nis 2004 09:27
İletişim:

Mesaj gönderen osmantaskiran »

Formun onclose eventinde olan kod 1:1 aşağıdaki gibidir.


------------------------
Action := Free;
FormAdi := nil;
-----------------------

1. satırı kaldırırsam sorun düzeliyor ama ben 1. satırı kaldırmadan bir çözüm bulmak istiyorum.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

En üstte verdiğim yanıttaki kod ile aynı hale getirip dener misiniz?

Action:= Free değil caFree olmalı.
Kullanıcı avatarı
osmantaskiran
Üye
Mesajlar: 34
Kayıt: 17 Nis 2004 09:27
İletişim:

Mesaj gönderen osmantaskiran »

Ben foruma yazarken direk delphiden copy paste ile yazmadım.
Elle yazdım zaten caFree yerine Free yazınca delphi derlemeyecek.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Peki... :roll:
snofru
Üye
Mesajlar: 204
Kayıt: 19 Ağu 2004 02:57
Konum: /local/usr/src
İletişim:

Mesaj gönderen snofru »

Merhaba,
bende aynı sdistemi kullanıyorum ve doluluk oranı sizinkine yakın fornmlarım var milisaniyelik kapanıyor... OnClose'daki kodlarım @coderlord un dediği şekilde ama aklıma takılan bişey var onu söylemeden edemeyeceğim...

Formun Create edilmesi ile alakalı;

Kod: Tümünü seç

FormAdi := TFormAdi.Create([b]AnaForm[/b]) 
FormAdi.show
Ben Create işleminde Anaform yerine "Application" kullanıyorum...

Bilmiyorum ben cahilim fark edermi??
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

İstersen nil kullan. :D Farketmez. nil kullanırsan çıkışta otomatik free olmaz yanlız. Kendin free etmen gerekir.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

muhtemelen close/destroy yordamında bi islem yaptırıyorsunuz
yada soyle bir sey olabilir
form uzerinde db bilesenlerinden datasource yada table gibi bilesenler varsa bunların eventlarını kontrol et.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba ustalarım,

küçük bi sorunum var. yaptığım iki ayrı çalışma var birinci çalışmamda uyguladığım formu create etme ve sonunda free etme olaylarında sorunsuz çalışıyor. ikinci çalışmamda ise create ettiğim bir formu kapatıp akabince açmaya çalıştığımda access violation hatası alıyorum bazı formlarda ise abstract hatası alıyorum. kullandığım yöntem şöyle. formlarım avaliab olarak ayarlı.

formu açacak olan komut düğmesinde

Kod: Tümünü seç

if not assigned(formdemirbasgiris) then
  begin
    formdemirbasgiris:=tformdemirbasgiris.Create(self);
    formdemirbasgiris.Show;
  end
  else
    formdemirbasgiris.bringtofront;
formun onclose yordamında

Kod: Tümünü seç

ibdatasetleri kapatıyorum ve
action:=cafree;

kullanıyorum
son olarak kodların en sonuna

Kod: Tümünü seç

initialization
form:=nil;
yazıyorum. formlarımdan veri giriş formlarımda pek karışık yordam yok onactivate olayında datasetleri aktif yapıyorum onclosede kapatıyorum. gerisi verilerin post edilmesi kayıt gezintisi.

önceki diğer çalışmamda uyguladığım bu düzende sorun yaşamıyorum gayet iyi çalışoyor yeni yaptığım uygulamada bu durum niye hata veriyor acaba. nerede hata yapıyoruz.

hatayı tekrarlamak istersek. formları açıp kapatıp tekrar zaman kaybetmeden açmak istediğimizde access violation hatası ile abstract hatası alıyorum.

teşekkür ve saygılarımla
kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

olc yazdı: son olarak kodların en sonuna

Kod: Tümünü seç

initialization
form:=nil;
Buna hiç gerek yok. Delphi'nin başlangıçta form değişkenine Default atadığı değer zaten nil olacaktır.

Diğer konu daha fazla inceleme gerektirir. Projendeki herhangi bir formda yaptığın kodlama hatası buna sebep olabilir.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

assigned fonksiyonu bir pointerin iceriginin nil olup olmamasını kontrol ediyor
yani pointer bir seyi refere ediyor, gosteriyor ise true yoksa false deger donduruyor.
sen form create ederken bu form onceden create edilmis mi diye assigned ile kontrol ediyorsun ama form kapatılırken caFree parametresi ile Free etsen dahi formdemirbasgiris degiskeninin icerigi hala nil den farklı
bu yuzden cıkısta caFree nin altına formdemirbasgiris:=nil; eklemen gerek
bunu her form icin ayrı ayrı yapmak gerek bu degiskeni kullandıgın muddetce.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

gökmen ustam,

mantığı anladım sanırım. ben cafree desemde form creat olayından silinmediği için tekrar açmak istediğimde çakışma yapıyor ve hata mesajı veriyor. cafree den sonra form:=nil komutunu yazarsam düzelir inşeallah. şu an deneyemedim deneyince sonucu bildiririm.

burada analayamadığım önceki çalışmamda bu komutlar çalışırken yeni çalışmamda hata vermesi. buradada sanırım bi kodlama hatası yapıyor olabilirim birde aklıma şimdi şu geldi önceki uygulamamda kodlar çalışıyor fakat tablolarda sp ve trigger olayları yok. bu yeni çalışmamda bunlar var. ne kadar etkili olur bilemiyorum ama yinede yardımın için teşekkürler

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Cevapla