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

Материал из DRKB

Как перемещать строки и колонки в StringGrid?[править | править код]

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


Source: Взято из http://forum.sources.ru
ID: 00603



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


type TStringGridX = class(TStringGrid);

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


ID: 00604



{ **** UBPFD *********** by delphibase.endimus.com ****
>> Перестановка строки в StringGrid в другую позицию

Передвигает строку StringGrid из позиции FromRow в позицию ToRow, сдвигая остальные

Зависимости: Grids

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;


Source: http://delphibase.endimus.com
ID: 01064