点某一标题,就按那个标题排列?
或者其他控件可以实现?

解决方案 »

  1.   

    在onMouseDown事件中重新读取数据
      

  2.   

    有个控件好得不得了,不用编程就可以实现你的愿望。
    在原来系统的这个TSTRINGGRIG上不能实现这个功能。
      

  3.   

    什么控件?不要只说一半就走了呀!学习ing
      

  4.   


    procedure QuickSort(Grid: TStringGrid; iLo, iHi: Integer);
    var
      Lo, Hi : Integer;
      Mid: String ;
    begin
      Lo := iLo ;
      Hi := iHi ;
      Mid := Grid.Cells[ACol,(Lo + Hi) div 2];
      repeat
        if Order and not NumOrStr then //按正序、字符排
        begin
          while Grid.Cells[ACol,Lo] < Mid do Inc(Lo);
          while Grid.Cells[ACol,Hi] > Mid do Dec(Hi);
        end ;
        if not Order and not NumOrStr then //按反序、字符排
        begin
          while Grid.Cells[ACol,Lo] > Mid do Inc(Lo);
          while Grid.Cells[ACol,Hi] < Mid do Dec(Hi);
        end;    if NumOrStr then
        begin
          if Grid.Cells[ACol,Lo] = '' then Grid.Cells[ACol,Lo] := '0' ;
          if Grid.Cells[ACol,Hi] = '' then Grid.Cells[ACol,Hi] := '0' ;
          if Mid = '' then Mid := '0' ;
          if Order then
          begin //按正序、数字排
            while StrToFloat(Grid.Cells[ACol,Lo]) < StrToFloat(Mid) do Inc(Lo);
            while StrToFloat(Grid.Cells[ACol,Hi]) > StrToFloat(Mid) do Dec(Hi);
          end else
          begin //按反序、数字排
            while StrToFloat(Grid.Cells[ACol,Lo]) > StrToFloat(Mid) do Inc(Lo);
            while StrToFloat(Grid.Cells[ACol,Hi]) < StrToFloat(Mid) do Dec(Hi);
          end;
        end ;
        if Lo <= Hi then
        begin
          MoveStringGridData(Grid, Lo, Hi) ;
          Inc(Lo);
          Dec(Hi);
        end;
      until Lo > Hi;
      if Hi > iLo then QuickSort(Grid, iLo, Hi);
      if Lo < iHi then QuickSort(Grid, Lo, iHi);
    end;begin
    try
      QuickSort(Grid, Grid.FixedRows, Grid.RowCount - 1 ) ;
    except
    on E: Exception do
      Application.MessageBox(Pchar('系统在排序数据的时候遇到异常:'#13+E.message+#13'请重试,如果该问题依然存在请与程序供应商联系!'),'系统错误',MB_OK+MB_ICONERROR) ;
    end;
    end;
      

  5.   

    楼上的很全面
    我没有看完他的程序
    我的意思是在:标题的click里面写代码
    让该列的sort换成升或者降就ok了, 只有7、8行代码就oik了
      

  6.   

    在OnColumnClick事件中
        if(nSortCol != Column->Index)
        {
            nSortCol = Column->Index;
            bAscend  = true;
        }
        else
            bAscend = !bAscend;
        if ( Column->Index != 0 )
            lstvWarning->CustomSort(NULL, 0);
        else
        {
            struct SortParam Param;        Param.nCol = Column->Index;
            Param.IsAsc = bAscend; //true为升序,false为降序
            lstvWarning->CustomSort(MySortProc, (long)&Param);
        }
    在OnCompare事件中
        try
        {
            if(nSortCol == -1)
                Compare = 0;  // 不排序
            else if(nSortCol == 0)
            {
                Compare = CompareStr(Item1->Caption, Item2->Caption);
            }else
                Compare = CompareStr(Item1->SubItems->Strings[nSortCol-1],
                        Item2->SubItems->Strings[nSortCol-1]);
            if(!bAscend)
                Compare = -Compare;  // 降序排列
        }
        catch(...)
        {}刚从bcb转到delphi,请各位指教...
      

  7.   

    nSortCol,bAscend定义为全局变量,也可参照帮助的例子写;
    不好意思看错,这个是TListview跟搂主的不搭边_^_.
      

  8.   

    用advStringGrid吧,以上烦恼全没了。