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
Cevapla
#3
(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;
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.
Cevapla
#5
(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ı.
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ı: 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....
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Android Rehbere Kayıt Ekleme barissagir 6 444 04-04-2024, Saat: 09:36
Son Yorum: RAD Coder
  IOS SDK Ekleme Esnasında Yavaş Aktarım Sorunu Çözümü Mr.X 0 291 23-11-2023, Saat: 21:18
Son Yorum: Mr.X
Bug Fotoğraf Ekleme ve Düzenleme kajmerantime 5 660 29-09-2023, Saat: 11:29
Son Yorum: hi_selamlar
  SDK ekleme alanında ios simulator görünmüyor diseqc 1 472 11-05-2023, Saat: 20:43
Son Yorum: diseqc
  FCM Push Notification Resim Ekleme vedat33 0 536 15-12-2022, Saat: 13:56
Son Yorum: vedat33



Konuyu Okuyanlar: 1 Ziyaretçi