У меня есть stringgrid, который показывает кучу файлов и информацию об этих файлах. Больше информации о текущем выбранном элементе отображается на отдельной панели. Поэтому я хочу знать, когда выбранная строка изменяется для обновления панели. OnSelectCell не очень хорош, потому что он запускается до того, как выбор действительно перемещен в новое место. Это то, что я имею в виду:Какое событие срабатывает при каждом изменении выбранного местоположения TStringGrid?
function TStrGrd.SelectCell(ACol, ARow: Longint): Boolean; {override}
begin
Result:= inherited SelectCell(ACol, ARow);
Mesage('Cur row: '+ IntToStr(row));
Mesage('New row: '+ IntToStr(ARow));
{ My own event }
if Assigned(FCursorChanged)
then FCursorChanged(Self); <-------- user will see the old row
end;
Если последняя строка выбрана и я нажимаю на первую строку, я буду получать эти сообщения:
Cur row: 999
New row: 0
Это будет работать, если я создаю свой собственный обработчик события и передайте ему строку, в которой выбор будет перемещен. Он должен работать на 100%, но я не очень доволен этим, потому что пользователю придется писать дополнительный код в обработчике событий.
Я мог бы перехватить все пользовательские взаимодействия (мышь/клавиша) и все изменения выбора я делаю программно, но для этого требуется довольно много кода. Должен быть более элегантный способ.
- Этот вопрос похож на What event fires every time a TDbGrid's selected location is changed?, но не дублируется. Ответ на этот вопрос: «Использовать OnDataChange», но TStringGrid не имеет этого события.
- @Andriy M предлагает здесь почему OnSelectCell не будет работать: Detecting single vs multiple selections in Delphi TStringGrid
Что значит «до того, как выбор действительно перемещен»? «Строка» и «Кол» изменились. –
Я ожидаю, что вы можете PostMessage (POST not SEND) в свою сетку, какой-то свой собственный WM_USER + delta. Я ожидаю, что к моменту, когда будут обработаны все другие сообщения, и вы получите это собственное сообщение - вся работа, включая изменение свойств и рисования, уже будет выполнена. Фактически PostMessage является наиболее типичным для WinGDI/VCL способом разгрузить некоторую задачу. // Однако мои чувства кишки говорят о том, что вы просто пытаетесь использовать неправильный инструмент. Опишите проблему как целое, что происходит, которую вы пытаетесь решить с помощью обработчика событий с задержкой? может быть, вы можете решить это более VCL-способами? –
@ Arioch'The-См. Обновленный Вопрос. – Ampere