delphi StringGrid排序
17686 点击·0 回帖
![]() | ![]() | |
![]() | delphi StringGrid排序 StringGrid排序函数 推荐高速排序函数(在StringGrid里加上5000行试试就知道它的效率了)【来自wyb_star】 【这个东西很强劲的,感谢 wyb_Star 提供】 高速排序函数(在StringGrid里加上5000行试试就知道它的效率了) 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; List := 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 按浮點型排序<BR>procedure SortGrid(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; with Grid do begin setlength(list, rowcount - fixedrows); for i := fixedrows to rowcount - 1 do begin list[i - fixedrows] := i; tempgrid.rows.assign(grid.rows); end; quicksort(Grid, list, 0, rowcount - fixedrows - 1, sortcol, datatype); for i := 0 to rowcount - fixedrows - 1 do begin rows[i + fixedrows].assign(tempgrid.rows
end; row := fixedrows; end; tempgrid.free; setlength(list, 0); screen.cursor := crdefault; end; procedure TForm1.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; 摘自 Ciske Liu | |
![]() | ![]() |