2013-05-03 88 views

答えて

11

TCustomGridの任意の子孫は、自動的にあなただけの他のグリッド・メソッドのように呼び出すことができますDelRow方法を、持っていますRowCountプロパティ。実際には、常に行のリストの末尾のに変更が加えられます。そのことを念頭に置いて、不要な行が末尾にあることを保証するコードを作成し、、次に最後の行を削除します。 (だけではなくcall DeleteRowあなたがが、保護されたメソッドを呼び出したい場合は、あなたにもことがあります。最も直接的な方法は移動に行となり、そしてそこMoveRow方法だが、それが保護されます。)

唯一の公共使い方公開されているメンバであれば、任意の行を削除するループを書くことができます。

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; 

それをコピーし、各行の内容あなたが上の行に削除したい以下1:たとえば、ここにScalabium Software's FAQ on this topicに触発されたいくつかのコードです。ループの最後に、削除したい行が(そのすぐ下の行で)上書きされ、最後の行が2つコピーされます。次に、最後の行を単に削除します。あなたは(動的代わりに、セルの内容の対象から細胞内のデータを描画する私のような、)オブジェクトのみを必要とする場合は、追加するには

DeleteRow(Grid, Grid.Row); 
+0

:グリッドの現在の行を削除するには

、このように関数を呼び出します2行目を 'Grid.Objects [0、I]:= Grid.Objects [0、I + 1];'に置き換えます。これは、使用されていないコンテンツ全体を置き換えるよりも少し速いです。 –

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; 

次に、ヘルパーを宣言した場所のユニットを使用してください。あなたが試したコードは唯一、あなたはおそらくデクリメントしている、最後の行を削除した場合

grid.DelRow(grid.Row); 
関連する問題