2013-05-03 57 views

回答

11

如果你只尝试过的代码删除最后一排,那么你很可能只是递减RowCount财产。这确实总是对行列表的末端进行修改。考虑到这一点,您可以编写代码以确保您不再需要的行是最后一行,然后然后删除最后一行。 (最直接的方法是移动行,并有一个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); 
+0

要添加,如果你只需要对象(像我这样的,从对象,而不是单元格的内容在单元格动态绘图数据) ,然后用'Grid.Objects [0,I]:= Grid.Objects [0,I + 1];'替换第二行。这比替换甚至没有使用的全部内容要快得多。 – 2016-12-02 17:24:08

9

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

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