发新话题
打印

[组件应用/开发] TListview的排序demo

TListview的排序demo

在oncolumnclick事件当中实现的点击表头,所有项重新排列的例子。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn);
  private
    { Private declarations }
    FLastIndex: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CustSortAsc(Item1, Item2: TListItem;
  ColIndex: Integer): Integer; stdcall;
var
  Item1Str: string;
  Item2Str: string;
  TmpExt: Extended;
begin
  Result := 0;
  Item1Str := '';
  Item2Str := '';

  if ColIndex < 0 then
    Exit;

  if ColIndex = 0 then
  begin
    Item1Str := Item1.Caption;
    Item2Str := Item2.Caption;
  end
  else
  begin
    if ColIndex <= Item1.SubItems.Count then
      Item1Str := Item1.SubItems[ColIndex - 1];

    if ColIndex <= Item2.SubItems.Count then
      Item2Str := Item2.SubItems[ColIndex - 1];
  end;

  Result := CompareText(Item1Str, Item2Str);

  // If one of the strings is empty, make the other string sort before it

  if (Result > 0) and (Item2Str = '') then
    Result := -1
  else if (Result < 0) and (Item1Str = '') then
    Result := 1;
end; {= CustSortAsc =}

function CustSortDesc(Item1, Item2: TListItem;
  ColIndex: Integer): Integer; stdcall;
begin
  Result := CustSortAsc(Item1, Item2, ColIndex);
  Result := Result * -1;
end;

procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
    if FLastIndex = Column.Index then
    begin
      ListView1.CustomSort(@CustSortDesc, Column.Index);
      FLastIndex := -1;
    end
    else
    begin
      ListView1.CustomSort(@CustSortAsc, Column.Index);
      FLastIndex := Column.Index;
    end;
end;

end.
妖城欢迎您!

TOP

再发一个关于listview排序的demo


原作者:不详
来 源:网络




请看下面的代码:listview的columns属性加4个列项,viewstyle属性设为vsReport,smallimage属性对应imagelist。imagelist加载图标。query1对应与parts.db表。  

这段代码能实现升序排列,降序你稍作改动即可。如果是按字段数据类型排序则可用sql语句实现。另外这段代码可实现响应双击第一列下的图标。  

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ImgList, Db, DBTables;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    Button1: TButton;
    ImageList1: TImageList;
    Query1: TQuery;
    procedure Button1Click(Sender: TObject);
    procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn);
    procedure ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
    procedure ListView1DblClick(Sender: TObject);
    procedure ListView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    mouseX, mouseY: Integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  var ColumnToSort: Integer;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
int:integer;
begin
  listview1.Items.Clear;
  int:=0;
  with query1 do
    begin
      close;
      sql.Clear;
      sql.add('select partno,description,onorder,cost from parts');
      prepare;
      open;
      first;
    end;
  while not query1.Eof do
  begin
    listView1.Items.Add.Caption:= query1.fieldbyname('partno').asstring;
    ListView1.Items.Item[int].ImageIndex:=0;
    ListView1.Items.Item[int].SubItems.Append( query1.fieldbyname('description').asstring);
    ListView1.Items.Item[int].SubItems.Append( query1.fieldbyname('onorder').asstring);
    ListView1.Items.Item[int].SubItems.Append( query1.fieldbyname('cost').asstring);
    int:=int+1;
    query1.Next;
  end;

end;


procedure TForm1.ListView1ColumnClick(Sender: TObject;
  Column: TListColumn);
begin
  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 := CompareText(Item1.Caption,Item2.Caption)
  else begin
   ix := ColumnToSort - 1;
   Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
  end;
end;
procedure TForm1.ListView1DblClick(Sender: TObject);
var
  Item: TListItem;
begin
  Item := ListView1.GetItemAt(mouseX, mouseY);
  if (Item <> nil) then
  begin
    beep();
    //在这可写些响应双击图标代码。
  end;
end;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  mouseX := X;
  mouseY := Y;
end;

end.
妖城欢迎您!

TOP

发新话题