如何禁止onSelectCell事件触发时意外的tStringGrid

时间:2016-02-01 13:28:58

标签: delphi tstringgrid

我使用的是Windows 10和西雅图。

我尝试更改tStringGrid.RowCount而不运行onSelectCell事件,因为当没有单击或选择单元格时,不应该运行某些内容。

有时候更改tStringGrid.RowCount将触发tStringGrid onSelectCell事件。在使用默认tStringGrid实现以下代码后,单击表单 - >点击按钮 - >单击行索引大于0的任何单元格 - >再次单击该表单,然后在最后一次单击表单事件时触发onSelectCell事件。

我想知道这是一个错误还是我误解了一些东西。在前一种情况下,我需要绕过,我可以,在后一种情况下,请让我知道解决问题的原因。

procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid1.RowCount := 5;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  StringGrid1.RowCount := 1; //  at the second time this fires tStringGrid.onSelectCell Event
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
  Memo1.Lines.Add(IntToStr(ACol) + ' ' + IntToStr(ARow));
end;

1 个答案:

答案 0 :(得分:1)

您报告的行为很自然。减少行数时,如果要删除包含所选单元格的行,则必须选择新单元格。这里的逻辑是选择最后剩余行中的单元格,并且不修改所选列。由于选择了新单元格,因此会触发OnSelectCell事件。

这不是错误。这种行为是明智的,也是按照设计的。

如果您希望在执行某些操作时取消OnSelectCell事件,请暂时将其禁用。

StringGrid1.OnSelectCell := nil;
try
  // do stuff that might change the selection
finally
  StringGrid1.OnSelectCell := StringGrid1SelectCell;
end;