// получить колонку и ячейку по координатам в TStringGrid // на входе StrGrid:TStringGrid x,y координаты щелчка мыши // на выходе запись типа Tpoint = x,y // где x>-1 = номер столбца // где Y>-1 = номер строчки function GetColumnIndexFromXY(StrGrid:TStringGrid;x,y:integer):Tpoint; var i,sx2,sx,x1:integer; begin with StrGrid do begin sx:=0;sx2:=0; for X1:=0 to LeftCol-FixedCols do sx:=sx+ColWidths[x1]; i:=-1; for X1:=0 to ColCount do begin if (sx2<(x+sx)) and ((sx2+ColWidths[x1])>(x+sx)) then begin i:=x1-1; break; end; sx2:=sx2+ColWidths[x1]; end; result.X:=i; sx:=0;sx2:=0;i:=-1; for X1:=0 to TopRow-FixedRows do sx:=sx+RowHeights[x1]; for X1:=0 to Rowcount do begin if (sx2<(y+sx)) and ((sx2+RowHeights[x1])>(y+sx)) then begin i:=x1-1; break; end; sx2:=sx2+RowHeights[x1]; end; end; result.y:=i; end;
сортировка TStringGrid
// от А до Я Procedure SortToTableASC(StrGrid:TStringGrid;SortColumn:integer); var i, j, k : integer; sTemp : string;
Function Uslovie(s1,s2:string):boolean; var vl1:Extended; vl2:Extended; begin if tryStrtoFloat(s1,vl1) and tryStrtoFloat(s2,vl2) then result:=vl1>vl2 else result:=s1>s2 end; begin with StrGrid do {сортировка массива методом простых обменов ("пузырька") } for i:=FixedRows to RowCount-2 do for j:=i+1 to RowCount-1 do if Uslovie(Cells[SortColumn,i], Cells[SortColumn,j]) then for k:=FixedCols to ColCount-1 do begin sTemp := Cells[k,i]; Cells[k,i] := Cells[k,j]; Cells[k,j] := sTemp; end;
end;
// Обратная сортировка (от Я до А) Procedure SortToTableDesc(StrGrid:TStringGrid;SortColumn:integer); var i, j, k : integer; sTemp : string;
Function Uslovie(s2,s1:string):boolean; var vl1:Extended; vl2:Extended; begin // если оба числа можно перевести в вещественный тип чисел if tryStrtoFloat(s1,vl1) and tryStrtoFloat(s2,vl2) then result:=vl1>vl2 else result:=s1>s2 end; begin with StrGrid do {сортировка массива методом простых обменов ("пузырька") } for i:=FixedRows to RowCount-2 do for j:=i+1 to RowCount-1 do if Uslovie(Cells[SortColumn,i], Cells[SortColumn,j]) then for k:=FixedCols to ColCount-1 do begin sTemp := Cells[k,i]; Cells[k,i] := Cells[k,j]; Cells[k,j] := sTemp; end;
end;
Пример заполнения StringGrid числами
var x,y:integer; begin for X:=0 to form1.StringGrid1.ColCount-1 do for y:=1 to form1.StringGrid1.rowCount-1 do form1.StringGrid1.Cells[x,y]:=inttostr(-50+Random(101)); end;
Пример сортировки
procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var col,row:integer; p:Tpoint; a:array[1..2] of integer; begin p:=GetColumnIndexFromXY(form1.StringGrid1,x,y); col:=p.X; row:=p.y; if (col>-1) and (row=0) then begin SortToTableDesc(form1.StringGrid1,col); end;
end;
/63_sortirovka_stringgride.zip
|