SetLength

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
ovural
Üye
Mesajlar: 167
Kayıt: 22 Eki 2003 10:20
İletişim:

SetLength

Mesaj gönderen ovural »

ya daha oncede sordum ama tekrar sorayım bende mi bir cinslik var anlamadım ..

simdi bazı islemler icin cok fazla component kullanmam gerekiyor ve bunların sayısı duruma gore degisiyor ..

mesela TLabel; veya TQRLabel;

bu yuzde

deneme:array of TQRLabel;

diyorum programda ve

runtime da duruma gore

Kod: Tümünü seç

Setlength(deneme,sayi) ;


diyip (burada sayi malum anlasılmıştır kactane olacagıdır)

sonra bir dongu ile create ediyorum ve özelliklerini ayarlayım işlemlerimi yapıyorum buraya kadar hersey normal ..


ama formu kapattıgımda bir suru hata veriyor ..

runtime 16
17 vs.vs.vs.
onclose da Free yaptım olmadı .. Release dedim olmadı ...

ama create işlemi hic olmazsa hata vermiyor .. veya array i sabit tanımlarsam

mesela

deneme:array[1..1500] of TQRLabel; diye

o zaman ilk 5 tanesi create ediyorum bu sekilde hata vermiyor ..

ama icime sinmedi .. nedir problemi ?[/code]
Misafir

Mesaj gönderen Misafir »

merhaba.
create ettiğiniz bileşene isim veriyor musunuz?setlength dediğinizde 0 (sıfır) dan başlıyor qrlabel0 gibi bişey soruna neden olur sanırım.
kolay gelsin.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Create ve Free kodlarını gönderirsen yardımcı olabilirim. Bir de bu tür bir işlem için TList kullanman daha uygun.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

forum kurallarına dikkat edelim, dah aönce yazdıysan aynı başlığa devam et.

free leme kodlarında muhtemelen hata var bununla ilgili çok kez mesaj yazıldı, aramayı kullanarak soruna kısa sürede cevap bulabilirsin.

arama yapınca neden gereksiz yere defalarca aynı soruları sırmayın dediğ
imizi arama sonucunda onlarca mesaj çıkınca anlaşılıyor..

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
ovural
Üye
Mesajlar: 167
Kayıt: 22 Eki 2003 10:20
İletişim:

Mesaj gönderen ovural »

oncelikle mesajlarda arama yaptım ama istedigim bilgi yok .. tamam free ile ilgili cok mesaj var ..ama array olarak kullanmamış kimse ..

ve eski mesaja devam etmedim cunku cok mesaj atıldıgı icin benim mesaj altta kalmıştır diye dusundum ama sonradan farkettim ki mesajı atınca mesaj ustte cıkıyor :D

simdi mesajlara cevap yazayım ..
componentin name i ile ilgili degil .. cunku onuda denedim
ornek isteyenlere ise gonderiyorum

Kod: Tümünü seç



  d:array of TLabel;
  i,z:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
    Randomize;
    z:=Random(50);
    Setlength(d,z);
    For i:=0 to z do
    Begin
        d[i]:=TLabel.Create(Form1);
        d[i].Parent:=Form1;
        d[i].Name:='Label'+IntToStr(i+1);
        d[i].Left:=Random(Form1.Width);
        d[i].Top:=Random(Form1.Height);
    end;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   for i:=0 to high(d) do 
        d[i].Free;
end;
close olayındaki kodları yazmadıgımdada aynı sıkıntı oluyor ..

FreeOnRelease; kullandım gene yemedi ...


ama

Kod: Tümünü seç

d:array of TLabel; 
yerine

Kod: Tümünü seç

 d:array [0..50] of TLabel;
yazarsam sıkıntı cıkmıyor ..
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Kod: Tümünü seç

 For i:=0 to z do
    Begin
        d[i]:=TLabel.Create(Form1);
        d[i].Parent:=Form1;
        d[i].Name:='Label'+IntToStr(i+1);
        d[i].Left:=Random(Form1.Width);
        d[i].Top:=Random(Form1.Height);
    end; 
yapmışsın. Şimdi burada z random olarak belirleniyor ve 30 olsun. sen for döngüsünde demişsin ki 0 dan 30'a kadar. Bu toplam 31 eder. 30 değil. Sen 30 Label'lık bir alan ayırıyorsun ancak d'ye 31. elemanı da koyuyorsun. Create ederken hata vermemesi ilginç. Sorun Free esnasında oluyor. O bölgeye (31.) muhtemelen nil yazmaya çalışıyor veya okuyor ve "invalid pointer operation" gerçekleşiyor. Yapman gereken basitçe şu 0 to z değil :
0 to z - 1 yapmalısın ki ayırdığın kadar yerde çalışasın.

Bir de şunu eklemek istedim. Label parent'larına Form1 vermişsin. Bunu yaptıysan çıkışta label'ları free etmek zorunda değilsin. Form Free edilirken buna bağlı label'lar da otomatik olarak free edilir. Yani çıkışta bir free döngüsüne hiç gerek yok. Keza dinamik array de otomatik olarak free edilir.
Misafir

Mesaj gönderen Misafir »

tekrar merhaba.
hala sorunun Free işleminden kaynaklanmadığını savunuyorum.setlength(d, z+1) yazıp dener misiniz?

not : sonucu buraya bildirirseniz memnun oluruz.
kolay gelsin.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

O halde static tanımlayınca neden çalışıyorun cevabı şu:

Static olarak 50 lik bir yer ayırıyorsun. Random function'un hiçbir zaman geriye 50 döndürmeyecek en fazla 49 döndürecek. Bu da 0 to 49 dediğinde 50 ye eşit olduğundan hiçbir zaman hata vermeyecek.
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

@delphi_coder setlength z+1 dersen kullanacağından daha fazla bellek ayırmış olacaksın. Bu pek iyi birşey değil. for döngüsünde z-1 yapması yeterli olacaktır.
Misafir

Mesaj gönderen Misafir »

coderlord yazdı:@delphi_coder setlength z+1 dersen kullanacağından daha fazla bellek ayırmış olacaksın. Bu pek iyi birşey değil. for döngüsünde z-1 yapması yeterli olacaktır.
sayın @coderlord;
z+1 yazmayı salık vermemin nedeni hatanın tespit edilmesidir..ayrıca tek bir label fazladan create edilmesi ram açısından bir sorun teşkil etmez kanaatindeyim.
saygılar..
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Haklısın, dinamik dizi için RAM'den sadece 4 byte daha fazla gidecek. :)
Misafir

Mesaj gönderen Misafir »

dediğim gibi hatanın kaynağını tespit etmek için bi tespit yöntemi bu.ram olayını programcı kendisi düşünsün artık :)
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Dynamic arraysla benzer sorunları bende yaşadım çözümü en sonunda Tlist ve birazdaha ileri pascal teknikleri kullanarak çözdüm.

Şöyle bişey deneyebilirsin

Kod: Tümünü seç


type kısmına Plabel = ^TLabel yaz

var
 templabel:Plablel;
 LabelList:Tlist;
begin
       LabelList := Tlist.create;
       // burda bir döngüyle istediğin kadar label ekleyebilirsin...
       new(templabel);                      
       templabel^ :=TLabel.Create(Form1); 
       templabel^.parent:=Form1; 
       ...... 
       ......
       
      labellist.add(templabel);
end;

listedeki elemana ulaşmak için
  Plabel(labellist.Items[i])^.caption := 'asşdoa'; gibi

Kullanıcı avatarı
ovural
Üye
Mesajlar: 167
Kayıt: 22 Eki 2003 10:20
İletişim:

Mesaj gönderen ovural »

foruma dun bakamadım ..


bugun deneme yaptım ..


for i:=0 to z-1

yapınca oldu .. kucuk bir mantık hatası ..

:D tesekkurler herkese ...


Pointer kullanmayada bakarım daha sonra
Cevapla