nil ya da Assigned'den farklı bi komut mu çıktı :)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen Lost Soul »

GrafikNet --> Form

Kod: Tümünü seç

     if Assigned(GrafikNet) then GrafikNet.Free;

Kod: Tümünü seç

     if  GrafikNet<>nil then GrafikNet.Free;
yukardaki her iki kod satırını da çalıştırdığım zaman Acces Violation ..... FFFFFFFFF (boş değer) hatası alıyorum.

Delphi 2007 kullanıyorum.
Formları çalışma anında create ediyorum.
(
zaten bu çalışma anında create işlemine başlayınca uygulama sapıtmaya başladı
(mesela formlar için çalışma anında create den sonra verdiğim left rigth değerlerini görmezden gelmesi gibi)
)

düşünceniz ya da tavsiyeniz nedir.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen sadettinpolat »

bu komutlar 40 yillik delphi komutlari bunlarda bir sorun olacagini sanmiyorum acikcasi
grafiknet in icinde olusturmus oldugunuz baska bir nesneden dolayi da olusabilir bu hatalar
bence en guzel yontem eurokalog tarzi bir arac kurup hatanin nerden kaynaklandigini tespit etmektir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen emin_as »

Bazı kodlarla açıklayayım.

Kod: Tümünü seç

...
  // 1. seçenecek create yapıldı
  grafik1:=Timage.Create;
//  2. secenek  nil ile sıfırlandı
  grafik1:=nil;   
// 3. secenek 
// grafik1 ile hiçbir işlem yapılmadı

  if assigned(grafik1) then  
1. secenek assigned true döndürecektir.
2. secenek assigned false döndürecektir.
3. secenek assigned true döndürecek, ama grafik1 create ile oluşturulmadıgı için rasgele bir adres barındıracaktır. Sonucta grafik1.show veya herhangi bir grafik1 degişkeni kullanılmak istendiginde access violation hatasıyla karşılaşılacaktır.

Assigned hafızada bir adresi gösteren değişkenin nil ( 0) değerine sahip olup, olmadıgına bakar. Eger değişkeni nil ile sıfırlamadıysan, mutlaka rasgele bir deger sahip olacaktır.

Delphi değişkenlerin içerigine dokunmaz. Grafik1 gibi hafızadaki nesneyi gösteren değişkenler, rasgele degerlere sahip olacaktır. Bu nedenle kullanılan değişkenler ilk değerlerine atanmalıdır. Nil veya create gibi işlemlerle değişkenler anlamlı değerlere sahip olmalıdır.
Benzeri bir örnegi şu şekilde de düşünebilrsin.

Kod: Tümünü seç

var
  b1 : boolean;
begin
  // 1. secenek
   b1:=true;
  // 2. secenek
   b1:=false;
  // 3. secenek
  // b1 e deger atanmadı
  if b1 then showmessage(...
1. secenege göre showmessage çalışacaktır.
2. secenege göre showmessage çalışmayacaktır.
3. seçenege göre showmessage bazen çalışacak, bazen çalışmayacaktır.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen Lost Soul »

@emin_as cevabınız için teşekkür ederim.
dedikleriniziden yola çıkarak kodu şu şekilde değiştirdim ve sorun çözüldü

Kod: Tümünü seç

     
      if Assigned(GrafikNet) then
      Begin
        GrafikNet.Destroy;
        GrafikNet:=nil;
      End;
ancak aklıma takıldı matıksal olarak free ve/veya destroy işleminden sonra formun nil değer döndürmesi gerekmez miydi.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen emin_as »

Free edilen değişkenler, kendiliginden nil olmuyor.
Free ve nil etmek için FreeAndNil (GrafikNet); komutunu kullanabilirsin.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen Lost Soul »

peki bu durumda formclose olayına

Kod: Tümünü seç

action:=caFree

dediğimiz zaman form kendiliğinden nil oluyor mu yoksa buna da mı birşeyler yapmak lazım?
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen emin_as »

Kesin konuşmak istemem, ama action:=caFree nin free ettikten sonra nil yapacagını sanmıyorum.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen vkamadan »

Lost Soul yazdı:peki bu durumda formclose olayına

Kod: Tümünü seç

action:=caFree

dediğimiz zaman form kendiliğinden nil oluyor mu yoksa buna da mı birşeyler yapmak lazım?
Evet kendiliğinden nil olmaz , nil olması için birde formun OnDestroy olayına formadi := Nil; demeniz gerekir.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: nil ya da Assigned'den farklı bi komut mu çıktı :)

Mesaj gönderen aslangeri »

aslında tüm bu sıkıntıların sebebi
yeni bir form tasarlarken delphini unite eklediği

Kod: Tümünü seç

var
  Form1:TForm1
kod bloğu.
bu blok sayesinde biz yeni bir form tasarımı yaparken (yeni bir sınıf oluştururken) delphi o sınıfın bir formunu tanımlıyor(ve aksini belirtmemişsek otomatik olarak oluşturuyor)

bizlerde farkında olmadan hazırladığımız sınıfın içerisinde sınıftan türetilmiş bir bileşeni (bileşenin adınıda yazarak) kullanıyoruz.
Tform1 ile form1 i aynı şey zannediyoruz(kendi adıma bu böyleydi.. taki bakınız);
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla