[Delphi] Sortowanie ListView

0

Czy ktoś mógłby mi pomóc w dojściu do jakiejś metody sortowania wpisów w ListView (wedłu kolumn w trybie vsReport)? Tylko proszę bez odpowiedzi w stylu "zerknij do posta [tu link] albo się wypchaj" - już szukałem i wszystkie znalezione sposoby albo mi nie odpowiadały, albo były za trudnie, żebym zakapował o co w nich chodzi (możecie mówić, że lama i głupek jestem, bo "nie wiem jak zrobić coś tak prostego", ale przypomnijcie sobie, czy WY wiedzieliście to wszystko odkąd tylko zobaczyliście Delphi. Nie? To cicho być.). Sytuacja w moim programie jest taka: w ListView jest 5 kolumn, pierwsza jest oczywiście zajęta przez główny tekst danej pozycji, dalsa to SubItemy. Pierwsza jest tekstowa, druga też, trzy następne liczbowe (tzn. zapisywane są w nich tylko liczby). Dobrze by było, gdyby ktoś wpadł też na pomysł, jak wyświetlić strzałeczkę na nagłówku kolumny według której aktualnie są sortowane pozycje, wskazującą kierunek sortowania. I jeszcze jedno - to powinno działać przy 10 tysiącach pozycji...

Z góry dziękuję za odpowiedź.

0

(możecie mówić, że lama i głupek jestem, bo "nie wiem jak zrobić coś tak prostego", ale przypomnijcie sobie, czy WY wiedzieliście to wszystko odkąd tylko zobaczyliście Delphi. Nie? To cicho być.).

Nikt nie rodzi się od razu z wiedzą. Ale przydatną umiejętnością jest korzystanie z helpa. I to tam jest:

var
Form1: TForm1;
ColumnToSort: Integer;
Desc: Boolean = True;

implementation

{$R *.dfm}

procedure TForm1.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
begin
Desc := not Desc;
ColumnToSort := Column.Index;
(Sender as TCustomListView).AlphaSort;
end;

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
var
ix: Integer;
begin
if ColumnToSort = 0 then
Compare := AnsiCompareText(Item1.Caption,Item2.Caption)
else begin
ix := ColumnToSort - 1;
if ColumnToSort < 2 then
{Jeżeli tekst do porównania}
Compare := AnsiCompareText(Item1.SubItems[ix],Item2.SubItems[ix])
else
{Jeżeli liczby}
Compare := StrToInt(Item1.SubItems[ix])-StrToInt(Item2.SubItems[ix]);
end;
if Desc then
Compare := -Compare;
end;

A co do strzałki to
tekstowa:
ListView1.Column[0].Caption := '^'+ListView1.Column[0].Caption;
Graficzną trzeba:
Do ListView1.SmallImages przyporządkować jakieś ImageList
a kolumnie nadać
ListView1.Column[0].ImageIndex := NrObrazkaNaLiście.

0

Ja to robię tak:

procedure TForm1.Form1ColumnClick(Sender: TObject;
Column: TListColumn);
begin
if Column.Index > 0 then Lista.CustomSort(@CustomSortProc,Column.Index);
end;

function CustomSortProc(Item1, Item2: TListItem;
ParamSort: Integer): Integer;stdcall;
begin
case ParamSort of
7 : Result := CompareDateTime(StrToTime(Item1.SubItems.Strings[ParamSort]),StrToTime(Item2.SubItems.Strings[ParamSort]));//według daty
5,6 : if StrToInt(Item1.SubItems.Strings[ParamSort]) < StrToInt(Item2.SubItems.Strings[ParamSort]) then Result := - 1
else Result := 1;//według liczb
else Result := AnsiCompareStr(Item1.SubItems.Strings[ParamSort],Item2.SubItems.Strings[ParamSort]);//według tekstu
end;
end;

0

Dzięki, to chyba wystarczy. Jeśli chodzi o helpa: próbowałem to znaleźć, ale windowsowe mechanizmy obsługi pomocy są do kitu (a wyszukiwanie w szczególności).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0