给你一个例程,自己去想一想,好吗?
procedure Tf_rs_bm.ListViewOrder(Fieldname:String);
var
  p:^Integer;
  ID:Integer;
  ListItem:TListItem;
  Node:TTreeNode;
  Array_bmid:Array of string;
  Array_bmidnumber:integer;
  Light_all:Boolean;
  i:integer;
  SubNode:TTreeNode;
  Subp:^integer;
  Tem_level:integer;
begin
  Listview2.items.Clear;
  Light_all:=False;
  Array_bmidnumber:=0;
  Node:=TreeView1.Selected;
  if Node=nil then Exit;
  p:=Node.Data;
  if p=Nil then Exit;
  ID:=p^;
  if id=0 then Light_all:=true
  else begin
    Array_bmidnumber:=1;
    SetLength(Array_bmid,1);
    Array_bmid[0]:=IntToStr(p^);
    Tem_level:=Node.Level;
    SubNode:=Node.GetNext;
    While (SubNode<>nil) and (SubNode.level>Tem_level) do begin
      Inc(Array_bmidnumber);
      Subp:=SubNode.Data;
      SetLength(Array_bmid,Array_bmidnumber);
      Array_bmid[Array_bmidnumber-1]:=IntToStr(Subp^);
      SubNode:=SubNode.GetNext;
    end;
  end;
  with TQuery.Create(Nil) do
    begin
    DatabaseName:=DatabaseAlias;
    SQL.Clear;
    if Light_all then begin
      SQL.Add('select id,ryxx_del,ryxx_ryjd,ryxx_xm,ryxx_xb,ryxx_ssbm,ryxx_csny,ryxx_gj,ryxx_jg,ryxx_zzmm,ryxx_hyzk,ryxx_whcd,ryxx_byxx,ryxx_sxzy,ryxx_jsjsp,ryxx_wysp,ryxx_jszc from rs_ryxx');
      SQL.Add(' where ryxx_del='+IntToStr(FLAG_NOTDELETE));
    end
    else begin
      if Array_bmidnumber<=0 then exit;
      SQL.Add('select id,ryxx_del,ryxx_ryjd,ryxx_xm,ryxx_xb,ryxx_ssbm,ryxx_csny,ryxx_gj,ryxx_jg,ryxx_zzmm,ryxx_hyzk,ryxx_whcd,ryxx_byxx,ryxx_sxzy,ryxx_jsjsp,ryxx_wysp,ryxx_jszc from rs_ryxx');
      SQL.Add(' where ryxx_del='+IntToStr(FLAG_NOTDELETE));
      if Array_bmidnumber>0 then begin
        Sql.Add(' and (ryxx_ssbm='+Array_bmid[0]);
        if Array_bmidnumber>1 then begin
          for i:=1 to Array_bmidnumber-1 do begin
            Sql.Add(' or ryxx_ssbm='+Array_bmid[i]);
          end;
        end;
        Sql.Add(')');
      end;
    end;
    if LightDesc then sql.Add(' order by '+Fieldname+' desc')
    else sql.Add(' order by '+Fieldname);
    Open;
    First;
    ListView2.Items.Clear;
    while not Eof do
      begin
      ListItem:=ListView2.Items.Add();
      ListItem.Caption:=Trim(FieldByName('ryxx_xm').AsString);
      New(p);
      p^:=FieldByName('id').AsInteger;
      ListItem.Data:=p;
      if FieldByName('ryxx_xb').AsString='男' then
        begin
        ListItem.ImageIndex:=0;
        ListItem.SubItems.Add('男');
        end
      else
        begin
        if FieldByName('ryxx_xb').AsString='女' then
          begin
          ListItem.ImageIndex:=1;
          ListItem.SubItems.Add('女');
          end
        else
          begin
          ListItem.ImageIndex:=0;
          ListItem.SubItems.Add('');
          end;
        end;
      case FieldByName('ryxx_ryjd').AsInteger of
        0: ListItem.SubItems.Add('应聘人员');
        1: ListItem.SubItems.Add('试用人员');
        2: ListItem.SubItems.Add('正式员工');
        3: ListItem.SubItems.Add('退休员工');
        4: ListItem.SubItems.Add('辞退员工');
        5: ListItem.SubItems.Add('离休员工');
        else ListItem.SubItems.Add('');
      end;
      Listitem.subitems.add(Fieldbyname('ryxx_csny').Asstring);
      ListItem.subitems.Add(fieldbyname('ryxx_gj').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_jg').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_zzmm').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_hyzk').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_whcd').Asstring);
      Listitem.Subitems.Add(fieldbyname('ryxx_byxx').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_sxzy').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_jsjsp').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_wysp').Asstring);
      ListItem.Subitems.Add(fieldbyname('ryxx_jszc').Asstring);
      Next;
      end;
    Free;
    end;
end;