Имеем таблицу, наследника от TCustomGrid, перекрываем метод MouseMove следющим образом:
var ARow,ACol: integer;
begin
Inherited;
ARow:=GetRowByXY(X,Y);
ACol:=GetColByXY(X,Y);
if (AСol<>oldCol) or (ARow<>oldRow) then {т.е. если указатель мыши переместился на новую ячейку}
begin
{.....}
{какие-то действия}
{.....}
OldRow:=GetRowByXY(X,Y);
OldCol:=GetColByXY(X,Y);
end;
end
Проблема в следующем: Если мышу вести медленно, или с нормально скоростью, то событие срабатывает на каждой ячейки
на которую перемещается мыша, если же мышу двигать довольно быстро, то некоторые ячейки проскакивают...
Может кто сталквался с такой проблемой? Где тут засада и как с ней бороться?
Здравствуйте, Аноним, Вы писали:
А>Проблема в следующем: Если мышу вести медленно, или с нормально скоростью, то событие срабатывает на каждой ячейки А>на которую перемещается мыша, если же мышу двигать довольно быстро, то некоторые ячейки проскакивают... А>Может кто сталквался с такой проблемой? Где тут засада и как с ней бороться?
Засада вероятно здесь. Из MSDN :
When mouse messages are posted faster than a thread can process them, the system discards all but the most recent mouse message.
Как бороться
Keep yourself alive
Re[2]: Странно, проскакивают вызовы сообщения
От:
Аноним
Дата:
07.11.05 11:52
Оценка:
Здравствуйте, alive, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Проблема в следующем: Если мышу вести медленно, или с нормально скоростью, то событие срабатывает на каждой ячейки А>>на которую перемещается мыша, если же мышу двигать довольно быстро, то некоторые ячейки проскакивают... А>>Может кто сталквался с такой проблемой? Где тут засада и как с ней бороться?
A>Засада вероятно здесь. Из MSDN : A>
A>When mouse messages are posted faster than a thread can process them, the system discards all but the most recent mouse message.
Здравствуйте, Аноним, Вы писали:
А>Проблема в следующем: Если мышу вести медленно, или с нормально скоростью, то событие срабатывает на каждой ячейки А>на которую перемещается мыша, если же мышу двигать довольно быстро,
то некоторые ячейки проскакивают...
Проблема в том, что подобный код вообще нужно писать очень аккуратно и продуманно, поскольку существуют весьма экзотические варианты. Например:
— пользователь оставил мышку и вообще ее не трогает
— пользователь нажал Alt-Tab и переключился в другое приложение
— другое приложение выдало MessageBox
— винда сообразно своим настройкам передвинула курсор на кнопку OK
— пользователь закрыл диалог пробелом и Alt-Tab-ом снова переключился в Ваше приложение
— курсор в итоге оказался над другой ячейкой того же грида
Соответственно — такой код лучше вообще не писать. А если уж писать, тот должен работать непрошибаемо логично, давать правильный результат в самой непредсказуемой ситуации. Не знаю кого как, но меня изрядно бесят приложения с залипающими flat-кнопками, инверсными следами от bounding rectangle итп.