Değişken nesne adı..
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Değişken nesne adı..
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
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
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
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
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:
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.
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..
İ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?
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?
İşte bu kadar.
"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
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ı
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.
Kod: Tümünü seç
var
I: Integer;
begin
for I:= 0 to List.Count - 1 do
TButton(List[I]).Free;
En son fduman tarafından 08 Mar 2006 10:22 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
@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
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.

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.

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.
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.
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';
...
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.
@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.
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08