Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
ListView içinde veri saklamak
#1
ListView'de listeme yaparken her satırda görünenlerin dışında veri(Object) saklamak için bir yöntem:

Örneğin; listview'de kişi bilgilerini gösteriyoruz; Ad ve soyad. 
Fakat kişinin ayrıca Telefon ve Doğum Tarihi bilgileri de var. Bunları da her listview satırı içinde saklamalı ve gerektiğinde kullanmalıyım.
Bunun için TListItem'dan bir sınıf türetip gerekli bilgilerimizi tanıtmalıyız:
TKisi = class(TListItem)
  private
    FAd: string;
    FSoyad: string;
    FTarih: TDateTime;
    FTelefon: string;
  public
    property Ad: string read FAd write FAd;
    property Soyad: string read FSoyad write FSoyad;
    property Tarih: TDateTime read FTarih write FTarih;
    property Telefon: string read FTelefon write FTelefon;
  end;

Daha sonra Listview'ın OnCreateItemClass olayında yukarıdaki sınıfımızı tanıtmamız gerekiyor:
procedure TForm1.ListView1CreateItemClass(Sender: TCustomListView; var ItemClass: TListItemClass);
begin
 ItemClass := TKisi;
end;

Artık Listview'a ekleme yaparken ve okurken TKisi sınıfını kullanabilirim:
var
  kisi: TKisi;
begin
  kisi := TKisi(ListView1.Items.Add);
  kisi.Ad := 'adım';
  kisi.Soyad := 'soyadım';
  kisi.Telefon := '0123456789';
  kisi.Tarih := Now;
  kisi.Caption := kisi.Ad + ' ' + kisi.Soyad; // Caption'a ekranda görünmesini istediğim bilgileri yazıyorum

Sakladığımız verileri okumak:
Örneğin listview'e çift tıklandığında:
procedure TForm1.ListView1DblClick(Sender: TObject);
begin
  ShowMessage(TKisi(ListView1.Selected).Telefon);
end;

Bu kullanım şeklinin en büyük artısı: Sakladığım TKisi sınıfı verilerini Free etmekle uğraşmıyorum  Cool
There's no place like 127.0.0.1
WWW
Cevapla
#2
Necnelerin TAG özelliğine başka yöntemle bakış.. Elinize sağlık. Çok işime yarıyacak.
Cevapla
#3
Eline sağlık.
Cevapla
#4
Elinize sağlık. Zorlanıyordum bu tür durumlarda...
Cevapla
#5
ihtiyaç bir konu
Cevapla
#6
ilk yazıdaki kardeşimizin yöntemi hoş.
ama delfideki hemen her liste bileşeninde bu tür durumlar için DATA özelliği olabiliyor.
buraya oluşturduğunuz verinin referans adresini yazarsınız.

type
  TKisi = record
    Ad: string;
    Soyad: string;
    Tarih: TDateTime;
    Telefon: string;
  end;
  PKisi = ^TKisi;

procedure KisileriOlustur;
var
  Kisi: PKisi;
begin
  Kisi := new(PKisi);
  Kisi.Ad := "....";
  ....
  Liste[i].Data := Kisi;  
  //Listenin durumuna göre "pointer(Kisi), TObject(Kisi)" gibi şeyler de istenebilir.
end;

procedure KisileriSil;
begin
  Dispose(Liste[sira].Data);
  Liste[sira].Data:=nil;
end;
Cevapla
#7
(07-07-2018, Saat: 01:30)ssahinoglu Adlı Kullanıcıdan Alıntı:   Kisi := new(PKisi);
  
  Dispose(Liste[sira].Data);


Yukarıda Not kısmında da belirttiğim gibi; işte bu New ve Dispose'larla uğraşmamak için yukarıdaki yöntemden bahsetmek istemiştim Wink

Birilerinin işine yararsa ne mutlu bana....
There's no place like 127.0.0.1
WWW
Cevapla
#8
@SimaWB hocam bu konuyu fmx tarafında nasıl yapıyoruz createitem event mevcut değil.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#9
En kolayı TListViewItem'ın Data özelliği kullanılabilir diye düşünüyorum. Yukarıdaki gibi içerisinde Sınıf da saklanabilir diye tahmin ediyorum ama tecrübe etmedim.
There's no place like 127.0.0.1
WWW
Cevapla
#10
type
 TXData = record
   SiraNo: Integer;
   ...
   Region: String;
 end;
 PXData = ^TXData;
procedure TfrmLiftMonitor.fillGrid;
var
 n1: Integer;
 Item: TListViewItem;
 monitor: PXData;
begin
 if lvMain.Visible then
 begin
   lvMain.BeginUpdate;
   try
     //burada dispose kodunu yazdığımda aşağıdaki Clear hata veriyor Dispose kaldırınca da memeroy leak oluyor.
     //Aynı işlemi tekrarladığımda ki yapıyorum. Sürekli olarak bellek ufak ufak artıyor.
     lvMain.Items.Clear;  //burası hata veriyor

     dm.tblMonitor.First;
     while not dm.tblMonitor.Eof do
     begin
       Item := lvMain.Items.Add;

       monitor := new(PXData);
       monitor.SiraNo := dm.tblMonitor.Fields[COL_SIRA_NO].AsInteger;
       ...
       monitor.Region := dm.tblMonitor.Fields[COL_REGION].AsString;

       Item.Data['Region'] := pointer(monitor);

       Item.Data['SiraNo'] := monitor.SiraNo;
       ...
       Item.Data['Region'] := monitor.Region;

       dm.tblMonitor.Next;
     end;
   finally
     lvMain.EndUpdate;
   end;
 end;

Şu şekilde bir işlem yaptım bir şekilde pointer kısmını yapıyorum fakat iş dispose kısmına gelince
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi