Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen pro_imaj »

Merhaba;

Runtime'da Edit label vb nesneler oluşturuyorum. Form'u kapatırken hangi nesneleri oluşturmuşum bunları listeletmek istiyorum, bunu nasıl yapabilirim.

Örneğin.
Formda 2 Edit 1 Button oluşturmuşsam.

Edit1
Edit2
Button1

Şeklinde bir bilgiye ihtiyacım var.

Saygılarımla
Teşekkürler.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen freeman35 »

.Components[x] şeklinde ulaşabilirsin. Yada bunların handle ları nerde? Edit1 diye bir değişken varsa nil yada assigned() ile kontrol edebilirsin, yada ben Tlist kullanmayı tercih ederim.
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ı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen pro_imaj »

Merhaba;
Cevap için teşekkür ederim hocam.

FindComponent fonksiyonunu buldum sanırım burada döngüyle çözülecek gibi. Fakat henüz yoğunlaşamadım. Hata alıyorum (invalid class typeclass)

Aşağıdaki şekilde editleri oluşturuyorum.

Kod: Tümünü seç

  E1 := E1 +1;
  with TEdit.Create(Self) as TEdit do
  begin
    Left := LastX;
    Top := LastY;
    Parent := ContainerPanel1;
    Text := 'Edit'+IntToStr(E1);
    Name := Text;
    Draggable.Enabled := True;
    Cursor := crDrag;
    OnEndDrag := AnyComponentsEndDrag;
Kullanıcının kaç edit oluşturduğunu bilmiyorum.

Teşekkürler.
İyi çalışmalar.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen freeman35 »

with TEdit.Create(Self) as TEdit do
TEdit create ettiğin class ı tekrar cast etmene gerek yok ki? ayrıca ilk mesajımda yazdığım gibi bunları TList içerisinde topla, daha önce benzer bir soru vardı, daha öncede forumda konuşulmuştu, örnekler olacak. bana senin yaptığın belirsiz gibi geliyor. TList ile tüm kontrol sende olur, istediğine erişip silebilirsin, memoryleak sorunun olmaz vs gibi daha kontrollü olur.
componentcount, components[] senin yönteminde kullanabileceğin function ve property ler.
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ı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen mrmarman »

Basit bir önerim olacak.
Doğrusu @freeman35'in bahsettiği gibi her create edilen nesnenin senin kontrolünde olması için bir listede tutulmasıdır.

Alternatif teknik önerim: NAME olarak verdiğin ismi 'Edit' olarak değil de örneğin 'ProEdit', 'ProButton', 'ProLabel' gibi ayrı bir ön takı ile isimlendirirsen; for döngüsünde istediğin listeyi elde edersin. Ya fonksiyon içinde ya da sonradan bunları sınıflarına göre sayarsın

Kod: Tümünü seç

Function Nesneler( Form:TForm; strOnTaki:String ): String;
Var
  i : Integer;
begin
  for i := 0 to Form.ComponentCount-1 do
    if Copy( Form.Components[i].Name, 1, Length(strOnTaki) ) = strOnTaki
      then Result := Result +  Form.Components[i].Name + #13;
end;
Kullanımı :
Tümü için

Kod: Tümünü seç

  ShowMessage( Nesneler( self, 'Pro' ) );
Edit'ler için

Kod: Tümünü seç

  ShowMessage( Nesneler( self, 'ProEdit' ) );
Label'lar için

Kod: Tümünü seç

  ShowMessage( Nesneler( self, 'ProLabel' ) );
Resim
Resim ....Resim
Kullanıcı avatarı
badkursat
Üye
Mesajlar: 84
Kayıt: 03 Mar 2014 08:58

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen badkursat »

Bu kod işini görür sanırım

Kod: Tümünü seç

procedure TForm1.RefreshTree(ATree : TTreeview);
var
  i: Integer;
  r: TTreeNode;

procedure AddComponent(AObject: TWinControl; ARoot: TTreeNode);
var
  i: Integer;
  n: TTreeNode;
begin
  for i:=0 to AObject.ControlCount-1 do
    begin
      n:=ATree.Items.AddChildObject(ARoot,Format('%s: %s',[AObject.Controls[i].Name,AObject.Controls[i].ClassName]),AObject.Controls[i]);
      if AObject.Controls[i] is TWinControl then
        Begin
          AddComponent(TWinControl(AObject.Controls[i]),n);
        End;
    end;
end;

begin
  ATree.Items.Clear;
  r:=ATree.Items.AddChild(nil,Format('%s: %s',[Self.Name,Self.Classname]));
  AddComponent(Self,r);

  //Componentleride göstermek için
  {for i:=0 to Self.ComponentCount-1 do
    if not(Self.Components[i] is TControl) then
      ATree.Items.AddChildObject(r,Format('%s: %s',[Self.Components[i].Name,Self.Components[i].ClassName]),Self.Components[i]);}

  ATree.FullExpand;

  ATree.Selected:=r;
end;
kullanımı
RefreshTree(Senin Treeview'in)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen mrmarman »

:D @badkursat kullanıcı tarafından eklenen değil de kendi asıl nesneleri nasıl ayırt etsin arkadaş ?
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen thelvaci »

Kapsayıcı nesnelerin içinde; ComponentCount, Components[?]; yada ControlCount, Controls[?] biçiminde döngü ile dönüp istediğinizi elde edebilirsiniz. Maksat sadece sizin runtime sırasında oluşturduğunuz nesneleri elde etmek ise; en basit yol nesneleri oluşturma esnasında ilgili sınıfların Tag propertysine istediğiniz bir değeri vermek ve daha sonra döngüde bu değeri kontrol etmektir.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen SimaWB »

+1 Tag property
There's no place like 127.0.0.1
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen pro_imaj »

Çok değerli cevaplarınız için hepinize ayrı ayrı teşekkür ederim.
Muharrem bey'in örneğindeki şekilde sorunumu çözdüm.

Saygılarımla
İyi çalışmalar.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen mrmarman »

Tag property çok güzel bir state flag enstrumanıdır. Bu gibi statik ayırt edici unsur için harcanmayacak kadar değerlidir. En son düşünülmelidir diye değerlendiriyorum.

Yeri gelir aktif kayıt nosunu koyarsınız ilgili nesne ona göre davranır, yeri gelir işlem durumunu dinamik olarak yine tag üzerinde bir değer ile ifade edersiniz.

Yayın hayatında daha sonra değişmeyecek Statik tanımlamaları nesne adı gibi statik enstrüman kullanmak daha verimlidir bu açıdan da bir bakın.
Resim
Resim ....Resim
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen pro_imaj »

Merhaba;
konunun devamı olarak; Muharrem bey'in mantığında bir yapı oluşturdum. Oluşturduğum bu Nesneye Mause İle Tıkladığımda NesneName'ini nasıl alırım.

Örneğin Runtime de 2 adet edit oluşturdum. Sonrasında bu editlerden herhangi birine mause ile tıkladığımda Nesne Name'ini (yani hangi edit olduğunu) nasıl alabilirim.

Yardımlarınız için şimdiden teşekkürler.
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen thelvaci »

pro_imaj yazdı:Merhaba;
konunun devamı olarak; Muharrem bey'in mantığında bir yapı oluşturdum. Oluşturduğum bu Nesneye Mause İle Tıkladığımda NesneName'ini nasıl alırım.

Örneğin Runtime de 2 adet edit oluşturdum. Sonrasında bu editlerden herhangi birine mause ile tıkladığımda Nesne Name'ini (yani hangi edit olduğunu) nasıl alabilirim.

Yardımlarınız için şimdiden teşekkürler.
ActiveControl'a bakabilirsiniz yada FindVCLWindow metodunu kullanabilirsiniz.
Kullanıcı avatarı
pro_imaj
Kıdemli Üye
Mesajlar: 1364
Kayıt: 18 Oca 2005 05:45
Konum: Dünyadan

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen pro_imaj »

Söylediğiniz kodları hangi olaya yazmalıyım?
Gün gelecek, dilleri, elleri ve ayakları yapmış oldukları bütün kötülükleri tek tek bildirerek aleyhlerinde şahitlik edecektir. [Nur Suresi 24]
_________________
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Runtime Oluşturduğum Bütün Nesneleri Nasıl Listelerim

Mesaj gönderen SimaWB »

pro_imaj yazdı:Merhaba;
konunun devamı olarak; Muharrem bey'in mantığında bir yapı oluşturdum. Oluşturduğum bu Nesneye Mause İle Tıkladığımda NesneName'ini nasıl alırım.

Örneğin Runtime de 2 adet edit oluşturdum. Sonrasında bu editlerden herhangi birine mause ile tıkladığımda Nesne Name'ini (yani hangi edit olduğunu) nasıl alabilirim.

Yardımlarınız için şimdiden teşekkürler.
Oluşturduğunuz Edit'ler için ortak bir OnClik olayı yazmışsınız diye tahmin ediyorum. OnClick'in tek bir parametresi var: Sender: TObject
Bu parametre hangi Edit tıklandıysa onu size verir ve Edit'in ismi:

Kod: Tümünü seç

TEdit(Sender).Name
There's no place like 127.0.0.1
Cevapla