Pazar, Ağustos 13, 2006

Delphi'de TListView bileşeni

Öncelikle TListView bileşenin ne olduğunu iyice açıklayalım. Bu bileşen Explorer penceresinde gördüğünüz, dosyaların, klasörlerin gösterildiği yerle aynı özelliklere sahip olan bir bileşen. Yani bu bileşenin içinde çeşitli alt birimler oluşturup bunlara bir simge ve başka alt bilgiler ekleyip, şık bir şekilde ekrana yansıtabiliriyorsunuz. Bu bileşen "Win32" kategorisi altında bulunuyor.

Hemen söyleyelim öğelerin yönetimi oldukça kolay. TStringList'ten bildiğimiz Add, Delete gibi metodların biraz değiştirilmiş hallerini burada da kullanabiliyoruz. Bir farkla, burada ekleme fonksiyonu parametre almıyor ve dönüş değeri olarak da eklenen öğeye ait bir adres ya da daha anlaşılır bir şekilde TListItem tipinde bir değişken döndürüyor. Bu değişken sayesinde yeni eklenen öğeyi rahatça düzenleyebiliyoruz. Bu bileşeni simgelerle birlikte kullanmak isterseniz(ki başka türlü çok da güzel görünmüyor zaten :)) formunuza bir "TImageList" bileşeni eklemeniz gerekiyor. Hatta iki tane eklemelisiniz. Bunlardan biri 32x32'lik büyük simgeleri taşırken diğeri de 16x16'lık küçük simgeleri taşıyacak. TListView bileşeninin "LargeImages" ve "SmallImages" özelliklerini ilgili ImageList'lerle ilişkilendirmeyi unutmayın.(Özellikler bölümünden ilgili ImageList'i seçin.)

Gelelim TListItem'ın nasıl birşey olduğuna. Bunu iyi bilmelisiniz çünkü TListView bileşeninin tüm öğeleri bu tipte. Hemen özelliklerini tek tek inceleyelim:

Caption(string): Bu özellik adından da anlaşılacağı üzere öğenin başlık bilgisini, yani ekranda görüntülenecek olan metni tutuyor.(yenioge.Caption:='Adı';)

Checked(Boolean): Bu özellik -eğer TListView'un "checkboxes" özelliği true ise- öğenin tikli olup olmadığını belirtiyor.

Cut(Boolean): Bu özellik simgenin kesme işlemi yapıldığı sıradaki gibi yarı saydam görüntülenip görüntülenmeyeceğini belirtiyor.

DropTarget(Boolean): Bu özellik true yapıldığında, öğe bırakma-bölgesi olarak gösterilir ve ListView içindeki diğer tüm öğelerin bu özelliği false yapılır.

ImageIndex(Integer): Bu özellik öğenin ilişkilendirilmiş ImageList içindeki kaç numaralı resmi simge olarak kullanacağını belirtir. Değeri -1 olduğunda bir simge gösterilmez.

Index(Integer): Bu özellik öğenin ListView içindeki yerini belirtir. İlk öğenin Index'i 0'dır.

OverlayIndex(Integer): Bu özellik kulanılacak üst katman resminin(overlay image) ImageList içindeki yerini belirtir.

Selected(Boolean): Bu özellik öğenin seçili olup olmadığını belirtir. ListView içinde birden fazla öğe seçildiğinde öğenin seçili olup olmadığını bu özelliğine bakarak anlayabiliriz.

SubItemImages(Array of Integer): Bu özellik öğenin alt öğelerinin resim numaralarını tutar. Eğer alt öğelerin yanında resim görüntülemek istiyorsanız "SubItemImages[1]:=5" gibi bir ifadeyle bunu yapabilirsiniz. Burada köşeli ayraçlar arasındaki "1" alt öğenin indexini ve "5" de resim indexini belirtiyor.

SubItems(TStrings): Bu özellik alt öğeleri tutar. Alt öğe eklemek, silmek veya yönetmek oldukça basittir. Bir Memo ya da ListBox bileşeninin öğelerini yönetmekle hemen hemen aynıdır. TStrings tipini biraz bilmeniz yeterli.

Evet işimize yarayan özellikler bunlar. Şimdi ListView'a geri dönelim isterseniz. ColumnClick ve Columns adı altında 2 özelliğimiz var dikkat ettiyseniz. Bunlardan "Columns" ayrıntılı gösterimdeki sütunların isimlerini temsil ediyor. Yani örneğin her öğenizin 2 alt öğesi(subitem) var. O zaman "columns" bölümüne toplam 3 başlık eklemeniz gerekiyor. Birincisi öğenin adının bulunduğu sütunun adı, diğerleri de sırasıyla birinci ve ikinci alt öğelerin başlığı olacak. ColumnClick özelliğini true yaparsanız bu sütunlara tıklanabilecek ve siz bu tıklama olaylarını yönetebileceksiniz, ki bu iş genelde o sütundaki alt öğeye göre sıralama yapmak için kullanılır.

Ve son 2 önemli özelliğimiz, SortType ve ViewStyle. Sort type alfabetik sıralamanın neye göre yapılacağını belirtir. stNone bir sıralama yapmazken stName sadece başlıklara göre, stData alt öğelere göre, stBoth ise her iki bilgiye göre sıralama yapar. Ayrıca bunu stNone yapıp kendi sıralama sisteminizi de geliştirebilirsiniz. Bunun için ListView bileşeninizin onCompare olayına bir kaç kod yazmanız gerekiyor. Ayrıca sıralama fonksiyonunun çalışması için de "AlphaSort" metodunu çağırmalısınız.(Listview1.AlphaSort;) onCompare olayında size 2 tane TListItem öğesi veriliyor ve siz buraya yazacağınız kodla hangisinin daha önce gelmesi gerektiğini belirtiyorsunuz. Eğer Item1 daha önce gelmeliyse Compare değerini sıfırdan küçük, daha sonra gelmeliyse Compare değerini sıfırdan büyük yapmalısınız. Eğer ikisi de eşitse o zaman bu değeri 0 yapmanız gerekiyor. ViewStyle özelliği de aktif olan gösterim tipini belirtiyor. vsIcon bildiğiniz "Büyük Simge" gösterimi, ve burada LargeImages'a bağlı ImageList kullanılıyor. Diğer tüm modlarda SmallIcons'a bağlı ImageList kullanılıyor. vsSmallIcons, küçük simgeler; vsList, liste ve vsReport, ayrıntılı gösterimi temsil ediyor. Bu değerleri program çalışırken de değiştirip farklı görünümler arasında geçiş yapabilirsiniz.

Evet, bu kadar ön bilgiden sonra sanırım ListView bileşenimize çalışma zamanı nasıl öğe ekleyip, bunları nasıl yöneteceğimizi öğrenmeye hazırız. Öncelikle TListItem tipinde bir değişken tanımlamalısınız. Daha sonra TListView.Items.Add fonksiyonuyla oluşturmalı, değişkenimize bağlamalı ve gerekli düzenlemeleri yapmalısınız.

Bir ListView bileşeninde toplu ve büyük değişiklikler yapmadan önce "BeginUpdate" ve bu işlemlerin sonunda da "EndUpdate" metodlarını çağırmak işlem hızını oldukça arttıracaktır. Bu komutlar her değişiklik olduğunda ekranın güncellenmesini engeller ve sonra işiniz bittiğinde tüm değişikliğin bir defada gösterilmesini sağlar. ListView'un "Clear" metodu, ListView'un içini güzelce temizler :). Ayrıca istediğiniz öğeyi silebilir, öğelerin yerini değiştirebilir ve daha başka birçok şey yapabilirsiniz. Hepsini burada anlatmam inanın çok zor. Yalnız yazıyı bir örnekle bitirmek istiyorum.

Örneğimiz bir TStringList içinde depolanmış dosya isimlerini ListView içinde göstermek. Ayrıca bu dosya isimlerinde dosya yolları da var ve biz bunu ayırıp her dosyanın ilk alt öğesinin bu dosyanın yolunu göstermesini de sağlayacağız.

Bunu yapmadan önce ImageList'imize istediğimiz simgeleri eklemeliyiz. Bunu yaptıktan sonra kodlara geçebiliriz:

var
yeni:TListItem;
i:integer;
begin
ListView1.Items.BeginUpdate; //bahsettiğimiz güncelleme başlangıcı
ListView1.Clear; //temizleyelim
for i:=0 to dosyalar.Count-1 do //TStringListimizin adının "dosyalar" olduğunu varsayalım
begin
yeni:=Listview1.Items.Add; //yeni öğeyi ekledik ve adresini değişkenimize atadık.
yeni.Caption:=ExtractFileName(dosyalar[i]); //başlığını dosya adı yaptık
yeni.SubItems.Add(ExtractFilePath(dosyalar[i]); //yolunu alt öğe olarak ekledik
yeni.ImageIndex:=1; //burası size kalmış, resim indexi
end;
ListView1.Items.EndUpdate; //değişiklik yapmayı bitirdik
end;

Evet yukarıdaki örnek kodların da yardımıyla TListView bileşenini daha rahat ve etkin kullanabileceğinizi umuyorum. Kolay gelsin..

Not: Yazı, zamanında ByteOnline için yazdığım "Delphi'de TListView bileşeninin pratik kullanımı" yazısından uyarlamadır.