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

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

01.01.2007

Вариант 1:

Source: https://forum.sources.ru

Пользователь может перемещать строки и колонки 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;

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

type TFake = class(TStringGrid);
...

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

Вариант 2:

Author: Борис Новгородов (MBo), mbo@mail.ru

Date: 28.04.2002

{ **** 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;
Previous page:
Перемещение строк, столбцов и ячеек
Top:
DRKB
Next page:
Перетаскиваем колонки и строки в TStringGrid мышью