使用delphi通过鼠标单击TStringGrid删除选定的行

时间:2014-11-30 20:08:06

标签: delphi tstringgrid

我不确定如何捕获鼠标单击选择的行,然后按一个按钮删除delphi中stringGrid中的所选行。

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;

procedure TManageUsersForm.RemoveRowButtonClick(Sender: TObject);
var
  Recordposition : integer;
begin
  UserStringGrid.Options := UserStringGrid.Options + [goEditing];
  UserStringGrid.Options := UserStringGrid.Options + [goRowSelect];
end;

所以第一个过程是删除行,第二个过程确保用户单击一个单元格时整个行突出显示的不仅仅是那个单元格。

鼠标点击是最重要的部分!

谢谢你:)

2 个答案:

答案 0 :(得分:4)

鼠标点击不是最重要的部分。用户可以通过键盘或鼠标选择一行,这并不重要,您只想删除当前行。如果是鼠标单击或其他方式,您可以按Row获取当前行。

procedure DeleteCurrentRow(Grid: TStringGrid);
var
  i: Integer;
begin
  for i := Grid.Row to Grid.RowCount - 2 do
    Grid.Rows[i].Assign(Grid.Rows[i + 1]);
  Grid.RowCount := Grid.RowCount - 1;
end;

称之为;

DeleteCurrentRow(UserStringGrid);

答案 1 :(得分:2)

我想你可能遇到的问题是弄清楚用户点击了哪个网格行。一种方法是:

procedure TForm1.StringGrid1Click(Sender: TObject);
var
  StringGrid : TStringGrid;
  Row : Integer;
  GridRect : TGridRect;
begin
  // The Sender argument to StringGrid1Click is actually the StringGrid itself,
  // and the following "as" cast lets you assign it to the StringGrid local variable
  // in a "type-safe" way, and access its properties and methods via the temporary variable
  StringGrid := Sender as TStringGrid;

  // Now we can retrieve the use selection
  GridRect := StringGrid.Selection;

  // and hence the related GridRect
  // btw, the value returned for Row automatically takes account of
  // the number of FixedRows, if any, of the grid
  Row := GridRect.Top;

  Caption := IntToStr(Row);
  { ...}
end;

请参阅OLH关于TGridRect。

希望上述内容足以让你前进 - 你已经很明显已经掌握了大部分内容。或者,您可以尝试在另一个答案中建议的方法,这是一个更“直接”的方法,但这种方式可能会像“如何”一样更有启发性。你的选择......