Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как перемещать строки и колонки в TStringGrid?

01.01.2007

Пользователь может перемещать строки и колонки StringGrid при помощи мышки. Можно ли это сделать программно? В описании TCustomGrid можно увидеть методы MoveColumn и MoveRow, однако они скрыты в TStringGrid. Но нам ничего не мешает просабклассить TStringGrid и объявить эти методы как public:

type
  TStringGridX = class(TStringGrid)
  public
    procedure MoveColumn(FromIndex, ToIndex: Longint);
    procedure MoveRow(FromIndex, ToIndex: Longint);
  end;

Чтобы воспользоваться этими методами, достаточно вызвать соответствующий метод предка:

procedure TStringGridX.MoveColumn(FromIndex, ToIndex: Integer);
begin
  inherited;
end;
 
procedure TStringGridX.MoveRow(FromIndex, ToIndex: Integer);
begin
  inherited;
end;

Этот компонент не нужно регистрировать в палитре компонентов. Просто используйте потомка TStringGrid или любого TCustomGrid, и вызывайте его методы:

  procedure TForm1.Button1Click(Sender: TObject); 
  begin 
    TStringGridX(StringGrid1).MoveColumn(1, 3); 
  end;

Взято из https://forum.sources.ru


Примечание от Vit: код можно написать значительно компактнее:

 type TFake = class(TStringGrid);
...
 
  procedure TForm1.Button1Click(Sender: TObject); 

  begin 
    TFake(StringGrid1).MoveColumn(1, 3); 
  end;

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Перестановка строки в StringGrid в другую позицию
 
Передвигает строку StringGrid из позиции FromRow в позицию ToRow, сдвигая остальные
 
Зависимости: Grids
Автор:       Борис Новгородов (MBo), mbo@mail.ru, Новосибирск
Copyright:   MBo
Дата:        28 апреля 2002 г.
***************************************************** }
 
procedure SGMoveRow(SG: TStringGrid; FromRow, ToRow: Integer);
var
  TempList: TStringList;
  i: Integer;
begin
  with SG do
    if (FromRow in [0..RowCount - 1]) and (ToRow in [0..RowCount - 1]) then
    begin
      TempList := TStringList.Create;
      TempList.Assign(Rows[FromRow]);
      if FromRow > ToRow then
        for i := FromRow downto ToRow + 1 do
          Rows[i].Assign(Rows[i - 1])
      else
        for i := FromRow to ToRow - 1 do
          Rows[i].Assign(Rows[i + 1]);
      Rows[ToRow].Assign(TempList);
      TempList.Free;
    end;
end;