2016-02-01 3 views
0

Я использую окна 10 и сиэтл.Как запретить непредвиденный запуск tStringGrid onSelectCell

Я пытаюсь изменить 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; 
+2

Это имеет смысл, и это не ошибка. Это недостаток в вашем понимании того, что происходит. :-) Щелчок кнопки увеличивает количество строк, и выбор становится одной из новых строк. Затем вы нажимаете на форму, которая удаляет все строки, кроме 1; если выделение> 0, оно должно куда-то идти, и оно генерирует событие OnSelectCell. Если вы не хотите, чтобы это произошло, отключите событие OnSelectCell перед изменением RowCount. –

+0

Когда вы уменьшаете количество строк, вы можете удалить выбранную ячейку. Если вы не хотите, чтобы событие срабатывало, временно отключите его. –

+0

@KenWhite Если щелчок кнопки делает выбор, то почему первая нажатие кнопки не загорается? Без нажатия кнопки, щелчок клика по ячейке -> не запускает событие onSelectCell. В этом случае выбирается только ячейка, но уменьшение количества строк не вызывает события. –

ответ

1

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

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

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

StringGrid1.OnSelectCell := nil; 
try 
    // do stuff that might change the selection 
finally 
    StringGrid1.OnSelectCell := StringGrid1SelectCell; 
end; 
Смежные вопросы