web-dev-qa-db-ja.com

TStringGrid行を削除するにはどうすればよいですか?

TStringGridがあり、選択した行を削除したいと思います。私が試した基本的なことは、last行を削除するだけです。任意の行を削除するにはどうすればよいですか?

13
CrazyGirl

試したコードが最後の行のみを削除する場合は、おそらく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);
13
Rob Kennedy

グリッドの選択された行は、そのRowプロパティによって指定されます。

TCustomGridにはDeleteRowメソッドがありますが、保護されているため、そのクラスの子孫内から以外は呼び出すことができません。ただし、その制限を回避するのは簡単です。 TCustomGridの子孫を宣言してから、グリッドコントロールをその新しい型に型キャストします。結果に対してDeleteRowを呼び出します。

type
  TCustomGridAccess = class(TCustomGrid) end;

procedure DeleteGridRow(g: TCustomGrid; row: Integer);
begin
  TCustomGridAccess(g).DeleteRow(row);
end;

これが機能するのは、Delphiでは、可視性が保護されているメンバーが、クラスの宣言と同じユニット内に暗黙的にpublicであるためです。 TCustomGridGridsユニットで宣言されていますが、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);
10
Rob Kennedy