我有一个 TStringGrid,我想删除选定的行。我尝试过的基本操作只删除了最后一行。如何删除任意行?
2 回答
如果您尝试的代码仅删除最后一行,那么您可能只是在减少该RowCount
属性。这确实总是在行列表的末尾进行修改。考虑到这一点,您可以编写代码以确保您不再需要的行是最后一行,然后删除最后一行。(最直接的方法是移动行,并且有一个MoveRow
方法,但它是受保护的。但是,如果您想调用受保护的方法,您也可以直接调用DeleteRow
。)
仅使用公共和已发布成员,可以编写一个删除任意行的循环。例如,以下是受Scalabium Software 关于此主题的常见问题解答启发的一些代码:
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);
网格的选定行由其Row
属性给出。
TCustomGrid
有一个DeleteRow
方法,但它是受保护的,所以你不能从该类的后代中调用它。不过,绕过这个限制很容易。声明一个TCustomGrid
后代,然后将您的网格控件类型转换为该新类型。调用DeleteRow
结果。
type
TCustomGridAccess = class(TCustomGrid) end;
procedure DeleteGridRow(g: TCustomGrid; row: Integer);
begin
TCustomGridAccess(g).DeleteRow(row);
end;
这是因为在 Delphi 中,具有受保护可见性的成员在与类声明相同的单元内隐式公开。虽然TCustomGrid
是在Grids单元中声明的,但我们的TCustomGridAccess
类是在您的单元中声明的,因此您的单元可以访问其所有受保护的方法,包括DeleteRow
.
如果您的 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);