Приветствую Вас Гость | RSS

Delphi заготовки

Пятница, 19.04.2024, 11:20
Главная » 2012 » Май » 29 » Пример сортировки StringGrid по щелчку на колонку
09:43
Пример сортировки StringGrid по щелчку на колонку





// получить колонку и ячейку по координатам в 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
Просмотров: 4295 | Добавил: NetSoftWare | Рейтинг: 0.0/0
Всего комментариев: 1
1 KOLOB9RA  
0
а есть ли чтонибудь универсальное с буквами и цифрами сразу?

Имя *:
Email *:
Код *: