Button oluşturup Müdahele etmek.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Button oluşturup Müdahele etmek.

Mesaj gönderen RADCoder »

Merhaba arkadaşlar, Hepinize Allah kolaylık versin..

Arkadaşlar şu şekilde bir button oluşturuyorum.

Kod: Tümünü seç

 type
    TAButton = Class(TButton)
    procedure MyOnclick(Sender: TObject);
   End;
   
....


procedure TForm1.FormCreate(Sender: TObject);
begin
      try
         AButton := TAButton.Create(Self);
         AButton.Parent := Panel1;
         AButton.Name := 'AButton1';
         AButton.Text := 'AButton 1';
         AButton.OnClick := AButton.MyOnclick;
         AButton.Position.X := 5;
         AButton.Position.Y := 5;
         AButton.Height := 30;
         AButton.Width  := 125;
       except
          AButton.Free;
      end;

end;


procedure TAButton.MyOnclick(Sender: TObject);
begin
ShowMessage(IntToStr((Sender as TAButton).Index));
end;
   
   
procedure TForm1.Button1Click(Sender: TObject);
begin
   AButton.MyOnclick(Sender);  // Button 1-e basarak Click olayını gerçekleştiremedim.
end;  
   
Yapmaya çalıştığım olay, Form1 üzerine eklediğim,
Button1-e tıklandığında, Sanki create edilmiş butona tıklamış gibi tıklama yapmak.
Buradaki önemli kısım Create edilen button sayısının birden fazla olması ve hangi index numarasına tıklayacağını göstere bilmek.

Çok uğraştım ama olmadı, İndex-e göre tıklama yapamadım malesef..

Yardımcı ola bilecek arkadaşlara şimdiden teşekkür ederim..
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen barisatalay »

Indexleri nerede saklıyorsunuz ki ?
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen RADCoder »

İndex-i otomotik create edildiyinde veriyor zaten. Ama çokta önemi yoktur ki illa-da index olsun.
Bir Buttonda tag-da mevcut olduğu için orada saklaya bilirim.

Şöyle:

Kod: Tümünü seç

 type
    TAButton = Class(TButton)
    procedure MyOnclick(Sender: TObject);
   End;
   
....


procedure TForm1.FormCreate(Sender: TObject);
begin
      try
         AButton := TAButton.Create(Self);
         AButton.Parent := Panel1;
         AButton.Name := 'AButton1';
         AButton.Text := 'AButton 1';
         AButton.OnClick := AButton.MyOnclick;
         AButton.Position.X := 5;
         AButton.Position.Y := 5;
         AButton.Height := 30;
         AButton.Width  := 125;
         AButton.Tag     := 1;  // Gibisinden ola bilirmi acep?
       except
          AButton.Free;
      end;

end;
   
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen bulutsuzluk_35 »

button1clickte sender yerine abutton yaz

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen RADCoder »

Dikkatsizlikmi desek olayı anlayamamakmı.
Aslında Muharrem Ağabeyin dediyi gibi, sihir ve ilizyon olayı her halde..

Bakalım birden fazla dizdiyim buttonlara tag-larına göre tıklaya bilecekmiyim..

Tekrar teşekkürler..
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen barisatalay »

RADCoder yazdı:Dikkatsizlikmi desek olayı anlayamamakmı.
Aslında Muharrem Ağabeyin dediyi gibi, sihir ve ilizyon olayı her halde..

Bakalım birden fazla dizdiyim buttonlara tag-larına göre tıklaya bilecekmiyim..

Tekrar teşekkürler..
Sonuç nedir tam anlayamadım çözdünüz mü nasıl çözdünüz vs. :)
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen RADCoder »

Güzel bir soru Barış kardeşim. Olay şu, ben yazdığım kodda Button1-e tıkladığımda
bana şöyle bir hata çıkartıyordu : "invalid class typecast"

Kodu @bulutsuzluk_35 arkadaşın şöylediği gibi değiştirince:

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
   AButton.MyOnclick(AButton);  
end; 
Hata gitdi ve Create etdiyim button-u Button1-den tıklamış oldum.
Fakat birden fazla button olunca ve button sayılarını for ile çoğaltdığım için for-un durduğu index-i hafızada tutuyor.
Anlaycağınız 5 tane Button Create etmişsem ve ikinci buttonun text-ne birşey yazmak istersemde hep en son index numaralı buttona yani 5-ci Buttona yazar.
Şu anda o sorunu çözmeye çalışıyorum..

Her türlü fikre açığım :)
Yardımlarınız için teşekkürler..
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen bulutsuzluk_35 »

fikir verir...
for i:=0 to Form1.componentcount - 1 do begin
if component = TAButton then
case TAButton(components).tag) of
0:TAButton(components).caption := '0 nolu taga sahip buton'
..
..

end;

end;

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen barisatalay »

Basit bir öğrenci mantığı önereyim 8)

Sonuç olarak Her butonun Name propertysi eşsiz bi isimdir dimi. Misal taga yazmak yerine AButton1 AButton2 diye gittiğini varsayıyorum

FindComponent gibi bir fonksiyon vardı FindComponent('AButton'+AradığınIndex); direk sana o butonu verecektir diye düşünmekteyim.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen thelvaci »

Açıkçası ne yapmak istediğiniz pek net değil. Bu bağlamda gördüğüm bazı hususları dile getireyim istedim. Gördüğüm kadarı ile TButton standart VCL sınıfından miras aldığınız bir sınıfınız var ve bu sınıfın içinde bir metod tanımlamışsınız, MyOnClick isminde. Bunu neden yaptınız pek anlamlandıramadım. Eğer, oluşturacağınız tüm button'lar aynı kod'u çalıştıracak ise; -ki örnekte görünen o- bu durumda, TControl sınıfından itibaren gelen Click metodunu ilgili button sınıfınızda override etmek sizin için yeterli olacaktır.

İkinci bir husus; button'unuzu create ettiğiniz kod bloğunda try..except kısmında; button'unuzu try bloğunun içinde oluşturuyorsunuz ve except bölümünde ise free ediyorsunuz. Ancak, ilgili sınıfın contructor'un da bir hata olursa henüz oluşturulmamış bir nesneyi free etmeye çalışıyorsunuz anlamına gelir. Bu tarz durumlardan kaçınmak adına, her zaman oluşturacağınız nesneyi try bloğunun dışında oluşturmalısınız; try..finally bloğunun finally kısmında da işiniz bittiğinde free etmelisiniz.

Ayrıca; formun üzerinde zaten bulunan bir button'a tıkladığınızda kendi oluşturduğunuz button'lardan hangisinin click olayının tetiklenmesi gerektiğini ifade etmemişsiniz.

Örnek bir kullanım:

Kod: Tümünü seç

var
  iCounter : Integer;
begin
  for iCounter := 0 to FormX.ComponentCount - 1 do
    if FormX.Components[iCounter] is TSizinButton then
      if TSizinButton(FormX.Components[iCounter]).Tag = AradiginizKriter then
        TSizinButton(FormX.Components[iCounter]).Click;
end;
gibi bir kod kullanabilirsiniz. Tabii tam olarak yapmak istediğinizin bu olup olmadığından emin değilim.
Kullanıcı avatarı
badkursat
Üye
Mesajlar: 84
Kayıt: 03 Mar 2014 08:58

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen badkursat »

Deneme amacıyla küçük bir uygulama yaptım isteğini karşılarmı bilmiyorum. Fikir olması açısından yararlı olacağını düşünüyorum. Buttona tıkladığında formunda OnClick olayı senin tıkladığın buttonun OnClick olayına eşitleniyor. Forma tıkladığında en son tıkladığın buttonun Onclick olayı tetikleniyor. Eğer Forma tıkladğında istediğin buttonun OnClick olayı tetiklensin istiyosan Form'un Oclick Olayına TForm.FindComponent methodu ile butonun Name'ini verip TForm.OnClick=TForm.FindComponent('MyButton.Name').DoOnClick yapabilirsin.

Resim

Bütün Dökümantayonlar
https://yadi.sk/d/pKh1G-0egqjsL
Kullanıcı avatarı
RADCoder
Üye
Mesajlar: 129
Kayıt: 21 Ara 2013 04:03

Re: Button oluşturup Müdahele etmek.

Mesaj gönderen RADCoder »

Herkese yardımlarından dolayı, çok ama çok teşekkür ederim.
Allah hepinizden razı olsun.
thelvaci yazdı:Açıkçası ne yapmak istediğiniz pek net değil. Bu bağlamda gördüğüm bazı hususları dile getireyim istedim. Gördüğüm kadarı ile TButton standart VCL sınıfından miras aldığınız bir sınıfınız var ve bu sınıfın içinde bir metod tanımlamışsınız, MyOnClick isminde. Bunu neden yaptınız pek anlamlandıramadım. Eğer, oluşturacağınız tüm button'lar aynı kod'u çalıştıracak ise; -ki örnekte görünen o- bu durumda, TControl sınıfından itibaren gelen Click metodunu ilgili button sınıfınızda override etmek sizin için yeterli olacaktır.

İkinci bir husus; button'unuzu create ettiğiniz kod bloğunda try..except kısmında; button'unuzu try bloğunun içinde oluşturuyorsunuz ve except bölümünde ise free ediyorsunuz. Ancak, ilgili sınıfın contructor'un da bir hata olursa henüz oluşturulmamış bir nesneyi free etmeye çalışıyorsunuz anlamına gelir. Bu tarz durumlardan kaçınmak adına, her zaman oluşturacağınız nesneyi try bloğunun dışında oluşturmalısınız; try..finally bloğunun finally kısmında da işiniz bittiğinde free etmelisiniz.
@Tuğrul Helvacı Hocam verdiyim kodu aslında örnek acısında yazmışdım yalnışım ola bilir,
verdiğiniz güzel tavsiyeler ve bilgiler için minnetdarım size.

Bu işlemi yapma sebebim otomotik create edilen button-lara diğer formlardan müdahile ede bilmekti.
Verilen örnekler istediyim şeyi yaptı.


Tekrar Teşekkürler, herkese Allah kolaylık versin..
Cevapla