Mysql den bilgileri php ile çekip okuyabiliyorum.
Bir tane GridLayout um var.
İçinde de bir tane Layout var.
Onun içindede TImage ve Label var.
Bu son Layout un tasarımını yapıyorum. Text özelliklerini ayarlıyorum. OnClick eventi ile fonksiyon çağırıyorum.
Sonra da for döngüsü ile Php den aldığım verilere göre Layout u clonlayıp GridLayout a ekliyorum.
Buraya kadar herşey normal. Ancak OnClick eventi sadece son kayıtta çalışıyor. Önceki nesneler tıklanabiliyor ama OnClick çalışmıyor.
Kullandığım yöntem yanlış mı? Nerede hata yapıyorum?
Merhaba,
Kodları görmeden nerede, nasıl bir hata yaptığınızı biz de bilemeyiz.
Tahminimce dinamik olarak oluşturduğunuz
Layout'un OnClick Event'ını set etmemiş olabilirsiniz.
Olması gereken kod yapısına örnek verecek olursak:
var
lytPHP:TLayout;
imgPHP:TImage;
lblPHP:TLabel;
begin
lytPHP:=TLayout.Create(GridLayout1);
imgPHP:=TImage.Create(lytPHP);
lblPHP:=TLabel.Create(lytPHP);
try
lblPHP.Align:=TAlignLayout.Top;
imgPHP.Align:=TAlignLayout.Client;
lblPHP.HitTest:=False;
imgPHP.HitTest:=False;
lytPHP.OnClick:=lytOnClick;
// .... Diğer kodlarınız
(02-11-2017, Saat: 15:42)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: [ -> ]Merhaba,
Kodları görmeden nerede, nasıl bir hata yaptığınızı biz de bilemeyiz.
Tahminimce dinamik olarak oluşturduğunuz Layout'un OnClick Event'ını set etmemiş olabilirsiniz.
Olması gereken kod yapısına örnek verecek olursak:
var
lytPHP:TLayout;
imgPHP:TImage;
lblPHP:TLabel;
begin
lytPHP:=TLayout.Create(GridLayout1);
imgPHP:=TImage.Create(lytPHP);
lblPHP:=TLabel.Create(lytPHP);
try
lblPHP.Align:=TAlignLayout.Top;
imgPHP.Align:=TAlignLayout.Client;
lblPHP.HitTest:=False;
imgPHP.HitTest:=False;
lytPHP.OnClick:=lytOnClick;
// .... Diğer kodlarınız
HitTestleri her türlü denedim. OnClick tanımlı. Biraz karışık olacak ama hızlı bir şekilde göndermek için olduğu gibi kopyaladım kodların ilgili bölümünü.
// glSb GridLayout
// lg Layoutu içinde yer alan bir tane TRectangle var. Adı imgLogoSube. OnClick eventini onun içine yazıyorum.
procedure TfMain.SubeListele;
var i,j:Integer;
lg:TLayout;
ls:TLabel;
begin
for i:= 0 to XMLSubeler.ChildNodes['blg'].ChildNodes.Count-1 do
begin
lg := lySbItem.Clone(Owner) as TLayout;
// Alttaki kodlar çalışıyor. Yani lg kopyalanıyor ve label,logo filan gelen veriye göre değişiyor.
lblSubeBaslik.Text := XMLSubeler.ChildNodes['blg'].ChildNodes[i].ChildNodes['subeAdi'].NodeValue;
imgLogoSube.Fill.Bitmap.Bitmap := resimGoster(hostAdres + 'pr/' + XMLSubeler.ChildNodes['blg'].ChildNodes[i].ChildNodes['subeLogoThumb'].NodeValue);
lblSubeIndex.Text := XMLSubeler.ChildNodes['blg'].ChildNodes[i].ChildNodes['sid'].NodeValue;
imgLogoSube.OnClick := Button1Click;
glSb.AddObject(lg);
lg.Index := i; // Indexleri düzenle
end;
// İlk temel nesneyi sil
glSb.RemoveObject(0);
end;
Kodlarınızda bir sorun yok gibi görünüyor.
lg := lySbItem.Clone(Owner) as TLayout;
Satırında mantıksal bir sorun (Clone metodunda) olabilir diye düşünüyorum. Bu metod yerine her nesneyi dinamik olarak oluşturup, kodu yeniden test edin.
(02-11-2017, Saat: 16:09)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: [ -> ]Kodlarınızda bir sorun yok gibi görünüyor.
lg := lySbItem.Clone(Owner) as TLayout;
Satırında mantıksal bir sorun (Clone metodunda) olabilir diye düşünüyorum. Bu metod yerine her nesneyi dinamik olarak oluşturup, kodu yeniden test edin.
Bunu kullanmamın nedeni, ilk nesneyi görsel olarak tasarlayıp ayarlarını yaptıktan sonra, kod bölümünde tekrardan font,size,align gibi özelliklerle uğraşmamak.
Dediğiniz gibi deneyeceğim. O şekilde çalışırsa artık bu mantıktan mecburen vazgeçmem gerekecek.
Layoutu olduğu gibi klonlayabilsem çok iyi olacaktı.
imgLogoSube, lySbItem içinde bir kontrol mü ? Eğer öyle ise klonladığınız kontrol'ün içindeki image nesnesi artık imgLogoSube değil. Klonladığınız layout içinde ilgili kontrolü bulup onun OnClick metoduna atama yapmalısınız.
Clone'lama hiç kullanmadım. Doğrusu ilk defa görüyorum. Kafama takılan kısmı:
Tamam lySbItem'ı klonladınız ama onun içindeki bileşenlere erişim nasıl olacak? Yani imgLogoSube'de değişiklik yapınca hangisine uygulamış oluyorsunuz. Sonuçta aynı isimde tek bir bileşen olabilir.
(02-11-2017, Saat: 16:20)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: [ -> ]imgLogoSube, lySbItem içinde bir kontrol mü ? Eğer öyle ise klonladığınız kontrol'ün içindeki image nesnesi artık imgLogoSube değil. Klonladığınız layout içinde ilgili kontrolü bulup onun OnClick metoduna atama yapmalısınız.
Evet. Ama beni günlerdir uğraştıran mantık hatası şu. imgLogoSube.Fill.Bitmap.Bitmap şeklinde kodladığım satır doğru çalışıyor. Şubenin resmini alıp doğru bir şekilde gösteriyor. Yine lySbItem içinde bir label var. Şube isimlerini doğru gösteriyor.
Sadece event çalışmıyor.
Dediğinizi yanlış anlamadıysam,
glSb.Controls.Items[0] şeklinde ulaşıp OnClick eşitlemesini orada yapmam gerektiğini söylüyorsunuz. Onu da denemiştim. Sonuç aynı.
(02-11-2017, Saat: 16:22)SimaWB Adlı Kullanıcıdan Alıntı: [ -> ]Clone'lama hiç kullanmadım. Doğrusu ilk defa görüyorum. Kafama takılan kısmı:
Tamam lySbItem'ı klonladınız ama onun içindeki bileşenlere erişim nasıl olacak? Yani imgLogoSube'de değişiklik yapınca hangisine uygulamış oluyorsunuz. Sonuçta aynı isimde tek bir bileşen olabilir.
For döngüsü içinde kullandığım için olabiliyor galiba. Ben de deneme yanılma ile gidiyorum şu an. Önce klonluyorum. Nesne isimleri aynı olduğu için label ve diğer nesnelerin özelliklerini değiştirebiliyorum. Sonra da GridLayout içine ekliyorum. Diğer elemana geçtiğinde öncekileri bozmamış oluyor. Name değerlerini değiştirerek de denedim. Sonuç aynı. Event çalışsa çok pratik bir yöntem olacak.
Sonunda çalıştı.
Kodlar aynı. Sadece for döngüsünün sonuna aşağıdaki kodları ekledim. Tuğrul beyin hatırlattığı nokta problemi çözdü.
lrct := glSb.Controls.Items[i].Controls.Items[2] as TRectangle;
lrct.OnClick := Button1Click;
Bu yöntemle Design modunda GridLayout içine bir Layout ekliyorum ve dizaynı yapıyorum. Sonra Layout u klonluyorum. Otomatikmen kayıtlar alt alta sıralanmış oluyor. En sonunda da ilk başta tasarladığım 1.Layoutu siliyorum.
Yardımlarınız için teşekkürler....