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