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

我使用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;

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

这不是一个错误。 行为是明智的,并且按照设计。

如果您希望在执行某些操作时禁止OnSelectCell事件,请暂时禁用它。

StringGrid1.OnSelectCell := nil;
try
  // do stuff that might change the selection
finally
  StringGrid1.OnSelectCell := StringGrid1SelectCell;
end;
链接地址: http://www.djcxy.com/p/50639.html

上一篇: How to prohibit an unintended tStringGrid onSelectCell event firing

下一篇: StringGrid issue in Delphi XE8 firemonkey mobile app