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 (52)
- 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)
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