【问题标题】:How do I delete a TStringGrid row?如何删除 TStringGrid 行?
【发布时间】:2013-04-27 09:31:04
【问题描述】:

我有一个 TStringGrid,我想删除选定的行。我尝试过的基本操作只删除了 last 行。如何删除任意行?

【问题讨论】:

    标签: delphi tstringgrid


    【解决方案1】:

    网格的选定行由其Row 属性给出。

    TCustomGrid 有一个DeleteRow 方法,但它是受保护的,所以你不能调用它,除非从该类的后代中调用。不过,绕过这个限制很容易。声明一个TCustomGrid 后代,然后将您的网格控件类型转换为该新类型。在结果上调用DeleteRow

    type
      TCustomGridAccess = class(TCustomGrid) end;
    
    procedure DeleteGridRow(g: TCustomGrid; row: Integer);
    begin
      TCustomGridAccess(g).DeleteRow(row);
    end;
    

    这是可行的,因为在 Delphi 中,具有受保护可见性的成员隐含地public 在与类声明相同的单元内。尽管TCustomGridGrids 单元中声明,我们的TCustomGridAccess 类在您的 单元中声明,因此您的单元可以访问其所有受保护的方法,包括@987654329 @。


    如果您的 Delphi 版本足够新,那么您可以使用 class helper。类助手可以访问受保护的成员,并且不需要对技术上不相关的类型进行类型转换。

    type
      TCustomGridHelper = class helper for TCustomGrid
      public
        procedure DelRow(ARow: Integer);
      end;
    
    procedure TCustomGridHelper.DelRow(ARow: Integer);
    begin
      Self.DeleteRow(ARow);
    end;
    

    然后,只需使用您声明助手的单元即可。 TCustomGrid 的任何后代都会自动拥有一个 DelRow 方法,您可以像调用任何其他网格方法一样调用它:

    grid.DelRow(grid.Row);
    

    【讨论】:

    • 不错的解决方案。不幸的是,我在 FireMonkey TCustomGrid (FMX.Grid) 中找不到 DeleteRow。我对么?还是我错过了什么?
    【解决方案2】:

    如果您尝试的代码只删除了最后一行,那么您可能只是在减少 RowCount 属性。这确实总是在行列表的 end 上进行修改。考虑到这一点,您可以编写代码以确保您不再需要的行是最后一行,然后 然后 删除最后一行。 (最直接的方法是 move 行,有一个 MoveRow 方法,但它是受保护的。如果你想调用受保护的方法,你也可以只用 call DeleteRow .)

    仅使用公共和已发布成员,可以编写一个删除任意行的循环。例如,这里有一些受Scalabium Software's FAQ on this topic启发的代码:

    procedure DeleteRow(Grid: TStringGrid; ARow: Integer);
    var
      i: Integer;
    begin
      for i := ARow to Grid.RowCount - 2 do
        Grid.Rows[i].Assign(Grid.Rows[i + 1]);
      Grid.RowCount := Grid.RowCount - 1;
    end;
    

    它将每一行的内容复制到下面您要删除的行到上面的行中。在循环结束时,您要删除的行已被覆盖(被其正下方的行覆盖)并且最后一行有两个副本。然后它只是删除最后一行。

    要删除网格的当前行,调用函数如下:

    DeleteRow(Grid, Grid.Row);
    

    【讨论】:

    • 添加,如果你只需要对象(像我一样,从对象而不是单元格内容动态地在单元格中绘制数据),然后将第二行替换为Grid.Objects[0, I]:= Grid.Objects[0, I + 1];。这比替换甚至不使用的全部内容要快一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多