OrangeUI SkinFMXDBGrid'te herhangi bir field'e satıra resim ekleme işlemi için aşağıdaki işlemi uygulayarak ekleye biliyorum, fakat her satırda aynı resim geliyor her satırda istediğim resmi nasıl getirebilirim.
Formadaki SkinFMXDBGrid ile birlikte SkinFMXItemDesignerPanel ekleyip içerisine SkinFMXImage nesnesi ekleyip sonrada SkinFMXDBGrid ilgili fields gelip ItemDesignerPanel'i seçiyorum. Böylelikle tek resim olarak tüm satırlarda aynı resim gözükmüş oluyor, fakat ben belirli şartlara göre farklı resimlerin gelmesini istiyorum bunu nasıl yapabilirim, kendi örneklerinde de bulamadım.
Designer içinde yer alan bileşenlerin özelliklerini duruma göre değiştirebilirsiniz, OnPrepareDrawItem eventini kullanarak. (uses bölümüne uDrawCanvas, uSkinItems eklenmeli)
Örnek; (burda label ve butonun özelliklerini değiştirdim fakat SkinFMXImage nesnesinin de özellikleri aynı şekilde değiştirilebilir, örneğin SkinFMXImage1.Prop.Picture.SkinImageList atanmış ise SkinFMXImage1.Prop.Picture.ImageIndex istenilen şartlara göre değiştirilebilir)
procedure TForm28.SkinFMXListBox1PrepareDrawItem(Sender: TObject;
ACanvas: TDrawCanvas; AItemDesignerPanel: TSkinFMXItemDesignerPanel;
AItem: TSkinItem; AItemDrawRect: TRect);
begin
SkinFMXListBox1.BeginUpdate;
if AItem.Detail='EASY' then
begin
l_duel_zorluk_taban.Material.BackColor.FillColor.Color:=$FF27BA27; //YEŞİL
b_duel_accept.enabled:=true;
end;
if AItem.Detail='HARD' then
begin
l_duel_zorluk_taban.Material.BackColor.FillColor.Color:=$FFE1442B; //KIRMIZI
b_duel_accept.enabled:=true;
end;
if AItem.Detail='MASTER' then
begin
l_duel_zorluk_taban.Material.BackColor.FillColor.Color:=$FF8A2BE1; //MOR
b_duel_accept.enabled:=FALSE;
end;
SkinFMXListBox1.EndUpdate;
end;
(12-03-2020, Saat: 14:23)egeven Adlı Kullanıcıdan Alıntı: Merhaba,
Designer içinde yer alan bileşenlerin özelliklerini duruma göre değiştirebilirsiniz, OnPrepareDrawItem eventini kullanarak. (uses bölümüne uDrawCanvas, uSkinItems eklenmeli)
Örnek; (burda label ve butonun özelliklerini değiştirdim fakat SkinFMXImage nesnesinin de özellikleri aynı şekilde değiştirilebilir, örneğin SkinFMXImage1.Prop.Picture.SkinImageList atanmış ise SkinFMXImage1.Prop.Picture.ImageIndex istenilen şartlara göre değiştirilebilir)
procedure TForm28.SkinFMXListBox1PrepareDrawItem(Sender: TObject;
ACanvas: TDrawCanvas; AItemDesignerPanel: TSkinFMXItemDesignerPanel;
AItem: TSkinItem; AItemDrawRect: TRect);
begin
SkinFMXListBox1.BeginUpdate;
if AItem.Detail='EASY' then
begin
l_duel_zorluk_taban.Material.BackColor.FillColor.Color:=$FF27BA27; //YEŞİL
b_duel_accept.enabled:=true;
end;
if AItem.Detail='HARD' then
begin
l_duel_zorluk_taban.Material.BackColor.FillColor.Color:=$FFE1442B; //KIRMIZI
b_duel_accept.enabled:=true;
end;
if AItem.Detail='MASTER' then
begin
l_duel_zorluk_taban.Material.BackColor.FillColor.Color:=$FF8A2BE1; //MOR
b_duel_accept.enabled:=FALSE;
end;
SkinFMXListBox1.EndUpdate;
end;
Sonuç;
Cevap için teşekkür ederim. Evet SkinFMXDBGrid'te bu olay varmış. AItem ile nesneye nasıl ulaşabileceğimi inceleyip bulduğumda çözümü yazacağım.
AItem ile image bileşeninin bağlantılı olmasına ihtiyaç yok, OnPrepareDrawItem eyleminde designer içinde yer alan tüm bileşenlere erişebilirsiniz (bileşenler Binding yapılmamış olsalar dahi)
örneğin 10 kayıtlı bir listeniz var, ilk kayıtta 1 numaralı resmi geri kalan 9 kayıtta 2 numaralı resmi göstersin isteyelim, designer içerisine 1 adet SkinFMXImage bileşeni ekleyin herhangi bir binding işlemi yapmayın sadece SkinImageList atamasını yapın (bu örnekte imagelist kullanılıyor farklı yollarla image yüklenebilir, dosyadan veya urlden)
OnPrepareDrawItem içinde bu şekilde yapabilirsiniz, AItem yalnızca şartlarınızı oluşturmanız için gerekli
if AItem.Index=0 then
begin
SkinFMXImage1.Prop.Picture.ImageIndex:=1;
end else
begin
SkinFMXImage1.Prop.Picture.ImageIndex:=2;
end;
(12-03-2020, Saat: 20:18)egeven Adlı Kullanıcıdan Alıntı: AItem ile image bileşeninin bağlantılı olmasına ihtiyaç yok, OnPrepareDrawItem eyleminde designer içinde yer alan tüm bileşenlere erişebilirsiniz (bileşenler Binding yapılmamış olsalar dahi)
örneğin 10 kayıtlı bir listeniz var, ilk kayıtta 1 numaralı resmi geri kalan 9 kayıtta 2 numaralı resmi göstersin isteyelim, designer içerisine 1 adet SkinFMXImage bileşeni ekleyin herhangi bir binding işlemi yapmayın sadece SkinImageList atamasını yapın (bu örnekte imagelist kullanılıyor farklı yollarla image yüklenebilir, dosyadan veya urlden)
OnPrepareDrawItem içinde bu şekilde yapabilirsiniz, AItem yalnızca şartlarınızı oluşturmanız için gerekli
if AItem.Index=0 then
begin
SkinFMXImage1.Prop.Picture.ImageIndex:=1;
end else
begin
SkinFMXImage1.Prop.Picture.ImageIndex:=2;
end;
Paylaşım için teşekkürler, yeni bir şey öğrenmiş olduk.
Bu işlemi yaparken sadece şu ilginç geldi;
5 Kayıt olan bir tablo (grid) için gridListPrepareDrawItem olayına yukarıdaki kod yazdığımda alt kısımda Memo1.Lines.Add (AItem.Index.ToString); 0,1,2,3,4,5 şeklinde 2886 satır kayıt ekliyor performans açısında sakıncalı değil mi.
(13-03-2020, Saat: 10:37)pro_imaj Adlı Kullanıcıdan Alıntı:
(12-03-2020, Saat: 20:18)egeven Adlı Kullanıcıdan Alıntı: AItem ile image bileşeninin bağlantılı olmasına ihtiyaç yok, OnPrepareDrawItem eyleminde designer içinde yer alan tüm bileşenlere erişebilirsiniz (bileşenler Binding yapılmamış olsalar dahi)
örneğin 10 kayıtlı bir listeniz var, ilk kayıtta 1 numaralı resmi geri kalan 9 kayıtta 2 numaralı resmi göstersin isteyelim, designer içerisine 1 adet SkinFMXImage bileşeni ekleyin herhangi bir binding işlemi yapmayın sadece SkinImageList atamasını yapın (bu örnekte imagelist kullanılıyor farklı yollarla image yüklenebilir, dosyadan veya urlden)
OnPrepareDrawItem içinde bu şekilde yapabilirsiniz, AItem yalnızca şartlarınızı oluşturmanız için gerekli
if AItem.Index=0 then
begin
SkinFMXImage1.Prop.Picture.ImageIndex:=1;
end else
begin
SkinFMXImage1.Prop.Picture.ImageIndex:=2;
end;
Paylaşım için teşekkürler, yeni bir şey öğrenmiş olduk.
Bu işlemi yaparken sadece şu ilginç geldi;
5 Kayıt olan bir tablo (grid) için gridListPrepareDrawItem olayına yukarıdaki kod yazdığımda alt kısımda Memo1.Lines.Add (AItem.Index.ToString); 0,1,2,3,4,5 şeklinde 2886 satır kayıt ekliyor performans açısında sakıncalı değil mi.
Teşekkürler. PrepareDrawItem çok fazla çalışıyor, içerisindeki kodları BeginUpdate - EndUpdate içerisine aldığımda gözle görülür performans düşüşü yaşamadım (100 kayıtlı liste mobilde hızlı bir şekilde scroll yapabiliyor) fakat bu kadar fazla çalışmasının başka zararları var mı bilmiyorum
(13-03-2020, Saat: 12:58)egeven Adlı Kullanıcıdan Alıntı:
(13-03-2020, Saat: 10:37)pro_imaj Adlı Kullanıcıdan Alıntı: Paylaşım için teşekkürler, yeni bir şey öğrenmiş olduk.
Bu işlemi yaparken sadece şu ilginç geldi;
5 Kayıt olan bir tablo (grid) için gridListPrepareDrawItem olayına yukarıdaki kod yazdığımda alt kısımda Memo1.Lines.Add (AItem.Index.ToString); 0,1,2,3,4,5 şeklinde 2886 satır kayıt ekliyor performans açısında sakıncalı değil mi.
Teşekkürler. PrepareDrawItem çok fazla çalışıyor, içerisindeki kodları BeginUpdate - EndUpdate içerisine aldığımda gözle görülür performans düşüşü yaşamadım (100 kayıtlı liste mobilde hızlı bir şekilde scroll yapabiliyor) fakat bu kadar fazla çalışmasının başka zararları var mı bilmiyorum
gridListPrepareDrawItem olayında işlem yaparken grid'in bağlı olduğu tablodaki veriye nasıl ulaşabilirim, yani; Tablodaki ilgili satırdaki değer 1 ise şu resmi göster 2 ise şu resmi göster demek istiyorum.
*Listbox gibi Item tag özelliği olmadığından erişemiyorum.
(13-03-2020, Saat: 14:13)pro_imaj Adlı Kullanıcıdan Alıntı:
(13-03-2020, Saat: 12:58)egeven Adlı Kullanıcıdan Alıntı: Teşekkürler. PrepareDrawItem çok fazla çalışıyor, içerisindeki kodları BeginUpdate - EndUpdate içerisine aldığımda gözle görülür performans düşüşü yaşamadım (100 kayıtlı liste mobilde hızlı bir şekilde scroll yapabiliyor) fakat bu kadar fazla çalışmasının başka zararları var mı bilmiyorum
gridListPrepareDrawItem olayında işlem yaparken grid'in bağlı olduğu tablodaki veriye nasıl ulaşabilirim, yani; Tablodaki ilgili satırdaki değer 1 ise şu resmi göster 2 ise şu resmi göster demek istiyorum.
*Listbox gibi Item tag özelliği olmadığından erişemiyorum.
Yaklaşım tarzınız hücre değeri şu ise şu resmi göster olmalı. Burada her veri bir hücre olduğu için tag ile işlem yapılamaz bence.
O anda işlem gören aktif kaydın (record no, col index gibi) değerine göre kontrol yapmalısınız
(13-03-2020, Saat: 15:13)RAD Student Adlı Kullanıcıdan Alıntı:
(13-03-2020, Saat: 14:13)pro_imaj Adlı Kullanıcıdan Alıntı: gridListPrepareDrawItem olayında işlem yaparken grid'in bağlı olduğu tablodaki veriye nasıl ulaşabilirim, yani; Tablodaki ilgili satırdaki değer 1 ise şu resmi göster 2 ise şu resmi göster demek istiyorum.
*Listbox gibi Item tag özelliği olmadığından erişemiyorum.
Yaklaşım tarzınız hücre değeri şu ise şu resmi göster olmalı. Burada her veri bir hücre olduğu için tag ile işlem yapılamaz bence.
O anda işlem gören aktif kaydın (record no, col index gibi) değerine göre kontrol yapmalısınız
Bunu biliyoruz zaten. Sorun; gridListPrepareDrawItem olayında aktif kayıda erişememek!
Bu konuyu çözemedim, ekli dosya olarak basit bir örnek ekledim, aklına bir fikir gelen olursa paylaşırsa memnun olurum.
*Ülke sıraları belli diye direk işlem yaparak değilde veri tabanında ülke adı 'Turkey' ise Türk bayrağı şeklinde yapmaya çalışıyorum.
*Örnek kaynak dosyalar ektedir.