Değişken nesne adı..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
i_zec
Üye
Mesajlar: 119
Kayıt: 01 Tem 2005 03:07

Değişken nesne adı..

Mesaj gönderen i_zec »

herkese kolay gelsın ...

delphi runtime da aynı nesneden ard arda oluşturuyorum .. ancak hepsinin adları farklı olacak ve şöyle bişey olsun istiyorum.. ilk oluşturduğum nesne1,ikinici nesne2 ,üçüncü nesne3 olsun .bunu nasıl yapabilirim?

yani
var
abc:tbutton
begin
. . .

buradakı abc nasıl sürekli değişken olabilir..
iyi gunler
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

zor yaparsın. Eğer çalışma anında değişken adı üretmek mümkünse bile (hiç zannetmiyorum) ben bilmiyorum. Ama istediğin şeyi yapmak kısmen mümkün (çalışma anında değişken adı üretmek mümkün olmadığından olsa gerek çözüm üretilimiş). Değişken listeleri kullanabilirsin. Örneğin bir Array. Yada daha güzeli eğer istediğin değişkenler bir nesne ise (haliyle TObject sınıfından türetilmiştir) TList yada ondan üretilmiş olan sınıfları kullanabilirsin.

Var
MyObjectList:TStringList;
myButton:TButton;
begin
myButton:=TButton.Create(Form1);//Form1 yerine başka bir nesnede olabilir tabi
MyObjectList:=TStringList.Create;
MyObjectList.AddObject('Button1',myButton);
...
...


//ürettiğin nesneleri (burda myButton) (başka türlü serbest bırakmıyorsan)destroy etmelisin
MyObjectList.Objects.Free; //gibi
// en son işi bitince listemizde serbest kalmalı (daha doğrusu ayrılan adres)
MyObjectList.Free;
end;


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

Mesaj gönderen fduman »

Aslında istediğin şey için TList daha uygun. Ama önce, biraz değişkenlerden bahsedelim.

"Değişken adı" dediğiniz şeyler aslında birer illüzyondur. Delphi derleyicisi tarafından hiç mi hiç kaale alınmazlar. Şöyle ki. Pascal standartlarına göre istediğiniz ismi değişkenlere verebilirsiniz. Delphi buna aldırmaz. Delphi, değişkenleri isim olarak değil, bellekteki adresler olarak algılar. İsimler, biz fani insanların kolay algılayabilmesi ve ilişki kurabilmesi içindir. :)

Örnek vermek gerekirse:

Kod: Tümünü seç

var
  ABC: TButton
gibi bir değişken tanımının Delphi derleyicisindeki manası, "Bana stack üzerinde 4 byte'lık bir alan ayır, ben bu alanda bir TButton pointer adresi tutacağım" demektir.

Sizin yapmak istediğiniz, belirli bir aşamaya gelmiş olan her programcının ihtiyaç duyduğu bir işlev. Ancak doğru yöntem, bu değişkenlere farklı isimler vermek değil, bir depo içinde kolay erişilebilir biçimde tutmak.

TList'in bunu nasıl yaptığına göz atalım.

TList'in görevi bellekte pointer tutmak, daha sonra ihtiyaç duyduğumuzda bu pointer'lara hızlı ve kolay biçimde ulaşmamızı sağlamaktır.

Kullanabilmek için bir TList nesnesi oluşturalım.

Kod: Tümünü seç

var
  List: TList;
begin
   List:= TList.Create;
   try

Nesnemiz oluşturuldu ve pointer'i List olarak adlandırılan değişkene aktarıldı.

İki düğme oluşturalım. Bunların değerlerini List içinde saklayalım. Devam..

Kod: Tümünü seç

List.Add(TButton.Create(Self)); // İlk düğme oluşturuldu ve adresi List'e aktarıldı
List.Add(TButton.Create(Self)); //  İkinci düğme oluşturuldu ve adresi List'e aktarıldı
İki düğme oluşturduk. Bunlara değişken isimleriyle erişemeyiz. Çünkü iki değişken tanıtmadık. Peki nasıl erişeceğiz?

Kod: Tümünü seç

TButton(List[0]).Left:= 100; // 1. düğmenin soldan konumunu değiştirdik
TButton(List[1]).Top:= 40; // 2. düğmenin üstten konumunu değiştirdik.
Burada dikkat etmemiz gereken şey, işimiz bittiğinde düğmelerin ayırdığı belleği geri vermemiz. Bu çok önemli. Bunu nasıl yapacağız?

Kod: Tümünü seç

var
  I: Integer;
begin
   for I:= 0 to List.Count - 1 do
      TButton(List[I]).Free;
İşte bu kadar.
En son fduman tarafından 08 Mar 2006 10:22 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
i_zec
Üye
Mesajlar: 119
Kayıt: 01 Tem 2005 03:07

Mesaj gönderen i_zec »

cok teşekkurler..iyi çalışmalar...
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

@coderlord ustam bu dersi veren bilimum organlarına sağlık. Öğretmen olacak adammışsın. Dershane falan açarsan haberimiz olsun. Çok güzel kısa ve net olarak açıkladın ki tek okumada anladık.

teşekkür ve saygılarımla
Ş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
ylmz
Üye
Mesajlar: 110
Kayıt: 18 Mar 2005 02:32
Konum: Antalya

Mesaj gönderen ylmz »

merhaba,

@coderlord küçük bir ekleme yapacam izninle,

TList nesnesiyle işimiz bittikten sonra ayırdığımız belleği geri vermeyi unutmayalım.Tabi ki bunu yapmadan önce de @coderlord yazdığı gibi nesnemizin referansta bulunduğu tüm bellek alanını geri vermemiz gerekiyor.

iyi çalışmalar.
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

TList mi, TStringList mi?

Bu konuda bir kaç şey yazmalı.
Eğer değişkenlere isimleri ile ulaşmaka isterseniz Tlist pek uygun değil. Eğer 10 larca ve hatta 100 lerce nesne kullanıyorsanız TList in hangi elemanında hangi değişken var bilmeniz zor. Değişkenleri (nesneleri) oluştururken onlara mantıklı isimler verirseniz şu şekilde bir TStringList hayat kurtarır.

Kod: Tümünü seç

Var
 MySList:TStringList;
...
begin

 MySList.AddObject('Button1',Button1);
 if MySList.IndexOf('Button1')>-1 then //Button1 in varlığından eminseniz gereksiz ama tehlikeden haberdar olun yinede
  TButton(MySList.Objects[MySList.IndexOf('Button')]).Caption:='Tıkla Bana';
...
Değişkenler konusunda küçük bir teknik özet (hatırlayabildiğim kadar yazacağım uzun zamandır bu konu üzerinde çalışmadım unutmuşum)
Bir değişken tanımladığınızda bu değişkenin tutacağı veri için bellekte (stack) yer ayrılır (Ayrılacak yer değişken tipine bağlı. integer için 4 byte, byte için 1 byte, string için 256 byte vs). Linking esnasında programda değişken adı geçen yerler değişken adresi ile doldurulur.

Nesnelerde durum biraz faklı. Nesne değişkenleri bir pointer olarak işlem görür. Nesne tanımlanınca işaret edeceği adresi turmak için 4 byte yer ayrılır. Nesne oluşturulunca bu nesnenin verisini tutacak, veri büyüklüğünde yer ayrılır (sanıyorum heap te). Ayrıca tablolar oluşturulur nesnenin bazı bilgileri (metodların adresleri vs) bu tablolarda tutulur.
Bildiklerim bu kadar.

Kolay gelsin.
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

@poshet303, @i_zec arkadaşımız birbirinden farklı nesnelere birbirinden farklı isimler nasıl veririz diye sormuş ve @coderlord ise her neyseneye bir isim vermeye gerek olmadığını TList içinde sadece adresleri tutmanın yeterli olacağını söylemiş. TStringList kullanılırsa @i_zec'in sorduğu "her neyneye farklı bir isim verme sorunu" tekrar ortaya çıkacak. Bu yüzden TList kullanmak daha uygun gibime geliyor. Zaten burda önemli olan nesnelerin referanslarını kaybetmemek, adlandırmak değil.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Delphi de bu yöntemi kullanıyor zaten :idea:
Cevapla