Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Veritabanından gelen bilgilerle GridLayout içine ekleme yapmak
#1
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?
Cevapla
#2
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
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#3
(02-11-2017, Saat: 15:42)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba,
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;
Cevapla
#4
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.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
(02-11-2017, Saat: 16:09)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlKodları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ı.
Cevapla
#6
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.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
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.
There's no place like 127.0.0.1
WWW
Cevapla
#8
(02-11-2017, Saat: 16:20)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlimgLogoSube, 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ı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlClone'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....
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Karakter ekleme dilo 1 25 8 saat önce
Son Yorum: hyperxman
Question Listview Edit Ekleme ve Button Yüksekliği Ayarı elixir84 11 377 22-05-2018, Saat: 21:51
Son Yorum: mcuyan
Question memo uzun veri ekleme sıkıntısı BY-HAYALET 4 286 06-04-2018, Saat: 17:04
Son Yorum: BY-HAYALET
  SDK Version Ekleme malitutuncu 1 245 26-01-2018, Saat: 12:50
Son Yorum: Fesih ARSLAN
  Uygulama arka plana geçince gelen hata abdullahcetinel 2 333 21-12-2017, Saat: 08:15
Son Yorum: Fesih ARSLAN



Konuyu Okuyanlar: 1 Ziyaretçi