Sortowanie i wczytywanie listview

0

Witam mam taki problem. Robie sobie sortowanie ListView. Gdy klikam na columne 'nazwisko' w list view ladnie mi sortuje alfabetycznie. Jednak gdy ta kolumna jest 'kliknieta' to nie dziala mi odczytywanie z pliku i wczytywanie do ListView. POkazuje errora : "List index out of bounds". Gdy nie zastosuje sortowania w listview (nie klikne kolumny 'nazwisko') wszystko jest ok. Działam na plikach typowanych.
Kod do sortowania:

ColumnToSort: Integer;
  Desc: Boolean = True;

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

procedure TMainFrm.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;

Kod do wczytywania:

procedure TMainFrm.CzytajPlik;
var
  Plik      : TDaneFile;
  i        : integer;
  ListItem : TListItem;
  Rec      : TDane;
begin
  ListView1.Clear;
  {anuluj jezeli plik z danymi nie istnieje}
  if not FileExists(OpenDialog1.FileName) then Exit;
  AssignFile(Plik, OpenDialog1.FileName);
  try
    Reset(Plik); //utworz plik
    for i:=0 to FileSize(Plik) -1 do
    begin
      Read(Plik, Rec); //w petli utworz kolejne rekordy
      ListItem := ListView1.Items.Add;
      ListItem.Caption := IntToStr(Rec.Nr);
      ListItem.SubItems.Add(Rec.Nazwisko);
      ListItem.SubItems.Add(Rec.Imie);
 end;
  finally
    CloseFile(Plik);
    end;
end;

Bardzo prosilbym o pomoc lub o jakis algorytm jak posortowac dane w pliku typowanym alfabetycznie po nazwisku.
pozdrawiam

0

upewnij się, że istnieje Item1.SubItems i Item2.SubItems i tylko wtedy sortuj.
konkretnie

  if (Item2.SubItems.count >= ColumnToSort) and (Item1.SubItems.count >= ColumnToSort) then ...

tak poza tym gdybyś użył debugera, to byś sam znalazł ten błąd.

0

ustawilem we wlasciwosciach ListView SortType na stNone i teraz dziala...
pozdrawiam

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