我有一个TStringGrid,我想删除选定的行。我尝试过的基本内容只删除了最后一行。如何删除任意行?
发布于 2013-05-03 05:30:52
如果您尝试的代码只删除最后一行,那么您可能只是在减少RowCount属性。实际上,它总是在行列表的末尾进行修改。考虑到这一点,您可以编写代码以确保您不再想要的行是末尾的行,然后删除最后一行。(最直接的方法是移动行,并且有一个MoveRow方法,但它是受保护的。但是,如果您希望调用受保护的方法,则可以只调用DeleteRow。)
只使用公共成员和已发布成员,就可以编写删除任意行的循环。例如,下面是一些受Scalabium软件在这个主题上的常见问题启发的代码
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);发布于 2013-05-03 05:19:50
网格的选定行由其Row属性提供。
TCustomGrid有一个DeleteRow方法,但是它是受保护的,所以您不能调用它,除非是在该类的后代中。不过,要规避这一限制是很容易的。声明一个TCustomGrid后代,然后将您的网格控件类型转换为该新类型。根据结果调用DeleteRow。
type
TCustomGridAccess = class(TCustomGrid) end;
procedure DeleteGridRow(g: TCustomGrid; row: Integer);
begin
TCustomGridAccess(g).DeleteRow(row);
end;这是因为在Delphi中,具有受保护可见性的成员与类的声明在同一个单元中隐式公开。虽然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);发布于 2022-07-04 17:51:40
因为找不到行功能,所以我找到了Fire猴子的解决方案:
procedure TMainForm.StringGridDeleteRow(Grid: TStringGrid;
ARow: integer);
var
i, j: Integer;
begin
for i := ARow to Grid.RowCount - 2 do
for j := 0 to Grid.ColumnCount-1 do
Grid.Cells[j,i] := Grid.Cells[j, i+1];
Grid.RowCount := Grid.RowCount - 1;
end;https://stackoverflow.com/questions/16351109
复制相似问题