TStringGridがあり、選択した行を削除したいと思います。私が試した基本的なことは、last行を削除するだけです。任意の行を削除するにはどうすればよいですか?
試したコードが最後の行のみを削除する場合は、おそらくRowCount
プロパティをデクリメントしているだけです。それは確かに常に行のリストのendに変更を加えます。そのことを念頭に置いて、不要になった行が最後の行になるようにコードを記述し、次に最後の行を削除することができます。 (最も直接的な方法は、行をmoveすることであり、MoveRow
メソッドがありますが、保護されています。呼び出したい場合ただし、保護されたメソッドは、 代わりにDeleteRow
を呼び出すこともできます。)
公開メンバーと公開メンバーのみを使用して、任意の行を削除するループを作成することができます。たとえば、 ScalabiumSoftwareのFAQ :)に触発されたコードを次に示します。
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;
削除したい行の下の内容を上の行にコピーします。ループの最後で、削除する行が(そのすぐ下の行によって)上書きされ、最後の行のコピーが2つあります。次に、最後の行を削除するだけです。
グリッドの現在の行を削除するには、次のような関数を呼び出します。
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では、可視性が保護されているメンバーが、クラスの宣言と同じユニット内に暗黙的にpublicであるためです。 TCustomGrid
はGridsユニットで宣言されていますが、TCustomGridAccess
クラスはyourユニットで宣言されているため、ユニットはそのすべてにアクセスできます。 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);