• delphi7 stringgrid 点列头排序


    最近在做stringgrid的项目, 下面delphi7 正常使用,均摘抄网路,但做过细微调整才能正常使用

    首先排序的过程

    procedure Quicksort(Grid: TStringGrid; var List: array of integer; min, max, sortcol, datatype: Integer);
    {List is a list of rownumbers in the grid being sorted}
    var
      med_value: integer;
      hi, lo, i: Integer;


      function compare(val1, val2: string): integer;
      var
        int1, int2: integer;
        float1, float2: extended;
        errcode: integer;
      begin
        case datatype of
          0:
            result := ANSIComparetext(val1, val2);
          1:
            begin
              int1 := strtointdef(val1, 0);
              int2 := strtointdef(val2, 0);
              if int1 > int2 then
                result := 1
              else if int1 < int2 then
                result := -1
              else
                result := 0;
            end;
          2:
            begin
              val(val1, float1, errcode);
              if errcode <> 0 then
                float1 := 0;
              val(val2, float2, errcode);
              if errcode <> 0 then
                float2 := 0;
              if float1 > float2 then
                result := 1
              else if float1 < float2 then
                result := -1
              else
                result := 0;
            end;
        else
          result := 0;
        end;
      end;


    begin
    {If the list has <= 1 element, it's sorted}
      if (min >= max) then
        Exit;
    {Pick a dividing item randomly}
      i := min + Trunc(Random(max - min + 1));
      med_value := List[i];
      List[i] := List[min]; { Swap it to the front so we can find it easily}
    {Move the items smaller than this into the left
    half of the list. Move the others into the right}
      lo := min;
      hi := max;
      while (True) do
      begin
    // Look down from hi for a value < med_value.
        while compare(Grid.cells[sortcol, List[hi]], grid.cells[sortcol, med_value]) >= 0 do
    (*ANSIComparetext(Grid.cells[sortcol,List[hi]]
    ,grid.cells[sortcol,med_value])>=0 do*)
        begin
          hi := hi - 1;
          if (hi <= lo) then
            Break;
        end;
        if (hi <= lo) then
        begin {We're done separating the items}
          List[lo] := med_value;
          Break;
        end;
    // Swap the lo and hi values.
        List[lo] := List[hi];
        inc(lo); {Look up from lo for a value >= med_value}
        while Compare(grid.cells[sortcol, List[lo]], grid.cells[sortcol, med_value]) < 0 do
        begin
          inc(lo);
          if (lo >= hi) then
            break;
        end;
        if (lo >= hi) then
        begin {We're done separating the items}
          lo := hi;
          List[hi] := med_value;
          break;
        end;
        List[hi] := List[lo];
      end;
    {Sort the two sublists}
      Quicksort(Grid, List, min, lo - 1, sortcol, datatype);
      Quicksort(Grid, List, lo + 1, max, sortcol, datatype);
    end;
    //datatype 0:按字符排序 1:按整型排序 2:按浮点型排序


    procedure Tfrmbase.Sortgrid(var Grid : TStringGrid; sortcol,datatype:integer);
    var
       i : integer;
       tempgrid:tstringGrid;
       list:array of integer;
    begin
      screen.cursor:=crhourglass;
      tempgrid:=TStringgrid.create(nil);
      with tempgrid do
      begin
        rowcount:=grid.rowcount;
        colcount:=grid.colcount;
        fixedrows:=grid.fixedrows;
      end;


        setlength(list,Grid.rowcount-Grid.fixedrows);
        for i:= Grid.fixedrows to Grid.rowcount-1 do
        begin
          list[i-Grid.fixedrows]:=i;
          tempgrid.rows[i].AddStrings(grid.rows[i]);
        end;
        quicksort(Grid, list,0,Grid.rowcount-Grid.fixedrows-1,sortcol,datatype);
        for i:=0 to Grid.rowcount-Grid.fixedrows-1 do
        begin
          Grid.rows[i+Grid.fixedrows].Text := '';
          Grid.rows[i+Grid.fixedrows].AddStrings(tempgrid.rows[list[i]]);
        end;
        Grid.row:=Grid.fixedrows;
      tempgrid.free;
      setlength(list,0);
      screen.cursor:=crdefault;
    end;

    列头排序

    procedure Tfrmtranstat.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      c: integer;
      w: integer;
      Grid: TStringGrid;
    begin                  //单击排序
      Grid := Sender as TStringGrid;
      with Grid do
        if y <= rowheights[0] then
        begin
          c := 0;
          w := colwidths[0];
          while (c < colcount) and (w <= x) do
          begin
            inc(c);
            w := w + colwidths[c] + gridlinewidth;
          end;
          sortgrid(Grid, c, 0);
        end;
    end;

    http://blog.csdn.net/y281252548/article/details/52527807

  • 相关阅读:
    多端统一框架Taro基础教程
    golang中的race检测
    【Golang】高性能编程之超时退出协程
    电容充放电时间常数RC计算方法(转)
    meanshift算法详解(转)
    vim 统计字符串在当前文档中出现的次数
    置信区间的理解
    IC 后端仿真: process corner 和 PVT (转)
    STA概念:一文了解NLDM与CCS(转)
    Linux 中 fg、bg、jobs 等指令(转)
  • 原文地址:https://www.cnblogs.com/findumars/p/6551653.html
Copyright © 2020-2023  润新知