ListView Image Değiştirme

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Cevapla
Kullanıcı avatarı
TRSoft
Kıdemli Üye
Mesajlar: 636
Kayıt: 13 Şub 2004 11:39
Konum: Konya
İletişim:

ListView Image Değiştirme

Mesaj gönderen TRSoft »

Arkadaşlar merhaba;

Listviewe aşağıdaki kod ile satırlar oluşturuyorum

Kod: Tümünü seç

Procedure ObjectOlustur(AItem: TListViewItem; LItem: TListItemText; strRefKod, strText: String;
  iOffsetX, iOffsetY, iWidth, iHeight, iFontSize: Integer; iFontColor: LongInt; iTextAlign: TTextAlign; iFontStyle: String);
begin
  LItem := TListItemText.Create(AItem);
  LItem.Name := strRefKod;
  LItem.Font.Size := iFontSize;
  LItem.TextColor := iFontColor;
  LItem.Align := TListItemAlign.Leading; // En Sol
  LItem.VertAlign := TListItemAlign.Leading; // En Üst
  LItem.PlaceOffset.X := iOffsetX;
  LItem.PlaceOffset.Y := iOffsetY;
  LItem.TextAlign := iTextAlign;
  LItem.Trimming := TTextTrimming.ttCharacter;
  LItem.IsDetailText := False;
  LItem.Width := iWidth;
  LItem.Height := iHeight;
  LItem.Text := strText;
  if iFontStyle = 'K' then
    LItem.Font.Style := LItem.Font.Style + [TFontStyle.fsBold];
end;

Procedure ResimOlustur(AItem: TListViewItem; LImage: TListItemImage; Tip: String);
Begin
  LImage := TListItemImage.Create(AItem);
  LImage.Name := 'Resim';
  LImage.Align := TListItemAlign.Trailing; // En Sağ
  LImage.VertAlign := TListItemAlign.Center; // Orta
  LImage.PlaceOffset.Y := 0;
  LImage.PlaceOffset.X := 0;
  LImage.Width := 30;
  LImage.Height := 16;
  LImage.OwnsBitmap := True;
  LImage.Bitmap := TBitmap.Create(0, 0);
  if Tip = '0' then
    Limage.Bitmap := DovizForm.ImageYan.Bitmap;
  if Tip = '1' then
    Limage.Bitmap := DovizForm.ImageUst.Bitmap;
  if Tip = '2' then
    Limage.Bitmap := DovizForm.ImageAlt.Bitmap;
End;

Procedure SaatOlustur(AItem: TListViewItem; LImage: TListItemImage);
Begin
  LImage := TListItemImage.Create(AItem);
  LImage.Name := 'Saat';
  LImage.Align := TListItemAlign.Leading; // En Sağ
  LImage.VertAlign := TListItemAlign.Center; // Orta
  LImage.PlaceOffset.Y := 9;
  LImage.PlaceOffset.X := 4;
  LImage.Width := 14;
  LImage.Height := 14;
  LImage.OwnsBitmap := True;
  LImage.Bitmap := TBitmap.Create(0, 0);
  Limage.Bitmap := DovizForm.ImageSaat.Bitmap;
End;

Procedure ZeminOlustur(AItem: TListViewItem);
Var
  LImage: TListItemImage;
begin
  LImage := TListItemImage.Create(AItem);
  LImage.Name := 'Zemin';
  LImage.Align := TListItemAlign.Trailing; // En Sağ
  LImage.VertAlign := TListItemAlign.Center; // Orta
  LImage.PlaceOffset.Y := 0;
  LImage.PlaceOffset.X := 0;
  LImage.Width := DovizForm.ListView1.Width;
  LImage.Height := 40;
  LImage.OwnsBitmap := True;
  LImage.Bitmap := TBitmap.Create(0, 0);
  Limage.Bitmap := DovizForm.ImageList.Bitmap;
end;

procedure TDovizForm.FormCreate(Sender: TObject);
Var
  AItem: TListViewItem;
  AlisLabel, SatisLabel, SaatLabel, LLabel1: TListItemText;
  SaatImage, LImage: TListItemImage;
  i: Integer;
begin
  ListView1.ClearItems;
  Resimx := 1;
  for I := 1 to 11 do
  Begin
    AItem := ListView1.Items.Add;
    AItem.Height := 40;
    AItem.Text := '';
    ZeminOlustur(AItem);
    ObjectOlustur(AItem, LLabel1, 'Bas1', Kurlar[i], 4, 5, 90, 20, 14, TAlphaColorrec.Black, TTextAlign.Leading, '');
    ObjectOlustur(AItem, SaatLabel, 'Saat', '00:00:00', 19, 25, 90, 20, 10, TAlphaColorrec.Black, TTextAlign.Leading, '');
    ObjectOlustur(AItem, LLabel1, 'Data1', 'Alış', 100, 15, 85, 20, 9, TAlphaColorrec.Deepskyblue, TTextAlign.Leading, '');
    ObjectOlustur(AItem, AlisLabel, 'Alis', '0,0000', 100, 10, 75, 20, 16, TAlphaColorrec.Black, TTextAlign.Trailing, 'K');
    ObjectOlustur(AItem, LLabel1, 'Data2', 'Satış', 190, 15, 80, 20, 9, TAlphaColorrec.Deepskyblue, TTextAlign.Leading, '');
    ObjectOlustur(AItem, SatisLabel, 'Satis', '0,0000', 190, 10, 75, 20, 16, TAlphaColorrec.Black, TTextAlign.Trailing, 'K');
    ResimOlustur(AItem, LImage, '0');
    SaatOlustur(AItem, SaatImage);
  End;
end;
Buraya kadar sıkıntı yok. Ancak her 5-10 saniyede bir JSON ile veri çekerek değerleri değiştirmem gerekiyor..Text alanlarda sıkıntı yok ama resmi değiştirmek için aşağıdaki kodu kullanıyorum. İlk seferde sorun yok ama ikinci seferde "Access Violation" hatası alıyorum..

Kod: Tümünü seç

(ListView1.Items.Item[i].Objects.FindObject('Resim') as TListItemImage).Bitmap := AltinForm.ImageYan.Bitmap;
Değiştirmeye çalıştığım sağdaki oklar
Resim
İlimle geçen bir gece,
ibadetle geçen bin geceden hayırlıdır.
HZ. MUHAMMED (S.A.)
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: ListView Image Değiştirme

Mesaj gönderen barisatalay »

Selamlar,
Ekte sizin kodlarınız ile birşeyler derlemeye calıstım pek ugraşamadım ama mantığını anlayabilirsiniz belki.

Olay listviewin itemine tıklayınca olacak şekilde ayarlandı.

Edit: Yaptığımı biraz anlatayım.

Örnekteki projede ilk yüklenen resimin adına "Up" dedim ve yukarı oku ekledi her tıklandığında o işlemden sonra tabi burada sonra dediğim sana kalmış hangi resmi eklemesini istiyorsan if AItem.name = ''Up then olarak kontrol ettirdim ve içeriğinde yeni resimi bu objeye assigned ettim sonrasında yeni resimin adını bu AItem.Name olarak atadım ki hangi resmin içeriye yüklendiğini bilmek için.
Dosya ekleri
OrnekListview.rar
(42.33 KiB) 179 kere indirildi
En son barisatalay tarafından 04 Nis 2015 08:49 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView Image Değiştirme

Mesaj gönderen mrmarman »

Merhaba.

- En baştan hatalı yaklaşımda bulunulmuş.
- Bitmap'leri biribirne eşitlediğinizde içeriğinden ziyade nesnel bütününü birbirine bağlamış, ilişkilendirmiş oluyorsunuz. Yani bir sürahinin içindeki suyu başka bir sürahiye aktarmak yerine, sürahinin bizzat kendisini de taşımak istemişsiniz.

- Bunu böyle yapmayıp Limage.Bitmap.Assign( DovizForm.ImageYan.Bitmap ); gibisinden ASSIGN ile kullansaydınız ki öyle kullanacak şekilde kodlarınızı güncelleyin göreceksiniz, aynı bir sürahideki suyu diğerine aktarmışçasına içeriği aktarırsınız. Sürahi kalsın olduğu yerde. Yarın yine lazım olur :D
Resim
Resim ....Resim
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: ListView Image Değiştirme

Mesaj gönderen barisatalay »

Aynı bahsettiklerinizi bende fark ettim attığım örnekde assign olarak yapmıştım :D
mrmarman yazdı:Merhaba.

- En baştan hatalı yaklaşımda bulunulmuş.
- Bitmap'leri biribirne eşitlediğinizde içeriğinden ziyade nesnel bütününü birbirine bağlamış, ilişkilendirmiş oluyorsunuz. Yani bir sürahinin içindeki suyu başka bir sürahiye aktarmak yerine, sürahinin bizzat kendisini de taşımak istemişsiniz.

- Bunu böyle yapmayıp Limage.Bitmap.Assign( DovizForm.ImageYan.Bitmap ); gibisinden ASSIGN ile kullansaydınız ki öyle kullanacak şekilde kodlarınızı güncelleyin göreceksiniz, aynı bir sürahideki suyu diğerine aktarmışçasına içeriği aktarırsınız. Sürahi kalsın olduğu yerde. Yarın yine lazım olur :D
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: ListView Image Değiştirme

Mesaj gönderen mrmarman »

Ben de üşengeçlik edecek zaman bulmuşum değil mi :) Kodlar içinde öyle görünce seninkini indirip bakma zahmetine girmemişim...

Verdiğin örneğe ilişkin yaptığın değişikliğe veya uygulama farklılığına ilişkin bir açıklama eklemen de faydalı olurmuş ama aklın yolu bir.
Resim
Resim ....Resim
Kullanıcı avatarı
TRSoft
Kıdemli Üye
Mesajlar: 636
Kayıt: 13 Şub 2004 11:39
Konum: Konya
İletişim:

Re: ListView Image Değiştirme

Mesaj gönderen TRSoft »

@mrmarman hocam @barisatatlayın gönderdiği kodları görür görmez hata yaptığımı anladım. Ama bazen insanın gözü görmüyor, takılıp kalıyorsunuz. İnşallah sürahileri kırmam :)

Teşekkür ederim arkadaşlar....
En son TRSoft tarafından 04 Nis 2015 08:50 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
İlimle geçen bir gece,
ibadetle geçen bin geceden hayırlıdır.
HZ. MUHAMMED (S.A.)
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: ListView Image Değiştirme

Mesaj gönderen barisatalay »

mrmarman yazdı:Ben de üşengeçlik edecek zaman bulmuşum değil mi :) Kodlar içinde öyle görünce seninkini indirip bakma zahmetine girmemişim...

Verdiğin örneğe ilişkin yaptığın değişikliğe veya uygulama farklılığına ilişkin bir açıklama eklemen de faydalı olurmuş ama aklın yolu bir.
Hemen kendi çapımda açıklama ekledim edit olarak :D
beklentili
Üye
Mesajlar: 86
Kayıt: 21 Ara 2013 09:05
İletişim:

Re: ListView Image Değiştirme

Mesaj gönderen beklentili »

Merhaba, bende Androidde bu TListItemImage ile sorun yaşıyorum. Şöyle ki listview de item oluşturup içerisine indirilen resmi yerleştiriyorum.
Resim yerleştirmede ve resim indirmede bir sorun yok lakin iteme yüklenen resim ancak formun veya listview'in herhangi bir yerine tıklandığında gösteriliyor.
Yani resim iteme yükleniyor ancak gösterilmiyor.

Kullandığım kod aşağıdadır. Yardımlarınız için şimdiden sağolun.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  AItem   : TListViewItem;
  LImage : TListItemImage;
begin

    ListView1.Items.BeginUpdate;

    AItem := ListView1.Items.Add;
    AItem.Height := 90;
    AItem.Text   := 'Selam';


    LImage                  := TListItemImage.Create(AItem_ilan_yukleme);
    LImage.Name             := 'Resim_ilan';
    LImage.Align            := TListItemAlign.Leading;  
    LImage.VertAlign        := TListItemAlign.Center;   
    LImage.PlaceOffset.Y    := 0;
    LImage.PlaceOffset.X    := -18;
    LImage.Width            := 115;
    LImage.Height           := 120;
    LImage.OwnsBitmap       := False;
    LImage.Bitmap           := TBitmap.Create(0, 0);




//Bu resim indirme componentinin arkda kısmında LImage nesnesine resmi yüklettiriyorum
IM.LoadImage(LImage, 'http://www.google.com/images/errors/robot.png');

  ListView1.Items.EndUpdate;
     end;
[/size]http://www.componentler.com | Türkçe component sitesi
Cevapla