Как запретить непреднамеренное срабатывание события tStringGrid onSelectCell

Я использую окна 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;

person JO SeongGng    schedule 01.02.2016    source источник
comment
Это имеет смысл и никоим образом не является ошибкой. Это ошибка в вашем понимании того, что происходит. :-) Щелчок по кнопке увеличивает количество строк, и выделение становится одной из новых строк. Затем вы снова нажимаете на форму, которая удаляет все строки, кроме 1; если выбор > 0, он должен куда-то идти, и это генерирует событие OnSelectCell. Если вы не хотите, чтобы это произошло, отключите событие OnSelectCell перед изменением RowCount.   -  person Ken White    schedule 01.02.2016
comment
Когда вы уменьшаете количество строк, вы можете удалить выбранную ячейку. Если вы не хотите, чтобы событие запускалось, временно отключите его.   -  person David Heffernan    schedule 01.02.2016
comment
@KenWhite Если нажатие кнопки делает выбор, почему первое нажатие кнопки не приводит к срабатыванию? Без нажатия кнопки, просто щелчок по ячейке -> щелчок по форме не срабатывает в событии SelectCell. В этом случае выбрана абсолютно ячейка, но уменьшение количества строк не вызывает событие.   -  person JO SeongGng    schedule 01.02.2016


Ответы (1)


Поведение, о котором вы сообщаете, является естественным. При уменьшении количества строк, если вы удаляете строку, содержащую выбранную ячейку, необходимо выбрать новую ячейку. Логика здесь заключается в том, что выбирается ячейка в последней оставшейся строке, а выбранный столбец не изменяется. Поскольку выбрана новая ячейка, запускается событие OnSelectCell.

Это не ошибка. Поведение разумное и соответствует замыслу.

Если вы хотите подавить событие OnSelectCell при выполнении определенных действий, временно отключите его.

StringGrid1.OnSelectCell := nil;
try
  // do stuff that might change the selection
finally
  StringGrid1.OnSelectCell := StringGrid1SelectCell;
end;
person David Heffernan    schedule 01.02.2016