//参考如下代码~~
procedure TForm1.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
var
I: Integer;
begin
if Abs(TListView(Sender).Tag) = Column.Index + 1 then
TListView(Sender).Tag := -TListView(Sender).Tag
else TListView(Sender).Tag := Column.Index + 1;
TListView(Sender).AlphaSort;
for I := 0 to TListView(Sender).Columns.Count - 1 do begin
TListView(Sender).Columns[I].Caption :=
StringReplace(TListView(Sender).Columns[I].Caption, '↑', '', [rfReplaceAll]);
TListView(Sender).Columns[I].Caption :=
StringReplace(TListView(Sender).Columns[I].Caption, '↓', '', [rfReplaceAll]);
end;
Column.Caption := Column.Caption + Copy(WideString('↓↑'),
Ord(TListView(Sender).Tag > 0) + 1, 1);
end;
procedure TForm1.ListView1Compare(Sender: TObject; Item1,
Item2: TListItem; Data: Integer; var Compare: Integer);
var
I: Integer;
A, B: string;
vDataA, vDataB: Extended;
begin
I := TListView(Sender).Tag;
if I = 0 then Exit;
if Abs(I) = 1 then begin
A := Item1.Caption;
B := Item2.Caption;
end else begin
A := Item1.SubItems[Abs(I) - 2];
B := Item2.SubItems[Abs(I) - 2];
end;
if TryStrToFloat(A, vDataA) and TryStrToFloat(B, vDataB) then
Compare := Trunc(I * vDataA - I * vDataB)
else Compare := CompareText(A, B) * I;
end;
var
FrmMain: TFrmMain;
UpDown: array [0..3] of Boolean;
function CustomSortProc(Item1, Item2: TListItem; ParamSort: integer):
integer; stdcall;
begin
case ParamSort of
0:
begin
if UpDown[0] = True then
Result := CompareText(Item1.Caption,Item2.Caption)
else
Result := -CompareText(Item1.Caption,Item2.Caption);
end;
1:
begin
if UpDown[1] = True then
Result := CompareText(Item1.SubItems[0],Item2.SubItems[0])
else
Result := -CompareText(Item1.SubItems[0],Item2.SubItems[0]);
end;
2:
begin
if UpDown[2] = True then
Result := CompareText(Item1.SubItems[1],Item2.SubItems[1])
else
Result := -CompareText(Item1.SubItems[1],Item2.SubItems[1]);
end;
3:
begin
if UpDown[3] = True then
Result := CompareText(Item1.SubItems[2],Item2.SubItems[2])
else
Result := -CompareText(Item1.SubItems[2],Item2.SubItems[2]);
end;
end;
end;
procedure TFrmMain.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
var
I: Integer;
begin
for I := 0 to listview1.Columns.Count - 1 do
listview1.Columns[I].ImageIndex := -1;
listview1.CustomSort(@CustomSortProc,Column.Index);
//升序
{ if UpDown[Column.Index] = True then
Column.ImageIndex := 0
else
//降序
Column.ImageIndex := 1; }
UpDown[Column.Index] := not UpDown[Column.Index];
end;