如何删除TStringGrid行?

时间:2013-05-03 03:28:34

标签: delphi tstringgrid

我有一个TStringGrid,我想删除所选的行。我尝试过的基本内容只删除 last 行。如何删除任意行?

2 个答案:

答案 0 :(得分:13)

如果您尝试过的代码只删除了最后一行,那么您可能只是递减RowCount属性。这确实总是在行列表的 end 上进行修改。考虑到这一点,您可以编写代码以确保您不再需要的行是最后一行,然后删除最后一行。 (最直接的方法是移动行,并且有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);

答案 1 :(得分:10)

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

TCustomGrid有一个DeleteRow方法,但它受到保护,因此除了来自该类的后代之外,您无法调用它。但是,很容易绕过这种限制。声明TCustomGrid后代,然后将网格控件类型转换为该新类型。在结果上调用DeleteRow

type
  TCustomGridAccess = class(TCustomGrid) end;

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

这是有效的,因为在Delphi中,具有受保护可见性的成员在与类声明相同的单元内隐式 public 。虽然在网格单元中声明了TCustomGrid,但我们的TCustomGridAccess类在您的单元中声明,因此您的单元可以访问其所有受保护的方法,包括DeleteRow


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

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);