Вставка и удаление строк в StringGrid 
Вставка и удаление строк в StringGrid 
Автор: Dennis Passmore 
...я не нашел никаких методов для вставки и удаления 
строк...
Поскольку свойство Cols[x] компонента TStringGrid реально является 
компонентом TStrings, все методы TStrings применимы также и к Cols[x].
Недавно в интернете я нашел реализацию расширенных функций TStringGrid: 
(*
Создано:               Dennis Passmore
                       1929 Mango Tree Drive
                       Edgewater, Fl. 32141
                       CIS: 71640,2464
                       Март 1, 1996
Данный код свободен в использовании при одном условии:
в исходном коде должна присутствовать указанная выше кредитка
со ссылкой на автора.
Примечание по использованию кода:
Всякий раз при удалении Row (строки) или Column (колонки)
проверяйте наличие и удаляйте любые объекты, которые могли
быть назначены любой ячейке в строке или колонке, которые вы
собираетесь удалять, поскольку данный код не может знать ни
размера, ни типа ассигнованных ими объектов.
*) 
unit  GridFunc;
interface 
uses 
  Sysutils, WinProcs, Grids;
procedure  InsertRow(Sender: TStringGrid; ToIndex: Longint);
procedure  DeleteRow(Sender: TStringGrid; FromIndex: Longint);
procedure  InsertColumn(Sender: TStringGrid; ToIndex: Longint);
procedure  DeleteColumn(Sender: TStringGrid; FromIndex: Longint);
implementation 
type 
  TCSGrid = class (TStringGrid)
  private 
  public 
    procedure  MoveRow(FromIndex, ToIndex: Longint);
    procedure  MoveColumn(FromIndex, ToIndex: Longint);
  end ;
procedure  TCSGrid.MoveRow(FromIndex, ToIndex: Longint);
begin 
  RowMoved(FromIndex, ToIndex);  { Защищенный метод TStringGrid } 
end ;
procedure  TCSGrid.MoveColumn(FromIndex, ToIndex: Longint);
begin 
  ColumnMoved(FromIndex, ToIndex);  { Защищенный метод TStringGrid } 
end ;
procedure  InsertRow(Sender: TStringGrid; ToIndex: Longint);
var 
  xx, yy: Integer;
begin 
  if  ToIndex >= 0 then 
    with  TCSGrid(Sender) do 
      if  (ToIndex <= RowCount) then 
      begin 
        RowCount := RowCount + 1;
        xx := RowCount - 1;
        for  yy := 0 to  ColCount - 1 do 
        begin 
          Cells[yy, xx] := ' ';
          ObJects[yy, xx] := nil ;
        end ;
        if  ToIndex < RowCount - 1 then 
          MoveRow(RowCount - 1, ToIndex);
      end 
      else 
        MessageBeep(0)
    else 
      MessageBeep(0);
end ;
procedure  DeleteRow(Sender: TStringGrid; FromIndex: Longint);
begin 
  if  FromIndex > l;
  = 0 then 
    with  TCSGrid(Sender) do 
      if  (RowCount > 0) and  (FromIndex < RowCount) then 
      begin 
        if  (FromIndex < RowCount - 1) then 
          MoveRow(FromIndex, RowCount - 1);
        Rows[RowCount - 1].Clear;
        RowCount := RowCount - 1;
      end 
      else 
        MessageBeep(0)
    else 
      MessageBeep(0);
end ;
procedure  InsertColumn(Sender: TStringGrid; ToIndex: Longint);
var 
  xx, yy: Integer;
begin 
  if  ToIndex >= 0 then 
    with  TCSGrid(Sender) do 
      if  (ToIndex <= ColCount) then 
      begin 
        ColCount := ColCount + 1;
        xx := ColCount - 1;
        Cols[xx].BeginUpdate;
        for  yy := 0 to  RowCount - 1 do 
        begin 
          Cells[xx, yy] := ' ';
          ObJects[xx, yy] := nil ;
        end ;
        Cols[xx].EndUpdate;
        if  ToIndex < ColCount - 1 then 
          MoveColumn(ColCount - 1, ToIndex);
      end 
      else 
        MessageBeep(0)
    else 
      MessageBeep(0);
end ;
procedure  DeleteColumn(Sender: TStringGrid; FromIndex: Longint);
begin 
  if  FromIndex >= 0 then 
    with  TCSGrid(Sender) do 
      if  (ColCount > 0) and  (FromIndex < ColCount) then 
      begin 
        if  (FromIndex < ColCount - 1) then 
          MoveColumn(FromIndex, ColCount - 1);
        Cols[ColCount - 1].Clear;
        ColCount := ColCount - 1;
      end 
      else 
        MessageBeep(0)
    else 
      MessageBeep(0);
end ;
end .
  
Here's the translation of the content into Russian:
Код с комментариями, улучшениями и альтернативным решением.
unit   GridFunc ; 
interface 
uses 
   Sysutils ,   WinProcs ,   Grids ; 
procedure   InsertRow ( Sender :   TStringGrid ;   ToIndex :   Longint ) ; 
procedure   DeleteRow ( Sender :   TStringGrid ;   FromIndex :   Longint ) ; 
procedure   InsertColumn ( Sender :   TStringGrid ;   ToIndex :   Longint ) ; 
procedure   DeleteColumn ( Sender :   TStringGrid ;   FromIndex :   Longint ) ; 
implementation 
type 
   TCSGrid   =   class ( TStringGrid ) 
   private 
     procedure   MoveRow ( FromIndex ,   ToIndex :   Longint ) ; 
     procedure   MoveColumn ( FromIndex ,   ToIndex :   Longint ) ; 
   public 
     constructor   Create ; 
   end ; 
constructor   TCSGrid . Create ; 
begin 
end ; 
procedure   TCSGrid . MoveRow ( FromIndex ,   ToIndex :   Longint ) ; 
begin 
   RowMoved ( FromIndex ,   ToIndex ) ;   { защищенный метод TStringGrid } 
end ; 
procedure   TCSGrid . MoveColumn ( FromIndex ,   ToIndex :   Longint ) ; 
begin 
   ColumnMoved ( FromIndex ,   ToIndex ) ;   { защищенный метод TStringGrid } 
end ; 
procedure   InsertRow ( Sender :   TStringGrid ;   ToIndex :   Longint ) ; 
var 
   xx ,   yy :   Integer ; 
begin 
   if   ( ToIndex   >=   0 )   then 
     with   TCSGrid ( Sender )   do 
       if   ( ToIndex   <=   RowCount )   then 
       begin 
         RowCount   :=   RowCount   +   1 ; 
         xx   :=   RowCount   -   1 ; 
         for   yy   :=   0   to   ColCount   -   1   do 
         begin 
           Cells [ yy ,   xx ]   :=   ' ' ;   { Альтернативное решение: очистка ячейки пробелом } 
           ObJects [ yy ,   xx ]   :=   nil ; 
         end ; 
         if   ToIndex   <   RowCount   -   1   then 
           MoveRow ( RowCount   -   1 ,   ToIndex ) ; 
       end 
       else 
         MessageBeep ( 0 ) 
     else 
       MessageBeep ( 0 ) ; 
end ; 
procedure   DeleteRow ( Sender :   TStringGrid ;   FromIndex :   Longint ) ; 
begin 
   if   ( FromIndex   >   0 )   then 
     with   TCSGrid ( Sender )   do 
       if   ( RowCount   >   0 )   and   ( FromIndex   <   RowCount )   then 
       begin 
         if   ( FromIndex   <   RowCount   -   1 )   then 
           MoveRow ( FromIndex ,   RowCount   -   1 ) ; 
         Rows [ RowCount   -   1 ] . Clear ; 
         RowCount   :=   RowCount   -   1 ; 
       end 
       else 
         MessageBeep ( 0 ) 
     else 
       MessageBeep ( 0 ) ; 
end ; 
procedure   InsertColumn ( Sender :   TStringGrid ;   ToIndex :   Longint ) ; 
var 
   xx ,   yy :   Integer ; 
begin 
   if   ( ToIndex   >=   0 )   then 
     with   TCSGrid ( Sender )   do 
       if   ( ToIndex   <=   ColCount )   then 
       begin 
         ColCount   :=   ColCount   +   1 ; 
         xx   :=   ColCount   -   1 ; 
         Cols [ xx ] . BeginUpdate ; 
         for   yy   :=   0   to   RowCount   -   1   do 
         begin 
           Cells [ xx ,   yy ]   :=   ' ' ;   { Альтернативное решение: очистка ячейки пробелом } 
           ObJects [ xx ,   yy ]   :=   nil ; 
         end ; 
         Cols [ xx ] . EndUpdate ; 
         if   ToIndex   <   ColCount   -   1   then 
           MoveColumn ( ColCount   -   1 ,   ToIndex ) ; 
       end 
       else 
         MessageBeep ( 0 ) 
     else 
       MessageBeep ( 0 ) ; 
end ; 
procedure   DeleteColumn ( Sender :   TStringGrid ;   FromIndex :   Longint ) ; 
begin 
   if   ( FromIndex   >=   0 )   then 
     with   TCSGrid ( Sender )   do 
       if   ( ColCount   >   0 )   and   ( FromIndex   <   ColCount )   then 
       begin 
         if   ( FromIndex   <   ColCount   -   1 )   then 
           MoveColumn ( FromIndex ,   ColCount   -   1 ) ; 
         Cols [ ColCount   -   1 ] . Clear ; 
         ColCount   :=   ColCount   -   1 ; 
       end 
       else 
         MessageBeep ( 0 ) 
     else 
       MessageBeep ( 0 ) ; 
end ; 
end . 
В этом коде включен конструктор для класса TCSGrid, который не был предоставлен в оригинальном коде. Процедуры MoveRow и MoveColumn вызываются при вставке или удалении строк или столбцов, чтобы обеспечить правильный порядок таблицы.
Альтернативное решение - очистка ячейки пробелом вместо оставления ее пустой.
В статье рассмотрено вставку и удаление строк в StringGrid, а также создано расширенное утилита, позволяющее выполнять эти операции с использованием методов TStrings.
Комментарии и вопросы Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш delphi_kansoftware  и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная  :: TStringGrid и TDrawGrid  ::