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

Previous  Top  Next

    
 

 

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

Code:

type

TStringGridX = class(TStringGrid)

public

   procedure MoveColumn(FromIndex, ToIndex: Longint);

   procedure MoveRow(FromIndex, ToIndex: Longint);

end;

 

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

Code:

procedure TStringGridX.MoveColumn(FromIndex, ToIndex: Integer);

begin

inherited;

end;

 

procedure TStringGridX.MoveRow(FromIndex, ToIndex: Integer);

begin

inherited;

end;

 

 

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

Code:

procedure TForm1.Button1Click(Sender: TObject);

begin

   TStringGridX(StringGrid1).MoveColumn(1, 3);

end;

 

 

©Drkb::00603

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

 

 


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

 

Code:

type TFake = class(TStringGrid);

...

 

procedure TForm1.Button1Click(Sender: TObject);

{©Drkb v.3(2007): www.drkb.ru,

®Vit (Vitaly Nevzorov) - nevzorov@yahoo.com}

begin

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

end;

 

©Drkb::00604

 


 

Code:

{ **** 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;

 

 

©Drkb::01064