Btgunluk.com
Kişisel bir bilişim blogu
Delphi'de Sütun Başlıklarına Tıklayarak ListView Sıralama
Bir önceki yazıda, Delphi'de ListView bileşenin nasıl kullanılacağından bahsetmiştim. Bu yazıda da ListView'in sütun başlıklarına tıklayarak ListView'in nasıl sıralanacağından bahsedeceğim.
Bunun için şuradaki kodları kendi programıma uyarladım. Öncelikle Unit kodunun implementation kısmının hemen üstündeki bölümde şu tanımlamaları yapıyoruz:
type
TCustomSortStyle = (cssAlphaNum, cssNumeric, cssDateTime);
var
Form1: TForm1; //Bu tanımlada otomatik yapılıyor zaten, konumu kavramanız için silmedim.
{ variable to hold the sort style }
LvSortStyle: TCustomSortStyle;
{ array to hold the sort order }
LvSortOrder: array[0..4] of Boolean; // High[LvSortOrder] = Number of Lv Columns
Daha sonra sıralamayı yapan şu alt programları koda ekliyoruz:
function CustomSortProc(Item1, Item2: TListItem; SortColumn: Integer): Integer; stdcall;
var
s1, s2: string;
i1, i2: Integer;
r1, r2: Boolean;
d1, d2: TDateTime;
{ Helper functions }
function IsValidNumber(AString : string; var AInteger : Integer): Boolean;
var
Code: Integer;
begin
Val(AString, AInteger, Code);
Result := (Code = 0);
end;
function IsValidDate(AString : string; var ADateTime : TDateTime): Boolean;
begin
Result := True;
try
ADateTime := StrToDateTime(AString);
except
ADateTime := 0;
Result := False;
end;
end;
function CompareDates(dt1, dt2: TDateTime): Integer;
begin
if (dt1 > dt2) then Result := 1
else
if (dt1 = dt2) then Result := 0
else
Result := -1;
end;
function CompareNumeric(AInt1, AInt2: Integer): Integer;
begin
if AInt1 > AInt2 then Result := 1
else
if AInt1 = AInt2 then Result := 0
else
Result := -1;
end;
begin
Result := 0;
if (Item1 = nil) or (Item2 = nil) then Exit;
case SortColumn of
-1 :
{ Compare Captions }
begin
s1 := Item1.Caption;
s2 := Item2.Caption;
end;
else
{ Compare Subitems }
begin
s1 := '';
s2 := '';
{ Check Range }
if (SortColumn < Item1.SubItems.Count) then
s1 := Item1.SubItems[SortColumn];
if (SortColumn < Item2.SubItems.Count) then
s2 := Item2.SubItems[SortColumn]
end;
end;
{ Sort styles }
case LvSortStyle of
cssAlphaNum : Result := lstrcmp(PChar(s1), PChar(s2));
cssNumeric : begin
r1 := IsValidNumber(s1, i1);
r2 := IsValidNumber(s2, i2);
Result := ord(r1 or r2);
if Result <> 0 then
Result := CompareNumeric(i2, i1);
end;
cssDateTime : begin
r1 := IsValidDate(s1, d1);
r2 := IsValidDate(s2, d2);
Result := ord(r1 or r2);
if Result <> 0 then
Result := CompareDates(d1, d2);
end;
end;
{ Sort direction }
if LvSortOrder[SortColumn + 1] then
Result := - Result;
end;
Son olarak da ListView'ın ColumnClick olayına şu kodları yazıyoruz:
procedure TForm1.lv1ColumnClick(Sender: TObject; Column: TListColumn);
begin
{ determine the sort style }
if Column.Index = 0 then
LvSortStyle := cssNumeric
else
LvSortStyle := cssAlphaNum;
{ Call the CustomSort method }
lv1.CustomSort(@CustomSortProc, Column.Index -1);
{ Set the sort order for the column}
LvSortOrder[Column.Index] := not LvSortOrder[Column.Index];
end;
Yukarıdaki kod yardımıyla ListView'ın ilk sütun başlığına tıklandığında sayısal bir sıralama yapılacak, diğer sütun başlıklarına tıklandığında ise alfabetik bir sıralama yapılacak.
22.01.2017 12:49:47
Yorumlar
Bu yazıya henüz yorum yapılmamış.
Yazı hakkında yorum yapmak için, buraya tıklayın.
Kategoriler :
- Bilişim (55)
- C Sharp (1)
- Delphi (44)
- Duyuru (8)
- Excel (8)
- Fıkralar (9)
- Flash (2)
- Javascript (3)
- Kategorisiz (2)
- Kıssa'dan Hisse (5)
- Php (20)
- Program Tanıtımı (1)
- Python (2)
Arşiv :
- Kasım 2008 (11)
- Ekim 2010 (6)
- Kasım 2010 (11)
- Aralık 2010 (3)
- Ocak 2011 (2)
- Mayıs 2011 (1)
- Temmuz 2011 (4)
- Ağustos 2011 (10)
- Ekim 2011 (2)
- Ocak 2012 (2)
- Şubat 2012 (1)
- Mart 2012 (1)
- Nisan 2012 (3)
- Haziran 2012 (2)
- Temmuz 2012 (1)
- Ağustos 2012 (1)
- Kasım 2012 (1)
- Mart 2013 (1)
- Mayıs 2013 (1)
- Temmuz 2013 (1)
- Ekim 2013 (2)
- Kasım 2013 (2)
- Şubat 2014 (1)
- Ekim 2014 (1)
- Kasım 2014 (3)
- Şubat 2015 (1)
- Ağustos 2015 (3)
- Eylül 2015 (1)
- Ekim 2015 (1)
- Ocak 2016 (3)
- Nisan 2016 (1)
- Ekim 2016 (1)
- Aralık 2016 (8)
- Ocak 2017 (27)
- Şubat 2017 (1)
- Haziran 2017 (1)
- Eylül 2017 (1)
- Kasım 2017 (1)
- Ocak 2018 (2)
- Temmuz 2018 (2)
- Kasım 2018 (1)
- Aralık 2018 (1)
- Şubat 2019 (1)
- Ağustos 2019 (2)
- Aralık 2019 (1)
- Ocak 2020 (1)
- Nisan 2020 (10)
- Kasım 2020 (1)
- Aralık 2020 (1)
- Ocak 2021 (1)
- Mayıs 2022 (1)
- Kasım 2022 (1)
- Mart 2023 (1)
- Mayıs 2023 (2)
- Haziran 2023 (1)
- Ocak 2024 (2)
- Temmuz 2024 (1)
- Aralık 2024 (1)
- Ocak 2025 (1)
- Temmuz 2025 (1)
Etiketler :
- 3d acar baltas Android asp.net banana pi c sharp delphi fonksiyonları excel Firefox flash flowplayer ipucu opencv pascal pdf php fonksiyonları python super pi ttnet veritabanı video visual studio Windows word