2013-05-03 18 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);