Я думаю, что часть проблемы в используемой терминологии.Пока вы полностью не поймете, что происходит, может показаться странным, что 'select' используется для обозначения 'highlight' и 'focus' .В этом конкретном случае должно быть различие между ними.
Прежде чем я продолжу, я хотел бы, чтобы вы помнили, что сфокусированная клетка также может быть (и есть) выделено , но выделенная ячейка не обязательно является сфокусированной.
Теперь событие OnSelectCell
связано с фокусировкой .Обработчик срабатывает при щелчке ячейки или при попытке навигации по ней с помощью клавиш навигации.Короче говоря, обработчик вызывается при попытке сфокусировать ячейку.Вы можете запретить фокусировку ячейки, сбросив параметр CanSelect
(что, опять же, означает, по существу, CanFocus , потому что ячейка может быть выбрана, т. Е. Выделена, без выделения, и выне может контролировать это с помощью OnSelectCell
).
Опция goRangeSelect
и свойство TDrawGrid.Selection
, с другой стороны, связаны с выбором в качестве выделения .Первый позволяет вам (пользователю) выделить более чем одну ячейку, а второй указывает на диапазон этих ячеек выделен .
Теперь к моей основной точке,После вызова рассматриваемого обработчика Selection
является никогда точным, т. Е. Не коррелируется с параметрами ACol
& ARow
, которые передаются обработчику.Selection
содержит диапазон ячеек, которые были выделены непосредственно перед вызовом обработчика, и он никогда не изменяется сам по себе в обработчике .Будь то одна или несколько ячеек, Selection
остается одинаковым до тех пор, пока обработчик не выйдет.И когда это происходит (обработчик завершает работу), Selection
изменяется (и результат зависит, между прочим, сброс CanSelect
или нет, кстати).
Таким образом, в заключение вы не можете использоватьOnSelectCell
для определения фактического Selection
как результата самого последнего действия пользователя.Вместо этого я бы предложил последовать совету @ Sam и использовать событие OnMouseUp
*.Это также позволяет вам контролировать выбор: вы можете исправить окончательный диапазон, если считаете, что пользователь выбрал «слишком много».В последнем случае я бы, вероятно, подумал бы об использовании OnMouseMove
вместо этого, так как он позволяет вам более плавно реагировать, исправляя диапазон «на лету».
OnDrawCell
тоже выглядит хорошо, пока вынужно просто определить выбор.
* После вашего комментария я должен добавить, что вам также придется использовать OnKeyUp
для обработкивыбор сделан с клавиатуры.