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;