ListView sortowanie liczb

0

Wiem, że wątków takich były setki, ale niestety nigdzie nie udało mi się odnaleźć objaśnień do tych kodów. A Help mi na komputerze nie działa. Potrzebuję posortować listę, według jednej konkretnej kolumny - nie głównej, innej, konkretnie 5, znaczy o indexie 3. Odnalazłem wiele opcji podawanych na innych forach, jak np:

Sortowanie ListView problem

Podane tam kody sortują jednak według Stringa, a nie liczb, co powoduje, że po posortowaniu '300' ląduje między '30', a '31'. Nie bardzo wiem, jak to przeobić na liczby.

Inne rozwiązanie, jakie odnalazłem:

http://forum.ks-ekspert.pl/topic/95575-delphi-sortowanie-listview/

Tu z kolei kod zawiera fragment przez który program mi się nie kompiluje. Mam na myśli:

 compare := CompareValue(
                 StrToInt(Item1.SubItems.Strings[inSortColumnRep - 1]),
                 StrToInt(Item2.SubItems.Strings[inSortColumnRep - 1]));

Delphi informuje mnie, że nie wie, czym jest CompareValue.

Nie wiem za bardzo jak działa Compare, także za bardzo nawet nie mogę pokombinować i poprzerabiać tych kodów w żaden sposób.

1

Masz poniżej przykład zdarzenia OnCompare dla ListView, który wyświetla nazwy graczy według malejącej kolejności wartości kolumny z punktami. Jeżeli te są takie same dla kilku drużyn decyduje liczba bramek, a jeżeli i te są takie same następuje sortowanie rosnąco według alfabetu.

procedure TMainForm.LV_ACompare(Sender : TObject; Item1, Item2 : TListItem;
  Data : integer; var Compare : integer);
var
  PtsCount1, PtsCount2 : integer;
  GoalCount1, GoalCount2 : integer;
begin
  PtsCount1 := StrToInt(Item1.SubItems[PointsCol]);
  PtsCount2 := StrToInt(Item2.SubItems[PointsCol]);
  GoalCount1 := StrToInt(Item1.SubItems[GoalFMinusGoalACol]);
  GoalCount2 := StrToInt(Item2.SubItems[GoalFMinusGoalACol]);
  if PtsCount1 > PtsCount2 then
    Compare := -1
  else if PtsCount1 < PtsCount2 then
    Compare := 1
  else
    if GoalCount1 > GoalCount2 then
      Compare := -1
    else
      if GoalCount1 < GoalCount2 then
        Compare := 1
      else
        Compare := 0;
  if (PtsCount1 = PtsCount2) and (GoalCount1 = GoalCount2) then
  begin
    Compare := CompareText(Item1.Caption, Item2.Caption);
  end;
end;
0

Dziękuję bardzo:) Działa. Dokładnie o to mi chodziło:) Ogromne dzięki:D I na tym przykładzie zrozumiałem Compare. Także podwójne dzięki.

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