Create

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Create

Mesaj gönderen Dostk »

Merhaba.

Açık kaynak yazılım üzerinden geliştirme yapıyorum, Create ile bir şey oluşturduğumda formu kapattığımda anlayamadığım bir mesaj ekranı geliyor bu sorun neden oluşur...

kullandığım kod:

Kod: Tümünü seç

procedure TMainForm.ayarlarButtonClick(Sender: TObject);
begin
  Form1.ShowModal;
  Form1 := TForm1.Create(Nil);
  Application.ProcessMessages;
end;
Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Create

Mesaj gönderen mrmarman »

Merhaba.

- Bu aslında geliştirme aşamasında hepimizin yapması gereken bir yardımcı fonksiyonunun rapor ekranıdır.
- Üzerinde çalıştığınız projelerin yapım aşamalarında hafızada kırıntı bırakırsanız size haber verir. Herşey yolunda ise hiç sesi soluğu çıkmaz.

Bu yardımcı flag

Kod: Tümünü seç

  ReportMemoryLeaksOnShutdown := True;
ile aktive edilir. Sen mesaj çıkmasın istiyorsan bu satırı kaldırabilirsin ama aslında çok faydalıdır. :D

- Her defasında create edilen ama free edilmesi unutulduğundan aynı işlemi sürekli tekrar eden yapılar hafızada yer ayrılmış ama free edilmediğinden geri kazanılamamış vb. aklına gelen gelmeyen düzensizliklerde hafızada şişme oluşur. Projen çalıştığı süre içerisinde bu şişme bazen öyle seviyelere gelir ki proje işlevsiz kalır ve kırılır. :roll:

- Uzun lafın kısası neden bu mesaj çıkıyor sorusunu araştırıp projedeki olumsuzluklara çare bulmak daha rasyoneldir. :wink:
Resim
Resim ....Resim
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: Create

Mesaj gönderen Dostk »

:D Açıklama için teşekkür ederim, çıkan bu masajdan açıkçası bir şey anlamadım ne gibi olumsuzluk var acaba :D
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Create

Mesaj gönderen mrmarman »

(1) Projeni çalıştırdın ve çıktın bu hata gelimiyor. O zaman formunun create kısmında vs. sıkıntı yok.
(2) Bir class create ettin ve free ettin. Bu hata geliyor. Demek ki bu class içerisinde bir sorun var. Orada free edilmemiş alt nesler var.

örneğin hata mesajında gördüklerini aramaya koyulabilirsin. MemoryStream create edilmiş ama free edilememiş. Veya free edilmesine fırsat kalmadan önce onun sahibi free edilmiş gibisinden. create ettiğin formun içeriğinde yer alan olayların tümünü devre dışı bırakıp adım adım devreye sokarak kontrollü bir şekilde devam etmelisin.

Bak sana neyi nasıl göreceğin ile ilgili basit bir örnek.

Kod: Tümünü seç

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  Test : TMemoryStream;
begin
  Test := TMemoryStream.Create;
  // Bak free etmedim
end;
Sadece bu kadarlık bir kod aşağıdaki sonucu getirdi. Programı çalıştır çık hata vermez. Ne zaman BitBtn1'e bastım ve sonra çıktım aşağıdaki hata oluşur. Bu sana yeterince fikir verir sanırım.

Resim
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Create

Mesaj gönderen thelvaci »

Kod: Tümünü seç

procedure TMainForm.ayarlarButtonClick(Sender: TObject);
begin
  Form1.ShowModal;
  Form1 := TForm1.Create(Nil);
  Application.ProcessMessages;
end;
Muharrem bey'in açıklamalarına ilave olarak sormak istiyorum; yukarıdaki kodunuzda Form1.ShowModal çağrılmadan önce Form1 zaten create edilmiş durumda değil mi ? İkinci olarak; Form1'in OnClose olayında Action := caFree; kodu var mı ? Üçüncü olarak, bu button'a basıldıktan sonra uygulamanız kapanır iken Form1.Free; kodu var değil mi bir yerlerde ?

Ve dördüncü olarak belirtmek istiyorum ki; bir nesneyi ownersız oluşturursanız(sizin örneğinizde TForm1.Create(nil)) bu durumda nesneyi yok etme görevini siz ele alıyorsunuz demektir; aksi durumda Delphi akıllıdır ve kapanış esnasında nesneler kendilerini yok etmeden önce sahip oldukları nesneleri yok ederler; bu sayede hazıfa sızıntısı(memory leak) görmezsiniz.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Create

Mesaj gönderen ertank »

Kod: Tümünü seç

Form1 := TForm1.Create(Self);
Form1.ShowModal;
şeklinde olması daha doğru olmaz mı?
Cevapla