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